9router 0.3.53 → 0.3.54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/.next/BUILD_ID +1 -1
- package/app/.next/app-path-routes-manifest.json +46 -46
- package/app/.next/build-manifest.json +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/_global-error.html +2 -2
- package/app/.next/server/app/_global-error.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/_not-found.html +1 -1
- package/app/.next/server/app/_not-found.rsc +4 -4
- package/app/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
- package/app/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/app/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/claude-settings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/codex-settings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/copilot-settings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/droid-settings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/openclaw-settings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cli-tools/opencode-settings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cloud/auth/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cloud/credentials/update/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cloud/model/resolve/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/cloud/models/alias/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/combos/[id]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/combos/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/keys/[id]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/keys/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/locale/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/models/alias/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/models/route.js +1 -1
- package/app/.next/server/app/api/models/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/models/test/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/[provider]/[action]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/cursor/auto-import/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/cursor/import/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/iflow/cookie/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/kiro/auto-import/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/kiro/import/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/kiro/social-authorize/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/oauth/kiro/social-exchange/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/pricing/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/provider-nodes/[id]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/provider-nodes/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/provider-nodes/validate/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/providers/[id]/models/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/providers/[id]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/providers/[id]/test/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/providers/[id]/test-models/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/providers/client/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/providers/route.js +1 -1
- package/app/.next/server/app/api/providers/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/providers/test-batch/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/providers/validate/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/proxy-pools/[id]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/proxy-pools/[id]/test/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/proxy-pools/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/database/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/proxy-test/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/require-login/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/tags/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/translator/console-logs/route.js +1 -1
- package/app/.next/server/app/api/translator/console-logs/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/translator/console-logs/stream/route.js +1 -1
- package/app/.next/server/app/api/translator/console-logs/stream/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/translator/load/route.js.nft.json +1 -1
- package/app/.next/server/app/api/translator/load/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/translator/save/route.js.nft.json +1 -1
- package/app/.next/server/app/api/translator/save/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/translator/send/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/translator/translate/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/tunnel/disable/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/tunnel/enable/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/tunnel/status/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/[connectionId]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/chart/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/history/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/providers/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/request-details/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/request-logs/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/stats/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/usage/stream/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/api/chat/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/chat/completions/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/embeddings/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/messages/count_tokens/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/messages/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/models/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/responses/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1beta/models/[...path]/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/v1beta/models/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/version/route.js +1 -1
- package/app/.next/server/app/api/version/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/callback.html +1 -1
- package/app/.next/server/app/callback.rsc +4 -4
- package/app/.next/server/app/callback.segments/_full.segment.rsc +4 -4
- package/app/.next/server/app/callback.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/callback.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/callback.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/callback.segments/callback.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/cli-tools.html +1 -1
- package/app/.next/server/app/dashboard/cli-tools.rsc +6 -6
- package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +6 -6
- package/app/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/combos.html +1 -1
- package/app/.next/server/app/dashboard/combos.rsc +6 -6
- package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/combos.segments/_full.segment.rsc +6 -6
- package/app/.next/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/combos.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/endpoint.html +1 -1
- package/app/.next/server/app/dashboard/endpoint.rsc +6 -6
- package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +6 -6
- package/app/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/mitm.html +1 -1
- package/app/.next/server/app/dashboard/mitm.rsc +6 -6
- package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/mitm.segments/_full.segment.rsc +6 -6
- package/app/.next/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/mitm.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/profile.html +1 -1
- package/app/.next/server/app/dashboard/profile.rsc +6 -6
- package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/profile.segments/_full.segment.rsc +6 -6
- package/app/.next/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/profile.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/providers/new.html +1 -1
- package/app/.next/server/app/dashboard/providers/new.rsc +6 -6
- package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +6 -6
- package/app/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/providers.html +1 -1
- package/app/.next/server/app/dashboard/providers.rsc +6 -6
- package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/providers.segments/_full.segment.rsc +6 -6
- package/app/.next/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/providers.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/proxy-pools.html +1 -1
- package/app/.next/server/app/dashboard/proxy-pools.rsc +6 -6
- package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +6 -6
- package/app/.next/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/quota.html +2 -2
- package/app/.next/server/app/dashboard/quota.rsc +5 -5
- package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/quota.segments/_full.segment.rsc +5 -5
- package/app/.next/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/quota.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.html +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.rsc +4 -4
- package/app/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/translator.html +1 -1
- package/app/.next/server/app/dashboard/translator.rsc +6 -6
- package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/translator.segments/_full.segment.rsc +6 -6
- package/app/.next/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/translator.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/usage.html +1 -1
- package/app/.next/server/app/dashboard/usage.rsc +6 -6
- package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/usage.segments/_full.segment.rsc +6 -6
- package/app/.next/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/usage.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/dashboard.html +1 -1
- package/app/.next/server/app/dashboard.rsc +6 -6
- package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/app/.next/server/app/dashboard.segments/_full.segment.rsc +6 -6
- package/app/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/dashboard.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/index.html +1 -1
- package/app/.next/server/app/index.rsc +4 -4
- package/app/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/app/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/index.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/landing.html +1 -1
- package/app/.next/server/app/landing.rsc +4 -4
- package/app/.next/server/app/landing.segments/_full.segment.rsc +4 -4
- package/app/.next/server/app/landing.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/landing.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/landing.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/landing.segments/landing.segment.rsc +1 -1
- package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/login.html +1 -1
- package/app/.next/server/app/login.rsc +5 -5
- package/app/.next/server/app/login.segments/_full.segment.rsc +5 -5
- package/app/.next/server/app/login.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/login.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/login.segments/login.segment.rsc +1 -1
- package/app/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
- package/app/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/app/.next/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app-paths-manifest.json +46 -46
- package/app/.next/server/chunks/1114.js +1 -1
- package/app/.next/server/chunks/1424.js +1 -1
- package/app/.next/server/chunks/318.js +1 -1
- package/app/.next/server/chunks/6182.js +6 -6
- package/app/.next/server/chunks/649.js +1 -1
- package/app/.next/server/pages/404.html +1 -1
- package/app/.next/server/pages/500.html +2 -2
- package/app/.next/server/server-reference-manifest.js +1 -1
- package/app/.next/server/server-reference-manifest.json +1 -1
- package/app/.next/static/chunks/{5497-2f4b5d7837ad4dc8.js → 5497-4115bafa029568f2.js} +1 -1
- package/app/.next/static/chunks/{9242-3fb6423adcc6e277.js → 9242-c9d752975b449b44.js} +2 -2
- package/app/.next/static/chunks/app/{layout-d66315546ced1415.js → layout-2cf69a29bcc7722e.js} +1 -1
- package/app/.next/static/css/{0c4f3a92a0a64981.css → 4016074f63f34af9.css} +1 -1
- package/app/package.json +1 -1
- package/app/src/mitm/cert/install.js +9 -8
- package/app/src/mitm/dns/dnsConfig.js +6 -5
- package/app/src/mitm/logger.js +8 -0
- package/app/src/mitm/manager.js +48 -19
- package/app/src/mitm/server.js +28 -17
- package/package.json +1 -1
- /package/app/.next/static/{2ABcpZEvM8MzFMmHIRKq0 → lQALtClEnCtM3rGs1b9Jb}/_buildManifest.js +0 -0
- /package/app/.next/static/{2ABcpZEvM8MzFMmHIRKq0 → lQALtClEnCtM3rGs1b9Jb}/_ssgManifest.js +0 -0
package/app/src/mitm/manager.js
CHANGED
|
@@ -11,6 +11,7 @@ const IS_WIN = process.platform === "win32";
|
|
|
11
11
|
const { generateCert } = require("./cert/generate");
|
|
12
12
|
const { installCert } = require("./cert/install");
|
|
13
13
|
const { MITM_DIR } = require("./paths");
|
|
14
|
+
const { log, err } = require("./logger");
|
|
14
15
|
|
|
15
16
|
const MITM_PORT = 443;
|
|
16
17
|
const MITM_WIN_NODE_PORT = 8443;
|
|
@@ -140,7 +141,7 @@ async function saveMitmSettings(enabled, password) {
|
|
|
140
141
|
if (password) updates.mitmSudoEncrypted = encryptPassword(password);
|
|
141
142
|
await _updateSettings(updates);
|
|
142
143
|
} catch (e) {
|
|
143
|
-
|
|
144
|
+
err(`Failed to save settings: ${e.message}`);
|
|
144
145
|
}
|
|
145
146
|
}
|
|
146
147
|
|
|
@@ -277,8 +278,10 @@ async function getMitmStatus() {
|
|
|
277
278
|
const dnsStatus = checkAllDNSStatus();
|
|
278
279
|
const rootCACertPath = path.join(MITM_DIR, "rootCA.crt");
|
|
279
280
|
const certExists = fs.existsSync(rootCACertPath);
|
|
281
|
+
const { checkCertInstalled } = require("./cert/install");
|
|
282
|
+
const certTrusted = certExists ? await checkCertInstalled(rootCACertPath) : false;
|
|
280
283
|
|
|
281
|
-
return { running, pid, certExists, dnsStatus };
|
|
284
|
+
return { running, pid, certExists, certTrusted, dnsStatus };
|
|
282
285
|
}
|
|
283
286
|
|
|
284
287
|
async function scheduleMitmRestart(apiKey) {
|
|
@@ -288,7 +291,7 @@ async function scheduleMitmRestart(apiKey) {
|
|
|
288
291
|
if (aliveMs >= MITM_RESTART_RESET_MS) mitmRestartCount = 0;
|
|
289
292
|
|
|
290
293
|
if (mitmRestartCount >= MITM_MAX_RESTARTS) {
|
|
291
|
-
|
|
294
|
+
err("Max restart attempts reached. Giving up.");
|
|
292
295
|
return;
|
|
293
296
|
}
|
|
294
297
|
|
|
@@ -297,28 +300,28 @@ async function scheduleMitmRestart(apiKey) {
|
|
|
297
300
|
mitmRestartCount++;
|
|
298
301
|
mitmIsRestarting = true;
|
|
299
302
|
|
|
300
|
-
|
|
303
|
+
log(`Restarting in ${delay / 1000}s... (${mitmRestartCount}/${MITM_MAX_RESTARTS})`);
|
|
301
304
|
await new Promise((r) => setTimeout(r, delay));
|
|
302
305
|
|
|
303
306
|
try {
|
|
304
307
|
const settings = _getSettings ? await _getSettings() : null;
|
|
305
308
|
if (settings && !settings.mitmEnabled) {
|
|
306
|
-
|
|
309
|
+
log("MITM disabled, skipping restart");
|
|
307
310
|
mitmIsRestarting = false;
|
|
308
311
|
return;
|
|
309
312
|
}
|
|
310
313
|
const password = getCachedPassword() || await loadEncryptedPassword();
|
|
311
314
|
if (!password && !IS_WIN) {
|
|
312
|
-
|
|
315
|
+
err("No cached password, cannot auto-restart");
|
|
313
316
|
mitmIsRestarting = false;
|
|
314
317
|
return;
|
|
315
318
|
}
|
|
316
319
|
await startServer(apiKey, password);
|
|
317
|
-
|
|
320
|
+
log("🔄 Restarted successfully");
|
|
318
321
|
mitmRestartCount = 0;
|
|
319
322
|
mitmIsRestarting = false;
|
|
320
|
-
} catch (
|
|
321
|
-
|
|
323
|
+
} catch (e) {
|
|
324
|
+
err(`Restart attempt ${mitmRestartCount}/${MITM_MAX_RESTARTS} failed: ${e.message}`);
|
|
322
325
|
mitmIsRestarting = false;
|
|
323
326
|
// Schedule next retry
|
|
324
327
|
scheduleMitmRestart(apiKey);
|
|
@@ -335,7 +338,7 @@ async function startServer(apiKey, sudoPassword) {
|
|
|
335
338
|
const savedPid = parseInt(fs.readFileSync(PID_FILE, "utf-8").trim(), 10);
|
|
336
339
|
if (savedPid && isProcessAlive(savedPid)) {
|
|
337
340
|
serverPid = savedPid;
|
|
338
|
-
|
|
341
|
+
log(`♻️ Reusing existing process (PID: ${savedPid})`);
|
|
339
342
|
await saveMitmSettings(true, sudoPassword);
|
|
340
343
|
if (sudoPassword) setCachedPassword(sudoPassword);
|
|
341
344
|
return { running: true, pid: savedPid };
|
|
@@ -357,7 +360,7 @@ async function startServer(apiKey, sudoPassword) {
|
|
|
357
360
|
if (portStatus === "in-use" || portStatus === "no-permission") {
|
|
358
361
|
const owner = await getPort443Owner(sudoPassword);
|
|
359
362
|
if (owner && owner.name === "node") {
|
|
360
|
-
|
|
363
|
+
log(`Killing orphan node process on port 443 (PID ${owner.pid})...`);
|
|
361
364
|
try {
|
|
362
365
|
const { execWithPassword } = require("./dns/dnsConfig");
|
|
363
366
|
await execWithPassword(`kill -9 ${owner.pid}`, sudoPassword);
|
|
@@ -377,7 +380,7 @@ async function startServer(apiKey, sudoPassword) {
|
|
|
377
380
|
const rootCAKeyPath = path.join(MITM_DIR, "rootCA.key");
|
|
378
381
|
|
|
379
382
|
if (!fs.existsSync(rootCACertPath) || !fs.existsSync(rootCAKeyPath)) {
|
|
380
|
-
|
|
383
|
+
log("🔐 Generating Root CA (first time)...");
|
|
381
384
|
await generateCert();
|
|
382
385
|
}
|
|
383
386
|
|
|
@@ -385,17 +388,20 @@ async function startServer(apiKey, sudoPassword) {
|
|
|
385
388
|
const { checkCertInstalled } = require("./cert/install");
|
|
386
389
|
const rootCATrusted = await checkCertInstalled(rootCACertPath);
|
|
387
390
|
if (!rootCATrusted) {
|
|
388
|
-
|
|
391
|
+
log("🔐 Cert: not trusted → installing...");
|
|
389
392
|
// Use provided password or cached/stored password
|
|
390
393
|
const password = sudoPassword || getCachedPassword() || await loadEncryptedPassword();
|
|
391
394
|
if (!password && !IS_WIN) {
|
|
392
395
|
throw new Error("Sudo password required to install Root CA certificate");
|
|
393
396
|
}
|
|
394
397
|
await installCert(password, rootCACertPath);
|
|
395
|
-
|
|
398
|
+
log("🔐 Cert: ✅ trusted");
|
|
399
|
+
} else {
|
|
400
|
+
log("🔐 Cert: already trusted ✅");
|
|
396
401
|
}
|
|
397
402
|
|
|
398
403
|
// Step 2: Spawn server (Root CA already installed in Step 1.5)
|
|
404
|
+
log("🚀 Starting server...");
|
|
399
405
|
if (IS_WIN) {
|
|
400
406
|
const psSQ = (s) => s.replace(/'/g, "''");
|
|
401
407
|
const nodePs = psSQ(process.execPath);
|
|
@@ -436,17 +442,18 @@ async function startServer(apiKey, sudoPassword) {
|
|
|
436
442
|
let startError = null;
|
|
437
443
|
if (!IS_WIN) {
|
|
438
444
|
serverProcess.stdout.on("data", (data) => {
|
|
439
|
-
|
|
445
|
+
// server.js already formats its own logs — print as-is
|
|
446
|
+
process.stdout.write(data);
|
|
440
447
|
});
|
|
441
448
|
serverProcess.stderr.on("data", (data) => {
|
|
442
449
|
const msg = data.toString().trim();
|
|
443
450
|
if (msg && !msg.includes("Password:") && !msg.includes("password for")) {
|
|
444
|
-
|
|
451
|
+
err(msg);
|
|
445
452
|
startError = msg;
|
|
446
453
|
}
|
|
447
454
|
});
|
|
448
455
|
serverProcess.on("exit", (code) => {
|
|
449
|
-
|
|
456
|
+
log(`Server exited (code: ${code})`);
|
|
450
457
|
serverProcess = null;
|
|
451
458
|
serverPid = null;
|
|
452
459
|
try { fs.unlinkSync(PID_FILE); } catch { /* ignore */ }
|
|
@@ -470,6 +477,14 @@ async function startServer(apiKey, sudoPassword) {
|
|
|
470
477
|
fs.writeFileSync(PID_FILE, String(serverPid));
|
|
471
478
|
}
|
|
472
479
|
|
|
480
|
+
log(`✅ Server healthy (PID: ${serverPid || health.pid})`);
|
|
481
|
+
|
|
482
|
+
// Log DNS status per tool
|
|
483
|
+
const dnsStatus = checkAllDNSStatus();
|
|
484
|
+
for (const [tool, active] of Object.entries(dnsStatus)) {
|
|
485
|
+
log(`🌐 DNS ${tool}: ${active ? "✅ active" : "❌ inactive"}`);
|
|
486
|
+
}
|
|
487
|
+
|
|
473
488
|
await saveMitmSettings(true, sudoPassword);
|
|
474
489
|
if (sudoPassword) setCachedPassword(sudoPassword);
|
|
475
490
|
|
|
@@ -483,7 +498,7 @@ async function stopServer(sudoPassword) {
|
|
|
483
498
|
// Prevent auto-restart from triggering on intentional stop
|
|
484
499
|
mitmIsRestarting = true;
|
|
485
500
|
mitmRestartCount = 0;
|
|
486
|
-
|
|
501
|
+
log("⏹ Stopping server...");
|
|
487
502
|
|
|
488
503
|
// Kill server process
|
|
489
504
|
const proc = serverProcess;
|
|
@@ -492,7 +507,7 @@ async function stopServer(sudoPassword) {
|
|
|
492
507
|
: (() => { try { return parseInt(fs.readFileSync(PID_FILE, "utf-8").trim(), 10); } catch { return null; } })();
|
|
493
508
|
|
|
494
509
|
if (pidToKill && isProcessAlive(pidToKill)) {
|
|
495
|
-
|
|
510
|
+
log(`Killing server (PID: ${pidToKill})...`);
|
|
496
511
|
killProcess(pidToKill, false, sudoPassword);
|
|
497
512
|
await new Promise(r => setTimeout(r, 1000));
|
|
498
513
|
if (isProcessAlive(pidToKill)) killProcess(pidToKill, true, sudoPassword);
|
|
@@ -562,6 +577,19 @@ async function disableToolDNS(tool, sudoPassword) {
|
|
|
562
577
|
return { success: true };
|
|
563
578
|
}
|
|
564
579
|
|
|
580
|
+
/**
|
|
581
|
+
* Install Root CA to system trust store (standalone, no server start)
|
|
582
|
+
*/
|
|
583
|
+
async function trustCert(sudoPassword) {
|
|
584
|
+
const rootCACertPath = path.join(MITM_DIR, "rootCA.crt");
|
|
585
|
+
if (!fs.existsSync(rootCACertPath)) throw new Error("Root CA not found. Start server first to generate it.");
|
|
586
|
+
const { installCert } = require("./cert/install");
|
|
587
|
+
const password = sudoPassword || getCachedPassword() || await loadEncryptedPassword();
|
|
588
|
+
if (!password && !IS_WIN) throw new Error("Sudo password required to trust certificate");
|
|
589
|
+
await installCert(password, rootCACertPath);
|
|
590
|
+
if (password) setCachedPassword(password);
|
|
591
|
+
}
|
|
592
|
+
|
|
565
593
|
// Legacy aliases for backward compatibility
|
|
566
594
|
const startMitm = startServer;
|
|
567
595
|
const stopMitm = stopServer;
|
|
@@ -572,6 +600,7 @@ module.exports = {
|
|
|
572
600
|
stopServer,
|
|
573
601
|
enableToolDNS,
|
|
574
602
|
disableToolDNS,
|
|
603
|
+
trustCert,
|
|
575
604
|
// Legacy
|
|
576
605
|
startMitm,
|
|
577
606
|
stopMitm,
|
package/app/src/mitm/server.js
CHANGED
|
@@ -3,6 +3,7 @@ const fs = require("fs");
|
|
|
3
3
|
const path = require("path");
|
|
4
4
|
const dns = require("dns");
|
|
5
5
|
const { promisify } = require("util");
|
|
6
|
+
const { log, err } = require("./logger");
|
|
6
7
|
|
|
7
8
|
// Allow self-signed certs from MITM root CA when fetching external hosts
|
|
8
9
|
|
|
@@ -25,7 +26,7 @@ const DB_FILE = path.join(DATA_DIR, "db.json");
|
|
|
25
26
|
const ENABLE_FILE_LOG = false;
|
|
26
27
|
|
|
27
28
|
if (!API_KEY) {
|
|
28
|
-
|
|
29
|
+
err("ROUTER_API_KEY required");
|
|
29
30
|
process.exit(1);
|
|
30
31
|
}
|
|
31
32
|
|
|
@@ -57,11 +58,11 @@ function sniCallback(servername, cb) {
|
|
|
57
58
|
|
|
58
59
|
// Cache it
|
|
59
60
|
certCache.set(servername, ctx);
|
|
60
|
-
|
|
61
|
+
log(`🔐 Cert generated: ${servername}`);
|
|
61
62
|
|
|
62
63
|
cb(null, ctx);
|
|
63
64
|
} catch (error) {
|
|
64
|
-
|
|
65
|
+
err(`SNI error for ${servername}: ${error.message}`);
|
|
65
66
|
cb(error);
|
|
66
67
|
}
|
|
67
68
|
}
|
|
@@ -79,7 +80,7 @@ try {
|
|
|
79
80
|
SNICallback: sniCallback
|
|
80
81
|
};
|
|
81
82
|
} catch (e) {
|
|
82
|
-
|
|
83
|
+
err(`Root CA not found in ${certDir}: ${e.message}`);
|
|
83
84
|
process.exit(1);
|
|
84
85
|
}
|
|
85
86
|
|
|
@@ -134,7 +135,13 @@ function getMappedModel(tool, model) {
|
|
|
134
135
|
try {
|
|
135
136
|
if (!fs.existsSync(DB_FILE)) return null;
|
|
136
137
|
const db = JSON.parse(fs.readFileSync(DB_FILE, "utf-8"));
|
|
137
|
-
|
|
138
|
+
const aliases = db.mitmAlias?.[tool];
|
|
139
|
+
if (!aliases) return null;
|
|
140
|
+
// Exact match first
|
|
141
|
+
if (aliases[model]) return aliases[model];
|
|
142
|
+
// Prefix match fallback: find alias key that starts with model or model starts with key
|
|
143
|
+
const prefixKey = Object.keys(aliases).find(k => k && aliases[k] && (model.startsWith(k) || k.startsWith(model)));
|
|
144
|
+
return prefixKey ? aliases[prefixKey] : null;
|
|
138
145
|
} catch {
|
|
139
146
|
return null;
|
|
140
147
|
}
|
|
@@ -167,8 +174,8 @@ async function passthrough(req, res, bodyBuffer) {
|
|
|
167
174
|
forwardRes.pipe(res);
|
|
168
175
|
});
|
|
169
176
|
|
|
170
|
-
forwardReq.on("error", (
|
|
171
|
-
|
|
177
|
+
forwardReq.on("error", (e) => {
|
|
178
|
+
err(`Passthrough error: ${e.message}`);
|
|
172
179
|
if (!res.headersSent) res.writeHead(502);
|
|
173
180
|
res.end("Bad Gateway");
|
|
174
181
|
});
|
|
@@ -216,7 +223,7 @@ async function intercept(req, res, bodyBuffer, mappedModel) {
|
|
|
216
223
|
res.write(decoder.decode(value, { stream: true }));
|
|
217
224
|
}
|
|
218
225
|
} catch (error) {
|
|
219
|
-
|
|
226
|
+
err(`Intercept error: ${error.message}`);
|
|
220
227
|
if (!res.headersSent) res.writeHead(500, { "Content-Type": "application/json" });
|
|
221
228
|
res.end(JSON.stringify({ error: { message: error.message, type: "mitm_error" } }));
|
|
222
229
|
}
|
|
@@ -250,30 +257,34 @@ const server = https.createServer(sslOptions, async (req, res) => {
|
|
|
250
257
|
if (!isChat) return passthrough(req, res, bodyBuffer);
|
|
251
258
|
|
|
252
259
|
const model = extractModel(req.url, bodyBuffer);
|
|
253
|
-
|
|
260
|
+
log(`🔍 model="${model}" url=${req.url}`);
|
|
254
261
|
const mappedModel = getMappedModel(tool, model);
|
|
255
262
|
|
|
256
|
-
if (!mappedModel)
|
|
263
|
+
if (!mappedModel) {
|
|
264
|
+
log(`⏩ passthrough | no mapping | ${tool} | ${model || "unknown"}`);
|
|
265
|
+
return passthrough(req, res, bodyBuffer);
|
|
266
|
+
}
|
|
257
267
|
|
|
268
|
+
log(`⚡ intercept | ${tool} | ${model} → ${mappedModel}`);
|
|
258
269
|
return intercept(req, res, bodyBuffer, mappedModel);
|
|
259
|
-
} catch (
|
|
260
|
-
|
|
270
|
+
} catch (e) {
|
|
271
|
+
err(`Unhandled request error: ${e.message}`);
|
|
261
272
|
if (!res.headersSent) res.writeHead(500, { "Content-Type": "application/json" });
|
|
262
|
-
res.end(JSON.stringify({ error: { message:
|
|
273
|
+
res.end(JSON.stringify({ error: { message: e.message, type: "mitm_error" } }));
|
|
263
274
|
}
|
|
264
275
|
});
|
|
265
276
|
|
|
266
277
|
server.listen(LOCAL_PORT, () => {
|
|
267
|
-
|
|
278
|
+
log(`🚀 Server ready on :${LOCAL_PORT}`);
|
|
268
279
|
});
|
|
269
280
|
|
|
270
281
|
server.on("error", (error) => {
|
|
271
282
|
if (error.code === "EADDRINUSE") {
|
|
272
|
-
|
|
283
|
+
err(`Port ${LOCAL_PORT} already in use`);
|
|
273
284
|
} else if (error.code === "EACCES") {
|
|
274
|
-
|
|
285
|
+
err(`Permission denied for port ${LOCAL_PORT}`);
|
|
275
286
|
} else {
|
|
276
|
-
|
|
287
|
+
err(error.message);
|
|
277
288
|
}
|
|
278
289
|
process.exit(1);
|
|
279
290
|
});
|
package/package.json
CHANGED
|
File without changes
|
|
File without changes
|