From 05f4e1b2049fe0f17eb3561a4ef0413cb250d3c3 Mon Sep 17 00:00:00 2001 From: "github-action[bot]" Date: Fri, 6 Feb 2026 20:02:31 +0100 Subject: [PATCH] Update On Fri Feb 6 20:02:30 CET 2026 --- .github/update.log | 1 + clash-nyanpasu/.lintstagedrc.js | 12 +- clash-nyanpasu/.oxlintrc.json | 651 +++ clash-nyanpasu/.vscode/extensions.json | 4 +- clash-nyanpasu/backend/Cargo.lock | 16 +- clash-nyanpasu/backend/tauri/src/lib.rs | 2 +- clash-nyanpasu/eslint.config.js | 143 - .../frontend/interface/package.json | 2 +- .../frontend/interface/src/ipc/bindings.ts | 2 +- .../frontend/interface/src/ipc/consts.ts | 10 + .../frontend/interface/src/ipc/index.ts | 2 + .../interface/src/ipc/use-core-dir.ts | 17 + .../interface/src/ipc/use-proxy-mode.ts | 2 +- .../interface/src/ipc/use-service-prompt.ts | 17 + .../frontend/interface/src/service/tauri.ts | 1 + .../frontend/nyanpasu/messages/en.json | 42 +- .../frontend/nyanpasu/messages/ru.json | 42 +- .../frontend/nyanpasu/messages/zh-cn.json | 41 +- .../frontend/nyanpasu/messages/zh-tw.json | 42 +- clash-nyanpasu/frontend/nyanpasu/package.json | 10 +- .../src/components/app/app-container.tsx | 4 +- .../app/modules/route-list-item.tsx | 2 +- .../src/components/base/base-notice.tsx | 2 + .../dashboard/modules/ipasn-panel.tsx | 2 +- .../components/dashboard/proxy-shortcuts.tsx | 11 +- .../src/components/layout/layout-control.tsx | 2 +- .../src/components/layout/notice-provider.tsx | 1 + .../components/layout/use-custom-theme.tsx | 2 +- .../components/profiles/profile-dialog.tsx | 2 - .../src/components/profiles/profile-item.tsx | 7 +- .../profiles/profile-monaco-viewer.tsx | 4 +- .../nyanpasu/src/components/profiles/utils.ts | 1 - .../components/providers/update-providers.tsx | 2 +- .../src/components/proxies/node-list.tsx | 2 +- .../modules/service-manual-prompt-dialog.tsx | 2 +- .../setting/setting-clash-field.tsx | 6 +- .../setting/setting-nyanpasu-auto-reload.tsx | 1 + .../setting/setting-system-proxy.tsx | 13 +- .../src/components/ui/dropdown-menu.tsx | 170 +- .../src/components/ui/file-drop-zone.tsx | 3 - .../nyanpasu/src/components/ui/input.tsx | 4 +- .../nyanpasu/src/components/ui/sidebar.tsx | 7 +- .../src/components/ui/text-marquee.tsx | 212 + .../frontend/nyanpasu/src/hooks/use-consts.ts | 2 +- .../src/hooks/use-current-core-icon.ts | 22 + .../pages/(editor)/editor/_modules/utils.tsx | 2 +- .../src/pages/(editor)/editor/index.tsx | 4 +- .../src/pages/(legacy)/connections.tsx | 2 +- .../nyanpasu/src/pages/(legacy)/settings.tsx | 11 +- .../(main)/_modules/header-file-action.tsx | 35 + .../(main)/_modules/header-help-action.tsx | 80 + .../src/pages/(main)/_modules/header-menu.tsx | 20 +- .../_modules/header-settings-action.tsx | 96 + .../src/pages/(main)/_modules/navbar.tsx | 6 +- .../profiles/$type/_modules/import-button.tsx | 11 +- .../$type/_modules/local-profile-button.tsx | 35 +- .../(main)/main/profiles/$type/index.tsx | 8 + .../settings/_modules/settings-navigate.tsx | 306 +- .../(main)/main/settings/clash-core/route.tsx | 9 - .../clash-external-controll/route.tsx | 11 - .../main/settings/clash-filed/route.tsx | 9 - .../_modules/allow-lan-switch.tsx | 3 +- .../_modules/ipv6-switch.tsx | 3 +- .../_modules/log-level-selector.tsx | 0 .../_modules/mixed-port-config.tsx | 0 .../_modules/random-port-switch.tsx | 0 .../_modules/tun-stack-selector.tsx | 0 .../{clash-settings => clash}/route.tsx | 2 +- .../_modules/window-debug.tsx | 0 .../settings/{debug-utils => debug}/route.tsx | 2 +- .../{nyanpasu-config => nyanpasu}/route.tsx | 2 +- .../src/pages/(main)/main/settings/route.tsx | 2 +- .../main/settings/system-behavior/route.tsx | 9 - .../main/settings/system-service/route.tsx | 9 - .../_modules/current-system-proxy.tsx | 0 .../_modules/proxy-bypass-config.tsx | 4 +- .../_modules/proxy-guard-config.tsx | 0 .../_modules/proxy-guard-switch.tsx | 3 +- .../system/_modules/system-service-ctrl.tsx | 306 ++ .../system/_modules/system-service-switch.tsx | 66 + .../{system-proxy => system}/route.tsx | 13 +- .../_modules/language-selector.tsx | 54 +- .../user-interface/_modules/switch-legacy.tsx | 64 +- .../_modules/theme-color-config.tsx | 107 +- .../_modules/theme-mode-selector.tsx | 54 +- .../frontend/nyanpasu/src/route-tree.gen.ts | 259 +- .../nyanpasu/src/utils/ignore-case.ts | 1 + .../frontend/nyanpasu/src/utils/index.ts | 12 +- .../frontend/nyanpasu/vite.config.ts | 1 + clash-nyanpasu/frontend/ui/package.json | 4 +- .../frontend/ui/src/chart/sparkline.tsx | 1 + .../frontend/ui/src/hooks/use-breakpoint.ts | 9 +- clash-nyanpasu/manifest/version.json | 4 +- clash-nyanpasu/package.json | 26 +- clash-nyanpasu/pnpm-lock.yaml | 4498 ++--------------- clash-nyanpasu/scripts/package.json | 2 +- .../0600-1-qca-nss-ecm-support-CORE.patch | 54 +- mieru/Makefile | 14 +- mieru/pkg/appctl/appctlcommon/client.go | 25 +- mieru/pkg/appctl/appctlcommon/server.go | 15 +- mieru/pkg/trafficpattern/config.go | 121 + mieru/pkg/trafficpattern/config_test.go | 211 + openwrt-passwall/luci-app-passwall/Makefile | 2 +- .../passwall/client/node_subscribe_config.lua | 1 - .../model/cbi/passwall/client/type/ray.lua | 2 +- .../cbi/passwall/client/type/sing-box.lua | 2 +- .../luasrc/passwall/util_sing-box.lua | 56 +- .../luasrc/passwall/util_xray.lua | 51 +- .../view/passwall/cbi/nodes_listvalue_com.htm | 68 +- .../passwall/cbi/nodes_multivalue_com.htm | 68 +- .../view/passwall/cbi/nodes_value_com.htm | 68 +- .../view/passwall/node_list/link_add_node.htm | 18 +- .../view/passwall/node_list/node_list.htm | 8 +- .../luci-app-passwall/po/zh-cn/passwall.po | 2 - .../root/usr/share/passwall/subscribe.lua | 2 +- .../client/node_subscribe_config.lua | 1 - .../passwall2/cbi/nodes_listvalue_com.htm | 68 +- .../passwall2/cbi/nodes_multivalue_com.htm | 68 +- .../view/passwall2/cbi/nodes_value_com.htm | 68 +- .../passwall2/node_list/link_add_node.htm | 18 +- .../view/passwall2/node_list/node_list.htm | 8 +- .../luci-app-passwall2/po/zh-cn/passwall2.po | 2 - .../luci-app-passwall2/po/zh-tw/passwall2.po | 2 - .../root/usr/share/passwall2/subscribe.lua | 2 +- sing-box/dns/client.go | 12 +- sing-box/experimental/cachefile/cache.go | 59 +- sing-box/experimental/cachefile/fakeip.go | 12 +- sing-box/experimental/cachefile/rdrc.go | 6 +- sing-box/go.mod | 2 +- sing-box/go.sum | 4 +- sing-box/test/go.mod | 79 +- sing-box/test/go.sum | 168 +- sing-box/test/socks_test.go | 134 + .../htdocs/luci-static/resources/fchomo.js | 4 + .../resources/view/fchomo/client.js | 156 +- small/luci-app-fchomo/po/templates/fchomo.pot | 735 +-- small/luci-app-fchomo/po/zh_Hans/fchomo.po | 735 +-- small/luci-app-fchomo/po/zh_Hant/fchomo.po | 735 +-- small/luci-app-fchomo/root/etc/init.d/fchomo | 1 + .../root/usr/share/fchomo/generate_client.uc | 40 +- small/luci-app-passwall/Makefile | 2 +- .../passwall/client/node_subscribe_config.lua | 1 - .../model/cbi/passwall/client/type/ray.lua | 2 +- .../cbi/passwall/client/type/sing-box.lua | 2 +- .../luasrc/passwall/util_sing-box.lua | 56 +- .../luasrc/passwall/util_xray.lua | 51 +- .../view/passwall/cbi/nodes_listvalue_com.htm | 68 +- .../passwall/cbi/nodes_multivalue_com.htm | 68 +- .../view/passwall/cbi/nodes_value_com.htm | 68 +- .../view/passwall/node_list/link_add_node.htm | 18 +- .../view/passwall/node_list/node_list.htm | 8 +- small/luci-app-passwall/po/zh-cn/passwall.po | 2 - .../root/usr/share/passwall/subscribe.lua | 2 +- small/luci-app-passwall2/Makefile | 2 +- .../client/node_subscribe_config.lua | 1 - .../model/cbi/passwall2/client/type/ray.lua | 16 +- .../cbi/passwall2/client/type/sing-box.lua | 2 +- .../model/cbi/passwall2/server/type/ray.lua | 14 +- .../luasrc/passwall2/util_sing-box.lua | 56 +- .../luasrc/passwall2/util_xray.lua | 102 +- .../passwall2/cbi/nodes_listvalue_com.htm | 68 +- .../passwall2/cbi/nodes_multivalue_com.htm | 68 +- .../view/passwall2/cbi/nodes_value_com.htm | 68 +- .../luasrc/view/passwall2/haproxy/js.htm | 5 + .../passwall2/node_list/link_add_node.htm | 18 +- .../view/passwall2/node_list/node_list.htm | 13 +- .../view/passwall2/node_subscribe/js.htm | 5 + .../view/passwall2/rule/rule_version.htm | 5 + .../luci-app-passwall2/po/zh-cn/passwall2.po | 2 - .../luci-app-passwall2/po/zh-tw/passwall2.po | 2 - .../root/usr/share/passwall2/subscribe.lua | 2 +- .../root/etc/uci-defaults/luci-ssr-plus | 2 +- .../luci-app-ssr-plus/root/usr/bin/ssr-rules | 8 +- .../root/usr/share/shadowsocksr/chinaipset.sh | 58 +- .../usr/share/shadowsocksr/gen_config.lua | 14 +- .../root/usr/share/shadowsocksr/gfw2ipset.sh | 51 +- small/v2ray-geodata/Makefile | 8 +- small/xray-core/Makefile | 4 +- .../.github/workflows/beta_release_main.yml | 44 +- v2raya/.github/workflows/pull_request.yml | 12 +- v2raya/.github/workflows/release_main.yml | 48 +- v2raya/.github/workflows/test_build_main.yml | 36 +- v2raya/.gitignore | 13 + v2raya/build-in-pwsh.ps1 | 15 +- v2raya/gui/src/assets/js/utils.js | 19 +- v2raya/gui/src/components/modalServer.vue | 354 +- v2raya/gui/src/components/modalSetting.vue | 49 +- v2raya/gui/src/locales/en.js | 6 + v2raya/gui/src/locales/zh.js | 6 + .../windows-inno/ChineseSimplified.isl | 418 ++ .../install/windows-inno/v2rayA-service.xml | 32 - v2raya/install/windows-inno/windows.iss | 88 + v2raya/install/windows-inno/windows_arm64.iss | 81 - .../install/windows-inno/windows_x86_64.iss | 81 - v2raya/ngui/composables/system.ts | 4 +- v2raya/ngui/pages/setting.vue | 6 +- v2raya/service/common/tools.go | 10 + v2raya/service/conf/environmentConfig.go | 2 + .../core/iptables/systemProxy_macos.go | 2 + .../core/iptables/systemProxy_other.go | 115 +- v2raya/service/core/serverObj/anytls.go | 91 + v2raya/service/core/serverObj/http.go | 42 +- v2raya/service/core/serverObj/hysteria2.go | 99 + v2raya/service/core/serverObj/pingtunnel.go | 143 - v2raya/service/core/serverObj/shadowsocks.go | 33 +- v2raya/service/core/serverObj/socks.go | 32 +- v2raya/service/core/serverObj/trojan.go | 156 +- v2raya/service/core/serverObj/tuic.go | 85 +- v2raya/service/core/tun/dns.go | 28 +- v2raya/service/core/tun/route.go | 72 + v2raya/service/core/tun/route_other.go | 186 + v2raya/service/core/tun/singTun.go | 234 +- v2raya/service/core/tun/tun.go | 2 + v2raya/service/core/v2ray/api.go | 10 +- v2raya/service/core/v2ray/process.go | 66 +- v2raya/service/core/v2ray/transparent.go | 31 +- v2raya/service/core/v2ray/v2rayTmpl.go | 269 +- v2raya/service/core/v2ray/where/where.go | 61 +- v2raya/service/db/configure/setting.go | 4 + v2raya/service/go.mod | 69 +- v2raya/service/go.sum | 162 +- v2raya/service/main.go | 18 +- v2raya/service/pkg/plugin/anytls/anytls.go | 76 + v2raya/service/pkg/plugin/chain.go | 21 +- v2raya/service/pkg/plugin/converter.go | 21 +- v2raya/service/pkg/plugin/dialer.go | 148 +- v2raya/service/pkg/plugin/direct.go | 54 +- v2raya/service/pkg/plugin/http/http.go | 71 + .../service/pkg/plugin/hysteria2/hysteria2.go | 79 + v2raya/service/pkg/plugin/juicity/juicity.go | 45 +- .../pkg/plugin/packetconn_converter.go | 5 +- v2raya/service/pkg/plugin/proxy.go | 24 +- v2raya/service/pkg/plugin/server.go | 32 +- .../pkg/plugin/simpleobfs/simpleobfs.go | 22 +- v2raya/service/pkg/plugin/socks5/socks5.go | 79 +- v2raya/service/pkg/plugin/ss/ss.go | 104 +- v2raya/service/pkg/plugin/ssr/ssr.go | 30 +- v2raya/service/pkg/plugin/tcp/tcp.go | 17 +- v2raya/service/pkg/plugin/tls/tls.go | 20 +- v2raya/service/pkg/plugin/trojan/trojan.go | 85 + v2raya/service/pkg/plugin/trojanc/trojanc.go | 19 +- v2raya/service/pkg/plugin/tuic/tuic.go | 45 +- v2raya/service/pkg/plugin/ws/ws.go | 20 +- v2raya/service/pkg/util/log/log.go | 10 +- v2raya/service/server/controller/import.go | 27 +- v2raya/service/server/controller/version.go | 16 +- v2raya/service/server/service/connect.go | 17 +- v2raya/service/server/service/import.go | 38 +- v2raya/service/server/service/subscription.go | 22 +- v2raya/service/service_other.go | 27 + v2raya/service/service_windows.go | 265 + .../ServiceLib/Handler/ConfigHandler.cs | 7 +- .../ServiceLib/Helper/DownloaderHelper.cs | 2 +- .../v2rayN/ServiceLib/Manager/AppManager.cs | 279 +- .../ServiceLib/Manager/GroupProfileManager.cs | 15 +- .../v2rayN/ServiceLib/Models/ConfigItems.cs | 2 +- .../v2rayN/ServiceLib/Models/ProfileItem.cs | 16 +- .../ServiceLib/Models/ProfileItemModel.cs | 23 +- .../v2rayN/ServiceLib/Resx/ResUI.Designer.cs | 9 + .../v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx | 3 + v2rayn/v2rayN/ServiceLib/Resx/ResUI.fr.resx | 3 + v2rayn/v2rayN/ServiceLib/Resx/ResUI.hu.resx | 3 + v2rayn/v2rayN/ServiceLib/Resx/ResUI.resx | 3 + v2rayn/v2rayN/ServiceLib/Resx/ResUI.ru.resx | 3 + .../v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx | 3 + .../v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx | 3 + .../ViewModels/AddGroupServerViewModel.cs | 49 +- .../ViewModels/AddServerViewModel.cs | 3 + .../ViewModels/ProfilesSelectViewModel.cs | 2 +- .../ViewModels/ProfilesViewModel.cs | 4 +- .../ViewModels/StatusBarViewModel.cs | 4 +- .../Views/AddGroupServerWindow.axaml | 48 +- .../Views/AddGroupServerWindow.axaml.cs | 31 +- .../v2rayN/Views/AddGroupServerWindow.xaml | 42 + .../v2rayN/Views/AddGroupServerWindow.xaml.cs | 32 + v2rayng/AndroidLibXrayLite/go.mod | 14 +- v2rayng/AndroidLibXrayLite/go.sum | 30 +- v2rayng/V2rayNG/app/build.gradle.kts | 4 +- .../java/com/v2ray/ang/dto/V2rayConfig.kt | 31 +- .../main/java/com/v2ray/ang/fmt/FmtBase.kt | 8 +- .../java/com/v2ray/ang/fmt/Hysteria2Fmt.kt | 17 +- .../java/com/v2ray/ang/fmt/ShadowsocksFmt.kt | 4 +- .../main/java/com/v2ray/ang/fmt/SocksFmt.kt | 2 +- .../main/java/com/v2ray/ang/fmt/TrojanFmt.kt | 2 +- .../main/java/com/v2ray/ang/fmt/VlessFmt.kt | 2 +- .../main/java/com/v2ray/ang/fmt/VmessFmt.kt | 2 +- .../java/com/v2ray/ang/fmt/WireguardFmt.kt | 2 +- .../v2ray/ang/handler/V2rayConfigManager.kt | 40 +- .../src/main/java/com/v2ray/ang/util/Utils.kt | 37 +- .../src/main/res/layout/activity_about.xml | 5 + v2rayng/hev-socks5-tunnel/README.md | 1 + .../hev-socks5-tunnel/src/hev-config-const.h | 2 +- .../hev-socks5-tunnel/src/hev-tunnel-macos.h | 4 +- xray-core/.github/workflows/test.yml | 16 + xray-core/app/dns/nameserver_doh.go | 1 + xray-core/app/observatory/burst/ping.go | 2 + xray-core/app/observatory/observer.go | 5 +- xray-core/common/utils/browser.go | 28 + xray-core/core/core.go | 2 +- xray-core/go.mod | 4 +- .../infra/conf/transport_authenticators.go | 8 +- xray-core/main/commands/all/tls/hash.go | 78 + .../main/commands/all/tls/leafcerthash.go | 44 - xray-core/main/commands/all/tls/ping.go | 16 +- xray-core/main/commands/all/tls/tls.go | 2 +- xray-core/proxy/http/client.go | 4 + .../internet/finalmask/xicmp/client.go | 16 +- xray-core/transport/internet/grpc/dial.go | 7 +- .../transport/internet/httpupgrade/dialer.go | 4 + .../transport/internet/reality/reality.go | 3 +- .../transport/internet/splithttp/config.go | 4 + xray-core/transport/internet/tls/config.go | 12 +- xray-core/transport/internet/tls/ech.go | 1 + xray-core/transport/internet/tls/pin.go | 31 +- .../transport/internet/websocket/config.go | 4 + 315 files changed, 10041 insertions(+), 8379 deletions(-) create mode 100644 clash-nyanpasu/.oxlintrc.json delete mode 100644 clash-nyanpasu/eslint.config.js create mode 100644 clash-nyanpasu/frontend/interface/src/ipc/use-core-dir.ts create mode 100644 clash-nyanpasu/frontend/interface/src/ipc/use-service-prompt.ts create mode 100644 clash-nyanpasu/frontend/nyanpasu/src/components/ui/text-marquee.tsx create mode 100644 clash-nyanpasu/frontend/nyanpasu/src/hooks/use-current-core-icon.ts create mode 100644 clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/_modules/header-file-action.tsx create mode 100644 clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/_modules/header-help-action.tsx create mode 100644 clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/_modules/header-settings-action.tsx delete mode 100644 clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-core/route.tsx delete mode 100644 clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-external-controll/route.tsx delete mode 100644 clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-filed/route.tsx rename clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/{clash-settings => clash}/_modules/allow-lan-switch.tsx (91%) rename clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/{clash-settings => clash}/_modules/ipv6-switch.tsx (91%) rename clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/{clash-settings => clash}/_modules/log-level-selector.tsx (100%) rename clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/{clash-settings => clash}/_modules/mixed-port-config.tsx (100%) rename clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/{clash-settings => clash}/_modules/random-port-switch.tsx (100%) rename clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/{clash-settings => clash}/_modules/tun-stack-selector.tsx (100%) rename clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/{clash-settings => clash}/route.tsx (98%) rename clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/{debug-utils => debug}/_modules/window-debug.tsx (100%) rename clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/{debug-utils => debug}/route.tsx (96%) rename clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/{nyanpasu-config => nyanpasu}/route.tsx (94%) delete mode 100644 clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system-behavior/route.tsx delete mode 100644 clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system-service/route.tsx rename clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/{system-proxy => system}/_modules/current-system-proxy.tsx (100%) rename clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/{system-proxy => system}/_modules/proxy-bypass-config.tsx (96%) rename clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/{system-proxy => system}/_modules/proxy-guard-config.tsx (100%) rename clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/{system-proxy => system}/_modules/proxy-guard-switch.tsx (90%) create mode 100644 clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/system-service-ctrl.tsx create mode 100644 clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/system-service-switch.tsx rename clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/{system-proxy => system}/route.tsx (76%) create mode 100644 mieru/pkg/trafficpattern/config.go create mode 100644 mieru/pkg/trafficpattern/config_test.go create mode 100644 sing-box/test/socks_test.go create mode 100644 v2raya/install/windows-inno/ChineseSimplified.isl delete mode 100644 v2raya/install/windows-inno/v2rayA-service.xml create mode 100644 v2raya/install/windows-inno/windows.iss delete mode 100644 v2raya/install/windows-inno/windows_arm64.iss delete mode 100644 v2raya/install/windows-inno/windows_x86_64.iss create mode 100644 v2raya/service/core/serverObj/anytls.go create mode 100644 v2raya/service/core/serverObj/hysteria2.go delete mode 100644 v2raya/service/core/serverObj/pingtunnel.go create mode 100644 v2raya/service/core/tun/route.go create mode 100644 v2raya/service/core/tun/route_other.go create mode 100644 v2raya/service/pkg/plugin/anytls/anytls.go create mode 100644 v2raya/service/pkg/plugin/http/http.go create mode 100644 v2raya/service/pkg/plugin/hysteria2/hysteria2.go create mode 100644 v2raya/service/pkg/plugin/trojan/trojan.go create mode 100644 v2raya/service/service_other.go create mode 100644 v2raya/service/service_windows.go create mode 100644 xray-core/common/utils/browser.go create mode 100644 xray-core/main/commands/all/tls/hash.go delete mode 100644 xray-core/main/commands/all/tls/leafcerthash.go diff --git a/.github/update.log b/.github/update.log index 573acd65bb..e60acaa59f 100644 --- a/.github/update.log +++ b/.github/update.log @@ -1263,3 +1263,4 @@ Update On Sun Feb 1 19:47:34 CET 2026 Update On Tue Feb 3 20:07:51 CET 2026 Update On Wed Feb 4 20:03:26 CET 2026 Update On Thu Feb 5 20:02:24 CET 2026 +Update On Fri Feb 6 20:02:22 CET 2026 diff --git a/clash-nyanpasu/.lintstagedrc.js b/clash-nyanpasu/.lintstagedrc.js index edc1826774..1eab7a8d51 100644 --- a/clash-nyanpasu/.lintstagedrc.js +++ b/clash-nyanpasu/.lintstagedrc.js @@ -1,7 +1,7 @@ export default { '*.{js,cjs,.mjs,jsx}': (filenames) => { const configFiles = [ - 'eslint.config.js', + '.oxlintrc.json', '.lintstagedrc.js', 'commitlint.config.js', ] @@ -9,26 +9,26 @@ export default { (file) => !configFiles.some((config) => file.endsWith(config)), ) if (filtered.length === 0) return [] - return ['prettier --write', 'eslint --cache --fix'] + return ['prettier --write', 'oxlint --fix'] }, 'scripts/**/*.{ts,tsx}': [ 'prettier --write', - 'node ./node_modules/eslint/bin/eslint.js --cache --fix', + 'oxlint --fix', () => 'tsc -p scripts/tsconfig.json --noEmit', ], 'frontend/interface/**/*.{ts,tsx}': [ 'prettier --write', - 'node ./node_modules/eslint/bin/eslint.js --cache --fix', + 'oxlint --fix', () => 'tsc -p frontend/interface/tsconfig.json --noEmit', ], 'frontend/ui/**/*.{ts,tsx}': [ 'prettier --write', - 'node ./node_modules/eslint/bin/eslint.js --cache --fix', + 'oxlint --fix', () => 'tsc -p frontend/ui/tsconfig.json --noEmit', ], 'frontend/nyanpasu/**/*.{ts,tsx}': [ 'prettier --write', - 'node ./node_modules/eslint/bin/eslint.js --cache --fix', + 'oxlint --fix', () => 'tsc -p frontend/nyanpasu/tsconfig.json --noEmit', ], 'backend/**/*.{rs,toml}': [ diff --git a/clash-nyanpasu/.oxlintrc.json b/clash-nyanpasu/.oxlintrc.json new file mode 100644 index 0000000000..4c2c10a4c5 --- /dev/null +++ b/clash-nyanpasu/.oxlintrc.json @@ -0,0 +1,651 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": [], + "categories": { + "correctness": "off" + }, + "env": { + "builtin": true + }, + "ignorePatterns": [ + "**/node_modules", + "**/.DS_Store", + "**/dist", + "**/*.local", + "**/update.json", + "scripts/_env.sh", + "**/.eslintcache", + "**/.stylelintcache", + "**/tauri.nightly.conf.json", + "**/tauri.preview.conf.json", + "**/.idea", + "**/*.tsbuildinfo", + "manifest/site/updater/*", + "!manifest/site/updater/.gitkeep", + "backend/tauri/gen/", + "**/index.html", + "**/node_modules/", + "node_modules/", + "backend/", + "backend/**/target", + "scripts/deno/**", + ".lintstagedrc.js", + "commitlint.config.js" + ], + "overrides": [ + { + "files": ["**/*.{jsx,mjsx,tsx,mtsx}"], + "rules": { + "react/display-name": "error", + "react/jsx-key": "error", + "react/jsx-no-comment-textnodes": "error", + "react/jsx-no-duplicate-props": "error", + "react/jsx-no-target-blank": "error", + // "react/jsx-no-undef": "error", + "react/no-children-prop": "error", + "react/no-danger-with-children": "error", + "react/no-direct-mutation-state": "error", + "react/no-find-dom-node": "error", + "react/no-is-mounted": "error", + "react/no-render-return-value": "error", + "react/no-string-refs": "error", + "react/no-unknown-property": "error", + "react/no-unsafe": "off", + "react/react-in-jsx-scope": "error" + }, + "plugins": ["react"] + }, + { + "files": ["**/*.{jsx,mjsx,tsx,mtsx}"], + "rules": { + "react-hooks/rules-of-hooks": "error", + "react-hooks/exhaustive-deps": "warn" + }, + "plugins": ["react"] + }, + { + "files": ["**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}"], + "rules": { + "no-var": "warn", + "accessor-pairs": [ + "error", + { + "setWithoutGet": true, + "enforceForClassMembers": true + } + ], + "array-callback-return": [ + "error", + { + "allowImplicit": false, + "checkForEach": false + } + ], + "constructor-super": "error", + "curly": ["error", "multi-line"], + "default-case-last": "error", + "eqeqeq": [ + "error", + "always", + { + "null": "ignore" + } + ], + "new-cap": [ + "error", + { + "newIsCap": true, + "capIsNew": false, + "properties": true + } + ], + "no-array-constructor": "error", + "no-async-promise-executor": "error", + "no-caller": "error", + "no-case-declarations": "error", + "no-class-assign": "error", + "no-compare-neg-zero": "error", + "no-cond-assign": "error", + "no-const-assign": "error", + "no-constant-condition": [ + "error", + { + "checkLoops": false + } + ], + "no-control-regex": "error", + "no-debugger": "error", + "no-delete-var": "error", + "no-dupe-class-members": "error", + "no-dupe-keys": "error", + "no-duplicate-case": "error", + "no-useless-backreference": "error", + "no-empty": [ + "error", + { + "allowEmptyCatch": true + } + ], + "no-empty-character-class": "error", + "no-empty-pattern": "error", + "no-eval": "error", + "no-ex-assign": "error", + "no-extend-native": "error", + "no-extra-bind": "error", + "no-extra-boolean-cast": "error", + "no-fallthrough": "error", + "no-func-assign": "error", + "no-global-assign": "error", + "no-import-assign": "error", + "no-invalid-regexp": "error", + "no-irregular-whitespace": "error", + "no-iterator": "error", + "no-labels": [ + "error", + { + "allowLoop": false, + "allowSwitch": false + } + ], + "no-lone-blocks": "error", + "no-loss-of-precision": "error", + "no-prototype-builtins": "error", + "no-useless-catch": "error", + "no-multi-str": "error", + "no-new": "error", + "no-new-func": "error", + "no-object-constructor": "error", + "no-new-native-nonconstructor": "error", + "no-new-wrappers": "error", + "no-obj-calls": "error", + "no-proto": "error", + "no-redeclare": [ + "error", + { + "builtinGlobals": false + } + ], + "no-regex-spaces": "error", + "no-return-assign": ["error", "except-parens"], + "no-self-assign": [ + "error", + { + "props": true + } + ], + "no-self-compare": "error", + "no-sequences": "error", + "no-shadow-restricted-names": "error", + "no-sparse-arrays": "error", + "no-template-curly-in-string": "error", + "no-this-before-super": "error", + "no-throw-literal": "error", + "no-unexpected-multiline": "error", + "no-unneeded-ternary": [ + "error", + { + "defaultAssignment": false + } + ], + "no-unsafe-finally": "error", + "no-unsafe-negation": "error", + "no-unused-expressions": [ + "error", + { + "allowShortCircuit": true, + "allowTernary": true, + "allowTaggedTemplates": true + } + ], + "no-unused-vars": [ + "error", + { + "args": "none", + "caughtErrors": "none", + "ignoreRestSiblings": true, + "vars": "all" + } + ], + "no-useless-call": "error", + "no-useless-computed-key": "error", + "no-useless-constructor": "error", + "no-useless-escape": "error", + "no-useless-rename": "error", + "no-useless-return": "error", + "no-void": "error", + "no-with": "error", + "prefer-const": [ + "error", + { + "destructuring": "all" + } + ], + "prefer-promise-reject-errors": "error", + "symbol-description": "error", + "unicode-bom": ["error", "never"], + "use-isnan": [ + "error", + { + "enforceForSwitchCase": true, + "enforceForIndexOf": true + } + ], + "valid-typeof": [ + "error", + { + "requireStringLiterals": true + } + ], + "yoda": ["error", "never"], + "import-x/first": "error", + "import-x/no-absolute-path": [ + "error", + { + "esmodule": true, + "commonjs": true, + "amd": false + } + ], + "import-x/no-duplicates": "error", + "import-x/no-named-default": "error", + "import-x/no-webpack-loader-syntax": "error", + "promise/param-names": "error", + "node/no-exports-assign": "error", + "node/no-new-require": "error" + }, + "globals": { + "__dirname": "readonly", + "__filename": "readonly", + "AbortController": "readonly", + "AbortSignal": "readonly", + "atob": "readonly", + "Blob": "readonly", + "BroadcastChannel": "readonly", + "btoa": "readonly", + "Buffer": "readonly", + "ByteLengthQueuingStrategy": "readonly", + "clearImmediate": "readonly", + "clearInterval": "readonly", + "clearTimeout": "readonly", + "CloseEvent": "readonly", + "CompressionStream": "readonly", + "console": "readonly", + "CountQueuingStrategy": "readonly", + "crypto": "readonly", + "Crypto": "readonly", + "CryptoKey": "readonly", + "CustomEvent": "readonly", + "DecompressionStream": "readonly", + "DOMException": "readonly", + "Event": "readonly", + "EventTarget": "readonly", + "fetch": "readonly", + "File": "readonly", + "FormData": "readonly", + "Headers": "readonly", + "MessageChannel": "readonly", + "MessageEvent": "readonly", + "MessagePort": "readonly", + "navigator": "readonly", + "Navigator": "readonly", + "performance": "readonly", + "Performance": "readonly", + "PerformanceEntry": "readonly", + "PerformanceMark": "readonly", + "PerformanceMeasure": "readonly", + "PerformanceObserver": "readonly", + "PerformanceObserverEntryList": "readonly", + "PerformanceResourceTiming": "readonly", + "process": "readonly", + "queueMicrotask": "readonly", + "ReadableByteStreamController": "readonly", + "ReadableStream": "readonly", + "ReadableStreamBYOBReader": "readonly", + "ReadableStreamBYOBRequest": "readonly", + "ReadableStreamDefaultController": "readonly", + "ReadableStreamDefaultReader": "readonly", + "Request": "readonly", + "Response": "readonly", + "setImmediate": "readonly", + "setInterval": "readonly", + "setTimeout": "readonly", + "structuredClone": "readonly", + "SubtleCrypto": "readonly", + "TextDecoder": "readonly", + "TextDecoderStream": "readonly", + "TextEncoder": "readonly", + "TextEncoderStream": "readonly", + "TransformStream": "readonly", + "TransformStreamDefaultController": "readonly", + "URL": "readonly", + "URLSearchParams": "readonly", + "WebAssembly": "readonly", + "WebSocket": "readonly", + "WritableStream": "readonly", + "WritableStreamDefaultController": "readonly", + "WritableStreamDefaultWriter": "readonly", + "document": "readonly", + "window": "readonly" + }, + "env": { + "commonjs": true, + "es2024": true + }, + "plugins": ["import", "node", "promise"] + }, + { + "files": ["**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}"], + "rules": { + "react/jsx-boolean-value": "error", + "react/jsx-fragments": ["error", "syntax"], + "react/jsx-handler-names": "error", + "react/jsx-key": [ + "error", + { + "checkFragmentShorthand": true + } + ], + "react/jsx-no-comment-textnodes": "error", + "react/jsx-no-duplicate-props": "error", + "react/jsx-no-target-blank": [ + "error", + { + "enforceDynamicLinks": "always" + } + ], + // "react/jsx-no-undef": [ + // "error", + // { + // "allowGlobals": true + // } + // ], + "react/no-children-prop": "error", + "react/no-danger-with-children": "error", + "react/no-direct-mutation-state": "error", + "react/no-find-dom-node": "error", + "react/no-is-mounted": "error", + "react/no-string-refs": [ + "error", + { + "noTemplateLiterals": true + } + ], + "react/no-unescaped-entities": "off", + "react/no-render-return-value": "error", + "react/self-closing-comp": "error" + }, + "plugins": ["react"] + }, + { + "files": ["**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}"], + "rules": { + "constructor-super": "off", + "no-const-assign": "off", + "no-dupe-class-members": "error", + "no-dupe-keys": "off", + "no-func-assign": "off", + "no-import-assign": "off", + "no-new-native-nonconstructor": "off", + "no-obj-calls": "off", + "no-redeclare": [ + "error", + { + "builtinGlobals": false + } + ], + "no-this-before-super": "off", + "no-unsafe-negation": "off", + "no-array-constructor": "error", + "no-loss-of-precision": "error", + "no-unused-expressions": [ + "error", + { + "allowShortCircuit": true, + "allowTernary": true, + "allowTaggedTemplates": true + } + ], + "no-unused-vars": [ + "error", + { + "args": "none", + "caughtErrors": "none", + "ignoreRestSiblings": true, + "vars": "all" + } + ], + "no-useless-constructor": "error" + }, + "plugins": ["typescript"] + }, + { + "files": ["**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}"], + "rules": { + "curly": "off", + "no-unexpected-multiline": "off", + "unicorn/empty-brace-spaces": "off", + "unicorn/no-nested-ternary": "off", + "unicorn/number-literal-case": "off" + }, + "plugins": ["unicorn"] + }, + { + "files": ["**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}"], + "rules": { + "curly": "off", + "no-unexpected-multiline": "off", + "unicorn/empty-brace-spaces": "off", + "unicorn/no-nested-ternary": "off", + "unicorn/number-literal-case": "off", + "arrow-body-style": "off" + }, + "plugins": ["unicorn"] + }, + { + "files": ["**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}"], + "rules": { + "no-console": "off", + "no-debugger": "off", + "no-unused-vars": "warn", + "react/react-in-jsx-scope": "off" + }, + "plugins": ["typescript", "react"] + }, + { + "files": ["**/*.{ts,tsx,mtsx}"], + "rules": { + "constructor-super": "off", + "no-class-assign": "off", + "no-const-assign": "off", + "no-dupe-class-members": "off", + "no-dupe-keys": "off", + "no-func-assign": "off", + "no-import-assign": "off", + "no-new-native-nonconstructor": "off", + "no-obj-calls": "off", + "no-redeclare": "off", + "no-setter-return": "off", + "no-this-before-super": "off", + "no-unsafe-negation": "off", + "no-var": "error", + "no-with": "off", + "prefer-const": "error", + "prefer-rest-params": "error", + "prefer-spread": "error" + } + }, + { + "files": ["**/*.{ts,tsx,mtsx}"], + "rules": { + "@typescript-eslint/ban-ts-comment": "error", + "no-array-constructor": "error", + "@typescript-eslint/no-duplicate-enum-values": "error", + "@typescript-eslint/no-empty-object-type": "error", + "@typescript-eslint/no-explicit-any": "error", + "@typescript-eslint/no-extra-non-null-assertion": "error", + "@typescript-eslint/no-misused-new": "error", + "@typescript-eslint/no-namespace": "error", + "@typescript-eslint/no-non-null-asserted-optional-chain": "error", + "@typescript-eslint/no-require-imports": "error", + "@typescript-eslint/no-this-alias": "error", + "@typescript-eslint/no-unnecessary-type-constraint": "error", + "@typescript-eslint/no-unsafe-declaration-merging": "error", + "@typescript-eslint/no-unsafe-function-type": "error", + "no-unused-expressions": "error", + "no-unused-vars": "error", + "@typescript-eslint/no-wrapper-object-types": "error", + "@typescript-eslint/prefer-as-const": "error", + "@typescript-eslint/prefer-namespace-keyword": "error", + "@typescript-eslint/triple-slash-reference": "error" + }, + "plugins": ["typescript"] + }, + { + "files": ["**/*.{ts,tsx,mtsx}"], + "rules": { + "@typescript-eslint/no-explicit-any": "warn", + "no-unused-vars": "warn" + }, + "plugins": ["typescript"] + }, + { + "files": [ + "frontend/nyanpasu/vite.config.ts", + "frontend/nyanpasu/tailwind.config.ts" + ], + "rules": { + "constructor-super": "off", + "no-class-assign": "off", + "no-const-assign": "off", + "no-dupe-class-members": "off", + "no-dupe-keys": "off", + "no-func-assign": "off", + "no-import-assign": "off", + "no-new-native-nonconstructor": "off", + "no-obj-calls": "off", + "no-redeclare": "off", + "no-setter-return": "off", + "no-this-before-super": "off", + "no-unsafe-negation": "off", + "no-var": "error", + "no-with": "off", + "prefer-const": "error", + "prefer-rest-params": "error", + "prefer-spread": "error" + } + }, + { + "files": [ + "frontend/nyanpasu/vite.config.ts", + "frontend/nyanpasu/tailwind.config.ts" + ], + "rules": { + "@typescript-eslint/ban-ts-comment": "error", + "no-array-constructor": "error", + "@typescript-eslint/no-duplicate-enum-values": "error", + "@typescript-eslint/no-empty-object-type": "error", + "@typescript-eslint/no-explicit-any": "error", + "@typescript-eslint/no-extra-non-null-assertion": "error", + "@typescript-eslint/no-misused-new": "error", + "@typescript-eslint/no-namespace": "error", + "@typescript-eslint/no-non-null-asserted-optional-chain": "error", + "@typescript-eslint/no-require-imports": "error", + "@typescript-eslint/no-this-alias": "error", + "@typescript-eslint/no-unnecessary-type-constraint": "error", + "@typescript-eslint/no-unsafe-declaration-merging": "error", + "@typescript-eslint/no-unsafe-function-type": "error", + "no-unused-expressions": "error", + "no-unused-vars": "error", + "@typescript-eslint/no-wrapper-object-types": "error", + "@typescript-eslint/prefer-as-const": "error", + "@typescript-eslint/prefer-namespace-keyword": "error", + "@typescript-eslint/triple-slash-reference": "error" + }, + "plugins": ["typescript"] + }, + { + "files": [ + "frontend/nyanpasu/vite.config.ts", + "frontend/nyanpasu/tailwind.config.ts" + ], + "rules": { + "@typescript-eslint/no-explicit-any": "warn", + "no-unused-vars": "warn" + }, + "plugins": ["typescript"] + }, + { + "files": ["frontend/ui/vite.config.ts"], + "rules": { + "constructor-super": "off", + "no-class-assign": "off", + "no-const-assign": "off", + "no-dupe-class-members": "off", + "no-dupe-keys": "off", + "no-func-assign": "off", + "no-import-assign": "off", + "no-new-native-nonconstructor": "off", + "no-obj-calls": "off", + "no-redeclare": "off", + "no-setter-return": "off", + "no-this-before-super": "off", + "no-unsafe-negation": "off", + "no-var": "error", + "no-with": "off", + "prefer-const": "error", + "prefer-rest-params": "error", + "prefer-spread": "error" + } + }, + { + "files": ["frontend/ui/vite.config.ts"], + "rules": { + "@typescript-eslint/ban-ts-comment": "error", + "no-array-constructor": "error", + "@typescript-eslint/no-duplicate-enum-values": "error", + "@typescript-eslint/no-empty-object-type": "error", + "@typescript-eslint/no-explicit-any": "error", + "@typescript-eslint/no-extra-non-null-assertion": "error", + "@typescript-eslint/no-misused-new": "error", + "@typescript-eslint/no-namespace": "error", + "@typescript-eslint/no-non-null-asserted-optional-chain": "error", + "@typescript-eslint/no-require-imports": "error", + "@typescript-eslint/no-this-alias": "error", + "@typescript-eslint/no-unnecessary-type-constraint": "error", + "@typescript-eslint/no-unsafe-declaration-merging": "error", + "@typescript-eslint/no-unsafe-function-type": "error", + "no-unused-expressions": "error", + "no-unused-vars": "error", + "@typescript-eslint/no-wrapper-object-types": "error", + "@typescript-eslint/prefer-as-const": "error", + "@typescript-eslint/prefer-namespace-keyword": "error", + "@typescript-eslint/triple-slash-reference": "error" + }, + "plugins": ["typescript"] + }, + { + "files": ["frontend/ui/vite.config.ts"], + "rules": { + "@typescript-eslint/no-explicit-any": "warn", + "no-unused-vars": "warn" + }, + "plugins": ["typescript"] + }, + { + "files": ["**/*.{jsx,mjsx,tsx,mtsx}"], + "globals": { + "AudioWorkletGlobalScope": "readonly", + "AudioWorkletProcessor": "readonly", + "currentFrame": "readonly", + "currentTime": "readonly", + "registerProcessor": "readonly", + "sampleRate": "readonly", + "WorkletGlobalScope": "readonly" + }, + "env": { + "browser": true, + "serviceworker": true + } + } + ] +} diff --git a/clash-nyanpasu/.vscode/extensions.json b/clash-nyanpasu/.vscode/extensions.json index 479d676f8e..22e6d38a5e 100644 --- a/clash-nyanpasu/.vscode/extensions.json +++ b/clash-nyanpasu/.vscode/extensions.json @@ -4,13 +4,13 @@ "editorconfig.editorconfig", "vadimcn.vscode-lldb", "bungcip.better-toml", - "dbaeumer.vscode-eslint", "denoland.vscode-deno", "esbenp.prettier-vscode", "yoavbls.pretty-ts-errors", "rust-lang.rust-analyzer", "syler.sass-indented", "stylelint.vscode-stylelint", - "bradlc.vscode-tailwindcss" + "bradlc.vscode-tailwindcss", + "oxc.oxc-vscode" ] } diff --git a/clash-nyanpasu/backend/Cargo.lock b/clash-nyanpasu/backend/Cargo.lock index f3dbb88606..f7c72a045b 100644 --- a/clash-nyanpasu/backend/Cargo.lock +++ b/clash-nyanpasu/backend/Cargo.lock @@ -355,7 +355,7 @@ dependencies = [ "objc2-foundation 0.3.2", "parking_lot", "percent-encoding", - "windows-sys 0.52.0", + "windows-sys 0.60.2", "wl-clipboard-rs", "x11rb", ] @@ -2859,7 +2859,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] @@ -4456,9 +4456,9 @@ dependencies = [ [[package]] name = "interprocess" -version = "2.2.3" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d941b405bd2322993887859a8ee6ac9134945a24ec5ec763a8a962fc64dfec2d" +checksum = "7b00d05442c2106c75b7410f820b152f61ec0edc7befcb9b381b673a20314753" dependencies = [ "doctest-file", "futures-core", @@ -7223,7 +7223,7 @@ dependencies = [ "once_cell", "socket2", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] @@ -7786,7 +7786,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.4.15", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -7799,7 +7799,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.11.0", - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] @@ -9473,7 +9473,7 @@ dependencies = [ "getrandom 0.3.3", "once_cell", "rustix 1.1.3", - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] diff --git a/clash-nyanpasu/backend/tauri/src/lib.rs b/clash-nyanpasu/backend/tauri/src/lib.rs index 05adb8a007..df712d807e 100644 --- a/clash-nyanpasu/backend/tauri/src/lib.rs +++ b/clash-nyanpasu/backend/tauri/src/lib.rs @@ -307,7 +307,7 @@ pub fn run() -> std::io::Result<()> { .map_err(io::Error::other) }) .bigint(BigIntExportBehavior::Number) - .header("/* eslint-disable */\n// @ts-nocheck"), + .header("/* oxlint-disable */\n// @ts-nocheck"), SPECTA_BINDINGS_PATH, ) { Ok(_) => { diff --git a/clash-nyanpasu/eslint.config.js b/clash-nyanpasu/eslint.config.js deleted file mode 100644 index e39731a8ff..0000000000 --- a/clash-nyanpasu/eslint.config.js +++ /dev/null @@ -1,143 +0,0 @@ -// @ts-check -import path from 'node:path' -import { fileURLToPath } from 'node:url' -import eslintConfigPrettier from 'eslint-config-prettier' -import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended' -import react from 'eslint-plugin-react' -import pluginReactCompiler from 'eslint-plugin-react-compiler' -import pluginReactHooks from 'eslint-plugin-react-hooks' -import globals from 'globals' -import neostandard from 'neostandard' -import tseslint from 'typescript-eslint' -import { includeIgnoreFile } from '@eslint/compat' -import { FlatCompat } from '@eslint/eslintrc' - -// import ImportX from "eslint-plugin-import-x"; - -const __filename = fileURLToPath(import.meta.url) -const __dirname = path.dirname(__filename) -// eslint-disable-next-line @typescript-eslint/no-unused-vars -const compat = new FlatCompat({ - // import.meta.dirname is available after Node.js v20.11.0 - baseDirectory: __dirname, -}) -const gitignorePath = path.resolve(__dirname, '.gitignore') - -const ignores = [ - path.resolve(__dirname, 'index.html'), - '**/node_modules/', - 'node_modules/', - '**/dist/', - 'dist/', - 'backend/', - 'backend/**/target', - 'scripts/deno/**', - 'eslint.config.js', - '.lintstagedrc.js', - 'commitlint.config.js', -] - -export default tseslint.config( - includeIgnoreFile(gitignorePath), - { - ignores, - }, - { - files: ['**/*.{jsx,mjsx,tsx,mtsx}'], - extends: [react.configs.flat.recommended], - plugins: { - 'react-hooks': pluginReactHooks, - 'react-compiler': pluginReactCompiler, - }, - settings: { - react: { - version: 'detect', - }, - }, - rules: { - 'react-hooks/rules-of-hooks': 'error', - 'react-hooks/exhaustive-deps': 'warn', - 'react-compiler/react-compiler': 'warn', - }, - }, - { - files: ['**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}'], - extends: [ - ...neostandard({ ts: true, semi: true, noStyle: true }), - eslintConfigPrettier, - eslintPluginPrettierRecommended, - ], - rules: { - 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', - 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', - 'no-unused-vars': 'off', - '@typescript-eslint/no-unused-vars': 'warn', - 'react/react-in-jsx-scope': 'off', - 'prettier/prettier': [ - 'error', - { - singleQuote: true, - }, - ], - }, - }, - { - files: ['**/*.{ts,tsx,mtsx}'], - extends: [...tseslint.configs.recommended], - ignores: [ - ...ignores, - 'frontend/nyanpasu/vite.config.ts', - 'frontend/nyanpasu/tailwind.config.ts', - 'frontend/ui/vite.config.ts', - ], - rules: { - '@typescript-eslint/no-unused-vars': 'warn', - '@typescript-eslint/no-explicit-any': 'warn', - }, - languageOptions: { - parserOptions: { - project: true, - tsconfigRootDir: import.meta.dirname, - }, - }, - }, - { - files: [ - 'frontend/nyanpasu/vite.config.ts', - 'frontend/nyanpasu/tailwind.config.ts', - ], - extends: [...tseslint.configs.recommended], - rules: { - '@typescript-eslint/no-unused-vars': 'warn', - '@typescript-eslint/no-explicit-any': 'warn', - }, - languageOptions: { - parserOptions: { - project: './frontend/nyanpasu/tsconfig.node.json', - }, - }, - }, - { - files: ['frontend/ui/vite.config.ts'], - extends: [...tseslint.configs.recommended], - rules: { - '@typescript-eslint/no-unused-vars': 'warn', - '@typescript-eslint/no-explicit-any': 'warn', - }, - languageOptions: { - parserOptions: { - project: './frontend/ui/tsconfig.json', - }, - }, - }, - { - files: ['**/*.{jsx,mjsx,tsx,mtsx}'], - languageOptions: { - ...react.configs.flat?.recommended.languageOptions, - globals: { - ...globals.serviceworker, - ...globals.browser, - }, - }, - }, -) diff --git a/clash-nyanpasu/frontend/interface/package.json b/clash-nyanpasu/frontend/interface/package.json index c022fa1856..faf60f1d38 100644 --- a/clash-nyanpasu/frontend/interface/package.json +++ b/clash-nyanpasu/frontend/interface/package.json @@ -22,6 +22,6 @@ }, "devDependencies": { "@types/lodash-es": "4.17.12", - "@types/react": "19.2.11" + "@types/react": "19.2.13" } } diff --git a/clash-nyanpasu/frontend/interface/src/ipc/bindings.ts b/clash-nyanpasu/frontend/interface/src/ipc/bindings.ts index 2a027f55b5..f379e987c1 100644 --- a/clash-nyanpasu/frontend/interface/src/ipc/bindings.ts +++ b/clash-nyanpasu/frontend/interface/src/ipc/bindings.ts @@ -7,7 +7,7 @@ import { import * as TAURI_API_EVENT from '@tauri-apps/api/event' import { type WebviewWindow as __WebviewWindow__ } from '@tauri-apps/api/webviewWindow' -/* eslint-disable */ +/* oxlint-disable */ // @ts-nocheck // This file was generated by [tauri-specta](https://github.com/oscartbeaumont/tauri-specta). Do not edit this file manually. diff --git a/clash-nyanpasu/frontend/interface/src/ipc/consts.ts b/clash-nyanpasu/frontend/interface/src/ipc/consts.ts index 83fa17d39e..496327de52 100644 --- a/clash-nyanpasu/frontend/interface/src/ipc/consts.ts +++ b/clash-nyanpasu/frontend/interface/src/ipc/consts.ts @@ -3,6 +3,16 @@ */ export const NYANPASU_BACKEND_EVENT_NAME = 'nyanpasu://mutation' +/** + * Service prompt query key, used by useServicePrompt hook + */ +export const SERVICE_PROMPT_QUERY_KEY = 'service-prompt' + +/** + * Core dir query key, used by useCoreDir hook + */ +export const CORE_DIR_QUERY_KEY = 'core-dir' + /** * Server port query key, used by useServerPort hook */ diff --git a/clash-nyanpasu/frontend/interface/src/ipc/index.ts b/clash-nyanpasu/frontend/interface/src/ipc/index.ts index 888796c177..d491f3ff01 100644 --- a/clash-nyanpasu/frontend/interface/src/ipc/index.ts +++ b/clash-nyanpasu/frontend/interface/src/ipc/index.ts @@ -22,6 +22,8 @@ export * from './use-runtime-profile' export * from './use-settings' export * from './use-system-proxy' export * from './use-system-service' +export * from './use-service-prompt' +export * from './use-core-dir' export { commands } from './bindings' export type * from './bindings' diff --git a/clash-nyanpasu/frontend/interface/src/ipc/use-core-dir.ts b/clash-nyanpasu/frontend/interface/src/ipc/use-core-dir.ts new file mode 100644 index 0000000000..d02343e3c8 --- /dev/null +++ b/clash-nyanpasu/frontend/interface/src/ipc/use-core-dir.ts @@ -0,0 +1,17 @@ +import { unwrapResult } from '@/utils' +import { useQuery } from '@tanstack/react-query' +import { commands } from './bindings' +import { CORE_DIR_QUERY_KEY } from './consts' + +export const useCoreDir = () => { + const query = useQuery({ + queryKey: [CORE_DIR_QUERY_KEY], + queryFn: async () => { + return unwrapResult(await commands.getCoreDir()) + }, + }) + + return { + ...query, + } +} diff --git a/clash-nyanpasu/frontend/interface/src/ipc/use-proxy-mode.ts b/clash-nyanpasu/frontend/interface/src/ipc/use-proxy-mode.ts index 3e88ab0818..0b6247701b 100644 --- a/clash-nyanpasu/frontend/interface/src/ipc/use-proxy-mode.ts +++ b/clash-nyanpasu/frontend/interface/src/ipc/use-proxy-mode.ts @@ -48,7 +48,7 @@ export const useProxyMode = () => { } return modes - }, [clashConfig.query.data]) + }, [clashConfig.query.data, clashCore.value]) const upsert = async (mode: string) => { await deleteConnections() diff --git a/clash-nyanpasu/frontend/interface/src/ipc/use-service-prompt.ts b/clash-nyanpasu/frontend/interface/src/ipc/use-service-prompt.ts new file mode 100644 index 0000000000..c282526e88 --- /dev/null +++ b/clash-nyanpasu/frontend/interface/src/ipc/use-service-prompt.ts @@ -0,0 +1,17 @@ +import { unwrapResult } from '@/utils' +import { useQuery } from '@tanstack/react-query' +import { commands } from './bindings' +import { SERVICE_PROMPT_QUERY_KEY } from './consts' + +export const useServicePrompt = () => { + const query = useQuery({ + queryKey: [SERVICE_PROMPT_QUERY_KEY], + queryFn: async () => { + return unwrapResult(await commands.getServiceInstallPrompt()) + }, + }) + + return { + ...query, + } +} diff --git a/clash-nyanpasu/frontend/interface/src/service/tauri.ts b/clash-nyanpasu/frontend/interface/src/service/tauri.ts index d49b63d301..573ce4a208 100644 --- a/clash-nyanpasu/frontend/interface/src/service/tauri.ts +++ b/clash-nyanpasu/frontend/interface/src/service/tauri.ts @@ -1,3 +1,4 @@ +// oxlint-disable typescript/no-explicit-any import { IPSBResponse } from '@/openapi' import { invoke } from '@tauri-apps/api/core' import type { diff --git a/clash-nyanpasu/frontend/nyanpasu/messages/en.json b/clash-nyanpasu/frontend/nyanpasu/messages/en.json index 2b0ee38866..2f059c907d 100644 --- a/clash-nyanpasu/frontend/nyanpasu/messages/en.json +++ b/clash-nyanpasu/frontend/nyanpasu/messages/en.json @@ -9,6 +9,15 @@ "navbar_label_rules": "Rules", "navbar_label_settings": "Settings", "navbar_label_providers": "Providers", + "header_help_action_title": "Help", + "header_help_action_wiki": "Official Wiki", + "header_help_action_issues": "Report Issue", + "header_help_action_about": "About", + "header_settings_action_title": "Settings", + "header_settings_action_language": "Language", + "header_settings_action_theme_mode": "Theme Mode", + "header_file_action_title": "File", + "header_file_action_import_local_profile": "Import Local Profile", "settings_system_proxy_title": "System Settings", "settings_system_proxy_system_proxy_label": "System Proxy", "settings_system_proxy_tun_mode_label": "TUN Mode", @@ -16,6 +25,19 @@ "settings_system_proxy_proxy_guard_interval_label": "System Proxy Guard Interval", "settings_system_proxy_proxy_bypass_label": "System Proxy Bypass", "settings_system_proxy_current_system_proxy_label": "Current System Proxy", + "settings_system_proxy_service_mode_label": "Service Mode", + "settings_system_proxy_service_mode_disabled_tooltip": "To enable service mode, make sure the Clash Nyanpasu service is installed and started", + "settings_system_proxy_system_service_ctrl_label": "System Service", + "settings_system_proxy_system_service_ctrl_detail": "Service Detail", + "settings_system_proxy_system_service_ctrl_install": "Install", + "settings_system_proxy_system_service_ctrl_uninstall": "Uninstall", + "settings_system_proxy_system_service_ctrl_failed_install": "Install failed", + "settings_system_proxy_system_service_ctrl_failed_uninstall": "Uninstall failed", + "settings_system_proxy_system_service_ctrl_prompt": "Service Prompt", + "settings_system_proxy_system_service_ctrl_manual_prompt": "Service Manual Tips", + "settings_system_proxy_system_service_ctrl_manual_operation_prompt": "Unable to control the service automatically. Please navigate to the core directory, run PowerShell as administrator on Windows or a terminal emulator on macOS/Linux, and execute the following commands:", + "settings_system_proxy_system_service_ctrl_start": "Start", + "settings_system_proxy_system_service_ctrl_stop": "Stop", "settings_user_interface_title": "User Interface", "settings_user_interface_language_label": "Language", "settings_user_interface_theme_mode_label": "Theme Mode", @@ -23,6 +45,7 @@ "settings_user_interface_theme_mode_dark": "Dark", "settings_user_interface_theme_mode_system": "System", "settings_user_interface_theme_color_label": "Theme Color", + "settings_user_interface_theme_color_custom": "Custom", "settings_clash_settings_title": "Clash Settings", "settings_clash_settings_allow_lan_label": "Allow LAN", "settings_clash_settings_ipv6_label": "Enable IPv6", @@ -32,11 +55,26 @@ "settings_clash_settings_random_port_label": "Random Port", "settings_clash_settings_random_port_enabled": "Random port enabled, after restart to take effect.", "settings_clash_settings_random_port_disabled": "Random port disabled, after restart to take effect.", + "settings_label_system": "System Settings", + "settings_label_system_description": "Proxy mode, proxy bypass, auto start, silent start and more.", + "settings_label_user_interface": "User Interface", + "settings_label_user_interface_description": "Language, theme mode, theme color and more.", + "settings_label_clash_settings": "Clash Settings", + "settings_label_clash_settings_description": "Clash configuration, log level, mixed port, random port and more.", + "settings_label_external_controll": "Clash External Control", + "settings_label_external_controll_description": "Web UI address, port strategy, API key and more.", + "settings_label_nyanpasu": "Nyanpasu Settings", + "settings_label_nyanpasu_description": "Nyanpasu specific settings", + "settings_label_debug": "Debug Tools", + "settings_label_debug_description": "Debug tools and more.", + "settings_label_about": "About", + "settings_label_about_description": "About Clash Nyanpasu", "profile_subscription_title": "Subscription", "profile_subscription_updated_at": "{updated} updated", "profile_subscription_next_update_at": "Next update at {next} update", "profile_subscription_expires_in": "{expires} expires", "profile_subscription_update": "Update", + "profile_base_info_title": "Basic Info", "profile_name_editor_title": "Edit Name", "profile_name_label": "Profile Name", "profile_update_option_edit": "Sub. Opts", @@ -92,5 +130,7 @@ "common_apply": "Apply", "common_reset": "Reset", "common_save": "Save", - "common_validate": "Validate" + "common_validate": "Validate", + "common_close": "Close", + "common_copy": "Copy" } diff --git a/clash-nyanpasu/frontend/nyanpasu/messages/ru.json b/clash-nyanpasu/frontend/nyanpasu/messages/ru.json index a0c5349ff0..c50fa24b90 100644 --- a/clash-nyanpasu/frontend/nyanpasu/messages/ru.json +++ b/clash-nyanpasu/frontend/nyanpasu/messages/ru.json @@ -9,6 +9,15 @@ "navbar_label_rules": "Правила", "navbar_label_settings": "Настройки", "navbar_label_providers": "Поставщики", + "header_help_action_title": "Помощь", + "header_help_action_wiki": "Онлайн документация", + "header_help_action_issues": "Сообщить о проблеме", + "header_help_action_about": "О программе", + "header_settings_action_title": "Настройки", + "header_settings_action_language": "Язык", + "header_settings_action_theme_mode": "Режим темы", + "header_file_action_title": "Файл", + "header_file_action_import_local_profile": "Импорт локального профиля", "settings_system_proxy_title": "Системный прокси", "settings_system_proxy_system_proxy_label": "Системный прокси", "settings_system_proxy_tun_mode_label": "TUN режим", @@ -16,6 +25,19 @@ "settings_system_proxy_proxy_guard_interval_label": "Интервал охраны прокси", "settings_system_proxy_proxy_bypass_label": "Обход прокси", "settings_system_proxy_current_system_proxy_label": "Текущий системный прокси", + "settings_system_proxy_service_mode_label": "Режим службы", + "settings_system_proxy_service_mode_disabled_tooltip": "Чтобы включить режим службы, убедитесь, что служба Clash Nyanpasu установлена и запущена", + "settings_system_proxy_system_service_ctrl_label": "Системный сервис", + "settings_system_proxy_system_service_ctrl_detail": "Подробности сервиса", + "settings_system_proxy_system_service_ctrl_install": "Установить", + "settings_system_proxy_system_service_ctrl_uninstall": "Удалить", + "settings_system_proxy_system_service_ctrl_failed_install": "Установка не удалась", + "settings_system_proxy_system_service_ctrl_failed_uninstall": "Удаление не удалось", + "settings_system_proxy_system_service_ctrl_prompt": "Подсказка по сервису", + "settings_system_proxy_system_service_ctrl_manual_prompt": "Подсказка по сервису", + "settings_system_proxy_system_service_ctrl_manual_operation_prompt": "Не удалось автоматически управлять сервисом. Пожалуйста, перейдите в каталог ядра, запустите PowerShell как администратор на Windows или эмулятор терминала на macOS/Linux и выполните следующие команды:", + "settings_system_proxy_system_service_ctrl_start": "Запустить", + "settings_system_proxy_system_service_ctrl_stop": "Остановить", "settings_user_interface_title": "Интерфейс пользователя", "settings_user_interface_language_label": "Язык", "settings_user_interface_theme_mode_label": "Режим темы", @@ -23,6 +45,7 @@ "settings_user_interface_theme_mode_dark": "Темный", "settings_user_interface_theme_mode_system": "Системный", "settings_user_interface_theme_color_label": "Цвет темы", + "settings_user_interface_theme_color_custom": "Пользовательский", "settings_clash_settings_title": "Настройки Clash", "settings_clash_settings_allow_lan_label": "Разрешить LAN", "settings_clash_settings_ipv6_label": "Включить IPv6", @@ -32,11 +55,26 @@ "settings_clash_settings_random_port_label": "Случайный порт", "settings_clash_settings_random_port_enabled": "Случайный порт включен, после перезапуска для вступления в силу.", "settings_clash_settings_random_port_disabled": "Случайный порт отключен, после перезапуска для вступления в силу.", + "settings_label_system": "Системные настройки", + "settings_label_system_description": "Режим прокси, обход прокси, автозапуск, старт без отображения окна и т.д.", + "settings_label_user_interface": "Интерфейс пользователя", + "settings_label_user_interface_description": "Язык, режим темы, цвет темы и т.д.", + "settings_label_clash_settings": "Настройки Clash", + "settings_label_clash_settings_description": "Конфигурация Clash, уровень логирования, смешанный порт, случайный порт и т.д.", + "settings_label_external_controll": "Внешнее управление Clash", + "settings_label_external_controll_description": "Адрес Web UI, стратегия порта, API ключ и т.д.", + "settings_label_nyanpasu": "Настройки Nyanpasu", + "settings_label_nyanpasu_description": "Специфические настройки Nyanpasu", + "settings_label_debug": "Отладочные инструменты", + "settings_label_debug_description": "Отладочные инструменты и т.д.", + "settings_label_about": "О программе", + "settings_label_about_description": "О Clash Nyanpasu", "profile_subscription_title": "Информация о подписке", "profile_subscription_updated_at": "{updated} обновлено", "profile_subscription_next_update_at": "Следующее обновление через {next} обновление", "profile_subscription_expires_in": "{expires} истекает", "profile_subscription_update": "Обновить", + "profile_base_info_title": "Основная информация", "profile_name_editor_title": "Редактировать название", "profile_name_label": "Название профиля", "profile_update_option_edit": "Опции подписки", @@ -92,5 +130,7 @@ "common_apply": "Применить", "common_reset": "Сбросить", "common_save": "Сохранить", - "common_validate": "Проверить" + "common_validate": "Проверить", + "common_close": "Закрыть", + "common_copy": "Копировать" } diff --git a/clash-nyanpasu/frontend/nyanpasu/messages/zh-cn.json b/clash-nyanpasu/frontend/nyanpasu/messages/zh-cn.json index 3fc1f81495..bcb04483d8 100644 --- a/clash-nyanpasu/frontend/nyanpasu/messages/zh-cn.json +++ b/clash-nyanpasu/frontend/nyanpasu/messages/zh-cn.json @@ -9,6 +9,15 @@ "navbar_label_rules": "规则", "navbar_label_settings": "设置", "navbar_label_providers": "资源", + "header_help_action_title": "帮助", + "header_help_action_wiki": "在线文档", + "header_help_action_issues": "报告问题", + "header_help_action_about": "关于", + "header_settings_action_title": "设置", + "header_settings_action_language": "语言", + "header_settings_action_theme_mode": "主题模式", + "header_file_action_title": "文件", + "header_file_action_import_local_profile": "导入本地配置", "settings_system_proxy_title": "系统设置", "settings_system_proxy_system_proxy_label": "系统代理", "settings_system_proxy_tun_mode_label": "TUN 模式", @@ -16,6 +25,19 @@ "settings_system_proxy_proxy_guard_interval_label": "系统代理守卫间隔", "settings_system_proxy_proxy_bypass_label": "系统代理绕过", "settings_system_proxy_current_system_proxy_label": "当前系统代理", + "settings_system_proxy_service_mode_label": "服务模式", + "settings_system_proxy_service_mode_disabled_tooltip": "要启用服务模式,请确保 Clash Nyanpasu 服务已安装并启动", + "settings_system_proxy_system_service_ctrl_label": "系统服务", + "settings_system_proxy_system_service_ctrl_detail": "服务详情", + "settings_system_proxy_system_service_ctrl_install": "安装", + "settings_system_proxy_system_service_ctrl_uninstall": "卸载", + "settings_system_proxy_system_service_ctrl_failed_install": "安装失败", + "settings_system_proxy_system_service_ctrl_failed_uninstall": "卸载失败", + "settings_system_proxy_system_service_ctrl_prompt": "服务提示", + "settings_system_proxy_system_service_ctrl_manual_prompt": "手动操作服务提示", + "settings_system_proxy_system_service_ctrl_manual_operation_prompt": "无法自动操作服务。请导航到内核所在目录,在 Windows 上以管理员身份打开 PowerShell 或在 macOS/Linux 上打开终端仿真器,然后执行以下命令:", + "settings_system_proxy_system_service_ctrl_start": "启动", + "settings_system_proxy_system_service_ctrl_stop": "停止", "settings_user_interface_title": "用户界面", "settings_user_interface_language_label": "语言", "settings_user_interface_theme_mode_label": "主题模式", @@ -23,6 +45,7 @@ "settings_user_interface_theme_mode_dark": "深色", "settings_user_interface_theme_mode_system": "跟随系统", "settings_user_interface_theme_color_label": "主题颜色", + "settings_user_interface_theme_color_custom": "自定义", "settings_clash_settings_title": "Clash 设置", "settings_clash_settings_allow_lan_label": "允许局域网连接", "settings_clash_settings_ipv6_label": "启用 IPv6", @@ -32,6 +55,20 @@ "settings_clash_settings_random_port_label": "随机端口", "settings_clash_settings_random_port_enabled": "随机端口已启用,重启后生效。", "settings_clash_settings_random_port_disabled": "随机端口已禁用,重启后生效。", + "settings_label_system": "系统设置", + "settings_label_system_description": "代理模式、代理绕过、开机自启、静默启动等设置", + "settings_label_user_interface": "用户界面", + "settings_label_user_interface_description": "语言、主题模式、主题颜色等设置", + "settings_label_clash_settings": "Clash 设置", + "settings_label_clash_settings_description": "Clash 配置、日志级别、混合端口、随机端口等设置", + "settings_label_external_controll": "Web UI 与外部控制", + "settings_label_external_controll_description": "Web UI 地址、端口策略、API 密钥等设置", + "settings_label_nyanpasu": "Nyanpasu 配置", + "settings_label_nyanpasu_description": "Nyanpasu 特性配置", + "settings_label_debug": "调试工具", + "settings_label_debug_description": "调试工具配置", + "settings_label_about": "关于", + "settings_label_about_description": "关于 Clash Nyanpasu", "profile_subscription_title": "订阅信息", "profile_subscription_updated_at": "{updated}更新", "profile_subscription_next_update_at": "下次更新于 {next} 更新", @@ -93,5 +130,7 @@ "common_apply": "应用", "common_reset": "重置", "common_save": "保存", - "common_validate": "验证" + "common_validate": "验证", + "common_close": "关闭", + "common_copy": "复制" } diff --git a/clash-nyanpasu/frontend/nyanpasu/messages/zh-tw.json b/clash-nyanpasu/frontend/nyanpasu/messages/zh-tw.json index 8fa388b915..32ae5a5297 100644 --- a/clash-nyanpasu/frontend/nyanpasu/messages/zh-tw.json +++ b/clash-nyanpasu/frontend/nyanpasu/messages/zh-tw.json @@ -9,6 +9,15 @@ "navbar_label_rules": "規則", "navbar_label_settings": "設置", "navbar_label_providers": "資源", + "header_help_action_title": "幫助", + "header_help_action_wiki": "線上文檔", + "header_help_action_issues": "報告問題", + "header_help_action_about": "關於", + "header_settings_action_title": "設置", + "header_settings_action_language": "語言", + "header_settings_action_theme_mode": "主題模式", + "header_file_action_title": "文件", + "header_file_action_import_local_profile": "導入本地配置", "settings_system_proxy_title": "系統設置", "settings_system_proxy_system_proxy_label": "系統代理", "settings_system_proxy_tun_mode_label": "TUN 模式", @@ -16,6 +25,19 @@ "settings_system_proxy_proxy_guard_interval_label": "系統代理守衛間隔", "settings_system_proxy_proxy_bypass_label": "系統代理繞過", "settings_system_proxy_current_system_proxy_label": "當前系統代理", + "settings_system_proxy_service_mode_label": "服務模式", + "settings_system_proxy_service_mode_disabled_tooltip": "要啟用服務模式,請確保 Clash Nyanpasu 服務已安裝並啟動", + "settings_system_proxy_system_service_ctrl_label": "系統服務", + "settings_system_proxy_system_service_ctrl_detail": "服務詳情", + "settings_system_proxy_system_service_ctrl_install": "安裝", + "settings_system_proxy_system_service_ctrl_uninstall": "卸載", + "settings_system_proxy_system_service_ctrl_failed_install": "安裝失敗", + "settings_system_proxy_system_service_ctrl_failed_uninstall": "卸載失敗", + "settings_system_proxy_system_service_ctrl_prompt": "服務提示", + "settings_system_proxy_system_service_ctrl_manual_prompt": "手動操作服務提示", + "settings_system_proxy_system_service_ctrl_manual_operation_prompt": "無法自動操作服務。請開啟核心所在目錄,在 Windows 上以管理員身分開啟 PowerShell 或在 macOS/Linux 上開啟終端模擬器,然後執行以下指令:", + "settings_system_proxy_system_service_ctrl_start": "啟動", + "settings_system_proxy_system_service_ctrl_stop": "停止", "settings_user_interface_title": "使用者介面", "settings_user_interface_language_label": "語言", "settings_user_interface_theme_mode_label": "主題模式", @@ -23,6 +45,7 @@ "settings_user_interface_theme_mode_dark": "深色", "settings_user_interface_theme_mode_system": "跟隨系統", "settings_user_interface_theme_color_label": "主題顏色", + "settings_user_interface_theme_color_custom": "自定義", "settings_clash_settings_title": "Clash 設置", "settings_clash_settings_allow_lan_label": "允許區域網路連線", "settings_clash_settings_ipv6_label": "啟用 IPv6", @@ -32,11 +55,26 @@ "settings_clash_settings_random_port_label": "隨機端口", "settings_clash_settings_random_port_enabled": "隨機端口已啟用,重啟後生效。", "settings_clash_settings_random_port_disabled": "隨機端口已禁用,重啟後生效。", + "settings_label_system": "系統設置", + "settings_label_system_description": "代理模式、代理繞過、開機自啟、靜默啟動等設定", + "settings_label_user_interface": "使用者介面", + "settings_label_user_interface_description": "語言、主題模式、主題顏色等設定", + "settings_label_clash_settings": "Clash 設置", + "settings_label_clash_settings_description": "Clash 配置、日誌級別、混合端口、隨機端口等設定", + "settings_label_external_controll": "Web UI 與外部控制", + "settings_label_external_controll_description": "Web UI 位址、端口策略、API 密鑰等設定", + "settings_label_nyanpasu": "Nyanpasu 設置", + "settings_label_nyanpasu_description": "Nyanpasu 特性設定", + "settings_label_debug": "調試工具", + "settings_label_debug_description": "調試工具設定", + "settings_label_about": "關於", + "settings_label_about_description": "關於 Clash Nyanpasu", "profile_subscription_title": "訂閱信息", "profile_subscription_updated_at": "{updated}更新", "profile_subscription_next_update_at": "下次更新於 {next} 更新", "profile_subscription_expires_in": "{expires}到期", "profile_subscription_update": "更新", + "profile_base_info_title": "基本資訊", "profile_name_editor_title": "編輯名稱", "profile_name_label": "配置名稱", "profile_update_option_edit": "訂閱選項", @@ -92,5 +130,7 @@ "common_apply": "應用", "common_reset": "重置", "common_save": "保存", - "common_validate": "驗證" + "common_validate": "驗證", + "common_close": "關閉", + "common_copy": "複製" } diff --git a/clash-nyanpasu/frontend/nyanpasu/package.json b/clash-nyanpasu/frontend/nyanpasu/package.json index 7db8664b6e..89a4711133 100644 --- a/clash-nyanpasu/frontend/nyanpasu/package.json +++ b/clash-nyanpasu/frontend/nyanpasu/package.json @@ -47,9 +47,9 @@ "country-code-emoji": "2.3.0", "country-emoji": "1.5.6", "dayjs": "1.11.19", - "framer-motion": "12.31.0", + "framer-motion": "12.33.0", "i18next": "25.7.3", - "jotai": "2.16.1", + "jotai": "2.17.1", "json-schema": "0.4.0", "material-react-table": "3.2.1", "monaco-editor": "0.54.0", @@ -58,7 +58,7 @@ "react-dom": "19.2.4", "react-error-boundary": "6.0.0", "react-fast-marquee": "1.6.5", - "react-hook-form": "7.69.0", + "react-hook-form": "7.71.1", "react-hook-form-mui": "8.2.0", "react-i18next": "15.7.4", "react-markdown": "10.1.0", @@ -73,7 +73,7 @@ "@csstools/normalize.css": "12.1.1", "@emotion/babel-plugin": "11.13.5", "@emotion/react": "11.14.0", - "@iconify/json": "2.2.435", + "@iconify/json": "2.2.436", "@monaco-editor/react": "4.7.0", "@tanstack/react-query": "5.90.20", "@tanstack/react-router": "1.158.1", @@ -87,7 +87,7 @@ "@tauri-apps/plugin-process": "2.3.0", "@tauri-apps/plugin-shell": "2.3.1", "@tauri-apps/plugin-updater": "2.9.0", - "@types/react": "19.2.11", + "@types/react": "19.2.13", "@types/react-dom": "19.2.3", "@types/validator": "13.15.10", "@vitejs/plugin-legacy": "7.2.1", diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/app/app-container.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/app/app-container.tsx index 46885c90bc..79a2f6ac10 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/app/app-container.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/app/app-container.tsx @@ -54,8 +54,8 @@ export const AppContainer = ({ square elevation={0} className={styles.layout} - onPointerDown={(e: any) => { - if (e.target?.dataset?.windrag) { + onPointerDown={(e) => { + if ((e.target as HTMLElement)?.dataset?.windrag) { appWindow.startDragging() } }} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/app/modules/route-list-item.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/app/modules/route-list-item.tsx index 8472559ec8..126734d122 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/app/modules/route-list-item.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/app/modules/route-list-item.tsx @@ -5,7 +5,7 @@ import { SvgIconComponent } from '@mui/icons-material' import { Box, ListItemButton, ListItemIcon, Tooltip } from '@mui/material' import { useSetting } from '@nyanpasu/interface' import { alpha, cn } from '@nyanpasu/ui' -import { useLocation, useMatch, useNavigate } from '@tanstack/react-router' +import { useLocation, useNavigate } from '@tanstack/react-router' export const RouteListItem = ({ name, diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/base/base-notice.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/base/base-notice.tsx index 3b5f52ef8b..cfa0eb1812 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/base/base-notice.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/base/base-notice.tsx @@ -18,6 +18,8 @@ const NoticeInner = (props: InnerProps) => { setVisible(false) onClose() } + + // oxlint-disable-next-line typescript/no-explicit-any const onAutoClose = (_e: any, reason: string) => { if (reason !== 'clickaway') onBtnClose() } diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/dashboard/modules/ipasn-panel.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/dashboard/modules/ipasn-panel.tsx index 8533d5c4d9..83feba44e7 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/dashboard/modules/ipasn-panel.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/dashboard/modules/ipasn-panel.tsx @@ -38,7 +38,7 @@ const MAX_WIDTH = 'calc(100% - 48px - 16px)' export const IPASNPanel = ({ refreshCount }: { refreshCount: number }) => { const { t } = useTranslation() - const { data, mutate, isValidating, isLoading } = useIPSB() + const { data, mutate, isValidating } = useIPSB() const handleRefreshIP = () => { mutate() diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/dashboard/proxy-shortcuts.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/dashboard/proxy-shortcuts.tsx index 4606530545..bfe2f8bbfc 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/dashboard/proxy-shortcuts.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/dashboard/proxy-shortcuts.tsx @@ -75,10 +75,13 @@ export const ProxyShortcuts = () => { try { await systemProxy.upsert(!systemProxy.value) } catch (error) { - message(`Activation System Proxy failed!`, { - title: t('Error'), - kind: 'error', - }) + message( + `Activation System Proxy failed!\n Error: ${formatError(error)}`, + { + title: t('Error'), + kind: 'error', + }, + ) } }) diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/layout/layout-control.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/layout/layout-control.tsx index 2f2d5230e3..cd33eb6d55 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/layout/layout-control.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/layout/layout-control.tsx @@ -78,7 +78,7 @@ export const LayoutControl = ({ className }: { className?: string }) => { { - appWindow.toggleMaximize().then((isMaximized) => { + appWindow.toggleMaximize().then(() => { queryClient.invalidateQueries({ queryKey: ['isMaximized'] }) }) }} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/layout/notice-provider.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/layout/notice-provider.tsx index a2ccd7816f..355d78cfec 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/layout/notice-provider.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/layout/notice-provider.tsx @@ -1,3 +1,4 @@ +// oxlint-disable no-unsafe-optional-chaining import { useEffect, useRef } from 'react' import { useTranslation } from 'react-i18next' import { notification, NotificationType } from '@/utils/notification' diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/layout/use-custom-theme.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/layout/use-custom-theme.tsx index cc2a8e489d..8afd3c7a61 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/layout/use-custom-theme.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/layout/use-custom-theme.tsx @@ -63,7 +63,7 @@ const ThemeInner = ({ children }: PropsWithChildren) => { const setThemeMode = useSetAtom(themeModeAtom) - const { mode, setMode } = useColorScheme() + const { setMode } = useColorScheme() useEffect(() => { if (themeMode === 'system') { diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-dialog.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-dialog.tsx index 3cd8337e49..ad38fd7f29 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-dialog.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-dialog.tsx @@ -23,8 +23,6 @@ import { formatError } from '@/utils' import { message } from '@/utils/notification' import { Divider, InputAdornment } from '@mui/material' import { - LocalProfile, - ProfileBuilder, ProfileQueryResultItem, ProfileTemplate, RemoteProfile, diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-item.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-item.tsx index 19671bc56e..1d3f52202b 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-item.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-item.tsx @@ -254,10 +254,15 @@ export const ProfileItem = memo(function ProfileItem({ className="flex h-6 w-30 items-center" nodes={[ !!item.updated && ( - + ), !!(item as RemoteProfile).extra?.expire && ( diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-monaco-viewer.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-monaco-viewer.tsx index cba0fb3475..449b4c14cf 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-monaco-viewer.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-monaco-viewer.tsx @@ -62,7 +62,7 @@ export const beforeEditorMount = (monaco: Monaco) => { // Register link provider for all supported languages const registerLinkProvider = (language: string) => { monaco.languages.registerLinkProvider(language, { - provideLinks: (model, token) => { + provideLinks: (model) => { const links = [] // More robust URL regex pattern const urlRegex = /\b(?:https?:\/\/|www\.)[^\s<>"']*[^<>\s"',.!?]/gi @@ -131,7 +131,7 @@ export default function ProfileMonacoViewer({ ) const handleEditorDidMount = useCallback( - (editor: editor.IStandaloneCodeEditor, monaco: Monaco) => { + (editor: editor.IStandaloneCodeEditor) => { editorRef.current = editor // Enable URL detection and handling diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/utils.ts b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/utils.ts index 70aed237ac..0a700c9eab 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/utils.ts +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/utils.ts @@ -1,4 +1,3 @@ -import { isEqual } from 'lodash-es' import type { Profile, ProfileBuilder } from '@nyanpasu/interface' /** diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/providers/update-providers.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/providers/update-providers.tsx index b967bc2ad1..17ac06e47b 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/providers/update-providers.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/providers/update-providers.tsx @@ -27,7 +27,7 @@ export const UpdateProviders = () => { setLoading(true) await Promise.all( - Object.entries(rulesProvider.data).map(([name, provider]) => { + Object.values(rulesProvider.data).map((provider) => { return provider.mutate() }), ) diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/proxies/node-list.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/proxies/node-list.tsx index 77b034bdc3..510189e788 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/proxies/node-list.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/proxies/node-list.tsx @@ -164,7 +164,7 @@ export const NodeList = forwardRef(function NodeList( ) return disableMotion ? ( -
+
) : ( diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/modules/service-manual-prompt-dialog.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/modules/service-manual-prompt-dialog.tsx index 2d51080f19..7b04ad985b 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/modules/service-manual-prompt-dialog.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/modules/service-manual-prompt-dialog.tsx @@ -8,7 +8,7 @@ import { serviceManualPromptDialogAtom } from '@/store/service' import { notification } from '@/utils/notification' import { getShikiSingleton } from '@/utils/shiki' import ContentPasteIcon from '@mui/icons-material/ContentPaste' -import { IconButton, Tooltip, useTheme } from '@mui/material' +import { IconButton, Tooltip } from '@mui/material' import { useColorScheme } from '@mui/material/styles' import { getCoreDir, getServiceInstallPrompt } from '@nyanpasu/interface' import { BaseDialog, BaseDialogProps, cn } from '@nyanpasu/ui' diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-clash-field.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-clash-field.tsx index 829101a510..808e7287f1 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-clash-field.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-clash-field.tsx @@ -91,10 +91,8 @@ export const SettingClashField = () => { const mergeFields = useMemo( () => [ - ...[ - ...Object.keys(CLASH_FIELD.default), - ...Object.keys(CLASH_FIELD.handle), - ], + ...Object.keys(CLASH_FIELD.default), + ...Object.keys(CLASH_FIELD.handle), ...(query.data?.valid ?? []), ], [query.data], diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-nyanpasu-auto-reload.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-nyanpasu-auto-reload.tsx index 425523f467..2f2d13b64c 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-nyanpasu-auto-reload.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-nyanpasu-auto-reload.tsx @@ -1,3 +1,4 @@ +// oxlint-disable typescript/no-explicit-any import { useTranslation } from 'react-i18next' import { useSetting } from '@nyanpasu/interface' import { SwitchItem } from '@nyanpasu/ui' diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-system-proxy.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-system-proxy.tsx index 2a5deb3696..bbd8b1d181 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-system-proxy.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-system-proxy.tsx @@ -50,10 +50,13 @@ const SystemProxyButton = () => { try { await systemProxy.upsert(!systemProxy.value) } catch (error) { - message(`Activation System Proxy failed!`, { - title: t('Error'), - kind: 'error', - }) + message( + `Activation System Proxy failed!\n Error: ${formatError(error)}`, + { + title: t('Error'), + kind: 'error', + }, + ) } }) @@ -75,7 +78,7 @@ const ProxyGuardSwitch = () => { try { await proxyGuard.upsert(!proxyGuard.value) } catch (error) { - message(`Activation Proxy Guard failed!`, { + message(`Activation Proxy Guard failed!\n Error: ${formatError(error)}`, { title: t('Error'), kind: 'error', }) diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/ui/dropdown-menu.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/ui/dropdown-menu.tsx index bb3595012e..e74c93187d 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/ui/dropdown-menu.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/ui/dropdown-menu.tsx @@ -1,3 +1,4 @@ +import ArrowRight from '~icons/material-symbols/arrow-right-rounded' import Check from '~icons/material-symbols/check-rounded' import RadioChecked from '~icons/material-symbols/radio-button-checked' import Radio from '~icons/material-symbols/radio-button-unchecked' @@ -7,6 +8,50 @@ import { cn } from '@nyanpasu/ui' import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu' import { useControllableState } from '@radix-ui/react-use-controllable-state' +const MotionContent = ({ + children, + className, + ...props +}: ComponentProps) => { + return ( + + {children} + + ) +} + const DropdownMenuContext = createContext<{ open: boolean } | null>(null) @@ -52,7 +97,92 @@ export const DropdownMenuGroup = DropdownMenuPrimitive.Group export const DropdownMenuPortal = DropdownMenuPrimitive.Portal -export const DropdownMenuSub = DropdownMenuPrimitive.Sub +const DropdownMenuSubContext = createContext<{ + open: boolean +} | null>(null) + +const useDropdownMenuSubContext = () => { + const context = useContext(DropdownMenuSubContext) + + if (context === null) { + throw new Error( + 'DropdownMenuSub compound components cannot be rendered outside the DropdownMenuSub component', + ) + } + + return context +} + +export const DropdownMenuSub = ({ + open: inputOpen, + defaultOpen, + onOpenChange, + children, + ...props +}: ComponentProps) => { + const [open, setOpen] = useControllableState({ + prop: inputOpen, + defaultProp: defaultOpen ?? false, + onChange: onOpenChange, + }) + + return ( + + + {children} + + + ) +} + +export function DropdownMenuSubTrigger({ + children, + className, + ...props +}: ComponentProps) { + return ( + + {children} + + + + ) +} + +export function DropdownMenuSubContent({ + children, + className, + ...props +}: ComponentProps) { + const { open } = useDropdownMenuSubContext() + + return ( + + {open && ( + + + {children} + + + )} + + ) +} const DropdownMenuRadioGroupContext = createContext<{ value: string | null @@ -93,10 +223,6 @@ export const DropdownMenuRadioGroup = ({ ) } -export const DropdownMenuSubTrigger = DropdownMenuPrimitive.SubTrigger - -export const DropdownMenuSubContent = DropdownMenuPrimitive.SubContent - export const DropdownMenuContent = ({ children, className, @@ -109,39 +235,7 @@ export const DropdownMenuContent = ({ {open && ( - - {children} - + {children} )} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/ui/file-drop-zone.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/ui/file-drop-zone.tsx index c3bb07a944..5e963f51c7 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/ui/file-drop-zone.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/ui/file-drop-zone.tsx @@ -4,7 +4,6 @@ import { ComponentProps, createContext, DragEvent, - ReactNode, RefObject, useContext, useEffect, @@ -103,7 +102,6 @@ export interface FileDropZoneProps onFileRead?: (content: string) => void accept: string[] disabled?: boolean - fileSelected?: (fileName: string) => ReactNode } export function FileDropZone({ @@ -114,7 +112,6 @@ export function FileDropZone({ className, disabled = false, variant, - fileSelected, children, ...props }: FileDropZoneProps) { diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/ui/input.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/ui/input.tsx index 9410e89807..f83e2efa6c 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/ui/input.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/ui/input.tsx @@ -10,7 +10,6 @@ import { useState, } from 'react' import { cn } from '@nyanpasu/ui' -import { Slot } from '@radix-ui/react-slot' export const inputContainerVariants = cva( [ @@ -402,6 +401,7 @@ export const InputLabel = ({ variant, focus: haveValue, }), + className, )} {...props} /> @@ -420,7 +420,6 @@ export type NumericInputProps = Omit< label?: string min?: number max?: number - step?: number decimalScale?: number allowNegative?: boolean } & InputContainerVariants @@ -434,7 +433,6 @@ export const NumericInput = ({ defaultValue, min, max, - step = 1, decimalScale, allowNegative = true, ...props diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/ui/sidebar.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/ui/sidebar.tsx index 9ba42ef851..0e74710851 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/ui/sidebar.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/ui/sidebar.tsx @@ -1,9 +1,4 @@ -import { - ComponentProps, - createContext, - PropsWithChildren, - useContext, -} from 'react' +import { ComponentProps, createContext, useContext } from 'react' import useIsMobile from '@/hooks/use-is-moblie' import { cn } from '@nyanpasu/ui' import { AppContentScrollArea } from './scroll-area' diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/ui/text-marquee.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/ui/text-marquee.tsx new file mode 100644 index 0000000000..aa782c7b2f --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/ui/text-marquee.tsx @@ -0,0 +1,212 @@ +import { motion, useAnimationControls } from 'framer-motion' +import { useCallback, useEffect, useRef, useState } from 'react' +import { sleep } from '@/utils' +import { cn } from '@nyanpasu/ui' + +export default function TextMarquee({ + children, + className, + speed = 30, + gap = 32, + pauseDuration = 1, + // pauseOnHover = true, +}: { + children: React.ReactNode + className?: string + speed?: number + gap?: number + pauseDuration?: number + // pauseOnHover?: boolean +}) { + const containerRef = useRef(null) + + const textRef = useRef(null) + + const [shouldAnimate, setShouldAnimate] = useState(false) + + const [textWidth, setTextWidth] = useState(0) + + const controls = useAnimationControls() + + const isHoveredRef = useRef(false) + + // Check if text overflows container + const checkOverflow = useCallback(() => { + if (!containerRef.current || !textRef.current) { + return + } + + const container = containerRef.current + const text = textRef.current + + const containerW = container.offsetWidth + const textW = text.scrollWidth + + setTextWidth(textW) + setShouldAnimate(textW > containerW) + }, []) + + // Observe container size changes + useEffect(() => { + checkOverflow() + + const resizeObserver = new ResizeObserver(() => { + checkOverflow() + }) + + if (containerRef.current) { + resizeObserver.observe(containerRef.current) + } + + return () => { + resizeObserver.disconnect() + } + }, [checkOverflow, children]) + + // Animate when shouldAnimate changes + useEffect(() => { + if (!shouldAnimate) { + controls.set({ x: 0 }) + return + } + + const totalDistance = textWidth + gap + const animDuration = totalDistance / speed + + const cancelledRef = { current: false } + + const runAnimationLoop = async () => { + // Wait at start position + await sleep(pauseDuration * 1000) + + if (cancelledRef.current) { + return + } + + // Check if hovered, wait and retry + if (isHoveredRef.current) { + await sleep(100) + + if (!cancelledRef.current) { + runAnimationLoop() + } + + return + } + + // Animate to end + await controls.start({ + x: -totalDistance, + transition: { + duration: animDuration, + ease: 'linear', + }, + }) + + if (cancelledRef.current) { + return + } + + // Reset to start position instantly and loop + controls.set({ x: 0 }) + + if (!cancelledRef.current) { + runAnimationLoop() + } + } + + runAnimationLoop() + + return () => { + cancelledRef.current = true + controls.stop() + } + }, [shouldAnimate, textWidth, gap, speed, pauseDuration, controls]) + + // const handleMouseEnter = () => { + // if (!pauseOnHover) { + // return + // } + + // isHoveredRef.current = true + // controls.stop() + // } + + // const handleMouseLeave = () => { + // if (!pauseOnHover || !shouldAnimate) { + // return + // } + + // isHoveredRef.current = false + + // resumeAnimation() + // } + + // const resumeAnimation = () => { + // const totalDistance = textWidth + gap + + // // Resume animation + // const marqueeContent = containerRef.current?.querySelector( + // '[data-marquee-content]', + // ) + + // if (marqueeContent) { + // const transform = window.getComputedStyle(marqueeContent).transform + // const matrix = new DOMMatrix(transform) + // const currentPosition = matrix.m41 + + // const remainingDistance = -totalDistance - currentPosition + // const remainingDuration = Math.abs(remainingDistance) / speed + + // controls.start({ + // x: -totalDistance, + // transition: { + // duration: remainingDuration, + // ease: 'linear', + // }, + // }) + // } + // } + + return ( +
+ {shouldAnimate ? ( + + + {children} + + + + {children} + + + ) : ( +
+ {children} +
+ )} +
+ ) +} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/hooks/use-consts.ts b/clash-nyanpasu/frontend/nyanpasu/src/hooks/use-consts.ts index 99bdb58415..06dca670f9 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/hooks/use-consts.ts +++ b/clash-nyanpasu/frontend/nyanpasu/src/hooks/use-consts.ts @@ -3,7 +3,7 @@ import { isAppImage } from '@nyanpasu/interface' export const useIsAppImage = (config?: Partial) => { return useSWR('/api/is_appimage', isAppImage, { - ...(config || {}), + ...config, revalidateOnFocus: false, revalidateOnReconnect: false, refreshInterval: 0, diff --git a/clash-nyanpasu/frontend/nyanpasu/src/hooks/use-current-core-icon.ts b/clash-nyanpasu/frontend/nyanpasu/src/hooks/use-current-core-icon.ts new file mode 100644 index 0000000000..b2741e303d --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/hooks/use-current-core-icon.ts @@ -0,0 +1,22 @@ +import ClashRs from '@/assets/image/core/clash-rs.png' +import ClashMeta from '@/assets/image/core/clash.meta.png' +import Clash from '@/assets/image/core/clash.png' +import { useSetting } from '@nyanpasu/interface' + +export default function useCurrentCoreIcon() { + const { value: currentCore } = useSetting('clash_core') + + switch (currentCore) { + case 'clash': + return Clash + case 'clash-rs': + case 'clash-rs-alpha': + return ClashRs + case 'mihomo': + case 'mihomo-alpha': + return ClashMeta + // sync from backend + default: + return ClashMeta + } +} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(editor)/editor/_modules/utils.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(editor)/editor/_modules/utils.tsx index aa78add89c..02e396ddc6 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(editor)/editor/_modules/utils.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(editor)/editor/_modules/utils.tsx @@ -57,7 +57,7 @@ export const beforeEditorMount = (monaco: Monaco) => { // Register link provider for all supported languages const registerLinkProvider = (language: string) => { monaco.languages.registerLinkProvider(language, { - provideLinks: (model, token) => { + provideLinks: (model) => { const links = [] // More robust URL regex pattern const urlRegex = /\b(?:https?:\/\/|www\.)[^\s<>"']*[^<>\s"',.!?]/gi diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(editor)/editor/index.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(editor)/editor/index.tsx index c01ad5c894..6114e5a085 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(editor)/editor/index.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(editor)/editor/index.tsx @@ -7,7 +7,7 @@ import { useExperimentalThemeContext } from '@/components/providers/theme-provid import { Button } from '@/components/ui/button' import { useLockFn } from '@/hooks/use-lock-fn' import { m } from '@/paraglide/messages' -import MonacoEditor, { Monaco } from '@monaco-editor/react' +import MonacoEditor from '@monaco-editor/react' import { openThat, useProfileContent } from '@nyanpasu/interface' import { cn } from '@nyanpasu/ui' import { createFileRoute } from '@tanstack/react-router' @@ -112,7 +112,7 @@ function RouteComponent() { }) const handleEditorDidMount = useCallback( - (editor: editor.IStandaloneCodeEditor, monaco: Monaco) => { + (editor: editor.IStandaloneCodeEditor) => { editorRef.current = editor // Enable URL detection and handling diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(legacy)/connections.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(legacy)/connections.tsx index a22cdcbda4..d7040228f6 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(legacy)/connections.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(legacy)/connections.tsx @@ -33,7 +33,7 @@ function Connections() { const [mountTable, setMountTable] = useState(true) const deferredMountTable = useDeferredValue(mountTable) const { proceed } = useBlocker({ - shouldBlockFn: (args) => { + shouldBlockFn: () => { setMountTable(false) return !mountTable }, diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(legacy)/settings.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(legacy)/settings.tsx index 8de7f2859e..e502f255db 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(legacy)/settings.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(legacy)/settings.tsx @@ -7,7 +7,7 @@ import TrayIconDialog from '@/components/setting/modules/tray-icon-dialog' import { formatEnvInfos } from '@/utils' import { Feedback, GitHub, Keyboard } from '@mui/icons-material' import { IconButton } from '@mui/material' -import { collectEnvs, openThat } from '@nyanpasu/interface' +import { commands, openThat } from '@nyanpasu/interface' import { BasePage } from '@nyanpasu/ui' import { createFileRoute } from '@tanstack/react-router' @@ -38,9 +38,14 @@ function SettingPage() { const FeedbackIcon = () => { const toFeedback = useLockFn(async () => { - const envs = await collectEnvs() + const envs = await commands.collectEnvs() + + if (envs.status !== 'ok') { + return + } + const formattedEnv = encodeURIComponent( - formatEnvInfos(envs) + formatEnvInfos(envs.data) .split('\n') .map((v) => `> ${v}`) .join('\n'), diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/_modules/header-file-action.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/_modules/header-file-action.tsx new file mode 100644 index 0000000000..43d8b546f6 --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/_modules/header-file-action.tsx @@ -0,0 +1,35 @@ +import { PropsWithChildren } from 'react' +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu' +import { m } from '@/paraglide/messages' +import { Link } from '@tanstack/react-router' +import { ProfileType } from '../main/profiles/_modules/consts' +import { Action } from '../main/profiles/$type/index' + +export default function HeaderFileAction({ children }: PropsWithChildren) { + return ( + + {children} + + + + + {m.header_file_action_import_local_profile()} + + + + + ) +} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/_modules/header-help-action.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/_modules/header-help-action.tsx new file mode 100644 index 0000000000..f6f710a125 --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/_modules/header-help-action.tsx @@ -0,0 +1,80 @@ +import { PropsWithChildren } from 'react' +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu' +import { useLockFn } from '@/hooks/use-lock-fn' +import { m } from '@/paraglide/messages' +import { formatEnvInfos } from '@/utils' +import { commands } from '@nyanpasu/interface' +import { Link } from '@tanstack/react-router' + +const WikiItem = () => { + const handleClick = useLockFn(async () => { + await commands.openThat('https://nyanpasu.elaina.moe') + }) + + return ( + + {m.header_help_action_wiki()} + + ) +} + +const IssuesItem = () => { + const handleClick = useLockFn(async () => { + const envs = await commands.collectEnvs() + + if (envs.status !== 'ok') { + return + } + + const formattedEnv = encodeURIComponent( + formatEnvInfos(envs.data) + .split('\n') + .map((v) => `> ${v}`) + .join('\n'), + ) + + const params = new URLSearchParams({ + assignees: '', + labels: 'T%3A+Bug%2CS%3A+Untriaged', + projects: '', + template: 'bug_report.yaml', + }) + + return commands.openThat( + 'https://github.com/libnyanpasu/clash-nyanpasu/issues/new?' + + params.toString() + + // envs can't be serialized + '&env_infos=' + + formattedEnv, + ) + }) + + return ( + + {m.header_help_action_issues()} + + ) +} + +export default function HeaderHelpAction({ children }: PropsWithChildren) { + return ( + + {children} + + + + + + + + {m.header_help_action_about()} + + + + ) +} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/_modules/header-menu.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/_modules/header-menu.tsx index cb6a7d56f2..e8a2cc379d 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/_modules/header-menu.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/_modules/header-menu.tsx @@ -1,12 +1,17 @@ import { ComponentProps } from 'react' import { Button, ButtonProps } from '@/components/ui/button' +import { m } from '@/paraglide/messages' import { cn } from '@nyanpasu/ui' +import HeaderFileAction from './header-file-action' +import HeaderHelpAction from './header-help-action' +import HeaderSettingsAction from './header-settings-action' const MenuButton = ({ className, ...props }: ButtonProps) => { return (
) } diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/_modules/header-settings-action.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/_modules/header-settings-action.tsx new file mode 100644 index 0000000000..ca1cb30047 --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/_modules/header-settings-action.tsx @@ -0,0 +1,96 @@ +import { PropsWithChildren } from 'react' +import { useLanguage } from '@/components/providers/language-provider' +import { + ThemeMode, + useExperimentalThemeContext, +} from '@/components/providers/theme-provider' +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu' +import { m } from '@/paraglide/messages' +import { Locale, locales } from '@/paraglide/runtime' + +const LanguageSelector = () => { + const { language, setLanguage } = useLanguage() + + const handleLanguageChange = (value: string) => { + setLanguage(value as Locale) + } + + return ( + + + {m.header_settings_action_language()} + + + + + {Object.entries(locales).map(([key, value]) => ( + + {m.language(key, { locale: value })} + + ))} + + + + ) +} + +const ThemeModeSelector = () => { + const { themeMode, setThemeMode } = useExperimentalThemeContext() + + const handleThemeModeChange = (value: string) => { + setThemeMode(value as ThemeMode) + } + + const messages = { + [ThemeMode.LIGHT]: m.settings_user_interface_theme_mode_light(), + [ThemeMode.DARK]: m.settings_user_interface_theme_mode_dark(), + [ThemeMode.SYSTEM]: m.settings_user_interface_theme_mode_system(), + } satisfies Record + + return ( + + + {m.header_settings_action_theme_mode()} + + + + + {Object.entries(messages).map(([key, value]) => ( + + {value} + + ))} + + + + ) +} + +export default function HeaderSettingsAction({ children }: PropsWithChildren) { + return ( + + {children} + + + + + + + + ) +} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/_modules/navbar.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/_modules/navbar.tsx index d65a061fda..7eb5594d35 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/_modules/navbar.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/_modules/navbar.tsx @@ -103,6 +103,7 @@ const ProxiesGroupButton = () => { return ( } label={m.navbar_label_proxies()} @@ -111,8 +112,6 @@ const ProxiesGroupButton = () => { } export default function Navbar({ className, ...props }: ComponentProps<'div'>) { - const isMobile = useIsMobile() - return (
) { /> } label={m.navbar_label_settings()} /> diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/profiles/$type/_modules/import-button.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/profiles/$type/_modules/import-button.tsx index c8eb29316b..c476b23238 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/profiles/$type/_modules/import-button.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/profiles/$type/_modules/import-button.tsx @@ -13,7 +13,7 @@ import { import { m } from '@/paraglide/messages' import { cn } from '@nyanpasu/ui' import { ProfileType } from '../../_modules/consts' -import { Route as IndexRoute } from '../index' +import { Action, Route as IndexRoute } from '../index' import ChainProfileImport from './chain-profile-import' import LocalProfileButton from './local-profile-button' import RemoteProfileButton from './remote-profile-button' @@ -52,8 +52,17 @@ const SelectButton = ({ const ProxyProfileImport = () => { const { isScrolling } = useScrollArea() + const { action } = IndexRoute.useSearch() + const [open, setOpen] = useState(false) + useEffect(() => { + // for animation duration to open the modal + if (action === Action.ImportLocalProfile) { + setOpen(true) + } + }, [action]) + const handleToggle = () => { setOpen(!open) } diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/profiles/$type/_modules/local-profile-button.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/profiles/$type/_modules/local-profile-button.tsx index 154a77d1e2..a0f65aff4a 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/profiles/$type/_modules/local-profile-button.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/profiles/$type/_modules/local-profile-button.tsx @@ -2,7 +2,7 @@ import UploadFileRounded from '~icons/material-symbols/upload-file-rounded' import dayjs from 'dayjs' import { filesize } from 'filesize' import { AnimatePresence } from 'framer-motion' -import { PropsWithChildren, useState } from 'react' +import { PropsWithChildren, useEffect, useState } from 'react' import { Controller, useForm } from 'react-hook-form' import z from 'zod' import { useBlockTask } from '@/components/providers/block-task-provider' @@ -29,7 +29,9 @@ import { formatError } from '@/utils' import { message } from '@/utils/notification' import { zodResolver } from '@hookform/resolvers/zod' import { LocalProfileBuilder, useProfile } from '@nyanpasu/interface' +import { useLocation } from '@tanstack/react-router' import AnimatedErrorItem from '../../_modules/error-item' +import { Action, Route as IndexRoute } from '../index' const formSchema = z.object({ uid: z.string().nullable(), @@ -56,10 +58,35 @@ const getDefaultValues = () => { } export default function LocalProfileButton({ children }: PropsWithChildren) { + const { action } = IndexRoute.useSearch() + + const navigate = IndexRoute.useNavigate() + + const { pathname } = useLocation() + const { create } = useProfile() const [open, setOpen] = useState(false) + useEffect(() => { + if (action === Action.ImportLocalProfile) { + // if the current path is the index page, open the modal immediately + if (pathname === '/main/profiles/$type') { + setOpen(true) + return + } + + // else, wait animation duration to open the modal + const timeout = setTimeout(() => { + setOpen(true) + }, 150) + + return () => { + clearTimeout(timeout) + } + } + }, [action]) + const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: getDefaultValues(), @@ -97,6 +124,12 @@ export default function LocalProfileButton({ children }: PropsWithChildren) { setOpen(value) + navigate({ + search: { + action: null, + }, + }) + if (value) { form.reset(getDefaultValues()) } diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/profiles/$type/index.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/profiles/$type/index.tsx index 6f6cc68cd2..5a27f8ffbf 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/profiles/$type/index.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/profiles/$type/index.tsx @@ -1,10 +1,18 @@ +import z from 'zod' import { createFileRoute } from '@tanstack/react-router' import ImportButton from './_modules/import-button' import ProfilesHeader from './_modules/profiles-header' import ProfilesList from './_modules/profiles-list' +export enum Action { + ImportLocalProfile, +} + export const Route = createFileRoute('/(main)/main/profiles/$type/')({ component: RouteComponent, + validateSearch: z.object({ + action: z.enum(Action).optional().nullable(), + }), }) function RouteComponent() { diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/_modules/settings-navigate.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/_modules/settings-navigate.tsx index 7327956cbb..d22ea28cc9 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/_modules/settings-navigate.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/_modules/settings-navigate.tsx @@ -1,142 +1,206 @@ -import ComputerOutlineRounded from '~icons/material-symbols/computer-outline-rounded' import DisplayExternalInput from '~icons/material-symbols/display-external-input-rounded' import FrameBugOutlineRounded from '~icons/material-symbols/frame-bug-outline-rounded' -import ListsRounded from '~icons/material-symbols/lists-rounded' -import NetworkNode from '~icons/material-symbols/network-node' import SettingsBoltRounded from '~icons/material-symbols/settings-b-roll-rounded' import SettingsEthernet from '~icons/material-symbols/settings-ethernet-rounded' -import ShareWindows from '~icons/material-symbols/share-windows-rounded' +import SettingsRounded from '~icons/material-symbols/settings-rounded' import ViewQuilt from '~icons/material-symbols/view-quilt-rounded' -import ClashMeta from '@/assets/image/core/clash.meta.png' +import { ComponentProps, ReactNode } from 'react' import LogoSvg from '@/assets/image/logo.svg?react' import { Button } from '@/components/ui/button' +import TextMarquee from '@/components/ui/text-marquee' +import useCurrentCoreIcon from '@/hooks/use-current-core-icon' +import { m } from '@/paraglide/messages' import { cn } from '@nyanpasu/ui' import { Link, useLocation } from '@tanstack/react-router' -const StyleClashMeta = () => { - return ( - Clash Meta - ) -} - -const StyleLogo = () => { +const NyanpasuLogo = () => { return ( ) } -const ROUTES = [ - { - label: 'System Proxy', - description: 'Configure the system proxy', - href: '/main/settings/system-proxy', - icon: SettingsEthernet, - }, - { - label: 'User Interface', - description: 'Configure the user interface', - href: '/main/settings/user-interface', - icon: ViewQuilt, - }, - { - label: 'Clash Settings', - description: 'Configure the clash settings', - href: '/main/settings/clash-settings', - icon: SettingsBoltRounded, - }, - { - label: 'Clash External Controll', - description: 'Configure the clash external controll', - href: '/main/settings/clash-external-controll', - icon: DisplayExternalInput, - }, - { - label: 'Web UI', - description: 'Configure the web ui', - href: '/main/settings/web-ui', - icon: ShareWindows, - }, - { - label: 'Clash Core', - description: 'Configure the clash core', - href: '/main/settings/clash-core', - icon: StyleClashMeta, - }, - { - label: 'Clash Filed', - description: 'Configure the clash filed', - href: '/main/settings/clash-filed', - icon: ListsRounded, - }, - { - label: 'System Behavior', - description: 'Configure the system behavior', - href: '/main/settings/system-behavior', - icon: ComputerOutlineRounded, - }, - { - label: 'System Service', - description: 'Configure the system service', - href: '/main/settings/system-service', - icon: NetworkNode, - }, - { - label: 'Nyanpasu Config', - description: 'Configure the nyanpasu config', - href: '/main/settings/nyanpasu-config', - icon: StyleLogo, - }, - { - label: 'Debug Utils', - description: 'Configure the debug utils', - href: '/main/settings/debug-utils', - icon: FrameBugOutlineRounded, - }, - { - label: 'About', - description: 'About the nyanpasu', - href: '/main/settings/about', - icon: StyleLogo, - }, -] as const - -export default function SettingsNavigate() { - const location = useLocation() +const CurrentCoreIcon = ({ + className, + ...props +}: Omit, 'src'>) => { + const currentCoreIconUrl = useCurrentCoreIcon() return ( -
- {ROUTES.map((route) => ( - - ))} +const NavigateButton = ({ + icon, + label, + description, + className, + ...props +}: ComponentProps & { + icon: ReactNode + label: string + description: string +}) => { + const location = useLocation() + + const isActive = location.pathname === props.to + + return ( + + ) +} + +const SystemButton = () => { + return ( + } + label={m.settings_label_system()} + description={m.settings_label_system_description()} + to="/main/settings/system" + /> + ) +} + +const UserInterfaceButton = () => { + return ( + } + label={m.settings_label_user_interface()} + description={m.settings_label_user_interface_description()} + to="/main/settings/user-interface" + /> + ) +} + +const ClashButton = () => { + return ( + } + label={m.settings_label_clash_settings()} + description={m.settings_label_clash_settings_description()} + to="/main/settings/clash" + /> + ) +} + +const ExternalControllButton = () => { + return ( + + + +
+ +
+
+ } + label={m.settings_label_external_controll()} + description={m.settings_label_external_controll_description()} + to="/main/settings/web-ui" + /> + ) +} + +const NyanpasuButton = () => { + return ( + + + +
+ +
+
+ } + label={m.settings_label_nyanpasu()} + description={m.settings_label_nyanpasu_description()} + to="/main/settings/nyanpasu" + /> + ) +} + +const DebugButton = () => { + return ( + } + label={m.settings_label_debug()} + description={m.settings_label_debug_description()} + to="/main/settings/debug" + /> + ) +} + +const AboutButton = () => { + return ( + } + label={m.settings_label_about()} + description={m.settings_label_about_description()} + to="/main/settings/about" + /> + ) +} + +export default function SettingsNavigate() { + return ( +
+ + + + + + + + + + + + +
) } diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-core/route.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-core/route.tsx deleted file mode 100644 index 4d464cf177..0000000000 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-core/route.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { createFileRoute } from '@tanstack/react-router' - -export const Route = createFileRoute('/(main)/main/settings/clash-core')({ - component: RouteComponent, -}) - -function RouteComponent() { - return
Hello "/(main)/main/settings/clash-core"!
-} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-external-controll/route.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-external-controll/route.tsx deleted file mode 100644 index 3d3f74673d..0000000000 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-external-controll/route.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { createFileRoute } from '@tanstack/react-router' - -export const Route = createFileRoute( - '/(main)/main/settings/clash-external-controll', -)({ - component: RouteComponent, -}) - -function RouteComponent() { - return
Hello "/(main)/main/settings/clash-external-controll"!
-} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-filed/route.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-filed/route.tsx deleted file mode 100644 index c137aabb3e..0000000000 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-filed/route.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { createFileRoute } from '@tanstack/react-router' - -export const Route = createFileRoute('/(main)/main/settings/clash-filed')({ - component: RouteComponent, -}) - -function RouteComponent() { - return
Hello "/(main)/main/settings/clash-filed"!
-} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-settings/_modules/allow-lan-switch.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/allow-lan-switch.tsx similarity index 91% rename from clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-settings/_modules/allow-lan-switch.tsx rename to clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/allow-lan-switch.tsx index fbaff318b3..b3005ebeec 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-settings/_modules/allow-lan-switch.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/allow-lan-switch.tsx @@ -2,6 +2,7 @@ import { useMemo } from 'react' import { Switch } from '@/components/ui/switch' import { useLockFn } from '@/hooks/use-lock-fn' import { m } from '@/paraglide/messages' +import { formatError } from '@/utils' import { message } from '@/utils/notification' import { useClashConfig } from '@nyanpasu/interface' import { SettingsCard, SettingsCardContent } from '../../_modules/settings-card' @@ -17,7 +18,7 @@ export default function AllowLanSwitch() { 'allow-lan': input, }) } catch (error) { - message(`Activation Allow LAN failed!`, { + message(`Activation Allow LAN failed!\n Error: ${formatError(error)}`, { title: 'Error', kind: 'error', }) diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-settings/_modules/ipv6-switch.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/ipv6-switch.tsx similarity index 91% rename from clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-settings/_modules/ipv6-switch.tsx rename to clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/ipv6-switch.tsx index 40bae59583..629f89a04a 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-settings/_modules/ipv6-switch.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/ipv6-switch.tsx @@ -2,6 +2,7 @@ import { useMemo } from 'react' import { Switch } from '@/components/ui/switch' import { useLockFn } from '@/hooks/use-lock-fn' import { m } from '@/paraglide/messages' +import { formatError } from '@/utils' import { message } from '@/utils/notification' import { useClashConfig } from '@nyanpasu/interface' import { SettingsCard, SettingsCardContent } from '../../_modules/settings-card' @@ -17,7 +18,7 @@ export default function IPv6Switch() { ipv6: input, }) } catch (error) { - message(`Activation IPv6 failed!`, { + message(`Activation IPv6 failed!\n Error: ${formatError(error)}`, { title: 'Error', kind: 'error', }) diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-settings/_modules/log-level-selector.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/log-level-selector.tsx similarity index 100% rename from clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-settings/_modules/log-level-selector.tsx rename to clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/log-level-selector.tsx diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-settings/_modules/mixed-port-config.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/mixed-port-config.tsx similarity index 100% rename from clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-settings/_modules/mixed-port-config.tsx rename to clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/mixed-port-config.tsx diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-settings/_modules/random-port-switch.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/random-port-switch.tsx similarity index 100% rename from clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-settings/_modules/random-port-switch.tsx rename to clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/random-port-switch.tsx diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-settings/_modules/tun-stack-selector.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/tun-stack-selector.tsx similarity index 100% rename from clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-settings/_modules/tun-stack-selector.tsx rename to clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/tun-stack-selector.tsx diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-settings/route.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash/route.tsx similarity index 98% rename from clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-settings/route.tsx rename to clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash/route.tsx index 33afc2ef7a..0a6847ac6b 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash-settings/route.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/clash/route.tsx @@ -12,7 +12,7 @@ import MixedPortConfig from './_modules/mixed-port-config' import RandomPortSwitch from './_modules/random-port-switch' import TunStackSelector from './_modules/tun-stack-selector' -export const Route = createFileRoute('/(main)/main/settings/clash-settings')({ +export const Route = createFileRoute('/(main)/main/settings/clash')({ component: RouteComponent, }) diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/debug-utils/_modules/window-debug.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/debug/_modules/window-debug.tsx similarity index 100% rename from clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/debug-utils/_modules/window-debug.tsx rename to clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/debug/_modules/window-debug.tsx diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/debug-utils/route.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/debug/route.tsx similarity index 96% rename from clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/debug-utils/route.tsx rename to clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/debug/route.tsx index 6edf6a29de..345d176743 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/debug-utils/route.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/debug/route.tsx @@ -1,7 +1,7 @@ import { createFileRoute } from '@tanstack/react-router' import WindowDebug from './_modules/window-debug' -export const Route = createFileRoute('/(main)/main/settings/debug-utils')({ +export const Route = createFileRoute('/(main)/main/settings/debug')({ component: RouteComponent, }) diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/nyanpasu-config/route.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/nyanpasu/route.tsx similarity index 94% rename from clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/nyanpasu-config/route.tsx rename to clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/nyanpasu/route.tsx index bbc46d4cd3..27c7916432 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/nyanpasu-config/route.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/nyanpasu/route.tsx @@ -1,6 +1,6 @@ import { createFileRoute } from '@tanstack/react-router' -export const Route = createFileRoute('/(main)/main/settings/nyanpasu-config')({ +export const Route = createFileRoute('/(main)/main/settings/nyanpasu')({ component: RouteComponent, }) diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/route.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/route.tsx index 13dc5260fc..11134409dd 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/route.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/route.tsx @@ -13,7 +13,7 @@ function RouteComponent() { return ( diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system-behavior/route.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system-behavior/route.tsx deleted file mode 100644 index 9a58cf482a..0000000000 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system-behavior/route.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { createFileRoute } from '@tanstack/react-router' - -export const Route = createFileRoute('/(main)/main/settings/system-behavior')({ - component: RouteComponent, -}) - -function RouteComponent() { - return
Hello "/(main)/main/settings/system-behavior"!
-} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system-service/route.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system-service/route.tsx deleted file mode 100644 index c36b35fa04..0000000000 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system-service/route.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { createFileRoute } from '@tanstack/react-router' - -export const Route = createFileRoute('/(main)/main/settings/system-service')({ - component: RouteComponent, -}) - -function RouteComponent() { - return
Hello "/(main)/main/settings/system-service"!
-} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system-proxy/_modules/current-system-proxy.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/current-system-proxy.tsx similarity index 100% rename from clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system-proxy/_modules/current-system-proxy.tsx rename to clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/current-system-proxy.tsx diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system-proxy/_modules/proxy-bypass-config.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/proxy-bypass-config.tsx similarity index 96% rename from clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system-proxy/_modules/proxy-bypass-config.tsx rename to clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/proxy-bypass-config.tsx index aa015c4b82..196e23ff6b 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system-proxy/_modules/proxy-bypass-config.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/proxy-bypass-config.tsx @@ -40,10 +40,10 @@ export default function ProxyBypassConfig() { const handleSubmit = form.handleSubmit(async (data) => { try { - await systemProxyBypass.upsert(data.systemProxyBypass ?? DEFAULT_BYPASS) + await systemProxyBypass.upsert(data.systemProxyBypass || DEFAULT_BYPASS) form.reset({ - systemProxyBypass: data.systemProxyBypass ?? DEFAULT_BYPASS, + systemProxyBypass: data.systemProxyBypass || DEFAULT_BYPASS, }) } catch (error) { message(formatError(error), { diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system-proxy/_modules/proxy-guard-config.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/proxy-guard-config.tsx similarity index 100% rename from clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system-proxy/_modules/proxy-guard-config.tsx rename to clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/proxy-guard-config.tsx diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system-proxy/_modules/proxy-guard-switch.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/proxy-guard-switch.tsx similarity index 90% rename from clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system-proxy/_modules/proxy-guard-switch.tsx rename to clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/proxy-guard-switch.tsx index a2498829b9..b2437c04e8 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system-proxy/_modules/proxy-guard-switch.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/proxy-guard-switch.tsx @@ -1,6 +1,7 @@ import { Switch } from '@/components/ui/switch' import { useLockFn } from '@/hooks/use-lock-fn' import { m } from '@/paraglide/messages' +import { formatError } from '@/utils' import { message } from '@/utils/notification' import { useSetting } from '@nyanpasu/interface' import { SettingsCard, SettingsCardContent } from '../../_modules/settings-card' @@ -12,7 +13,7 @@ export default function ProxyGuardSwitch() { try { await proxyGuard.upsert(!proxyGuard.value) } catch (error) { - message(`Activation Proxy Guard failed!`, { + message(`Activation Proxy Guard failed!\n Error: ${formatError(error)}`, { title: 'Error', kind: 'error', }) diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/system-service-ctrl.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/system-service-ctrl.tsx new file mode 100644 index 0000000000..cb805d6388 --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/system-service-ctrl.tsx @@ -0,0 +1,306 @@ +import { startCase } from 'lodash-es' +import { useEffect, useMemo, useState } from 'react' +import { Button } from '@/components/ui/button' +import { Card, CardContent, CardFooter, CardHeader } from '@/components/ui/card' +import { + Modal, + ModalClose, + ModalContent, + ModalTitle, + ModalTrigger, +} from '@/components/ui/modal' +import { OS } from '@/consts' +import { useLockFn } from '@/hooks/use-lock-fn' +import { m } from '@/paraglide/messages' +import { formatError } from '@/utils' +import { message } from '@/utils/notification' +import { getShikiSingleton } from '@/utils/shiki' +import { + commands, + useCoreDir, + useServicePrompt, + useSystemService, +} from '@nyanpasu/interface' +import { cn } from '@nyanpasu/ui' +import { writeText } from '@tauri-apps/plugin-clipboard-manager' +import { SettingsCard, SettingsCardContent } from '../../_modules/settings-card' + +const SystemServiceCtrlItem = ({ + name, + value, +}: { + name: string + value?: string +}) => { + return ( +
+
+ {name}: +
+ +
+ {value ?? '-'} +
+
+ ) +} + +const ServiceDetailButton = () => { + const { query } = useSystemService() + + return ( + + + + + + + + + + {m.settings_system_proxy_system_service_ctrl_detail()} + + + + +
+              {JSON.stringify(query.data, null, 2)}
+            
+
+ + + {m.common_close()} + +
+
+
+ ) +} + +const ServiceInstallButton = () => { + const { upsert } = useSystemService() + + const handleInstallClick = useLockFn(async () => { + try { + await upsert.mutateAsync('install') + await commands.restartSidecar() + } catch (e) { + const errorMessage = `${m.settings_system_proxy_system_service_ctrl_failed_install()}: ${formatError(e)}` + + message(errorMessage, { + kind: 'error', + }) + // // If the installation fails, prompt the user to manually install the service + // promptDialog.show( + // query.data?.status === 'not_installed' ? 'install' : 'uninstall', + // ) + } + }) + + return ( + + ) +} + +const ServiceUninstallButton = () => { + const { upsert } = useSystemService() + + const handleUninstallClick = useLockFn(async () => { + await upsert.mutateAsync('uninstall') + }) + + return ( + + ) +} +// { +// operation: 'uninstall' | 'install' | 'start' | 'stop' | null +// } +const ServicePromptButton = () => { + const { + query: { data: systemService }, + } = useSystemService() + + const { data: serviceInstallPrompt } = useServicePrompt() + + const { data: coreDir } = useCoreDir() + + const [codes, setCodes] = useState(null) + + const userOperationCommands = useMemo(() => { + if (systemService?.status === 'not_installed' && serviceInstallPrompt) { + return `cd "${coreDir}"\n${serviceInstallPrompt}` + } else if (systemService?.status) { + const operation = systemService?.status === 'running' ? 'stop' : 'start' + + return `cd "${coreDir}"\n${OS !== 'windows' ? 'sudo ' : ''}./nyanpasu-service ${operation}` + } + return '' + }, [systemService?.status, serviceInstallPrompt, coreDir]) + + useEffect(() => { + const handleGenerateCodes = async () => { + const shiki = await getShikiSingleton() + const code = shiki.codeToHtml(userOperationCommands, { + lang: 'shell', + themes: { + dark: 'nord', + light: 'min-light', + }, + }) + + setCodes(code) + } + + handleGenerateCodes() + }, [userOperationCommands]) + + const handleCopyToClipboard = useLockFn(async () => { + if (!userOperationCommands) { + return + } + + await writeText(userOperationCommands) + }) + + return ( + + + + + + + + + + {m.settings_system_proxy_system_service_ctrl_manual_prompt()} + + + + +

+ {m.settings_system_proxy_system_service_ctrl_manual_operation_prompt()} +

+ + {codes && ( +
pre]:overflow-auto [&>pre]:p-2', + '[&>pre]:bg-surface-variant! dark:[&>pre]:bg-black!', + )} + dangerouslySetInnerHTML={{ + __html: codes, + }} + /> + )} + + + + + + {m.common_close()} + + + + + ) +} + +const ServiceControlButtons = () => { + const { query, upsert } = useSystemService() + + const handleToggleClick = useLockFn(async () => { + await upsert.mutateAsync( + query.data?.status === 'running' ? 'stop' : 'start', + ) + }) + + return ( + + ) +} + +export default function SystemServiceCtrl() { + const { query } = useSystemService() + + const isInstalled = query.data?.status !== 'not_installed' + + return ( + + + + + {m.settings_system_proxy_system_service_ctrl_label()} + + + + + + + + + + + + {isInstalled ? ( + <> + + + + + ) : ( + + )} + + + +
+ + + + + + + ) +} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/system-service-switch.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/system-service-switch.tsx new file mode 100644 index 0000000000..f8e4839672 --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/system-service-switch.tsx @@ -0,0 +1,66 @@ +import { Switch } from '@/components/ui/switch' +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from '@/components/ui/tooltip' +import { useLockFn } from '@/hooks/use-lock-fn' +import { m } from '@/paraglide/messages' +import { formatError } from '@/utils' +import { message } from '@/utils/notification' +import { useSetting, useSystemService } from '@nyanpasu/interface' +import { SettingsCard, SettingsCardContent } from '../../_modules/settings-card' + +export default function SystemServiceSwitch() { + const serviceMode = useSetting('enable_service_mode') + + const { query } = useSystemService() + + const disabled = query.data?.status === 'not_installed' + + const handleServiceMode = useLockFn(async () => { + try { + await serviceMode.upsert(!serviceMode.value) + } catch (error) { + message( + `Activation Service Mode failed!\n Error: ${formatError(error)}`, + { + title: 'Error', + kind: 'error', + }, + ) + } + }) + + return ( + + +
{m.settings_system_proxy_service_mode_label()}
+ + + +
+ +
+
+ + {disabled && ( + + + {m.settings_system_proxy_service_mode_disabled_tooltip()} + + + )} +
+
+
+ ) +} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system-proxy/route.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system/route.tsx similarity index 76% rename from clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system-proxy/route.tsx rename to clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system/route.tsx index 3cd0e6d222..f14397d671 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system-proxy/route.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/system/route.tsx @@ -2,6 +2,7 @@ import { SystemProxyButton, TunModeButton, } from '@/components/settings/system-proxy' +import { Separator } from '@/components/ui/separator' import { m } from '@/paraglide/messages' import { createFileRoute } from '@tanstack/react-router' import { SettingsCard, SettingsCardContent } from '../_modules/settings-card' @@ -13,8 +14,10 @@ import CurrentSystemProxy from './_modules/current-system-proxy' import ProxyBypassConfig from './_modules/proxy-bypass-config' import ProxyGuardConfig from './_modules/proxy-guard-config' import ProxyGuardSwitch from './_modules/proxy-guard-switch' +import SystemServiceCtrl from './_modules/system-service-ctrl' +import SystemServiceSwitch from './_modules/system-service-switch' -export const Route = createFileRoute('/(main)/main/settings/system-proxy')({ +export const Route = createFileRoute('/(main)/main/settings/system')({ component: RouteComponent, }) @@ -22,7 +25,7 @@ function RouteComponent() { return ( <> - {m.settings_system_proxy_title()} + {m.settings_label_system()} @@ -41,6 +44,12 @@ function RouteComponent() { + + + + + + ) } diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/user-interface/_modules/language-selector.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/user-interface/_modules/language-selector.tsx index 85b5d1b89e..5ffae7165f 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/user-interface/_modules/language-selector.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/user-interface/_modules/language-selector.tsx @@ -1,12 +1,11 @@ import { useLanguage } from '@/components/providers/language-provider' -import { Button } from '@/components/ui/button' import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuRadioGroup, - DropdownMenuRadioItem, - DropdownMenuTrigger, -} from '@/components/ui/dropdown-menu' + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select' import { m } from '@/paraglide/messages' import { Locale, locales } from '@/paraglide/runtime' import { SettingsCard, SettingsCardContent } from '../../_modules/settings-card' @@ -21,29 +20,30 @@ export default function LanguageSelector() { return ( -
{m.settings_user_interface_language_label()}
- - - - - - - - + + - {locales.map((value) => ( - - {m.language(value, { locale: value })} - - ))} - - - + {language ? m.language(language, { locale: language }) : null} + + + + + {Object.entries(locales).map(([key, value]) => ( + + {m.language(key, { locale: value })} + + ))} + +
) diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/user-interface/_modules/switch-legacy.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/user-interface/_modules/switch-legacy.tsx index 5109e13465..1667c9e475 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/user-interface/_modules/switch-legacy.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/user-interface/_modules/switch-legacy.tsx @@ -26,43 +26,47 @@ export default function SwitchLegacy() { return ( -
Switch to Legacy UI
+ + Switch to Legacy UI - - - - + + + + + - - - - - Are you sure you want to switch to Legacy UI? - - + + + + + Are you sure you want to switch to Legacy UI? + + - -

- Switching to Legacy UI will revert the UI to the original - design. -

-
+ +

+ Switching to Legacy UI will revert the UI to the original + design. +

+
- - + + - - - - -
-
-
+ + + +
+
+ + + +
) diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/user-interface/_modules/theme-color-config.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/user-interface/_modules/theme-color-config.tsx index 552b1eb47a..008dfa754f 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/user-interface/_modules/theme-color-config.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/user-interface/_modules/theme-color-config.tsx @@ -1,7 +1,11 @@ import Check from '~icons/material-symbols/check-rounded' import { useCallback, useState } from 'react' -import { useExperimentalThemeContext } from '@/components/providers/theme-provider' +import { + DEFAULT_COLOR, + useExperimentalThemeContext, +} from '@/components/providers/theme-provider' import { Button } from '@/components/ui/button' +import { Card, CardContent, CardFooter, CardHeader } from '@/components/ui/card' import { DropdownMenu, DropdownMenuContent, @@ -11,6 +15,15 @@ import { m } from '@/paraglide/messages' import { Wheel } from '@uiw/react-color' import { SettingsCard, SettingsCardContent } from '../../_modules/settings-card' +const PERSETS = [ + DEFAULT_COLOR, + '#9e1e67', + '#3d009e', + '#00089e', + '#066b9e', + '#9e5a00', +] as const + export default function ThemeColorConfig() { const { themeColor, setThemeColor } = useExperimentalThemeContext() @@ -26,42 +39,74 @@ export default function ThemeColorConfig() { return ( -
{m.settings_user_interface_theme_color_label()}
+ + + {m.settings_user_interface_theme_color_label()} + - - - - + {color.toLocaleUpperCase()} + + ))} +
+ - - { - setCachedThemeColor(color.hex) - }} - /> + + + + - - + + {PERSETS.includes(themeColor as (typeof PERSETS)[number]) + ? m.settings_user_interface_theme_color_custom() + : themeColor.toLocaleUpperCase()} + + + + + + { + setCachedThemeColor(color.hex) + }} + /> + + + + +
+
) diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/user-interface/_modules/theme-mode-selector.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/user-interface/_modules/theme-mode-selector.tsx index 60df50da67..19b5d73259 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/user-interface/_modules/theme-mode-selector.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/settings/user-interface/_modules/theme-mode-selector.tsx @@ -2,14 +2,13 @@ import { ThemeMode, useExperimentalThemeContext, } from '@/components/providers/theme-provider' -import { Button } from '@/components/ui/button' import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuRadioGroup, - DropdownMenuRadioItem, - DropdownMenuTrigger, -} from '@/components/ui/dropdown-menu' + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select' import { m } from '@/paraglide/messages' import { SettingsCard, SettingsCardContent } from '../../_modules/settings-card' @@ -29,29 +28,30 @@ export default function ThemeModeSelector() { return ( -
{m.settings_user_interface_theme_mode_label()}
- - - - - - - - + + - {Object.values(ThemeMode).map((value) => ( - - {value} - - ))} - - - + {themeMode ? messages[themeMode] : null} + + + + + {Object.entries(messages).map(([key, value]) => ( + + {value} + + ))} + +
) diff --git a/clash-nyanpasu/frontend/nyanpasu/src/route-tree.gen.ts b/clash-nyanpasu/frontend/nyanpasu/src/route-tree.gen.ts index 89ee879ff0..742e9b348b 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/route-tree.gen.ts +++ b/clash-nyanpasu/frontend/nyanpasu/src/route-tree.gen.ts @@ -37,15 +37,10 @@ import { Route as mainMainProxiesIndexRouteImport } from './pages/(main)/main/pr import { Route as mainMainProfilesIndexRouteImport } from './pages/(main)/main/profiles/index' import { Route as mainMainSettingsWebUiRouteRouteImport } from './pages/(main)/main/settings/web-ui/route' import { Route as mainMainSettingsUserInterfaceRouteRouteImport } from './pages/(main)/main/settings/user-interface/route' -import { Route as mainMainSettingsSystemServiceRouteRouteImport } from './pages/(main)/main/settings/system-service/route' -import { Route as mainMainSettingsSystemProxyRouteRouteImport } from './pages/(main)/main/settings/system-proxy/route' -import { Route as mainMainSettingsSystemBehaviorRouteRouteImport } from './pages/(main)/main/settings/system-behavior/route' -import { Route as mainMainSettingsNyanpasuConfigRouteRouteImport } from './pages/(main)/main/settings/nyanpasu-config/route' -import { Route as mainMainSettingsDebugUtilsRouteRouteImport } from './pages/(main)/main/settings/debug-utils/route' -import { Route as mainMainSettingsClashSettingsRouteRouteImport } from './pages/(main)/main/settings/clash-settings/route' -import { Route as mainMainSettingsClashFiledRouteRouteImport } from './pages/(main)/main/settings/clash-filed/route' -import { Route as mainMainSettingsClashExternalControllRouteRouteImport } from './pages/(main)/main/settings/clash-external-controll/route' -import { Route as mainMainSettingsClashCoreRouteRouteImport } from './pages/(main)/main/settings/clash-core/route' +import { Route as mainMainSettingsSystemRouteRouteImport } from './pages/(main)/main/settings/system/route' +import { Route as mainMainSettingsNyanpasuRouteRouteImport } from './pages/(main)/main/settings/nyanpasu/route' +import { Route as mainMainSettingsDebugRouteRouteImport } from './pages/(main)/main/settings/debug/route' +import { Route as mainMainSettingsClashRouteRouteImport } from './pages/(main)/main/settings/clash/route' import { Route as mainMainSettingsAboutRouteRouteImport } from './pages/(main)/main/settings/about/route' import { Route as mainMainProfilesInspectRouteRouteImport } from './pages/(main)/main/profiles/inspect/route' import { Route as mainMainProfilesTypeIndexRouteImport } from './pages/(main)/main/profiles/$type/index' @@ -193,58 +188,28 @@ const mainMainSettingsUserInterfaceRouteRoute = path: '/user-interface', getParentRoute: () => mainMainSettingsRouteRoute, } as any) -const mainMainSettingsSystemServiceRouteRoute = - mainMainSettingsSystemServiceRouteRouteImport.update({ - id: '/system-service', - path: '/system-service', +const mainMainSettingsSystemRouteRoute = + mainMainSettingsSystemRouteRouteImport.update({ + id: '/system', + path: '/system', getParentRoute: () => mainMainSettingsRouteRoute, } as any) -const mainMainSettingsSystemProxyRouteRoute = - mainMainSettingsSystemProxyRouteRouteImport.update({ - id: '/system-proxy', - path: '/system-proxy', +const mainMainSettingsNyanpasuRouteRoute = + mainMainSettingsNyanpasuRouteRouteImport.update({ + id: '/nyanpasu', + path: '/nyanpasu', getParentRoute: () => mainMainSettingsRouteRoute, } as any) -const mainMainSettingsSystemBehaviorRouteRoute = - mainMainSettingsSystemBehaviorRouteRouteImport.update({ - id: '/system-behavior', - path: '/system-behavior', +const mainMainSettingsDebugRouteRoute = + mainMainSettingsDebugRouteRouteImport.update({ + id: '/debug', + path: '/debug', getParentRoute: () => mainMainSettingsRouteRoute, } as any) -const mainMainSettingsNyanpasuConfigRouteRoute = - mainMainSettingsNyanpasuConfigRouteRouteImport.update({ - id: '/nyanpasu-config', - path: '/nyanpasu-config', - getParentRoute: () => mainMainSettingsRouteRoute, - } as any) -const mainMainSettingsDebugUtilsRouteRoute = - mainMainSettingsDebugUtilsRouteRouteImport.update({ - id: '/debug-utils', - path: '/debug-utils', - getParentRoute: () => mainMainSettingsRouteRoute, - } as any) -const mainMainSettingsClashSettingsRouteRoute = - mainMainSettingsClashSettingsRouteRouteImport.update({ - id: '/clash-settings', - path: '/clash-settings', - getParentRoute: () => mainMainSettingsRouteRoute, - } as any) -const mainMainSettingsClashFiledRouteRoute = - mainMainSettingsClashFiledRouteRouteImport.update({ - id: '/clash-filed', - path: '/clash-filed', - getParentRoute: () => mainMainSettingsRouteRoute, - } as any) -const mainMainSettingsClashExternalControllRouteRoute = - mainMainSettingsClashExternalControllRouteRouteImport.update({ - id: '/clash-external-controll', - path: '/clash-external-controll', - getParentRoute: () => mainMainSettingsRouteRoute, - } as any) -const mainMainSettingsClashCoreRouteRoute = - mainMainSettingsClashCoreRouteRouteImport.update({ - id: '/clash-core', - path: '/clash-core', +const mainMainSettingsClashRouteRoute = + mainMainSettingsClashRouteRouteImport.update({ + id: '/clash', + path: '/clash', getParentRoute: () => mainMainSettingsRouteRoute, } as any) const mainMainSettingsAboutRouteRoute = @@ -301,15 +266,10 @@ export interface FileRoutesByFullPath { '/main/': typeof mainMainIndexRoute '/main/profiles/inspect': typeof mainMainProfilesInspectRouteRoute '/main/settings/about': typeof mainMainSettingsAboutRouteRoute - '/main/settings/clash-core': typeof mainMainSettingsClashCoreRouteRoute - '/main/settings/clash-external-controll': typeof mainMainSettingsClashExternalControllRouteRoute - '/main/settings/clash-filed': typeof mainMainSettingsClashFiledRouteRoute - '/main/settings/clash-settings': typeof mainMainSettingsClashSettingsRouteRoute - '/main/settings/debug-utils': typeof mainMainSettingsDebugUtilsRouteRoute - '/main/settings/nyanpasu-config': typeof mainMainSettingsNyanpasuConfigRouteRoute - '/main/settings/system-behavior': typeof mainMainSettingsSystemBehaviorRouteRoute - '/main/settings/system-proxy': typeof mainMainSettingsSystemProxyRouteRoute - '/main/settings/system-service': typeof mainMainSettingsSystemServiceRouteRoute + '/main/settings/clash': typeof mainMainSettingsClashRouteRoute + '/main/settings/debug': typeof mainMainSettingsDebugRouteRoute + '/main/settings/nyanpasu': typeof mainMainSettingsNyanpasuRouteRoute + '/main/settings/system': typeof mainMainSettingsSystemRouteRoute '/main/settings/user-interface': typeof mainMainSettingsUserInterfaceRouteRoute '/main/settings/web-ui': typeof mainMainSettingsWebUiRouteRoute '/main/profiles/': typeof mainMainProfilesIndexRoute @@ -338,15 +298,10 @@ export interface FileRoutesByTo { '/main': typeof mainMainIndexRoute '/main/profiles/inspect': typeof mainMainProfilesInspectRouteRoute '/main/settings/about': typeof mainMainSettingsAboutRouteRoute - '/main/settings/clash-core': typeof mainMainSettingsClashCoreRouteRoute - '/main/settings/clash-external-controll': typeof mainMainSettingsClashExternalControllRouteRoute - '/main/settings/clash-filed': typeof mainMainSettingsClashFiledRouteRoute - '/main/settings/clash-settings': typeof mainMainSettingsClashSettingsRouteRoute - '/main/settings/debug-utils': typeof mainMainSettingsDebugUtilsRouteRoute - '/main/settings/nyanpasu-config': typeof mainMainSettingsNyanpasuConfigRouteRoute - '/main/settings/system-behavior': typeof mainMainSettingsSystemBehaviorRouteRoute - '/main/settings/system-proxy': typeof mainMainSettingsSystemProxyRouteRoute - '/main/settings/system-service': typeof mainMainSettingsSystemServiceRouteRoute + '/main/settings/clash': typeof mainMainSettingsClashRouteRoute + '/main/settings/debug': typeof mainMainSettingsDebugRouteRoute + '/main/settings/nyanpasu': typeof mainMainSettingsNyanpasuRouteRoute + '/main/settings/system': typeof mainMainSettingsSystemRouteRoute '/main/settings/user-interface': typeof mainMainSettingsUserInterfaceRouteRoute '/main/settings/web-ui': typeof mainMainSettingsWebUiRouteRoute '/main/profiles': typeof mainMainProfilesIndexRoute @@ -383,15 +338,10 @@ export interface FileRoutesById { '/(main)/main/': typeof mainMainIndexRoute '/(main)/main/profiles/inspect': typeof mainMainProfilesInspectRouteRoute '/(main)/main/settings/about': typeof mainMainSettingsAboutRouteRoute - '/(main)/main/settings/clash-core': typeof mainMainSettingsClashCoreRouteRoute - '/(main)/main/settings/clash-external-controll': typeof mainMainSettingsClashExternalControllRouteRoute - '/(main)/main/settings/clash-filed': typeof mainMainSettingsClashFiledRouteRoute - '/(main)/main/settings/clash-settings': typeof mainMainSettingsClashSettingsRouteRoute - '/(main)/main/settings/debug-utils': typeof mainMainSettingsDebugUtilsRouteRoute - '/(main)/main/settings/nyanpasu-config': typeof mainMainSettingsNyanpasuConfigRouteRoute - '/(main)/main/settings/system-behavior': typeof mainMainSettingsSystemBehaviorRouteRoute - '/(main)/main/settings/system-proxy': typeof mainMainSettingsSystemProxyRouteRoute - '/(main)/main/settings/system-service': typeof mainMainSettingsSystemServiceRouteRoute + '/(main)/main/settings/clash': typeof mainMainSettingsClashRouteRoute + '/(main)/main/settings/debug': typeof mainMainSettingsDebugRouteRoute + '/(main)/main/settings/nyanpasu': typeof mainMainSettingsNyanpasuRouteRoute + '/(main)/main/settings/system': typeof mainMainSettingsSystemRouteRoute '/(main)/main/settings/user-interface': typeof mainMainSettingsUserInterfaceRouteRoute '/(main)/main/settings/web-ui': typeof mainMainSettingsWebUiRouteRoute '/(main)/main/profiles/': typeof mainMainProfilesIndexRoute @@ -427,15 +377,10 @@ export interface FileRouteTypes { | '/main/' | '/main/profiles/inspect' | '/main/settings/about' - | '/main/settings/clash-core' - | '/main/settings/clash-external-controll' - | '/main/settings/clash-filed' - | '/main/settings/clash-settings' - | '/main/settings/debug-utils' - | '/main/settings/nyanpasu-config' - | '/main/settings/system-behavior' - | '/main/settings/system-proxy' - | '/main/settings/system-service' + | '/main/settings/clash' + | '/main/settings/debug' + | '/main/settings/nyanpasu' + | '/main/settings/system' | '/main/settings/user-interface' | '/main/settings/web-ui' | '/main/profiles/' @@ -464,15 +409,10 @@ export interface FileRouteTypes { | '/main' | '/main/profiles/inspect' | '/main/settings/about' - | '/main/settings/clash-core' - | '/main/settings/clash-external-controll' - | '/main/settings/clash-filed' - | '/main/settings/clash-settings' - | '/main/settings/debug-utils' - | '/main/settings/nyanpasu-config' - | '/main/settings/system-behavior' - | '/main/settings/system-proxy' - | '/main/settings/system-service' + | '/main/settings/clash' + | '/main/settings/debug' + | '/main/settings/nyanpasu' + | '/main/settings/system' | '/main/settings/user-interface' | '/main/settings/web-ui' | '/main/profiles' @@ -508,15 +448,10 @@ export interface FileRouteTypes { | '/(main)/main/' | '/(main)/main/profiles/inspect' | '/(main)/main/settings/about' - | '/(main)/main/settings/clash-core' - | '/(main)/main/settings/clash-external-controll' - | '/(main)/main/settings/clash-filed' - | '/(main)/main/settings/clash-settings' - | '/(main)/main/settings/debug-utils' - | '/(main)/main/settings/nyanpasu-config' - | '/(main)/main/settings/system-behavior' - | '/(main)/main/settings/system-proxy' - | '/(main)/main/settings/system-service' + | '/(main)/main/settings/clash' + | '/(main)/main/settings/debug' + | '/(main)/main/settings/nyanpasu' + | '/(main)/main/settings/system' | '/(main)/main/settings/user-interface' | '/(main)/main/settings/web-ui' | '/(main)/main/profiles/' @@ -732,67 +667,32 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof mainMainSettingsUserInterfaceRouteRouteImport parentRoute: typeof mainMainSettingsRouteRoute } - '/(main)/main/settings/system-service': { - id: '/(main)/main/settings/system-service' - path: '/system-service' - fullPath: '/main/settings/system-service' - preLoaderRoute: typeof mainMainSettingsSystemServiceRouteRouteImport + '/(main)/main/settings/system': { + id: '/(main)/main/settings/system' + path: '/system' + fullPath: '/main/settings/system' + preLoaderRoute: typeof mainMainSettingsSystemRouteRouteImport parentRoute: typeof mainMainSettingsRouteRoute } - '/(main)/main/settings/system-proxy': { - id: '/(main)/main/settings/system-proxy' - path: '/system-proxy' - fullPath: '/main/settings/system-proxy' - preLoaderRoute: typeof mainMainSettingsSystemProxyRouteRouteImport + '/(main)/main/settings/nyanpasu': { + id: '/(main)/main/settings/nyanpasu' + path: '/nyanpasu' + fullPath: '/main/settings/nyanpasu' + preLoaderRoute: typeof mainMainSettingsNyanpasuRouteRouteImport parentRoute: typeof mainMainSettingsRouteRoute } - '/(main)/main/settings/system-behavior': { - id: '/(main)/main/settings/system-behavior' - path: '/system-behavior' - fullPath: '/main/settings/system-behavior' - preLoaderRoute: typeof mainMainSettingsSystemBehaviorRouteRouteImport + '/(main)/main/settings/debug': { + id: '/(main)/main/settings/debug' + path: '/debug' + fullPath: '/main/settings/debug' + preLoaderRoute: typeof mainMainSettingsDebugRouteRouteImport parentRoute: typeof mainMainSettingsRouteRoute } - '/(main)/main/settings/nyanpasu-config': { - id: '/(main)/main/settings/nyanpasu-config' - path: '/nyanpasu-config' - fullPath: '/main/settings/nyanpasu-config' - preLoaderRoute: typeof mainMainSettingsNyanpasuConfigRouteRouteImport - parentRoute: typeof mainMainSettingsRouteRoute - } - '/(main)/main/settings/debug-utils': { - id: '/(main)/main/settings/debug-utils' - path: '/debug-utils' - fullPath: '/main/settings/debug-utils' - preLoaderRoute: typeof mainMainSettingsDebugUtilsRouteRouteImport - parentRoute: typeof mainMainSettingsRouteRoute - } - '/(main)/main/settings/clash-settings': { - id: '/(main)/main/settings/clash-settings' - path: '/clash-settings' - fullPath: '/main/settings/clash-settings' - preLoaderRoute: typeof mainMainSettingsClashSettingsRouteRouteImport - parentRoute: typeof mainMainSettingsRouteRoute - } - '/(main)/main/settings/clash-filed': { - id: '/(main)/main/settings/clash-filed' - path: '/clash-filed' - fullPath: '/main/settings/clash-filed' - preLoaderRoute: typeof mainMainSettingsClashFiledRouteRouteImport - parentRoute: typeof mainMainSettingsRouteRoute - } - '/(main)/main/settings/clash-external-controll': { - id: '/(main)/main/settings/clash-external-controll' - path: '/clash-external-controll' - fullPath: '/main/settings/clash-external-controll' - preLoaderRoute: typeof mainMainSettingsClashExternalControllRouteRouteImport - parentRoute: typeof mainMainSettingsRouteRoute - } - '/(main)/main/settings/clash-core': { - id: '/(main)/main/settings/clash-core' - path: '/clash-core' - fullPath: '/main/settings/clash-core' - preLoaderRoute: typeof mainMainSettingsClashCoreRouteRouteImport + '/(main)/main/settings/clash': { + id: '/(main)/main/settings/clash' + path: '/clash' + fullPath: '/main/settings/clash' + preLoaderRoute: typeof mainMainSettingsClashRouteRouteImport parentRoute: typeof mainMainSettingsRouteRoute } '/(main)/main/settings/about': { @@ -906,15 +806,10 @@ const mainMainRulesRouteRouteWithChildren = interface mainMainSettingsRouteRouteChildren { mainMainSettingsAboutRouteRoute: typeof mainMainSettingsAboutRouteRoute - mainMainSettingsClashCoreRouteRoute: typeof mainMainSettingsClashCoreRouteRoute - mainMainSettingsClashExternalControllRouteRoute: typeof mainMainSettingsClashExternalControllRouteRoute - mainMainSettingsClashFiledRouteRoute: typeof mainMainSettingsClashFiledRouteRoute - mainMainSettingsClashSettingsRouteRoute: typeof mainMainSettingsClashSettingsRouteRoute - mainMainSettingsDebugUtilsRouteRoute: typeof mainMainSettingsDebugUtilsRouteRoute - mainMainSettingsNyanpasuConfigRouteRoute: typeof mainMainSettingsNyanpasuConfigRouteRoute - mainMainSettingsSystemBehaviorRouteRoute: typeof mainMainSettingsSystemBehaviorRouteRoute - mainMainSettingsSystemProxyRouteRoute: typeof mainMainSettingsSystemProxyRouteRoute - mainMainSettingsSystemServiceRouteRoute: typeof mainMainSettingsSystemServiceRouteRoute + mainMainSettingsClashRouteRoute: typeof mainMainSettingsClashRouteRoute + mainMainSettingsDebugRouteRoute: typeof mainMainSettingsDebugRouteRoute + mainMainSettingsNyanpasuRouteRoute: typeof mainMainSettingsNyanpasuRouteRoute + mainMainSettingsSystemRouteRoute: typeof mainMainSettingsSystemRouteRoute mainMainSettingsUserInterfaceRouteRoute: typeof mainMainSettingsUserInterfaceRouteRoute mainMainSettingsWebUiRouteRoute: typeof mainMainSettingsWebUiRouteRoute mainMainSettingsIndexRoute: typeof mainMainSettingsIndexRoute @@ -922,20 +817,10 @@ interface mainMainSettingsRouteRouteChildren { const mainMainSettingsRouteRouteChildren: mainMainSettingsRouteRouteChildren = { mainMainSettingsAboutRouteRoute: mainMainSettingsAboutRouteRoute, - mainMainSettingsClashCoreRouteRoute: mainMainSettingsClashCoreRouteRoute, - mainMainSettingsClashExternalControllRouteRoute: - mainMainSettingsClashExternalControllRouteRoute, - mainMainSettingsClashFiledRouteRoute: mainMainSettingsClashFiledRouteRoute, - mainMainSettingsClashSettingsRouteRoute: - mainMainSettingsClashSettingsRouteRoute, - mainMainSettingsDebugUtilsRouteRoute: mainMainSettingsDebugUtilsRouteRoute, - mainMainSettingsNyanpasuConfigRouteRoute: - mainMainSettingsNyanpasuConfigRouteRoute, - mainMainSettingsSystemBehaviorRouteRoute: - mainMainSettingsSystemBehaviorRouteRoute, - mainMainSettingsSystemProxyRouteRoute: mainMainSettingsSystemProxyRouteRoute, - mainMainSettingsSystemServiceRouteRoute: - mainMainSettingsSystemServiceRouteRoute, + mainMainSettingsClashRouteRoute: mainMainSettingsClashRouteRoute, + mainMainSettingsDebugRouteRoute: mainMainSettingsDebugRouteRoute, + mainMainSettingsNyanpasuRouteRoute: mainMainSettingsNyanpasuRouteRoute, + mainMainSettingsSystemRouteRoute: mainMainSettingsSystemRouteRoute, mainMainSettingsUserInterfaceRouteRoute: mainMainSettingsUserInterfaceRouteRoute, mainMainSettingsWebUiRouteRoute: mainMainSettingsWebUiRouteRoute, diff --git a/clash-nyanpasu/frontend/nyanpasu/src/utils/ignore-case.ts b/clash-nyanpasu/frontend/nyanpasu/src/utils/ignore-case.ts index 72dee4408f..c0ee541a8b 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/utils/ignore-case.ts +++ b/clash-nyanpasu/frontend/nyanpasu/src/utils/ignore-case.ts @@ -1,3 +1,4 @@ +// oxlint-disable typescript/no-explicit-any // Deep copy and change all keys to lowercase type TData = Record diff --git a/clash-nyanpasu/frontend/nyanpasu/src/utils/index.ts b/clash-nyanpasu/frontend/nyanpasu/src/utils/index.ts index 312a8ca938..e4e3eb0a3d 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/utils/index.ts +++ b/clash-nyanpasu/frontend/nyanpasu/src/utils/index.ts @@ -1,12 +1,12 @@ +// oxlint-disable typescript/no-explicit-any import { includes, isArray, isObject, isString, some } from 'lodash-es' -import { EnvInfos } from '@nyanpasu/interface' +import { EnvInfo } from '@nyanpasu/interface' /** * classNames filter out falsy values and join the rest with a space * @param classes - array of classes * @returns string of classes */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any export function classNames(...classes: any[]) { return classes.filter(Boolean).join(' ') } @@ -33,7 +33,7 @@ export function formatError(err: unknown): string { return `Error: ${err instanceof Error ? err.message : String(err)}` } -export function formatEnvInfos(envs: EnvInfos) { +export function formatEnvInfos(envs: EnvInfo) { let result = '----------- System -----------\n' result += `OS: ${envs.os}\n` result += `Arch: ${envs.arch}\n` @@ -50,9 +50,11 @@ export function formatEnvInfos(envs: EnvInfos) { for (const k of Object.keys(envs.build_info) as string[]) { const key = k .split('_') - .map((v) => v.charAt(0).toUpperCase() + v.slice(1)) + .map((v: string) => v.charAt(0).toUpperCase() + v.slice(1)) .join(' ') - result += `${key}: ${envs.build_info[k]}\n` + // Fix linter error: explicitly type k as keyof typeof envs.build_info + result += `${key}: ${envs.build_info[k as keyof typeof envs.build_info]}\n` } + return result } diff --git a/clash-nyanpasu/frontend/nyanpasu/vite.config.ts b/clash-nyanpasu/frontend/nyanpasu/vite.config.ts index f1d42eee21..d5fd9d3e35 100644 --- a/clash-nyanpasu/frontend/nyanpasu/vite.config.ts +++ b/clash-nyanpasu/frontend/nyanpasu/vite.config.ts @@ -156,5 +156,6 @@ export default defineConfig(({ command, mode }) => { html: {}, } satisfies UserConfig // fucking vite why embedded their own sass types definition???? + // oxlint-disable-next-line typescript/no-explicit-any return config as any as UserConfig }) diff --git a/clash-nyanpasu/frontend/ui/package.json b/clash-nyanpasu/frontend/ui/package.json index c38c04af80..78d887e2d5 100644 --- a/clash-nyanpasu/frontend/ui/package.json +++ b/clash-nyanpasu/frontend/ui/package.json @@ -19,11 +19,11 @@ "@radix-ui/react-scroll-area": "1.2.10", "@tauri-apps/api": "2.8.0", "@types/d3": "7.4.3", - "@types/react": "19.2.11", + "@types/react": "19.2.13", "@vitejs/plugin-react": "5.1.3", "ahooks": "3.9.6", "d3": "7.9.0", - "framer-motion": "12.31.0", + "framer-motion": "12.33.0", "react": "19.2.4", "react-dom": "19.2.4", "react-error-boundary": "6.0.0", diff --git a/clash-nyanpasu/frontend/ui/src/chart/sparkline.tsx b/clash-nyanpasu/frontend/ui/src/chart/sparkline.tsx index f81171030d..83b1fc984a 100644 --- a/clash-nyanpasu/frontend/ui/src/chart/sparkline.tsx +++ b/clash-nyanpasu/frontend/ui/src/chart/sparkline.tsx @@ -1,3 +1,4 @@ +// oxlint-disable typescript/no-explicit-any import * as d3 from 'd3' import { interpolatePath } from 'd3-interpolate-path' import { CSSProperties, FC, useEffect, useMemo, useRef } from 'react' diff --git a/clash-nyanpasu/frontend/ui/src/hooks/use-breakpoint.ts b/clash-nyanpasu/frontend/ui/src/hooks/use-breakpoint.ts index 9483082e0d..aac12390c7 100644 --- a/clash-nyanpasu/frontend/ui/src/hooks/use-breakpoint.ts +++ b/clash-nyanpasu/frontend/ui/src/hooks/use-breakpoint.ts @@ -118,7 +118,7 @@ export const useContainerBreakpointValue = ( ): T => { const currentBreakpoint = useContainerBreakpoint(containerRef) - const calculateValue = (): T => { + const memoizedValue = useMemo(() => { const value = values[currentBreakpoint] if (value !== undefined) { @@ -136,12 +136,7 @@ export const useContainerBreakpointValue = ( } return defaultValue ?? (values[breakpointsOrder[0]] as T) - } - - const memoizedValue = useMemo( - () => calculateValue(), - [currentBreakpoint, values, defaultValue], - ) + }, [currentBreakpoint, values, defaultValue]) return memoizedValue } diff --git a/clash-nyanpasu/manifest/version.json b/clash-nyanpasu/manifest/version.json index 6e7de23413..d6cbfe2d48 100644 --- a/clash-nyanpasu/manifest/version.json +++ b/clash-nyanpasu/manifest/version.json @@ -2,7 +2,7 @@ "manifest_version": 1, "latest": { "mihomo": "v1.19.19", - "mihomo_alpha": "alpha-558b384", + "mihomo_alpha": "alpha-86257fc", "clash_rs": "v0.9.4", "clash_premium": "2023-09-05-gdcc8d87", "clash_rs_alpha": "0.9.4-alpha+sha.5675004" @@ -69,5 +69,5 @@ "linux-armv7hf": "clash-armv7-unknown-linux-gnueabihf" } }, - "updated_at": "2026-02-05T00:18:37.438Z" + "updated_at": "2026-02-05T22:41:40.244Z" } diff --git a/clash-nyanpasu/package.json b/clash-nyanpasu/package.json index ce8cef4158..91d1c1b262 100644 --- a/clash-nyanpasu/package.json +++ b/clash-nyanpasu/package.json @@ -20,7 +20,7 @@ "web:visualize": "pnpm --filter=@nyanpasu/nyanpasu bundle:visualize", "lint": "run-s lint:*", "lint:prettier": "prettier --check .", - "lint:eslint": "eslint --cache .", + "lint:oxlint": "oxlint .", "lint:styles": "stylelint --cache --allow-empty-input \"**/*.{css,scss}\"", "lint:ts": "run-s lint:ts:*", "lint:ts:scripts": "tsc --noEmit --project ./scripts/tsconfig.json", @@ -35,7 +35,7 @@ "fmt": "run-p fmt:*", "fmt:backend": "cargo fmt --manifest-path ./backend/Cargo.toml --all", "fmt:prettier": "prettier --write .", - "fmt:eslint": "eslint --cache --fix . eslint.config.js", + "fmt:oxlint": "oxlint --fix .", "updater": "tsx scripts/updater.ts", "updater:nightly": "tsx scripts/updater-nightly.ts", "send-notify": "tsx scripts/telegram-notify.ts", @@ -60,35 +60,20 @@ "devDependencies": { "@commitlint/cli": "20.4.1", "@commitlint/config-conventional": "20.4.1", - "@eslint/compat": "1.4.1", - "@eslint/eslintrc": "3.3.3", "@ianvs/prettier-plugin-sort-imports": "4.7.1", "@tauri-apps/cli": "2.8.4", "@types/fs-extra": "11.0.4", "@types/lodash-es": "4.17.12", - "@types/node": "24.10.10", - "@typescript-eslint/eslint-plugin": "8.54.0", - "@typescript-eslint/parser": "8.54.0", + "@types/node": "24.10.11", "autoprefixer": "10.4.24", "conventional-changelog-conventionalcommits": "9.1.0", "cross-env": "10.1.0", "dedent": "1.7.1", - "eslint": "9.39.2", - "eslint-config-prettier": "10.1.8", - "eslint-import-resolver-alias": "1.1.2", - "eslint-plugin-html": "8.1.4", - "eslint-plugin-import": "2.32.0", - "eslint-plugin-n": "17.23.2", - "eslint-plugin-prettier": "5.5.5", - "eslint-plugin-promise": "7.2.1", - "eslint-plugin-react": "7.37.5", - "eslint-plugin-react-compiler": "19.1.0-rc.2", - "eslint-plugin-react-hooks": "7.0.1", "globals": "16.5.0", "knip": "5.83.0", "lint-staged": "16.2.7", - "neostandard": "0.12.2", "npm-run-all2": "8.0.4", + "oxlint": "^1.43.0", "postcss": "8.5.6", "postcss-html": "1.8.1", "postcss-import": "16.1.1", @@ -106,8 +91,7 @@ "stylelint-scss": "6.14.0", "tailwindcss": "4.1.18", "tsx": "4.21.0", - "typescript": "5.9.3", - "typescript-eslint": "8.54.0" + "typescript": "5.9.3" }, "packageManager": "pnpm@10.28.2", "engines": { diff --git a/clash-nyanpasu/pnpm-lock.yaml b/clash-nyanpasu/pnpm-lock.yaml index e71a1f5be5..b914901697 100644 --- a/clash-nyanpasu/pnpm-lock.yaml +++ b/clash-nyanpasu/pnpm-lock.yaml @@ -24,16 +24,10 @@ importers: devDependencies: '@commitlint/cli': specifier: 20.4.1 - version: 20.4.1(@types/node@24.10.10)(typescript@5.9.3) + version: 20.4.1(@types/node@24.10.11)(typescript@5.9.3) '@commitlint/config-conventional': specifier: 20.4.1 version: 20.4.1 - '@eslint/compat': - specifier: 1.4.1 - version: 1.4.1(eslint@9.39.2(jiti@2.6.1)) - '@eslint/eslintrc': - specifier: 3.3.3 - version: 3.3.3 '@ianvs/prettier-plugin-sort-imports': specifier: 4.7.1 version: 4.7.1(@prettier/plugin-oxc@0.1.3)(content-tag@4.0.0)(prettier-plugin-ember-template-tag@2.1.3(prettier@3.8.1))(prettier@3.8.1) @@ -47,14 +41,8 @@ importers: specifier: 4.17.12 version: 4.17.12 '@types/node': - specifier: 24.10.10 - version: 24.10.10 - '@typescript-eslint/eslint-plugin': - specifier: 8.54.0 - version: 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': - specifier: 8.54.0 - version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + specifier: 24.10.11 + version: 24.10.11 autoprefixer: specifier: 10.4.24 version: 10.4.24(postcss@8.5.6) @@ -67,54 +55,21 @@ importers: dedent: specifier: 1.7.1 version: 1.7.1(babel-plugin-macros@3.1.0) - eslint: - specifier: 9.39.2 - version: 9.39.2(jiti@2.6.1) - eslint-config-prettier: - specifier: 10.1.8 - version: 10.1.8(eslint@9.39.2(jiti@2.6.1)) - eslint-import-resolver-alias: - specifier: 1.1.2 - version: 1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))) - eslint-plugin-html: - specifier: 8.1.4 - version: 8.1.4 - eslint-plugin-import: - specifier: 2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-n: - specifier: 17.23.2 - version: 17.23.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-prettier: - specifier: 5.5.5 - version: 5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))(prettier@3.8.1) - eslint-plugin-promise: - specifier: 7.2.1 - version: 7.2.1(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-react: - specifier: 7.37.5 - version: 7.37.5(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-react-compiler: - specifier: 19.1.0-rc.2 - version: 19.1.0-rc.2(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-react-hooks: - specifier: 7.0.1 - version: 7.0.1(eslint@9.39.2(jiti@2.6.1)) globals: specifier: 16.5.0 version: 16.5.0 knip: specifier: 5.83.0 - version: 5.83.0(@types/node@24.10.10)(typescript@5.9.3) + version: 5.83.0(@types/node@24.10.11)(typescript@5.9.3) lint-staged: specifier: 16.2.7 version: 16.2.7 - neostandard: - specifier: 0.12.2 - version: 0.12.2(@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) npm-run-all2: specifier: 8.0.4 version: 8.0.4 + oxlint: + specifier: ^1.43.0 + version: 1.43.0 postcss: specifier: 8.5.6 version: 8.5.6 @@ -169,9 +124,6 @@ importers: typescript: specifier: 5.9.3 version: 5.9.3 - typescript-eslint: - specifier: 8.54.0 - version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) frontend/interface: dependencies: @@ -204,8 +156,8 @@ importers: specifier: 4.17.12 version: 4.17.12 '@types/react': - specifier: 19.2.11 - version: 19.2.11 + specifier: 19.2.13 + version: 19.2.13 frontend/nyanpasu: dependencies: @@ -220,10 +172,10 @@ importers: version: 3.2.2(react@19.2.4) '@emotion/styled': specifier: 11.14.1 - version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4) + version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4) '@hookform/resolvers': specifier: 5.2.2 - version: 5.2.2(react-hook-form@7.69.0(react@19.2.4)) + version: 5.2.2(react-hook-form@7.71.1(react@19.2.4)) '@inlang/paraglide-js': specifier: 2.7.1 version: 2.7.1(babel-plugin-macros@3.1.0) @@ -235,16 +187,16 @@ importers: version: 0.4.0 '@mui/icons-material': specifier: 7.3.7 - version: 7.3.7(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.11)(react@19.2.4) + version: 7.3.7(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.13)(react@19.2.4) '@mui/lab': specifier: 7.0.0-beta.17 - version: 7.0.0-beta.17(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 7.0.0-beta.17(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@mui/material': specifier: 7.3.7 - version: 7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@mui/x-date-pickers': specifier: 8.27.0 - version: 8.27.0(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@mui/system@7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(dayjs@1.11.19)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 8.27.0(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@mui/system@7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(dayjs@1.11.19)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@nyanpasu/interface': specifier: workspace:^ version: link:../interface @@ -253,31 +205,31 @@ importers: version: link:../ui '@radix-ui/react-dialog': specifier: 1.1.15 - version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-dropdown-menu': specifier: 2.1.16 - version: 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-scroll-area': specifier: 1.2.10 - version: 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-select': specifier: 2.2.6 - version: 2.2.6(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 2.2.6(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-separator': specifier: 1.1.8 - version: 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-slot': specifier: 1.2.4 - version: 1.2.4(@types/react@19.2.11)(react@19.2.4) + version: 1.2.4(@types/react@19.2.13)(react@19.2.4) '@radix-ui/react-switch': specifier: 1.2.6 - version: 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-tooltip': specifier: 1.2.8 - version: 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-use-controllable-state': specifier: 1.2.2 - version: 1.2.2(@types/react@19.2.11)(react@19.2.4) + version: 1.2.2(@types/react@19.2.13)(react@19.2.4) '@tailwindcss/postcss': specifier: 4.1.18 version: 4.1.18 @@ -321,26 +273,26 @@ importers: specifier: 1.11.19 version: 1.11.19 framer-motion: - specifier: 12.31.0 - version: 12.31.0(@emotion/is-prop-valid@1.3.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: 12.33.0 + version: 12.33.0(@emotion/is-prop-valid@1.3.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) i18next: specifier: 25.7.3 version: 25.7.3(typescript@5.9.3) jotai: - specifier: 2.16.1 - version: 2.16.1(@babel/core@7.29.0)(@babel/template@7.28.6)(@types/react@19.2.11)(react@19.2.4) + specifier: 2.17.1 + version: 2.17.1(@babel/core@7.29.0)(@babel/template@7.28.6)(@types/react@19.2.13)(react@19.2.4) json-schema: specifier: 0.4.0 version: 0.4.0 material-react-table: specifier: npm:@greenhat616/material-react-table@4.0.0 - version: '@greenhat616/material-react-table@4.0.0(aea3965acb5542fea4f937fa75a21b20)' + version: '@greenhat616/material-react-table@4.0.0(ea8a682ce6028a634854fb53683ad162)' monaco-editor: specifier: 0.54.0 version: 0.54.0 mui-color-input: specifier: 7.0.0 - version: 7.0.0(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 7.0.0(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: specifier: 19.2.4 version: 19.2.4 @@ -354,17 +306,17 @@ importers: specifier: 1.6.5 version: 1.6.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react-hook-form: - specifier: 7.69.0 - version: 7.69.0(react@19.2.4) + specifier: 7.71.1 + version: 7.71.1(react@19.2.4) react-hook-form-mui: specifier: 8.2.0 - version: 8.2.0(c04c42a37bf6e527fbeebf6281887bc0) + version: 8.2.0(5eba25cbc188b715a2272e829a88aafa) react-i18next: specifier: 15.7.4 version: 15.7.4(i18next@25.7.3(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) react-markdown: specifier: 10.1.0 - version: 10.1.0(@types/react@19.2.11)(react@19.2.4) + version: 10.1.0(@types/react@19.2.13)(react@19.2.4) react-split-grid: specifier: 1.0.4 version: 1.0.4(react@19.2.4) @@ -392,10 +344,10 @@ importers: version: 11.13.5 '@emotion/react': specifier: 11.14.0 - version: 11.14.0(@types/react@19.2.11)(react@19.2.4) + version: 11.14.0(@types/react@19.2.13)(react@19.2.4) '@iconify/json': - specifier: 2.2.435 - version: 2.2.435 + specifier: 2.2.436 + version: 2.2.436 '@monaco-editor/react': specifier: 4.7.0 version: 4.7.0(monaco-editor@0.54.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -410,7 +362,7 @@ importers: version: 1.158.1(@tanstack/react-router@1.158.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.158.1)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/router-plugin': specifier: 1.158.1 - version: 1.158.1(@tanstack/react-router@1.158.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 1.158.1(@tanstack/react-router@1.158.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)) '@tauri-apps/plugin-clipboard-manager': specifier: 2.3.0 version: 2.3.0 @@ -436,23 +388,23 @@ importers: specifier: 2.9.0 version: 2.9.0 '@types/react': - specifier: 19.2.11 - version: 19.2.11 + specifier: 19.2.13 + version: 19.2.13 '@types/react-dom': specifier: 19.2.3 - version: 19.2.3(@types/react@19.2.11) + version: 19.2.3(@types/react@19.2.13) '@types/validator': specifier: 13.15.10 version: 13.15.10 '@vitejs/plugin-legacy': specifier: 7.2.1 - version: 7.2.1(terser@5.36.0)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 7.2.1(terser@5.36.0)(vite@7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)) '@vitejs/plugin-react': specifier: 5.1.3 - version: 5.1.3(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 5.1.3(vite@7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)) '@vitejs/plugin-react-swc': specifier: 4.2.3 - version: 4.2.3(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.2.3(vite@7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)) change-case: specifier: 5.4.4 version: 5.4.4 @@ -491,19 +443,19 @@ importers: version: 13.15.26 vite: specifier: 7.3.1 - version: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1) + version: 7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1) vite-plugin-html: specifier: 3.2.2 - version: 3.2.2(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 3.2.2(vite@7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)) vite-plugin-sass-dts: specifier: 1.3.35 - version: 1.3.35(postcss@8.5.6)(prettier@3.8.1)(sass-embedded@1.97.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 1.3.35(postcss@8.5.6)(prettier@3.8.1)(sass-embedded@1.97.3)(vite@7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)) vite-plugin-svgr: specifier: 4.5.0 - version: 4.5.0(rollup@4.46.2)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.5.0(rollup@4.46.2)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)) vite-tsconfig-paths: specifier: 5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)) zod: specifier: 4.2.1 version: 4.2.1 @@ -515,19 +467,19 @@ importers: version: 0.4.0 '@mui/icons-material': specifier: 7.3.7 - version: 7.3.7(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.11)(react@19.2.4) + version: 7.3.7(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.13)(react@19.2.4) '@mui/lab': specifier: 7.0.0-beta.17 - version: 7.0.0-beta.17(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 7.0.0-beta.17(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@mui/material': specifier: 7.3.7 - version: 7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-portal': specifier: 1.1.10 - version: 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-scroll-area': specifier: 1.2.10 - version: 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tauri-apps/api': specifier: 2.8.0 version: 2.8.0 @@ -535,11 +487,11 @@ importers: specifier: 7.4.3 version: 7.4.3 '@types/react': - specifier: 19.2.11 - version: 19.2.11 + specifier: 19.2.13 + version: 19.2.13 '@vitejs/plugin-react': specifier: 5.1.3 - version: 5.1.3(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 5.1.3(vite@7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)) ahooks: specifier: 3.9.6 version: 3.9.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -547,8 +499,8 @@ importers: specifier: 7.9.0 version: 7.9.0 framer-motion: - specifier: 12.31.0 - version: 12.31.0(@emotion/is-prop-valid@1.3.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: 12.33.0 + version: 12.33.0(@emotion/is-prop-valid@1.3.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: specifier: 19.2.4 version: 19.2.4 @@ -569,14 +521,14 @@ importers: version: 4.1.18 vite: specifier: 7.3.1 - version: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1) + version: 7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1) vite-tsconfig-paths: specifier: 5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)) devDependencies: '@emotion/react': specifier: 11.14.0 - version: 11.14.0(@types/react@19.2.11)(react@19.2.4) + version: 11.14.0(@types/react@19.2.13)(react@19.2.4) '@types/d3-interpolate-path': specifier: 2.0.3 version: 2.0.3 @@ -597,7 +549,7 @@ importers: version: 5.2.0(typescript@5.9.3) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@24.10.10)(rollup@4.46.2)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.5.4(@types/node@24.10.11)(rollup@4.46.2)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)) scripts: dependencies: @@ -620,8 +572,8 @@ importers: specifier: 7.1.1 version: 7.1.1 semver: - specifier: 7.7.3 - version: 7.7.3 + specifier: 7.7.4 + version: 7.7.4 zod: specifier: 4.2.1 version: 4.2.1 @@ -691,10 +643,6 @@ packages: '@antfu/utils@9.2.0': resolution: {integrity: sha512-Oq1d9BGZakE/FyoEtcNeSwM7MpDO2vUBi11RWBZXf75zPsbUVWmUs03EqkRFrcgbXyKTas0BdZWC1wcuSoqSAw==} - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} - engines: {node: '>=6.9.0'} - '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -703,10 +651,6 @@ packages: resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.8': - resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} - engines: {node: '>=6.9.0'} - '@babel/compat-data@7.28.0': resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} engines: {node: '>=6.9.0'} @@ -715,18 +659,10 @@ packages: resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} engines: {node: '>=6.9.0'} - '@babel/core@7.26.10': - resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} - engines: {node: '>=6.9.0'} - '@babel/core@7.28.0': resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} engines: {node: '>=6.9.0'} - '@babel/core@7.28.4': - resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} - engines: {node: '>=6.9.0'} - '@babel/core@7.29.0': resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} engines: {node: '>=6.9.0'} @@ -739,18 +675,10 @@ packages: resolution: {integrity: sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.25.9': - resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} - engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.27.3': resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.26.5': - resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} - engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.27.2': resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} @@ -759,12 +687,6 @@ packages: resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.25.9': - resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-create-class-features-plugin@7.27.1': resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} engines: {node: '>=6.9.0'} @@ -798,10 +720,6 @@ packages: resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.25.9': - resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.27.1': resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} @@ -818,42 +736,22 @@ packages: resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-module-transforms@7.27.3': resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-module-transforms@7.28.3': - resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-module-transforms@7.28.6': resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.25.9': - resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-optimise-call-expression@7.27.1': resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.26.5': - resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} - engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.27.1': resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} @@ -864,22 +762,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.25.9': - resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.27.1': resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} - engines: {node: '>=6.9.0'} - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} @@ -900,10 +788,6 @@ packages: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} @@ -912,32 +796,14 @@ packages: resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.0': - resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} - engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.6': resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.4': - resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} - engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.6': resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.0': - resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/parser@7.28.4': - resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/parser@7.29.0': resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} engines: {node: '>=6.0.0'} @@ -973,13 +839,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-proposal-private-methods@7.18.6': - resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} @@ -1757,69 +1616,6 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.1': - resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/eslint-utils@4.8.0': - resolution: {integrity: sha512-MJQFqrZgcW0UNYLGOuQpey/oTN59vyWwplvCGZztn1cKz9agZPPYpJB7h2OMmuu7VLqkvEjN8feFZJmxNF9D+Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/eslint-utils@4.9.1': - resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint-community/regexpp@4.12.2': - resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/compat@1.4.1': - resolution: {integrity: sha512-cfO82V9zxxGBxcQDr1lfaYB7wykTa0b00mGa36FrJl7iTFd0Z2cHfEYuxcBRP/iNijCsWsEkA+jzT8hGYmv33w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.40 || 9 - peerDependenciesMeta: - eslint: - optional: true - - '@eslint/config-array@0.21.1': - resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/config-helpers@0.4.2': - resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.17.0': - resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/eslintrc@3.3.3': - resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/js@9.39.2': - resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/object-schema@2.1.7': - resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/plugin-kit@0.4.1': - resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@fastify/busboy@2.1.1': resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} @@ -1856,29 +1652,6 @@ packages: peerDependencies: react-hook-form: ^7.55.0 - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} - engines: {node: '>=18.18.0'} - - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} - engines: {node: '>=18.18.0'} - - '@humanwhocodes/gitignore-to-minimatch@1.0.2': - resolution: {integrity: sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==} - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - - '@humanwhocodes/retry@0.4.2': - resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} - engines: {node: '>=18.18'} - '@ianvs/prettier-plugin-sort-imports@4.7.1': resolution: {integrity: sha512-jmTNYGlg95tlsoG3JLCcuC4BrFELJtLirLAkQW/71lXSyOhVt/Xj7xWbbGcuVbNq1gwWgSyMrPjJc9Z30hynVw==} peerDependencies: @@ -1897,8 +1670,8 @@ packages: prettier-plugin-ember-template-tag: optional: true - '@iconify/json@2.2.435': - resolution: {integrity: sha512-QK5fPcA8zHwDhWEU9TvoaFrf61dADHC/rl8i2iKdXyVDodo6TTVnin7OMiyrHT19b4Y5lQofgdS7UW+jiF7dSg==} + '@iconify/json@2.2.436': + resolution: {integrity: sha512-g8/uXu9yrsmMj6oQY7AglROQ7R4VVPdvsUrIdmpkj5pQf1K5tNeZBBCeHuSSuqKiJm/qsZL54HxTkMwa+q+4QQ==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -2200,9 +1973,6 @@ packages: peerDependencies: react: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@napi-rs/wasm-runtime@0.2.11': - resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} - '@napi-rs/wasm-runtime@1.0.7': resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} @@ -2221,10 +1991,6 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nolyfill/is-core-module@1.0.39': - resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} - engines: {node: '>=12.4.0'} - '@octokit/app@16.1.2': resolution: {integrity: sha512-8j7sEpUYVj18dxvh0KWj6W/l6uAiVRBl1JBDVRqH1VHKAO/G5eRVl4yEoYACjakWers1DjUkcCHyJNQK47JqyQ==} engines: {node: '>= 20'} @@ -2620,6 +2386,50 @@ packages: cpu: [x64] os: [win32] + '@oxlint/darwin-arm64@1.43.0': + resolution: {integrity: sha512-C/GhObv/pQZg34NOzB6Mk8x0wc9AKj8fXzJF8ZRKTsBPyHusC6AZ6bba0QG0TUufw1KWuD0j++oebQfWeiFXNw==} + cpu: [arm64] + os: [darwin] + + '@oxlint/darwin-x64@1.43.0': + resolution: {integrity: sha512-4NjfUtEEH8ewRQ2KlZGmm6DyrvypMdHwBnQT92vD0dLScNOQzr0V9O8Ua4IWXdeCNl/XMVhAV3h4/3YEYern5A==} + cpu: [x64] + os: [darwin] + + '@oxlint/linux-arm64-gnu@1.43.0': + resolution: {integrity: sha512-75tf1HvwdZ3ebk83yMbSB+moAEWK98mYqpXiaFAi6Zshie7r+Cx5PLXZFUEqkscenoZ+fcNXakHxfn94V6nf1g==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxlint/linux-arm64-musl@1.43.0': + resolution: {integrity: sha512-BHV4fb36T2p/7bpA9fiJ5ayt7oJbiYX10nklW5arYp4l9/9yG/FQC5J4G1evzbJ/YbipF9UH0vYBAm5xbqGrvw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxlint/linux-x64-gnu@1.43.0': + resolution: {integrity: sha512-1l3nvnzWWse1YHibzZ4HQXdF/ibfbKZhp9IguElni3bBqEyPEyurzZ0ikWynDxKGXqZa+UNXTFuU1NRVX1RJ3g==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxlint/linux-x64-musl@1.43.0': + resolution: {integrity: sha512-+jNYgLGRFTJxJuaSOZJBwlYo5M0TWRw0+3y5MHOL4ArrIdHyCthg6r4RbVWrsR1qUfUE1VSSHQ2bfbC99RXqMg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxlint/win32-arm64@1.43.0': + resolution: {integrity: sha512-dvs1C/HCjCyGTURMagiHprsOvVTT3omDiSzi5Qw0D4QFJ1pEaNlfBhVnOUYgUfS6O7Mcmj4+G+sidRsQcWQ/kA==} + cpu: [arm64] + os: [win32] + + '@oxlint/win32-x64@1.43.0': + resolution: {integrity: sha512-bSuItSU8mTSDsvmmLTepTdCL2FkJI6dwt9tot/k0EmiYF+ArRzmsl4lXVLssJNRV5lJEc5IViyTrh7oiwrjUqA==} + cpu: [x64] + os: [win32] + '@parcel/watcher-android-arm64@2.4.1': resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} engines: {node: '>= 10.0.0'} @@ -2701,10 +2511,6 @@ packages: resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} engines: {node: '>= 10.0.0'} - '@pkgr/core@0.2.9': - resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} @@ -3252,9 +3058,6 @@ packages: cpu: [x64] os: [win32] - '@rtsao/scc@1.1.0': - resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@rushstack/node-core-library@5.11.0': resolution: {integrity: sha512-I8+VzG9A0F3nH2rLpPd7hF8F7l5Xb7D+ldrWVZYegXM6CsKkvWc670RlgK3WX8/AseZfXA/vVrh0bpXe2Y2UDQ==} peerDependencies: @@ -3308,12 +3111,6 @@ packages: '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} - '@stylistic/eslint-plugin@2.11.0': - resolution: {integrity: sha512-PNRHbydNG5EH8NK4c+izdJlxajIR6GxcUhzsYNRsn6Myep4dsZt0qFCz3rCPnkvgO5FYibDcMqgNHUT+zvjYZw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.40.0' - '@svgr/babel-plugin-add-jsx-attribute@8.0.0': resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} engines: {node: '>=14'} @@ -3801,9 +3598,6 @@ packages: '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} - '@tybys/wasm-util@0.9.0': - resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} - '@types/adm-zip@0.5.7': resolution: {integrity: sha512-DNEs/QvmyRLurdQPChqq0Md4zGvPwHerAJYWk9l2jCbD1VPpnzRJorOdiq4zsw09NFbYnhfsoEhWtxIzXpn2yw==} @@ -3951,9 +3745,6 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/jsonfile@6.1.4': resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} @@ -3969,8 +3760,8 @@ packages: '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - '@types/node@24.10.10': - resolution: {integrity: sha512-+0/4J266CBGPUq/ELg7QUHhN25WYjE0wYTPSQJn1xeu8DOlIOPxXxrNGiLmfAWl7HMMgWFWXpt9IDjMWrF5Iow==} + '@types/node@24.10.11': + resolution: {integrity: sha512-/Af7O8r1frCVgOz0I62jWUtMohJ0/ZQU/ZoketltOJPZpnb17yoNc9BSoVuV9qlaIXJiPNOpsfq4ByFajSArNQ==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -3994,8 +3785,8 @@ packages: peerDependencies: '@types/react': '*' - '@types/react@19.2.11': - resolution: {integrity: sha512-tORuanb01iEzWvMGVGv2ZDhYZVeRMrw453DCSAIn/5yvcSVnMoUMTyf33nQJLahYEnv9xqrTNbgz4qY5EfSh0g==} + '@types/react@19.2.13': + resolution: {integrity: sha512-KkiJeU6VbYbUOp5ITMIc7kBfqlYkKA5KhEHVrGMmUUMt7NeaZg65ojdPk+FtNrBAOXNVM5QM72jnADjM+XVRAQ==} '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} @@ -4015,102 +3806,6 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@typescript-eslint/eslint-plugin@8.54.0': - resolution: {integrity: sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.54.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/parser@8.54.0': - resolution: {integrity: sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/project-service@8.50.1': - resolution: {integrity: sha512-E1ur1MCVf+YiP89+o4Les/oBAVzmSbeRB0MQLfSlYtbWU17HPxZ6Bhs5iYmKZRALvEuBoXIZMOIRRc/P++Ortg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/project-service@8.54.0': - resolution: {integrity: sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/scope-manager@8.50.1': - resolution: {integrity: sha512-mfRx06Myt3T4vuoHaKi8ZWNTPdzKPNBhiblze5N50//TSHOAQQevl/aolqA/BcqqbJ88GUnLqjjcBc8EWdBcVw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/scope-manager@8.54.0': - resolution: {integrity: sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.50.1': - resolution: {integrity: sha512-ooHmotT/lCWLXi55G4mvaUF60aJa012QzvLK0Y+Mp4WdSt17QhMhWOaBWeGTFVkb2gDgBe19Cxy1elPXylslDw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/tsconfig-utils@8.54.0': - resolution: {integrity: sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/type-utils@8.54.0': - resolution: {integrity: sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/types@8.50.1': - resolution: {integrity: sha512-v5lFIS2feTkNyMhd7AucE/9j/4V9v5iIbpVRncjk/K0sQ6Sb+Np9fgYS/63n6nwqahHQvbmujeBL7mp07Q9mlA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.54.0': - resolution: {integrity: sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.50.1': - resolution: {integrity: sha512-woHPdW+0gj53aM+cxchymJCrh0cyS7BTIdcDxWUNsclr9VDkOSbqC13juHzxOmQ22dDkMZEpZB+3X1WpUvzgVQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/typescript-estree@8.54.0': - resolution: {integrity: sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/utils@8.50.1': - resolution: {integrity: sha512-lCLp8H1T9T7gPbEuJSnHwnSuO9mDf8mfK/Nion5mZmiEaQD9sWf9W4dfeFqRyqRjF06/kBuTmAqcs9sewM2NbQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/utils@8.54.0': - resolution: {integrity: sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/visitor-keys@8.50.1': - resolution: {integrity: sha512-IrDKrw7pCRUR94zeuCSUWQ+w8JEf5ZX5jl/e6AHGSLi1/zIr0lgutfn/7JpfCey+urpgQEdrZVYzCaVVKiTwhQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/visitor-keys@8.54.0': - resolution: {integrity: sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@uidotdev/usehooks@2.4.1': resolution: {integrity: sha512-1I+RwWyS+kdv3Mv0Vmc+p0dPYH0DTRAo04HLyXReYBL9AeseDWUJyi4THuksBJcu9F0Pih69Ak150VDnqbVnXg==} engines: {node: '>=16'} @@ -4271,109 +3966,6 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@unrs/resolver-binding-android-arm-eabi@1.10.1': - resolution: {integrity: sha512-zohDKXT1Ok0yhbVGff4YAg9HUs5ietG5GpvJBPFSApZnGe7uf2cd26DRhKZbn0Be6xHUZrSzP+RAgMmzyc71EA==} - cpu: [arm] - os: [android] - - '@unrs/resolver-binding-android-arm64@1.10.1': - resolution: {integrity: sha512-tAN6k5UrTd4nicpA7s2PbjR/jagpDzAmvXFjbpTazUe5FRsFxVcBlS1F5Lzp5jtWU6bdiqRhSvd4X8rdpCffeA==} - cpu: [arm64] - os: [android] - - '@unrs/resolver-binding-darwin-arm64@1.10.1': - resolution: {integrity: sha512-+FCsag8WkauI4dQ50XumCXdfvDCZEpMUnvZDsKMxfOisnEklpDFXc6ThY0WqybBYZbiwR5tWcFaZmI0G6b4vrg==} - cpu: [arm64] - os: [darwin] - - '@unrs/resolver-binding-darwin-x64@1.10.1': - resolution: {integrity: sha512-qYKGGm5wk71ONcXTMZ0+J11qQeOAPz3nw6VtqrBUUELRyXFyvK8cHhHsLBFR4GHnilc2pgY1HTB2TvdW9wO26Q==} - cpu: [x64] - os: [darwin] - - '@unrs/resolver-binding-freebsd-x64@1.10.1': - resolution: {integrity: sha512-hOHMAhbvIQ63gkpgeNsXcWPSyvXH7ZEyeg254hY0Lp/hX8NdW+FsUWq73g9946Pc/BrcVI/I3C1cmZ4RCX9bNw==} - cpu: [x64] - os: [freebsd] - - '@unrs/resolver-binding-linux-arm-gnueabihf@1.10.1': - resolution: {integrity: sha512-6ds7+zzHJgTDmpe0gmFcOTvSUhG5oZukkt+cCsSb3k4Uiz2yEQB4iCRITX2hBwSW+p8gAieAfecITjgqCkswXw==} - cpu: [arm] - os: [linux] - - '@unrs/resolver-binding-linux-arm-musleabihf@1.10.1': - resolution: {integrity: sha512-P7A0G2/jW00diNJyFeq4W9/nxovD62Ay8CMP4UK9OymC7qO7rG1a8Upad68/bdfpIOn7KSp7Aj/6lEW3yyznAA==} - cpu: [arm] - os: [linux] - - '@unrs/resolver-binding-linux-arm64-gnu@1.10.1': - resolution: {integrity: sha512-Cg6xzdkrpltcTPO4At+A79zkC7gPDQIgosJmVV8M104ImB6KZi1MrNXgDYIAfkhUYjPzjNooEDFRAwwPadS7ZA==} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@unrs/resolver-binding-linux-arm64-musl@1.10.1': - resolution: {integrity: sha512-aNeg99bVkXa4lt+oZbjNRPC8ZpjJTKxijg/wILrJdzNyAymO2UC/HUK1UfDjt6T7U5p/mK24T3CYOi3/+YEQSA==} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@unrs/resolver-binding-linux-ppc64-gnu@1.10.1': - resolution: {integrity: sha512-ylz5ojeXrkPrtnzVhpCO+YegG63/aKhkoTlY8PfMfBfLaUG8v6m6iqrL7sBUKdVBgOB4kSTUPt9efQdA/Y3Z/w==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@unrs/resolver-binding-linux-riscv64-gnu@1.10.1': - resolution: {integrity: sha512-xcWyhmJfXXOxK7lvE4+rLwBq+on83svlc0AIypfe6x4sMJR+S4oD7n9OynaQShfj2SufPw2KJAotnsNb+4nN2g==} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@unrs/resolver-binding-linux-riscv64-musl@1.10.1': - resolution: {integrity: sha512-mW9JZAdOCyorgi1eLJr4gX7xS67WNG9XNPYj5P8VuttK72XNsmdw9yhOO4tDANMgiLXFiSFaiL1gEpoNtRPw/A==} - cpu: [riscv64] - os: [linux] - libc: [musl] - - '@unrs/resolver-binding-linux-s390x-gnu@1.10.1': - resolution: {integrity: sha512-NZGKhBy6xkJ0k09cWNZz4DnhBcGlhDd3W+j7EYoNvf5TSwj2K6kbmfqTWITEgkvjsMUjm1wsrc4IJaH6VtjyHQ==} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@unrs/resolver-binding-linux-x64-gnu@1.10.1': - resolution: {integrity: sha512-VsjgckJ0gNMw7p0d8In6uPYr+s0p16yrT2rvG4v2jUpEMYkpnfnCiALa9SWshbvlGjKQ98Q2x19agm3iFk8w8Q==} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@unrs/resolver-binding-linux-x64-musl@1.10.1': - resolution: {integrity: sha512-idMnajMeejnaFi0Mx9UTLSYFDAOTfAEP7VjXNgxKApso3Eu2Njs0p2V95nNIyFi4oQVGFmIuCkoznAXtF/Zbmw==} - cpu: [x64] - os: [linux] - libc: [musl] - - '@unrs/resolver-binding-wasm32-wasi@1.10.1': - resolution: {integrity: sha512-7jyhjIRNFjzlr8x5pth6Oi9hv3a7ubcVYm2GBFinkBQKcFhw4nIs5BtauSNtDW1dPIGrxF0ciynCZqzxMrYMsg==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@unrs/resolver-binding-win32-arm64-msvc@1.10.1': - resolution: {integrity: sha512-TY79+N+Gkoo7E99K+zmsKNeiuNJYlclZJtKqsHSls8We2iGhgxtletVsiBYie93MSTDRDMI8pkBZJlIJSZPrdA==} - cpu: [arm64] - os: [win32] - - '@unrs/resolver-binding-win32-ia32-msvc@1.10.1': - resolution: {integrity: sha512-BAJN5PEPlEV+1m8+PCtFoKm3LQ1P57B4Z+0+efU0NzmCaGk7pUaOxuPgl+m3eufVeeNBKiPDltG0sSB9qEfCxw==} - cpu: [ia32] - os: [win32] - - '@unrs/resolver-binding-win32-x64-msvc@1.10.1': - resolution: {integrity: sha512-2v3erKKmmCyIVvvhI2nF15qEbdBpISTq44m9pyd5gfIJB1PN94oePTLWEd82XUbIbvKhv76xTSeUQSCOGesLeg==} - cpu: [x64] - os: [win32] - '@vitejs/plugin-legacy@7.2.1': resolution: {integrity: sha512-CaXb/y0mlfu7jQRELEJJc2/5w2bX2m1JraARgFnvSB2yfvnCNJVWWlqAo6WjnKoepOwKx8gs0ugJThPLKCOXIg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4425,11 +4017,6 @@ packages: '@xobotyi/scrollbar-width@1.9.5': resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.15.0: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} @@ -4461,9 +4048,6 @@ packages: ajv: optional: true - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} @@ -4520,25 +4104,9 @@ packages: resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} engines: {node: '>=10'} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - - array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} - array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} - - array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} - engines: {node: '>= 0.4'} - array-timsort@1.0.3: resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} @@ -4546,38 +4114,6 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} - - array.prototype.findlastindex@1.2.6: - resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} - - array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} - ast-types@0.16.1: resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} engines: {node: '>=4'} @@ -4599,10 +4135,6 @@ packages: peerDependencies: postcss: ^8.1.0 - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - babel-dead-code-elimination@1.0.12: resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} @@ -4705,30 +4237,6 @@ packages: cacheable@2.3.1: resolution: {integrity: sha512-yr+FSHWn1ZUou5LkULX/S+jhfgfnLbuKQjE40tyEd4fxGZVMbBL5ifno0J0OauykS8UiCSgHi+DV/YD+rjFxFg==} - call-bind-apply-helpers@1.0.1: - resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} - engines: {node: '>= 0.4'} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - - call-bound@1.0.3: - resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -4867,10 +4375,6 @@ packages: resolution: {integrity: sha512-aKl8CwoMKxVTfAK4dFN4v54AEvuUh9pzmgVIBeK6gBomLwMgceQUKKWHzJdW1u1VQXQuwnJ7nJGWYYMTl5U4yg==} engines: {node: '>= 6'} - comment-parser@1.4.1: - resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} - engines: {node: '>= 12.0.0'} - compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} @@ -5157,30 +4661,6 @@ packages: resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} engines: {node: '>=12'} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - - data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} - dayjs@1.11.19: resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} @@ -5195,14 +4675,6 @@ packages: supports-color: optional: true - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -5249,21 +4721,10 @@ packages: babel-plugin-macros: optional: true - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} @@ -5300,10 +4761,6 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} @@ -5348,10 +4805,6 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} @@ -5383,10 +4836,6 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - entities@6.0.0: - resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} - engines: {node: '>=0.12'} - env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -5405,65 +4854,6 @@ packages: error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} - - es-abstract@1.23.7: - resolution: {integrity: sha512-OygGC8kIcDhXX+6yAZRGLqwi2CmEXCbLQixeGUgYeR+Qwlppqmo7DIDr8XibtEBZp+fJcoYpoatp5qwLMEdcqQ==} - engines: {node: '>= 0.4'} - - es-abstract@1.24.0: - resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-iterator-helpers@1.2.1: - resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - - es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} - - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} - es5-ext@0.10.64: resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} engines: {node: '>=0.10'} @@ -5492,194 +4882,15 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - eslint-compat-utils@0.5.1: - resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=6.0.0' - - eslint-config-prettier@10.1.8: - resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - - eslint-import-context@0.1.9: - resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - peerDependencies: - unrs-resolver: ^1.0.0 - peerDependenciesMeta: - unrs-resolver: - optional: true - - eslint-import-resolver-alias@1.1.2: - resolution: {integrity: sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==} - engines: {node: '>= 4'} - peerDependencies: - eslint-plugin-import: '>=1.4.0' - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - - eslint-import-resolver-typescript@3.10.1: - resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - eslint-plugin-import-x: '*' - peerDependenciesMeta: - eslint-plugin-import: - optional: true - eslint-plugin-import-x: - optional: true - - eslint-module-utils@2.12.1: - resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - - eslint-plugin-es-x@7.8.0: - resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8' - - eslint-plugin-html@8.1.4: - resolution: {integrity: sha512-Eno3oPEj3s6AhvDJ5zHhnHPDvXp6LNFXuy3w51fNebOKYuTrfjOHUGwP+mOrGFpR6eOJkO1xkB8ivtbfMjbMjg==} - engines: {node: '>=16.0.0'} - - eslint-plugin-import-x@4.16.1: - resolution: {integrity: sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/utils': ^8.0.0 - eslint: ^8.57.0 || ^9.0.0 - eslint-import-resolver-node: '*' - peerDependenciesMeta: - '@typescript-eslint/utils': - optional: true - eslint-import-resolver-node: - optional: true - - eslint-plugin-import@2.32.0: - resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-n@17.23.2: - resolution: {integrity: sha512-RhWBeb7YVPmNa2eggvJooiuehdL76/bbfj/OJewyoGT80qn5PXdz8zMOTO6YHOsI7byPt7+Ighh/i/4a5/v7hw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.23.0' - - eslint-plugin-prettier@5.5.5: - resolution: {integrity: sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true - - eslint-plugin-promise@7.2.1: - resolution: {integrity: sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - - eslint-plugin-react-compiler@19.1.0-rc.2: - resolution: {integrity: sha512-oKalwDGcD+RX9mf3NEO4zOoUMeLvjSvcbbEOpquzmzqEEM2MQdp7/FY/Hx9NzmUwFzH1W9SKTz5fihfMldpEYw==} - engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} - peerDependencies: - eslint: '>=7' - - eslint-plugin-react-hooks@7.0.1: - resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} - engines: {node: '>=18'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - - eslint-plugin-react@7.37.5: - resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - - eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint@9.39.2: - resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - esniff@2.0.1: resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} engines: {node: '>=0.10'} - espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} @@ -5717,9 +4928,6 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -5728,12 +4936,6 @@ packages: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-shallow-equal@1.0.0: resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} @@ -5770,10 +4972,6 @@ packages: file-entry-cache@11.1.1: resolution: {integrity: sha512-TPVFSDE7q91Dlk1xpFLvFllf8r0HyOMOlnWy7Z2HBku5H3KhIeOGInexrIeg2D64DosVB/JXkrrk6N/7Wriq4A==} - file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} - filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} @@ -5788,27 +4986,12 @@ packages: find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} - flat-cache@6.1.19: resolution: {integrity: sha512-l/K33newPTZMTGAnnzaiqSl6NnH7Namh8jBNjrgjprWxGmZUuxx/sJNIRaijOh3n7q7ESbhNZC+pvVZMFdeU4A==} flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - formatly@0.3.0: resolution: {integrity: sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==} engines: {node: '>=18.3.0'} @@ -5817,8 +5000,8 @@ packages: fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - framer-motion@12.31.0: - resolution: {integrity: sha512-Tnd0FU05zGRFI3JJmBegXonF1rfuzYeuXd1QSdQ99Ysnppk0yWBWSW2wUsqzRpS5nv0zPNx+y0wtDj4kf0q5RQ==} + framer-motion@12.33.0: + resolution: {integrity: sha512-ca8d+rRPcDP5iIF+MoT3WNc0KHJMjIyFAbtVLvM9eA7joGSpeqDfiNH/kCs1t4CHi04njYvWyj0jS4QlEK/rJQ==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -5850,17 +5033,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -5877,34 +5049,10 @@ packages: resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} engines: {node: '>=18'} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - - get-intrinsic@1.2.6: - resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} - engines: {node: '>= 0.4'} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - - get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} - get-tsconfig@4.10.1: resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} @@ -5917,10 +5065,6 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me @@ -5941,10 +5085,6 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - globals@15.15.0: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} @@ -5953,10 +5093,6 @@ packages: resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} engines: {node: '>=18'} - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -5972,46 +5108,13 @@ packages: peerDependencies: csstype: ^3.0.10 - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - hashery@1.3.0: resolution: {integrity: sha512-fWltioiy5zsSAs9ouEnvhsVJeAXRybGCNNv0lvzpzNOSDbULXRy7ivFWwCCv4I5Am6kSo75hmbsCduOoc2/K4w==} engines: {node: '>=20'} @@ -6033,12 +5136,6 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - hermes-estree@0.25.1: - resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} - - hermes-parser@0.25.1: - resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - highlight-words@2.0.0: resolution: {integrity: sha512-If5n+IhSBRXTScE7wl16VPmd+44Vy7kof24EdqhjsZsDuHikpv1OCagVcJFpB4fS4UPUniedlWqrjIO8vWOsIQ==} engines: {node: '>= 20', npm: '>= 9'} @@ -6067,9 +5164,6 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - htmlparser2@10.0.0: - resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} - htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} @@ -6164,14 +5258,6 @@ packages: inline-style-prefixer@7.0.1: resolution: {integrity: sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==} - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - - internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} - internmap@2.0.3: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} @@ -6190,47 +5276,13 @@ packages: is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - - is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} - is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} - - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - - is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - - is-boolean-object@1.2.1: - resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} - engines: {node: '>= 0.4'} - - is-bun-module@2.0.0: - resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - is-core-module@2.15.1: resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} @@ -6239,22 +5291,6 @@ packages: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - - is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} - - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - - is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} - is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -6267,10 +5303,6 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -6279,10 +5311,6 @@ packages: resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} engines: {node: '>=18'} - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -6290,26 +5318,10 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - is-network-error@1.1.0: resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} engines: {node: '>=16'} - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - - is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -6326,72 +5338,9 @@ packages: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} - - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} - - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - - is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} - - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - - is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - - is-weakref@1.1.0: - resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} - engines: {node: '>= 0.4'} - - is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} - - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} - is-what@3.14.1: resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} @@ -6399,9 +5348,6 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isbot@5.1.28: resolution: {integrity: sha512-qrOp4g3xj8YNse4biorv6O5ZShwsJM0trsoda4y7j/Su7ZtTTfVXFzbKkpgcSoDrHS8FcTuUwcU04YimZlZOxw==} engines: {node: '>=18'} @@ -6413,10 +5359,6 @@ packages: resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} engines: {node: '>=16'} - iterator.prototype@1.1.4: - resolution: {integrity: sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==} - engines: {node: '>= 0.4'} - jake@10.9.2: resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} engines: {node: '>=10'} @@ -6432,8 +5374,8 @@ packages: jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - jotai@2.16.1: - resolution: {integrity: sha512-vrHcAbo3P7Br37C8Bv6JshMtlKMPqqmx0DDREtTjT4nf3QChDrYdbH+4ik/9V0cXA57dK28RkJ5dctYvavcIlg==} + jotai@2.17.1: + resolution: {integrity: sha512-TFNZZDa/0ewCLQyRC/Sq9crtixNj/Xdf/wmj9631xxMuKToVJZDbqcHIYN0OboH+7kh6P6tpIK7uKWClj86PKw==} engines: {node: '>=12.20.0'} peerDependencies: '@babel/core': '>=7.0.0' @@ -6488,9 +5430,6 @@ packages: engines: {node: '>=6'} hasBin: true - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -6498,22 +5437,12 @@ packages: resolution: {integrity: sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==} engines: {node: ^18.17.0 || >=20.5.0} - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} json-schema@0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -6525,13 +5454,6 @@ packages: jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - keyv@5.5.5: resolution: {integrity: sha512-FA5LmZVF1VziNc0bIdCSA1IoSVnDCqE8HJIZZv2/W8YmoAM50+tnUgJR/gQZwEeIMleuIOnRnHA/UaZRNeV4iQ==} @@ -6562,10 +5484,6 @@ packages: engines: {node: '>=6'} hasBin: true - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - lightningcss-android-arm64@1.30.2: resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} engines: {node: '>= 12.0.0'} @@ -6664,10 +5582,6 @@ packages: resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} engines: {node: '>=14'} - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - lodash-es@4.17.23: resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==} @@ -6683,9 +5597,6 @@ packages: lodash.kebabcase@4.1.1: resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.mergewith@4.6.2: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} @@ -6740,10 +5651,6 @@ packages: engines: {node: '>= 18'} hasBin: true - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - mathml-tag-names@2.1.3: resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} @@ -6934,8 +5841,8 @@ packages: peerDependencies: monaco-editor: '>=0.36' - motion-dom@12.30.1: - resolution: {integrity: sha512-QXB+iFJRzZTqL+Am4a1CRoHdH+0Nq12wLdqQQZZsfHlp9AMt6PA098L/61oVZsDA+Ep3QSGudzpViyRrhYhGcQ==} + motion-dom@12.33.0: + resolution: {integrity: sha512-XRPebVypsl0UM+7v0Hr8o9UAj0S2djsQWRdHBd5iVouVpMrQqAI0C/rDAT3QaYnXnHuC5hMcwDHCboNeyYjPoQ==} motion-utils@12.29.2: resolution: {integrity: sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==} @@ -6982,26 +5889,11 @@ packages: engines: {node: ^18 || >=20} hasBin: true - napi-postinstall@0.3.0: - resolution: {integrity: sha512-M7NqKyhODKV1gRLdkwE7pDsZP2/SC2a2vHkOYh9MCpKMbWVfyVfUw5MaH83Fv6XMjxr5jryUp3IDDL9rlxsTeA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - hasBin: true - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - needle@3.3.1: resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} engines: {node: '>= 4.4.x'} hasBin: true - neostandard@0.12.2: - resolution: {integrity: sha512-VZU8EZpSaNadp3rKEwBhVD1Kw8jE3AftQLkCyOaM7bWemL1LwsYRsBnAmXy2LjG9zO8t66qJdqB7ccwwORyrAg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - peerDependencies: - eslint: ^9.0.0 - next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} @@ -7051,46 +5943,6 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.13.2: - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} - engines: {node: '>= 0.4'} - - object-inspect@1.13.3: - resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} - engines: {node: '>= 0.4'} - - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} - - object.entries@1.1.9: - resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} - - object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} - octokit@5.0.5: resolution: {integrity: sha512-4+/OFSqOjoyULo7eN7EA97DE0Xydj/PW5aIckxqQIoFjFwqXKuFCvXUJObyJfBF9Khu4RL/jlDRI9FPaMGfPnw==} engines: {node: '>= 20'} @@ -7112,14 +5964,6 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} - oxc-parser@0.99.0: resolution: {integrity: sha512-MpS1lbd2vR0NZn1v0drpgu7RUFu3x9Rd0kxExObZc2+F+DIrV0BOMval/RO3BYGwssIOerII6iS8EbbpCCZQpQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -7127,13 +5971,15 @@ packages: oxc-resolver@11.16.1: resolution: {integrity: sha512-eN5tLRx2oyyNpPyWWItuPiNLY/EpGlqXVJll+Uptds4owQ4UQK3T8rPlR+wl8xBKvQZM4drFC1nKVLeZDUWpQg==} - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + oxlint@1.43.0: + resolution: {integrity: sha512-xiqTCsKZch+R61DPCjyqUVP2MhkQlRRYxLRBeBDi+dtQJ90MOgdcjIktvDCgXz0bgtx94EQzHEndsizZjMX2OA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.11.2' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true p-retry@7.1.1: resolution: {integrity: sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==} @@ -7169,10 +6015,6 @@ packages: path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -7194,10 +6036,6 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - peowly@1.3.2: - resolution: {integrity: sha512-BYIrwr8JCXY49jUZscgw311w9oGEKo7ux/s+BxrhKTQbiQ0iYNdZNJ5LgagaeercQdFHwnR7Z5IxxFWVQ+BasQ==} - engines: {node: '>=18.6.0'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -7235,10 +6073,6 @@ packages: pkg-types@2.3.0: resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - postcss-html@1.8.1: resolution: {integrity: sha512-OLF6P7qctfAWayOhLpcVnTGqVeJzu2W3WpIYelfz2+JV5oGxfkcEvweN9U4XpeqE0P98dcD9ssusGwlF0TK0uQ==} engines: {node: ^12 || >=14} @@ -7333,14 +6167,6 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier-linter-helpers@1.0.1: - resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} - engines: {node: '>=6.0.0'} - prettier-plugin-ember-template-tag@2.1.3: resolution: {integrity: sha512-FfAvkU+fqDC3Zs8+qGhBHYuwq1DED+UTPMH33QXxivZxRekkItBNXfi1Y+YkIbhCnu6UeTE2aYdbQSLlkOC2bA==} engines: {node: 18.* || >= 20} @@ -7473,8 +6299,8 @@ packages: '@mui/x-date-pickers': optional: true - react-hook-form@7.69.0: - resolution: {integrity: sha512-yt6ZGME9f4F6WHwevrvpAjh42HMvocuSnSIHUGycBqXIJdhqGSPQzTpGF+1NLREk/58IdPxEMfPcFCjlMhclGw==} + react-hook-form@7.71.1: + resolution: {integrity: sha512-9SUJKCGKo8HUSsCO+y0CtqkqI5nNuaDqTxyqPsZPqIwudpj4rCrAz/jZV+jn57bx5gtZKOh3neQu94DXMc+w5w==} engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 @@ -7593,10 +6419,6 @@ packages: resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} engines: {node: '>= 4'} - reflect.getprototypeof@1.0.9: - resolution: {integrity: sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==} - engines: {node: '>= 0.4'} - regenerate-unicode-properties@10.2.0: resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} engines: {node: '>=4'} @@ -7616,18 +6438,6 @@ packages: regex@6.0.1: resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - - regexp.prototype.flags@1.5.3: - resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} - engines: {node: '>= 0.4'} - - regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} - regexpu-core@6.2.0: resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} engines: {node: '>=4'} @@ -7689,10 +6499,6 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true - resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true - restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} @@ -7734,26 +6540,6 @@ packages: rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} - - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} - engines: {node: '>=0.4'} - - safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} - - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - - safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -7915,6 +6701,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + seroval-plugins@1.4.2: resolution: {integrity: sha512-X7p4MEDTi+60o2sXZ4bnDBhgsUYDSkQEvzYZuJyFqWg9jcoPsHts5nrg5O956py2wyt28lUrBxk0M0/wU8URpA==} engines: {node: '>=10'} @@ -7925,22 +6716,10 @@ packages: resolution: {integrity: sha512-N3HEHRCZYn3cQbsC4B5ldj9j+tHdf4JZoYPlcI4rRYu0Xy4qN8MQf1Z08EibzB0WpgRG5BGK08FTrmM66eSzKQ==} engines: {node: '>=10'} - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - set-harmonic-interval@1.0.1: resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} engines: {node: '>=6.9'} - set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -7955,22 +6734,6 @@ packages: shiki@2.5.0: resolution: {integrity: sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==} - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -8052,13 +6815,6 @@ packages: peerDependencies: kysely: '*' - stable-hash-x@0.2.0: - resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} - engines: {node: '>=12.0.0'} - - stable-hash@0.0.5: - resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} - stack-generator@2.0.10: resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} @@ -8074,10 +6830,6 @@ packages: state-local@1.0.7: resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} - stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} - store2@2.14.3: resolution: {integrity: sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==} @@ -8097,29 +6849,6 @@ packages: resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} engines: {node: '>=20'} - string.prototype.matchall@4.0.12: - resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} - engines: {node: '>= 0.4'} - - string.prototype.repeat@1.0.0: - resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} - engines: {node: '>= 0.4'} - - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} @@ -8242,10 +6971,6 @@ packages: resolution: {integrity: sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==} engines: {node: '>=16.0.0'} - synckit@0.11.12: - resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} - engines: {node: ^14.18.0 || >=16.0.0} - systemjs@6.15.1: resolution: {integrity: sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==} @@ -8288,10 +7013,6 @@ packages: tinyexec@1.0.1: resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -8321,27 +7042,10 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - - ts-api-utils@2.4.0: - resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - ts-custom-error@3.3.1: resolution: {integrity: sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==} engines: {node: '>=14.0.0'} - ts-declaration-location@1.0.7: - resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==} - peerDependencies: - typescript: '>=4.0.0' - ts-easing@0.2.0: resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} @@ -8355,9 +7059,6 @@ packages: typescript: optional: true - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tsconfig-paths@4.2.0: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} @@ -8377,55 +7078,12 @@ packages: resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - type@2.7.2: resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - - typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} - typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - typescript-eslint@8.54.0: - resolution: {integrity: sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - typescript-plugin-css-modules@5.2.0: resolution: {integrity: sha512-c5pAU5d+m3GciDr/WhkFldz1NIEGBafuP/3xhFt9BEXS2gmn/LvjkoZ11vEBIuP8LkXfPNhOt1BUhM5efFuwOw==} peerDependencies: @@ -8444,13 +7102,6 @@ packages: ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - - unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} - undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} @@ -8563,9 +7214,6 @@ packages: resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} engines: {node: '>=18.12.0'} - unrs-resolver@1.10.1: - resolution: {integrity: sha512-EFrL7Hw4kmhZdwWO3dwwFJo6hO3FXuQ6Bg8BK/faHZ9m1YxqBS31BNSTxklIQkxK/4LlV8zTYnPsIRLBzTzjCA==} - update-browserslist-db@1.1.3: resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true @@ -8771,33 +7419,6 @@ packages: resolution: {integrity: sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==} engines: {node: '>=4.0.0'} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} - - which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.18: - resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} - which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -8812,10 +7433,6 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} hasBin: true - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -8883,31 +7500,9 @@ packages: resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - zod-validation-error@3.3.1: - resolution: {integrity: sha512-uFzCZz7FQis256dqw4AhPQgD6f3pzNca/Zh62RNELavlumQB3nDIUFbF5JQfFLcMbO1s02Q7Xg/gpcOBlEnYZA==} - engines: {node: '>=18.0.0'} - peerDependencies: - zod: ^3.18.0 - - zod-validation-error@4.0.2: - resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - zod: ^3.25.0 || ^4.0.0 - - zod@3.24.4: - resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} - zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.1.12: - resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} - zod@4.2.1: resolution: {integrity: sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==} @@ -8948,12 +7543,6 @@ snapshots: '@antfu/utils@9.2.0': {} - '@babel/code-frame@7.26.2': - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 - '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -8966,32 +7555,10 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.26.8': {} - '@babel/compat-data@7.28.0': {} '@babel/compat-data@7.29.0': {} - '@babel/core@7.26.10': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.29.0 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helpers': 7.27.0 - '@babel/parser': 7.29.0 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/core@7.28.0': dependencies: '@ampproject/remapping': 2.3.0 @@ -9012,26 +7579,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/core@7.28.4': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.29.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) - '@babel/helpers': 7.28.4 - '@babel/parser': 7.29.0 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/core@7.29.0': dependencies: '@babel/code-frame': 7.29.0 @@ -9067,22 +7614,10 @@ snapshots: '@jridgewell/trace-mapping': 0.3.29 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.25.9': - dependencies: - '@babel/types': 7.29.0 - '@babel/helper-annotate-as-pure@7.27.3': dependencies: '@babel/types': 7.29.0 - '@babel/helper-compilation-targets@7.26.5': - dependencies: - '@babel/compat-data': 7.26.8 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.28.1 - lru-cache: 5.1.1 - semver: 6.3.1 - '@babel/helper-compilation-targets@7.27.2': dependencies: '@babel/compat-data': 7.28.0 @@ -9099,19 +7634,6 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.10) - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.29.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -9161,13 +7683,6 @@ snapshots: '@babel/types': 7.29.0 optional: true - '@babel/helper-member-expression-to-functions@7.25.9': - dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - transitivePeerDependencies: - - supports-color - '@babel/helper-member-expression-to-functions@7.27.1': dependencies: '@babel/traverse': 7.29.0 @@ -9196,15 +7711,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -9214,15 +7720,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -9241,16 +7738,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.25.9': - dependencies: - '@babel/types': 7.29.0 - '@babel/helper-optimise-call-expression@7.27.1': dependencies: '@babel/types': 7.29.0 - '@babel/helper-plugin-utils@7.26.5': {} - '@babel/helper-plugin-utils@7.27.1': {} '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.0)': @@ -9262,15 +7753,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -9280,13 +7762,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - transitivePeerDependencies: - - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: '@babel/traverse': 7.29.0 @@ -9305,8 +7780,6 @@ snapshots: '@babel/helper-validator-identifier@7.28.5': {} - '@babel/helper-validator-option@7.25.9': {} - '@babel/helper-validator-option@7.27.1': {} '@babel/helper-wrap-function@7.27.1': @@ -9317,34 +7790,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helpers@7.27.0': - dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 - '@babel/helpers@7.27.6': dependencies: '@babel/template': 7.28.6 '@babel/types': 7.29.0 - '@babel/helpers@7.28.4': - dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 - '@babel/helpers@7.28.6': dependencies: '@babel/template': 7.28.6 '@babel/types': 7.29.0 - '@babel/parser@7.27.0': - dependencies: - '@babel/types': 7.29.0 - - '@babel/parser@7.28.4': - dependencies: - '@babel/types': 7.29.0 - '@babel/parser@7.29.0': dependencies: '@babel/types': 7.29.0 @@ -9384,14 +7839,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -9931,11 +8378,11 @@ snapshots: hashery: 1.3.0 keyv: 5.5.5 - '@commitlint/cli@20.4.1(@types/node@24.10.10)(typescript@5.9.3)': + '@commitlint/cli@20.4.1(@types/node@24.10.11)(typescript@5.9.3)': dependencies: '@commitlint/format': 20.4.0 '@commitlint/lint': 20.4.1 - '@commitlint/load': 20.4.0(@types/node@24.10.10)(typescript@5.9.3) + '@commitlint/load': 20.4.0(@types/node@24.10.11)(typescript@5.9.3) '@commitlint/read': 20.4.0 '@commitlint/types': 20.4.0 tinyexec: 1.0.1 @@ -9973,7 +8420,7 @@ snapshots: '@commitlint/is-ignored@20.4.1': dependencies: '@commitlint/types': 20.4.0 - semver: 7.7.3 + semver: 7.7.4 '@commitlint/lint@20.4.1': dependencies: @@ -9982,14 +8429,14 @@ snapshots: '@commitlint/rules': 20.4.1 '@commitlint/types': 20.4.0 - '@commitlint/load@20.4.0(@types/node@24.10.10)(typescript@5.9.3)': + '@commitlint/load@20.4.0(@types/node@24.10.11)(typescript@5.9.3)': dependencies: '@commitlint/config-validator': 20.4.0 '@commitlint/execute-rule': 20.0.0 '@commitlint/resolve-extends': 20.4.0 '@commitlint/types': 20.4.0 cosmiconfig: 9.0.0(typescript@5.9.3) - cosmiconfig-typescript-loader: 6.1.0(@types/node@24.10.10)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3) + cosmiconfig-typescript-loader: 6.1.0(@types/node@24.10.11)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3) is-plain-obj: 4.1.0 lodash.mergewith: 4.6.2 picocolors: 1.1.1 @@ -10149,7 +8596,7 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4)': + '@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4)': dependencies: '@babel/runtime': 7.26.0 '@emotion/babel-plugin': 11.13.5 @@ -10161,7 +8608,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 19.2.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 transitivePeerDependencies: - supports-color @@ -10175,18 +8622,18 @@ snapshots: '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4)': + '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4)': dependencies: '@babel/runtime': 7.27.6 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.3.0 - '@emotion/react': 11.14.0(@types/react@19.2.11)(react@19.2.4) + '@emotion/react': 11.14.0(@types/react@19.2.13)(react@19.2.4) '@emotion/serialize': 1.3.3 '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.4) '@emotion/utils': 1.4.2 react: 19.2.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 transitivePeerDependencies: - supports-color @@ -10280,70 +8727,6 @@ snapshots: '@esbuild/win32-x64@0.27.2': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.39.2(jiti@2.6.1))': - dependencies: - eslint: 9.39.2(jiti@2.6.1) - eslint-visitor-keys: 3.4.3 - - '@eslint-community/eslint-utils@4.8.0(eslint@9.39.2(jiti@2.6.1))': - dependencies: - eslint: 9.39.2(jiti@2.6.1) - eslint-visitor-keys: 3.4.3 - - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))': - dependencies: - eslint: 9.39.2(jiti@2.6.1) - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.12.1': {} - - '@eslint-community/regexpp@4.12.2': {} - - '@eslint/compat@1.4.1(eslint@9.39.2(jiti@2.6.1))': - dependencies: - '@eslint/core': 0.17.0 - optionalDependencies: - eslint: 9.39.2(jiti@2.6.1) - - '@eslint/config-array@0.21.1': - dependencies: - '@eslint/object-schema': 2.1.7 - debug: 4.4.3 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@eslint/config-helpers@0.4.2': - dependencies: - '@eslint/core': 0.17.0 - - '@eslint/core@0.17.0': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/eslintrc@3.3.3': - dependencies: - ajv: 6.12.6 - debug: 4.4.3 - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.0 - js-yaml: 4.1.1 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@9.39.2': {} - - '@eslint/object-schema@2.1.7': {} - - '@eslint/plugin-kit@0.4.1': - dependencies: - '@eslint/core': 0.17.0 - levn: 0.4.1 - '@fastify/busboy@2.1.1': {} '@floating-ui/core@1.7.3': @@ -10363,13 +8746,13 @@ snapshots: '@floating-ui/utils@0.2.10': {} - '@greenhat616/material-react-table@4.0.0(aea3965acb5542fea4f937fa75a21b20)': + '@greenhat616/material-react-table@4.0.0(ea8a682ce6028a634854fb53683ad162)': dependencies: - '@emotion/react': 11.14.0(@types/react@19.2.11)(react@19.2.4) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4) - '@mui/icons-material': 7.3.7(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.11)(react@19.2.4) - '@mui/material': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@mui/x-date-pickers': 8.27.0(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@mui/system@7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(dayjs@1.11.19)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@emotion/react': 11.14.0(@types/react@19.2.13)(react@19.2.4) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4) + '@mui/icons-material': 7.3.7(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.13)(react@19.2.4) + '@mui/material': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@mui/x-date-pickers': 8.27.0(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@mui/system@7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(dayjs@1.11.19)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/match-sorter-utils': 8.19.4 '@tanstack/react-table': 8.21.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-virtual': 3.13.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -10377,25 +8760,10 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@hookform/resolvers@5.2.2(react-hook-form@7.69.0(react@19.2.4))': + '@hookform/resolvers@5.2.2(react-hook-form@7.71.1(react@19.2.4))': dependencies: '@standard-schema/utils': 0.3.0 - react-hook-form: 7.69.0(react@19.2.4) - - '@humanfs/core@0.19.1': {} - - '@humanfs/node@0.16.6': - dependencies: - '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 - - '@humanwhocodes/gitignore-to-minimatch@1.0.2': {} - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/retry@0.3.1': {} - - '@humanwhocodes/retry@0.4.2': {} + react-hook-form: 7.71.1(react@19.2.4) '@ianvs/prettier-plugin-sort-imports@4.7.1(@prettier/plugin-oxc@0.1.3)(content-tag@4.0.0)(prettier-plugin-ember-template-tag@2.1.3(prettier@3.8.1))(prettier@3.8.1)': dependencies: @@ -10412,7 +8780,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@iconify/json@2.2.435': + '@iconify/json@2.2.436': dependencies: '@iconify/types': 2.0.0 pathe: 2.0.3 @@ -10514,23 +8882,23 @@ snapshots: '@material/material-color-utilities@0.4.0': {} - '@microsoft/api-extractor-model@7.30.3(@types/node@24.10.10)': + '@microsoft/api-extractor-model@7.30.3(@types/node@24.10.11)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.11.0(@types/node@24.10.10) + '@rushstack/node-core-library': 5.11.0(@types/node@24.10.11) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.51.0(@types/node@24.10.10)': + '@microsoft/api-extractor@7.51.0(@types/node@24.10.11)': dependencies: - '@microsoft/api-extractor-model': 7.30.3(@types/node@24.10.10) + '@microsoft/api-extractor-model': 7.30.3(@types/node@24.10.11) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.11.0(@types/node@24.10.10) + '@rushstack/node-core-library': 5.11.0(@types/node@24.10.11) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.15.0(@types/node@24.10.10) - '@rushstack/ts-command-line': 4.23.5(@types/node@24.10.10) + '@rushstack/terminal': 0.15.0(@types/node@24.10.11) + '@rushstack/ts-command-line': 4.23.5(@types/node@24.10.11) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.8 @@ -10562,39 +8930,39 @@ snapshots: '@mui/core-downloads-tracker@7.3.7': {} - '@mui/icons-material@7.3.7(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.11)(react@19.2.4)': + '@mui/icons-material@7.3.7(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.13)(react@19.2.4)': dependencies: '@babel/runtime': 7.28.4 - '@mui/material': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@mui/material': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@mui/lab@7.0.0-beta.17(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@mui/lab@7.0.0-beta.17(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@babel/runtime': 7.28.3 - '@mui/material': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@mui/system': 7.3.2(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4) - '@mui/types': 7.4.6(@types/react@19.2.11) - '@mui/utils': 7.3.2(@types/react@19.2.11)(react@19.2.4) + '@mui/material': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@mui/system': 7.3.2(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4) + '@mui/types': 7.4.6(@types/react@19.2.13) + '@mui/utils': 7.3.2(@types/react@19.2.13)(react@19.2.4) clsx: 2.1.1 prop-types: 15.8.1 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.2.11)(react@19.2.4) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4) - '@types/react': 19.2.11 + '@emotion/react': 11.14.0(@types/react@19.2.13)(react@19.2.4) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4) + '@types/react': 19.2.13 - '@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@babel/runtime': 7.28.4 '@mui/core-downloads-tracker': 7.3.7 - '@mui/system': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4) - '@mui/types': 7.4.10(@types/react@19.2.11) - '@mui/utils': 7.3.7(@types/react@19.2.11)(react@19.2.4) + '@mui/system': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4) + '@mui/types': 7.4.10(@types/react@19.2.13) + '@mui/utils': 7.3.7(@types/react@19.2.13)(react@19.2.4) '@popperjs/core': 2.11.8 - '@types/react-transition-group': 4.4.12(@types/react@19.2.11) + '@types/react-transition-group': 4.4.12(@types/react@19.2.13) clsx: 2.1.1 csstype: 3.2.3 prop-types: 15.8.1 @@ -10603,29 +8971,29 @@ snapshots: react-is: 19.2.4 react-transition-group: 4.4.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.2.11)(react@19.2.4) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4) - '@types/react': 19.2.11 + '@emotion/react': 11.14.0(@types/react@19.2.13)(react@19.2.4) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4) + '@types/react': 19.2.13 - '@mui/private-theming@7.3.2(@types/react@19.2.11)(react@19.2.4)': + '@mui/private-theming@7.3.2(@types/react@19.2.13)(react@19.2.4)': dependencies: '@babel/runtime': 7.28.4 - '@mui/utils': 7.3.7(@types/react@19.2.11)(react@19.2.4) + '@mui/utils': 7.3.7(@types/react@19.2.13)(react@19.2.4) prop-types: 15.8.1 react: 19.2.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@mui/private-theming@7.3.7(@types/react@19.2.11)(react@19.2.4)': + '@mui/private-theming@7.3.7(@types/react@19.2.13)(react@19.2.4)': dependencies: '@babel/runtime': 7.28.4 - '@mui/utils': 7.3.7(@types/react@19.2.11)(react@19.2.4) + '@mui/utils': 7.3.7(@types/react@19.2.13)(react@19.2.4) prop-types: 15.8.1 react: 19.2.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@mui/styled-engine@7.3.2(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(react@19.2.4)': + '@mui/styled-engine@7.3.2(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(react@19.2.4)': dependencies: '@babel/runtime': 7.28.4 '@emotion/cache': 11.14.0 @@ -10635,10 +9003,10 @@ snapshots: prop-types: 15.8.1 react: 19.2.4 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.2.11)(react@19.2.4) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4) + '@emotion/react': 11.14.0(@types/react@19.2.13)(react@19.2.4) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4) - '@mui/styled-engine@7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(react@19.2.4)': + '@mui/styled-engine@7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(react@19.2.4)': dependencies: '@babel/runtime': 7.28.4 '@emotion/cache': 11.14.0 @@ -10648,114 +9016,107 @@ snapshots: prop-types: 15.8.1 react: 19.2.4 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.2.11)(react@19.2.4) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4) + '@emotion/react': 11.14.0(@types/react@19.2.13)(react@19.2.4) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4) - '@mui/system@7.3.2(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4)': + '@mui/system@7.3.2(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4)': dependencies: '@babel/runtime': 7.28.4 - '@mui/private-theming': 7.3.2(@types/react@19.2.11)(react@19.2.4) - '@mui/styled-engine': 7.3.2(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(react@19.2.4) - '@mui/types': 7.4.6(@types/react@19.2.11) - '@mui/utils': 7.3.7(@types/react@19.2.11)(react@19.2.4) + '@mui/private-theming': 7.3.2(@types/react@19.2.13)(react@19.2.4) + '@mui/styled-engine': 7.3.2(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(react@19.2.4) + '@mui/types': 7.4.6(@types/react@19.2.13) + '@mui/utils': 7.3.7(@types/react@19.2.13)(react@19.2.4) clsx: 2.1.1 csstype: 3.2.3 prop-types: 15.8.1 react: 19.2.4 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.2.11)(react@19.2.4) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4) - '@types/react': 19.2.11 + '@emotion/react': 11.14.0(@types/react@19.2.13)(react@19.2.4) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4) + '@types/react': 19.2.13 - '@mui/system@7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4)': + '@mui/system@7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4)': dependencies: '@babel/runtime': 7.28.4 - '@mui/private-theming': 7.3.7(@types/react@19.2.11)(react@19.2.4) - '@mui/styled-engine': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(react@19.2.4) - '@mui/types': 7.4.10(@types/react@19.2.11) - '@mui/utils': 7.3.7(@types/react@19.2.11)(react@19.2.4) + '@mui/private-theming': 7.3.7(@types/react@19.2.13)(react@19.2.4) + '@mui/styled-engine': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(react@19.2.4) + '@mui/types': 7.4.10(@types/react@19.2.13) + '@mui/utils': 7.3.7(@types/react@19.2.13)(react@19.2.4) clsx: 2.1.1 csstype: 3.2.3 prop-types: 15.8.1 react: 19.2.4 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.2.11)(react@19.2.4) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4) - '@types/react': 19.2.11 + '@emotion/react': 11.14.0(@types/react@19.2.13)(react@19.2.4) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4) + '@types/react': 19.2.13 - '@mui/types@7.4.10(@types/react@19.2.11)': + '@mui/types@7.4.10(@types/react@19.2.13)': dependencies: '@babel/runtime': 7.28.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@mui/types@7.4.6(@types/react@19.2.11)': + '@mui/types@7.4.6(@types/react@19.2.13)': dependencies: '@babel/runtime': 7.28.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@mui/utils@7.3.2(@types/react@19.2.11)(react@19.2.4)': + '@mui/utils@7.3.2(@types/react@19.2.13)(react@19.2.4)': dependencies: '@babel/runtime': 7.28.4 - '@mui/types': 7.4.6(@types/react@19.2.11) + '@mui/types': 7.4.6(@types/react@19.2.13) '@types/prop-types': 15.7.15 clsx: 2.1.1 prop-types: 15.8.1 react: 19.2.4 react-is: 19.1.1 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@mui/utils@7.3.7(@types/react@19.2.11)(react@19.2.4)': + '@mui/utils@7.3.7(@types/react@19.2.13)(react@19.2.4)': dependencies: '@babel/runtime': 7.28.4 - '@mui/types': 7.4.10(@types/react@19.2.11) + '@mui/types': 7.4.10(@types/react@19.2.13) '@types/prop-types': 15.7.15 clsx: 2.1.1 prop-types: 15.8.1 react: 19.2.4 react-is: 19.2.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@mui/x-date-pickers@8.27.0(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@mui/system@7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(dayjs@1.11.19)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@mui/x-date-pickers@8.27.0(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@mui/system@7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(dayjs@1.11.19)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@babel/runtime': 7.28.4 - '@mui/material': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@mui/system': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4) - '@mui/utils': 7.3.7(@types/react@19.2.11)(react@19.2.4) - '@mui/x-internals': 8.26.0(@types/react@19.2.11)(react@19.2.4) - '@types/react-transition-group': 4.4.12(@types/react@19.2.11) + '@mui/material': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@mui/system': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4) + '@mui/utils': 7.3.7(@types/react@19.2.13)(react@19.2.4) + '@mui/x-internals': 8.26.0(@types/react@19.2.13)(react@19.2.4) + '@types/react-transition-group': 4.4.12(@types/react@19.2.13) clsx: 2.1.1 prop-types: 15.8.1 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) react-transition-group: 4.4.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.2.11)(react@19.2.4) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4) + '@emotion/react': 11.14.0(@types/react@19.2.13)(react@19.2.4) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4) dayjs: 1.11.19 transitivePeerDependencies: - '@types/react' - '@mui/x-internals@8.26.0(@types/react@19.2.11)(react@19.2.4)': + '@mui/x-internals@8.26.0(@types/react@19.2.13)(react@19.2.4)': dependencies: '@babel/runtime': 7.28.4 - '@mui/utils': 7.3.7(@types/react@19.2.11)(react@19.2.4) + '@mui/utils': 7.3.7(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 reselect: 5.1.1 use-sync-external-store: 1.6.0(react@19.2.4) transitivePeerDependencies: - '@types/react' - '@napi-rs/wasm-runtime@0.2.11': - dependencies: - '@emnapi/core': 1.7.1 - '@emnapi/runtime': 1.7.1 - '@tybys/wasm-util': 0.9.0 - optional: true - '@napi-rs/wasm-runtime@1.0.7': dependencies: '@emnapi/core': 1.5.0 @@ -10782,8 +9143,6 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@nolyfill/is-core-module@1.0.39': {} - '@octokit/app@16.1.2': dependencies: '@octokit/auth-app': 8.1.2 @@ -11154,6 +9513,30 @@ snapshots: '@oxc-resolver/binding-win32-x64-msvc@11.16.1': optional: true + '@oxlint/darwin-arm64@1.43.0': + optional: true + + '@oxlint/darwin-x64@1.43.0': + optional: true + + '@oxlint/linux-arm64-gnu@1.43.0': + optional: true + + '@oxlint/linux-arm64-musl@1.43.0': + optional: true + + '@oxlint/linux-x64-gnu@1.43.0': + optional: true + + '@oxlint/linux-x64-musl@1.43.0': + optional: true + + '@oxlint/win32-arm64@1.43.0': + optional: true + + '@oxlint/win32-x64@1.43.0': + optional: true + '@parcel/watcher-android-arm64@2.4.1': optional: true @@ -11211,8 +9594,6 @@ snapshots: '@parcel/watcher-win32-x64': 2.4.1 optional: true - '@pkgr/core@0.2.9': {} - '@popperjs/core@2.11.8': {} '@prettier/plugin-oxc@0.1.3': @@ -11223,394 +9604,394 @@ snapshots: '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.11 - '@types/react-dom': 19.2.3(@types/react@19.2.11) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.11)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.11 - '@types/react-dom': 19.2.3(@types/react@19.2.11) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.11)(react@19.2.4)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.13)(react@19.2.4)': dependencies: react: 19.2.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@radix-ui/react-context@1.1.2(@types/react@19.2.11)(react@19.2.4)': + '@radix-ui/react-context@1.1.2(@types/react@19.2.13)(react@19.2.4)': dependencies: react: 19.2.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.11)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.2.4) aria-hidden: 1.2.6 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - react-remove-scroll: 2.7.2(@types/react@19.2.11)(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.13)(react@19.2.4) optionalDependencies: - '@types/react': 19.2.11 - '@types/react-dom': 19.2.3(@types/react@19.2.11) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-direction@1.1.1(@types/react@19.2.11)(react@19.2.4)': + '@radix-ui/react-direction@1.1.1(@types/react@19.2.13)(react@19.2.4)': dependencies: react: 19.2.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.11)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.11 - '@types/react-dom': 19.2.3(@types/react@19.2.11) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.11)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.11 - '@types/react-dom': 19.2.3(@types/react@19.2.11) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.11)(react@19.2.4)': + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.13)(react@19.2.4)': dependencies: react: 19.2.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.11)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.11 - '@types/react-dom': 19.2.3(@types/react@19.2.11) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-id@1.1.1(@types/react@19.2.11)(react@19.2.4)': + '@radix-ui/react-id@1.1.1(@types/react@19.2.13)(react@19.2.4)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.11)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.11)(react@19.2.4) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.2.4) aria-hidden: 1.2.6 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - react-remove-scroll: 2.7.2(@types/react@19.2.11)(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.13)(react@19.2.4) optionalDependencies: - '@types/react': 19.2.11 - '@types/react-dom': 19.2.3(@types/react@19.2.11) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@floating-ui/react-dom': 2.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.11)(react@19.2.4) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.13)(react@19.2.4) '@radix-ui/rect': 1.1.1 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.11 - '@types/react-dom': 19.2.3(@types/react@19.2.11) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-portal@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-portal@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.11)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.11 - '@types/react-dom': 19.2.3(@types/react@19.2.11) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.11)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.11 - '@types/react-dom': 19.2.3(@types/react@19.2.11) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.11)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.11 - '@types/react-dom': 19.2.3(@types/react@19.2.11) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.11)(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.11 - '@types/react-dom': 19.2.3(@types/react@19.2.11) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-slot': 1.2.4(@types/react@19.2.11)(react@19.2.4) + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.11 - '@types/react-dom': 19.2.3(@types/react@19.2.11) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.11)(react@19.2.4) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.11 - '@types/react-dom': 19.2.3(@types/react@19.2.11) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.11)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.11 - '@types/react-dom': 19.2.3(@types/react@19.2.11) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) aria-hidden: 1.2.6 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - react-remove-scroll: 2.7.2(@types/react@19.2.11)(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.13)(react@19.2.4) optionalDependencies: - '@types/react': 19.2.11 - '@types/react-dom': 19.2.3(@types/react@19.2.11) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-separator@1.1.8(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-separator@1.1.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.11 - '@types/react-dom': 19.2.3(@types/react@19.2.11) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-slot@1.2.3(@types/react@19.2.11)(react@19.2.4)': + '@radix-ui/react-slot@1.2.3(@types/react@19.2.13)(react@19.2.4)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.11)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@radix-ui/react-slot@1.2.4(@types/react@19.2.11)(react@19.2.4)': + '@radix-ui/react-slot@1.2.4(@types/react@19.2.13)(react@19.2.4)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.11)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.11)(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.11 - '@types/react-dom': 19.2.3(@types/react@19.2.11) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.11 - '@types/react-dom': 19.2.3(@types/react@19.2.11) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.11)(react@19.2.4)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.13)(react@19.2.4)': dependencies: react: 19.2.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.11)(react@19.2.4)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.13)(react@19.2.4)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.11)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.11)(react@19.2.4) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.13)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.11)(react@19.2.4)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.13)(react@19.2.4)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.11)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.11)(react@19.2.4)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.13)(react@19.2.4)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.11)(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.11)(react@19.2.4)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.13)(react@19.2.4)': dependencies: react: 19.2.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.11)(react@19.2.4)': + '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.13)(react@19.2.4)': dependencies: react: 19.2.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.11)(react@19.2.4)': + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.13)(react@19.2.4)': dependencies: '@radix-ui/rect': 1.1.1 react: 19.2.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@radix-ui/react-use-size@1.1.1(@types/react@19.2.11)(react@19.2.4)': + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.13)(react@19.2.4)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.11)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.2.4) react: 19.2.4 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.11 - '@types/react-dom': 19.2.3(@types/react@19.2.11) + '@types/react': 19.2.13 + '@types/react-dom': 19.2.3(@types/react@19.2.13) '@radix-ui/rect@1.1.1': {} @@ -11697,9 +10078,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.46.2': optional: true - '@rtsao/scc@1.1.0': {} - - '@rushstack/node-core-library@5.11.0(@types/node@24.10.10)': + '@rushstack/node-core-library@5.11.0(@types/node@24.10.11)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -11710,23 +10089,23 @@ snapshots: resolve: 1.22.8 semver: 7.5.4 optionalDependencies: - '@types/node': 24.10.10 + '@types/node': 24.10.11 '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.8 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.15.0(@types/node@24.10.10)': + '@rushstack/terminal@0.15.0(@types/node@24.10.11)': dependencies: - '@rushstack/node-core-library': 5.11.0(@types/node@24.10.10) + '@rushstack/node-core-library': 5.11.0(@types/node@24.10.11) supports-color: 8.1.1 optionalDependencies: - '@types/node': 24.10.10 + '@types/node': 24.10.11 - '@rushstack/ts-command-line@4.23.5(@types/node@24.10.10)': + '@rushstack/ts-command-line@4.23.5(@types/node@24.10.11)': dependencies: - '@rushstack/terminal': 0.15.0(@types/node@24.10.10) + '@rushstack/terminal': 0.15.0(@types/node@24.10.11) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -11774,18 +10153,6 @@ snapshots: '@standard-schema/utils@0.3.0': {} - '@stylistic/eslint-plugin@2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.2(jiti@2.6.1) - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - estraverse: 5.3.0 - picomatch: 4.0.3 - transitivePeerDependencies: - - supports-color - - typescript - '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -12069,7 +10436,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.158.1(@tanstack/react-router@1.158.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1))': + '@tanstack/router-plugin@1.158.1(@tanstack/react-router@1.158.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) @@ -12086,7 +10453,7 @@ snapshots: zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.158.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -12224,14 +10591,9 @@ snapshots: tslib: 2.8.1 optional: true - '@tybys/wasm-util@0.9.0': - dependencies: - tslib: 2.8.1 - optional: true - '@types/adm-zip@0.5.7': dependencies: - '@types/node': 24.10.10 + '@types/node': 24.10.11 '@types/argparse@1.0.38': {} @@ -12392,7 +10754,7 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 24.10.10 + '@types/node': 24.10.11 '@types/geojson@7946.0.14': {} @@ -12406,11 +10768,9 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/json5@0.0.29': {} - '@types/jsonfile@6.1.4': dependencies: - '@types/node': 24.10.10 + '@types/node': 24.10.11 '@types/lodash-es@4.17.12': dependencies: @@ -12424,7 +10784,7 @@ snapshots: '@types/ms@0.7.34': {} - '@types/node@24.10.10': + '@types/node@24.10.11': dependencies: undici-types: 7.16.0 @@ -12440,15 +10800,15 @@ snapshots: '@types/prop-types@15.7.15': {} - '@types/react-dom@19.2.3(@types/react@19.2.11)': + '@types/react-dom@19.2.3(@types/react@19.2.13)': dependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@types/react-transition-group@4.4.12(@types/react@19.2.11)': + '@types/react-transition-group@4.4.12(@types/react@19.2.13)': dependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - '@types/react@19.2.11': + '@types/react@19.2.13': dependencies: csstype: 3.2.3 @@ -12466,148 +10826,6 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.54.0 - '@typescript-eslint/type-utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.54.0 - eslint: 9.39.2(jiti@2.6.1) - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.54.0 - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.54.0 - debug: 4.4.3 - eslint: 9.39.2(jiti@2.6.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.50.1(typescript@5.9.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.50.1(typescript@5.9.3) - '@typescript-eslint/types': 8.50.1 - debug: 4.4.3 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.54.0(typescript@5.9.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) - '@typescript-eslint/types': 8.54.0 - debug: 4.4.3 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@8.50.1': - dependencies: - '@typescript-eslint/types': 8.50.1 - '@typescript-eslint/visitor-keys': 8.50.1 - - '@typescript-eslint/scope-manager@8.54.0': - dependencies: - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/visitor-keys': 8.54.0 - - '@typescript-eslint/tsconfig-utils@8.50.1(typescript@5.9.3)': - dependencies: - typescript: 5.9.3 - - '@typescript-eslint/tsconfig-utils@8.54.0(typescript@5.9.3)': - dependencies: - typescript: 5.9.3 - - '@typescript-eslint/type-utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - debug: 4.4.3 - eslint: 9.39.2(jiti@2.6.1) - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@8.50.1': {} - - '@typescript-eslint/types@8.54.0': {} - - '@typescript-eslint/typescript-estree@8.50.1(typescript@5.9.3)': - dependencies: - '@typescript-eslint/project-service': 8.50.1(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.50.1(typescript@5.9.3) - '@typescript-eslint/types': 8.50.1 - '@typescript-eslint/visitor-keys': 8.50.1 - debug: 4.4.3 - minimatch: 9.0.5 - semver: 7.7.3 - tinyglobby: 0.2.15 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.54.0(typescript@5.9.3)': - dependencies: - '@typescript-eslint/project-service': 8.54.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/visitor-keys': 8.54.0 - debug: 4.4.3 - minimatch: 9.0.5 - semver: 7.7.3 - tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@eslint-community/eslint-utils': 4.8.0(eslint@9.39.2(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.50.1 - '@typescript-eslint/types': 8.50.1 - '@typescript-eslint/typescript-estree': 8.50.1(typescript@5.9.3) - eslint: 9.39.2(jiti@2.6.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.54.0 - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) - eslint: 9.39.2(jiti@2.6.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@8.50.1': - dependencies: - '@typescript-eslint/types': 8.50.1 - eslint-visitor-keys: 4.2.1 - - '@typescript-eslint/visitor-keys@8.54.0': - dependencies: - '@typescript-eslint/types': 8.54.0 - eslint-visitor-keys: 4.2.1 - '@uidotdev/usehooks@2.4.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: react: 19.2.4 @@ -12815,66 +11033,7 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@unrs/resolver-binding-android-arm-eabi@1.10.1': - optional: true - - '@unrs/resolver-binding-android-arm64@1.10.1': - optional: true - - '@unrs/resolver-binding-darwin-arm64@1.10.1': - optional: true - - '@unrs/resolver-binding-darwin-x64@1.10.1': - optional: true - - '@unrs/resolver-binding-freebsd-x64@1.10.1': - optional: true - - '@unrs/resolver-binding-linux-arm-gnueabihf@1.10.1': - optional: true - - '@unrs/resolver-binding-linux-arm-musleabihf@1.10.1': - optional: true - - '@unrs/resolver-binding-linux-arm64-gnu@1.10.1': - optional: true - - '@unrs/resolver-binding-linux-arm64-musl@1.10.1': - optional: true - - '@unrs/resolver-binding-linux-ppc64-gnu@1.10.1': - optional: true - - '@unrs/resolver-binding-linux-riscv64-gnu@1.10.1': - optional: true - - '@unrs/resolver-binding-linux-riscv64-musl@1.10.1': - optional: true - - '@unrs/resolver-binding-linux-s390x-gnu@1.10.1': - optional: true - - '@unrs/resolver-binding-linux-x64-gnu@1.10.1': - optional: true - - '@unrs/resolver-binding-linux-x64-musl@1.10.1': - optional: true - - '@unrs/resolver-binding-wasm32-wasi@1.10.1': - dependencies: - '@napi-rs/wasm-runtime': 0.2.11 - optional: true - - '@unrs/resolver-binding-win32-arm64-msvc@1.10.1': - optional: true - - '@unrs/resolver-binding-win32-ia32-msvc@1.10.1': - optional: true - - '@unrs/resolver-binding-win32-x64-msvc@1.10.1': - optional: true - - '@vitejs/plugin-legacy@7.2.1(terser@5.36.0)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1))': + '@vitejs/plugin-legacy@7.2.1(terser@5.36.0)(vite@7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.0) @@ -12889,19 +11048,19 @@ snapshots: regenerator-runtime: 0.14.1 systemjs: 6.15.1 terser: 5.36.0 - vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react-swc@4.2.3(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1))': + '@vitejs/plugin-react-swc@4.2.3(vite@7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.2 '@swc/core': 1.15.11 - vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@5.1.3(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1))': + '@vitejs/plugin-react@5.1.3(vite@7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -12909,7 +11068,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.2 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -12960,10 +11119,6 @@ snapshots: '@xobotyi/scrollbar-width@1.9.5': {} - acorn-jsx@5.3.2(acorn@8.15.0): - dependencies: - acorn: 8.15.0 - acorn@8.15.0: {} adm-zip@0.5.16: {} @@ -12991,13 +11146,6 @@ snapshots: optionalDependencies: ajv: 8.13.0 - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - ajv@8.12.0: dependencies: fast-deep-equal: 3.1.3 @@ -13063,111 +11211,12 @@ snapshots: dependencies: tslib: 2.8.1 - array-buffer-byte-length@1.0.1: - dependencies: - call-bind: 1.0.8 - is-array-buffer: 3.0.4 - - array-buffer-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - is-array-buffer: 3.0.5 - array-ify@1.0.0: {} - array-includes@3.1.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 - - array-includes@3.1.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - is-string: 1.1.1 - math-intrinsics: 1.1.0 - array-timsort@1.0.3: {} array-union@2.1.0: {} - array.prototype.findlast@1.2.5: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.7 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 - - array.prototype.findlastindex@1.2.6: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 - - array.prototype.flat@1.3.2: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.7 - es-shim-unscopables: 1.0.2 - - array.prototype.flat@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.7 - es-shim-unscopables: 1.0.2 - - array.prototype.flatmap@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.7 - es-shim-unscopables: 1.0.2 - - array.prototype.tosorted@1.1.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.7 - es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 - - arraybuffer.prototype.slice@1.0.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.7 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - - arraybuffer.prototype.slice@1.0.4: - dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.7 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.5 - ast-types@0.16.1: dependencies: tslib: 2.8.1 @@ -13189,10 +11238,6 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 - babel-dead-code-elimination@1.0.12: dependencies: '@babel/core': 7.29.0 @@ -13308,41 +11353,6 @@ snapshots: keyv: 5.5.5 qified: 0.5.3 - call-bind-apply-helpers@1.0.1: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - - call-bound@1.0.3: - dependencies: - call-bind-apply-helpers: 1.0.1 - get-intrinsic: 1.3.0 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - callsites@3.1.0: {} camel-case@4.1.2: @@ -13462,8 +11472,6 @@ snapshots: core-util-is: 1.0.3 esprima: 4.0.1 - comment-parser@1.4.1: {} - compare-func@2.0.0: dependencies: array-ify: 1.0.0 @@ -13523,9 +11531,9 @@ snapshots: core-util-is@1.0.3: {} - cosmiconfig-typescript-loader@6.1.0(@types/node@24.10.10)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3): + cosmiconfig-typescript-loader@6.1.0(@types/node@24.10.11)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3): dependencies: - '@types/node': 24.10.10 + '@types/node': 24.10.11 cosmiconfig: 9.0.0(typescript@5.9.3) jiti: 2.6.1 typescript: 5.9.3 @@ -13762,42 +11770,6 @@ snapshots: dargs@8.1.0: {} - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.8 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-buffer@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.8 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-offset@1.0.0: - dependencies: - call-bind: 1.0.8 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-offset@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - dayjs@1.11.19: {} de-indent@1.0.2: {} @@ -13806,10 +11778,6 @@ snapshots: dependencies: ms: 2.0.0 - debug@3.2.7: - dependencies: - ms: 2.1.3 - debug@4.3.7: dependencies: ms: 2.1.3 @@ -13834,22 +11802,8 @@ snapshots: optionalDependencies: babel-plugin-macros: 3.1.0 - deep-is@0.1.4: {} - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - define-lazy-prop@2.0.0: {} - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - delaunator@5.0.1: dependencies: robust-predicates: 3.0.2 @@ -13877,10 +11831,6 @@ snapshots: dependencies: path-type: 4.0.0 - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - dom-helpers@5.2.1: dependencies: '@babel/runtime': 7.28.4 @@ -13935,12 +11885,6 @@ snapshots: dotenv@16.4.5: {} - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - ejs@3.1.10: dependencies: jake: 10.9.2 @@ -13964,8 +11908,6 @@ snapshots: entities@4.5.0: {} - entities@6.0.0: {} - env-paths@2.2.1: {} environment@1.1.0: {} @@ -13983,230 +11925,6 @@ snapshots: dependencies: stackframe: 1.3.4 - es-abstract@1.23.3: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.2 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - - es-abstract@1.23.7: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-regex: 1.2.1 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.0 - math-intrinsics: 1.1.0 - object-inspect: 1.13.3 - object-keys: 1.1.1 - object.assign: 4.1.7 - regexp.prototype.flags: 1.5.3 - safe-array-concat: 1.1.3 - safe-regex-test: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.18 - - es-abstract@1.24.0: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-negative-zero: 2.0.3 - is-regex: 1.2.1 - is-set: 2.0.3 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.1 - math-intrinsics: 1.1.0 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.19 - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.3.0 - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-iterator-helpers@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.3 - define-properties: 1.2.1 - es-abstract: 1.23.7 - es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 - function-bind: 1.1.2 - get-intrinsic: 1.2.6 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - iterator.prototype: 1.1.4 - safe-array-concat: 1.1.3 - - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.0.3: - dependencies: - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-shim-unscopables@1.0.2: - dependencies: - hasown: 2.0.2 - - es-shim-unscopables@1.1.0: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - - es-to-primitive@1.3.0: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 - es5-ext@0.10.64: dependencies: es6-iterator: 2.0.3 @@ -14260,242 +11978,6 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.39.2(jiti@2.6.1)): - dependencies: - eslint: 9.39.2(jiti@2.6.1) - semver: 7.7.3 - - eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)): - dependencies: - eslint: 9.39.2(jiti@2.6.1) - - eslint-import-context@0.1.9(unrs-resolver@1.10.1): - dependencies: - get-tsconfig: 4.10.1 - stable-hash-x: 0.2.0 - optionalDependencies: - unrs-resolver: 1.10.1 - - eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))): - dependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)) - - eslint-import-resolver-node@0.3.9: - dependencies: - debug: 3.2.7 - is-core-module: 2.16.1 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)): - dependencies: - '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.3 - eslint: 9.39.2(jiti@2.6.1) - get-tsconfig: 4.10.1 - is-bun-module: 2.0.0 - stable-hash: 0.0.5 - tinyglobby: 0.2.14 - unrs-resolver: 1.10.1 - optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.2(jiti@2.6.1) - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - - eslint-plugin-es-x@7.8.0(eslint@9.39.2(jiti@2.6.1)): - dependencies: - '@eslint-community/eslint-utils': 4.8.0(eslint@9.39.2(jiti@2.6.1)) - '@eslint-community/regexpp': 4.12.1 - eslint: 9.39.2(jiti@2.6.1) - eslint-compat-utils: 0.5.1(eslint@9.39.2(jiti@2.6.1)) - - eslint-plugin-html@8.1.4: - dependencies: - htmlparser2: 10.0.0 - - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)): - dependencies: - '@typescript-eslint/types': 8.50.1 - comment-parser: 1.4.1 - debug: 4.4.3 - eslint: 9.39.2(jiti@2.6.1) - eslint-import-context: 0.1.9(unrs-resolver@1.10.1) - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.3 - stable-hash-x: 0.2.0 - unrs-resolver: 1.10.1 - optionalDependencies: - '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.9 - array.prototype.findlastindex: 1.2.6 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 9.39.2(jiti@2.6.1) - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)) - hasown: 2.0.2 - is-core-module: 2.16.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.9 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-n@17.23.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): - dependencies: - '@eslint-community/eslint-utils': 4.8.0(eslint@9.39.2(jiti@2.6.1)) - enhanced-resolve: 5.18.3 - eslint: 9.39.2(jiti@2.6.1) - eslint-plugin-es-x: 7.8.0(eslint@9.39.2(jiti@2.6.1)) - get-tsconfig: 4.10.1 - globals: 15.15.0 - globrex: 0.1.2 - ignore: 5.3.2 - semver: 7.7.3 - ts-declaration-location: 1.0.7(typescript@5.9.3) - transitivePeerDependencies: - - typescript - - eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))(prettier@3.8.1): - dependencies: - eslint: 9.39.2(jiti@2.6.1) - prettier: 3.8.1 - prettier-linter-helpers: 1.0.1 - synckit: 0.11.12 - optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@9.39.2(jiti@2.6.1)) - - eslint-plugin-promise@7.2.1(eslint@9.39.2(jiti@2.6.1)): - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.39.2(jiti@2.6.1)) - eslint: 9.39.2(jiti@2.6.1) - - eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.39.2(jiti@2.6.1)): - dependencies: - '@babel/core': 7.26.10 - '@babel/parser': 7.27.0 - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.26.10) - eslint: 9.39.2(jiti@2.6.1) - hermes-parser: 0.25.1 - zod: 3.24.4 - zod-validation-error: 3.3.1(zod@3.24.4) - transitivePeerDependencies: - - supports-color - - eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@2.6.1)): - dependencies: - '@babel/core': 7.28.4 - '@babel/parser': 7.28.4 - eslint: 9.39.2(jiti@2.6.1) - hermes-parser: 0.25.1 - zod: 4.1.12 - zod-validation-error: 4.0.2(zod@4.1.12) - transitivePeerDependencies: - - supports-color - - eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@2.6.1)): - dependencies: - array-includes: 3.1.8 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.3 - array.prototype.tosorted: 1.1.4 - doctrine: 2.1.0 - es-iterator-helpers: 1.2.1 - eslint: 9.39.2(jiti@2.6.1) - estraverse: 5.3.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.9 - object.fromentries: 2.0.8 - object.values: 1.2.1 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.12 - string.prototype.repeat: 1.0.0 - - eslint-scope@8.4.0: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint-visitor-keys@4.2.1: {} - - eslint@9.39.2(jiti@2.6.1): - dependencies: - '@eslint-community/eslint-utils': 4.8.0(eslint@9.39.2(jiti@2.6.1)) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.21.1 - '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.3 - '@eslint/js': 9.39.2 - '@eslint/plugin-kit': 0.4.1 - '@humanfs/node': 0.16.6 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.2 - '@types/estree': 1.0.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3 - escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - optionalDependencies: - jiti: 2.6.1 - transitivePeerDependencies: - - supports-color - esniff@2.0.1: dependencies: d: 1.0.2 @@ -14503,24 +11985,8 @@ snapshots: event-emitter: 0.3.5 type: 2.7.2 - espree@10.4.0: - dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 4.2.1 - esprima@4.0.1: {} - esquery@1.6.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@5.3.0: {} - estree-util-is-identifier-name@3.0.0: {} estree-walker@2.0.2: {} @@ -14552,8 +12018,6 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-diff@1.3.0: {} - fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -14570,10 +12034,6 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - fast-shallow-equal@1.0.0: {} fast-uri@3.0.1: {} @@ -14602,10 +12062,6 @@ snapshots: dependencies: flat-cache: 6.1.19 - file-entry-cache@8.0.0: - dependencies: - flat-cache: 4.0.1 - filelist@1.0.4: dependencies: minimatch: 5.1.6 @@ -14618,16 +12074,6 @@ snapshots: find-root@1.1.0: {} - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat-cache@4.0.1: - dependencies: - flatted: 3.3.3 - keyv: 4.5.4 - flat-cache@6.1.19: dependencies: cacheable: 2.3.1 @@ -14636,23 +12082,15 @@ snapshots: flatted@3.3.3: {} - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - - for-each@0.3.5: - dependencies: - is-callable: 1.2.7 - formatly@0.3.0: dependencies: fd-package-json: 2.0.0 fraction.js@5.3.4: {} - framer-motion@12.31.0(@emotion/is-prop-valid@1.3.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + framer-motion@12.33.0(@emotion/is-prop-valid@1.3.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - motion-dom: 12.30.1 + motion-dom: 12.33.0 motion-utils: 12.29.2 tslib: 2.8.1 optionalDependencies: @@ -14680,24 +12118,6 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.7 - functions-have-names: 1.2.3 - - function.prototype.name@1.1.8: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.2 - is-callable: 1.2.7 - - functions-have-names@1.2.3: {} - gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} @@ -14706,59 +12126,8 @@ snapshots: get-east-asian-width@1.4.0: {} - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - - get-intrinsic@1.2.6: - dependencies: - call-bind-apply-helpers: 1.0.1 - dunder-proto: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - get-nonce@1.0.1: {} - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - get-symbol-description@1.0.2: - dependencies: - call-bind: 1.0.8 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - - get-symbol-description@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -14773,10 +12142,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -14804,17 +12169,10 @@ snapshots: globals@11.12.0: optional: true - globals@14.0.0: {} - globals@15.15.0: {} globals@16.5.0: {} - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.2.0 - globby@11.1.0: dependencies: array-union: 2.1.0 @@ -14832,36 +12190,10 @@ snapshots: dependencies: csstype: 3.2.3 - gopd@1.0.1: - dependencies: - get-intrinsic: 1.3.0 - - gopd@1.2.0: {} - graceful-fs@4.2.11: {} - has-bigints@1.0.2: {} - has-flag@4.0.0: {} - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.1 - - has-proto@1.0.3: {} - - has-proto@1.2.0: - dependencies: - dunder-proto: 1.0.1 - - has-symbols@1.0.3: {} - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - hashery@1.3.0: dependencies: hookified: 1.14.0 @@ -14910,12 +12242,6 @@ snapshots: he@1.2.0: {} - hermes-estree@0.25.1: {} - - hermes-parser@0.25.1: - dependencies: - hermes-estree: 0.25.1 - highlight-words@2.0.0: {} hoist-non-react-statics@3.3.2: @@ -14944,13 +12270,6 @@ snapshots: html-void-elements@3.0.0: {} - htmlparser2@10.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - entities: 6.0.0 - htmlparser2@6.1.0: dependencies: domelementtype: 2.3.0 @@ -15033,18 +12352,6 @@ snapshots: dependencies: css-in-js-utils: 3.1.0 - internal-slot@1.0.7: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.1.0 - - internal-slot@1.1.0: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.1.0 - internmap@2.0.3: {} intersection-observer@0.12.2: {} @@ -15061,51 +12368,12 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - is-array-buffer@3.0.4: - dependencies: - call-bind: 1.0.8 - get-intrinsic: 1.3.0 - - is-array-buffer@3.0.5: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-arrayish@0.2.1: {} - is-async-function@2.0.0: - dependencies: - has-tostringtag: 1.0.2 - - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - - is-bigint@1.1.0: - dependencies: - has-bigints: 1.0.2 - is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.8 - has-tostringtag: 1.0.2 - - is-boolean-object@1.2.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-bun-module@2.0.0: - dependencies: - semver: 7.7.3 - - is-callable@1.2.7: {} - is-core-module@2.15.1: dependencies: hasown: 2.0.2 @@ -15114,66 +12382,26 @@ snapshots: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: - dependencies: - is-typed-array: 1.1.13 - - is-data-view@1.0.2: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-typed-array: 1.1.15 - - is-date-object@1.0.5: - dependencies: - has-tostringtag: 1.0.2 - - is-date-object@1.1.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-decimal@2.0.1: {} is-docker@2.2.1: {} is-extglob@2.1.1: {} - is-finalizationregistry@1.1.1: - dependencies: - call-bound: 1.0.4 - is-fullwidth-code-point@3.0.0: {} is-fullwidth-code-point@5.0.0: dependencies: get-east-asian-width: 1.4.0 - is-generator-function@1.0.10: - dependencies: - has-tostringtag: 1.0.2 - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 is-hexadecimal@2.0.1: {} - is-map@2.0.3: {} - - is-negative-zero@2.0.3: {} - is-network-error@1.1.0: {} - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - - is-number-object@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-number@7.0.0: {} is-obj@2.0.0: {} @@ -15182,99 +12410,20 @@ snapshots: is-plain-object@5.0.0: {} - is-regex@1.1.4: - dependencies: - call-bind: 1.0.8 - has-tostringtag: 1.0.2 - - is-regex@1.2.1: - dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.3: - dependencies: - call-bind: 1.0.8 - - is-shared-array-buffer@1.0.4: - dependencies: - call-bound: 1.0.4 - - is-string@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - - is-string@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-symbol@1.0.4: - dependencies: - has-symbols: 1.1.0 - - is-symbol@1.1.1: - dependencies: - call-bound: 1.0.4 - has-symbols: 1.1.0 - safe-regex-test: 1.1.0 - - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - - is-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.18 - is-typedarray@1.0.0: {} - is-weakmap@2.0.2: {} - - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.8 - - is-weakref@1.1.0: - dependencies: - call-bound: 1.0.4 - - is-weakref@1.1.1: - dependencies: - call-bound: 1.0.4 - - is-weakset@2.0.3: - dependencies: - call-bind: 1.0.8 - get-intrinsic: 1.3.0 - is-what@3.14.1: {} is-wsl@2.2.0: dependencies: is-docker: 2.2.1 - isarray@2.0.5: {} - isbot@5.1.28: {} isexe@2.0.0: {} isexe@3.1.1: {} - iterator.prototype@1.1.4: - dependencies: - define-data-property: 1.1.4 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - reflect.getprototypeof: 1.0.9 - set-function-name: 2.0.2 - jake@10.9.2: dependencies: async: 3.2.6 @@ -15289,11 +12438,11 @@ snapshots: jju@1.4.0: {} - jotai@2.16.1(@babel/core@7.29.0)(@babel/template@7.28.6)(@types/react@19.2.11)(react@19.2.4): + jotai@2.17.1(@babel/core@7.29.0)(@babel/template@7.28.6)(@types/react@19.2.13)(react@19.2.4): optionalDependencies: '@babel/core': 7.29.0 '@babel/template': 7.28.6 - '@types/react': 19.2.11 + '@types/react': 19.2.13 react: 19.2.4 js-cookie@2.2.1: {} @@ -15319,24 +12468,14 @@ snapshots: jsesc@3.1.0: {} - json-buffer@3.0.1: {} - json-parse-even-better-errors@2.3.1: {} json-parse-even-better-errors@4.0.0: {} - json-schema-traverse@0.4.1: {} - json-schema-traverse@1.0.0: {} json-schema@0.4.0: {} - json-stable-stringify-without-jsonify@1.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - json5@2.2.3: {} jsonc-parser@3.3.1: {} @@ -15347,27 +12486,16 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsx-ast-utils@3.3.5: - dependencies: - array-includes: 3.1.8 - array.prototype.flat: 1.3.2 - object.assign: 4.1.7 - object.values: 1.2.1 - - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - keyv@5.5.5: dependencies: '@keyv/serialize': 1.1.1 kind-of@6.0.3: {} - knip@5.83.0(@types/node@24.10.10)(typescript@5.9.3): + knip@5.83.0(@types/node@24.10.11)(typescript@5.9.3): dependencies: '@nodelib/fs.walk': 1.2.8 - '@types/node': 24.10.10 + '@types/node': 24.10.11 fast-glob: 3.3.3 formatly: 0.3.0 jiti: 2.6.1 @@ -15401,11 +12529,6 @@ snapshots: needle: 3.3.1 source-map: 0.6.1 - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - lightningcss-android-arm64@1.30.2: optional: true @@ -15490,10 +12613,6 @@ snapshots: pkg-types: 2.3.0 quansync: 0.2.11 - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - lodash-es@4.17.23: {} lodash.camelcase@4.3.0: {} @@ -15504,8 +12623,6 @@ snapshots: lodash.kebabcase@4.1.1: {} - lodash.merge@4.6.2: {} - lodash.mergewith@4.6.2: {} lodash.snakecase@4.1.1: {} @@ -15560,8 +12677,6 @@ snapshots: marked@14.0.0: {} - math-intrinsics@1.1.0: {} - mathml-tag-names@2.1.3: {} mdast-util-from-markdown@2.0.0: @@ -15888,7 +13003,7 @@ snapshots: vscode-uri: 3.0.8 yaml: 2.7.0 - motion-dom@12.30.1: + motion-dom@12.33.0: dependencies: motion-utils: 12.29.2 @@ -15900,16 +13015,16 @@ snapshots: muggle-string@0.4.1: {} - mui-color-input@7.0.0(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + mui-color-input@7.0.0(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: '@ctrl/tinycolor': 4.1.0 - '@emotion/react': 11.14.0(@types/react@19.2.11)(react@19.2.4) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4) - '@mui/material': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@emotion/react': 11.14.0(@types/react@19.2.13)(react@19.2.4) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4) + '@mui/material': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 nano-css@5.6.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: @@ -15930,37 +13045,12 @@ snapshots: nanoid@5.1.6: {} - napi-postinstall@0.3.0: {} - - natural-compare@1.4.0: {} - needle@3.3.1: dependencies: iconv-lite: 0.6.3 sax: 1.3.0 optional: true - neostandard@0.12.2(@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): - dependencies: - '@humanwhocodes/gitignore-to-minimatch': 1.0.2 - '@stylistic/eslint-plugin': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.2(jiti@2.6.1) - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-n: 17.23.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-promise: 7.2.1(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-react: 7.37.5(eslint@9.39.2(jiti@2.6.1)) - find-up: 5.0.0 - globals: 15.15.0 - peowly: 1.3.2 - typescript-eslint: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - transitivePeerDependencies: - - '@typescript-eslint/utils' - - eslint-import-resolver-node - - eslint-plugin-import - - supports-color - - typescript - next-tick@1.1.0: {} no-case@3.0.4: @@ -16009,57 +13099,6 @@ snapshots: object-assign@4.1.1: {} - object-inspect@1.13.2: {} - - object-inspect@1.13.3: {} - - object-inspect@1.13.4: {} - - object-keys@1.1.1: {} - - object.assign@4.1.5: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 - - object.assign@4.1.7: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 - - object.entries@1.1.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - object.fromentries@2.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.7 - es-object-atoms: 1.1.1 - - object.groupby@1.0.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.7 - - object.values@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - octokit@5.0.5: dependencies: '@octokit/app': 16.1.2 @@ -16100,21 +13139,6 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - - own-keys@1.0.1: - dependencies: - get-intrinsic: 1.3.0 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 - oxc-parser@0.99.0: dependencies: '@oxc-project/types': 0.99.0 @@ -16158,13 +13182,16 @@ snapshots: '@oxc-resolver/binding-win32-ia32-msvc': 11.16.1 '@oxc-resolver/binding-win32-x64-msvc': 11.16.1 - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 + oxlint@1.43.0: + optionalDependencies: + '@oxlint/darwin-arm64': 1.43.0 + '@oxlint/darwin-x64': 1.43.0 + '@oxlint/linux-arm64-gnu': 1.43.0 + '@oxlint/linux-arm64-musl': 1.43.0 + '@oxlint/linux-x64-gnu': 1.43.0 + '@oxlint/linux-x64-musl': 1.43.0 + '@oxlint/win32-arm64': 1.43.0 + '@oxlint/win32-x64': 1.43.0 p-retry@7.1.1: dependencies: @@ -16210,8 +13237,6 @@ snapshots: path-browserify@1.0.1: {} - path-exists@4.0.0: {} - path-is-absolute@1.0.1: optional: true @@ -16225,8 +13250,6 @@ snapshots: pathe@2.0.3: {} - peowly@1.3.2: {} - picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -16260,8 +13283,6 @@ snapshots: exsolve: 1.0.7 pathe: 2.0.3 - possible-typed-array-names@1.0.0: {} - postcss-html@1.8.1: dependencies: htmlparser2: 8.0.2 @@ -16347,12 +13368,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - prelude-ls@1.2.1: {} - - prettier-linter-helpers@1.0.1: - dependencies: - fast-diff: 1.3.0 - prettier-plugin-ember-template-tag@2.1.3(prettier@3.8.1): dependencies: '@babel/traverse': 7.28.5 @@ -16416,16 +13431,16 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - react-hook-form-mui@8.2.0(c04c42a37bf6e527fbeebf6281887bc0): + react-hook-form-mui@8.2.0(5eba25cbc188b715a2272e829a88aafa): dependencies: - '@mui/material': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@mui/material': 7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 - react-hook-form: 7.69.0(react@19.2.4) + react-hook-form: 7.71.1(react@19.2.4) optionalDependencies: - '@mui/icons-material': 7.3.7(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.11)(react@19.2.4) - '@mui/x-date-pickers': 8.27.0(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@mui/system@7.3.7(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(react@19.2.4))(@types/react@19.2.11)(dayjs@1.11.19)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@mui/icons-material': 7.3.7(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react@19.2.13)(react@19.2.4) + '@mui/x-date-pickers': 8.27.0(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@mui/material@7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@mui/system@7.3.7(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(react@19.2.4))(@types/react@19.2.13)(dayjs@1.11.19)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react-hook-form@7.69.0(react@19.2.4): + react-hook-form@7.71.1(react@19.2.4): dependencies: react: 19.2.4 @@ -16445,11 +13460,11 @@ snapshots: react-is@19.2.4: {} - react-markdown@10.1.0(@types/react@19.2.11)(react@19.2.4): + react-markdown@10.1.0(@types/react@19.2.13)(react@19.2.4): dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.3 - '@types/react': 19.2.11 + '@types/react': 19.2.13 devlop: 1.1.0 hast-util-to-jsx-runtime: 2.3.0 html-url-attributes: 3.0.0 @@ -16465,24 +13480,24 @@ snapshots: react-refresh@0.18.0: {} - react-remove-scroll-bar@2.3.8(@types/react@19.2.11)(react@19.2.4): + react-remove-scroll-bar@2.3.8(@types/react@19.2.13)(react@19.2.4): dependencies: react: 19.2.4 - react-style-singleton: 2.2.3(@types/react@19.2.11)(react@19.2.4) + react-style-singleton: 2.2.3(@types/react@19.2.13)(react@19.2.4) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - react-remove-scroll@2.7.2(@types/react@19.2.11)(react@19.2.4): + react-remove-scroll@2.7.2(@types/react@19.2.13)(react@19.2.4): dependencies: react: 19.2.4 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.11)(react@19.2.4) - react-style-singleton: 2.2.3(@types/react@19.2.11)(react@19.2.4) + react-remove-scroll-bar: 2.3.8(@types/react@19.2.13)(react@19.2.4) + react-style-singleton: 2.2.3(@types/react@19.2.13)(react@19.2.4) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.11)(react@19.2.4) - use-sidecar: 1.1.3(@types/react@19.2.11)(react@19.2.4) + use-callback-ref: 1.3.3(@types/react@19.2.13)(react@19.2.4) + use-sidecar: 1.1.3(@types/react@19.2.13)(react@19.2.4) optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 react-split-grid@1.0.4(react@19.2.4): dependencies: @@ -16490,13 +13505,13 @@ snapshots: react: 19.2.4 split-grid: 1.0.11 - react-style-singleton@2.2.3(@types/react@19.2.11)(react@19.2.4): + react-style-singleton@2.2.3(@types/react@19.2.13)(react@19.2.4): dependencies: get-nonce: 1.0.1 react: 19.2.4 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 react-transition-group@4.4.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: @@ -16558,17 +13573,6 @@ snapshots: tiny-invariant: 1.3.3 tslib: 2.8.1 - reflect.getprototypeof@1.0.9: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - dunder-proto: 1.0.1 - es-abstract: 1.23.7 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - which-builtin-type: 1.2.1 - regenerate-unicode-properties@10.2.0: dependencies: regenerate: 1.4.2 @@ -16587,29 +13591,6 @@ snapshots: dependencies: regex-utilities: 2.3.0 - regexp.prototype.flags@1.5.2: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - - regexp.prototype.flags@1.5.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - - regexp.prototype.flags@1.5.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-errors: 1.3.0 - get-proto: 1.0.1 - gopd: 1.2.0 - set-function-name: 2.0.2 - regexpu-core@6.2.0: dependencies: regenerate: 1.4.2 @@ -16674,12 +13655,6 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.5: - dependencies: - is-core-module: 2.15.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - restore-cursor@5.1.0: dependencies: onetime: 7.0.0 @@ -16740,38 +13715,6 @@ snapshots: dependencies: tslib: 2.8.1 - safe-array-concat@1.1.2: - dependencies: - call-bind: 1.0.8 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - isarray: 2.0.5 - - safe-array-concat@1.1.3: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - isarray: 2.0.5 - - safe-push-apply@1.0.0: - dependencies: - es-errors: 1.3.0 - isarray: 2.0.5 - - safe-regex-test@1.0.3: - dependencies: - call-bind: 1.0.8 - es-errors: 1.3.0 - is-regex: 1.1.4 - - safe-regex-test@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-regex: 1.2.1 - safer-buffer@2.1.2: {} sass-embedded-all-unknown@1.97.3: @@ -16898,36 +13841,16 @@ snapshots: semver@7.7.3: {} + semver@7.7.4: {} + seroval-plugins@1.4.2(seroval@1.4.2): dependencies: seroval: 1.4.2 seroval@1.4.2: {} - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - set-harmonic-interval@1.0.1: {} - set-proto@1.0.0: - dependencies: - dunder-proto: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -16947,34 +13870,6 @@ snapshots: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - side-channel-list@1.0.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.3 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.3 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.3 - side-channel-map: 1.0.1 - - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.3 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - signal-exit@4.1.0: {} slash@3.0.0: {} @@ -17043,10 +13938,6 @@ snapshots: '@sqlite.org/sqlite-wasm': 3.48.0-build4 kysely: 0.27.6 - stable-hash-x@0.2.0: {} - - stable-hash@0.0.5: {} - stack-generator@2.0.10: dependencies: stackframe: 1.3.4 @@ -17066,11 +13957,6 @@ snapshots: state-local@1.0.7: {} - stop-iteration-iterator@1.1.0: - dependencies: - es-errors: 1.3.0 - internal-slot: 1.1.0 - store2@2.14.3: {} string-argv@0.3.2: {} @@ -17092,57 +13978,6 @@ snapshots: get-east-asian-width: 1.4.0 strip-ansi: 7.1.0 - string.prototype.matchall@4.0.12: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.3 - define-properties: 1.2.1 - es-abstract: 1.23.7 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.6 - gopd: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - regexp.prototype.flags: 1.5.3 - set-function-name: 2.0.2 - side-channel: 1.1.0 - - string.prototype.repeat@1.0.0: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.23.7 - - string.prototype.trim@1.2.10: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-data-property: 1.1.4 - define-properties: 1.2.1 - es-abstract: 1.23.7 - es-object-atoms: 1.1.1 - has-property-descriptors: 1.0.2 - - string.prototype.trim@1.2.9: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.7 - es-object-atoms: 1.1.1 - - string.prototype.trimend@1.0.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 @@ -17302,10 +14137,6 @@ snapshots: sync-message-port@1.1.3: {} - synckit@0.11.12: - dependencies: - '@pkgr/core': 0.2.9 - systemjs@6.15.1: {} table@6.9.0: @@ -17367,11 +14198,6 @@ snapshots: tinyexec@1.0.1: {} - tinyglobby@0.2.14: - dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) @@ -17394,34 +14220,14 @@ snapshots: trough@2.2.0: {} - ts-api-utils@2.1.0(typescript@5.9.3): - dependencies: - typescript: 5.9.3 - - ts-api-utils@2.4.0(typescript@5.9.3): - dependencies: - typescript: 5.9.3 - ts-custom-error@3.3.1: {} - ts-declaration-location@1.0.7(typescript@5.9.3): - dependencies: - picomatch: 4.0.3 - typescript: 5.9.3 - ts-easing@0.2.0: {} tsconfck@3.0.3(typescript@5.9.3): optionalDependencies: typescript: 5.9.3 - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 @@ -17441,92 +14247,12 @@ snapshots: tunnel@0.0.6: {} - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - type@2.7.2: {} - typed-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.8 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - - typed-array-buffer@1.0.3: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-typed-array: 1.1.15 - - typed-array-byte-length@1.0.1: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.3 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.13 - - typed-array-byte-length@1.0.3: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.3 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - - typed-array-byte-offset@1.0.2: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.3 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.13 - - typed-array-byte-offset@1.0.4: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.3 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.9 - - typed-array-length@1.0.6: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.3 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - - typed-array-length@1.0.7: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.3 - gopd: 1.2.0 - is-typed-array: 1.1.15 - possible-typed-array-names: 1.0.0 - reflect.getprototypeof: 1.0.9 - typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 - typescript-eslint@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): - dependencies: - '@typescript-eslint/eslint-plugin': 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.2(jiti@2.6.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - typescript-plugin-css-modules@5.2.0(typescript@5.9.3): dependencies: '@types/postcss-modules-local-by-default': 4.0.2 @@ -17557,20 +14283,6 @@ snapshots: ufo@1.6.1: {} - unbox-primitive@1.0.2: - dependencies: - call-bind: 1.0.8 - has-bigints: 1.0.2 - has-symbols: 1.1.0 - which-boxed-primitive: 1.0.2 - - unbox-primitive@1.1.0: - dependencies: - call-bound: 1.0.4 - has-bigints: 1.0.2 - has-symbols: 1.1.0 - which-boxed-primitive: 1.1.1 - undici-types@7.16.0: {} undici@5.29.0: @@ -17693,30 +14405,6 @@ snapshots: picomatch: 4.0.3 webpack-virtual-modules: 0.6.2 - unrs-resolver@1.10.1: - dependencies: - napi-postinstall: 0.3.0 - optionalDependencies: - '@unrs/resolver-binding-android-arm-eabi': 1.10.1 - '@unrs/resolver-binding-android-arm64': 1.10.1 - '@unrs/resolver-binding-darwin-arm64': 1.10.1 - '@unrs/resolver-binding-darwin-x64': 1.10.1 - '@unrs/resolver-binding-freebsd-x64': 1.10.1 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.10.1 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.10.1 - '@unrs/resolver-binding-linux-arm64-gnu': 1.10.1 - '@unrs/resolver-binding-linux-arm64-musl': 1.10.1 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.10.1 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.10.1 - '@unrs/resolver-binding-linux-riscv64-musl': 1.10.1 - '@unrs/resolver-binding-linux-s390x-gnu': 1.10.1 - '@unrs/resolver-binding-linux-x64-gnu': 1.10.1 - '@unrs/resolver-binding-linux-x64-musl': 1.10.1 - '@unrs/resolver-binding-wasm32-wasi': 1.10.1 - '@unrs/resolver-binding-win32-arm64-msvc': 1.10.1 - '@unrs/resolver-binding-win32-ia32-msvc': 1.10.1 - '@unrs/resolver-binding-win32-x64-msvc': 1.10.1 - update-browserslist-db@1.1.3(browserslist@4.25.1): dependencies: browserslist: 4.25.1 @@ -17735,20 +14423,20 @@ snapshots: urlpattern-polyfill@10.1.0: {} - use-callback-ref@1.3.3(@types/react@19.2.11)(react@19.2.4): + use-callback-ref@1.3.3(@types/react@19.2.13)(react@19.2.4): dependencies: react: 19.2.4 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 - use-sidecar@1.1.3(@types/react@19.2.11)(react@19.2.4): + use-sidecar@1.1.3(@types/react@19.2.13)(react@19.2.4): dependencies: detect-node-es: 1.1.0 react: 19.2.4 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.11 + '@types/react': 19.2.13 use-sync-external-store@1.6.0(react@19.2.4): dependencies: @@ -17798,9 +14486,9 @@ snapshots: - rollup - supports-color - vite-plugin-dts@4.5.4(@types/node@24.10.10)(rollup@4.46.2)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-plugin-dts@4.5.4(@types/node@24.10.11)(rollup@4.46.2)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: - '@microsoft/api-extractor': 7.51.0(@types/node@24.10.10) + '@microsoft/api-extractor': 7.51.0(@types/node@24.10.11) '@rollup/pluginutils': 5.1.4(rollup@4.46.2) '@volar/typescript': 2.4.11 '@vue/language-core': 2.2.0(typescript@5.9.3) @@ -17811,13 +14499,13 @@ snapshots: magic-string: 0.30.17 typescript: 5.9.3 optionalDependencies: - vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-html@3.2.2(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-plugin-html@3.2.2(vite@7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: '@rollup/pluginutils': 4.2.1 colorette: 2.0.20 @@ -17831,39 +14519,39 @@ snapshots: html-minifier-terser: 6.1.0 node-html-parser: 5.4.2 pathe: 0.2.0 - vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1) - vite-plugin-sass-dts@1.3.35(postcss@8.5.6)(prettier@3.8.1)(sass-embedded@1.97.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-plugin-sass-dts@1.3.35(postcss@8.5.6)(prettier@3.8.1)(sass-embedded@1.97.3)(vite@7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: postcss: 8.5.6 postcss-js: 4.0.1(postcss@8.5.6) prettier: 3.8.1 sass-embedded: 1.97.3 - vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1) - vite-plugin-svgr@4.5.0(rollup@4.46.2)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-plugin-svgr@4.5.0(rollup@4.46.2)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: '@rollup/pluginutils': 5.2.0(rollup@4.46.2) '@svgr/core': 8.1.0(typescript@5.9.3) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3)) - vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - rollup - supports-color - typescript - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: debug: 4.3.7 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.9.3) optionalDependencies: - vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1): + vite@7.3.1(@types/node@24.10.11)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass-embedded@1.97.3)(sass@1.97.3)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.1): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) @@ -17872,7 +14560,7 @@ snapshots: rollup: 4.46.2 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.10.10 + '@types/node': 24.10.11 fsevents: 2.3.3 jiti: 2.6.1 less: 4.2.0 @@ -17914,72 +14602,6 @@ snapshots: transitivePeerDependencies: - supports-color - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.1.1 - is-symbol: 1.1.1 - - which-boxed-primitive@1.1.1: - dependencies: - is-bigint: 1.1.0 - is-boolean-object: 1.2.1 - is-number-object: 1.1.1 - is-string: 1.1.1 - is-symbol: 1.1.1 - - which-builtin-type@1.2.1: - dependencies: - call-bound: 1.0.4 - function.prototype.name: 1.1.8 - has-tostringtag: 1.0.2 - is-async-function: 2.0.0 - is-date-object: 1.1.0 - is-finalizationregistry: 1.1.1 - is-generator-function: 1.0.10 - is-regex: 1.2.1 - is-weakref: 1.1.0 - isarray: 2.0.5 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.18 - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.3 - - which-typed-array@1.1.15: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.3 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - - which-typed-array@1.1.18: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.3 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - - which-typed-array@1.1.19: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - which@1.3.1: dependencies: isexe: 2.0.0 @@ -17992,8 +14614,6 @@ snapshots: dependencies: isexe: 3.1.1 - word-wrap@1.2.5: {} - wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -18058,22 +14678,8 @@ snapshots: y18n: 5.0.8 yargs-parser: 22.0.0 - yocto-queue@0.1.0: {} - - zod-validation-error@3.3.1(zod@3.24.4): - dependencies: - zod: 3.24.4 - - zod-validation-error@4.0.2(zod@4.1.12): - dependencies: - zod: 4.1.12 - - zod@3.24.4: {} - zod@3.25.76: {} - zod@4.1.12: {} - zod@4.2.1: {} zwitch@2.0.4: {} diff --git a/clash-nyanpasu/scripts/package.json b/clash-nyanpasu/scripts/package.json index 17e382adf9..0fc607b1cb 100644 --- a/clash-nyanpasu/scripts/package.json +++ b/clash-nyanpasu/scripts/package.json @@ -9,7 +9,7 @@ "figlet": "1.10.0", "filesize": "11.0.13", "p-retry": "7.1.1", - "semver": "7.7.3", + "semver": "7.7.4", "zod": "4.2.1" }, "devDependencies": { diff --git a/lede/target/linux/qualcommax/patches-6.12/0600-1-qca-nss-ecm-support-CORE.patch b/lede/target/linux/qualcommax/patches-6.12/0600-1-qca-nss-ecm-support-CORE.patch index c02a930f88..9795bdd2a9 100644 --- a/lede/target/linux/qualcommax/patches-6.12/0600-1-qca-nss-ecm-support-CORE.patch +++ b/lede/target/linux/qualcommax/patches-6.12/0600-1-qca-nss-ecm-support-CORE.patch @@ -1,16 +1,16 @@ --- a/include/linux/if_bridge.h +++ b/include/linux/if_bridge.h -@@ -71,6 +71,9 @@ void brioctl_set(int (*hook)(struct net +@@ -68,6 +68,9 @@ struct net_bridge; + void brioctl_set(int (*hook)(struct net *net, unsigned int cmd, void __user *uarg)); - int br_ioctl_call(struct net *net, struct net_bridge *br, unsigned int cmd, - struct ifreq *ifr, void __user *uarg); + int br_ioctl_call(struct net *net, unsigned int cmd, void __user *uarg); +/* extern void br_dev_update_stats(struct net_device *dev, + struct rtnl_link_stats64 *nlstats); */ +extern bool br_is_hairpin_enabled(struct net_device *dev); - extern void br_dev_update_stats(struct net_device *dev, - struct rtnl_link_stats64 *nlstats); -@@ -216,4 +219,42 @@ static inline clock_t br_get_ageing_time + #if IS_ENABLED(CONFIG_BRIDGE) && IS_ENABLED(CONFIG_BRIDGE_IGMP_SNOOPING) + int br_multicast_list_adjacent(struct net_device *dev, +@@ -210,4 +213,42 @@ static inline clock_t br_get_ageing_time(const struct net_device *br_dev) } #endif @@ -81,7 +81,7 @@ return false; --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h -@@ -2907,6 +2907,10 @@ enum netdev_cmd { +@@ -2897,6 +2897,10 @@ enum netdev_cmd { NETDEV_OFFLOAD_XSTATS_REPORT_USED, NETDEV_OFFLOAD_XSTATS_REPORT_DELTA, NETDEV_XDP_FEAT_CHANGE, @@ -134,12 +134,6 @@ struct neigh_seq_state { struct seq_net_private p; struct neigh_table *tbl; -@@ -601,4 +613,5 @@ static inline void neigh_update_is_route - *notify = 1; - } - } -+ - #endif --- a/include/net/route.h +++ b/include/net/route.h @@ -246,6 +246,11 @@ struct rtable *rt_dst_alloc(struct net_d @@ -156,7 +150,7 @@ void fib_del_ifaddr(struct in_ifaddr *, struct in_ifaddr *); --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h -@@ -2304,4 +2304,6 @@ void br_do_suppress_nd(struct sk_buff *s +@@ -2311,4 +2311,6 @@ void br_do_suppress_nd(struct sk_buff *skb, struct net_bridge *br, u16 vid, struct net_bridge_port *p, struct nd_msg *msg); struct nd_msg *br_is_nd_neigh_msg(struct sk_buff *skb, struct nd_msg *m); bool br_is_neigh_suppress_enabled(const struct net_bridge_port *p, u16 vid); @@ -307,7 +301,7 @@ spin_unlock_bh(&br->hash_lock); } } -@@ -928,6 +985,12 @@ void br_fdb_update(struct net_bridge *br +@@ -932,6 +989,12 @@ void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source, */ if (unlikely(test_bit(BR_FDB_LOCKED, &fdb->flags))) clear_bit(BR_FDB_LOCKED, &fdb->flags); @@ -320,7 +314,7 @@ } if (unlikely(test_bit(BR_FDB_ADDED_BY_USER, &flags))) { -@@ -955,6 +1018,64 @@ void br_fdb_update(struct net_bridge *br +@@ -959,6 +1022,64 @@ void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source, } } @@ -400,7 +394,7 @@ /* * Determine initial path cost based on speed. * using recommendations from 802.1d standard -@@ -697,6 +703,8 @@ int br_add_if(struct net_bridge *br, str +@@ -698,6 +704,8 @@ int br_add_if(struct net_bridge *br, struct net_device *dev, kobject_uevent(&p->kobj, KOBJ_ADD); @@ -409,7 +403,7 @@ return 0; err6: -@@ -732,6 +740,8 @@ int br_del_if(struct net_bridge *br, str +@@ -733,6 +741,8 @@ int br_del_if(struct net_bridge *br, struct net_device *dev) if (!p || p->br != br) return -EINVAL; @@ -418,7 +412,7 @@ /* Since more than one interface can be attached to a bridge, * there still maybe an alternate path for netconsole to use; * therefore there is no reason for a NETDEV_RELEASE event. -@@ -797,3 +807,97 @@ bool br_port_flag_is_set(const struct ne +@@ -776,3 +786,97 @@ bool br_port_flag_is_set(const struct net_device *dev, unsigned long flag) return p->flags & flag; } EXPORT_SYMBOL_GPL(br_port_flag_is_set); @@ -620,7 +614,7 @@ fib_release_info(fa_to_delete->fa_info); alias_free_mem_rcu(fa_to_delete); return 0; -@@ -2386,6 +2395,20 @@ void __init fib_trie_init(void) +@@ -2387,6 +2396,20 @@ void __init fib_trie_init(void) 0, SLAB_PANIC | SLAB_ACCOUNT, NULL); } @@ -643,7 +637,7 @@ struct fib_table *tb; --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c -@@ -670,6 +670,7 @@ void ndisc_send_ns(struct net_device *de +@@ -672,6 +672,7 @@ void ndisc_send_ns(struct net_device *dev, const struct in6_addr *solicit, if (skb) ndisc_send_skb(skb, daddr, saddr); } @@ -653,7 +647,7 @@ const struct in6_addr *daddr) --- a/net/ipv6/route.c +++ b/net/ipv6/route.c -@@ -196,6 +196,9 @@ static void rt6_uncached_list_flush_dev( +@@ -194,6 +194,9 @@ static void rt6_uncached_list_flush_dev(struct net_device *dev) } } @@ -663,7 +657,7 @@ static inline const void *choose_neigh_daddr(const struct in6_addr *p, struct sk_buff *skb, const void *daddr) -@@ -3917,6 +3920,10 @@ int ip6_route_add(struct fib6_config *cf +@@ -3909,6 +3912,10 @@ int ip6_route_add(struct fib6_config *cfg, gfp_t gfp_flags, return PTR_ERR(rt); err = __ip6_ins_rt(rt, &cfg->fc_nlinfo, extack); @@ -674,7 +668,7 @@ fib6_info_release(rt); return err; -@@ -3938,6 +3945,9 @@ static int __ip6_del_rt(struct fib6_info +@@ -3930,6 +3937,9 @@ static int __ip6_del_rt(struct fib6_info *rt, struct nl_info *info) err = fib6_del(rt, info); spin_unlock_bh(&table->tb6_lock); @@ -684,7 +678,7 @@ out: fib6_info_release(rt); return err; -@@ -6409,6 +6419,20 @@ static int ip6_route_dev_notify(struct n +@@ -6390,6 +6400,20 @@ static int ip6_route_dev_notify(struct notifier_block *this, return NOTIFY_OK; } @@ -707,7 +701,7 @@ */ --- a/net/core/dev.c +++ b/net/core/dev.c -@@ -1768,6 +1768,7 @@ const char *netdev_cmd_to_name(enum netd +@@ -1750,6 +1750,7 @@ const char *netdev_cmd_to_name(enum netdev_cmd cmd) N(PRE_CHANGEADDR) N(OFFLOAD_XSTATS_ENABLE) N(OFFLOAD_XSTATS_DISABLE) N(OFFLOAD_XSTATS_REPORT_USED) N(OFFLOAD_XSTATS_REPORT_DELTA) N(XDP_FEAT_CHANGE) @@ -785,12 +779,12 @@ #endif /* _UAPI_LINUX_IN_H */ --- a/net/netfilter/nf_conntrack_ecache.c +++ b/net/netfilter/nf_conntrack_ecache.c -@@ -365,7 +365,7 @@ int nf_conntrack_register_notifier(struc +@@ -266,7 +266,7 @@ void nf_conntrack_register_notifier(struct net *net, mutex_lock(&nf_ct_ecache_mutex); notify = rcu_dereference_protected(net->ct.nf_conntrack_event_cb, lockdep_is_held(&nf_ct_ecache_mutex)); - WARN_ON_ONCE(notify); + /* WARN_ON_ONCE(notify); */ - if (notify != NULL) { - ret = -EBUSY; - goto out_unlock; + rcu_assign_pointer(net->ct.nf_conntrack_event_cb, new); + mutex_unlock(&nf_ct_ecache_mutex); + } diff --git a/mieru/Makefile b/mieru/Makefile index 29e7a6b38b..23e1d9c5d3 100644 --- a/mieru/Makefile +++ b/mieru/Makefile @@ -180,7 +180,7 @@ client-mac-arm64: # Build windows clients. .PHONY: client-windows -client-windows: client-windows-x86 client-windows-amd64 +client-windows: client-windows-x86 client-windows-amd64 client-windows-arm64 # Build windows x86 client. .PHONY: client-windows-x86 @@ -206,6 +206,18 @@ client-windows-amd64: mv mieru_${VERSION}_windows_amd64.zip ../../ mv mieru_${VERSION}_windows_amd64.zip.sha256.txt ../../ +# Build windows arm64 client. +.PHONY: client-windows-arm64 +client-windows-arm64: + mkdir -p release/windows/arm64 + env GOOS=windows GOARCH=arm64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o release/windows/arm64/mieru.exe cmd/mieru/mieru.go + cd release/windows/arm64 + sha256sum mieru.exe > mieru_${VERSION}_windows_arm64.exe.sha256.txt + zip -r mieru_${VERSION}_windows_arm64.zip mieru.exe + sha256sum mieru_${VERSION}_windows_arm64.zip > mieru_${VERSION}_windows_arm64.zip.sha256.txt + mv mieru_${VERSION}_windows_arm64.zip ../../ + mv mieru_${VERSION}_windows_arm64.zip.sha256.txt ../../ + # Build linux servers. .PHONY: server-linux server-linux: server-linux-amd64 server-linux-arm64 diff --git a/mieru/pkg/appctl/appctlcommon/client.go b/mieru/pkg/appctl/appctlcommon/client.go index a9fa796db2..85f9a032c2 100644 --- a/mieru/pkg/appctl/appctlcommon/client.go +++ b/mieru/pkg/appctl/appctlcommon/client.go @@ -29,20 +29,19 @@ import ( "github.com/enfein/mieru/v3/pkg/stderror" ) -// ValidateClientConfigSingleProfile validates -// a single client config profile. +// ValidateClientConfigSingleProfile validates a single client config profile. // -// It validates -// 1. profile name is not empty -// 2. user name is not empty -// 3. user has either a password or a hashed password -// 4. user has no quota -// 5. it has at least 1 server, and for each server -// 5.1. the server has either IP address or domain name -// 5.2. if set, server's IP address is parsable -// 5.3. the server has at least 1 port binding, and all port bindings are valid -// 6. if set, MTU is valid -// 7. if set, traffic pattern is valid +// It validates: +// - profile name is not empty +// - user name is not empty +// - user has either a password or a hashed password +// - user has no quota +// - it has at least 1 server, and for each server: +// 1. the server has either IP address or domain name +// 2. if set, server's IP address is parsable +// 3. the server has at least 1 port binding, and all port bindings are valid +// - if set, MTU is valid +// - if set, traffic pattern is valid func ValidateClientConfigSingleProfile(profile *pb.ClientProfile) error { name := profile.GetProfileName() if name == "" { diff --git a/mieru/pkg/appctl/appctlcommon/server.go b/mieru/pkg/appctl/appctlcommon/server.go index c1a154cce8..c901a7c7f4 100644 --- a/mieru/pkg/appctl/appctlcommon/server.go +++ b/mieru/pkg/appctl/appctlcommon/server.go @@ -21,15 +21,14 @@ import ( pb "github.com/enfein/mieru/v3/pkg/appctl/appctlpb" ) -// ValidateServerConfigSingleUser validates -// a single server config user. +// ValidateServerConfigSingleUser validates a single server config user. // -// It validates -// 1. user name is not empty -// 2. user has either a password or a hashed password -// 3. for each quota -// 3.1. number of days is valid -// 3.2. traffic volume in megabyte is valid +// It validates: +// - user name is not empty +// - user has either a password or a hashed password +// - for each quota: +// 1. number of days is valid +// 2. traffic volume in megabyte is valid func ValidateServerConfigSingleUser(user *pb.User) error { if user.GetName() == "" { return fmt.Errorf("user name is not set") diff --git a/mieru/pkg/trafficpattern/config.go b/mieru/pkg/trafficpattern/config.go new file mode 100644 index 0000000000..405b62cbd9 --- /dev/null +++ b/mieru/pkg/trafficpattern/config.go @@ -0,0 +1,121 @@ +// Copyright (C) 2026 mieru authors +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +package trafficpattern + +import ( + "fmt" + "math" + + "github.com/enfein/mieru/v3/pkg/appctl/appctlpb" + "github.com/enfein/mieru/v3/pkg/rng" + "google.golang.org/protobuf/proto" +) + +// Config stores the traffic pattern configuration. +type Config struct { + origin *appctlpb.TrafficPattern + effective *appctlpb.TrafficPattern +} + +// NewConfig creates a new traffic pattern configuration from a protobuf message. +// Assume the origin protobuf message is valid. +func NewConfig(origin *appctlpb.TrafficPattern) *Config { + if origin == nil { + panic("TrafficPattern is nil") + } + c := &Config{ + origin: origin, + effective: proto.Clone(origin).(*appctlpb.TrafficPattern), + } + c.generateImplicitTrafficPattern() + return c +} + +func (c *Config) generateImplicitTrafficPattern() { + seed := int(c.origin.GetSeed()) + if c.origin.Seed == nil { + seed = rng.FixedIntVH(math.MaxInt32) + } + unlockAll := c.origin.GetUnlockAll() + c.generateTCPFragment(seed, unlockAll) + c.generateNoncePattern(seed, unlockAll) +} + +func (c *Config) generateTCPFragment(seed int, unlockAll bool) { + if c.effective.TcpFragment == nil { + c.effective.TcpFragment = &appctlpb.TCPFragment{} + } + f := c.effective.TcpFragment + + if c.origin.TcpFragment == nil || c.origin.TcpFragment.Enable == nil { + if unlockAll { + f.Enable = proto.Bool(rng.FixedInt(2, fmt.Sprintf("%d:tcpFragment.enable", seed)) == 1) + } else { + f.Enable = proto.Bool(false) + } + } + + if c.origin.TcpFragment == nil || c.origin.TcpFragment.MaxSleepMs == nil { + maxRange := 100 + // Generate a random number in [1, 100] + f.MaxSleepMs = proto.Int32(int32(rng.FixedInt(maxRange, fmt.Sprintf("%d:tcpFragment.maxSleepMs", seed))) + 1) + } +} + +func (c *Config) generateNoncePattern(seed int, unlockAll bool) { + if c.effective.Nonce == nil { + c.effective.Nonce = &appctlpb.NoncePattern{} + } + n := c.effective.Nonce + + if c.origin.Nonce == nil || c.origin.Nonce.Type == nil { + // Never generate NONCE_TYPE_FIXED (3) since it requires customHexStrings. + if unlockAll { + // Generate a random number in [0, 2] + typeRange := 3 + n.Type = appctlpb.NonceType(rng.FixedInt(typeRange, fmt.Sprintf("%d:nonce.type", seed))).Enum() + } else { + // Generate a random number in [1, 2] + typeRange := 2 + n.Type = appctlpb.NonceType(rng.FixedInt(typeRange, fmt.Sprintf("%d:nonce.type", seed)) + 1).Enum() + } + } + + if c.origin.Nonce == nil || c.origin.Nonce.ApplyToAllUDPPacket == nil { + if unlockAll { + n.ApplyToAllUDPPacket = proto.Bool(rng.FixedInt(2, fmt.Sprintf("%d:nonce.applyToAllUDPPacket", seed)) == 1) + } else { + n.ApplyToAllUDPPacket = proto.Bool(false) + } + } + + if c.origin.Nonce == nil || c.origin.Nonce.MinLen == nil { + if unlockAll { + // Generate a random number in [0, 12] + minRange := 13 + n.MinLen = proto.Int32(int32(rng.FixedInt(minRange, fmt.Sprintf("%d:nonce.minLen", seed)))) + } else { + // Generate a random number in [6, 12] + minRange := 7 + n.MinLen = proto.Int32(int32(rng.FixedInt(minRange, fmt.Sprintf("%d:nonce.minLen", seed))) + 6) + } + } + + if c.origin.Nonce == nil || c.origin.Nonce.MaxLen == nil { + minLen := int(n.GetMinLen()) + n.MaxLen = proto.Int32(int32(minLen + rng.FixedInt(13-minLen, fmt.Sprintf("%d:nonce.maxLen", seed)))) + } +} diff --git a/mieru/pkg/trafficpattern/config_test.go b/mieru/pkg/trafficpattern/config_test.go new file mode 100644 index 0000000000..88131232f3 --- /dev/null +++ b/mieru/pkg/trafficpattern/config_test.go @@ -0,0 +1,211 @@ +// Copyright (C) 2026 mieru authors +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +package trafficpattern + +import ( + mrand "math/rand" + "testing" + + "github.com/enfein/mieru/v3/pkg/appctl/appctlpb" + "google.golang.org/protobuf/proto" +) + +func TestExplicitValuesPreserved(t *testing.T) { + origin := &appctlpb.TrafficPattern{ + Seed: proto.Int32(12345), + UnlockAll: proto.Bool(true), + TcpFragment: &appctlpb.TCPFragment{ + Enable: proto.Bool(true), + MaxSleepMs: proto.Int32(50), + }, + Nonce: &appctlpb.NoncePattern{ + Type: appctlpb.NonceType_NONCE_TYPE_PRINTABLE.Enum(), + ApplyToAllUDPPacket: proto.Bool(true), + MinLen: proto.Int32(5), + MaxLen: proto.Int32(10), + }, + } + + cfg := NewConfig(origin) + + if cfg.effective.GetSeed() != 12345 { + t.Errorf("expected seed 12345, got %d", cfg.effective.GetSeed()) + } + if cfg.effective.GetUnlockAll() != true { + t.Errorf("expected unlockAll true, got %v", cfg.effective.GetUnlockAll()) + } + if cfg.effective.TcpFragment.GetEnable() != true { + t.Errorf("expected tcpFragment.enable true, got %v", cfg.effective.TcpFragment.GetEnable()) + } + if cfg.effective.TcpFragment.GetMaxSleepMs() != 50 { + t.Errorf("expected tcpFragment.maxSleepMs 50, got %d", cfg.effective.TcpFragment.GetMaxSleepMs()) + } + if cfg.effective.Nonce.GetType() != appctlpb.NonceType_NONCE_TYPE_PRINTABLE { + t.Errorf("expected nonce.type PRINTABLE, got %v", cfg.effective.Nonce.GetType()) + } + if cfg.effective.Nonce.GetApplyToAllUDPPacket() != true { + t.Errorf("expected nonce.applyToAllUDPPacket true, got %v", cfg.effective.Nonce.GetApplyToAllUDPPacket()) + } + if cfg.effective.Nonce.GetMinLen() != 5 { + t.Errorf("expected nonce.minLen 5, got %d", cfg.effective.Nonce.GetMinLen()) + } + if cfg.effective.Nonce.GetMaxLen() != 10 { + t.Errorf("expected nonce.maxLen 10, got %d", cfg.effective.Nonce.GetMaxLen()) + } +} + +func TestImplicitValuesGenerated(t *testing.T) { + origin := &appctlpb.TrafficPattern{} + + cfg := NewConfig(origin) + + // TCPFragment should be initialized + if cfg.effective.TcpFragment == nil { + t.Fatal("expected tcpFragment to be initialized") + } + if cfg.effective.TcpFragment.Enable == nil { + t.Error("expected tcpFragment.enable to be generated") + } + if cfg.effective.TcpFragment.MaxSleepMs == nil { + t.Error("expected tcpFragment.maxSleepMs to be generated") + } + + // NoncePattern should be initialized + if cfg.effective.Nonce == nil { + t.Fatal("expected nonce to be initialized") + } + if cfg.effective.Nonce.Type == nil { + t.Error("expected nonce.type to be generated") + } + if cfg.effective.Nonce.ApplyToAllUDPPacket == nil { + t.Error("expected nonce.applyToAllUDPPacket to be generated") + } + if cfg.effective.Nonce.MinLen == nil { + t.Error("expected nonce.minLen to be generated") + } + if cfg.effective.Nonce.MaxLen == nil { + t.Error("expected nonce.maxLen to be generated") + } +} + +func TestPartialTCPFragmentPreserved(t *testing.T) { + // When only some TCPFragment fields are set, preserve those and generate others + origin := &appctlpb.TrafficPattern{ + Seed: proto.Int32(42), + TcpFragment: &appctlpb.TCPFragment{ + Enable: proto.Bool(true), + // MaxSleepMs not set + }, + } + + cfg := NewConfig(origin) + + // Enable should be preserved + if cfg.effective.TcpFragment.GetEnable() != true { + t.Errorf("expected tcpFragment.enable to be preserved as true, got %v", cfg.effective.TcpFragment.GetEnable()) + } + + // MaxSleepMs should be generated + if cfg.effective.TcpFragment.MaxSleepMs == nil { + t.Error("expected tcpFragment.maxSleepMs to be generated") + } +} + +func TestPartialNoncePatternPreserved(t *testing.T) { + // When only some NoncePattern fields are set, preserve those and generate others + origin := &appctlpb.TrafficPattern{ + Seed: proto.Int32(42), + Nonce: &appctlpb.NoncePattern{ + Type: appctlpb.NonceType_NONCE_TYPE_PRINTABLE_SUBSET.Enum(), + // Other fields not set + }, + } + + cfg := NewConfig(origin) + + // Type should be preserved + if cfg.effective.Nonce.GetType() != appctlpb.NonceType_NONCE_TYPE_PRINTABLE_SUBSET { + t.Errorf("expected nonce.type to be preserved as PRINTABLE_SUBSET, got %v", cfg.effective.Nonce.GetType()) + } + + // Other fields should be generated + if cfg.effective.Nonce.ApplyToAllUDPPacket == nil { + t.Error("expected nonce.applyToAllUDPPacket to be generated") + } + if cfg.effective.Nonce.MinLen == nil { + t.Error("expected nonce.minLen to be generated") + } + if cfg.effective.Nonce.MaxLen == nil { + t.Error("expected nonce.maxLen to be generated") + } +} + +func TestDeterministicGeneration(t *testing.T) { + origin := &appctlpb.TrafficPattern{} + + cfg1 := NewConfig(origin) + cfg2 := NewConfig(origin) + + if cfg1.effective.TcpFragment.GetEnable() != cfg2.effective.TcpFragment.GetEnable() { + t.Error("tcpFragment.enable should be deterministic") + } + if cfg1.effective.TcpFragment.GetMaxSleepMs() != cfg2.effective.TcpFragment.GetMaxSleepMs() { + t.Error("tcpFragment.maxSleepMs should be deterministic") + } + if cfg1.effective.Nonce.GetType() != cfg2.effective.Nonce.GetType() { + t.Error("nonce.type should be deterministic") + } + if cfg1.effective.Nonce.GetApplyToAllUDPPacket() != cfg2.effective.Nonce.GetApplyToAllUDPPacket() { + t.Error("nonce.applyToAllUDPPacket should be deterministic") + } + if cfg1.effective.Nonce.GetMinLen() != cfg2.effective.Nonce.GetMinLen() { + t.Error("nonce.minLen should be deterministic") + } + if cfg1.effective.Nonce.GetMaxLen() != cfg2.effective.Nonce.GetMaxLen() { + t.Error("nonce.maxLen should be deterministic") + } +} + +func TestMinLenMaxLen(t *testing.T) { + testSeeds := make([]int32, 100) + for i := 0; i < 100; i++ { + testSeeds[i] = mrand.Int31() + } + + for _, seed := range testSeeds { + for _, unlockAll := range []bool{false, true} { + origin := &appctlpb.TrafficPattern{ + Seed: proto.Int32(seed), + UnlockAll: proto.Bool(unlockAll), + } + + cfg := NewConfig(origin) + + minLen := cfg.effective.Nonce.GetMinLen() + maxLen := cfg.effective.Nonce.GetMaxLen() + + if minLen < 0 || minLen > 12 { + t.Errorf("seed=%d, unlockAll=%v: minLen (%d) is out of range [0, 12]", seed, unlockAll, minLen) + } + if maxLen < 0 || maxLen > 12 { + t.Errorf("seed=%d, unlockAll=%v: maxLen (%d) is out of range [0, 12]", seed, unlockAll, maxLen) + } + if minLen > maxLen { + t.Errorf("seed=%d, unlockAll=%v: minLen (%d) > maxLen (%d)", seed, unlockAll, minLen, maxLen) + } + } + } +} diff --git a/openwrt-passwall/luci-app-passwall/Makefile b/openwrt-passwall/luci-app-passwall/Makefile index 33aa4251da..e0587f2ff0 100644 --- a/openwrt-passwall/luci-app-passwall/Makefile +++ b/openwrt-passwall/luci-app-passwall/Makefile @@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall -PKG_VERSION:=26.1.30 +PKG_VERSION:=26.2.6 PKG_RELEASE:=1 PKG_PO_VERSION:=$(PKG_VERSION) diff --git a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe_config.lua b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe_config.lua index b3a24812fc..90b5f81e2e 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe_config.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe_config.lua @@ -259,7 +259,6 @@ o:value("1", translate("Preproxy Node")) o:value("2", translate("Landing Node")) local descrStr = "Chained proxy works only with Xray or Sing-box nodes.
" -descrStr = descrStr .. "The chained node must be the same type as your subscription node (Xray with Xray, Sing-box with Sing-box).
" descrStr = descrStr .. "You can only use manual or imported nodes as chained nodes." descrStr = translate(descrStr) .. "
" .. translate("Only support a layer of proxy.") diff --git a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua index ed1af33d5a..d2c1cc2ff0 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua @@ -732,7 +732,7 @@ o2.template = appname .. "/cbi/nodes_listvalue" o2.group = {} for k, v in pairs(nodes_list) do - if v.type == "Xray" and v.id ~= arg[1] and (not v.chain_proxy or v.chain_proxy == "") then + if v.id ~= arg[1] and (not v.chain_proxy or v.chain_proxy == "") then o1:value(v.id, v.remark) o1.group[#o1.group+1] = (v.group and v.group ~= "") and v.group or translate("default") o2:value(v.id, v.remark) diff --git a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua index 5188bb0c3d..91f964815a 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua @@ -778,7 +778,7 @@ o2.template = appname .. "/cbi/nodes_listvalue" o2.group = {} for k, v in pairs(nodes_list) do - if v.type == "sing-box" and v.id ~= arg[1] and (not v.chain_proxy or v.chain_proxy == "") then + if v.id ~= arg[1] and (not v.chain_proxy or v.chain_proxy == "") then o1:value(v.id, v.remark) o1.group[#o1.group+1] = (v.group and v.group ~= "") and v.group or translate("default") o2:value(v.id, v.remark) diff --git a/openwrt-passwall/luci-app-passwall/luasrc/passwall/util_sing-box.lua b/openwrt-passwall/luci-app-passwall/luasrc/passwall/util_sing-box.lua index da70b0a271..3816d7b902 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/passwall/util_sing-box.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/passwall/util_sing-box.lua @@ -1191,9 +1191,12 @@ function gen_config(var) else local preproxy_node = uci:get_all(appname, node.preproxy_node) if preproxy_node then - local preproxy_outbound = gen_outbound(nil, preproxy_node) + local preproxy_outbound = gen_outbound(node[".name"], preproxy_node) if preproxy_outbound then - preproxy_outbound.tag = preproxy_node[".name"] .. ":" .. preproxy_node.remarks + preproxy_outbound.tag = preproxy_node[".name"] + if preproxy_node.remarks then + preproxy_outbound.tag = preproxy_outbound.tag .. ":" .. preproxy_node.remarks + end outbound.tag = preproxy_outbound.tag .. " -> " .. outbound.tag outbound.detour = preproxy_outbound.tag last_insert_outbound = preproxy_outbound @@ -1205,16 +1208,47 @@ function gen_config(var) if node.chain_proxy == "2" and node.to_node then local to_node = uci:get_all(appname, node.to_node) if to_node then - local to_outbound = gen_outbound(nil, to_node) + local to_outbound + if to_node.type ~= "sing-box" then + local tag = to_node[".name"] + local new_port = api.get_new_port() + table.insert(inbounds, { + type = "direct", + tag = tag, + listen = "127.0.0.1", + listen_port = new_port, + override_address = to_node.address, + override_port = tonumber(to_node.port), + }) + table.insert(rules, 1, { + inbound = {tag}, + outbound = outbound.tag, + }) + if to_node.tls_serverName == nil then + to_node.tls_serverName = to_node.address + end + to_node.address = "127.0.0.1" + to_node.port = new_port + to_outbound = gen_outbound(node[".name"], to_node, tag, { + tag = tag, + run_socks_instance = not no_run + }) + else + to_outbound = gen_outbound(node[".name"], to_node) + end if to_outbound then if shunt_rule_name then to_outbound.tag = outbound.tag outbound.tag = node[".name"] else + if to_node.remarks then + to_outbound.tag = to_outbound.tag .. ":" .. to_node.remarks + end to_outbound.tag = outbound.tag .. " -> " .. to_outbound.tag end - - to_outbound.detour = outbound.tag + if to_node.type == "sing-box" then + to_outbound.detour = outbound.tag + end table.insert(outbounds_table, to_outbound) default_outTag = to_outbound.tag end @@ -1223,9 +1257,9 @@ function gen_config(var) return default_outTag, last_insert_outbound end - if node.protocol == "_shunt" then - local rules = {} + rules = {} + if node.protocol == "_shunt" then local preproxy_rule_name = node.preproxy_enabled == "1" and "main" or nil local preproxy_tag = preproxy_rule_name local preproxy_node_id = preproxy_rule_name and node["main_node"] or nil @@ -1544,10 +1578,6 @@ function gen_config(var) table.insert(rules, rule) end end) - - for index, value in ipairs(rules) do - table.insert(route.rules, rules[index]) - end elseif node.protocol == "_urltest" then if node.urltest_node then COMMON.default_outbound_tag = gen_urltest(node) @@ -1575,6 +1605,10 @@ function gen_config(var) end end end + + for index, value in ipairs(rules) do + table.insert(route.rules, rules[index]) + end end if COMMON.default_outbound_tag then diff --git a/openwrt-passwall/luci-app-passwall/luasrc/passwall/util_xray.lua b/openwrt-passwall/luci-app-passwall/luasrc/passwall/util_xray.lua index f535a053c3..41218f2b9c 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/passwall/util_xray.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/passwall/util_xray.lua @@ -937,9 +937,12 @@ function gen_config(var) else local preproxy_node = uci:get_all(appname, node.preproxy_node) if preproxy_node then - local preproxy_outbound = gen_outbound(nil, preproxy_node) + local preproxy_outbound = gen_outbound(node[".name"], preproxy_node) if preproxy_outbound then - preproxy_outbound.tag = preproxy_node[".name"] .. ":" .. preproxy_node.remarks + preproxy_outbound.tag = preproxy_node[".name"] + if preproxy_node.remarks then + preproxy_outbound.tag = preproxy_outbound.tag .. ":" .. preproxy_node.remarks + end outbound.tag = preproxy_outbound.tag .. " -> " .. outbound.tag outbound.proxySettings = { tag = preproxy_outbound.tag, @@ -954,19 +957,49 @@ function gen_config(var) if node.chain_proxy == "2" and node.to_node then local to_node = uci:get_all(appname, node.to_node) if to_node then - local to_outbound = gen_outbound(nil, to_node) + local to_outbound + if to_node.type ~= "Xray" then + local tag = to_node[".name"] + local new_port = api.get_new_port() + table.insert(inbounds, { + tag = tag, + listen = "127.0.0.1", + port = new_port, + protocol = "dokodemo-door", + settings = {network = "tcp,udp", address = to_node.address, port = tonumber(to_node.port)} + }) + if to_node.tls_serverName == nil then + to_node.tls_serverName = to_node.address + end + to_node.address = "127.0.0.1" + to_node.port = new_port + table.insert(rules, 1, { + inboundTag = {tag}, + outboundTag = outbound.tag + }) + to_outbound = gen_outbound(node[".name"], to_node, tag, { + tag = tag, + run_socks_instance = not no_run + }) + else + to_outbound = gen_outbound(node[".name"], to_node) + end if to_outbound then if shunt_rule_name then to_outbound.tag = outbound.tag outbound.tag = node[".name"] else + if to_node.remarks then + to_outbound.tag = to_outbound.tag .. ":" .. to_node.remarks + end to_outbound.tag = outbound.tag .. " -> " .. to_outbound.tag end - - to_outbound.proxySettings = { - tag = outbound.tag, - transportLayer = true - } + if to_node.type == "Xray" then + to_outbound.proxySettings = { + tag = outbound.tag, + transportLayer = true + } + end table.insert(outbounds_table, to_outbound) default_outTag = to_outbound.tag end @@ -1308,7 +1341,7 @@ function gen_config(var) routing = { domainStrategy = "AsIs", domainMatcher = "hybrid", - rules = {} + rules = rules } table.insert(routing.rules, { ruleTag = "default", diff --git a/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/cbi/nodes_listvalue_com.htm b/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/cbi/nodes_listvalue_com.htm index e2ec33b464..9de708e5f7 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/cbi/nodes_listvalue_com.htm +++ b/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/cbi/nodes_listvalue_com.htm @@ -161,49 +161,31 @@ return cssRules.filter(Boolean).join(' ') } - function lv_parseColorToRgba(color) { - if (!color) return null; - - const ctx = document.createElement('canvas').getContext('2d'); - if (!ctx) return null; - - ctx.fillStyle = color; - const computedColor = ctx.fillStyle; - // Match #RRGGBB or #RRGGBBAA format - if (computedColor.startsWith('#')) { - const hex = computedColor.substring(1); - // #RRGGBB (6 digits) - if (hex.length === 6) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: 1 - }; - } - // #RRGGBBAA (8 digits) - if (hex.length === 8) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: parseInt(hex.substring(6, 8), 16) / 255 - }; - } - } - // Match rgba() or rgb() format (for browsers that return this format) - const rgbaMatch = computedColor.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)$/); - if (rgbaMatch) { - return { - r: parseInt(rgbaMatch[1], 10), - g: parseInt(rgbaMatch[2], 10), - b: parseInt(rgbaMatch[3], 10), - a: rgbaMatch[4] !== undefined ? parseFloat(rgbaMatch[4]) : 1 - }; - } - - return null; // Invalid color - } + const lv_parseColorToRgba = (function() { + // Create canvas and context once (Closure) + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d', { willReadFrequently: true }); + return function(colorStr) { + if (!colorStr) + return null; + ctx.clearRect(0, 0, 1, 1); + // 2. Apply the color + ctx.fillStyle = colorStr; + // 3. Fill a single pixel + ctx.fillRect(0, 0, 1, 1); + // 4. Extract pixel data [R, G, B, A] + const data = ctx.getImageData(0, 0, 1, 1).data; + return { + r: data[0], + g: data[1], + b: data[2], + // Convert alpha from 0-255 to 0-1 (rounded to 3 decimal places) + a: Math.round((data[3] / 255) * 1000) / 1000 + }; + }; + })(); // Helper to convert back to Hex (for output consistency) function lv_rgbToHex(r, g, b) { diff --git a/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/cbi/nodes_multivalue_com.htm b/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/cbi/nodes_multivalue_com.htm index 275cb73db6..646f691b48 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/cbi/nodes_multivalue_com.htm +++ b/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/cbi/nodes_multivalue_com.htm @@ -117,49 +117,31 @@ return cssRules.filter(Boolean).join(' ') } - function mv_parseColorToRgba(color) { - if (!color) return null; - - const ctx = document.createElement('canvas').getContext('2d'); - if (!ctx) return null; - - ctx.fillStyle = color; - const computedColor = ctx.fillStyle; - // Match #RRGGBB or #RRGGBBAA format - if (computedColor.startsWith('#')) { - const hex = computedColor.substring(1); - // #RRGGBB (6 digits) - if (hex.length === 6) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: 1 - }; - } - // #RRGGBBAA (8 digits) - if (hex.length === 8) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: parseInt(hex.substring(6, 8), 16) / 255 - }; - } - } - // Match rgba() or rgb() format (for browsers that return this format) - const rgbaMatch = computedColor.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)$/); - if (rgbaMatch) { - return { - r: parseInt(rgbaMatch[1], 10), - g: parseInt(rgbaMatch[2], 10), - b: parseInt(rgbaMatch[3], 10), - a: rgbaMatch[4] !== undefined ? parseFloat(rgbaMatch[4]) : 1 - }; - } - - return null; // Invalid color - } + const mv_parseColorToRgba = (function() { + // Create canvas and context once (Closure) + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d', { willReadFrequently: true }); + return function(colorStr) { + if (!colorStr) + return null; + ctx.clearRect(0, 0, 1, 1); + // 2. Apply the color + ctx.fillStyle = colorStr; + // 3. Fill a single pixel + ctx.fillRect(0, 0, 1, 1); + // 4. Extract pixel data [R, G, B, A] + const data = ctx.getImageData(0, 0, 1, 1).data; + return { + r: data[0], + g: data[1], + b: data[2], + // Convert alpha from 0-255 to 0-1 (rounded to 3 decimal places) + a: Math.round((data[3] / 255) * 1000) / 1000 + }; + }; + })(); // Helper to convert back to Hex (for output consistency) function mv_rgbToHex(r, g, b) { diff --git a/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/cbi/nodes_value_com.htm b/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/cbi/nodes_value_com.htm index b49ba9d7b2..1f784d04b2 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/cbi/nodes_value_com.htm +++ b/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/cbi/nodes_value_com.htm @@ -156,49 +156,31 @@ return cssRules.filter(Boolean).join(' ') } - function v_parseColorToRgba(color) { - if (!color) return null; - - const ctx = document.createElement('canvas').getContext('2d'); - if (!ctx) return null; - - ctx.fillStyle = color; - const computedColor = ctx.fillStyle; - // Match #RRGGBB or #RRGGBBAA format - if (computedColor.startsWith('#')) { - const hex = computedColor.substring(1); - // #RRGGBB (6 digits) - if (hex.length === 6) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: 1 - }; - } - // #RRGGBBAA (8 digits) - if (hex.length === 8) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: parseInt(hex.substring(6, 8), 16) / 255 - }; - } - } - // Match rgba() or rgb() format (for browsers that return this format) - const rgbaMatch = computedColor.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)$/); - if (rgbaMatch) { - return { - r: parseInt(rgbaMatch[1], 10), - g: parseInt(rgbaMatch[2], 10), - b: parseInt(rgbaMatch[3], 10), - a: rgbaMatch[4] !== undefined ? parseFloat(rgbaMatch[4]) : 1 - }; - } - - return null; // Invalid color - } + const v_parseColorToRgba = (function() { + // Create canvas and context once (Closure) + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d', { willReadFrequently: true }); + return function(colorStr) { + if (!colorStr) + return null; + ctx.clearRect(0, 0, 1, 1); + // 2. Apply the color + ctx.fillStyle = colorStr; + // 3. Fill a single pixel + ctx.fillRect(0, 0, 1, 1); + // 4. Extract pixel data [R, G, B, A] + const data = ctx.getImageData(0, 0, 1, 1).data; + return { + r: data[0], + g: data[1], + b: data[2], + // Convert alpha from 0-255 to 0-1 (rounded to 3 decimal places) + a: Math.round((data[3] / 255) * 1000) / 1000 + }; + }; + })(); // Helper to convert back to Hex (for output consistency) function v_rgbToHex(r, g, b) { diff --git a/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/node_list/link_add_node.htm b/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/node_list/link_add_node.htm index 83046a7daf..d7ee096608 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/node_list/link_add_node.htm +++ b/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/node_list/link_add_node.htm @@ -457,8 +457,7 @@ local api = require "luci.passwall.api" background: #fff; cursor: pointer; box-sizing: border-box; - display: flex; - align-items: center; + display: block; } .selected-display { @@ -469,23 +468,21 @@ local api = require "luci.passwall.api" width: 100%; height: 100%; box-sizing: border-box; + font-size: 12px; + color: #666; } .selected-display:hover { background-color: #f7f7f7; } - .selected-display { - font-size: 12px; - color: #666; - } - .dropdown-list { position: absolute; - top: 100%; - left: 0; - width: 180px; + top: calc(100% + 2px); + left: -1px; + width: calc(100% + 2px); border: 1px solid #d9d9d9; + border-radius: 2px; border-top: none; box-shadow: 0 1px 3px rgba(0,0,0,0.15); background: #fff; @@ -497,6 +494,7 @@ local api = require "luci.passwall.api" overflow-x: hidden; z-index: 100; box-sizing: border-box; + color: #666; } .dropdown-item { diff --git a/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/node_list/node_list.htm b/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/node_list/node_list.htm index 3a5f7f6a3a..6c36be2dc3 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/node_list/node_list.htm +++ b/openwrt-passwall/luci-app-passwall/luasrc/view/passwall/node_list/node_list.htm @@ -1065,9 +1065,11 @@ table td, .table .td {
-
-
<%:You choose node is:%>
-
+
+
+ <%:You choose node is:%> +
+
diff --git a/openwrt-passwall/luci-app-passwall/po/zh-cn/passwall.po b/openwrt-passwall/luci-app-passwall/po/zh-cn/passwall.po index f1961dacb2..a255879f5c 100644 --- a/openwrt-passwall/luci-app-passwall/po/zh-cn/passwall.po +++ b/openwrt-passwall/luci-app-passwall/po/zh-cn/passwall.po @@ -1896,11 +1896,9 @@ msgstr "仅支持一层代理。" msgid "" "Chained proxy works only with Xray or Sing-box nodes.
" -"The chained node must be the same type as your subscription node (Xray with Xray, Sing-box with Sing-box).
" "You can only use manual or imported nodes as chained nodes." msgstr "" "链式代理仅支持 Xray 与 Sing-box 节点。
" -"链式节点需与订阅节点类型一致(Xray 对应 Xray,Sing-box 对应 Sing-box)。
" "仅支持手动添加或导入的节点用作链式节点。" msgid "Only work with using the %s node." diff --git a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/subscribe.lua b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/subscribe.lua index 21a2ea0c29..5a54ad983b 100755 --- a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/subscribe.lua +++ b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/subscribe.lua @@ -1840,7 +1840,7 @@ local function update_node(manual) uci:set(appname, cfgid, "domain_strategy", domain_strategy_node) end -- 订阅组链式代理 - if chain_node_type ~= "" and kkk == "type" and vvv == chain_node_type then + if chain_node_type ~= "" and kkk == "type" and (vvv == "Xray" or vvv == "sing-box") then if preproxy_node_group ~="" then uci:set(appname, cfgid, "chain_proxy", "1") uci:set(appname, cfgid, "preproxy_node", preproxy_node_group) diff --git a/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_subscribe_config.lua b/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_subscribe_config.lua index 3ce7e39ac3..c63e6b9937 100644 --- a/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_subscribe_config.lua +++ b/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_subscribe_config.lua @@ -253,7 +253,6 @@ o:value("1", translate("Preproxy Node")) o:value("2", translate("Landing Node")) local descrStr = "Chained proxy works only with Xray or Sing-box nodes.
" -descrStr = descrStr .. "The chained node must be the same type as your subscription node (Xray with Xray, Sing-box with Sing-box).
" descrStr = descrStr .. "You can only use manual or imported nodes as chained nodes." descrStr = translate(descrStr) .. "
" .. translate("Only support a layer of proxy.") diff --git a/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_listvalue_com.htm b/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_listvalue_com.htm index e2ec33b464..9de708e5f7 100644 --- a/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_listvalue_com.htm +++ b/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_listvalue_com.htm @@ -161,49 +161,31 @@ return cssRules.filter(Boolean).join(' ') } - function lv_parseColorToRgba(color) { - if (!color) return null; - - const ctx = document.createElement('canvas').getContext('2d'); - if (!ctx) return null; - - ctx.fillStyle = color; - const computedColor = ctx.fillStyle; - // Match #RRGGBB or #RRGGBBAA format - if (computedColor.startsWith('#')) { - const hex = computedColor.substring(1); - // #RRGGBB (6 digits) - if (hex.length === 6) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: 1 - }; - } - // #RRGGBBAA (8 digits) - if (hex.length === 8) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: parseInt(hex.substring(6, 8), 16) / 255 - }; - } - } - // Match rgba() or rgb() format (for browsers that return this format) - const rgbaMatch = computedColor.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)$/); - if (rgbaMatch) { - return { - r: parseInt(rgbaMatch[1], 10), - g: parseInt(rgbaMatch[2], 10), - b: parseInt(rgbaMatch[3], 10), - a: rgbaMatch[4] !== undefined ? parseFloat(rgbaMatch[4]) : 1 - }; - } - - return null; // Invalid color - } + const lv_parseColorToRgba = (function() { + // Create canvas and context once (Closure) + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d', { willReadFrequently: true }); + return function(colorStr) { + if (!colorStr) + return null; + ctx.clearRect(0, 0, 1, 1); + // 2. Apply the color + ctx.fillStyle = colorStr; + // 3. Fill a single pixel + ctx.fillRect(0, 0, 1, 1); + // 4. Extract pixel data [R, G, B, A] + const data = ctx.getImageData(0, 0, 1, 1).data; + return { + r: data[0], + g: data[1], + b: data[2], + // Convert alpha from 0-255 to 0-1 (rounded to 3 decimal places) + a: Math.round((data[3] / 255) * 1000) / 1000 + }; + }; + })(); // Helper to convert back to Hex (for output consistency) function lv_rgbToHex(r, g, b) { diff --git a/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_multivalue_com.htm b/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_multivalue_com.htm index 275cb73db6..646f691b48 100644 --- a/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_multivalue_com.htm +++ b/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_multivalue_com.htm @@ -117,49 +117,31 @@ return cssRules.filter(Boolean).join(' ') } - function mv_parseColorToRgba(color) { - if (!color) return null; - - const ctx = document.createElement('canvas').getContext('2d'); - if (!ctx) return null; - - ctx.fillStyle = color; - const computedColor = ctx.fillStyle; - // Match #RRGGBB or #RRGGBBAA format - if (computedColor.startsWith('#')) { - const hex = computedColor.substring(1); - // #RRGGBB (6 digits) - if (hex.length === 6) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: 1 - }; - } - // #RRGGBBAA (8 digits) - if (hex.length === 8) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: parseInt(hex.substring(6, 8), 16) / 255 - }; - } - } - // Match rgba() or rgb() format (for browsers that return this format) - const rgbaMatch = computedColor.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)$/); - if (rgbaMatch) { - return { - r: parseInt(rgbaMatch[1], 10), - g: parseInt(rgbaMatch[2], 10), - b: parseInt(rgbaMatch[3], 10), - a: rgbaMatch[4] !== undefined ? parseFloat(rgbaMatch[4]) : 1 - }; - } - - return null; // Invalid color - } + const mv_parseColorToRgba = (function() { + // Create canvas and context once (Closure) + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d', { willReadFrequently: true }); + return function(colorStr) { + if (!colorStr) + return null; + ctx.clearRect(0, 0, 1, 1); + // 2. Apply the color + ctx.fillStyle = colorStr; + // 3. Fill a single pixel + ctx.fillRect(0, 0, 1, 1); + // 4. Extract pixel data [R, G, B, A] + const data = ctx.getImageData(0, 0, 1, 1).data; + return { + r: data[0], + g: data[1], + b: data[2], + // Convert alpha from 0-255 to 0-1 (rounded to 3 decimal places) + a: Math.round((data[3] / 255) * 1000) / 1000 + }; + }; + })(); // Helper to convert back to Hex (for output consistency) function mv_rgbToHex(r, g, b) { diff --git a/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_value_com.htm b/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_value_com.htm index b49ba9d7b2..1f784d04b2 100644 --- a/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_value_com.htm +++ b/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_value_com.htm @@ -156,49 +156,31 @@ return cssRules.filter(Boolean).join(' ') } - function v_parseColorToRgba(color) { - if (!color) return null; - - const ctx = document.createElement('canvas').getContext('2d'); - if (!ctx) return null; - - ctx.fillStyle = color; - const computedColor = ctx.fillStyle; - // Match #RRGGBB or #RRGGBBAA format - if (computedColor.startsWith('#')) { - const hex = computedColor.substring(1); - // #RRGGBB (6 digits) - if (hex.length === 6) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: 1 - }; - } - // #RRGGBBAA (8 digits) - if (hex.length === 8) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: parseInt(hex.substring(6, 8), 16) / 255 - }; - } - } - // Match rgba() or rgb() format (for browsers that return this format) - const rgbaMatch = computedColor.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)$/); - if (rgbaMatch) { - return { - r: parseInt(rgbaMatch[1], 10), - g: parseInt(rgbaMatch[2], 10), - b: parseInt(rgbaMatch[3], 10), - a: rgbaMatch[4] !== undefined ? parseFloat(rgbaMatch[4]) : 1 - }; - } - - return null; // Invalid color - } + const v_parseColorToRgba = (function() { + // Create canvas and context once (Closure) + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d', { willReadFrequently: true }); + return function(colorStr) { + if (!colorStr) + return null; + ctx.clearRect(0, 0, 1, 1); + // 2. Apply the color + ctx.fillStyle = colorStr; + // 3. Fill a single pixel + ctx.fillRect(0, 0, 1, 1); + // 4. Extract pixel data [R, G, B, A] + const data = ctx.getImageData(0, 0, 1, 1).data; + return { + r: data[0], + g: data[1], + b: data[2], + // Convert alpha from 0-255 to 0-1 (rounded to 3 decimal places) + a: Math.round((data[3] / 255) * 1000) / 1000 + }; + }; + })(); // Helper to convert back to Hex (for output consistency) function v_rgbToHex(r, g, b) { diff --git a/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/node_list/link_add_node.htm b/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/node_list/link_add_node.htm index 5da8b889c2..aa9b6942ab 100644 --- a/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/node_list/link_add_node.htm +++ b/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/node_list/link_add_node.htm @@ -457,8 +457,7 @@ local api = require "luci.passwall2.api" background: #fff; cursor: pointer; box-sizing: border-box; - display: flex; - align-items: center; + display: block; } .selected-display { @@ -469,23 +468,21 @@ local api = require "luci.passwall2.api" width: 100%; height: 100%; box-sizing: border-box; + font-size: 12px; + color: #666; } .selected-display:hover { background-color: #f7f7f7; } - .selected-display { - font-size: 12px; - color: #666; - } - .dropdown-list { position: absolute; - top: 100%; - left: 0; - width: 180px; + top: calc(100% + 2px); + left: -1px; + width: calc(100% + 2px); border: 1px solid #d9d9d9; + border-radius: 2px; border-top: none; box-shadow: 0 1px 3px rgba(0,0,0,0.15); background: #fff; @@ -497,6 +494,7 @@ local api = require "luci.passwall2.api" overflow-x: hidden; z-index: 100; box-sizing: border-box; + color: #666; } .dropdown-item { diff --git a/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/node_list/node_list.htm b/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/node_list/node_list.htm index ab1dcc5098..a1cc1c1ba8 100644 --- a/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/node_list/node_list.htm +++ b/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/node_list/node_list.htm @@ -1066,9 +1066,11 @@ table td, .table .td {
-
-
<%:You choose node is:%>
-
+
+
+ <%:You choose node is:%> +
+
<%- if default_node_type == "_shunt" then for i, v in ipairs(shunt_rule_list) do -%> diff --git a/openwrt-passwall2/luci-app-passwall2/po/zh-cn/passwall2.po b/openwrt-passwall2/luci-app-passwall2/po/zh-cn/passwall2.po index dc46277f5e..f1657ff7e2 100644 --- a/openwrt-passwall2/luci-app-passwall2/po/zh-cn/passwall2.po +++ b/openwrt-passwall2/luci-app-passwall2/po/zh-cn/passwall2.po @@ -1722,11 +1722,9 @@ msgstr "仅支持一层代理。" msgid "" "Chained proxy works only with Xray or Sing-box nodes.
" -"The chained node must be the same type as your subscription node (Xray with Xray, Sing-box with Sing-box).
" "You can only use manual or imported nodes as chained nodes." msgstr "" "链式代理仅支持 Xray 与 Sing-box 节点。
" -"链式节点需与订阅节点类型一致(Xray 对应 Xray,Sing-box 对应 Sing-box)。
" "仅支持手动添加或导入的节点用作链式节点。" msgid "Set the default domain resolution strategy for the sing-box node." diff --git a/openwrt-passwall2/luci-app-passwall2/po/zh-tw/passwall2.po b/openwrt-passwall2/luci-app-passwall2/po/zh-tw/passwall2.po index 9706ecf039..503f7b00eb 100644 --- a/openwrt-passwall2/luci-app-passwall2/po/zh-tw/passwall2.po +++ b/openwrt-passwall2/luci-app-passwall2/po/zh-tw/passwall2.po @@ -1722,11 +1722,9 @@ msgstr "仅支持一層代理。" msgid "" "Chained proxy works only with Xray or Sing-box nodes.
" -"The chained node must be the same type as your subscription node (Xray with Xray, Sing-box with Sing-box).
" "You can only use manual or imported nodes as chained nodes." msgstr "" "鏈式代理仅支持 Xray 与 Sing-box 節點。
" -"鏈式節點需与訂閱節點類型一致(Xray 對應 Xray,Sing-box 對應 Sing-box)。
" "仅支持手動添加或導入的節點用作鏈式節點。" msgid "Set the default domain resolution strategy for the sing-box node." diff --git a/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua b/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua index 683c234339..1bdbea69ad 100755 --- a/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua +++ b/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua @@ -1828,7 +1828,7 @@ local function update_node(manual) uci:set(appname, cfgid, "domain_strategy", domain_strategy_node) end -- Subscription Group Chain Agent - if chain_node_type ~= "" and kkk == "type" and vvv == chain_node_type then + if chain_node_type ~= "" and kkk == "type" and (vvv == "Xray" or vvv == "sing-box") then if preproxy_node_group ~="" then uci:set(appname, cfgid, "chain_proxy", "1") uci:set(appname, cfgid, "preproxy_node", preproxy_node_group) diff --git a/sing-box/dns/client.go b/sing-box/dns/client.go index 939ca48cbf..2982d11cf0 100644 --- a/sing-box/dns/client.go +++ b/sing-box/dns/client.go @@ -144,7 +144,11 @@ func (c *Client) Exchange(ctx context.Context, transport adapter.DNSTransport, m if c.cache != nil { cond, loaded := c.cacheLock.LoadOrStore(question, make(chan struct{})) if loaded { - <-cond + select { + case <-cond: + case <-ctx.Done(): + return nil, ctx.Err() + } } else { defer func() { c.cacheLock.Delete(question) @@ -154,7 +158,11 @@ func (c *Client) Exchange(ctx context.Context, transport adapter.DNSTransport, m } else if c.transportCache != nil { cond, loaded := c.transportCacheLock.LoadOrStore(question, make(chan struct{})) if loaded { - <-cond + select { + case <-cond: + case <-ctx.Done(): + return nil, ctx.Err() + } } else { defer func() { c.transportCacheLock.Delete(question) diff --git a/sing-box/experimental/cachefile/cache.go b/sing-box/experimental/cachefile/cache.go index 88cffdbe93..ac2d700280 100644 --- a/sing-box/experimental/cachefile/cache.go +++ b/sing-box/experimental/cachefile/cache.go @@ -45,6 +45,7 @@ type CacheFile struct { storeRDRC bool rdrcTimeout time.Duration DB *bbolt.DB + resetAccess sync.Mutex saveMetadataTimer *time.Timer saveFakeIPAccess sync.RWMutex saveDomain map[netip.Addr]string @@ -169,13 +170,55 @@ func (c *CacheFile) Close() error { return c.DB.Close() } +func (c *CacheFile) view(fn func(tx *bbolt.Tx) error) (err error) { + defer func() { + if r := recover(); r != nil { + c.resetDB() + err = E.New("database corrupted: ", r) + } + }() + return c.DB.View(fn) +} + +func (c *CacheFile) batch(fn func(tx *bbolt.Tx) error) (err error) { + defer func() { + if r := recover(); r != nil { + c.resetDB() + err = E.New("database corrupted: ", r) + } + }() + return c.DB.Batch(fn) +} + +func (c *CacheFile) update(fn func(tx *bbolt.Tx) error) (err error) { + defer func() { + if r := recover(); r != nil { + c.resetDB() + err = E.New("database corrupted: ", r) + } + }() + return c.DB.Update(fn) +} + +func (c *CacheFile) resetDB() { + c.resetAccess.Lock() + defer c.resetAccess.Unlock() + c.DB.Close() + os.Remove(c.path) + db, err := bbolt.Open(c.path, 0o666, &bbolt.Options{Timeout: time.Second}) + if err == nil { + _ = filemanager.Chown(c.ctx, c.path) + c.DB = db + } +} + func (c *CacheFile) StoreFakeIP() bool { return c.storeFakeIP } func (c *CacheFile) LoadMode() string { var mode string - c.DB.View(func(t *bbolt.Tx) error { + c.view(func(t *bbolt.Tx) error { bucket := t.Bucket(bucketMode) if bucket == nil { return nil @@ -193,7 +236,7 @@ func (c *CacheFile) LoadMode() string { } func (c *CacheFile) StoreMode(mode string) error { - return c.DB.Batch(func(t *bbolt.Tx) error { + return c.batch(func(t *bbolt.Tx) error { bucket, err := t.CreateBucketIfNotExists(bucketMode) if err != nil { return err @@ -230,7 +273,7 @@ func (c *CacheFile) createBucket(t *bbolt.Tx, key []byte) (*bbolt.Bucket, error) func (c *CacheFile) LoadSelected(group string) string { var selected string - c.DB.View(func(t *bbolt.Tx) error { + c.view(func(t *bbolt.Tx) error { bucket := c.bucket(t, bucketSelected) if bucket == nil { return nil @@ -245,7 +288,7 @@ func (c *CacheFile) LoadSelected(group string) string { } func (c *CacheFile) StoreSelected(group, selected string) error { - return c.DB.Batch(func(t *bbolt.Tx) error { + return c.batch(func(t *bbolt.Tx) error { bucket, err := c.createBucket(t, bucketSelected) if err != nil { return err @@ -255,7 +298,7 @@ func (c *CacheFile) StoreSelected(group, selected string) error { } func (c *CacheFile) LoadGroupExpand(group string) (isExpand bool, loaded bool) { - c.DB.View(func(t *bbolt.Tx) error { + c.view(func(t *bbolt.Tx) error { bucket := c.bucket(t, bucketExpand) if bucket == nil { return nil @@ -271,7 +314,7 @@ func (c *CacheFile) LoadGroupExpand(group string) (isExpand bool, loaded bool) { } func (c *CacheFile) StoreGroupExpand(group string, isExpand bool) error { - return c.DB.Batch(func(t *bbolt.Tx) error { + return c.batch(func(t *bbolt.Tx) error { bucket, err := c.createBucket(t, bucketExpand) if err != nil { return err @@ -286,7 +329,7 @@ func (c *CacheFile) StoreGroupExpand(group string, isExpand bool) error { func (c *CacheFile) LoadRuleSet(tag string) *adapter.SavedBinary { var savedSet adapter.SavedBinary - err := c.DB.View(func(t *bbolt.Tx) error { + err := c.view(func(t *bbolt.Tx) error { bucket := c.bucket(t, bucketRuleSet) if bucket == nil { return os.ErrNotExist @@ -304,7 +347,7 @@ func (c *CacheFile) LoadRuleSet(tag string) *adapter.SavedBinary { } func (c *CacheFile) SaveRuleSet(tag string, set *adapter.SavedBinary) error { - return c.DB.Batch(func(t *bbolt.Tx) error { + return c.batch(func(t *bbolt.Tx) error { bucket, err := c.createBucket(t, bucketRuleSet) if err != nil { return err diff --git a/sing-box/experimental/cachefile/fakeip.go b/sing-box/experimental/cachefile/fakeip.go index 8fe0f1139c..7a4bd384f1 100644 --- a/sing-box/experimental/cachefile/fakeip.go +++ b/sing-box/experimental/cachefile/fakeip.go @@ -23,7 +23,7 @@ var ( func (c *CacheFile) FakeIPMetadata() *adapter.FakeIPMetadata { var metadata adapter.FakeIPMetadata - err := c.DB.Batch(func(tx *bbolt.Tx) error { + err := c.batch(func(tx *bbolt.Tx) error { bucket := tx.Bucket(bucketFakeIP) if bucket == nil { return os.ErrNotExist @@ -45,7 +45,7 @@ func (c *CacheFile) FakeIPMetadata() *adapter.FakeIPMetadata { } func (c *CacheFile) FakeIPSaveMetadata(metadata *adapter.FakeIPMetadata) error { - return c.DB.Batch(func(tx *bbolt.Tx) error { + return c.batch(func(tx *bbolt.Tx) error { bucket, err := tx.CreateBucketIfNotExists(bucketFakeIP) if err != nil { return err @@ -69,7 +69,7 @@ func (c *CacheFile) FakeIPSaveMetadataAsync(metadata *adapter.FakeIPMetadata) { } func (c *CacheFile) FakeIPStore(address netip.Addr, domain string) error { - return c.DB.Batch(func(tx *bbolt.Tx) error { + return c.batch(func(tx *bbolt.Tx) error { bucket, err := tx.CreateBucketIfNotExists(bucketFakeIP) if err != nil { return err @@ -136,7 +136,7 @@ func (c *CacheFile) FakeIPLoad(address netip.Addr) (string, bool) { return cachedDomain, true } var domain string - _ = c.DB.View(func(tx *bbolt.Tx) error { + _ = c.view(func(tx *bbolt.Tx) error { bucket := tx.Bucket(bucketFakeIP) if bucket == nil { return nil @@ -163,7 +163,7 @@ func (c *CacheFile) FakeIPLoadDomain(domain string, isIPv6 bool) (netip.Addr, bo return cachedAddress, true } var address netip.Addr - _ = c.DB.View(func(tx *bbolt.Tx) error { + _ = c.view(func(tx *bbolt.Tx) error { var bucket *bbolt.Bucket if isIPv6 { bucket = tx.Bucket(bucketFakeIPDomain6) @@ -180,7 +180,7 @@ func (c *CacheFile) FakeIPLoadDomain(domain string, isIPv6 bool) (netip.Addr, bo } func (c *CacheFile) FakeIPReset() error { - return c.DB.Batch(func(tx *bbolt.Tx) error { + return c.batch(func(tx *bbolt.Tx) error { err := tx.DeleteBucket(bucketFakeIP) if err != nil { return err diff --git a/sing-box/experimental/cachefile/rdrc.go b/sing-box/experimental/cachefile/rdrc.go index c4800951cb..d27ea8b244 100644 --- a/sing-box/experimental/cachefile/rdrc.go +++ b/sing-box/experimental/cachefile/rdrc.go @@ -31,7 +31,7 @@ func (c *CacheFile) LoadRDRC(transportName string, qName string, qType uint16) ( copy(key[2:], qName) defer buf.Put(key) var deleteCache bool - err := c.DB.View(func(tx *bbolt.Tx) error { + err := c.view(func(tx *bbolt.Tx) error { bucket := c.bucket(tx, bucketRDRC) if bucket == nil { return nil @@ -56,7 +56,7 @@ func (c *CacheFile) LoadRDRC(transportName string, qName string, qType uint16) ( return } if deleteCache { - c.DB.Update(func(tx *bbolt.Tx) error { + c.update(func(tx *bbolt.Tx) error { bucket := c.bucket(tx, bucketRDRC) if bucket == nil { return nil @@ -72,7 +72,7 @@ func (c *CacheFile) LoadRDRC(transportName string, qName string, qType uint16) ( } func (c *CacheFile) SaveRDRC(transportName string, qName string, qType uint16) error { - return c.DB.Batch(func(tx *bbolt.Tx) error { + return c.batch(func(tx *bbolt.Tx) error { bucket, err := c.createBucket(tx, bucketRDRC) if err != nil { return err diff --git a/sing-box/go.mod b/sing-box/go.mod index d76971056f..ff1afeb3fc 100644 --- a/sing-box/go.mod +++ b/sing-box/go.mod @@ -33,7 +33,7 @@ require ( github.com/sagernet/gomobile v0.1.11 github.com/sagernet/gvisor v0.0.0-20250811.0-sing-box-mod.1 github.com/sagernet/quic-go v0.59.0-sing-box-mod.2 - github.com/sagernet/sing v0.8.0-beta.15.0.20260202162209-7c477e13f41e + github.com/sagernet/sing v0.8.0-beta.16 github.com/sagernet/sing-mux v0.3.4 github.com/sagernet/sing-quic v0.6.0-beta.11 github.com/sagernet/sing-shadowsocks v0.2.8 diff --git a/sing-box/go.sum b/sing-box/go.sum index 375d60381b..ddc9237ee2 100644 --- a/sing-box/go.sum +++ b/sing-box/go.sum @@ -210,8 +210,8 @@ github.com/sagernet/nftables v0.3.0-beta.4 h1:kbULlAwAC3jvdGAC1P5Fa3GSxVwQJibNen github.com/sagernet/nftables v0.3.0-beta.4/go.mod h1:OQXAjvjNGGFxaTgVCSTRIhYB5/llyVDeapVoENYBDS8= github.com/sagernet/quic-go v0.59.0-sing-box-mod.2 h1:hJUL+HtxEOjxsa0CsucbBVqI/AMS4k52NwNU637zmdw= github.com/sagernet/quic-go v0.59.0-sing-box-mod.2/go.mod h1:OqILvS182CyOol5zNNo6bguvOGgXzV459+chpRaUC+4= -github.com/sagernet/sing v0.8.0-beta.15.0.20260202162209-7c477e13f41e h1:H8izpW6d9l8Ub5UFSV/Q2WCehss2KAlmnDiABa4BHp0= -github.com/sagernet/sing v0.8.0-beta.15.0.20260202162209-7c477e13f41e/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak= +github.com/sagernet/sing v0.8.0-beta.16 h1:Fe+6E9VHYky9Mx4cf0ugbZPWDcXRflpAu7JQ5bWXvaA= +github.com/sagernet/sing v0.8.0-beta.16/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak= github.com/sagernet/sing-mux v0.3.4 h1:ZQplKl8MNXutjzbMVtWvWG31fohhgOfCuUZR4dVQ8+s= github.com/sagernet/sing-mux v0.3.4/go.mod h1:QvlKMyNBNrQoyX4x+gq028uPbLM2XeRpWtDsWBJbFSk= github.com/sagernet/sing-quic v0.6.0-beta.11 h1:eUusxITKKRedhWC2ScUYFUvD96h/QfbKLaS3N6/7in4= diff --git a/sing-box/test/go.mod b/sing-box/test/go.mod index ee69f102e2..7d6d9edcff 100644 --- a/sing-box/test/go.mod +++ b/sing-box/test/go.mod @@ -10,9 +10,9 @@ require ( github.com/docker/docker v27.3.1+incompatible github.com/docker/go-connections v0.5.0 github.com/gofrs/uuid/v5 v5.4.0 - github.com/sagernet/quic-go v0.58.0-sing-box-mod.1 - github.com/sagernet/sing v0.8.0-beta.6.0.20251207063731-56fd482ce1c6 - github.com/sagernet/sing-quic v0.6.0-beta.6 + github.com/sagernet/quic-go v0.59.0-sing-box-mod.2 + github.com/sagernet/sing v0.8.0-beta.16 + github.com/sagernet/sing-quic v0.6.0-beta.11 github.com/sagernet/sing-shadowsocks v0.2.8 github.com/sagernet/sing-shadowsocks2 v0.2.1 github.com/spyzhov/ajson v0.9.4 @@ -40,17 +40,17 @@ require ( github.com/database64128/tfo-go/v2 v2.3.1 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dblohm7/wingoes v0.0.0-20240119213807-a09d6be7affa // indirect - github.com/digitalocean/go-smbios v0.0.0-20180907143718-390a4f403a8e // indirect github.com/distribution/reference v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/ebitengine/purego v0.9.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/florianl/go-nfqueue/v2 v2.0.2 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/gaissmai/bart v0.18.0 // indirect github.com/go-chi/chi/v5 v5.2.3 // indirect github.com/go-chi/render v1.0.3 // indirect - github.com/go-json-experiment/json v0.0.0-20250223041408-d3c622f1b874 // indirect + github.com/go-json-experiment/json v0.0.0-20250813024750-ebf49471dced // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect @@ -65,21 +65,19 @@ require ( github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/yamux v0.1.2 // indirect github.com/hdevalence/ed25519consensus v0.2.0 // indirect - github.com/illarion/gonotify/v3 v3.0.2 // indirect github.com/insomniacslk/dhcp v0.0.0-20251020182700-175e84fbb167 // indirect github.com/jsimonetti/rtnetlink v1.4.0 // indirect github.com/keybase/go-keychain v0.0.1 // indirect - github.com/klauspost/compress v1.17.11 // indirect + github.com/klauspost/compress v1.18.0 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect + github.com/libdns/acmedns v0.5.0 // indirect github.com/libdns/alidns v1.0.6-beta.3 // indirect github.com/libdns/cloudflare v0.2.2 // indirect github.com/libdns/libdns v1.1.1 // indirect github.com/logrusorgru/aurora v2.0.3+incompatible // indirect - github.com/mdlayher/genetlink v1.3.2 // indirect github.com/mdlayher/netlink v1.7.3-0.20250113171957-fbb4dce95f42 // indirect - github.com/mdlayher/sdnotify v1.0.0 // indirect github.com/mdlayher/socket v0.5.1 // indirect - github.com/metacubex/utls v1.8.3 // indirect + github.com/metacubex/utls v1.8.4 // indirect github.com/mholt/acmez/v3 v3.1.4 // indirect github.com/miekg/dns v1.1.69 // indirect github.com/mitchellh/go-ps v1.0.0 // indirect @@ -88,8 +86,9 @@ require ( github.com/morikuni/aec v1.0.0 // indirect github.com/openai/openai-go/v3 v3.15.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.2 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect github.com/pierrec/lz4/v4 v4.1.21 // indirect + github.com/pires/go-proxyproto v0.8.1 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus-community/pro-bing v0.4.0 // indirect @@ -97,40 +96,40 @@ require ( github.com/safchain/ethtool v0.3.0 // indirect github.com/sagernet/bbolt v0.0.0-20231014093535-ea5cb2fe9f0a // indirect github.com/sagernet/cors v1.2.1 // indirect - github.com/sagernet/cronet-go v0.0.0-20251220122645-b05b5c41614a // indirect - github.com/sagernet/cronet-go/all v0.0.0-20251220122645-b05b5c41614a // indirect - github.com/sagernet/cronet-go/lib/android_386 v0.0.0-20251220122226-25b6d00c5b7e // indirect - github.com/sagernet/cronet-go/lib/android_amd64 v0.0.0-20251220122226-25b6d00c5b7e // indirect - github.com/sagernet/cronet-go/lib/android_arm v0.0.0-20251220122226-25b6d00c5b7e // indirect - github.com/sagernet/cronet-go/lib/android_arm64 v0.0.0-20251220122226-25b6d00c5b7e // indirect - github.com/sagernet/cronet-go/lib/darwin_amd64 v0.0.0-20251220122226-25b6d00c5b7e // indirect - github.com/sagernet/cronet-go/lib/darwin_arm64 v0.0.0-20251220122226-25b6d00c5b7e // indirect - github.com/sagernet/cronet-go/lib/ios_amd64_simulator v0.0.0-20251220122226-25b6d00c5b7e // indirect - github.com/sagernet/cronet-go/lib/ios_arm64 v0.0.0-20251220122226-25b6d00c5b7e // indirect - github.com/sagernet/cronet-go/lib/ios_arm64_simulator v0.0.0-20251220122226-25b6d00c5b7e // indirect - github.com/sagernet/cronet-go/lib/linux_386 v0.0.0-20251220122226-25b6d00c5b7e // indirect - github.com/sagernet/cronet-go/lib/linux_386_musl v0.0.0-20251220122226-25b6d00c5b7e // indirect - github.com/sagernet/cronet-go/lib/linux_amd64 v0.0.0-20251220122226-25b6d00c5b7e // indirect - github.com/sagernet/cronet-go/lib/linux_amd64_musl v0.0.0-20251220122226-25b6d00c5b7e // indirect - github.com/sagernet/cronet-go/lib/linux_arm v0.0.0-20251220122226-25b6d00c5b7e // indirect - github.com/sagernet/cronet-go/lib/linux_arm64 v0.0.0-20251220122226-25b6d00c5b7e // indirect - github.com/sagernet/cronet-go/lib/linux_arm64_musl v0.0.0-20251220122226-25b6d00c5b7e // indirect - github.com/sagernet/cronet-go/lib/linux_arm_musl v0.0.0-20251220122226-25b6d00c5b7e // indirect - github.com/sagernet/cronet-go/lib/tvos_amd64_simulator v0.0.0-20251220122226-25b6d00c5b7e // indirect - github.com/sagernet/cronet-go/lib/tvos_arm64 v0.0.0-20251220122226-25b6d00c5b7e // indirect - github.com/sagernet/cronet-go/lib/tvos_arm64_simulator v0.0.0-20251220122226-25b6d00c5b7e // indirect - github.com/sagernet/cronet-go/lib/windows_amd64 v0.0.0-20251220122226-25b6d00c5b7e // indirect - github.com/sagernet/cronet-go/lib/windows_arm64 v0.0.0-20251220122226-25b6d00c5b7e // indirect + github.com/sagernet/cronet-go v0.0.0-20260117110918-dc1cda1fe287 // indirect + github.com/sagernet/cronet-go/all v0.0.0-20260117110918-dc1cda1fe287 // indirect + github.com/sagernet/cronet-go/lib/android_386 v0.0.0-20260117110516-f21660bef13f // indirect + github.com/sagernet/cronet-go/lib/android_amd64 v0.0.0-20260117110516-f21660bef13f // indirect + github.com/sagernet/cronet-go/lib/android_arm v0.0.0-20260117110516-f21660bef13f // indirect + github.com/sagernet/cronet-go/lib/android_arm64 v0.0.0-20260117110516-f21660bef13f // indirect + github.com/sagernet/cronet-go/lib/darwin_amd64 v0.0.0-20260117110516-f21660bef13f // indirect + github.com/sagernet/cronet-go/lib/darwin_arm64 v0.0.0-20260117110516-f21660bef13f // indirect + github.com/sagernet/cronet-go/lib/ios_amd64_simulator v0.0.0-20260117110516-f21660bef13f // indirect + github.com/sagernet/cronet-go/lib/ios_arm64 v0.0.0-20260117110516-f21660bef13f // indirect + github.com/sagernet/cronet-go/lib/ios_arm64_simulator v0.0.0-20260117110516-f21660bef13f // indirect + github.com/sagernet/cronet-go/lib/linux_386 v0.0.0-20260117110516-f21660bef13f // indirect + github.com/sagernet/cronet-go/lib/linux_386_musl v0.0.0-20260117110516-f21660bef13f // indirect + github.com/sagernet/cronet-go/lib/linux_amd64 v0.0.0-20260117110516-f21660bef13f // indirect + github.com/sagernet/cronet-go/lib/linux_amd64_musl v0.0.0-20260117110516-f21660bef13f // indirect + github.com/sagernet/cronet-go/lib/linux_arm v0.0.0-20260117110516-f21660bef13f // indirect + github.com/sagernet/cronet-go/lib/linux_arm64 v0.0.0-20260117110516-f21660bef13f // indirect + github.com/sagernet/cronet-go/lib/linux_arm64_musl v0.0.0-20260117110516-f21660bef13f // indirect + github.com/sagernet/cronet-go/lib/linux_arm_musl v0.0.0-20260117110516-f21660bef13f // indirect + github.com/sagernet/cronet-go/lib/tvos_amd64_simulator v0.0.0-20260117110516-f21660bef13f // indirect + github.com/sagernet/cronet-go/lib/tvos_arm64 v0.0.0-20260117110516-f21660bef13f // indirect + github.com/sagernet/cronet-go/lib/tvos_arm64_simulator v0.0.0-20260117110516-f21660bef13f // indirect + github.com/sagernet/cronet-go/lib/windows_amd64 v0.0.0-20260117110516-f21660bef13f // indirect + github.com/sagernet/cronet-go/lib/windows_arm64 v0.0.0-20260117110516-f21660bef13f // indirect github.com/sagernet/fswatch v0.1.1 // indirect github.com/sagernet/gvisor v0.0.0-20250822052253-5558536cf237 // indirect github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a // indirect github.com/sagernet/nftables v0.3.0-beta.4 // indirect - github.com/sagernet/sing-mux v0.3.3 // indirect + github.com/sagernet/sing-mux v0.3.4 // indirect github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11 // indirect - github.com/sagernet/sing-tun v0.8.0-beta.11.0.20251201004738-e9e3fbf0c15e // indirect + github.com/sagernet/sing-tun v0.8.0-beta.17 // indirect github.com/sagernet/sing-vmess v0.2.8-0.20250909125414-3aed155119a1 // indirect - github.com/sagernet/smux v1.5.34-mod.2 // indirect - github.com/sagernet/tailscale v1.86.5-sing-box-1.13-mod.4 // indirect + github.com/sagernet/smux v1.5.50-sing-box-mod.1 // indirect + github.com/sagernet/tailscale v1.92.4-sing-box-1.13-mod.6 // indirect github.com/sagernet/wireguard-go v0.0.2-beta.1.0.20250917110311-16510ac47288 // indirect github.com/sagernet/ws v0.0.0-20231204124109-acfe8907c854 // indirect github.com/tailscale/certstore v0.1.1-0.20231202035212-d3fa0460f47e // indirect @@ -140,7 +139,6 @@ require ( github.com/tailscale/netlink v1.1.1-0.20240822203006-4d49adab4de7 // indirect github.com/tailscale/peercred v0.0.0-20250107143737-35a0c7bd7edc // indirect github.com/tailscale/web-client-prebuilt v0.0.0-20250124233751-d4cd19a26976 // indirect - github.com/tailscale/wireguard-go v0.0.0-20250716170648-1d0488a3d7da // indirect github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect @@ -163,6 +161,7 @@ require ( golang.org/x/crypto v0.46.0 // indirect golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 // indirect golang.org/x/mod v0.31.0 // indirect + golang.org/x/oauth2 v0.32.0 // indirect golang.org/x/sync v0.19.0 // indirect golang.org/x/sys v0.39.0 // indirect golang.org/x/term v0.38.0 // indirect diff --git a/sing-box/test/go.sum b/sing-box/test/go.sum index a7725af2e1..34f8d99704 100644 --- a/sing-box/test/go.sum +++ b/sing-box/test/go.sum @@ -37,13 +37,10 @@ github.com/database64128/netx-go v0.1.1/go.mod h1:LNlYVipaYkQArRFDNNJ02VkNV+My9A github.com/database64128/tfo-go/v2 v2.3.1 h1:EGE+ELd5/AQ0X6YBlQ9RgKs8+kciNhgN3d8lRvfEJQw= github.com/database64128/tfo-go/v2 v2.3.1/go.mod h1:k9wcpg/8i5zenspBkc9jUEYehpZZccBnCElzOJB++bU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dblohm7/wingoes v0.0.0-20240119213807-a09d6be7affa h1:h8TfIT1xc8FWbwwpmHn1J5i43Y0uZP97GqasGCzSRJk= github.com/dblohm7/wingoes v0.0.0-20240119213807-a09d6be7affa/go.mod h1:Nx87SkVqTKd8UtT+xu7sM/l+LgXs6c0aHrlKusR+2EQ= -github.com/digitalocean/go-smbios v0.0.0-20180907143718-390a4f403a8e h1:vUmf0yezR0y7jJ5pceLHthLaYf4bA5T14B6q39S4q2Q= -github.com/digitalocean/go-smbios v0.0.0-20180907143718-390a4f403a8e/go.mod h1:YTIHhz/QFSYnu/EhlF2SpU2Uk+32abacUYA5ZPljz1A= github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/docker/docker v27.3.1+incompatible h1:KttF0XoteNTicmUtBO0L2tP+J7FGRFTjaEF4k6WdhfI= @@ -56,6 +53,8 @@ github.com/ebitengine/purego v0.9.1 h1:a/k2f2HQU3Pi399RPW1MOaZyhKJL9w/xFpKAg4q1s github.com/ebitengine/purego v0.9.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/florianl/go-nfqueue/v2 v2.0.2 h1:FL5lQTeetgpCvac1TRwSfgaXUn0YSO7WzGvWNIp3JPE= +github.com/florianl/go-nfqueue/v2 v2.0.2/go.mod h1:VA09+iPOT43OMoCKNfXHyzujQUty2xmzyCRkBOlmabc= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= @@ -68,8 +67,8 @@ github.com/go-chi/chi/v5 v5.2.3 h1:WQIt9uxdsAbgIYgid+BpYc+liqQZGMHRaUwp0JUcvdE= github.com/go-chi/chi/v5 v5.2.3/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= github.com/go-chi/render v1.0.3 h1:AsXqd2a1/INaIfUSKq3G5uA8weYx20FOsM7uSoCyyt4= github.com/go-chi/render v1.0.3/go.mod h1:/gr3hVkmYR0YlEy3LxCuVRFzEu9Ruok+gFqbIofjao0= -github.com/go-json-experiment/json v0.0.0-20250223041408-d3c622f1b874 h1:F8d1AJ6M9UQCavhwmO6ZsrYLfG8zVFWfEfMS2MXPkSY= -github.com/go-json-experiment/json v0.0.0-20250223041408-d3c622f1b874/go.mod h1:TiCD2a1pcmjd7YnhGH0f/zKNcCD06B029pHhzV23c2M= +github.com/go-json-experiment/json v0.0.0-20250813024750-ebf49471dced h1:Q311OHjMh/u5E2TITc++WlTP5We0xNseRMkHDyvhW7I= +github.com/go-json-experiment/json v0.0.0-20250813024750-ebf49471dced/go.mod h1:TiCD2a1pcmjd7YnhGH0f/zKNcCD06B029pHhzV23c2M= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -105,8 +104,6 @@ github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8 github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns= github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N3iBb1Tb4rdcU= github.com/hdevalence/ed25519consensus v0.2.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= -github.com/illarion/gonotify/v3 v3.0.2 h1:O7S6vcopHexutmpObkeWsnzMJt/r1hONIEogeVNmJMk= -github.com/illarion/gonotify/v3 v3.0.2/go.mod h1:HWGPdPe817GfvY3w7cx6zkbzNZfi3QjcBm/wgVvEL1U= github.com/insomniacslk/dhcp v0.0.0-20251020182700-175e84fbb167 h1:MEufgJohwIjFi2n3eJv4c/8UdRLQVUwPwSWQPoER+eU= github.com/insomniacslk/dhcp v0.0.0-20251020182700-175e84fbb167/go.mod h1:qfvBmyDNp+/liLEYWRvqny/PEz9hGe2Dz833eXILSmo= github.com/jsimonetti/rtnetlink v1.4.0 h1:Z1BF0fRgcETPEa0Kt0MRk3yV5+kF1FWTni6KUFKrq2I= @@ -115,14 +112,16 @@ github.com/keybase/go-keychain v0.0.1 h1:way+bWYa6lDppZoZcgMbYsvC7GxljxrskdNInRt github.com/keybase/go-keychain v0.0.1/go.mod h1:PdEILRW3i9D8JcdM+FmY6RwkHGnhHxXwkPPMeUgOK1k= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= -github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/libdns/acmedns v0.5.0 h1:5pRtmUj4Lb/QkNJSl1xgOGBUJTWW7RjpNaIhjpDXjPE= +github.com/libdns/acmedns v0.5.0/go.mod h1:X7UAFP1Ep9NpTwWpVlrZzJLR7epynAy0wrIxSPFgKjQ= github.com/libdns/alidns v1.0.6-beta.3 h1:KAmb7FQ1tRzKsaAUGa7ZpGKAMRANwg7+1c7tUbSELq8= github.com/libdns/alidns v1.0.6-beta.3/go.mod h1:RECwyQ88e9VqQVtSrvX76o1ux3gQUKGzMgxICi+u7Ec= github.com/libdns/cloudflare v0.2.2 h1:XWHv+C1dDcApqazlh08Q6pjytYLgR2a+Y3xrXFu0vsI= @@ -131,16 +130,12 @@ github.com/libdns/libdns v1.1.1 h1:wPrHrXILoSHKWJKGd0EiAVmiJbFShguILTg9leS/P/U= github.com/libdns/libdns v1.1.1/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ= github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/mdlayher/genetlink v1.3.2 h1:KdrNKe+CTu+IbZnm/GVUMXSqBBLqcGpRDa0xkQy56gw= -github.com/mdlayher/genetlink v1.3.2/go.mod h1:tcC3pkCrPUGIKKsCsp0B3AdaaKuHtaxoJRz3cc+528o= github.com/mdlayher/netlink v1.7.3-0.20250113171957-fbb4dce95f42 h1:A1Cq6Ysb0GM0tpKMbdCXCIfBclan4oHk1Jb+Hrejirg= github.com/mdlayher/netlink v1.7.3-0.20250113171957-fbb4dce95f42/go.mod h1:BB4YCPDOzfy7FniQ/lxuYQ3dgmM2cZumHbK8RpTjN2o= -github.com/mdlayher/sdnotify v1.0.0 h1:Ma9XeLVN/l0qpyx1tNeMSeTjCPH6NtuD6/N9XdTlQ3c= -github.com/mdlayher/sdnotify v1.0.0/go.mod h1:HQUmpM4XgYkhDLtd+Uad8ZFK1T9D5+pNxnXQjCeJlGE= github.com/mdlayher/socket v0.5.1 h1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos= github.com/mdlayher/socket v0.5.1/go.mod h1:TjPLHI1UgwEv5J1B5q0zTZq12A/6H7nKmtTanQE37IQ= -github.com/metacubex/utls v1.8.3 h1:0m/yCxm3SK6kWve2lKiFb1pue1wHitJ8sQQD4Ikqde4= -github.com/metacubex/utls v1.8.3/go.mod h1:kncGGVhFaoGn5M3pFe3SXhZCzsbCJayNOH4UEqTKTko= +github.com/metacubex/utls v1.8.4 h1:HmL9nUApDdWSkgUyodfwF6hSjtiwCGGdyhaSpEejKpg= +github.com/metacubex/utls v1.8.4/go.mod h1:kncGGVhFaoGn5M3pFe3SXhZCzsbCJayNOH4UEqTKTko= github.com/mholt/acmez/v3 v3.1.4 h1:DyzZe/RnAzT3rpZj/2Ii5xZpiEvvYk3cQEN/RmqxwFQ= github.com/mholt/acmez/v3 v3.1.4/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ= github.com/miekg/dns v1.1.69 h1:Kb7Y/1Jo+SG+a2GtfoFUfDkG//csdRPwRLkCsxDG9Sc= @@ -159,10 +154,12 @@ github.com/openai/openai-go/v3 v3.15.0 h1:hk99rM7YPz+M99/5B/zOQcVwFRLLMdprVGx1va github.com/openai/openai-go/v3 v3.15.0/go.mod h1:cdufnVK14cWcT9qA1rRtrXx4FTRsgbDPW7Ia7SS5cZo= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pires/go-proxyproto v0.8.1 h1:9KEixbdJfhrbtjpz/ZwCdWDD2Xem0NZ38qMYaASJgp0= +github.com/pires/go-proxyproto v0.8.1/go.mod h1:ZKAAyp3cgy5Y5Mo4n9AlScrkCZwUy0g3Jf+slqQVcuU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -180,54 +177,54 @@ github.com/sagernet/bbolt v0.0.0-20231014093535-ea5cb2fe9f0a h1:+NkI2670SQpQWvkk github.com/sagernet/bbolt v0.0.0-20231014093535-ea5cb2fe9f0a/go.mod h1:63s7jpZqcDAIpj8oI/1v4Izok+npJOHACFCU6+huCkM= github.com/sagernet/cors v1.2.1 h1:Cv5Z8y9YSD6Gm+qSpNrL3LO4lD3eQVvbFYJSG7JCMHQ= github.com/sagernet/cors v1.2.1/go.mod h1:O64VyOjjhrkLmQIjF4KGRrJO/5dVXFdpEmCW/eISRAI= -github.com/sagernet/cronet-go v0.0.0-20251220122645-b05b5c41614a h1:EdIrRa0yH3ZaLOfX95RYYiN0etpX3b9+jcsW/D8jCyQ= -github.com/sagernet/cronet-go v0.0.0-20251220122645-b05b5c41614a/go.mod h1:hwFHBEjjthyEquDULbr4c4ucMedp8Drb6Jvm2kt/0Bw= -github.com/sagernet/cronet-go/all v0.0.0-20251220122645-b05b5c41614a h1:GU/oBPVjyrCVb2l0SI5qtF6aUlLsnE4u4ehXbS/NF+0= -github.com/sagernet/cronet-go/all v0.0.0-20251220122645-b05b5c41614a/go.mod h1:4MT0juyKK0lIVwa6+6xLbRMFJBUIqRZOx70iMvq5vf0= -github.com/sagernet/cronet-go/lib/android_386 v0.0.0-20251220122226-25b6d00c5b7e h1:EAcY0ZK8DWTNUdVCKdBQfXRsfGsohsh2ae9jIjlri2o= -github.com/sagernet/cronet-go/lib/android_386 v0.0.0-20251220122226-25b6d00c5b7e/go.mod h1:XXDwdjX/T8xftoeJxQmbBoYXZp8MAPFR2CwbFuTpEtw= -github.com/sagernet/cronet-go/lib/android_amd64 v0.0.0-20251220122226-25b6d00c5b7e h1:9luoNSy9Ej8rC/nZejzrP0uxX+BxiNxjLJ7XPYlApQg= -github.com/sagernet/cronet-go/lib/android_amd64 v0.0.0-20251220122226-25b6d00c5b7e/go.mod h1:iNiUGoLtnr8/JTuVNj7XJbmpOAp2C6+B81KDrPxwaZM= -github.com/sagernet/cronet-go/lib/android_arm v0.0.0-20251220122226-25b6d00c5b7e h1:CSWZTuMlkO/98RSQpqC1EHtc9eSBzVmvMdPTnaFSDCM= -github.com/sagernet/cronet-go/lib/android_arm v0.0.0-20251220122226-25b6d00c5b7e/go.mod h1:19ILNUOGIzRdOqa2mq+iY0JoHxuieB7/lnjYeaA2vEc= -github.com/sagernet/cronet-go/lib/android_arm64 v0.0.0-20251220122226-25b6d00c5b7e h1:vkf3GDA11NtGm6XQHyP4tgWK3GD426ObmshdKdxGMhA= -github.com/sagernet/cronet-go/lib/android_arm64 v0.0.0-20251220122226-25b6d00c5b7e/go.mod h1:JxzGyQf94Cr6sBShKqODGDyRUlESfJK/Njcz9Lz6qMQ= -github.com/sagernet/cronet-go/lib/darwin_amd64 v0.0.0-20251220122226-25b6d00c5b7e h1:pNyNjDC5XPC6+2yNqiDA8QL8IYSsBJpaSLwPi/jY4JQ= -github.com/sagernet/cronet-go/lib/darwin_amd64 v0.0.0-20251220122226-25b6d00c5b7e/go.mod h1:KN+9T9TBycGOLzmKU4QdcHAJEj6Nlx48ifnlTvvHMvs= -github.com/sagernet/cronet-go/lib/darwin_arm64 v0.0.0-20251220122226-25b6d00c5b7e h1:2yDmTzppvxWuwxo4oDjxRzjlXBzZ6O3OCPWYeQcJRrw= -github.com/sagernet/cronet-go/lib/darwin_arm64 v0.0.0-20251220122226-25b6d00c5b7e/go.mod h1:kojvtUc29KKnk8hs2QIANynVR59921SnGWA9kXohHc0= -github.com/sagernet/cronet-go/lib/ios_amd64_simulator v0.0.0-20251220122226-25b6d00c5b7e h1:+lyrRlxlKBYT/3LcYMaFHilUnRlKn3OQrImlWCey+qM= -github.com/sagernet/cronet-go/lib/ios_amd64_simulator v0.0.0-20251220122226-25b6d00c5b7e/go.mod h1:hkQzRE5GDbaH1/ioqYh0Taho4L6i0yLRCVEZ5xHz5M0= -github.com/sagernet/cronet-go/lib/ios_arm64 v0.0.0-20251220122226-25b6d00c5b7e h1:dBeeUaCPG0Y26FfCPO1o3v72yw2pSjqopryAW0uV354= -github.com/sagernet/cronet-go/lib/ios_arm64 v0.0.0-20251220122226-25b6d00c5b7e/go.mod h1:tzVJFTOm66UxLxy6K0ZN5Ic2PC79e+sKKnt+V9puEa4= -github.com/sagernet/cronet-go/lib/ios_arm64_simulator v0.0.0-20251220122226-25b6d00c5b7e h1:JkGEqkfeglehN9tu+a0gHTq9Dmm+pY2wtjY+NiUdjgw= -github.com/sagernet/cronet-go/lib/ios_arm64_simulator v0.0.0-20251220122226-25b6d00c5b7e/go.mod h1:M/pN6m3j0HFU6/y83n0HU6GLYys3tYdr/xTE8hVEGMo= -github.com/sagernet/cronet-go/lib/linux_386 v0.0.0-20251220122226-25b6d00c5b7e h1:rd/AbuuEMCHcA6ib5JBkQmWvonnoGwVc0/P0sHcWfAQ= -github.com/sagernet/cronet-go/lib/linux_386 v0.0.0-20251220122226-25b6d00c5b7e/go.mod h1:cGh5hO6eljCo6KMQ/Cel8Xgq4+etL0awZLRBDVG1EZQ= -github.com/sagernet/cronet-go/lib/linux_386_musl v0.0.0-20251220122226-25b6d00c5b7e h1:4XcwU6KOCkVOAr2EKKY8geYm7ctKCLlb1SsmFWMMUzE= -github.com/sagernet/cronet-go/lib/linux_386_musl v0.0.0-20251220122226-25b6d00c5b7e/go.mod h1:JFE0/cxaKkx0wqPMZU7MgaplQlU0zudv82dROJjClKU= -github.com/sagernet/cronet-go/lib/linux_amd64 v0.0.0-20251220122226-25b6d00c5b7e h1:fYDhPtxvMtZxBUM0k6GcaxbynLxMG2iTmQL3XcLtjS8= -github.com/sagernet/cronet-go/lib/linux_amd64 v0.0.0-20251220122226-25b6d00c5b7e/go.mod h1:vU8VftFeSt7fURCa3JXD6+k6ss1YAX+idQjPvHmJ2tI= -github.com/sagernet/cronet-go/lib/linux_amd64_musl v0.0.0-20251220122226-25b6d00c5b7e h1:F5Vzd50H/AaoSHvt81yXZeUwDRKTcFjO/+KVW6VqbUs= -github.com/sagernet/cronet-go/lib/linux_amd64_musl v0.0.0-20251220122226-25b6d00c5b7e/go.mod h1:vCe4OUuL+XOUge9v3MyTD45BnuAXiH+DkjN9quDXJzQ= -github.com/sagernet/cronet-go/lib/linux_arm v0.0.0-20251220122226-25b6d00c5b7e h1:Ok/Eh8ajcvxlu7FAWk+lHAPLcSRDKrKkgq30o6gCR6M= -github.com/sagernet/cronet-go/lib/linux_arm v0.0.0-20251220122226-25b6d00c5b7e/go.mod h1:w9amBWrvjtohQzBGCKJ7LCh22LhTIJs4sE7cYaKQzM0= -github.com/sagernet/cronet-go/lib/linux_arm64 v0.0.0-20251220122226-25b6d00c5b7e h1:JoohVAfcwE9HjpwAaTULtEOFZ1Mz0Zz5K4pOcrRjqwo= -github.com/sagernet/cronet-go/lib/linux_arm64 v0.0.0-20251220122226-25b6d00c5b7e/go.mod h1:TqlsFtcYS/etTeck46kHBeT8Le0Igw1Q/AV88UnMS3s= -github.com/sagernet/cronet-go/lib/linux_arm64_musl v0.0.0-20251220122226-25b6d00c5b7e h1:ULxfoxcNRA96QDDRLmObH4adbeUGtudH/2HlL4TgaNY= -github.com/sagernet/cronet-go/lib/linux_arm64_musl v0.0.0-20251220122226-25b6d00c5b7e/go.mod h1:B6Qd0vys8sv9OKVRN6J9RqDzYRGE938Fb2zrYdBDyTQ= -github.com/sagernet/cronet-go/lib/linux_arm_musl v0.0.0-20251220122226-25b6d00c5b7e h1:NnhScXJyx4Fg+pV/WtkC1mD6+VR7D/Q+PMU4xGRvdRQ= -github.com/sagernet/cronet-go/lib/linux_arm_musl v0.0.0-20251220122226-25b6d00c5b7e/go.mod h1:3tXMMFY7AHugOVBZ5Al7cL7JKsnFOe5bMVr0hZPk3ow= -github.com/sagernet/cronet-go/lib/tvos_amd64_simulator v0.0.0-20251220122226-25b6d00c5b7e h1:INcIfjzUl0qgtZkt8OcVV537GoApcBsdegDl8yNJEdQ= -github.com/sagernet/cronet-go/lib/tvos_amd64_simulator v0.0.0-20251220122226-25b6d00c5b7e/go.mod h1:aaX0YGl8nhGmfRWI8bc3BtDjY8Vzx6O0cS/e1uqxDq4= -github.com/sagernet/cronet-go/lib/tvos_arm64 v0.0.0-20251220122226-25b6d00c5b7e h1:jrialJ4U7BW9xyGI/JdUiigZ9hgyF1EayFKCH4pZxdw= -github.com/sagernet/cronet-go/lib/tvos_arm64 v0.0.0-20251220122226-25b6d00c5b7e/go.mod h1:EdzMKA96xITc42QEI+ct4SwqX8Dn3ltKK8wzdkLWpSc= -github.com/sagernet/cronet-go/lib/tvos_arm64_simulator v0.0.0-20251220122226-25b6d00c5b7e h1:XefHhnALVHU4ZgICNq6ZJl78bWDQO4nHwoWn+Ar7e0g= -github.com/sagernet/cronet-go/lib/tvos_arm64_simulator v0.0.0-20251220122226-25b6d00c5b7e/go.mod h1:qix4kv1TTAJ5tY4lJ9vjhe9EY4mM+B7H5giOhbxDVcc= -github.com/sagernet/cronet-go/lib/windows_amd64 v0.0.0-20251220122226-25b6d00c5b7e h1:djShWO5vN0CamyboNDyNRDxL0/9oMtKjCDesqolIAsg= -github.com/sagernet/cronet-go/lib/windows_amd64 v0.0.0-20251220122226-25b6d00c5b7e/go.mod h1:lm9w/oCCRyBiUa3G8lDQTT8x/ONUvgVR2iV9fVzUZB8= -github.com/sagernet/cronet-go/lib/windows_arm64 v0.0.0-20251220122226-25b6d00c5b7e h1:AgKqyS5zfRgDc8uprxUh+XCwwzJCj31KAFPjzyLRWs0= -github.com/sagernet/cronet-go/lib/windows_arm64 v0.0.0-20251220122226-25b6d00c5b7e/go.mod h1:n34YyLgapgjWdKa0IoeczjAFCwD3/dxbsH5sucKw0bw= +github.com/sagernet/cronet-go v0.0.0-20260117110918-dc1cda1fe287 h1:0BYNmr0ptjsII948U0oBFmrbo4qEaCFcrE2JPRg3Zlk= +github.com/sagernet/cronet-go v0.0.0-20260117110918-dc1cda1fe287/go.mod h1:hwFHBEjjthyEquDULbr4c4ucMedp8Drb6Jvm2kt/0Bw= +github.com/sagernet/cronet-go/all v0.0.0-20260117110918-dc1cda1fe287 h1:ghxhYSBQpzkakqWqJDvXr/Zmxe0WjTjKuALEGbjGiGY= +github.com/sagernet/cronet-go/all v0.0.0-20260117110918-dc1cda1fe287/go.mod h1:M+4ZjPhLJXIvoxcQsbDofmc19Wrig59hZ+hLvj6S3To= +github.com/sagernet/cronet-go/lib/android_386 v0.0.0-20260117110516-f21660bef13f h1:8jZbZ4KBTdcXDFLwUBNQt5Xci6ZuAKh255S8TwuBCaM= +github.com/sagernet/cronet-go/lib/android_386 v0.0.0-20260117110516-f21660bef13f/go.mod h1:XXDwdjX/T8xftoeJxQmbBoYXZp8MAPFR2CwbFuTpEtw= +github.com/sagernet/cronet-go/lib/android_amd64 v0.0.0-20260117110516-f21660bef13f h1:tG0hCx+0u5zca7qQ7AMkcv4DCrBG/DKW1ggs/P+BRRI= +github.com/sagernet/cronet-go/lib/android_amd64 v0.0.0-20260117110516-f21660bef13f/go.mod h1:iNiUGoLtnr8/JTuVNj7XJbmpOAp2C6+B81KDrPxwaZM= +github.com/sagernet/cronet-go/lib/android_arm v0.0.0-20260117110516-f21660bef13f h1:ZXp5hKJIA7iJ52ZShJCKMQEPLpp/7dDIVZmPGV9Il40= +github.com/sagernet/cronet-go/lib/android_arm v0.0.0-20260117110516-f21660bef13f/go.mod h1:19ILNUOGIzRdOqa2mq+iY0JoHxuieB7/lnjYeaA2vEc= +github.com/sagernet/cronet-go/lib/android_arm64 v0.0.0-20260117110516-f21660bef13f h1:gL7H8HS8s38adz4/HZtRHh79qMwsbLTRRPz4GQ9LcWI= +github.com/sagernet/cronet-go/lib/android_arm64 v0.0.0-20260117110516-f21660bef13f/go.mod h1:JxzGyQf94Cr6sBShKqODGDyRUlESfJK/Njcz9Lz6qMQ= +github.com/sagernet/cronet-go/lib/darwin_amd64 v0.0.0-20260117110516-f21660bef13f h1:Dchgc0pAY5Jwb5lzUlE+1nhHIzqLx+YOurXLHgvWd/0= +github.com/sagernet/cronet-go/lib/darwin_amd64 v0.0.0-20260117110516-f21660bef13f/go.mod h1:KN+9T9TBycGOLzmKU4QdcHAJEj6Nlx48ifnlTvvHMvs= +github.com/sagernet/cronet-go/lib/darwin_arm64 v0.0.0-20260117110516-f21660bef13f h1:+MOLSQoduuKDxF410i1LcSPaQGaiP0eZb0INvMlmjM4= +github.com/sagernet/cronet-go/lib/darwin_arm64 v0.0.0-20260117110516-f21660bef13f/go.mod h1:kojvtUc29KKnk8hs2QIANynVR59921SnGWA9kXohHc0= +github.com/sagernet/cronet-go/lib/ios_amd64_simulator v0.0.0-20260117110516-f21660bef13f h1:lIZna05Vn6n8k21p8OpSUnhwGm+E57PrMjiI4ZUfMSg= +github.com/sagernet/cronet-go/lib/ios_amd64_simulator v0.0.0-20260117110516-f21660bef13f/go.mod h1:hkQzRE5GDbaH1/ioqYh0Taho4L6i0yLRCVEZ5xHz5M0= +github.com/sagernet/cronet-go/lib/ios_arm64 v0.0.0-20260117110516-f21660bef13f h1:B2aFQ5CRHI20t8YsEizvtguS5W2QfK7D5XV/NzTIxPE= +github.com/sagernet/cronet-go/lib/ios_arm64 v0.0.0-20260117110516-f21660bef13f/go.mod h1:tzVJFTOm66UxLxy6K0ZN5Ic2PC79e+sKKnt+V9puEa4= +github.com/sagernet/cronet-go/lib/ios_arm64_simulator v0.0.0-20260117110516-f21660bef13f h1:qpSwJ1rFGYCfJDenNCZoWYjoG7N+xEa6ke+E7/JO1i4= +github.com/sagernet/cronet-go/lib/ios_arm64_simulator v0.0.0-20260117110516-f21660bef13f/go.mod h1:M/pN6m3j0HFU6/y83n0HU6GLYys3tYdr/xTE8hVEGMo= +github.com/sagernet/cronet-go/lib/linux_386 v0.0.0-20260117110516-f21660bef13f h1:cx7Ipg0tSvTDjS4maMEYz4vuzz93BMPAysmZ1YLrz80= +github.com/sagernet/cronet-go/lib/linux_386 v0.0.0-20260117110516-f21660bef13f/go.mod h1:cGh5hO6eljCo6KMQ/Cel8Xgq4+etL0awZLRBDVG1EZQ= +github.com/sagernet/cronet-go/lib/linux_386_musl v0.0.0-20260117110516-f21660bef13f h1:4jOHuUiBxD8pJEpBBVQfJqyLmxjpd3t4MLRzU7YLFyg= +github.com/sagernet/cronet-go/lib/linux_386_musl v0.0.0-20260117110516-f21660bef13f/go.mod h1:JFE0/cxaKkx0wqPMZU7MgaplQlU0zudv82dROJjClKU= +github.com/sagernet/cronet-go/lib/linux_amd64 v0.0.0-20260117110516-f21660bef13f h1:OpXBa2WlRU+Mam9oRe9Nn4/zf7gQ+qiBTNK8A5RwbfQ= +github.com/sagernet/cronet-go/lib/linux_amd64 v0.0.0-20260117110516-f21660bef13f/go.mod h1:vU8VftFeSt7fURCa3JXD6+k6ss1YAX+idQjPvHmJ2tI= +github.com/sagernet/cronet-go/lib/linux_amd64_musl v0.0.0-20260117110516-f21660bef13f h1:nJpGFi+6hI85tl4zoyNFEnFEQ5+xEV5gyvsUoMvd8g0= +github.com/sagernet/cronet-go/lib/linux_amd64_musl v0.0.0-20260117110516-f21660bef13f/go.mod h1:vCe4OUuL+XOUge9v3MyTD45BnuAXiH+DkjN9quDXJzQ= +github.com/sagernet/cronet-go/lib/linux_arm v0.0.0-20260117110516-f21660bef13f h1:SEy2rpmgOJgrqcEryJI/RSnqUWIsEsp0cfYoA8y21jc= +github.com/sagernet/cronet-go/lib/linux_arm v0.0.0-20260117110516-f21660bef13f/go.mod h1:w9amBWrvjtohQzBGCKJ7LCh22LhTIJs4sE7cYaKQzM0= +github.com/sagernet/cronet-go/lib/linux_arm64 v0.0.0-20260117110516-f21660bef13f h1:EW2TuFMLm0iBGqRZtuGwIZdeYmDtDsDmRcRRJQOMxUo= +github.com/sagernet/cronet-go/lib/linux_arm64 v0.0.0-20260117110516-f21660bef13f/go.mod h1:TqlsFtcYS/etTeck46kHBeT8Le0Igw1Q/AV88UnMS3s= +github.com/sagernet/cronet-go/lib/linux_arm64_musl v0.0.0-20260117110516-f21660bef13f h1:3U5woxrNCkzfv1+UX+mVoWh1228AE1qAiMG02F9oFbY= +github.com/sagernet/cronet-go/lib/linux_arm64_musl v0.0.0-20260117110516-f21660bef13f/go.mod h1:B6Qd0vys8sv9OKVRN6J9RqDzYRGE938Fb2zrYdBDyTQ= +github.com/sagernet/cronet-go/lib/linux_arm_musl v0.0.0-20260117110516-f21660bef13f h1:YwFTfuWG3mmctroeDYtFZ6LHjGsedVO+5wInYbbUuUY= +github.com/sagernet/cronet-go/lib/linux_arm_musl v0.0.0-20260117110516-f21660bef13f/go.mod h1:3tXMMFY7AHugOVBZ5Al7cL7JKsnFOe5bMVr0hZPk3ow= +github.com/sagernet/cronet-go/lib/tvos_amd64_simulator v0.0.0-20260117110516-f21660bef13f h1:r4V0ddPCRLgGu0VdgR3aUsO9NjpmyjAf+h+3oTD9D6E= +github.com/sagernet/cronet-go/lib/tvos_amd64_simulator v0.0.0-20260117110516-f21660bef13f/go.mod h1:aaX0YGl8nhGmfRWI8bc3BtDjY8Vzx6O0cS/e1uqxDq4= +github.com/sagernet/cronet-go/lib/tvos_arm64 v0.0.0-20260117110516-f21660bef13f h1:B8yf4gFvEYUnwWmtVK9sdwUsflYZ387MhYmlOP2ohFQ= +github.com/sagernet/cronet-go/lib/tvos_arm64 v0.0.0-20260117110516-f21660bef13f/go.mod h1:EdzMKA96xITc42QEI+ct4SwqX8Dn3ltKK8wzdkLWpSc= +github.com/sagernet/cronet-go/lib/tvos_arm64_simulator v0.0.0-20260117110516-f21660bef13f h1:9YyaMg4rO1/jIgrxmNb0LKH+X7frSYWfX2pFgW5JUVM= +github.com/sagernet/cronet-go/lib/tvos_arm64_simulator v0.0.0-20260117110516-f21660bef13f/go.mod h1:qix4kv1TTAJ5tY4lJ9vjhe9EY4mM+B7H5giOhbxDVcc= +github.com/sagernet/cronet-go/lib/windows_amd64 v0.0.0-20260117110516-f21660bef13f h1:B0fnGu0sh9yT/9JDN5u/GqThGoOzNN/daOAuGWFLXEk= +github.com/sagernet/cronet-go/lib/windows_amd64 v0.0.0-20260117110516-f21660bef13f/go.mod h1:lm9w/oCCRyBiUa3G8lDQTT8x/ONUvgVR2iV9fVzUZB8= +github.com/sagernet/cronet-go/lib/windows_arm64 v0.0.0-20260117110516-f21660bef13f h1:lxPcIXKSSI5JDhc7rx/6yufISWM4vtBS2FY9PavWQTs= +github.com/sagernet/cronet-go/lib/windows_arm64 v0.0.0-20260117110516-f21660bef13f/go.mod h1:n34YyLgapgjWdKa0IoeczjAFCwD3/dxbsH5sucKw0bw= github.com/sagernet/fswatch v0.1.1 h1:YqID+93B7VRfqIH3PArW/XpJv5H4OLEVWDfProGoRQs= github.com/sagernet/fswatch v0.1.1/go.mod h1:nz85laH0mkQqJfaOrqPpkwtU1znMFNVTpT/5oRsVz/o= github.com/sagernet/gvisor v0.0.0-20250822052253-5558536cf237 h1:SUPFNB+vSP4RBPrSEgNII+HkfqC8hKMpYLodom4o4EU= @@ -236,27 +233,28 @@ github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZN github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM= github.com/sagernet/nftables v0.3.0-beta.4 h1:kbULlAwAC3jvdGAC1P5Fa3GSxVwQJibNenDW2zaXr8I= github.com/sagernet/nftables v0.3.0-beta.4/go.mod h1:OQXAjvjNGGFxaTgVCSTRIhYB5/llyVDeapVoENYBDS8= -github.com/sagernet/quic-go v0.58.0-sing-box-mod.1 h1:E9yZrU0ZxSiW5RrGUnFZeI02EIMdAAv0RxdoxXCqZyk= -github.com/sagernet/quic-go v0.58.0-sing-box-mod.1/go.mod h1:OqILvS182CyOol5zNNo6bguvOGgXzV459+chpRaUC+4= -github.com/sagernet/sing v0.6.9/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak= -github.com/sagernet/sing v0.8.0-beta.6.0.20251207063731-56fd482ce1c6 h1:EYaDzllFzNYnzQ9xH/ieSAXct4wQ8pD45kgNMo7RPZc= -github.com/sagernet/sing v0.8.0-beta.6.0.20251207063731-56fd482ce1c6/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak= -github.com/sagernet/sing-mux v0.3.3 h1:YFgt9plMWzH994BMZLmyKL37PdIVaIilwP0Jg+EcLfw= -github.com/sagernet/sing-mux v0.3.3/go.mod h1:pht8iFY4c9Xltj7rhVd208npkNaeCxzyXCgulDPLUDA= +github.com/sagernet/quic-go v0.59.0-sing-box-mod.2 h1:hJUL+HtxEOjxsa0CsucbBVqI/AMS4k52NwNU637zmdw= +github.com/sagernet/quic-go v0.59.0-sing-box-mod.2/go.mod h1:OqILvS182CyOol5zNNo6bguvOGgXzV459+chpRaUC+4= +github.com/sagernet/sing v0.8.0-beta.16 h1:Fe+6E9VHYky9Mx4cf0ugbZPWDcXRflpAu7JQ5bWXvaA= +github.com/sagernet/sing v0.8.0-beta.16/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak= +github.com/sagernet/sing-mux v0.3.4 h1:ZQplKl8MNXutjzbMVtWvWG31fohhgOfCuUZR4dVQ8+s= +github.com/sagernet/sing-mux v0.3.4/go.mod h1:QvlKMyNBNrQoyX4x+gq028uPbLM2XeRpWtDsWBJbFSk= +github.com/sagernet/sing-quic v0.6.0-beta.11 h1:eUusxITKKRedhWC2ScUYFUvD96h/QfbKLaS3N6/7in4= +github.com/sagernet/sing-quic v0.6.0-beta.11/go.mod h1:K5bWvITOm4vE10fwLfrWpw27bCoVJ+tfQ79tOWg+Ko8= github.com/sagernet/sing-shadowsocks v0.2.8 h1:PURj5PRoAkqeHh2ZW205RWzN9E9RtKCVCzByXruQWfE= github.com/sagernet/sing-shadowsocks v0.2.8/go.mod h1:lo7TWEMDcN5/h5B8S0ew+r78ZODn6SwVaFhvB6H+PTI= github.com/sagernet/sing-shadowsocks2 v0.2.1 h1:dWV9OXCeFPuYGHb6IRqlSptVnSzOelnqqs2gQ2/Qioo= github.com/sagernet/sing-shadowsocks2 v0.2.1/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ= github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11 h1:tK+75l64tm9WvEFrYRE1t0YxoFdWQqw/h7Uhzj0vJ+w= github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11/go.mod h1:sWqKnGlMipCHaGsw1sTTlimyUpgzP4WP3pjhCsYt9oA= -github.com/sagernet/sing-tun v0.8.0-beta.11.0.20251201004738-e9e3fbf0c15e h1:ZEv+9vy7vC1vbr3LfwZGx3JAOkl/w4+hnGamHw4W36M= -github.com/sagernet/sing-tun v0.8.0-beta.11.0.20251201004738-e9e3fbf0c15e/go.mod h1:eWETzl4AwaxGKiZTpDIDVJLTBz9cfIdoZwaZY1jlSjg= +github.com/sagernet/sing-tun v0.8.0-beta.17 h1:6DdbNXeTFYj8Tb4FCh8Mp2boA3rVY6VNqzTOObj7Xis= +github.com/sagernet/sing-tun v0.8.0-beta.17/go.mod h1:+HAK/y9GZljdT0KYKMYDR8MjjqnqDDQZYp5ZZQoRzS8= github.com/sagernet/sing-vmess v0.2.8-0.20250909125414-3aed155119a1 h1:aSwUNYUkVyVvdmBSufR8/nRFonwJeKSIROxHcm5br9o= github.com/sagernet/sing-vmess v0.2.8-0.20250909125414-3aed155119a1/go.mod h1:P11scgTxMxVVQ8dlM27yNm3Cro40mD0+gHbnqrNGDuY= -github.com/sagernet/smux v1.5.34-mod.2 h1:gkmBjIjlJ2zQKpLigOkFur5kBKdV6bNRoFu2WkltRQ4= -github.com/sagernet/smux v1.5.34-mod.2/go.mod h1:0KW0+R+ycvA2INW4gbsd7BNyg+HEfLIAxa5N02/28Zc= -github.com/sagernet/tailscale v1.86.5-sing-box-1.13-mod.4 h1:Ceg+9Ug+qAFgEchGodlHmMOY2h7KktQQDAyuoIsPbos= -github.com/sagernet/tailscale v1.86.5-sing-box-1.13-mod.4/go.mod h1:YdN/avjce8sqPFLT9E1uEh8gPewNSnC41U4ZhBJ+ACw= +github.com/sagernet/smux v1.5.50-sing-box-mod.1 h1:XkJcivBC9V4wBjiGXIXZ229aZCU1hzcbp6kSkkyQ478= +github.com/sagernet/smux v1.5.50-sing-box-mod.1/go.mod h1:NjhsCEWedJm7eFLyhuBgIEzwfhRmytrUoiLluxs5Sk8= +github.com/sagernet/tailscale v1.92.4-sing-box-1.13-mod.6 h1:eYz/OpMqWCvO2++iw3dEuzrlfC2xv78GdlGvprIM6O8= +github.com/sagernet/tailscale v1.92.4-sing-box-1.13-mod.6/go.mod h1:m87GAn4UcesHQF3leaPFEINZETO5za1LGn1GJdNDgNc= github.com/sagernet/wireguard-go v0.0.2-beta.1.0.20250917110311-16510ac47288 h1:E2tZFeg9mGYGQ7E7BbxMv1cU35HxwgRm6tPKI2Pp7DA= github.com/sagernet/wireguard-go v0.0.2-beta.1.0.20250917110311-16510ac47288/go.mod h1:WUxgxUDZoCF2sxVmW+STSxatP02Qn3FcafTiI2BLtE0= github.com/sagernet/ws v0.0.0-20231204124109-acfe8907c854 h1:6uUiZcDRnZSAegryaUGwPC/Fj13JSHwiTftrXhMmYOc= @@ -266,14 +264,7 @@ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVs github.com/spyzhov/ajson v0.9.4 h1:MVibcTCgO7DY4IlskdqIlCmDOsUOZ9P7oKj8ifdcf84= github.com/spyzhov/ajson v0.9.4/go.mod h1:a6oSw0MMb7Z5aD2tPoPO+jq11ETKgXUr2XktHdT8Wt8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tailscale/certstore v0.1.1-0.20231202035212-d3fa0460f47e h1:PtWT87weP5LWHEY//SWsYkSO3RWRZo4OSWagh3YD2vQ= @@ -290,8 +281,6 @@ github.com/tailscale/peercred v0.0.0-20250107143737-35a0c7bd7edc h1:24heQPtnFR+y github.com/tailscale/peercred v0.0.0-20250107143737-35a0c7bd7edc/go.mod h1:f93CXfllFsO9ZQVq+Zocb1Gp4G5Fz0b0rXHLOzt/Djc= github.com/tailscale/web-client-prebuilt v0.0.0-20250124233751-d4cd19a26976 h1:UBPHPtv8+nEAy2PD8RyAhOYvau1ek0HDJqLS/Pysi14= github.com/tailscale/web-client-prebuilt v0.0.0-20250124233751-d4cd19a26976/go.mod h1:agQPE6y6ldqCOui2gkIh7ZMztTkIQKH049tv8siLuNQ= -github.com/tailscale/wireguard-go v0.0.0-20250716170648-1d0488a3d7da h1:jVRUZPRs9sqyKlYHHzHjAqKN+6e/Vog6NpHYeNPJqOw= -github.com/tailscale/wireguard-go v0.0.0-20250716170648-1d0488a3d7da/go.mod h1:BOm5fXUBFM+m9woLNBoxI9TaBXXhGNP50LX/TGIvGb4= github.com/tc-hib/winres v0.2.1 h1:YDE0FiP0VmtRaDn7+aaChp1KiF4owBiJa5l964l5ujA= github.com/tc-hib/winres v0.2.1/go.mod h1:C/JaNhH3KBvhNKVbvdlDWkbMDO9H4fKKDaN7/07SSuk= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -373,6 +362,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= +golang.org/x/oauth2 v0.32.0 h1:jsCblLleRMDrxMN29H3z/k1KliIvpLgCkE6R8FXXNgY= +golang.org/x/oauth2 v0.32.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -388,7 +379,6 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -433,8 +423,6 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -gvisor.dev/gvisor v0.0.0-20250205023644-9414b50a5633 h1:2gap+Kh/3F47cO6hAu3idFvsJ0ue6TRcEi2IUkv/F8k= -gvisor.dev/gvisor v0.0.0-20250205023644-9414b50a5633/go.mod h1:5DMfjtclAbTIjbXqO1qCe2K5GKKxWz2JHvCChuTcJEM= lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE= lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= software.sslmate.com/src/go-pkcs12 v0.4.0 h1:H2g08FrTvSFKUj+D309j1DPfk5APnIdAQAB8aEykJ5k= diff --git a/sing-box/test/socks_test.go b/sing-box/test/socks_test.go new file mode 100644 index 0000000000..63dca5d6cc --- /dev/null +++ b/sing-box/test/socks_test.go @@ -0,0 +1,134 @@ +package main + +import ( + "context" + "net" + "net/netip" + "testing" + "time" + + C "github.com/sagernet/sing-box/constant" + "github.com/sagernet/sing-box/option" + "github.com/sagernet/sing/common" + F "github.com/sagernet/sing/common/format" + "github.com/sagernet/sing/common/json/badoption" + M "github.com/sagernet/sing/common/metadata" + N "github.com/sagernet/sing/common/network" + "github.com/sagernet/sing/protocol/socks" + + "github.com/stretchr/testify/require" +) + +func TestSOCKSUDPTimeout(t *testing.T) { + const testTimeout = 2 * time.Second + udpTimeout := option.UDPTimeoutCompat(testTimeout) + + startInstance(t, option.Options{ + Inbounds: []option.Inbound{ + { + Type: C.TypeSOCKS, + Tag: "socks-in", + Options: &option.SocksInboundOptions{ + ListenOptions: option.ListenOptions{ + Listen: common.Ptr(badoption.Addr(netip.IPv4Unspecified())), + ListenPort: clientPort, + UDPTimeout: udpTimeout, + }, + }, + }, + }, + Outbounds: []option.Outbound{ + { + Type: C.TypeDirect, + }, + }, + }) + + testUDPSessionIdleTimeout(t, clientPort, testPort, testTimeout) +} + +func TestMixedUDPTimeout(t *testing.T) { + const testTimeout = 2 * time.Second + udpTimeout := option.UDPTimeoutCompat(testTimeout) + + startInstance(t, option.Options{ + Inbounds: []option.Inbound{ + { + Type: C.TypeMixed, + Tag: "mixed-in", + Options: &option.HTTPMixedInboundOptions{ + ListenOptions: option.ListenOptions{ + Listen: common.Ptr(badoption.Addr(netip.IPv4Unspecified())), + ListenPort: clientPort, + UDPTimeout: udpTimeout, + }, + }, + }, + }, + Outbounds: []option.Outbound{ + { + Type: C.TypeDirect, + }, + }, + }) + + testUDPSessionIdleTimeout(t, clientPort, testPort, testTimeout) +} + +func testUDPSessionIdleTimeout(t *testing.T, proxyPort uint16, echoPort uint16, expectedTimeout time.Duration) { + echoServer, err := listenPacket("udp", ":"+F.ToString(echoPort)) + require.NoError(t, err) + defer echoServer.Close() + + go func() { + buffer := make([]byte, 1024) + for { + n, address, err := echoServer.ReadFrom(buffer) + if err != nil { + return + } + _, _ = echoServer.WriteTo(buffer[:n], address) + } + }() + + dialer := socks.NewClient(N.SystemDialer, M.ParseSocksaddrHostPort("127.0.0.1", proxyPort), socks.Version5, "", "") + + packetConn, err := dialer.ListenPacket(context.Background(), M.ParseSocksaddrHostPort("127.0.0.1", echoPort)) + require.NoError(t, err) + defer packetConn.Close() + + remoteAddress := &net.UDPAddr{IP: net.ParseIP("127.0.0.1"), Port: int(echoPort)} + + _, err = packetConn.WriteTo([]byte("hello"), remoteAddress) + require.NoError(t, err) + + buffer := make([]byte, 1024) + packetConn.SetReadDeadline(time.Now().Add(5 * time.Second)) + n, _, err := packetConn.ReadFrom(buffer) + require.NoError(t, err, "failed to receive echo response") + require.Equal(t, "hello", string(buffer[:n])) + t.Log("UDP echo successful, session established") + + packetConn.SetReadDeadline(time.Time{}) + + waitTime := expectedTimeout + time.Second + t.Logf("Waiting %v for UDP session to timeout...", waitTime) + time.Sleep(waitTime) + + _, err = packetConn.WriteTo([]byte("after-timeout"), remoteAddress) + if err != nil { + t.Logf("Write after timeout correctly failed: %v", err) + return + } + + packetConn.SetReadDeadline(time.Now().Add(3 * time.Second)) + n, _, err = packetConn.ReadFrom(buffer) + + if err != nil { + t.Logf("Read after timeout correctly failed: %v", err) + return + } + + t.Fatalf("UDP session should have timed out after %v, but received response: %s", + expectedTimeout, string(buffer[:n])) +} diff --git a/small/luci-app-fchomo/htdocs/luci-static/resources/fchomo.js b/small/luci-app-fchomo/htdocs/luci-static/resources/fchomo.js index c582582dba..53b23b056f 100644 --- a/small/luci-app-fchomo/htdocs/luci-static/resources/fchomo.js +++ b/small/luci-app-fchomo/htdocs/luci-static/resources/fchomo.js @@ -104,6 +104,10 @@ const glossary = { prefmt: '%s_domain', field: 'nameserver-policy', }, + dns_node_policy: { + prefmt: '%s_nodedomain', + field: 'proxy-server-nameserver-policy', + }, node: { prefmt: 'node_%s', field: 'proxies', diff --git a/small/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/client.js b/small/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/client.js index 962433e320..2d55c9c3ee 100644 --- a/small/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/client.js +++ b/small/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/client.js @@ -836,6 +836,58 @@ function renderRules(s, uciconfig) { o.modalonly = true; } +function renderPolicies(s, uciconfig) { + let o; + + o = s.option(form.ListValue, 'type', _('Type')); + o.value('domain', _('Domain')); + o.value('geosite', _('Geosite')); + o.value('rule_set', _('Rule set')); + o.default = 'domain'; + + o = s.option(form.DynamicList, 'domain', _('Domain'), + _('Match domain. Support wildcards.')); + o.depends('type', 'domain'); + o.modalonly = true; + + o = s.option(form.DynamicList, 'geosite', _('Geosite'), + _('Match geosite.')); + o.depends('type', 'geosite'); + o.modalonly = true; + + o = s.option(form.MultiValue, 'rule_set', _('Rule set'), + _('Match rule set.')); + o.value('', _('-- Please choose --')); + o.load = L.bind(hm.loadRulesetLabel, o, [['', _('-- Please choose --')]], ['domain', 'classical']); + o.depends('type', 'rule_set'); + o.modalonly = true; + + o = s.option(form.DummyValue, '_entry', _('Entry')); + o.load = function(section_id) { + const option = uci.get(uciconfig, section_id, 'type'); + + return uci.get(uciconfig, section_id, option)?.join(','); + } + o.modalonly = false; + + o = s.option(form.MultiValue, 'server', _('DNS server')); + o.value('default-dns'); + o.default = 'default-dns'; + o.load = loadDNSServerLabel; + o.validate = validateNameserver; + o.rmempty = false; + o.editable = true; + + o = s.option(hm.ListValue, 'proxy', _('Proxy group override'), + _('Override the Proxy group of DNS server.')); + o.default = hm.preset_outbound.direct[0][0]; + hm.preset_outbound.direct.forEach((res) => { + o.value.apply(o, res); + }) + o.load = L.bind(hm.loadProxyGroupLabel, o, hm.preset_outbound.direct); + o.editable = true; +} + return view.extend({ load() { return Promise.all([ @@ -1412,8 +1464,10 @@ return view.extend({ ' - tls://1.1.1.1\n' + ' proxy-server-nameserver:\n' + ' - https://doh.pub/dns-query\n' + + ' proxy-server-nameserver-policy:\n' + + " 'www.yournode.com': '223.5.5.5'\n" + ' ...' - o.overridecommand = '.dns | pick(["default-nameserver", "proxy-server-nameserver", "nameserver", "fallback", "nameserver-policy"]) | with(.["nameserver-policy"]; . = [.[]] | flatten) | [.[][]] | unique' + o.overridecommand = '.dns | pick(["default-nameserver", "proxy-server-nameserver", "nameserver", "fallback", "nameserver-policy", "proxy-server-nameserver-policy"]) | with(.["nameserver-policy"]; . = [.[]] | flatten) | with(.["proxy-server-nameserver-policy"]; . = [.[]] | flatten) | [.[][]] | unique' o.parseYaml = parseDNSYaml; return o.render(); @@ -1622,6 +1676,58 @@ return view.extend({ so.modalonly = true; /* DNS server END */ + /* Bootstrap DNS policy (Node) START */ + s.tab('dns_node_policy', _('Bootstrap DNS policy (Node)')); + + /* Bootstrap DNS policy (Node) */ + o = s.taboption('dns_node_policy', form.SectionValue, '_dns_node_policy', hm.GridSection, 'dns_node_policy', null); + ss = o.subsection; + ss.addremove = true; + ss.rowcolors = true; + ss.sortable = true; + ss.nodescriptions = true; + ss.hm_modaltitle = [ _('Bootstrap DNS policy (Node)'), _('Add a Bootstrap DNS policy (Node)') ]; + ss.hm_prefmt = hm.glossary[ss.sectiontype].prefmt; + ss.hm_field = hm.glossary[ss.sectiontype].field; + ss.hm_lowcase_only = false; + /* Import mihomo config start */ + ss.handleYamlImport = function() { + const field = this.hm_field; + const o = new hm.HandleImport(this.map, this, _('Import mihomo config'), + _('Please type %s fields of mihomo config.
') + .format(field)); + o.placeholder = 'proxy-server-nameserver-policy:\n' + + " 'www.yournode.com': '223.5.5.5'\n" + + ' ...' + o.parseYaml = parseDNSPolicyYaml; + + return o.render(); + } + ss.renderSectionAdd = function(/* ... */) { + let el = hm.GridSection.prototype.renderSectionAdd.apply(this, arguments); + + el.appendChild(E('button', { + 'class': 'cbi-button cbi-button-add', + 'title': _('mihomo config'), + 'click': ui.createHandlerFn(this, 'handleYamlImport') + }, [ _('Import mihomo config') ])); + + return el; + } + /* Import mihomo config end */ + + so = ss.option(form.Value, 'label', _('Label')); + so.load = hm.loadDefaultLabel; + so.validate = hm.validateUniqueValue; + so.modalonly = true; + + so = ss.option(form.Flag, 'enabled', _('Enable')); + so.default = so.enabled; + so.editable = true; + + renderPolicies(ss, data[0]); + /* Bootstrap DNS policy (Node) END */ + /* DNS policy START */ s.tab('dns_policy', _('DNS policy')); @@ -1681,53 +1787,7 @@ return view.extend({ ], ...arguments); } - so = ss.option(form.ListValue, 'type', _('Type')); - so.value('domain', _('Domain')); - so.value('geosite', _('Geosite')); - so.value('rule_set', _('Rule set')); - so.default = 'domain'; - - so = ss.option(form.DynamicList, 'domain', _('Domain'), - _('Match domain. Support wildcards.')); - so.depends('type', 'domain'); - so.modalonly = true; - - so = ss.option(form.DynamicList, 'geosite', _('Geosite'), - _('Match geosite.')); - so.depends('type', 'geosite'); - so.modalonly = true; - - so = ss.option(form.MultiValue, 'rule_set', _('Rule set'), - _('Match rule set.')); - so.value('', _('-- Please choose --')); - so.load = L.bind(hm.loadRulesetLabel, so, [['', _('-- Please choose --')]], ['domain', 'classical']); - so.depends('type', 'rule_set'); - so.modalonly = true; - - so = ss.option(form.DummyValue, '_entry', _('Entry')); - so.load = function(section_id) { - const option = uci.get(data[0], section_id, 'type'); - - return uci.get(data[0], section_id, option)?.join(','); - } - so.modalonly = false; - - so = ss.option(form.MultiValue, 'server', _('DNS server')); - so.value('default-dns'); - so.default = 'default-dns'; - so.load = loadDNSServerLabel; - so.validate = validateNameserver; - so.rmempty = false; - so.editable = true; - - so = ss.option(hm.ListValue, 'proxy', _('Proxy group override'), - _('Override the Proxy group of DNS server.')); - so.default = hm.preset_outbound.direct[0][0]; - hm.preset_outbound.direct.forEach((res) => { - so.value.apply(so, res); - }) - so.load = L.bind(hm.loadProxyGroupLabel, so, hm.preset_outbound.direct); - so.editable = true; + renderPolicies(ss, data[0]); /* DNS policy END */ /* Fallback filter START */ diff --git a/small/luci-app-fchomo/po/templates/fchomo.pot b/small/luci-app-fchomo/po/templates/fchomo.pot index 076adb4a29..8922f646bc 100644 --- a/small/luci-app-fchomo/po/templates/fchomo.pot +++ b/small/luci-app-fchomo/po/templates/fchomo.pot @@ -5,17 +5,17 @@ msgstr "Content-Type: text/plain; charset=UTF-8" msgid "%s log" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:219 -#: htdocs/luci-static/resources/fchomo.js:220 -#: htdocs/luci-static/resources/fchomo.js:221 -#: htdocs/luci-static/resources/fchomo.js:222 #: htdocs/luci-static/resources/fchomo.js:223 #: htdocs/luci-static/resources/fchomo.js:224 +#: htdocs/luci-static/resources/fchomo.js:225 +#: htdocs/luci-static/resources/fchomo.js:226 +#: htdocs/luci-static/resources/fchomo.js:227 +#: htdocs/luci-static/resources/fchomo.js:228 msgid "%s ports" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:584 -#: htdocs/luci-static/resources/fchomo.js:587 +#: htdocs/luci-static/resources/fchomo.js:588 +#: htdocs/luci-static/resources/fchomo.js:591 #: htdocs/luci-static/resources/view/fchomo/client.js:315 msgid "(Imported)" msgstr "" @@ -32,13 +32,13 @@ msgstr "" msgid "(mTLS)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:990 -#: htdocs/luci-static/resources/view/fchomo/client.js:991 -#: htdocs/luci-static/resources/view/fchomo/client.js:1004 -#: htdocs/luci-static/resources/view/fchomo/client.js:1005 -#: htdocs/luci-static/resources/view/fchomo/client.js:1226 -#: htdocs/luci-static/resources/view/fchomo/client.js:1702 -#: htdocs/luci-static/resources/view/fchomo/client.js:1703 +#: htdocs/luci-static/resources/view/fchomo/client.js:860 +#: htdocs/luci-static/resources/view/fchomo/client.js:861 +#: htdocs/luci-static/resources/view/fchomo/client.js:1042 +#: htdocs/luci-static/resources/view/fchomo/client.js:1043 +#: htdocs/luci-static/resources/view/fchomo/client.js:1056 +#: htdocs/luci-static/resources/view/fchomo/client.js:1057 +#: htdocs/luci-static/resources/view/fchomo/client.js:1278 #: htdocs/luci-static/resources/view/fchomo/node.js:1728 #: htdocs/luci-static/resources/view/fchomo/node.js:1734 #: htdocs/luci-static/resources/view/fchomo/node.js:1748 @@ -46,12 +46,12 @@ msgstr "" msgid "-- Please choose --" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:371 +#: htdocs/luci-static/resources/fchomo.js:375 msgid "0-RTT reuse." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:368 #: htdocs/luci-static/resources/fchomo.js:372 +#: htdocs/luci-static/resources/fchomo.js:376 msgid "1-RTT only." msgstr "" @@ -59,15 +59,15 @@ msgstr "" msgid "163Music" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:318 +#: htdocs/luci-static/resources/fchomo.js:322 msgid "2022-blake3-aes-128-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:319 +#: htdocs/luci-static/resources/fchomo.js:323 msgid "2022-blake3-aes-256-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:320 +#: htdocs/luci-static/resources/fchomo.js:324 msgid "2022-blake3-chacha20-poly1305" msgstr "" @@ -136,11 +136,15 @@ msgstr "" msgid "Access Control" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1635 +#: htdocs/luci-static/resources/view/fchomo/client.js:1687 +msgid "Add a Bootstrap DNS policy (Node)" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/client.js:1739 msgid "Add a DNS policy" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1385 +#: htdocs/luci-static/resources/view/fchomo/client.js:1437 msgid "Add a DNS server" msgstr "" @@ -156,11 +160,11 @@ msgstr "" msgid "Add a proxy chain" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:889 +#: htdocs/luci-static/resources/view/fchomo/client.js:941 msgid "Add a proxy group" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1141 +#: htdocs/luci-static/resources/view/fchomo/client.js:1193 msgid "Add a routing rule" msgstr "" @@ -172,7 +176,7 @@ msgstr "" msgid "Add a server" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1260 +#: htdocs/luci-static/resources/view/fchomo/client.js:1312 msgid "Add a sub rule" msgstr "" @@ -184,12 +188,12 @@ msgstr "" msgid "Add suffix" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1443 -#: htdocs/luci-static/resources/view/fchomo/client.js:1448 +#: htdocs/luci-static/resources/view/fchomo/client.js:1495 +#: htdocs/luci-static/resources/view/fchomo/client.js:1500 msgid "Address" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:375 +#: htdocs/luci-static/resources/fchomo.js:379 msgid "" "After the 1-RTT client/server hello, padding randomly 111-1111 bytes with " "100% probability." @@ -205,7 +209,7 @@ msgstr "" msgid "All allowed" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:216 +#: htdocs/luci-static/resources/fchomo.js:220 msgid "All ports" msgstr "" @@ -232,8 +236,8 @@ msgstr "" msgid "Alter ID" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:144 -#: htdocs/luci-static/resources/fchomo.js:177 +#: htdocs/luci-static/resources/fchomo.js:148 +#: htdocs/luci-static/resources/fchomo.js:181 msgid "AnyTLS" msgstr "" @@ -330,11 +334,16 @@ msgstr "" msgid "Block DNS queries" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1330 +#: htdocs/luci-static/resources/view/fchomo/client.js:1678 +#: htdocs/luci-static/resources/view/fchomo/client.js:1687 +msgid "Bootstrap DNS policy (Node)" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/client.js:1382 msgid "Bootstrap DNS server" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1337 +#: htdocs/luci-static/resources/view/fchomo/client.js:1389 msgid "Bootstrap DNS server (Node)" msgstr "" @@ -367,7 +376,7 @@ msgstr "" msgid "CORS allowed origins, * will be used if empty." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:700 +#: htdocs/luci-static/resources/fchomo.js:704 msgid "Cancel" msgstr "" @@ -467,12 +476,12 @@ msgstr "" msgid "Collecting data..." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:217 -#: htdocs/luci-static/resources/fchomo.js:218 +#: htdocs/luci-static/resources/fchomo.js:221 +#: htdocs/luci-static/resources/fchomo.js:222 msgid "Common ports (bypass P2P traffic)" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1299 +#: htdocs/luci-static/resources/fchomo.js:1303 msgid "Complete" msgstr "" @@ -490,7 +499,7 @@ msgstr "" msgid "Connection check" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:569 +#: htdocs/luci-static/resources/fchomo.js:573 msgid "Content copied to clipboard!" msgstr "" @@ -511,7 +520,7 @@ msgstr "" msgid "Contents have been saved." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:571 +#: htdocs/luci-static/resources/fchomo.js:575 msgid "Copy" msgstr "" @@ -546,12 +555,12 @@ msgid "" "Custom internal hosts. Support yaml or json format." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:166 +#: htdocs/luci-static/resources/fchomo.js:170 msgid "DIRECT" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1626 -#: htdocs/luci-static/resources/view/fchomo/client.js:1635 +#: htdocs/luci-static/resources/view/fchomo/client.js:1730 +#: htdocs/luci-static/resources/view/fchomo/client.js:1739 msgid "DNS policy" msgstr "" @@ -559,15 +568,15 @@ msgstr "" msgid "DNS port" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1376 -#: htdocs/luci-static/resources/view/fchomo/client.js:1385 -#: htdocs/luci-static/resources/view/fchomo/client.js:1715 +#: htdocs/luci-static/resources/view/fchomo/client.js:873 +#: htdocs/luci-static/resources/view/fchomo/client.js:1428 +#: htdocs/luci-static/resources/view/fchomo/client.js:1437 #: htdocs/luci-static/resources/view/fchomo/node.js:706 #: htdocs/luci-static/resources/view/fchomo/node.js:786 msgid "DNS server" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1316 +#: htdocs/luci-static/resources/view/fchomo/client.js:1368 msgid "DNS settings" msgstr "" @@ -587,7 +596,7 @@ msgstr "" msgid "Default DNS (issued by WAN)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1351 +#: htdocs/luci-static/resources/view/fchomo/client.js:1403 msgid "Default DNS server" msgstr "" @@ -650,7 +659,7 @@ msgstr "" msgid "Disable SNI" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1033 +#: htdocs/luci-static/resources/view/fchomo/client.js:1085 msgid "Disable UDP" msgstr "" @@ -664,11 +673,11 @@ msgid "" "for pure domain inbound connections without DNS resolution. e.g., socks5h" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1685 -#: htdocs/luci-static/resources/view/fchomo/client.js:1690 -#: htdocs/luci-static/resources/view/fchomo/client.js:1755 -#: htdocs/luci-static/resources/view/fchomo/client.js:1762 -#: htdocs/luci-static/resources/view/fchomo/client.js:1764 +#: htdocs/luci-static/resources/view/fchomo/client.js:843 +#: htdocs/luci-static/resources/view/fchomo/client.js:848 +#: htdocs/luci-static/resources/view/fchomo/client.js:1813 +#: htdocs/luci-static/resources/view/fchomo/client.js:1820 +#: htdocs/luci-static/resources/view/fchomo/client.js:1822 msgid "Domain" msgstr "" @@ -676,7 +685,7 @@ msgstr "" msgid "Donot send server name in ClientHello." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1523 +#: htdocs/luci-static/resources/view/fchomo/client.js:1575 #: htdocs/luci-static/resources/view/fchomo/node.js:1015 #: htdocs/luci-static/resources/view/fchomo/node.js:1589 msgid "Donot verifying server certificate." @@ -690,15 +699,15 @@ msgstr "" msgid "Download bandwidth in Mbps." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1178 +#: htdocs/luci-static/resources/fchomo.js:1182 msgid "Download failed: %s" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1176 +#: htdocs/luci-static/resources/fchomo.js:1180 msgid "Download successful." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:152 +#: htdocs/luci-static/resources/fchomo.js:156 msgid "Dual stack" msgstr "" @@ -715,11 +724,11 @@ msgstr "" msgid "ECH key" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1557 +#: htdocs/luci-static/resources/view/fchomo/client.js:1609 msgid "ECS override" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1541 +#: htdocs/luci-static/resources/view/fchomo/client.js:1593 msgid "EDNS Client Subnet" msgstr "" @@ -748,16 +757,17 @@ msgstr "" msgid "Editer" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:362 +#: htdocs/luci-static/resources/fchomo.js:366 msgid "Eliminate encryption header characteristics" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:879 -#: htdocs/luci-static/resources/view/fchomo/client.js:972 -#: htdocs/luci-static/resources/view/fchomo/client.js:1210 -#: htdocs/luci-static/resources/view/fchomo/client.js:1302 -#: htdocs/luci-static/resources/view/fchomo/client.js:1439 -#: htdocs/luci-static/resources/view/fchomo/client.js:1674 +#: htdocs/luci-static/resources/view/fchomo/client.js:931 +#: htdocs/luci-static/resources/view/fchomo/client.js:1024 +#: htdocs/luci-static/resources/view/fchomo/client.js:1262 +#: htdocs/luci-static/resources/view/fchomo/client.js:1354 +#: htdocs/luci-static/resources/view/fchomo/client.js:1491 +#: htdocs/luci-static/resources/view/fchomo/client.js:1722 +#: htdocs/luci-static/resources/view/fchomo/client.js:1778 #: htdocs/luci-static/resources/view/fchomo/global.js:401 #: htdocs/luci-static/resources/view/fchomo/global.js:680 #: htdocs/luci-static/resources/view/fchomo/node.js:234 @@ -842,7 +852,7 @@ msgid "Endpoint-Independent NAT" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:722 -#: htdocs/luci-static/resources/view/fchomo/client.js:1707 +#: htdocs/luci-static/resources/view/fchomo/client.js:865 msgid "Entry" msgstr "" @@ -850,7 +860,7 @@ msgstr "" msgid "Error" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1077 +#: htdocs/luci-static/resources/view/fchomo/client.js:1129 msgid "" "Exceeding this triggers a forced health check. 5 will be used " "if empty." @@ -860,13 +870,13 @@ msgstr "" msgid "Exclude matched node types." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1114 +#: htdocs/luci-static/resources/view/fchomo/client.js:1166 msgid "" "Exclude matched node types. Available types see here." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1109 +#: htdocs/luci-static/resources/view/fchomo/client.js:1161 #: htdocs/luci-static/resources/view/fchomo/node.js:1676 msgid "Exclude nodes that meet keywords or regexps." msgstr "" @@ -875,43 +885,43 @@ msgstr "" msgid "Expand/Collapse result" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1069 +#: htdocs/luci-static/resources/view/fchomo/client.js:1121 #: htdocs/luci-static/resources/view/fchomo/node.js:1661 msgid "Expected HTTP code. 204 will be used if empty." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1071 +#: htdocs/luci-static/resources/view/fchomo/client.js:1123 #: htdocs/luci-static/resources/view/fchomo/node.js:1663 msgid "Expected status" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:419 -#: htdocs/luci-static/resources/fchomo.js:422 -#: htdocs/luci-static/resources/fchomo.js:425 -#: htdocs/luci-static/resources/fchomo.js:1316 -#: htdocs/luci-static/resources/fchomo.js:1324 -#: htdocs/luci-static/resources/fchomo.js:1332 -#: htdocs/luci-static/resources/fchomo.js:1355 -#: htdocs/luci-static/resources/fchomo.js:1358 -#: htdocs/luci-static/resources/fchomo.js:1365 -#: htdocs/luci-static/resources/fchomo.js:1381 -#: htdocs/luci-static/resources/fchomo.js:1390 -#: htdocs/luci-static/resources/fchomo.js:1402 -#: htdocs/luci-static/resources/fchomo.js:1405 -#: htdocs/luci-static/resources/fchomo.js:1415 -#: htdocs/luci-static/resources/fchomo.js:1427 -#: htdocs/luci-static/resources/fchomo.js:1430 -#: htdocs/luci-static/resources/fchomo.js:1440 -#: htdocs/luci-static/resources/fchomo.js:1450 -#: htdocs/luci-static/resources/fchomo.js:1485 -#: htdocs/luci-static/resources/fchomo.js:1487 -#: htdocs/luci-static/resources/fchomo.js:1500 -#: htdocs/luci-static/resources/fchomo.js:1506 -#: htdocs/luci-static/resources/fchomo.js:1513 -#: htdocs/luci-static/resources/fchomo.js:1522 +#: htdocs/luci-static/resources/fchomo.js:423 +#: htdocs/luci-static/resources/fchomo.js:426 +#: htdocs/luci-static/resources/fchomo.js:429 +#: htdocs/luci-static/resources/fchomo.js:1320 +#: htdocs/luci-static/resources/fchomo.js:1328 +#: htdocs/luci-static/resources/fchomo.js:1336 +#: htdocs/luci-static/resources/fchomo.js:1359 +#: htdocs/luci-static/resources/fchomo.js:1362 +#: htdocs/luci-static/resources/fchomo.js:1369 +#: htdocs/luci-static/resources/fchomo.js:1385 +#: htdocs/luci-static/resources/fchomo.js:1394 +#: htdocs/luci-static/resources/fchomo.js:1406 +#: htdocs/luci-static/resources/fchomo.js:1409 +#: htdocs/luci-static/resources/fchomo.js:1419 +#: htdocs/luci-static/resources/fchomo.js:1431 +#: htdocs/luci-static/resources/fchomo.js:1434 +#: htdocs/luci-static/resources/fchomo.js:1444 +#: htdocs/luci-static/resources/fchomo.js:1454 +#: htdocs/luci-static/resources/fchomo.js:1489 +#: htdocs/luci-static/resources/fchomo.js:1491 +#: htdocs/luci-static/resources/fchomo.js:1504 +#: htdocs/luci-static/resources/fchomo.js:1510 +#: htdocs/luci-static/resources/fchomo.js:1517 +#: htdocs/luci-static/resources/fchomo.js:1526 #: htdocs/luci-static/resources/view/fchomo/client.js:68 -#: htdocs/luci-static/resources/view/fchomo/client.js:966 -#: htdocs/luci-static/resources/view/fchomo/client.js:1454 +#: htdocs/luci-static/resources/view/fchomo/client.js:1018 +#: htdocs/luci-static/resources/view/fchomo/client.js:1506 #: htdocs/luci-static/resources/view/fchomo/global.js:880 #: htdocs/luci-static/resources/view/fchomo/node.js:388 #: htdocs/luci-static/resources/view/fchomo/node.js:421 @@ -952,58 +962,58 @@ msgstr "" msgid "Factor" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1257 +#: htdocs/luci-static/resources/fchomo.js:1261 msgid "Failed to execute \"/etc/init.d/fchomo %s %s\" reason: %s" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1210 +#: htdocs/luci-static/resources/fchomo.js:1214 msgid "Failed to generate %s, error: %s." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1622 +#: htdocs/luci-static/resources/fchomo.js:1626 msgid "Failed to upload %s, error: %s." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1641 +#: htdocs/luci-static/resources/fchomo.js:1645 msgid "Failed to upload, error: %s." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:209 +#: htdocs/luci-static/resources/fchomo.js:213 msgid "Fallback" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1345 -#: htdocs/luci-static/resources/view/fchomo/client.js:1358 +#: htdocs/luci-static/resources/view/fchomo/client.js:1397 +#: htdocs/luci-static/resources/view/fchomo/client.js:1410 msgid "Fallback DNS server" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1734 +#: htdocs/luci-static/resources/view/fchomo/client.js:1792 msgid "Fallback filter" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1104 +#: htdocs/luci-static/resources/view/fchomo/client.js:1156 #: htdocs/luci-static/resources/view/fchomo/node.js:1670 msgid "Filter nodes that meet keywords or regexps." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1607 +#: htdocs/luci-static/resources/view/fchomo/client.js:1659 msgid "Filter record type:" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1575 -#: htdocs/luci-static/resources/view/fchomo/client.js:1591 +#: htdocs/luci-static/resources/view/fchomo/client.js:1627 +#: htdocs/luci-static/resources/view/fchomo/client.js:1643 msgid "Filter record: %s" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1344 +#: htdocs/luci-static/resources/view/fchomo/client.js:1396 msgid "Final DNS server" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1346 +#: htdocs/luci-static/resources/view/fchomo/client.js:1398 msgid "Final DNS server (For non-poisoned domains)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1348 +#: htdocs/luci-static/resources/view/fchomo/client.js:1400 msgid "Final DNS server (For poisoned domains)" msgstr "" @@ -1016,13 +1026,13 @@ msgstr "" msgid "Flow" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1093 +#: htdocs/luci-static/resources/view/fchomo/client.js:1145 msgid "" "For details, see %s." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1070 +#: htdocs/luci-static/resources/view/fchomo/client.js:1122 #: htdocs/luci-static/resources/view/fchomo/node.js:1539 #: htdocs/luci-static/resources/view/fchomo/node.js:1662 msgid "" @@ -1062,7 +1072,7 @@ msgstr "" msgid "General" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:957 +#: htdocs/luci-static/resources/view/fchomo/client.js:1009 #: htdocs/luci-static/resources/view/fchomo/node.js:222 #: htdocs/luci-static/resources/view/fchomo/node.js:1419 #: htdocs/luci-static/resources/view/fchomo/server.js:171 @@ -1073,10 +1083,10 @@ msgstr "" msgid "General settings" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:520 -#: htdocs/luci-static/resources/fchomo.js:522 -#: htdocs/luci-static/resources/fchomo.js:536 -#: htdocs/luci-static/resources/fchomo.js:538 +#: htdocs/luci-static/resources/fchomo.js:524 +#: htdocs/luci-static/resources/fchomo.js:526 +#: htdocs/luci-static/resources/fchomo.js:540 +#: htdocs/luci-static/resources/fchomo.js:542 #: htdocs/luci-static/resources/view/fchomo/global.js:587 #: htdocs/luci-static/resources/view/fchomo/server.js:343 #: htdocs/luci-static/resources/view/fchomo/server.js:384 @@ -1098,17 +1108,17 @@ msgstr "" msgid "GeoSite version" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1744 +#: htdocs/luci-static/resources/view/fchomo/client.js:1802 msgid "Geoip code" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1741 +#: htdocs/luci-static/resources/view/fchomo/client.js:1799 msgid "Geoip enable" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1686 -#: htdocs/luci-static/resources/view/fchomo/client.js:1695 -#: htdocs/luci-static/resources/view/fchomo/client.js:1753 +#: htdocs/luci-static/resources/view/fchomo/client.js:844 +#: htdocs/luci-static/resources/view/fchomo/client.js:853 +#: htdocs/luci-static/resources/view/fchomo/client.js:1811 msgid "Geosite" msgstr "" @@ -1133,7 +1143,7 @@ msgstr "" msgid "Google" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:222 +#: htdocs/luci-static/resources/fchomo.js:226 msgid "Google FCM" msgstr "" @@ -1141,12 +1151,12 @@ msgstr "" msgid "Grant access to fchomo configuration" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:982 +#: htdocs/luci-static/resources/view/fchomo/client.js:1034 msgid "Group" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:135 -#: htdocs/luci-static/resources/fchomo.js:167 +#: htdocs/luci-static/resources/fchomo.js:139 +#: htdocs/luci-static/resources/fchomo.js:171 #: htdocs/luci-static/resources/view/fchomo/node.js:804 #: htdocs/luci-static/resources/view/fchomo/node.js:1106 #: htdocs/luci-static/resources/view/fchomo/node.js:1117 @@ -1190,7 +1200,7 @@ msgstr "" msgid "HTTP root path" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1506 +#: htdocs/luci-static/resources/view/fchomo/client.js:1558 msgid "HTTP/3" msgstr "" @@ -1222,27 +1232,27 @@ msgstr "" msgid "Handshake timeout" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1039 +#: htdocs/luci-static/resources/view/fchomo/client.js:1091 #: htdocs/luci-static/resources/view/fchomo/node.js:1630 msgid "Health check URL" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1068 +#: htdocs/luci-static/resources/view/fchomo/client.js:1120 #: htdocs/luci-static/resources/view/fchomo/node.js:1660 msgid "Health check expected status" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1048 +#: htdocs/luci-static/resources/view/fchomo/client.js:1100 #: htdocs/luci-static/resources/view/fchomo/node.js:1640 msgid "Health check interval" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1055 +#: htdocs/luci-static/resources/view/fchomo/client.js:1107 #: htdocs/luci-static/resources/view/fchomo/node.js:1647 msgid "Health check timeout" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:959 +#: htdocs/luci-static/resources/view/fchomo/client.js:1011 #: htdocs/luci-static/resources/view/fchomo/node.js:1421 msgid "Health fields" msgstr "" @@ -1251,7 +1261,7 @@ msgstr "" msgid "Heartbeat interval" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1119 +#: htdocs/luci-static/resources/view/fchomo/client.js:1171 msgid "Hidden" msgstr "" @@ -1276,17 +1286,17 @@ msgstr "" msgid "Hosts" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:146 -#: htdocs/luci-static/resources/fchomo.js:179 +#: htdocs/luci-static/resources/fchomo.js:150 +#: htdocs/luci-static/resources/fchomo.js:183 msgid "Hysteria2" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1746 -#: htdocs/luci-static/resources/view/fchomo/client.js:1759 +#: htdocs/luci-static/resources/view/fchomo/client.js:1804 +#: htdocs/luci-static/resources/view/fchomo/client.js:1817 msgid "IP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1757 +#: htdocs/luci-static/resources/view/fchomo/client.js:1815 msgid "IP CIDR" msgstr "" @@ -1299,20 +1309,20 @@ msgstr "" msgid "IP version" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:153 +#: htdocs/luci-static/resources/fchomo.js:157 msgid "IPv4 only" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:154 +#: htdocs/luci-static/resources/fchomo.js:158 msgid "IPv6 only" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1327 +#: htdocs/luci-static/resources/view/fchomo/client.js:1379 #: htdocs/luci-static/resources/view/fchomo/global.js:415 msgid "IPv6 support" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1125 +#: htdocs/luci-static/resources/view/fchomo/client.js:1177 msgid "Icon" msgstr "" @@ -1328,7 +1338,7 @@ msgstr "" msgid "Idle timeout" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1358 +#: htdocs/luci-static/resources/fchomo.js:1362 msgid "If All ports is selected, uncheck others" msgstr "" @@ -1340,20 +1350,22 @@ msgstr "" msgid "Ignore client bandwidth" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:705 +#: htdocs/luci-static/resources/fchomo.js:709 msgid "Import" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:896 -#: htdocs/luci-static/resources/view/fchomo/client.js:951 -#: htdocs/luci-static/resources/view/fchomo/client.js:1148 -#: htdocs/luci-static/resources/view/fchomo/client.js:1199 -#: htdocs/luci-static/resources/view/fchomo/client.js:1267 -#: htdocs/luci-static/resources/view/fchomo/client.js:1291 -#: htdocs/luci-static/resources/view/fchomo/client.js:1392 -#: htdocs/luci-static/resources/view/fchomo/client.js:1428 -#: htdocs/luci-static/resources/view/fchomo/client.js:1642 -#: htdocs/luci-static/resources/view/fchomo/client.js:1663 +#: htdocs/luci-static/resources/view/fchomo/client.js:948 +#: htdocs/luci-static/resources/view/fchomo/client.js:1003 +#: htdocs/luci-static/resources/view/fchomo/client.js:1200 +#: htdocs/luci-static/resources/view/fchomo/client.js:1251 +#: htdocs/luci-static/resources/view/fchomo/client.js:1319 +#: htdocs/luci-static/resources/view/fchomo/client.js:1343 +#: htdocs/luci-static/resources/view/fchomo/client.js:1444 +#: htdocs/luci-static/resources/view/fchomo/client.js:1480 +#: htdocs/luci-static/resources/view/fchomo/client.js:1694 +#: htdocs/luci-static/resources/view/fchomo/client.js:1711 +#: htdocs/luci-static/resources/view/fchomo/client.js:1746 +#: htdocs/luci-static/resources/view/fchomo/client.js:1767 #: htdocs/luci-static/resources/view/fchomo/node.js:1326 #: htdocs/luci-static/resources/view/fchomo/node.js:1407 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:143 @@ -1386,8 +1398,8 @@ msgstr "" msgid "In millisecond." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1056 -#: htdocs/luci-static/resources/view/fchomo/client.js:1085 +#: htdocs/luci-static/resources/view/fchomo/client.js:1108 +#: htdocs/luci-static/resources/view/fchomo/client.js:1137 #: htdocs/luci-static/resources/view/fchomo/node.js:1648 msgid "In millisecond. %s will be used if empty." msgstr "" @@ -1400,7 +1412,7 @@ msgstr "" msgid "In seconds." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1049 +#: htdocs/luci-static/resources/view/fchomo/client.js:1101 #: htdocs/luci-static/resources/view/fchomo/global.js:425 #: htdocs/luci-static/resources/view/fchomo/global.js:430 #: htdocs/luci-static/resources/view/fchomo/global.js:515 @@ -1421,27 +1433,27 @@ msgstr "" msgid "Inbound" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1017 +#: htdocs/luci-static/resources/view/fchomo/client.js:1069 msgid "Include all" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1022 +#: htdocs/luci-static/resources/view/fchomo/client.js:1074 msgid "Include all node" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1027 +#: htdocs/luci-static/resources/view/fchomo/client.js:1079 msgid "Include all provider" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1028 +#: htdocs/luci-static/resources/view/fchomo/client.js:1080 msgid "Includes all Provider." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1018 +#: htdocs/luci-static/resources/view/fchomo/client.js:1070 msgid "Includes all Proxy Node and Provider." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1023 +#: htdocs/luci-static/resources/view/fchomo/client.js:1075 msgid "Includes all Proxy Node." msgstr "" @@ -1459,8 +1471,8 @@ msgid "Interface Control" msgstr "" #: htdocs/luci-static/resources/fchomo.js:49 -#: htdocs/luci-static/resources/fchomo.js:151 -#: htdocs/luci-static/resources/fchomo.js:344 +#: htdocs/luci-static/resources/fchomo.js:155 +#: htdocs/luci-static/resources/fchomo.js:348 msgid "Keep default" msgstr "" @@ -1478,11 +1490,12 @@ msgstr "" msgid "Keypairs" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:962 -#: htdocs/luci-static/resources/view/fchomo/client.js:1205 -#: htdocs/luci-static/resources/view/fchomo/client.js:1297 -#: htdocs/luci-static/resources/view/fchomo/client.js:1434 -#: htdocs/luci-static/resources/view/fchomo/client.js:1669 +#: htdocs/luci-static/resources/view/fchomo/client.js:1014 +#: htdocs/luci-static/resources/view/fchomo/client.js:1257 +#: htdocs/luci-static/resources/view/fchomo/client.js:1349 +#: htdocs/luci-static/resources/view/fchomo/client.js:1486 +#: htdocs/luci-static/resources/view/fchomo/client.js:1717 +#: htdocs/luci-static/resources/view/fchomo/client.js:1773 #: htdocs/luci-static/resources/view/fchomo/node.js:229 #: htdocs/luci-static/resources/view/fchomo/node.js:1424 #: htdocs/luci-static/resources/view/fchomo/node.js:1709 @@ -1491,7 +1504,7 @@ msgstr "" msgid "Label" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1062 +#: htdocs/luci-static/resources/view/fchomo/client.js:1114 #: htdocs/luci-static/resources/view/fchomo/node.js:1654 msgid "Lazy" msgstr "" @@ -1528,7 +1541,7 @@ msgstr "" msgid "Listen interfaces" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1322 +#: htdocs/luci-static/resources/view/fchomo/client.js:1374 #: htdocs/luci-static/resources/view/fchomo/server.js:204 msgid "Listen port" msgstr "" @@ -1537,7 +1550,7 @@ msgstr "" msgid "Listen ports" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:211 +#: htdocs/luci-static/resources/fchomo.js:215 msgid "Load balance" msgstr "" @@ -1572,7 +1585,7 @@ msgstr "" msgid "Log level" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:419 +#: htdocs/luci-static/resources/fchomo.js:423 msgid "Lowercase only" msgstr "" @@ -1582,7 +1595,7 @@ msgstr "" msgid "MTU" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:181 +#: htdocs/luci-static/resources/fchomo.js:185 msgid "Masque" msgstr "" @@ -1590,31 +1603,31 @@ msgstr "" msgid "Masquerade" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1691 +#: htdocs/luci-static/resources/view/fchomo/client.js:849 msgid "Match domain. Support wildcards." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1763 +#: htdocs/luci-static/resources/view/fchomo/client.js:1821 msgid "Match domain. Support wildcards.
" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1696 +#: htdocs/luci-static/resources/view/fchomo/client.js:854 msgid "Match geosite." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1754 +#: htdocs/luci-static/resources/view/fchomo/client.js:1812 msgid "Match geosite.
" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1745 +#: htdocs/luci-static/resources/view/fchomo/client.js:1803 msgid "Match response with geoip.
" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1758 +#: htdocs/luci-static/resources/view/fchomo/client.js:1816 msgid "Match response with ipcidr.
" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1701 +#: htdocs/luci-static/resources/view/fchomo/client.js:859 msgid "Match rule set." msgstr "" @@ -1627,7 +1640,7 @@ msgstr "" msgid "Max UDP relay packet size" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1076 +#: htdocs/luci-static/resources/view/fchomo/client.js:1128 msgid "Max count of failures" msgstr "" @@ -1663,19 +1676,21 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/node.js:421 #: htdocs/luci-static/resources/view/fchomo/server.js:409 -msgid "Maximum padding rate must be greater than or equal to the minimum padding rate." +msgid "" +"Maximum padding rate must be greater than or equal to the minimum padding " +"rate." msgstr "" #: htdocs/luci-static/resources/view/fchomo/node.js:1230 msgid "Maximum streams" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:139 -#: htdocs/luci-static/resources/fchomo.js:171 +#: htdocs/luci-static/resources/fchomo.js:143 +#: htdocs/luci-static/resources/fchomo.js:175 msgid "Mieru" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:851 +#: htdocs/luci-static/resources/view/fchomo/client.js:903 #: htdocs/luci-static/resources/view/fchomo/log.js:149 #: htdocs/luci-static/resources/view/fchomo/log.js:154 msgid "Mihomo client" @@ -1706,7 +1721,7 @@ msgstr "" msgid "Minimum streams" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:137 +#: htdocs/luci-static/resources/fchomo.js:141 #: htdocs/luci-static/resources/view/fchomo/global.js:497 msgid "Mixed" msgstr "" @@ -1749,7 +1764,7 @@ msgstr "" msgid "Native UDP" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:361 +#: htdocs/luci-static/resources/fchomo.js:365 msgid "Native appearance" msgstr "" @@ -1757,16 +1772,16 @@ msgstr "" msgid "No Authentication IP ranges" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1454 +#: htdocs/luci-static/resources/view/fchomo/client.js:1506 msgid "No add'l params" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1063 +#: htdocs/luci-static/resources/view/fchomo/client.js:1115 #: htdocs/luci-static/resources/view/fchomo/node.js:1655 msgid "No testing is performed when this provider node is not in use." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:666 +#: htdocs/luci-static/resources/fchomo.js:670 msgid "No valid %s found." msgstr "" @@ -1774,32 +1789,32 @@ msgstr "" msgid "No valid rule-set link found." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:989 +#: htdocs/luci-static/resources/view/fchomo/client.js:1041 #: htdocs/luci-static/resources/view/fchomo/node.js:217 #: root/usr/share/luci/menu.d/luci-app-fchomo.json:38 msgid "Node" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1108 +#: htdocs/luci-static/resources/view/fchomo/client.js:1160 #: htdocs/luci-static/resources/view/fchomo/node.js:1675 msgid "Node exclude filter" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1113 +#: htdocs/luci-static/resources/view/fchomo/client.js:1165 #: htdocs/luci-static/resources/view/fchomo/node.js:1682 msgid "Node exclude type" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1103 +#: htdocs/luci-static/resources/view/fchomo/client.js:1155 #: htdocs/luci-static/resources/view/fchomo/node.js:1669 msgid "Node filter" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1084 +#: htdocs/luci-static/resources/view/fchomo/client.js:1136 msgid "Node switch tolerance" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:388 +#: htdocs/luci-static/resources/fchomo.js:392 msgid "None" msgstr "" @@ -1807,7 +1822,7 @@ msgstr "" msgid "Not Installed" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1136 +#: htdocs/luci-static/resources/fchomo.js:1140 msgid "Not Running" msgstr "" @@ -1853,7 +1868,7 @@ msgstr "" msgid "Only process traffic from specific interfaces. Leave empty for all." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1130 +#: htdocs/luci-static/resources/fchomo.js:1134 msgid "Open Dashboard" msgstr "" @@ -1866,7 +1881,7 @@ msgstr "" msgid "Override destination" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:958 +#: htdocs/luci-static/resources/view/fchomo/client.js:1010 #: htdocs/luci-static/resources/view/fchomo/node.js:1420 msgid "Override fields" msgstr "" @@ -1875,7 +1890,7 @@ msgstr "" msgid "Override the IP address of the server that DNS response." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1724 +#: htdocs/luci-static/resources/view/fchomo/client.js:882 msgid "Override the Proxy group of DNS server." msgstr "" @@ -1883,7 +1898,7 @@ msgstr "" msgid "Override the connection destination address with the sniffed domain." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1558 +#: htdocs/luci-static/resources/view/fchomo/client.js:1610 msgid "Override the existing ECS in original request." msgstr "" @@ -1975,11 +1990,12 @@ msgid "" "a>." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:897 -#: htdocs/luci-static/resources/view/fchomo/client.js:1149 -#: htdocs/luci-static/resources/view/fchomo/client.js:1268 -#: htdocs/luci-static/resources/view/fchomo/client.js:1393 -#: htdocs/luci-static/resources/view/fchomo/client.js:1643 +#: htdocs/luci-static/resources/view/fchomo/client.js:949 +#: htdocs/luci-static/resources/view/fchomo/client.js:1201 +#: htdocs/luci-static/resources/view/fchomo/client.js:1320 +#: htdocs/luci-static/resources/view/fchomo/client.js:1445 +#: htdocs/luci-static/resources/view/fchomo/client.js:1695 +#: htdocs/luci-static/resources/view/fchomo/client.js:1747 #: htdocs/luci-static/resources/view/fchomo/node.js:1327 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:144 msgid "Please type %s fields of mihomo config.
" @@ -2006,7 +2022,7 @@ msgstr "" msgid "Port" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1367 +#: htdocs/luci-static/resources/fchomo.js:1371 msgid "Port %s alrealy exists!" msgstr "" @@ -2028,11 +2044,11 @@ msgstr "" msgid "Pre-shared key" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:155 +#: htdocs/luci-static/resources/fchomo.js:159 msgid "Prefer IPv4" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:156 +#: htdocs/luci-static/resources/fchomo.js:160 msgid "Prefer IPv6" msgstr "" @@ -2082,7 +2098,7 @@ msgid "" "default in v2ray and cannot be disabled)." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1003 +#: htdocs/luci-static/resources/view/fchomo/client.js:1055 #: htdocs/luci-static/resources/view/fchomo/node.js:1310 #: htdocs/luci-static/resources/view/fchomo/node.js:1319 #: htdocs/luci-static/resources/view/fchomo/node.js:1720 @@ -2093,9 +2109,9 @@ msgstr "" msgid "Provider URL" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:871 -#: htdocs/luci-static/resources/view/fchomo/client.js:889 -#: htdocs/luci-static/resources/view/fchomo/client.js:1349 +#: htdocs/luci-static/resources/view/fchomo/client.js:923 +#: htdocs/luci-static/resources/view/fchomo/client.js:941 +#: htdocs/luci-static/resources/view/fchomo/client.js:1401 msgid "Proxy Group" msgstr "" @@ -2122,13 +2138,13 @@ msgid "Proxy chain" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:783 -#: htdocs/luci-static/resources/view/fchomo/client.js:1489 +#: htdocs/luci-static/resources/view/fchomo/client.js:1541 #: htdocs/luci-static/resources/view/fchomo/node.js:1508 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:381 msgid "Proxy group" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1723 +#: htdocs/luci-static/resources/view/fchomo/client.js:881 msgid "Proxy group override" msgstr "" @@ -2149,7 +2165,7 @@ msgstr "" msgid "QUIC congestion controller." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:874 +#: htdocs/luci-static/resources/view/fchomo/client.js:926 #: htdocs/luci-static/resources/view/fchomo/server.js:152 msgid "Quick Reload" msgstr "" @@ -2191,7 +2207,7 @@ msgstr "" msgid "RTT" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:353 +#: htdocs/luci-static/resources/fchomo.js:357 msgid "Random" msgstr "" @@ -2199,7 +2215,7 @@ msgstr "" msgid "Random will be used if empty." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:363 +#: htdocs/luci-static/resources/fchomo.js:367 msgid "Randomized traffic characteristics" msgstr "" @@ -2223,8 +2239,8 @@ msgstr "" msgid "Refresh every %s seconds." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1123 -#: htdocs/luci-static/resources/view/fchomo/client.js:875 +#: htdocs/luci-static/resources/fchomo.js:1127 +#: htdocs/luci-static/resources/view/fchomo/client.js:927 #: htdocs/luci-static/resources/view/fchomo/global.js:193 #: htdocs/luci-static/resources/view/fchomo/server.js:153 msgid "Reload" @@ -2244,11 +2260,11 @@ msgstr "" msgid "Remote DNS resolve" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1288 +#: htdocs/luci-static/resources/fchomo.js:1292 msgid "Remove" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1293 +#: htdocs/luci-static/resources/fchomo.js:1297 #: htdocs/luci-static/resources/view/fchomo/node.js:1411 #: htdocs/luci-static/resources/view/fchomo/node.js:1413 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:244 @@ -2264,7 +2280,7 @@ msgstr "" msgid "Replace node name." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:337 +#: htdocs/luci-static/resources/fchomo.js:341 msgid "Request" msgstr "" @@ -2278,15 +2294,15 @@ msgstr "" msgid "Request timeout" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:340 +#: htdocs/luci-static/resources/fchomo.js:344 msgid "Require and verify" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:338 +#: htdocs/luci-static/resources/fchomo.js:342 msgid "Require any" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:371 +#: htdocs/luci-static/resources/fchomo.js:375 #: htdocs/luci-static/resources/view/fchomo/node.js:1093 msgid "Requires server support." msgstr "" @@ -2303,12 +2319,12 @@ msgstr "" msgid "Restls script" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1120 +#: htdocs/luci-static/resources/view/fchomo/client.js:1172 msgid "" "Returns hidden status in the API to hide the display of this proxy group." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1126 +#: htdocs/luci-static/resources/view/fchomo/client.js:1178 msgid "" "Returns the string input for icon in the API to display in this proxy group." msgstr "" @@ -2361,8 +2377,8 @@ msgstr "" msgid "Routing ports" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1132 -#: htdocs/luci-static/resources/view/fchomo/client.js:1141 +#: htdocs/luci-static/resources/view/fchomo/client.js:1184 +#: htdocs/luci-static/resources/view/fchomo/client.js:1193 msgid "Routing rule" msgstr "" @@ -2378,8 +2394,8 @@ msgstr "" msgid "Rule" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1687 -#: htdocs/luci-static/resources/view/fchomo/client.js:1700 +#: htdocs/luci-static/resources/view/fchomo/client.js:845 +#: htdocs/luci-static/resources/view/fchomo/client.js:858 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:136 msgid "Rule set" msgstr "" @@ -2396,31 +2412,31 @@ msgstr "" msgid "Ruleset-URI-Scheme" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1136 +#: htdocs/luci-static/resources/fchomo.js:1140 msgid "Running" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:219 +#: htdocs/luci-static/resources/fchomo.js:223 msgid "SMTP" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:136 +#: htdocs/luci-static/resources/fchomo.js:140 msgid "SOCKS" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:168 +#: htdocs/luci-static/resources/fchomo.js:172 msgid "SOCKS5" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:183 +#: htdocs/luci-static/resources/fchomo.js:187 msgid "SSH" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:220 +#: htdocs/luci-static/resources/fchomo.js:224 msgid "STUN" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1224 +#: htdocs/luci-static/resources/view/fchomo/client.js:1276 msgid "SUB-RULE" msgstr "" @@ -2433,11 +2449,11 @@ msgstr "" msgid "Salamander" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:161 +#: htdocs/luci-static/resources/fchomo.js:165 msgid "Same dstaddr requests. Same node" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:162 +#: htdocs/luci-static/resources/fchomo.js:166 msgid "Same srcaddr and dstaddr requests. Same node" msgstr "" @@ -2445,7 +2461,7 @@ msgstr "" msgid "Segment maximum size" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:208 +#: htdocs/luci-static/resources/fchomo.js:212 msgid "Select" msgstr "" @@ -2453,12 +2469,12 @@ msgstr "" msgid "Select Dashboard" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:377 +#: htdocs/luci-static/resources/fchomo.js:381 msgid "Send padding randomly 0-3333 bytes with 50% probability." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:366 -#: htdocs/luci-static/resources/fchomo.js:367 +#: htdocs/luci-static/resources/fchomo.js:370 +#: htdocs/luci-static/resources/fchomo.js:371 msgid "Send random ticket of 300s-600s duration for client 0-RTT reuse." msgstr "" @@ -2486,8 +2502,8 @@ msgstr "" msgid "Service status" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:138 -#: htdocs/luci-static/resources/fchomo.js:169 +#: htdocs/luci-static/resources/fchomo.js:142 +#: htdocs/luci-static/resources/fchomo.js:173 msgid "Shadowsocks" msgstr "" @@ -2514,7 +2530,7 @@ msgstr "" msgid "Silent" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:160 +#: htdocs/luci-static/resources/fchomo.js:164 msgid "Simple round-robin all nodes" msgstr "" @@ -2523,7 +2539,7 @@ msgstr "" msgid "Size limit" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1522 +#: htdocs/luci-static/resources/view/fchomo/client.js:1574 #: htdocs/luci-static/resources/view/fchomo/node.js:1014 #: htdocs/luci-static/resources/view/fchomo/node.js:1588 msgid "Skip cert verify" @@ -2541,7 +2557,7 @@ msgstr "" msgid "Skiped sniffing src address" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:173 +#: htdocs/luci-static/resources/fchomo.js:177 msgid "Snell" msgstr "" @@ -2557,7 +2573,7 @@ msgstr "" msgid "Sniffer settings" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:409 +#: htdocs/luci-static/resources/fchomo.js:413 msgid "Specify a ID" msgstr "" @@ -2572,29 +2588,29 @@ msgstr "" msgid "Stack" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:223 +#: htdocs/luci-static/resources/fchomo.js:227 msgid "Steam Client" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:224 +#: htdocs/luci-static/resources/fchomo.js:228 msgid "Steam P2P" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1092 -#: htdocs/luci-static/resources/view/fchomo/client.js:1094 +#: htdocs/luci-static/resources/view/fchomo/client.js:1144 +#: htdocs/luci-static/resources/view/fchomo/client.js:1146 msgid "Strategy" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1251 -#: htdocs/luci-static/resources/view/fchomo/client.js:1260 +#: htdocs/luci-static/resources/view/fchomo/client.js:1303 +#: htdocs/luci-static/resources/view/fchomo/client.js:1312 msgid "Sub rule" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1306 +#: htdocs/luci-static/resources/view/fchomo/client.js:1358 msgid "Sub rule group" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:669 +#: htdocs/luci-static/resources/fchomo.js:673 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:215 msgid "Successfully imported %s %s of total %s." msgstr "" @@ -2603,12 +2619,12 @@ msgstr "" msgid "Successfully updated." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1638 +#: htdocs/luci-static/resources/fchomo.js:1642 msgid "Successfully uploaded." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:140 -#: htdocs/luci-static/resources/fchomo.js:172 +#: htdocs/luci-static/resources/fchomo.js:144 +#: htdocs/luci-static/resources/fchomo.js:176 msgid "Sudoku" msgstr "" @@ -2626,20 +2642,20 @@ msgstr "" msgid "System DNS" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:135 -#: htdocs/luci-static/resources/fchomo.js:140 -#: htdocs/luci-static/resources/fchomo.js:141 -#: htdocs/luci-static/resources/fchomo.js:142 -#: htdocs/luci-static/resources/fchomo.js:143 +#: htdocs/luci-static/resources/fchomo.js:139 #: htdocs/luci-static/resources/fchomo.js:144 -#: htdocs/luci-static/resources/fchomo.js:167 -#: htdocs/luci-static/resources/fchomo.js:172 -#: htdocs/luci-static/resources/fchomo.js:173 -#: htdocs/luci-static/resources/fchomo.js:174 -#: htdocs/luci-static/resources/fchomo.js:175 +#: htdocs/luci-static/resources/fchomo.js:145 +#: htdocs/luci-static/resources/fchomo.js:146 +#: htdocs/luci-static/resources/fchomo.js:147 +#: htdocs/luci-static/resources/fchomo.js:148 +#: htdocs/luci-static/resources/fchomo.js:171 #: htdocs/luci-static/resources/fchomo.js:176 #: htdocs/luci-static/resources/fchomo.js:177 -#: htdocs/luci-static/resources/fchomo.js:183 +#: htdocs/luci-static/resources/fchomo.js:178 +#: htdocs/luci-static/resources/fchomo.js:179 +#: htdocs/luci-static/resources/fchomo.js:180 +#: htdocs/luci-static/resources/fchomo.js:181 +#: htdocs/luci-static/resources/fchomo.js:187 #: htdocs/luci-static/resources/view/fchomo/client.js:589 #: htdocs/luci-static/resources/view/fchomo/client.js:679 msgid "TCP" @@ -2661,14 +2677,14 @@ msgstr "" msgid "TCP-Keep-Alive interval" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:136 -#: htdocs/luci-static/resources/fchomo.js:137 -#: htdocs/luci-static/resources/fchomo.js:138 -#: htdocs/luci-static/resources/fchomo.js:139 -#: htdocs/luci-static/resources/fchomo.js:166 -#: htdocs/luci-static/resources/fchomo.js:168 -#: htdocs/luci-static/resources/fchomo.js:169 -#: htdocs/luci-static/resources/fchomo.js:171 +#: htdocs/luci-static/resources/fchomo.js:140 +#: htdocs/luci-static/resources/fchomo.js:141 +#: htdocs/luci-static/resources/fchomo.js:142 +#: htdocs/luci-static/resources/fchomo.js:143 +#: htdocs/luci-static/resources/fchomo.js:170 +#: htdocs/luci-static/resources/fchomo.js:172 +#: htdocs/luci-static/resources/fchomo.js:173 +#: htdocs/luci-static/resources/fchomo.js:175 msgid "TCP/UDP" msgstr "" @@ -2699,12 +2715,12 @@ msgstr "" msgid "TLS fields" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:145 -#: htdocs/luci-static/resources/fchomo.js:180 +#: htdocs/luci-static/resources/fchomo.js:149 +#: htdocs/luci-static/resources/fchomo.js:184 msgid "TUIC" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:221 +#: htdocs/luci-static/resources/fchomo.js:225 msgid "TURN" msgstr "" @@ -2759,13 +2775,13 @@ msgid "" "The first padding must have a probability of 100% and at least 35 bytes." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1746 +#: htdocs/luci-static/resources/view/fchomo/client.js:1804 msgid "The matching %s will be deemed as not-poisoned." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1755 -#: htdocs/luci-static/resources/view/fchomo/client.js:1759 -#: htdocs/luci-static/resources/view/fchomo/client.js:1764 +#: htdocs/luci-static/resources/view/fchomo/client.js:1813 +#: htdocs/luci-static/resources/view/fchomo/client.js:1817 +#: htdocs/luci-static/resources/view/fchomo/client.js:1822 msgid "The matching %s will be deemed as poisoned." msgstr "" @@ -2779,7 +2795,7 @@ msgstr "" msgid "This ECH parameter needs to be added to the HTTPS record of the domain." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1525 +#: htdocs/luci-static/resources/view/fchomo/client.js:1577 #: htdocs/luci-static/resources/view/fchomo/node.js:1017 #: htdocs/luci-static/resources/view/fchomo/node.js:1591 msgid "" @@ -2845,8 +2861,8 @@ msgstr "" msgid "Treat the destination IP as the source IP." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:143 -#: htdocs/luci-static/resources/fchomo.js:176 +#: htdocs/luci-static/resources/fchomo.js:147 +#: htdocs/luci-static/resources/fchomo.js:180 msgid "Trojan" msgstr "" @@ -2869,8 +2885,8 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:530 #: htdocs/luci-static/resources/view/fchomo/client.js:643 #: htdocs/luci-static/resources/view/fchomo/client.js:737 -#: htdocs/luci-static/resources/view/fchomo/client.js:976 -#: htdocs/luci-static/resources/view/fchomo/client.js:1684 +#: htdocs/luci-static/resources/view/fchomo/client.js:842 +#: htdocs/luci-static/resources/view/fchomo/client.js:1028 #: htdocs/luci-static/resources/view/fchomo/node.js:238 #: htdocs/luci-static/resources/view/fchomo/node.js:1433 #: htdocs/luci-static/resources/view/fchomo/node.js:1718 @@ -2879,12 +2895,12 @@ msgstr "" msgid "Type" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:145 -#: htdocs/luci-static/resources/fchomo.js:146 -#: htdocs/luci-static/resources/fchomo.js:179 -#: htdocs/luci-static/resources/fchomo.js:180 -#: htdocs/luci-static/resources/fchomo.js:181 -#: htdocs/luci-static/resources/fchomo.js:182 +#: htdocs/luci-static/resources/fchomo.js:149 +#: htdocs/luci-static/resources/fchomo.js:150 +#: htdocs/luci-static/resources/fchomo.js:183 +#: htdocs/luci-static/resources/fchomo.js:184 +#: htdocs/luci-static/resources/fchomo.js:185 +#: htdocs/luci-static/resources/fchomo.js:186 #: htdocs/luci-static/resources/view/fchomo/client.js:588 #: htdocs/luci-static/resources/view/fchomo/client.js:678 #: htdocs/luci-static/resources/view/fchomo/node.js:845 @@ -2913,7 +2929,7 @@ msgstr "" msgid "UDP relay mode" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:210 +#: htdocs/luci-static/resources/fchomo.js:214 msgid "URL test" msgstr "" @@ -2925,7 +2941,7 @@ msgstr "" msgid "UUID" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1181 +#: htdocs/luci-static/resources/fchomo.js:1185 msgid "Unable to download unsupported type: %s" msgstr "" @@ -2996,23 +3012,23 @@ msgstr "" msgid "Upload..." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1347 +#: htdocs/luci-static/resources/view/fchomo/client.js:1399 msgid "" "Used to resolve domains that can be directly connected. Can use domestic DNS " "servers or ECS." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1349 +#: htdocs/luci-static/resources/view/fchomo/client.js:1401 msgid "" "Used to resolve domains you want to proxy. Recommended to configure %s for " "DNS servers." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1331 +#: htdocs/luci-static/resources/view/fchomo/client.js:1383 msgid "Used to resolve the domain of the DNS server. Must be IP." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1338 +#: htdocs/luci-static/resources/view/fchomo/client.js:1390 msgid "Used to resolve the domain of the Proxy node." msgstr "" @@ -3041,13 +3057,13 @@ msgstr "" msgid "V2ray HTTPUpgrade fast open" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:142 -#: htdocs/luci-static/resources/fchomo.js:175 +#: htdocs/luci-static/resources/fchomo.js:146 +#: htdocs/luci-static/resources/fchomo.js:179 msgid "VLESS" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:141 -#: htdocs/luci-static/resources/fchomo.js:174 +#: htdocs/luci-static/resources/fchomo.js:145 +#: htdocs/luci-static/resources/fchomo.js:178 msgid "VMess" msgstr "" @@ -3057,7 +3073,7 @@ msgstr "" msgid "Value" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:339 +#: htdocs/luci-static/resources/fchomo.js:343 msgid "Verify if given" msgstr "" @@ -3076,7 +3092,7 @@ msgstr "" msgid "Vless Encryption fields" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:376 +#: htdocs/luci-static/resources/fchomo.js:380 msgid "Wait a random 0-111 milliseconds with 75% probability." msgstr "" @@ -3101,7 +3117,7 @@ msgstr "" msgid "White list" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:182 +#: htdocs/luci-static/resources/fchomo.js:186 msgid "WireGuard" msgstr "" @@ -3133,23 +3149,23 @@ msgstr "" msgid "YouTube" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1620 +#: htdocs/luci-static/resources/fchomo.js:1624 msgid "Your %s was successfully uploaded. Size: %sB." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:312 -#: htdocs/luci-static/resources/fchomo.js:325 -#: htdocs/luci-static/resources/fchomo.js:330 +#: htdocs/luci-static/resources/fchomo.js:316 +#: htdocs/luci-static/resources/fchomo.js:329 +#: htdocs/luci-static/resources/fchomo.js:334 #: htdocs/luci-static/resources/view/fchomo/node.js:640 msgid "aes-128-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:313 +#: htdocs/luci-static/resources/fchomo.js:317 msgid "aes-192-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:314 -#: htdocs/luci-static/resources/fchomo.js:331 +#: htdocs/luci-static/resources/fchomo.js:318 +#: htdocs/luci-static/resources/fchomo.js:335 msgid "aes-256-gcm" msgstr "" @@ -3167,9 +3183,9 @@ msgstr "" msgid "certificate" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:315 -#: htdocs/luci-static/resources/fchomo.js:326 -#: htdocs/luci-static/resources/fchomo.js:332 +#: htdocs/luci-static/resources/fchomo.js:319 +#: htdocs/luci-static/resources/fchomo.js:330 +#: htdocs/luci-static/resources/fchomo.js:336 msgid "chacha20-ietf-poly1305" msgstr "" @@ -3239,17 +3255,18 @@ msgstr "" msgid "metacubexd" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:949 -#: htdocs/luci-static/resources/view/fchomo/client.js:1197 -#: htdocs/luci-static/resources/view/fchomo/client.js:1289 -#: htdocs/luci-static/resources/view/fchomo/client.js:1426 -#: htdocs/luci-static/resources/view/fchomo/client.js:1661 +#: htdocs/luci-static/resources/view/fchomo/client.js:1001 +#: htdocs/luci-static/resources/view/fchomo/client.js:1249 +#: htdocs/luci-static/resources/view/fchomo/client.js:1341 +#: htdocs/luci-static/resources/view/fchomo/client.js:1478 +#: htdocs/luci-static/resources/view/fchomo/client.js:1709 +#: htdocs/luci-static/resources/view/fchomo/client.js:1765 #: htdocs/luci-static/resources/view/fchomo/node.js:1405 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:232 msgid "mihomo config" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:358 +#: htdocs/luci-static/resources/fchomo.js:362 msgid "mlkem768x25519plus" msgstr "" @@ -3266,16 +3283,16 @@ msgstr "" msgid "no-resolve" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1355 -#: htdocs/luci-static/resources/fchomo.js:1450 -#: htdocs/luci-static/resources/fchomo.js:1485 -#: htdocs/luci-static/resources/fchomo.js:1513 +#: htdocs/luci-static/resources/fchomo.js:1359 +#: htdocs/luci-static/resources/fchomo.js:1454 +#: htdocs/luci-static/resources/fchomo.js:1489 +#: htdocs/luci-static/resources/fchomo.js:1517 msgid "non-empty value" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:310 -#: htdocs/luci-static/resources/fchomo.js:324 -#: htdocs/luci-static/resources/fchomo.js:336 +#: htdocs/luci-static/resources/fchomo.js:314 +#: htdocs/luci-static/resources/fchomo.js:328 +#: htdocs/luci-static/resources/fchomo.js:340 #: htdocs/luci-static/resources/view/fchomo/node.js:638 #: htdocs/luci-static/resources/view/fchomo/node.js:658 #: htdocs/luci-static/resources/view/fchomo/node.js:793 @@ -3288,11 +3305,11 @@ msgstr "" msgid "not found" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:966 +#: htdocs/luci-static/resources/view/fchomo/client.js:1018 msgid "not included \",\"" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:196 +#: htdocs/luci-static/resources/fchomo.js:200 msgid "null" msgstr "" @@ -3326,8 +3343,8 @@ msgstr "" msgid "razord-meta" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1121 -#: htdocs/luci-static/resources/view/fchomo/client.js:1127 +#: htdocs/luci-static/resources/view/fchomo/client.js:1173 +#: htdocs/luci-static/resources/view/fchomo/client.js:1179 msgid "requires front-end adaptation using the API." msgstr "" @@ -3365,15 +3382,15 @@ msgstr "" msgid "unchecked" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:422 +#: htdocs/luci-static/resources/fchomo.js:426 msgid "unique UCI identifier" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:425 +#: htdocs/luci-static/resources/fchomo.js:429 msgid "unique identifier" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1522 +#: htdocs/luci-static/resources/fchomo.js:1526 msgid "unique value" msgstr "" @@ -3402,8 +3419,8 @@ msgstr "" msgid "v3" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1402 -#: htdocs/luci-static/resources/fchomo.js:1405 +#: htdocs/luci-static/resources/fchomo.js:1406 +#: htdocs/luci-static/resources/fchomo.js:1409 msgid "valid JSON format" msgstr "" @@ -3411,41 +3428,41 @@ msgstr "" msgid "valid SHA256 string with %d characters" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1427 -#: htdocs/luci-static/resources/fchomo.js:1430 +#: htdocs/luci-static/resources/fchomo.js:1431 +#: htdocs/luci-static/resources/fchomo.js:1434 msgid "valid URL" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1440 +#: htdocs/luci-static/resources/fchomo.js:1444 msgid "valid base64 key with %d characters" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1500 -#: htdocs/luci-static/resources/fchomo.js:1506 +#: htdocs/luci-static/resources/fchomo.js:1504 +#: htdocs/luci-static/resources/fchomo.js:1510 msgid "valid format: 2x, 2p, 4v" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1487 +#: htdocs/luci-static/resources/fchomo.js:1491 msgid "valid key length with %d characters" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1365 +#: htdocs/luci-static/resources/fchomo.js:1369 msgid "valid port value" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1415 +#: htdocs/luci-static/resources/fchomo.js:1419 msgid "valid uuid" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:382 +#: htdocs/luci-static/resources/fchomo.js:386 msgid "vless-mlkem768" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:381 +#: htdocs/luci-static/resources/fchomo.js:385 msgid "vless-x25519" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:316 +#: htdocs/luci-static/resources/fchomo.js:320 msgid "xchacha20-ietf-poly1305" msgstr "" @@ -3465,6 +3482,6 @@ msgstr "" msgid "zero" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1183 +#: htdocs/luci-static/resources/fchomo.js:1187 msgid "🡇" msgstr "" diff --git a/small/luci-app-fchomo/po/zh_Hans/fchomo.po b/small/luci-app-fchomo/po/zh_Hans/fchomo.po index f6dfe09585..48e5fe28cd 100644 --- a/small/luci-app-fchomo/po/zh_Hans/fchomo.po +++ b/small/luci-app-fchomo/po/zh_Hans/fchomo.po @@ -12,17 +12,17 @@ msgstr "" msgid "%s log" msgstr "%s 日志" -#: htdocs/luci-static/resources/fchomo.js:219 -#: htdocs/luci-static/resources/fchomo.js:220 -#: htdocs/luci-static/resources/fchomo.js:221 -#: htdocs/luci-static/resources/fchomo.js:222 #: htdocs/luci-static/resources/fchomo.js:223 #: htdocs/luci-static/resources/fchomo.js:224 +#: htdocs/luci-static/resources/fchomo.js:225 +#: htdocs/luci-static/resources/fchomo.js:226 +#: htdocs/luci-static/resources/fchomo.js:227 +#: htdocs/luci-static/resources/fchomo.js:228 msgid "%s ports" msgstr "%s 端口" -#: htdocs/luci-static/resources/fchomo.js:584 -#: htdocs/luci-static/resources/fchomo.js:587 +#: htdocs/luci-static/resources/fchomo.js:588 +#: htdocs/luci-static/resources/fchomo.js:591 #: htdocs/luci-static/resources/view/fchomo/client.js:315 msgid "(Imported)" msgstr "(已导入)" @@ -39,13 +39,13 @@ msgstr "(已导入)" msgid "(mTLS)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:990 -#: htdocs/luci-static/resources/view/fchomo/client.js:991 -#: htdocs/luci-static/resources/view/fchomo/client.js:1004 -#: htdocs/luci-static/resources/view/fchomo/client.js:1005 -#: htdocs/luci-static/resources/view/fchomo/client.js:1226 -#: htdocs/luci-static/resources/view/fchomo/client.js:1702 -#: htdocs/luci-static/resources/view/fchomo/client.js:1703 +#: htdocs/luci-static/resources/view/fchomo/client.js:860 +#: htdocs/luci-static/resources/view/fchomo/client.js:861 +#: htdocs/luci-static/resources/view/fchomo/client.js:1042 +#: htdocs/luci-static/resources/view/fchomo/client.js:1043 +#: htdocs/luci-static/resources/view/fchomo/client.js:1056 +#: htdocs/luci-static/resources/view/fchomo/client.js:1057 +#: htdocs/luci-static/resources/view/fchomo/client.js:1278 #: htdocs/luci-static/resources/view/fchomo/node.js:1728 #: htdocs/luci-static/resources/view/fchomo/node.js:1734 #: htdocs/luci-static/resources/view/fchomo/node.js:1748 @@ -53,12 +53,12 @@ msgstr "" msgid "-- Please choose --" msgstr "-- 请选择 --" -#: htdocs/luci-static/resources/fchomo.js:371 +#: htdocs/luci-static/resources/fchomo.js:375 msgid "0-RTT reuse." msgstr "0-RTT 重用。" -#: htdocs/luci-static/resources/fchomo.js:368 #: htdocs/luci-static/resources/fchomo.js:372 +#: htdocs/luci-static/resources/fchomo.js:376 msgid "1-RTT only." msgstr "仅限 1-RTT。" @@ -66,15 +66,15 @@ msgstr "仅限 1-RTT。" msgid "163Music" msgstr "网抑云" -#: htdocs/luci-static/resources/fchomo.js:318 +#: htdocs/luci-static/resources/fchomo.js:322 msgid "2022-blake3-aes-128-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:319 +#: htdocs/luci-static/resources/fchomo.js:323 msgid "2022-blake3-aes-256-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:320 +#: htdocs/luci-static/resources/fchomo.js:324 msgid "2022-blake3-chacha20-poly1305" msgstr "" @@ -143,11 +143,15 @@ msgstr "ASN 版本" msgid "Access Control" msgstr "访问控制" -#: htdocs/luci-static/resources/view/fchomo/client.js:1635 +#: htdocs/luci-static/resources/view/fchomo/client.js:1687 +msgid "Add a Bootstrap DNS policy (Node)" +msgstr "新增 引导 DNS 策略 (节点)" + +#: htdocs/luci-static/resources/view/fchomo/client.js:1739 msgid "Add a DNS policy" msgstr "新增 DNS 策略" -#: htdocs/luci-static/resources/view/fchomo/client.js:1385 +#: htdocs/luci-static/resources/view/fchomo/client.js:1437 msgid "Add a DNS server" msgstr "新增 DNS 服务器" @@ -163,11 +167,11 @@ msgstr "新增 供应商" msgid "Add a proxy chain" msgstr "新增 代理链" -#: htdocs/luci-static/resources/view/fchomo/client.js:889 +#: htdocs/luci-static/resources/view/fchomo/client.js:941 msgid "Add a proxy group" msgstr "新增 代理组" -#: htdocs/luci-static/resources/view/fchomo/client.js:1141 +#: htdocs/luci-static/resources/view/fchomo/client.js:1193 msgid "Add a routing rule" msgstr "新增 路由规则" @@ -179,7 +183,7 @@ msgstr "新增 规则集" msgid "Add a server" msgstr "新增 服务器" -#: htdocs/luci-static/resources/view/fchomo/client.js:1260 +#: htdocs/luci-static/resources/view/fchomo/client.js:1312 msgid "Add a sub rule" msgstr "新增 子规则" @@ -191,12 +195,12 @@ msgstr "添加前缀" msgid "Add suffix" msgstr "添加后缀" -#: htdocs/luci-static/resources/view/fchomo/client.js:1443 -#: htdocs/luci-static/resources/view/fchomo/client.js:1448 +#: htdocs/luci-static/resources/view/fchomo/client.js:1495 +#: htdocs/luci-static/resources/view/fchomo/client.js:1500 msgid "Address" msgstr "地址" -#: htdocs/luci-static/resources/fchomo.js:375 +#: htdocs/luci-static/resources/fchomo.js:379 msgid "" "After the 1-RTT client/server hello, padding randomly 111-1111 bytes with " "100% probability." @@ -213,7 +217,7 @@ msgstr "客户端维护的 NAT 映射 的老化时间。
" msgid "All allowed" msgstr "允许所有" -#: htdocs/luci-static/resources/fchomo.js:216 +#: htdocs/luci-static/resources/fchomo.js:220 msgid "All ports" msgstr "所有端口" @@ -241,8 +245,8 @@ msgstr "已在更新中。" msgid "Alter ID" msgstr "额外 ID" -#: htdocs/luci-static/resources/fchomo.js:144 -#: htdocs/luci-static/resources/fchomo.js:177 +#: htdocs/luci-static/resources/fchomo.js:148 +#: htdocs/luci-static/resources/fchomo.js:181 msgid "AnyTLS" msgstr "" @@ -339,11 +343,16 @@ msgstr "黑名单" msgid "Block DNS queries" msgstr "封锁 DNS 请求" -#: htdocs/luci-static/resources/view/fchomo/client.js:1330 +#: htdocs/luci-static/resources/view/fchomo/client.js:1678 +#: htdocs/luci-static/resources/view/fchomo/client.js:1687 +msgid "Bootstrap DNS policy (Node)" +msgstr "引导 DNS 策略 (节点)" + +#: htdocs/luci-static/resources/view/fchomo/client.js:1382 msgid "Bootstrap DNS server" msgstr "引导 DNS 服务器" -#: htdocs/luci-static/resources/view/fchomo/client.js:1337 +#: htdocs/luci-static/resources/view/fchomo/client.js:1389 msgid "Bootstrap DNS server (Node)" msgstr "引导 DNS 服务器 (节点)" @@ -376,7 +385,7 @@ msgstr "CORS 允许私有网络" msgid "CORS allowed origins, * will be used if empty." msgstr "CORS 允许的来源,留空则使用 *。" -#: htdocs/luci-static/resources/fchomo.js:700 +#: htdocs/luci-static/resources/fchomo.js:704 msgid "Cancel" msgstr "取消" @@ -478,12 +487,12 @@ msgstr "客户端状态" msgid "Collecting data..." msgstr "收集数据中..." -#: htdocs/luci-static/resources/fchomo.js:217 -#: htdocs/luci-static/resources/fchomo.js:218 +#: htdocs/luci-static/resources/fchomo.js:221 +#: htdocs/luci-static/resources/fchomo.js:222 msgid "Common ports (bypass P2P traffic)" msgstr "常用端口(绕过 P2P 流量)" -#: htdocs/luci-static/resources/fchomo.js:1299 +#: htdocs/luci-static/resources/fchomo.js:1303 msgid "Complete" msgstr "完成" @@ -501,7 +510,7 @@ msgstr "拥塞控制器" msgid "Connection check" msgstr "连接检查" -#: htdocs/luci-static/resources/fchomo.js:569 +#: htdocs/luci-static/resources/fchomo.js:573 msgid "Content copied to clipboard!" msgstr "内容已复制到剪贴板!" @@ -522,7 +531,7 @@ msgstr "内容" msgid "Contents have been saved." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:571 +#: htdocs/luci-static/resources/fchomo.js:575 msgid "Copy" msgstr "复制" @@ -557,12 +566,12 @@ msgid "" "Custom internal hosts. Support yaml or json format." msgstr "自定义内部 hosts。支持 yamljson 格式。" -#: htdocs/luci-static/resources/fchomo.js:166 +#: htdocs/luci-static/resources/fchomo.js:170 msgid "DIRECT" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1626 -#: htdocs/luci-static/resources/view/fchomo/client.js:1635 +#: htdocs/luci-static/resources/view/fchomo/client.js:1730 +#: htdocs/luci-static/resources/view/fchomo/client.js:1739 msgid "DNS policy" msgstr "DNS 策略" @@ -570,15 +579,15 @@ msgstr "DNS 策略" msgid "DNS port" msgstr " DNS 端口" -#: htdocs/luci-static/resources/view/fchomo/client.js:1376 -#: htdocs/luci-static/resources/view/fchomo/client.js:1385 -#: htdocs/luci-static/resources/view/fchomo/client.js:1715 +#: htdocs/luci-static/resources/view/fchomo/client.js:873 +#: htdocs/luci-static/resources/view/fchomo/client.js:1428 +#: htdocs/luci-static/resources/view/fchomo/client.js:1437 #: htdocs/luci-static/resources/view/fchomo/node.js:706 #: htdocs/luci-static/resources/view/fchomo/node.js:786 msgid "DNS server" msgstr "DNS 服务器" -#: htdocs/luci-static/resources/view/fchomo/client.js:1316 +#: htdocs/luci-static/resources/view/fchomo/client.js:1368 msgid "DNS settings" msgstr "DNS 设置" @@ -598,7 +607,7 @@ msgstr "调试" msgid "Default DNS (issued by WAN)" msgstr "默认 DNS(由 WAN 下发)" -#: htdocs/luci-static/resources/view/fchomo/client.js:1351 +#: htdocs/luci-static/resources/view/fchomo/client.js:1403 msgid "Default DNS server" msgstr "默认 DNS 服务器" @@ -661,7 +670,7 @@ msgstr "禁用 ICMP 转发" msgid "Disable SNI" msgstr "禁用 SNI" -#: htdocs/luci-static/resources/view/fchomo/client.js:1033 +#: htdocs/luci-static/resources/view/fchomo/client.js:1085 msgid "Disable UDP" msgstr "禁用 UDP" @@ -677,11 +686,11 @@ msgstr "" "不要将域名连接解析为 IP 以进行此次匹配。
仅对未经 DNS 解析的纯域名入站连" "接有效。例如,socks5h" -#: htdocs/luci-static/resources/view/fchomo/client.js:1685 -#: htdocs/luci-static/resources/view/fchomo/client.js:1690 -#: htdocs/luci-static/resources/view/fchomo/client.js:1755 -#: htdocs/luci-static/resources/view/fchomo/client.js:1762 -#: htdocs/luci-static/resources/view/fchomo/client.js:1764 +#: htdocs/luci-static/resources/view/fchomo/client.js:843 +#: htdocs/luci-static/resources/view/fchomo/client.js:848 +#: htdocs/luci-static/resources/view/fchomo/client.js:1813 +#: htdocs/luci-static/resources/view/fchomo/client.js:1820 +#: htdocs/luci-static/resources/view/fchomo/client.js:1822 msgid "Domain" msgstr "域名" @@ -689,7 +698,7 @@ msgstr "域名" msgid "Donot send server name in ClientHello." msgstr "不要在 ClientHello 中发送服务器名称。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1523 +#: htdocs/luci-static/resources/view/fchomo/client.js:1575 #: htdocs/luci-static/resources/view/fchomo/node.js:1015 #: htdocs/luci-static/resources/view/fchomo/node.js:1589 msgid "Donot verifying server certificate." @@ -703,15 +712,15 @@ msgstr "下载带宽" msgid "Download bandwidth in Mbps." msgstr "下载带宽(单位:Mbps)。" -#: htdocs/luci-static/resources/fchomo.js:1178 +#: htdocs/luci-static/resources/fchomo.js:1182 msgid "Download failed: %s" msgstr "下载失败: %s" -#: htdocs/luci-static/resources/fchomo.js:1176 +#: htdocs/luci-static/resources/fchomo.js:1180 msgid "Download successful." msgstr "下载成功。" -#: htdocs/luci-static/resources/fchomo.js:152 +#: htdocs/luci-static/resources/fchomo.js:156 msgid "Dual stack" msgstr "双栈" @@ -728,11 +737,11 @@ msgstr "ECH 配置" msgid "ECH key" msgstr "ECH 密钥" -#: htdocs/luci-static/resources/view/fchomo/client.js:1557 +#: htdocs/luci-static/resources/view/fchomo/client.js:1609 msgid "ECS override" msgstr "强制覆盖 ECS" -#: htdocs/luci-static/resources/view/fchomo/client.js:1541 +#: htdocs/luci-static/resources/view/fchomo/client.js:1593 msgid "EDNS Client Subnet" msgstr "" @@ -761,16 +770,17 @@ msgstr "编辑规则集" msgid "Editer" msgstr "编辑器" -#: htdocs/luci-static/resources/fchomo.js:362 +#: htdocs/luci-static/resources/fchomo.js:366 msgid "Eliminate encryption header characteristics" msgstr "消除加密头特征" -#: htdocs/luci-static/resources/view/fchomo/client.js:879 -#: htdocs/luci-static/resources/view/fchomo/client.js:972 -#: htdocs/luci-static/resources/view/fchomo/client.js:1210 -#: htdocs/luci-static/resources/view/fchomo/client.js:1302 -#: htdocs/luci-static/resources/view/fchomo/client.js:1439 -#: htdocs/luci-static/resources/view/fchomo/client.js:1674 +#: htdocs/luci-static/resources/view/fchomo/client.js:931 +#: htdocs/luci-static/resources/view/fchomo/client.js:1024 +#: htdocs/luci-static/resources/view/fchomo/client.js:1262 +#: htdocs/luci-static/resources/view/fchomo/client.js:1354 +#: htdocs/luci-static/resources/view/fchomo/client.js:1491 +#: htdocs/luci-static/resources/view/fchomo/client.js:1722 +#: htdocs/luci-static/resources/view/fchomo/client.js:1778 #: htdocs/luci-static/resources/view/fchomo/global.js:401 #: htdocs/luci-static/resources/view/fchomo/global.js:680 #: htdocs/luci-static/resources/view/fchomo/node.js:234 @@ -859,7 +869,7 @@ msgid "Endpoint-Independent NAT" msgstr "端点独立 NAT" #: htdocs/luci-static/resources/view/fchomo/client.js:722 -#: htdocs/luci-static/resources/view/fchomo/client.js:1707 +#: htdocs/luci-static/resources/view/fchomo/client.js:865 msgid "Entry" msgstr "条目" @@ -867,7 +877,7 @@ msgstr "条目" msgid "Error" msgstr "错误" -#: htdocs/luci-static/resources/view/fchomo/client.js:1077 +#: htdocs/luci-static/resources/view/fchomo/client.js:1129 msgid "" "Exceeding this triggers a forced health check. 5 will be used " "if empty." @@ -877,7 +887,7 @@ msgstr "超过此限制将会触发强制健康检查。留空则使用 5< msgid "Exclude matched node types." msgstr "排除匹配的节点类型。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1114 +#: htdocs/luci-static/resources/view/fchomo/client.js:1166 msgid "" "Exclude matched node types. Available types see here." @@ -885,7 +895,7 @@ msgstr "" "排除匹配的节点类型。可用类型请参见此处。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1109 +#: htdocs/luci-static/resources/view/fchomo/client.js:1161 #: htdocs/luci-static/resources/view/fchomo/node.js:1676 msgid "Exclude nodes that meet keywords or regexps." msgstr "排除匹配关键词或表达式的节点。" @@ -894,43 +904,43 @@ msgstr "排除匹配关键词或表达式的节点。" msgid "Expand/Collapse result" msgstr "展开/收起 结果" -#: htdocs/luci-static/resources/view/fchomo/client.js:1069 +#: htdocs/luci-static/resources/view/fchomo/client.js:1121 #: htdocs/luci-static/resources/view/fchomo/node.js:1661 msgid "Expected HTTP code. 204 will be used if empty." msgstr "预期的 HTTP code。留空则使用 204。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1071 +#: htdocs/luci-static/resources/view/fchomo/client.js:1123 #: htdocs/luci-static/resources/view/fchomo/node.js:1663 msgid "Expected status" msgstr "预期状态" -#: htdocs/luci-static/resources/fchomo.js:419 -#: htdocs/luci-static/resources/fchomo.js:422 -#: htdocs/luci-static/resources/fchomo.js:425 -#: htdocs/luci-static/resources/fchomo.js:1316 -#: htdocs/luci-static/resources/fchomo.js:1324 -#: htdocs/luci-static/resources/fchomo.js:1332 -#: htdocs/luci-static/resources/fchomo.js:1355 -#: htdocs/luci-static/resources/fchomo.js:1358 -#: htdocs/luci-static/resources/fchomo.js:1365 -#: htdocs/luci-static/resources/fchomo.js:1381 -#: htdocs/luci-static/resources/fchomo.js:1390 -#: htdocs/luci-static/resources/fchomo.js:1402 -#: htdocs/luci-static/resources/fchomo.js:1405 -#: htdocs/luci-static/resources/fchomo.js:1415 -#: htdocs/luci-static/resources/fchomo.js:1427 -#: htdocs/luci-static/resources/fchomo.js:1430 -#: htdocs/luci-static/resources/fchomo.js:1440 -#: htdocs/luci-static/resources/fchomo.js:1450 -#: htdocs/luci-static/resources/fchomo.js:1485 -#: htdocs/luci-static/resources/fchomo.js:1487 -#: htdocs/luci-static/resources/fchomo.js:1500 -#: htdocs/luci-static/resources/fchomo.js:1506 -#: htdocs/luci-static/resources/fchomo.js:1513 -#: htdocs/luci-static/resources/fchomo.js:1522 +#: htdocs/luci-static/resources/fchomo.js:423 +#: htdocs/luci-static/resources/fchomo.js:426 +#: htdocs/luci-static/resources/fchomo.js:429 +#: htdocs/luci-static/resources/fchomo.js:1320 +#: htdocs/luci-static/resources/fchomo.js:1328 +#: htdocs/luci-static/resources/fchomo.js:1336 +#: htdocs/luci-static/resources/fchomo.js:1359 +#: htdocs/luci-static/resources/fchomo.js:1362 +#: htdocs/luci-static/resources/fchomo.js:1369 +#: htdocs/luci-static/resources/fchomo.js:1385 +#: htdocs/luci-static/resources/fchomo.js:1394 +#: htdocs/luci-static/resources/fchomo.js:1406 +#: htdocs/luci-static/resources/fchomo.js:1409 +#: htdocs/luci-static/resources/fchomo.js:1419 +#: htdocs/luci-static/resources/fchomo.js:1431 +#: htdocs/luci-static/resources/fchomo.js:1434 +#: htdocs/luci-static/resources/fchomo.js:1444 +#: htdocs/luci-static/resources/fchomo.js:1454 +#: htdocs/luci-static/resources/fchomo.js:1489 +#: htdocs/luci-static/resources/fchomo.js:1491 +#: htdocs/luci-static/resources/fchomo.js:1504 +#: htdocs/luci-static/resources/fchomo.js:1510 +#: htdocs/luci-static/resources/fchomo.js:1517 +#: htdocs/luci-static/resources/fchomo.js:1526 #: htdocs/luci-static/resources/view/fchomo/client.js:68 -#: htdocs/luci-static/resources/view/fchomo/client.js:966 -#: htdocs/luci-static/resources/view/fchomo/client.js:1454 +#: htdocs/luci-static/resources/view/fchomo/client.js:1018 +#: htdocs/luci-static/resources/view/fchomo/client.js:1506 #: htdocs/luci-static/resources/view/fchomo/global.js:880 #: htdocs/luci-static/resources/view/fchomo/node.js:388 #: htdocs/luci-static/resources/view/fchomo/node.js:421 @@ -971,58 +981,58 @@ msgstr "实验性" msgid "Factor" msgstr "条件" -#: htdocs/luci-static/resources/fchomo.js:1257 +#: htdocs/luci-static/resources/fchomo.js:1261 msgid "Failed to execute \"/etc/init.d/fchomo %s %s\" reason: %s" msgstr "无法执行 \"/etc/init.d/fchomo %s %s\" 原因: %s" -#: htdocs/luci-static/resources/fchomo.js:1210 +#: htdocs/luci-static/resources/fchomo.js:1214 msgid "Failed to generate %s, error: %s." msgstr "生成 %s 失败,错误:%s。" -#: htdocs/luci-static/resources/fchomo.js:1622 +#: htdocs/luci-static/resources/fchomo.js:1626 msgid "Failed to upload %s, error: %s." msgstr "上传 %s 失败,错误:%s。" -#: htdocs/luci-static/resources/fchomo.js:1641 +#: htdocs/luci-static/resources/fchomo.js:1645 msgid "Failed to upload, error: %s." msgstr "上传失败,错误:%s。" -#: htdocs/luci-static/resources/fchomo.js:209 +#: htdocs/luci-static/resources/fchomo.js:213 msgid "Fallback" msgstr "自动回退" -#: htdocs/luci-static/resources/view/fchomo/client.js:1345 -#: htdocs/luci-static/resources/view/fchomo/client.js:1358 +#: htdocs/luci-static/resources/view/fchomo/client.js:1397 +#: htdocs/luci-static/resources/view/fchomo/client.js:1410 msgid "Fallback DNS server" msgstr "後備 DNS 服务器" -#: htdocs/luci-static/resources/view/fchomo/client.js:1734 +#: htdocs/luci-static/resources/view/fchomo/client.js:1792 msgid "Fallback filter" msgstr "後備过滤器" -#: htdocs/luci-static/resources/view/fchomo/client.js:1104 +#: htdocs/luci-static/resources/view/fchomo/client.js:1156 #: htdocs/luci-static/resources/view/fchomo/node.js:1670 msgid "Filter nodes that meet keywords or regexps." msgstr "过滤匹配关键字或表达式的节点。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1607 +#: htdocs/luci-static/resources/view/fchomo/client.js:1659 msgid "Filter record type:" msgstr "过滤记录类型:" -#: htdocs/luci-static/resources/view/fchomo/client.js:1575 -#: htdocs/luci-static/resources/view/fchomo/client.js:1591 +#: htdocs/luci-static/resources/view/fchomo/client.js:1627 +#: htdocs/luci-static/resources/view/fchomo/client.js:1643 msgid "Filter record: %s" msgstr "过滤 %s 记录" -#: htdocs/luci-static/resources/view/fchomo/client.js:1344 +#: htdocs/luci-static/resources/view/fchomo/client.js:1396 msgid "Final DNS server" msgstr "兜底 DNS 服务器" -#: htdocs/luci-static/resources/view/fchomo/client.js:1346 +#: htdocs/luci-static/resources/view/fchomo/client.js:1398 msgid "Final DNS server (For non-poisoned domains)" msgstr "兜底 DNS 服务器 (用于未被投毒污染的域名)" -#: htdocs/luci-static/resources/view/fchomo/client.js:1348 +#: htdocs/luci-static/resources/view/fchomo/client.js:1400 msgid "Final DNS server (For poisoned domains)" msgstr "兜底 DNS 服务器 (用于已被投毒污染的域名)" @@ -1035,7 +1045,7 @@ msgstr "" msgid "Flow" msgstr "流控" -#: htdocs/luci-static/resources/view/fchomo/client.js:1093 +#: htdocs/luci-static/resources/view/fchomo/client.js:1145 msgid "" "For details, see %s." @@ -1043,7 +1053,7 @@ msgstr "" "实现细节请参阅 %s." -#: htdocs/luci-static/resources/view/fchomo/client.js:1070 +#: htdocs/luci-static/resources/view/fchomo/client.js:1122 #: htdocs/luci-static/resources/view/fchomo/node.js:1539 #: htdocs/luci-static/resources/view/fchomo/node.js:1662 msgid "" @@ -1085,7 +1095,7 @@ msgstr "GFW 域名列表版本" msgid "General" msgstr "常规" -#: htdocs/luci-static/resources/view/fchomo/client.js:957 +#: htdocs/luci-static/resources/view/fchomo/client.js:1009 #: htdocs/luci-static/resources/view/fchomo/node.js:222 #: htdocs/luci-static/resources/view/fchomo/node.js:1419 #: htdocs/luci-static/resources/view/fchomo/server.js:171 @@ -1096,10 +1106,10 @@ msgstr "常规字段" msgid "General settings" msgstr "常规设置" -#: htdocs/luci-static/resources/fchomo.js:520 -#: htdocs/luci-static/resources/fchomo.js:522 -#: htdocs/luci-static/resources/fchomo.js:536 -#: htdocs/luci-static/resources/fchomo.js:538 +#: htdocs/luci-static/resources/fchomo.js:524 +#: htdocs/luci-static/resources/fchomo.js:526 +#: htdocs/luci-static/resources/fchomo.js:540 +#: htdocs/luci-static/resources/fchomo.js:542 #: htdocs/luci-static/resources/view/fchomo/global.js:587 #: htdocs/luci-static/resources/view/fchomo/server.js:343 #: htdocs/luci-static/resources/view/fchomo/server.js:384 @@ -1121,17 +1131,17 @@ msgstr "GeoIP 版本" msgid "GeoSite version" msgstr "GeoSite 版本" -#: htdocs/luci-static/resources/view/fchomo/client.js:1744 +#: htdocs/luci-static/resources/view/fchomo/client.js:1802 msgid "Geoip code" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1741 +#: htdocs/luci-static/resources/view/fchomo/client.js:1799 msgid "Geoip enable" msgstr "Geoip 启用" -#: htdocs/luci-static/resources/view/fchomo/client.js:1686 -#: htdocs/luci-static/resources/view/fchomo/client.js:1695 -#: htdocs/luci-static/resources/view/fchomo/client.js:1753 +#: htdocs/luci-static/resources/view/fchomo/client.js:844 +#: htdocs/luci-static/resources/view/fchomo/client.js:853 +#: htdocs/luci-static/resources/view/fchomo/client.js:1811 msgid "Geosite" msgstr "" @@ -1156,7 +1166,7 @@ msgstr "全局填充" msgid "Google" msgstr "谷歌" -#: htdocs/luci-static/resources/fchomo.js:222 +#: htdocs/luci-static/resources/fchomo.js:226 msgid "Google FCM" msgstr "谷歌 FCM" @@ -1164,12 +1174,12 @@ msgstr "谷歌 FCM" msgid "Grant access to fchomo configuration" msgstr "授予 fchomo 访问 UCI 配置的权限" -#: htdocs/luci-static/resources/view/fchomo/client.js:982 +#: htdocs/luci-static/resources/view/fchomo/client.js:1034 msgid "Group" msgstr "组" -#: htdocs/luci-static/resources/fchomo.js:135 -#: htdocs/luci-static/resources/fchomo.js:167 +#: htdocs/luci-static/resources/fchomo.js:139 +#: htdocs/luci-static/resources/fchomo.js:171 #: htdocs/luci-static/resources/view/fchomo/node.js:804 #: htdocs/luci-static/resources/view/fchomo/node.js:1106 #: htdocs/luci-static/resources/view/fchomo/node.js:1117 @@ -1213,7 +1223,7 @@ msgstr "HTTP 请求方法" msgid "HTTP root path" msgstr "HTTP 根路径" -#: htdocs/luci-static/resources/view/fchomo/client.js:1506 +#: htdocs/luci-static/resources/view/fchomo/client.js:1558 msgid "HTTP/3" msgstr "" @@ -1245,27 +1255,27 @@ msgstr "握手目标 (支援 TLS 1.3)" msgid "Handshake timeout" msgstr "握手超时" -#: htdocs/luci-static/resources/view/fchomo/client.js:1039 +#: htdocs/luci-static/resources/view/fchomo/client.js:1091 #: htdocs/luci-static/resources/view/fchomo/node.js:1630 msgid "Health check URL" msgstr "健康检查 URL" -#: htdocs/luci-static/resources/view/fchomo/client.js:1068 +#: htdocs/luci-static/resources/view/fchomo/client.js:1120 #: htdocs/luci-static/resources/view/fchomo/node.js:1660 msgid "Health check expected status" msgstr "健康检查预期状态" -#: htdocs/luci-static/resources/view/fchomo/client.js:1048 +#: htdocs/luci-static/resources/view/fchomo/client.js:1100 #: htdocs/luci-static/resources/view/fchomo/node.js:1640 msgid "Health check interval" msgstr "健康检查间隔" -#: htdocs/luci-static/resources/view/fchomo/client.js:1055 +#: htdocs/luci-static/resources/view/fchomo/client.js:1107 #: htdocs/luci-static/resources/view/fchomo/node.js:1647 msgid "Health check timeout" msgstr "健康检查超时" -#: htdocs/luci-static/resources/view/fchomo/client.js:959 +#: htdocs/luci-static/resources/view/fchomo/client.js:1011 #: htdocs/luci-static/resources/view/fchomo/node.js:1421 msgid "Health fields" msgstr "健康字段" @@ -1274,7 +1284,7 @@ msgstr "健康字段" msgid "Heartbeat interval" msgstr "心跳间隔" -#: htdocs/luci-static/resources/view/fchomo/client.js:1119 +#: htdocs/luci-static/resources/view/fchomo/client.js:1171 msgid "Hidden" msgstr "隐藏" @@ -1299,17 +1309,17 @@ msgstr "主机/SNI 覆盖" msgid "Hosts" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:146 -#: htdocs/luci-static/resources/fchomo.js:179 +#: htdocs/luci-static/resources/fchomo.js:150 +#: htdocs/luci-static/resources/fchomo.js:183 msgid "Hysteria2" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1746 -#: htdocs/luci-static/resources/view/fchomo/client.js:1759 +#: htdocs/luci-static/resources/view/fchomo/client.js:1804 +#: htdocs/luci-static/resources/view/fchomo/client.js:1817 msgid "IP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1757 +#: htdocs/luci-static/resources/view/fchomo/client.js:1815 msgid "IP CIDR" msgstr "" @@ -1322,20 +1332,20 @@ msgstr "IP 覆写" msgid "IP version" msgstr "IP 版本" -#: htdocs/luci-static/resources/fchomo.js:153 +#: htdocs/luci-static/resources/fchomo.js:157 msgid "IPv4 only" msgstr "仅 IPv4" -#: htdocs/luci-static/resources/fchomo.js:154 +#: htdocs/luci-static/resources/fchomo.js:158 msgid "IPv6 only" msgstr "仅 IPv6" -#: htdocs/luci-static/resources/view/fchomo/client.js:1327 +#: htdocs/luci-static/resources/view/fchomo/client.js:1379 #: htdocs/luci-static/resources/view/fchomo/global.js:415 msgid "IPv6 support" msgstr "IPv6 支持" -#: htdocs/luci-static/resources/view/fchomo/client.js:1125 +#: htdocs/luci-static/resources/view/fchomo/client.js:1177 msgid "Icon" msgstr "图标" @@ -1351,7 +1361,7 @@ msgstr "闲置会话超时" msgid "Idle timeout" msgstr "闲置超时" -#: htdocs/luci-static/resources/fchomo.js:1358 +#: htdocs/luci-static/resources/fchomo.js:1362 msgid "If All ports is selected, uncheck others" msgstr "如果选择了“所有端口”,则取消选中“其他”" @@ -1363,20 +1373,22 @@ msgstr "如果选择了“阻止”,则取消选中“其他”" msgid "Ignore client bandwidth" msgstr "忽略客户端带宽" -#: htdocs/luci-static/resources/fchomo.js:705 +#: htdocs/luci-static/resources/fchomo.js:709 msgid "Import" msgstr "导入" -#: htdocs/luci-static/resources/view/fchomo/client.js:896 -#: htdocs/luci-static/resources/view/fchomo/client.js:951 -#: htdocs/luci-static/resources/view/fchomo/client.js:1148 -#: htdocs/luci-static/resources/view/fchomo/client.js:1199 -#: htdocs/luci-static/resources/view/fchomo/client.js:1267 -#: htdocs/luci-static/resources/view/fchomo/client.js:1291 -#: htdocs/luci-static/resources/view/fchomo/client.js:1392 -#: htdocs/luci-static/resources/view/fchomo/client.js:1428 -#: htdocs/luci-static/resources/view/fchomo/client.js:1642 -#: htdocs/luci-static/resources/view/fchomo/client.js:1663 +#: htdocs/luci-static/resources/view/fchomo/client.js:948 +#: htdocs/luci-static/resources/view/fchomo/client.js:1003 +#: htdocs/luci-static/resources/view/fchomo/client.js:1200 +#: htdocs/luci-static/resources/view/fchomo/client.js:1251 +#: htdocs/luci-static/resources/view/fchomo/client.js:1319 +#: htdocs/luci-static/resources/view/fchomo/client.js:1343 +#: htdocs/luci-static/resources/view/fchomo/client.js:1444 +#: htdocs/luci-static/resources/view/fchomo/client.js:1480 +#: htdocs/luci-static/resources/view/fchomo/client.js:1694 +#: htdocs/luci-static/resources/view/fchomo/client.js:1711 +#: htdocs/luci-static/resources/view/fchomo/client.js:1746 +#: htdocs/luci-static/resources/view/fchomo/client.js:1767 #: htdocs/luci-static/resources/view/fchomo/node.js:1326 #: htdocs/luci-static/resources/view/fchomo/node.js:1407 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:143 @@ -1409,8 +1421,8 @@ msgstr "单位为字节。留空则使用 %s。" msgid "In millisecond." msgstr "单位为毫秒。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1056 -#: htdocs/luci-static/resources/view/fchomo/client.js:1085 +#: htdocs/luci-static/resources/view/fchomo/client.js:1108 +#: htdocs/luci-static/resources/view/fchomo/client.js:1137 #: htdocs/luci-static/resources/view/fchomo/node.js:1648 msgid "In millisecond. %s will be used if empty." msgstr "单位为毫秒。留空则使用 %s。" @@ -1423,7 +1435,7 @@ msgstr "单位为毫秒。留空则使用 %s。" msgid "In seconds." msgstr "单位为秒。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1049 +#: htdocs/luci-static/resources/view/fchomo/client.js:1101 #: htdocs/luci-static/resources/view/fchomo/global.js:425 #: htdocs/luci-static/resources/view/fchomo/global.js:430 #: htdocs/luci-static/resources/view/fchomo/global.js:515 @@ -1446,27 +1458,27 @@ msgstr "" msgid "Inbound" msgstr "入站" -#: htdocs/luci-static/resources/view/fchomo/client.js:1017 +#: htdocs/luci-static/resources/view/fchomo/client.js:1069 msgid "Include all" msgstr "引入所有" -#: htdocs/luci-static/resources/view/fchomo/client.js:1022 +#: htdocs/luci-static/resources/view/fchomo/client.js:1074 msgid "Include all node" msgstr "引入所有节点" -#: htdocs/luci-static/resources/view/fchomo/client.js:1027 +#: htdocs/luci-static/resources/view/fchomo/client.js:1079 msgid "Include all provider" msgstr "引入所有供应商" -#: htdocs/luci-static/resources/view/fchomo/client.js:1028 +#: htdocs/luci-static/resources/view/fchomo/client.js:1080 msgid "Includes all Provider." msgstr "引入所有供应商。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1018 +#: htdocs/luci-static/resources/view/fchomo/client.js:1070 msgid "Includes all Proxy Node and Provider." msgstr "引入所有代理节点及供应商。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1023 +#: htdocs/luci-static/resources/view/fchomo/client.js:1075 msgid "Includes all Proxy Node." msgstr "引入所有代理节点。" @@ -1484,8 +1496,8 @@ msgid "Interface Control" msgstr "接口控制" #: htdocs/luci-static/resources/fchomo.js:49 -#: htdocs/luci-static/resources/fchomo.js:151 -#: htdocs/luci-static/resources/fchomo.js:344 +#: htdocs/luci-static/resources/fchomo.js:155 +#: htdocs/luci-static/resources/fchomo.js:348 msgid "Keep default" msgstr "保持缺省" @@ -1503,11 +1515,12 @@ msgstr "证书路径" msgid "Keypairs" msgstr "密钥对" -#: htdocs/luci-static/resources/view/fchomo/client.js:962 -#: htdocs/luci-static/resources/view/fchomo/client.js:1205 -#: htdocs/luci-static/resources/view/fchomo/client.js:1297 -#: htdocs/luci-static/resources/view/fchomo/client.js:1434 -#: htdocs/luci-static/resources/view/fchomo/client.js:1669 +#: htdocs/luci-static/resources/view/fchomo/client.js:1014 +#: htdocs/luci-static/resources/view/fchomo/client.js:1257 +#: htdocs/luci-static/resources/view/fchomo/client.js:1349 +#: htdocs/luci-static/resources/view/fchomo/client.js:1486 +#: htdocs/luci-static/resources/view/fchomo/client.js:1717 +#: htdocs/luci-static/resources/view/fchomo/client.js:1773 #: htdocs/luci-static/resources/view/fchomo/node.js:229 #: htdocs/luci-static/resources/view/fchomo/node.js:1424 #: htdocs/luci-static/resources/view/fchomo/node.js:1709 @@ -1516,7 +1529,7 @@ msgstr "密钥对" msgid "Label" msgstr "标签" -#: htdocs/luci-static/resources/view/fchomo/client.js:1062 +#: htdocs/luci-static/resources/view/fchomo/client.js:1114 #: htdocs/luci-static/resources/view/fchomo/node.js:1654 msgid "Lazy" msgstr "懒惰状态" @@ -1555,7 +1568,7 @@ msgstr "监听字段" msgid "Listen interfaces" msgstr "监听接口" -#: htdocs/luci-static/resources/view/fchomo/client.js:1322 +#: htdocs/luci-static/resources/view/fchomo/client.js:1374 #: htdocs/luci-static/resources/view/fchomo/server.js:204 msgid "Listen port" msgstr "监听端口" @@ -1564,7 +1577,7 @@ msgstr "监听端口" msgid "Listen ports" msgstr "监听端口" -#: htdocs/luci-static/resources/fchomo.js:211 +#: htdocs/luci-static/resources/fchomo.js:215 msgid "Load balance" msgstr "负载均衡" @@ -1599,7 +1612,7 @@ msgstr "日志为空。" msgid "Log level" msgstr "日志等级" -#: htdocs/luci-static/resources/fchomo.js:419 +#: htdocs/luci-static/resources/fchomo.js:423 msgid "Lowercase only" msgstr "仅限小写" @@ -1609,7 +1622,7 @@ msgstr "仅限小写" msgid "MTU" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:181 +#: htdocs/luci-static/resources/fchomo.js:185 msgid "Masque" msgstr "" @@ -1617,31 +1630,31 @@ msgstr "" msgid "Masquerade" msgstr "伪装" -#: htdocs/luci-static/resources/view/fchomo/client.js:1691 +#: htdocs/luci-static/resources/view/fchomo/client.js:849 msgid "Match domain. Support wildcards." msgstr "匹配域名。支持通配符。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1763 +#: htdocs/luci-static/resources/view/fchomo/client.js:1821 msgid "Match domain. Support wildcards.
" msgstr "匹配域名。支持通配符。
" -#: htdocs/luci-static/resources/view/fchomo/client.js:1696 +#: htdocs/luci-static/resources/view/fchomo/client.js:854 msgid "Match geosite." msgstr "匹配 geosite。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1754 +#: htdocs/luci-static/resources/view/fchomo/client.js:1812 msgid "Match geosite.
" msgstr "匹配 geosite。
" -#: htdocs/luci-static/resources/view/fchomo/client.js:1745 +#: htdocs/luci-static/resources/view/fchomo/client.js:1803 msgid "Match response with geoip.
" msgstr "匹配响应通过 geoip。
" -#: htdocs/luci-static/resources/view/fchomo/client.js:1758 +#: htdocs/luci-static/resources/view/fchomo/client.js:1816 msgid "Match response with ipcidr.
" msgstr "匹配响应通过 ipcidr
" -#: htdocs/luci-static/resources/view/fchomo/client.js:1701 +#: htdocs/luci-static/resources/view/fchomo/client.js:859 msgid "Match rule set." msgstr "匹配规则集。" @@ -1654,7 +1667,7 @@ msgstr "前置数据最大值" msgid "Max UDP relay packet size" msgstr "UDP 中继数据包最大尺寸" -#: htdocs/luci-static/resources/view/fchomo/client.js:1076 +#: htdocs/luci-static/resources/view/fchomo/client.js:1128 msgid "Max count of failures" msgstr "最大失败次数" @@ -1692,19 +1705,21 @@ msgstr "最大填充率" #: htdocs/luci-static/resources/view/fchomo/node.js:421 #: htdocs/luci-static/resources/view/fchomo/server.js:409 -msgid "Maximum padding rate must be greater than or equal to the minimum padding rate." +msgid "" +"Maximum padding rate must be greater than or equal to the minimum padding " +"rate." msgstr "最大填充率必须大于等于最小填充率。" #: htdocs/luci-static/resources/view/fchomo/node.js:1230 msgid "Maximum streams" msgstr "最大流数量" -#: htdocs/luci-static/resources/fchomo.js:139 -#: htdocs/luci-static/resources/fchomo.js:171 +#: htdocs/luci-static/resources/fchomo.js:143 +#: htdocs/luci-static/resources/fchomo.js:175 msgid "Mieru" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:851 +#: htdocs/luci-static/resources/view/fchomo/client.js:903 #: htdocs/luci-static/resources/view/fchomo/log.js:149 #: htdocs/luci-static/resources/view/fchomo/log.js:154 msgid "Mihomo client" @@ -1735,7 +1750,7 @@ msgstr "最小填充率" msgid "Minimum streams" msgstr "最小流数量" -#: htdocs/luci-static/resources/fchomo.js:137 +#: htdocs/luci-static/resources/fchomo.js:141 #: htdocs/luci-static/resources/view/fchomo/global.js:497 msgid "Mixed" msgstr "混合" @@ -1778,7 +1793,7 @@ msgstr "用于下载规则集订阅的代理组名称。" msgid "Native UDP" msgstr "原生 UDP" -#: htdocs/luci-static/resources/fchomo.js:361 +#: htdocs/luci-static/resources/fchomo.js:365 msgid "Native appearance" msgstr "原生外观" @@ -1786,16 +1801,16 @@ msgstr "原生外观" msgid "No Authentication IP ranges" msgstr "无需认证的 IP 范围" -#: htdocs/luci-static/resources/view/fchomo/client.js:1454 +#: htdocs/luci-static/resources/view/fchomo/client.js:1506 msgid "No add'l params" msgstr "无附加参数" -#: htdocs/luci-static/resources/view/fchomo/client.js:1063 +#: htdocs/luci-static/resources/view/fchomo/client.js:1115 #: htdocs/luci-static/resources/view/fchomo/node.js:1655 msgid "No testing is performed when this provider node is not in use." msgstr "当此供应商的节点未使用时,不执行任何测试。" -#: htdocs/luci-static/resources/fchomo.js:666 +#: htdocs/luci-static/resources/fchomo.js:670 msgid "No valid %s found." msgstr "未找到有效的%s。" @@ -1803,32 +1818,32 @@ msgstr "未找到有效的%s。" msgid "No valid rule-set link found." msgstr "未找到有效的规则集链接。" -#: htdocs/luci-static/resources/view/fchomo/client.js:989 +#: htdocs/luci-static/resources/view/fchomo/client.js:1041 #: htdocs/luci-static/resources/view/fchomo/node.js:217 #: root/usr/share/luci/menu.d/luci-app-fchomo.json:38 msgid "Node" msgstr "节点" -#: htdocs/luci-static/resources/view/fchomo/client.js:1108 +#: htdocs/luci-static/resources/view/fchomo/client.js:1160 #: htdocs/luci-static/resources/view/fchomo/node.js:1675 msgid "Node exclude filter" msgstr "排除节点" -#: htdocs/luci-static/resources/view/fchomo/client.js:1113 +#: htdocs/luci-static/resources/view/fchomo/client.js:1165 #: htdocs/luci-static/resources/view/fchomo/node.js:1682 msgid "Node exclude type" msgstr "排除节点类型" -#: htdocs/luci-static/resources/view/fchomo/client.js:1103 +#: htdocs/luci-static/resources/view/fchomo/client.js:1155 #: htdocs/luci-static/resources/view/fchomo/node.js:1669 msgid "Node filter" msgstr "过滤节点" -#: htdocs/luci-static/resources/view/fchomo/client.js:1084 +#: htdocs/luci-static/resources/view/fchomo/client.js:1136 msgid "Node switch tolerance" msgstr "节点切换容差" -#: htdocs/luci-static/resources/fchomo.js:388 +#: htdocs/luci-static/resources/fchomo.js:392 msgid "None" msgstr "无" @@ -1836,7 +1851,7 @@ msgstr "无" msgid "Not Installed" msgstr "未安装" -#: htdocs/luci-static/resources/fchomo.js:1136 +#: htdocs/luci-static/resources/fchomo.js:1140 msgid "Not Running" msgstr "未在运行" @@ -1882,7 +1897,7 @@ msgstr "0-63 范围内的一个或多个数字,以逗号分隔" msgid "Only process traffic from specific interfaces. Leave empty for all." msgstr "只处理来自指定接口的流量。留空表示全部。" -#: htdocs/luci-static/resources/fchomo.js:1130 +#: htdocs/luci-static/resources/fchomo.js:1134 msgid "Open Dashboard" msgstr "打开面板" @@ -1895,7 +1910,7 @@ msgstr "运行模式" msgid "Override destination" msgstr "覆盖目标地址" -#: htdocs/luci-static/resources/view/fchomo/client.js:958 +#: htdocs/luci-static/resources/view/fchomo/client.js:1010 #: htdocs/luci-static/resources/view/fchomo/node.js:1420 msgid "Override fields" msgstr "覆盖字段" @@ -1904,7 +1919,7 @@ msgstr "覆盖字段" msgid "Override the IP address of the server that DNS response." msgstr "覆盖 DNS 回应的服务器的 IP 地址。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1724 +#: htdocs/luci-static/resources/view/fchomo/client.js:882 msgid "Override the Proxy group of DNS server." msgstr "覆盖 DNS 服务器所使用的代理组。" @@ -1912,7 +1927,7 @@ msgstr "覆盖 DNS 服务器所使用的代理组。" msgid "Override the connection destination address with the sniffed domain." msgstr "使用嗅探到的域名覆盖连接目标。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1558 +#: htdocs/luci-static/resources/view/fchomo/client.js:1610 msgid "Override the existing ECS in original request." msgstr "覆盖原始请求中已有的 ECS。" @@ -2007,11 +2022,12 @@ msgid "" msgstr "" "请输入 %s。" -#: htdocs/luci-static/resources/view/fchomo/client.js:897 -#: htdocs/luci-static/resources/view/fchomo/client.js:1149 -#: htdocs/luci-static/resources/view/fchomo/client.js:1268 -#: htdocs/luci-static/resources/view/fchomo/client.js:1393 -#: htdocs/luci-static/resources/view/fchomo/client.js:1643 +#: htdocs/luci-static/resources/view/fchomo/client.js:949 +#: htdocs/luci-static/resources/view/fchomo/client.js:1201 +#: htdocs/luci-static/resources/view/fchomo/client.js:1320 +#: htdocs/luci-static/resources/view/fchomo/client.js:1445 +#: htdocs/luci-static/resources/view/fchomo/client.js:1695 +#: htdocs/luci-static/resources/view/fchomo/client.js:1747 #: htdocs/luci-static/resources/view/fchomo/node.js:1327 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:144 msgid "Please type %s fields of mihomo config.
" @@ -2038,7 +2054,7 @@ msgstr "插件:" msgid "Port" msgstr "端口" -#: htdocs/luci-static/resources/fchomo.js:1367 +#: htdocs/luci-static/resources/fchomo.js:1371 msgid "Port %s alrealy exists!" msgstr "端口 %s 已存在!" @@ -2060,11 +2076,11 @@ msgstr "端口池" msgid "Pre-shared key" msgstr "预共享密钥" -#: htdocs/luci-static/resources/fchomo.js:155 +#: htdocs/luci-static/resources/fchomo.js:159 msgid "Prefer IPv4" msgstr "优先 IPv4" -#: htdocs/luci-static/resources/fchomo.js:156 +#: htdocs/luci-static/resources/fchomo.js:160 msgid "Prefer IPv6" msgstr "优先 IPv6" @@ -2114,7 +2130,7 @@ msgid "" "default in v2ray and cannot be disabled)." msgstr "协议参数。 如启用会随机浪费流量(在 v2ray 中默认启用并且无法禁用)。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1003 +#: htdocs/luci-static/resources/view/fchomo/client.js:1055 #: htdocs/luci-static/resources/view/fchomo/node.js:1310 #: htdocs/luci-static/resources/view/fchomo/node.js:1319 #: htdocs/luci-static/resources/view/fchomo/node.js:1720 @@ -2125,9 +2141,9 @@ msgstr "供应商" msgid "Provider URL" msgstr "供应商订阅 URL" -#: htdocs/luci-static/resources/view/fchomo/client.js:871 -#: htdocs/luci-static/resources/view/fchomo/client.js:889 -#: htdocs/luci-static/resources/view/fchomo/client.js:1349 +#: htdocs/luci-static/resources/view/fchomo/client.js:923 +#: htdocs/luci-static/resources/view/fchomo/client.js:941 +#: htdocs/luci-static/resources/view/fchomo/client.js:1401 msgid "Proxy Group" msgstr "代理组" @@ -2154,13 +2170,13 @@ msgid "Proxy chain" msgstr "代理链" #: htdocs/luci-static/resources/view/fchomo/client.js:783 -#: htdocs/luci-static/resources/view/fchomo/client.js:1489 +#: htdocs/luci-static/resources/view/fchomo/client.js:1541 #: htdocs/luci-static/resources/view/fchomo/node.js:1508 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:381 msgid "Proxy group" msgstr "代理组" -#: htdocs/luci-static/resources/view/fchomo/client.js:1723 +#: htdocs/luci-static/resources/view/fchomo/client.js:881 msgid "Proxy group override" msgstr "代理组覆盖" @@ -2181,7 +2197,7 @@ msgstr "" msgid "QUIC congestion controller." msgstr "QUIC 拥塞控制器。" -#: htdocs/luci-static/resources/view/fchomo/client.js:874 +#: htdocs/luci-static/resources/view/fchomo/client.js:926 #: htdocs/luci-static/resources/view/fchomo/server.js:152 msgid "Quick Reload" msgstr "快速重载" @@ -2223,7 +2239,7 @@ msgstr "REALITY 标识符" msgid "RTT" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:353 +#: htdocs/luci-static/resources/fchomo.js:357 msgid "Random" msgstr "随机" @@ -2231,7 +2247,7 @@ msgstr "随机" msgid "Random will be used if empty." msgstr "留空将使用随机令牌。" -#: htdocs/luci-static/resources/fchomo.js:363 +#: htdocs/luci-static/resources/fchomo.js:367 msgid "Randomized traffic characteristics" msgstr "随机化流量特征" @@ -2255,8 +2271,8 @@ msgstr "Redirect TCP + Tun UDP" msgid "Refresh every %s seconds." msgstr "每 %s 秒刷新。" -#: htdocs/luci-static/resources/fchomo.js:1123 -#: htdocs/luci-static/resources/view/fchomo/client.js:875 +#: htdocs/luci-static/resources/fchomo.js:1127 +#: htdocs/luci-static/resources/view/fchomo/client.js:927 #: htdocs/luci-static/resources/view/fchomo/global.js:193 #: htdocs/luci-static/resources/view/fchomo/server.js:153 msgid "Reload" @@ -2276,11 +2292,11 @@ msgstr "远程" msgid "Remote DNS resolve" msgstr "远程 DNS 解析" -#: htdocs/luci-static/resources/fchomo.js:1288 +#: htdocs/luci-static/resources/fchomo.js:1292 msgid "Remove" msgstr "移除" -#: htdocs/luci-static/resources/fchomo.js:1293 +#: htdocs/luci-static/resources/fchomo.js:1297 #: htdocs/luci-static/resources/view/fchomo/node.js:1411 #: htdocs/luci-static/resources/view/fchomo/node.js:1413 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:244 @@ -2296,7 +2312,7 @@ msgstr "名称替换" msgid "Replace node name." msgstr "替换节点名称" -#: htdocs/luci-static/resources/fchomo.js:337 +#: htdocs/luci-static/resources/fchomo.js:341 msgid "Request" msgstr "" @@ -2310,15 +2326,15 @@ msgstr "请求路径" msgid "Request timeout" msgstr "请求超时" -#: htdocs/luci-static/resources/fchomo.js:340 +#: htdocs/luci-static/resources/fchomo.js:344 msgid "Require and verify" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:338 +#: htdocs/luci-static/resources/fchomo.js:342 msgid "Require any" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:371 +#: htdocs/luci-static/resources/fchomo.js:375 #: htdocs/luci-static/resources/view/fchomo/node.js:1093 msgid "Requires server support." msgstr "需要服务器支持。" @@ -2335,12 +2351,12 @@ msgstr "资源管理" msgid "Restls script" msgstr "Restls 剧本" -#: htdocs/luci-static/resources/view/fchomo/client.js:1120 +#: htdocs/luci-static/resources/view/fchomo/client.js:1172 msgid "" "Returns hidden status in the API to hide the display of this proxy group." msgstr "在 API 返回 hidden 状态,以隐藏该代理组显示。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1126 +#: htdocs/luci-static/resources/view/fchomo/client.js:1178 msgid "" "Returns the string input for icon in the API to display in this proxy group." msgstr "在 API 返回 icon 所输入的字符串,以在该代理组显示。" @@ -2393,8 +2409,8 @@ msgstr "路由模式将处理域名。" msgid "Routing ports" msgstr "路由端口" -#: htdocs/luci-static/resources/view/fchomo/client.js:1132 -#: htdocs/luci-static/resources/view/fchomo/client.js:1141 +#: htdocs/luci-static/resources/view/fchomo/client.js:1184 +#: htdocs/luci-static/resources/view/fchomo/client.js:1193 msgid "Routing rule" msgstr "路由规则" @@ -2410,8 +2426,8 @@ msgstr "路由表 ID" msgid "Rule" msgstr "规则" -#: htdocs/luci-static/resources/view/fchomo/client.js:1687 -#: htdocs/luci-static/resources/view/fchomo/client.js:1700 +#: htdocs/luci-static/resources/view/fchomo/client.js:845 +#: htdocs/luci-static/resources/view/fchomo/client.js:858 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:136 msgid "Rule set" msgstr "规则集" @@ -2428,31 +2444,31 @@ msgstr "规则集" msgid "Ruleset-URI-Scheme" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1136 +#: htdocs/luci-static/resources/fchomo.js:1140 msgid "Running" msgstr "正在运行" -#: htdocs/luci-static/resources/fchomo.js:219 +#: htdocs/luci-static/resources/fchomo.js:223 msgid "SMTP" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:136 +#: htdocs/luci-static/resources/fchomo.js:140 msgid "SOCKS" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:168 +#: htdocs/luci-static/resources/fchomo.js:172 msgid "SOCKS5" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:183 +#: htdocs/luci-static/resources/fchomo.js:187 msgid "SSH" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:220 +#: htdocs/luci-static/resources/fchomo.js:224 msgid "STUN" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1224 +#: htdocs/luci-static/resources/view/fchomo/client.js:1276 msgid "SUB-RULE" msgstr "SUB-RULE" @@ -2465,11 +2481,11 @@ msgstr "SUoT 版本" msgid "Salamander" msgstr "Salamander" -#: htdocs/luci-static/resources/fchomo.js:161 +#: htdocs/luci-static/resources/fchomo.js:165 msgid "Same dstaddr requests. Same node" msgstr "相同 目标地址 请求。相同节点" -#: htdocs/luci-static/resources/fchomo.js:162 +#: htdocs/luci-static/resources/fchomo.js:166 msgid "Same srcaddr and dstaddr requests. Same node" msgstr "相同 来源地址 和 目标地址 请求。相同节点" @@ -2477,7 +2493,7 @@ msgstr "相同 来源地址 和 目标地址 请求。相同节点" msgid "Segment maximum size" msgstr "分段最大尺寸" -#: htdocs/luci-static/resources/fchomo.js:208 +#: htdocs/luci-static/resources/fchomo.js:212 msgid "Select" msgstr "手动选择" @@ -2485,12 +2501,12 @@ msgstr "手动选择" msgid "Select Dashboard" msgstr "选择面板" -#: htdocs/luci-static/resources/fchomo.js:377 +#: htdocs/luci-static/resources/fchomo.js:381 msgid "Send padding randomly 0-3333 bytes with 50% probability." msgstr "以 50% 的概率发送随机 0-3333 字节的填充。" -#: htdocs/luci-static/resources/fchomo.js:366 -#: htdocs/luci-static/resources/fchomo.js:367 +#: htdocs/luci-static/resources/fchomo.js:370 +#: htdocs/luci-static/resources/fchomo.js:371 msgid "Send random ticket of 300s-600s duration for client 0-RTT reuse." msgstr "发送 300-600 秒的随机票证,以供客户端 0-RTT 重用。" @@ -2518,8 +2534,8 @@ msgstr "服务端状态" msgid "Service status" msgstr "服务状态" -#: htdocs/luci-static/resources/fchomo.js:138 -#: htdocs/luci-static/resources/fchomo.js:169 +#: htdocs/luci-static/resources/fchomo.js:142 +#: htdocs/luci-static/resources/fchomo.js:173 msgid "Shadowsocks" msgstr "" @@ -2546,7 +2562,7 @@ msgstr "在面板中显示连接以便于打断连接。" msgid "Silent" msgstr "静音" -#: htdocs/luci-static/resources/fchomo.js:160 +#: htdocs/luci-static/resources/fchomo.js:164 msgid "Simple round-robin all nodes" msgstr "简单轮替所有节点" @@ -2555,7 +2571,7 @@ msgstr "简单轮替所有节点" msgid "Size limit" msgstr "大小限制" -#: htdocs/luci-static/resources/view/fchomo/client.js:1522 +#: htdocs/luci-static/resources/view/fchomo/client.js:1574 #: htdocs/luci-static/resources/view/fchomo/node.js:1014 #: htdocs/luci-static/resources/view/fchomo/node.js:1588 msgid "Skip cert verify" @@ -2573,7 +2589,7 @@ msgstr "跳过嗅探目标地址" msgid "Skiped sniffing src address" msgstr "跳过嗅探来源地址" -#: htdocs/luci-static/resources/fchomo.js:173 +#: htdocs/luci-static/resources/fchomo.js:177 msgid "Snell" msgstr "" @@ -2589,7 +2605,7 @@ msgstr "嗅探器" msgid "Sniffer settings" msgstr "嗅探器设置" -#: htdocs/luci-static/resources/fchomo.js:409 +#: htdocs/luci-static/resources/fchomo.js:413 msgid "Specify a ID" msgstr "指定一个ID" @@ -2604,29 +2620,29 @@ msgstr "指定需要被代理的目标端口。多个端口必须用逗号隔开 msgid "Stack" msgstr "堆栈" -#: htdocs/luci-static/resources/fchomo.js:223 +#: htdocs/luci-static/resources/fchomo.js:227 msgid "Steam Client" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:224 +#: htdocs/luci-static/resources/fchomo.js:228 msgid "Steam P2P" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1092 -#: htdocs/luci-static/resources/view/fchomo/client.js:1094 +#: htdocs/luci-static/resources/view/fchomo/client.js:1144 +#: htdocs/luci-static/resources/view/fchomo/client.js:1146 msgid "Strategy" msgstr "策略" -#: htdocs/luci-static/resources/view/fchomo/client.js:1251 -#: htdocs/luci-static/resources/view/fchomo/client.js:1260 +#: htdocs/luci-static/resources/view/fchomo/client.js:1303 +#: htdocs/luci-static/resources/view/fchomo/client.js:1312 msgid "Sub rule" msgstr "子规则" -#: htdocs/luci-static/resources/view/fchomo/client.js:1306 +#: htdocs/luci-static/resources/view/fchomo/client.js:1358 msgid "Sub rule group" msgstr "子规则组" -#: htdocs/luci-static/resources/fchomo.js:669 +#: htdocs/luci-static/resources/fchomo.js:673 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:215 msgid "Successfully imported %s %s of total %s." msgstr "已成功导入 %s 个%s (共 %s 个)。" @@ -2635,12 +2651,12 @@ msgstr "已成功导入 %s 个%s (共 %s 个)。" msgid "Successfully updated." msgstr "更新成功。" -#: htdocs/luci-static/resources/fchomo.js:1638 +#: htdocs/luci-static/resources/fchomo.js:1642 msgid "Successfully uploaded." msgstr "已成功上传。" -#: htdocs/luci-static/resources/fchomo.js:140 -#: htdocs/luci-static/resources/fchomo.js:172 +#: htdocs/luci-static/resources/fchomo.js:144 +#: htdocs/luci-static/resources/fchomo.js:176 msgid "Sudoku" msgstr "" @@ -2660,20 +2676,20 @@ msgstr "系统" msgid "System DNS" msgstr "系统 DNS" -#: htdocs/luci-static/resources/fchomo.js:135 -#: htdocs/luci-static/resources/fchomo.js:140 -#: htdocs/luci-static/resources/fchomo.js:141 -#: htdocs/luci-static/resources/fchomo.js:142 -#: htdocs/luci-static/resources/fchomo.js:143 +#: htdocs/luci-static/resources/fchomo.js:139 #: htdocs/luci-static/resources/fchomo.js:144 -#: htdocs/luci-static/resources/fchomo.js:167 -#: htdocs/luci-static/resources/fchomo.js:172 -#: htdocs/luci-static/resources/fchomo.js:173 -#: htdocs/luci-static/resources/fchomo.js:174 -#: htdocs/luci-static/resources/fchomo.js:175 +#: htdocs/luci-static/resources/fchomo.js:145 +#: htdocs/luci-static/resources/fchomo.js:146 +#: htdocs/luci-static/resources/fchomo.js:147 +#: htdocs/luci-static/resources/fchomo.js:148 +#: htdocs/luci-static/resources/fchomo.js:171 #: htdocs/luci-static/resources/fchomo.js:176 #: htdocs/luci-static/resources/fchomo.js:177 -#: htdocs/luci-static/resources/fchomo.js:183 +#: htdocs/luci-static/resources/fchomo.js:178 +#: htdocs/luci-static/resources/fchomo.js:179 +#: htdocs/luci-static/resources/fchomo.js:180 +#: htdocs/luci-static/resources/fchomo.js:181 +#: htdocs/luci-static/resources/fchomo.js:187 #: htdocs/luci-static/resources/view/fchomo/client.js:589 #: htdocs/luci-static/resources/view/fchomo/client.js:679 msgid "TCP" @@ -2695,14 +2711,14 @@ msgstr "TCP-Keep-Alive 闲置超时" msgid "TCP-Keep-Alive interval" msgstr "TCP-Keep-Alive 间隔" -#: htdocs/luci-static/resources/fchomo.js:136 -#: htdocs/luci-static/resources/fchomo.js:137 -#: htdocs/luci-static/resources/fchomo.js:138 -#: htdocs/luci-static/resources/fchomo.js:139 -#: htdocs/luci-static/resources/fchomo.js:166 -#: htdocs/luci-static/resources/fchomo.js:168 -#: htdocs/luci-static/resources/fchomo.js:169 -#: htdocs/luci-static/resources/fchomo.js:171 +#: htdocs/luci-static/resources/fchomo.js:140 +#: htdocs/luci-static/resources/fchomo.js:141 +#: htdocs/luci-static/resources/fchomo.js:142 +#: htdocs/luci-static/resources/fchomo.js:143 +#: htdocs/luci-static/resources/fchomo.js:170 +#: htdocs/luci-static/resources/fchomo.js:172 +#: htdocs/luci-static/resources/fchomo.js:173 +#: htdocs/luci-static/resources/fchomo.js:175 msgid "TCP/UDP" msgstr "" @@ -2733,12 +2749,12 @@ msgstr "" msgid "TLS fields" msgstr "TLS字段" -#: htdocs/luci-static/resources/fchomo.js:145 -#: htdocs/luci-static/resources/fchomo.js:180 +#: htdocs/luci-static/resources/fchomo.js:149 +#: htdocs/luci-static/resources/fchomo.js:184 msgid "TUIC" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:221 +#: htdocs/luci-static/resources/fchomo.js:225 msgid "TURN" msgstr "" @@ -2793,13 +2809,13 @@ msgid "" "The first padding must have a probability of 100% and at least 35 bytes." msgstr "首个填充必须为 100% 的概率并且至少 35 字节。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1746 +#: htdocs/luci-static/resources/view/fchomo/client.js:1804 msgid "The matching %s will be deemed as not-poisoned." msgstr "匹配 %s 的将被视为未被投毒污染。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1755 -#: htdocs/luci-static/resources/view/fchomo/client.js:1759 -#: htdocs/luci-static/resources/view/fchomo/client.js:1764 +#: htdocs/luci-static/resources/view/fchomo/client.js:1813 +#: htdocs/luci-static/resources/view/fchomo/client.js:1817 +#: htdocs/luci-static/resources/view/fchomo/client.js:1822 msgid "The matching %s will be deemed as poisoned." msgstr "匹配 %s 的将被视为已被投毒污染。" @@ -2813,7 +2829,7 @@ msgstr "服务器和客户端可以设置不同的填充参数。" msgid "This ECH parameter needs to be added to the HTTPS record of the domain." msgstr "此 ECH 参数需要添加到域名的 HTTPS 记录中。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1525 +#: htdocs/luci-static/resources/view/fchomo/client.js:1577 #: htdocs/luci-static/resources/view/fchomo/node.js:1017 #: htdocs/luci-static/resources/view/fchomo/node.js:1591 msgid "" @@ -2883,8 +2899,8 @@ msgstr "传输层类型" msgid "Treat the destination IP as the source IP." msgstr "将 目标 IP 视为 来源 IP。" -#: htdocs/luci-static/resources/fchomo.js:143 -#: htdocs/luci-static/resources/fchomo.js:176 +#: htdocs/luci-static/resources/fchomo.js:147 +#: htdocs/luci-static/resources/fchomo.js:180 msgid "Trojan" msgstr "" @@ -2907,8 +2923,8 @@ msgstr "Tun 堆栈" #: htdocs/luci-static/resources/view/fchomo/client.js:530 #: htdocs/luci-static/resources/view/fchomo/client.js:643 #: htdocs/luci-static/resources/view/fchomo/client.js:737 -#: htdocs/luci-static/resources/view/fchomo/client.js:976 -#: htdocs/luci-static/resources/view/fchomo/client.js:1684 +#: htdocs/luci-static/resources/view/fchomo/client.js:842 +#: htdocs/luci-static/resources/view/fchomo/client.js:1028 #: htdocs/luci-static/resources/view/fchomo/node.js:238 #: htdocs/luci-static/resources/view/fchomo/node.js:1433 #: htdocs/luci-static/resources/view/fchomo/node.js:1718 @@ -2917,12 +2933,12 @@ msgstr "Tun 堆栈" msgid "Type" msgstr "类型" -#: htdocs/luci-static/resources/fchomo.js:145 -#: htdocs/luci-static/resources/fchomo.js:146 -#: htdocs/luci-static/resources/fchomo.js:179 -#: htdocs/luci-static/resources/fchomo.js:180 -#: htdocs/luci-static/resources/fchomo.js:181 -#: htdocs/luci-static/resources/fchomo.js:182 +#: htdocs/luci-static/resources/fchomo.js:149 +#: htdocs/luci-static/resources/fchomo.js:150 +#: htdocs/luci-static/resources/fchomo.js:183 +#: htdocs/luci-static/resources/fchomo.js:184 +#: htdocs/luci-static/resources/fchomo.js:185 +#: htdocs/luci-static/resources/fchomo.js:186 #: htdocs/luci-static/resources/view/fchomo/client.js:588 #: htdocs/luci-static/resources/view/fchomo/client.js:678 #: htdocs/luci-static/resources/view/fchomo/node.js:845 @@ -2951,7 +2967,7 @@ msgstr "UDP 包中继模式。" msgid "UDP relay mode" msgstr "UDP 中继模式" -#: htdocs/luci-static/resources/fchomo.js:210 +#: htdocs/luci-static/resources/fchomo.js:214 msgid "URL test" msgstr "自动选择" @@ -2963,7 +2979,7 @@ msgstr "自动选择" msgid "UUID" msgstr "UUID" -#: htdocs/luci-static/resources/fchomo.js:1181 +#: htdocs/luci-static/resources/fchomo.js:1185 msgid "Unable to download unsupported type: %s" msgstr "无法下载不支持的类型: %s" @@ -3034,23 +3050,23 @@ msgstr "上传密钥" msgid "Upload..." msgstr "上传..." -#: htdocs/luci-static/resources/view/fchomo/client.js:1347 +#: htdocs/luci-static/resources/view/fchomo/client.js:1399 msgid "" "Used to resolve domains that can be directly connected. Can use domestic DNS " "servers or ECS." msgstr "用于解析可直连的域名。可以使用国内 DNS 服务器或 ECS。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1349 +#: htdocs/luci-static/resources/view/fchomo/client.js:1401 msgid "" "Used to resolve domains you want to proxy. Recommended to configure %s for " "DNS servers." msgstr "用于解析想要代理的域名。建议为 DNS 服务器配置%s。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1331 +#: htdocs/luci-static/resources/view/fchomo/client.js:1383 msgid "Used to resolve the domain of the DNS server. Must be IP." msgstr "用于解析 DNS 服务器的域名。必须是 IP。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1338 +#: htdocs/luci-static/resources/view/fchomo/client.js:1390 msgid "Used to resolve the domain of the Proxy node." msgstr "用于解析代理节点的域名。" @@ -3079,13 +3095,13 @@ msgstr "" msgid "V2ray HTTPUpgrade fast open" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:142 -#: htdocs/luci-static/resources/fchomo.js:175 +#: htdocs/luci-static/resources/fchomo.js:146 +#: htdocs/luci-static/resources/fchomo.js:179 msgid "VLESS" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:141 -#: htdocs/luci-static/resources/fchomo.js:174 +#: htdocs/luci-static/resources/fchomo.js:145 +#: htdocs/luci-static/resources/fchomo.js:178 msgid "VMess" msgstr "" @@ -3095,7 +3111,7 @@ msgstr "" msgid "Value" msgstr "可视化值" -#: htdocs/luci-static/resources/fchomo.js:339 +#: htdocs/luci-static/resources/fchomo.js:343 msgid "Verify if given" msgstr "" @@ -3114,7 +3130,7 @@ msgstr "" msgid "Vless Encryption fields" msgstr "Vless Encryption 字段" -#: htdocs/luci-static/resources/fchomo.js:376 +#: htdocs/luci-static/resources/fchomo.js:380 msgid "Wait a random 0-111 milliseconds with 75% probability." msgstr "以 75% 的概率等待随机 0-111 毫秒。" @@ -3139,7 +3155,7 @@ msgstr "用作服务端时,HomeProxy 是更好的选择。" msgid "White list" msgstr "白名单" -#: htdocs/luci-static/resources/fchomo.js:182 +#: htdocs/luci-static/resources/fchomo.js:186 msgid "WireGuard" msgstr "" @@ -3171,23 +3187,23 @@ msgstr "Yaml 格式文本" msgid "YouTube" msgstr "油管" -#: htdocs/luci-static/resources/fchomo.js:1620 +#: htdocs/luci-static/resources/fchomo.js:1624 msgid "Your %s was successfully uploaded. Size: %sB." msgstr "您的 %s 已成功上传。大小:%sB。" -#: htdocs/luci-static/resources/fchomo.js:312 -#: htdocs/luci-static/resources/fchomo.js:325 -#: htdocs/luci-static/resources/fchomo.js:330 +#: htdocs/luci-static/resources/fchomo.js:316 +#: htdocs/luci-static/resources/fchomo.js:329 +#: htdocs/luci-static/resources/fchomo.js:334 #: htdocs/luci-static/resources/view/fchomo/node.js:640 msgid "aes-128-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:313 +#: htdocs/luci-static/resources/fchomo.js:317 msgid "aes-192-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:314 -#: htdocs/luci-static/resources/fchomo.js:331 +#: htdocs/luci-static/resources/fchomo.js:318 +#: htdocs/luci-static/resources/fchomo.js:335 msgid "aes-256-gcm" msgstr "" @@ -3205,9 +3221,9 @@ msgstr "bbr" msgid "certificate" msgstr "证书" -#: htdocs/luci-static/resources/fchomo.js:315 -#: htdocs/luci-static/resources/fchomo.js:326 -#: htdocs/luci-static/resources/fchomo.js:332 +#: htdocs/luci-static/resources/fchomo.js:319 +#: htdocs/luci-static/resources/fchomo.js:330 +#: htdocs/luci-static/resources/fchomo.js:336 msgid "chacha20-ietf-poly1305" msgstr "" @@ -3277,17 +3293,18 @@ msgstr "至少需要一对密钥" msgid "metacubexd" msgstr "metacubexd" -#: htdocs/luci-static/resources/view/fchomo/client.js:949 -#: htdocs/luci-static/resources/view/fchomo/client.js:1197 -#: htdocs/luci-static/resources/view/fchomo/client.js:1289 -#: htdocs/luci-static/resources/view/fchomo/client.js:1426 -#: htdocs/luci-static/resources/view/fchomo/client.js:1661 +#: htdocs/luci-static/resources/view/fchomo/client.js:1001 +#: htdocs/luci-static/resources/view/fchomo/client.js:1249 +#: htdocs/luci-static/resources/view/fchomo/client.js:1341 +#: htdocs/luci-static/resources/view/fchomo/client.js:1478 +#: htdocs/luci-static/resources/view/fchomo/client.js:1709 +#: htdocs/luci-static/resources/view/fchomo/client.js:1765 #: htdocs/luci-static/resources/view/fchomo/node.js:1405 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:232 msgid "mihomo config" msgstr "mihomo 配置" -#: htdocs/luci-static/resources/fchomo.js:358 +#: htdocs/luci-static/resources/fchomo.js:362 msgid "mlkem768x25519plus" msgstr "" @@ -3304,16 +3321,16 @@ msgstr "new_reno" msgid "no-resolve" msgstr "no-resolve" -#: htdocs/luci-static/resources/fchomo.js:1355 -#: htdocs/luci-static/resources/fchomo.js:1450 -#: htdocs/luci-static/resources/fchomo.js:1485 -#: htdocs/luci-static/resources/fchomo.js:1513 +#: htdocs/luci-static/resources/fchomo.js:1359 +#: htdocs/luci-static/resources/fchomo.js:1454 +#: htdocs/luci-static/resources/fchomo.js:1489 +#: htdocs/luci-static/resources/fchomo.js:1517 msgid "non-empty value" msgstr "非空值" -#: htdocs/luci-static/resources/fchomo.js:310 -#: htdocs/luci-static/resources/fchomo.js:324 -#: htdocs/luci-static/resources/fchomo.js:336 +#: htdocs/luci-static/resources/fchomo.js:314 +#: htdocs/luci-static/resources/fchomo.js:328 +#: htdocs/luci-static/resources/fchomo.js:340 #: htdocs/luci-static/resources/view/fchomo/node.js:638 #: htdocs/luci-static/resources/view/fchomo/node.js:658 #: htdocs/luci-static/resources/view/fchomo/node.js:793 @@ -3326,11 +3343,11 @@ msgstr "无" msgid "not found" msgstr "未找到" -#: htdocs/luci-static/resources/view/fchomo/client.js:966 +#: htdocs/luci-static/resources/view/fchomo/client.js:1018 msgid "not included \",\"" msgstr "不包含 \",\"" -#: htdocs/luci-static/resources/fchomo.js:196 +#: htdocs/luci-static/resources/fchomo.js:200 msgid "null" msgstr "" @@ -3364,8 +3381,8 @@ msgstr "私钥" msgid "razord-meta" msgstr "razord-meta" -#: htdocs/luci-static/resources/view/fchomo/client.js:1121 -#: htdocs/luci-static/resources/view/fchomo/client.js:1127 +#: htdocs/luci-static/resources/view/fchomo/client.js:1173 +#: htdocs/luci-static/resources/view/fchomo/client.js:1179 msgid "requires front-end adaptation using the API." msgstr "需要使用 API 的前端适配。" @@ -3403,15 +3420,15 @@ msgstr "" msgid "unchecked" msgstr "未检查" -#: htdocs/luci-static/resources/fchomo.js:422 +#: htdocs/luci-static/resources/fchomo.js:426 msgid "unique UCI identifier" msgstr "独立 UCI 标识" -#: htdocs/luci-static/resources/fchomo.js:425 +#: htdocs/luci-static/resources/fchomo.js:429 msgid "unique identifier" msgstr "独立标识" -#: htdocs/luci-static/resources/fchomo.js:1522 +#: htdocs/luci-static/resources/fchomo.js:1526 msgid "unique value" msgstr "独立值" @@ -3440,8 +3457,8 @@ msgstr "" msgid "v3" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1402 -#: htdocs/luci-static/resources/fchomo.js:1405 +#: htdocs/luci-static/resources/fchomo.js:1406 +#: htdocs/luci-static/resources/fchomo.js:1409 msgid "valid JSON format" msgstr "有效的 JSON 格式" @@ -3449,41 +3466,41 @@ msgstr "有效的 JSON 格式" msgid "valid SHA256 string with %d characters" msgstr "包含 %d 个字符的有效 SHA256 字符串" -#: htdocs/luci-static/resources/fchomo.js:1427 -#: htdocs/luci-static/resources/fchomo.js:1430 +#: htdocs/luci-static/resources/fchomo.js:1431 +#: htdocs/luci-static/resources/fchomo.js:1434 msgid "valid URL" msgstr "有效网址" -#: htdocs/luci-static/resources/fchomo.js:1440 +#: htdocs/luci-static/resources/fchomo.js:1444 msgid "valid base64 key with %d characters" msgstr "包含 %d 个字符的有效 base64 密钥" -#: htdocs/luci-static/resources/fchomo.js:1500 -#: htdocs/luci-static/resources/fchomo.js:1506 +#: htdocs/luci-static/resources/fchomo.js:1504 +#: htdocs/luci-static/resources/fchomo.js:1510 msgid "valid format: 2x, 2p, 4v" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1487 +#: htdocs/luci-static/resources/fchomo.js:1491 msgid "valid key length with %d characters" msgstr "包含 %d 个字符的有效密钥" -#: htdocs/luci-static/resources/fchomo.js:1365 +#: htdocs/luci-static/resources/fchomo.js:1369 msgid "valid port value" msgstr "有效端口值" -#: htdocs/luci-static/resources/fchomo.js:1415 +#: htdocs/luci-static/resources/fchomo.js:1419 msgid "valid uuid" msgstr "有效 uuid" -#: htdocs/luci-static/resources/fchomo.js:382 +#: htdocs/luci-static/resources/fchomo.js:386 msgid "vless-mlkem768" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:381 +#: htdocs/luci-static/resources/fchomo.js:385 msgid "vless-x25519" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:316 +#: htdocs/luci-static/resources/fchomo.js:320 msgid "xchacha20-ietf-poly1305" msgstr "" @@ -3503,7 +3520,7 @@ msgstr "" msgid "zero" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1183 +#: htdocs/luci-static/resources/fchomo.js:1187 msgid "🡇" msgstr "" diff --git a/small/luci-app-fchomo/po/zh_Hant/fchomo.po b/small/luci-app-fchomo/po/zh_Hant/fchomo.po index 5782aa8fbc..946e08cba7 100644 --- a/small/luci-app-fchomo/po/zh_Hant/fchomo.po +++ b/small/luci-app-fchomo/po/zh_Hant/fchomo.po @@ -12,17 +12,17 @@ msgstr "" msgid "%s log" msgstr "%s 日誌" -#: htdocs/luci-static/resources/fchomo.js:219 -#: htdocs/luci-static/resources/fchomo.js:220 -#: htdocs/luci-static/resources/fchomo.js:221 -#: htdocs/luci-static/resources/fchomo.js:222 #: htdocs/luci-static/resources/fchomo.js:223 #: htdocs/luci-static/resources/fchomo.js:224 +#: htdocs/luci-static/resources/fchomo.js:225 +#: htdocs/luci-static/resources/fchomo.js:226 +#: htdocs/luci-static/resources/fchomo.js:227 +#: htdocs/luci-static/resources/fchomo.js:228 msgid "%s ports" msgstr "%s 連接埠" -#: htdocs/luci-static/resources/fchomo.js:584 -#: htdocs/luci-static/resources/fchomo.js:587 +#: htdocs/luci-static/resources/fchomo.js:588 +#: htdocs/luci-static/resources/fchomo.js:591 #: htdocs/luci-static/resources/view/fchomo/client.js:315 msgid "(Imported)" msgstr "(已導入)" @@ -39,13 +39,13 @@ msgstr "(已導入)" msgid "(mTLS)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:990 -#: htdocs/luci-static/resources/view/fchomo/client.js:991 -#: htdocs/luci-static/resources/view/fchomo/client.js:1004 -#: htdocs/luci-static/resources/view/fchomo/client.js:1005 -#: htdocs/luci-static/resources/view/fchomo/client.js:1226 -#: htdocs/luci-static/resources/view/fchomo/client.js:1702 -#: htdocs/luci-static/resources/view/fchomo/client.js:1703 +#: htdocs/luci-static/resources/view/fchomo/client.js:860 +#: htdocs/luci-static/resources/view/fchomo/client.js:861 +#: htdocs/luci-static/resources/view/fchomo/client.js:1042 +#: htdocs/luci-static/resources/view/fchomo/client.js:1043 +#: htdocs/luci-static/resources/view/fchomo/client.js:1056 +#: htdocs/luci-static/resources/view/fchomo/client.js:1057 +#: htdocs/luci-static/resources/view/fchomo/client.js:1278 #: htdocs/luci-static/resources/view/fchomo/node.js:1728 #: htdocs/luci-static/resources/view/fchomo/node.js:1734 #: htdocs/luci-static/resources/view/fchomo/node.js:1748 @@ -53,12 +53,12 @@ msgstr "" msgid "-- Please choose --" msgstr "-- 請選擇 --" -#: htdocs/luci-static/resources/fchomo.js:371 +#: htdocs/luci-static/resources/fchomo.js:375 msgid "0-RTT reuse." msgstr "0-RTT 重用。" -#: htdocs/luci-static/resources/fchomo.js:368 #: htdocs/luci-static/resources/fchomo.js:372 +#: htdocs/luci-static/resources/fchomo.js:376 msgid "1-RTT only." msgstr "僅限 1-RTT。" @@ -66,15 +66,15 @@ msgstr "僅限 1-RTT。" msgid "163Music" msgstr "網易雲音樂" -#: htdocs/luci-static/resources/fchomo.js:318 +#: htdocs/luci-static/resources/fchomo.js:322 msgid "2022-blake3-aes-128-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:319 +#: htdocs/luci-static/resources/fchomo.js:323 msgid "2022-blake3-aes-256-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:320 +#: htdocs/luci-static/resources/fchomo.js:324 msgid "2022-blake3-chacha20-poly1305" msgstr "" @@ -143,11 +143,15 @@ msgstr "ASN 版本" msgid "Access Control" msgstr "訪問控制" -#: htdocs/luci-static/resources/view/fchomo/client.js:1635 +#: htdocs/luci-static/resources/view/fchomo/client.js:1687 +msgid "Add a Bootstrap DNS policy (Node)" +msgstr "新增 引導 DNS 策略 (節點)" + +#: htdocs/luci-static/resources/view/fchomo/client.js:1739 msgid "Add a DNS policy" msgstr "新增 DNS 策略" -#: htdocs/luci-static/resources/view/fchomo/client.js:1385 +#: htdocs/luci-static/resources/view/fchomo/client.js:1437 msgid "Add a DNS server" msgstr "新增 DNS 伺服器" @@ -163,11 +167,11 @@ msgstr "新增 供應商" msgid "Add a proxy chain" msgstr "新增 代理鏈" -#: htdocs/luci-static/resources/view/fchomo/client.js:889 +#: htdocs/luci-static/resources/view/fchomo/client.js:941 msgid "Add a proxy group" msgstr "新增 代理組" -#: htdocs/luci-static/resources/view/fchomo/client.js:1141 +#: htdocs/luci-static/resources/view/fchomo/client.js:1193 msgid "Add a routing rule" msgstr "新增 路由規則" @@ -179,7 +183,7 @@ msgstr "新增 規則集" msgid "Add a server" msgstr "新增 伺服器" -#: htdocs/luci-static/resources/view/fchomo/client.js:1260 +#: htdocs/luci-static/resources/view/fchomo/client.js:1312 msgid "Add a sub rule" msgstr "新增 子規則" @@ -191,12 +195,12 @@ msgstr "添加前綴" msgid "Add suffix" msgstr "添加後綴" -#: htdocs/luci-static/resources/view/fchomo/client.js:1443 -#: htdocs/luci-static/resources/view/fchomo/client.js:1448 +#: htdocs/luci-static/resources/view/fchomo/client.js:1495 +#: htdocs/luci-static/resources/view/fchomo/client.js:1500 msgid "Address" msgstr "位址" -#: htdocs/luci-static/resources/fchomo.js:375 +#: htdocs/luci-static/resources/fchomo.js:379 msgid "" "After the 1-RTT client/server hello, padding randomly 111-1111 bytes with " "100% probability." @@ -213,7 +217,7 @@ msgstr "客戶端維護的 NAT 映射 的老化時間。
" msgid "All allowed" msgstr "允許所有" -#: htdocs/luci-static/resources/fchomo.js:216 +#: htdocs/luci-static/resources/fchomo.js:220 msgid "All ports" msgstr "所有連接埠" @@ -241,8 +245,8 @@ msgstr "已在更新中。" msgid "Alter ID" msgstr "額外 ID" -#: htdocs/luci-static/resources/fchomo.js:144 -#: htdocs/luci-static/resources/fchomo.js:177 +#: htdocs/luci-static/resources/fchomo.js:148 +#: htdocs/luci-static/resources/fchomo.js:181 msgid "AnyTLS" msgstr "" @@ -339,11 +343,16 @@ msgstr "黑名單" msgid "Block DNS queries" msgstr "封鎖 DNS 請求" -#: htdocs/luci-static/resources/view/fchomo/client.js:1330 +#: htdocs/luci-static/resources/view/fchomo/client.js:1678 +#: htdocs/luci-static/resources/view/fchomo/client.js:1687 +msgid "Bootstrap DNS policy (Node)" +msgstr "引導 DNS 策略 (節點)" + +#: htdocs/luci-static/resources/view/fchomo/client.js:1382 msgid "Bootstrap DNS server" msgstr "引導 DNS 伺服器" -#: htdocs/luci-static/resources/view/fchomo/client.js:1337 +#: htdocs/luci-static/resources/view/fchomo/client.js:1389 msgid "Bootstrap DNS server (Node)" msgstr "引導 DNS 伺服器 (節點)" @@ -376,7 +385,7 @@ msgstr "CORS 允許私有網路" msgid "CORS allowed origins, * will be used if empty." msgstr "CORS 允許的來源,留空則使用 *。" -#: htdocs/luci-static/resources/fchomo.js:700 +#: htdocs/luci-static/resources/fchomo.js:704 msgid "Cancel" msgstr "取消" @@ -478,12 +487,12 @@ msgstr "客戶端狀態" msgid "Collecting data..." msgstr "收集資料中..." -#: htdocs/luci-static/resources/fchomo.js:217 -#: htdocs/luci-static/resources/fchomo.js:218 +#: htdocs/luci-static/resources/fchomo.js:221 +#: htdocs/luci-static/resources/fchomo.js:222 msgid "Common ports (bypass P2P traffic)" msgstr "常用連接埠(繞過 P2P 流量)" -#: htdocs/luci-static/resources/fchomo.js:1299 +#: htdocs/luci-static/resources/fchomo.js:1303 msgid "Complete" msgstr "完成" @@ -501,7 +510,7 @@ msgstr "擁塞控制器" msgid "Connection check" msgstr "連接檢查" -#: htdocs/luci-static/resources/fchomo.js:569 +#: htdocs/luci-static/resources/fchomo.js:573 msgid "Content copied to clipboard!" msgstr "內容已複製到剪貼簿!" @@ -522,7 +531,7 @@ msgstr "內容" msgid "Contents have been saved." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:571 +#: htdocs/luci-static/resources/fchomo.js:575 msgid "Copy" msgstr "複製" @@ -557,12 +566,12 @@ msgid "" "Custom internal hosts. Support yaml or json format." msgstr "自訂內部 hosts。支援 yamljson 格式。" -#: htdocs/luci-static/resources/fchomo.js:166 +#: htdocs/luci-static/resources/fchomo.js:170 msgid "DIRECT" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1626 -#: htdocs/luci-static/resources/view/fchomo/client.js:1635 +#: htdocs/luci-static/resources/view/fchomo/client.js:1730 +#: htdocs/luci-static/resources/view/fchomo/client.js:1739 msgid "DNS policy" msgstr "DNS 策略" @@ -570,15 +579,15 @@ msgstr "DNS 策略" msgid "DNS port" msgstr " DNS 連接埠" -#: htdocs/luci-static/resources/view/fchomo/client.js:1376 -#: htdocs/luci-static/resources/view/fchomo/client.js:1385 -#: htdocs/luci-static/resources/view/fchomo/client.js:1715 +#: htdocs/luci-static/resources/view/fchomo/client.js:873 +#: htdocs/luci-static/resources/view/fchomo/client.js:1428 +#: htdocs/luci-static/resources/view/fchomo/client.js:1437 #: htdocs/luci-static/resources/view/fchomo/node.js:706 #: htdocs/luci-static/resources/view/fchomo/node.js:786 msgid "DNS server" msgstr "DNS 伺服器" -#: htdocs/luci-static/resources/view/fchomo/client.js:1316 +#: htdocs/luci-static/resources/view/fchomo/client.js:1368 msgid "DNS settings" msgstr "DNS 設定" @@ -598,7 +607,7 @@ msgstr "調試" msgid "Default DNS (issued by WAN)" msgstr "預設 DNS(由 WAN 下發)" -#: htdocs/luci-static/resources/view/fchomo/client.js:1351 +#: htdocs/luci-static/resources/view/fchomo/client.js:1403 msgid "Default DNS server" msgstr "預設 DNS 伺服器" @@ -661,7 +670,7 @@ msgstr "禁用 ICMP 轉發" msgid "Disable SNI" msgstr "停用 SNI" -#: htdocs/luci-static/resources/view/fchomo/client.js:1033 +#: htdocs/luci-static/resources/view/fchomo/client.js:1085 msgid "Disable UDP" msgstr "停用 UDP" @@ -677,11 +686,11 @@ msgstr "" "不要將網域連線解析為 IP 以進行此次匹配。
僅對未經 DNS 解析的純網域入站連" "線有效。例如,socks5h" -#: htdocs/luci-static/resources/view/fchomo/client.js:1685 -#: htdocs/luci-static/resources/view/fchomo/client.js:1690 -#: htdocs/luci-static/resources/view/fchomo/client.js:1755 -#: htdocs/luci-static/resources/view/fchomo/client.js:1762 -#: htdocs/luci-static/resources/view/fchomo/client.js:1764 +#: htdocs/luci-static/resources/view/fchomo/client.js:843 +#: htdocs/luci-static/resources/view/fchomo/client.js:848 +#: htdocs/luci-static/resources/view/fchomo/client.js:1813 +#: htdocs/luci-static/resources/view/fchomo/client.js:1820 +#: htdocs/luci-static/resources/view/fchomo/client.js:1822 msgid "Domain" msgstr "網域" @@ -689,7 +698,7 @@ msgstr "網域" msgid "Donot send server name in ClientHello." msgstr "不要在 ClientHello 中傳送伺服器名稱。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1523 +#: htdocs/luci-static/resources/view/fchomo/client.js:1575 #: htdocs/luci-static/resources/view/fchomo/node.js:1015 #: htdocs/luci-static/resources/view/fchomo/node.js:1589 msgid "Donot verifying server certificate." @@ -703,15 +712,15 @@ msgstr "下載頻寬" msgid "Download bandwidth in Mbps." msgstr "下載頻寬(單位:Mbps)。" -#: htdocs/luci-static/resources/fchomo.js:1178 +#: htdocs/luci-static/resources/fchomo.js:1182 msgid "Download failed: %s" msgstr "下載失敗: %s" -#: htdocs/luci-static/resources/fchomo.js:1176 +#: htdocs/luci-static/resources/fchomo.js:1180 msgid "Download successful." msgstr "下載成功。" -#: htdocs/luci-static/resources/fchomo.js:152 +#: htdocs/luci-static/resources/fchomo.js:156 msgid "Dual stack" msgstr "雙棧" @@ -728,11 +737,11 @@ msgstr "ECH 配置" msgid "ECH key" msgstr "ECH 密鑰" -#: htdocs/luci-static/resources/view/fchomo/client.js:1557 +#: htdocs/luci-static/resources/view/fchomo/client.js:1609 msgid "ECS override" msgstr "強制覆蓋 ECS" -#: htdocs/luci-static/resources/view/fchomo/client.js:1541 +#: htdocs/luci-static/resources/view/fchomo/client.js:1593 msgid "EDNS Client Subnet" msgstr "" @@ -761,16 +770,17 @@ msgstr "編輯規則集" msgid "Editer" msgstr "編輯器" -#: htdocs/luci-static/resources/fchomo.js:362 +#: htdocs/luci-static/resources/fchomo.js:366 msgid "Eliminate encryption header characteristics" msgstr "消除加密頭特徵" -#: htdocs/luci-static/resources/view/fchomo/client.js:879 -#: htdocs/luci-static/resources/view/fchomo/client.js:972 -#: htdocs/luci-static/resources/view/fchomo/client.js:1210 -#: htdocs/luci-static/resources/view/fchomo/client.js:1302 -#: htdocs/luci-static/resources/view/fchomo/client.js:1439 -#: htdocs/luci-static/resources/view/fchomo/client.js:1674 +#: htdocs/luci-static/resources/view/fchomo/client.js:931 +#: htdocs/luci-static/resources/view/fchomo/client.js:1024 +#: htdocs/luci-static/resources/view/fchomo/client.js:1262 +#: htdocs/luci-static/resources/view/fchomo/client.js:1354 +#: htdocs/luci-static/resources/view/fchomo/client.js:1491 +#: htdocs/luci-static/resources/view/fchomo/client.js:1722 +#: htdocs/luci-static/resources/view/fchomo/client.js:1778 #: htdocs/luci-static/resources/view/fchomo/global.js:401 #: htdocs/luci-static/resources/view/fchomo/global.js:680 #: htdocs/luci-static/resources/view/fchomo/node.js:234 @@ -859,7 +869,7 @@ msgid "Endpoint-Independent NAT" msgstr "端點獨立 NAT" #: htdocs/luci-static/resources/view/fchomo/client.js:722 -#: htdocs/luci-static/resources/view/fchomo/client.js:1707 +#: htdocs/luci-static/resources/view/fchomo/client.js:865 msgid "Entry" msgstr "條目" @@ -867,7 +877,7 @@ msgstr "條目" msgid "Error" msgstr "錯誤" -#: htdocs/luci-static/resources/view/fchomo/client.js:1077 +#: htdocs/luci-static/resources/view/fchomo/client.js:1129 msgid "" "Exceeding this triggers a forced health check. 5 will be used " "if empty." @@ -877,7 +887,7 @@ msgstr "超過此限制將會觸發強制健康檢查。留空則使用 5< msgid "Exclude matched node types." msgstr "排除匹配的節點類型。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1114 +#: htdocs/luci-static/resources/view/fchomo/client.js:1166 msgid "" "Exclude matched node types. Available types see here." @@ -885,7 +895,7 @@ msgstr "" "排除匹配的節點類型。可用類型請參考此處。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1109 +#: htdocs/luci-static/resources/view/fchomo/client.js:1161 #: htdocs/luci-static/resources/view/fchomo/node.js:1676 msgid "Exclude nodes that meet keywords or regexps." msgstr "排除匹配關鍵字或表達式的節點。" @@ -894,43 +904,43 @@ msgstr "排除匹配關鍵字或表達式的節點。" msgid "Expand/Collapse result" msgstr "展開/收起 結果" -#: htdocs/luci-static/resources/view/fchomo/client.js:1069 +#: htdocs/luci-static/resources/view/fchomo/client.js:1121 #: htdocs/luci-static/resources/view/fchomo/node.js:1661 msgid "Expected HTTP code. 204 will be used if empty." msgstr "預期的 HTTP code。留空則使用 204。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1071 +#: htdocs/luci-static/resources/view/fchomo/client.js:1123 #: htdocs/luci-static/resources/view/fchomo/node.js:1663 msgid "Expected status" msgstr "預期狀態" -#: htdocs/luci-static/resources/fchomo.js:419 -#: htdocs/luci-static/resources/fchomo.js:422 -#: htdocs/luci-static/resources/fchomo.js:425 -#: htdocs/luci-static/resources/fchomo.js:1316 -#: htdocs/luci-static/resources/fchomo.js:1324 -#: htdocs/luci-static/resources/fchomo.js:1332 -#: htdocs/luci-static/resources/fchomo.js:1355 -#: htdocs/luci-static/resources/fchomo.js:1358 -#: htdocs/luci-static/resources/fchomo.js:1365 -#: htdocs/luci-static/resources/fchomo.js:1381 -#: htdocs/luci-static/resources/fchomo.js:1390 -#: htdocs/luci-static/resources/fchomo.js:1402 -#: htdocs/luci-static/resources/fchomo.js:1405 -#: htdocs/luci-static/resources/fchomo.js:1415 -#: htdocs/luci-static/resources/fchomo.js:1427 -#: htdocs/luci-static/resources/fchomo.js:1430 -#: htdocs/luci-static/resources/fchomo.js:1440 -#: htdocs/luci-static/resources/fchomo.js:1450 -#: htdocs/luci-static/resources/fchomo.js:1485 -#: htdocs/luci-static/resources/fchomo.js:1487 -#: htdocs/luci-static/resources/fchomo.js:1500 -#: htdocs/luci-static/resources/fchomo.js:1506 -#: htdocs/luci-static/resources/fchomo.js:1513 -#: htdocs/luci-static/resources/fchomo.js:1522 +#: htdocs/luci-static/resources/fchomo.js:423 +#: htdocs/luci-static/resources/fchomo.js:426 +#: htdocs/luci-static/resources/fchomo.js:429 +#: htdocs/luci-static/resources/fchomo.js:1320 +#: htdocs/luci-static/resources/fchomo.js:1328 +#: htdocs/luci-static/resources/fchomo.js:1336 +#: htdocs/luci-static/resources/fchomo.js:1359 +#: htdocs/luci-static/resources/fchomo.js:1362 +#: htdocs/luci-static/resources/fchomo.js:1369 +#: htdocs/luci-static/resources/fchomo.js:1385 +#: htdocs/luci-static/resources/fchomo.js:1394 +#: htdocs/luci-static/resources/fchomo.js:1406 +#: htdocs/luci-static/resources/fchomo.js:1409 +#: htdocs/luci-static/resources/fchomo.js:1419 +#: htdocs/luci-static/resources/fchomo.js:1431 +#: htdocs/luci-static/resources/fchomo.js:1434 +#: htdocs/luci-static/resources/fchomo.js:1444 +#: htdocs/luci-static/resources/fchomo.js:1454 +#: htdocs/luci-static/resources/fchomo.js:1489 +#: htdocs/luci-static/resources/fchomo.js:1491 +#: htdocs/luci-static/resources/fchomo.js:1504 +#: htdocs/luci-static/resources/fchomo.js:1510 +#: htdocs/luci-static/resources/fchomo.js:1517 +#: htdocs/luci-static/resources/fchomo.js:1526 #: htdocs/luci-static/resources/view/fchomo/client.js:68 -#: htdocs/luci-static/resources/view/fchomo/client.js:966 -#: htdocs/luci-static/resources/view/fchomo/client.js:1454 +#: htdocs/luci-static/resources/view/fchomo/client.js:1018 +#: htdocs/luci-static/resources/view/fchomo/client.js:1506 #: htdocs/luci-static/resources/view/fchomo/global.js:880 #: htdocs/luci-static/resources/view/fchomo/node.js:388 #: htdocs/luci-static/resources/view/fchomo/node.js:421 @@ -971,58 +981,58 @@ msgstr "實驗性" msgid "Factor" msgstr "條件" -#: htdocs/luci-static/resources/fchomo.js:1257 +#: htdocs/luci-static/resources/fchomo.js:1261 msgid "Failed to execute \"/etc/init.d/fchomo %s %s\" reason: %s" msgstr "無法執行 \"/etc/init.d/fchomo %s %s\" 原因: %s" -#: htdocs/luci-static/resources/fchomo.js:1210 +#: htdocs/luci-static/resources/fchomo.js:1214 msgid "Failed to generate %s, error: %s." msgstr "生成 %s 失敗,錯誤:%s。" -#: htdocs/luci-static/resources/fchomo.js:1622 +#: htdocs/luci-static/resources/fchomo.js:1626 msgid "Failed to upload %s, error: %s." msgstr "上傳 %s 失敗,錯誤:%s。" -#: htdocs/luci-static/resources/fchomo.js:1641 +#: htdocs/luci-static/resources/fchomo.js:1645 msgid "Failed to upload, error: %s." msgstr "上傳失敗,錯誤:%s。" -#: htdocs/luci-static/resources/fchomo.js:209 +#: htdocs/luci-static/resources/fchomo.js:213 msgid "Fallback" msgstr "自動回退" -#: htdocs/luci-static/resources/view/fchomo/client.js:1345 -#: htdocs/luci-static/resources/view/fchomo/client.js:1358 +#: htdocs/luci-static/resources/view/fchomo/client.js:1397 +#: htdocs/luci-static/resources/view/fchomo/client.js:1410 msgid "Fallback DNS server" msgstr "後備 DNS 伺服器" -#: htdocs/luci-static/resources/view/fchomo/client.js:1734 +#: htdocs/luci-static/resources/view/fchomo/client.js:1792 msgid "Fallback filter" msgstr "後備過濾器" -#: htdocs/luci-static/resources/view/fchomo/client.js:1104 +#: htdocs/luci-static/resources/view/fchomo/client.js:1156 #: htdocs/luci-static/resources/view/fchomo/node.js:1670 msgid "Filter nodes that meet keywords or regexps." msgstr "過濾匹配關鍵字或表達式的節點。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1607 +#: htdocs/luci-static/resources/view/fchomo/client.js:1659 msgid "Filter record type:" msgstr "過濾記錄類型:" -#: htdocs/luci-static/resources/view/fchomo/client.js:1575 -#: htdocs/luci-static/resources/view/fchomo/client.js:1591 +#: htdocs/luci-static/resources/view/fchomo/client.js:1627 +#: htdocs/luci-static/resources/view/fchomo/client.js:1643 msgid "Filter record: %s" msgstr "過濾 %s 記錄" -#: htdocs/luci-static/resources/view/fchomo/client.js:1344 +#: htdocs/luci-static/resources/view/fchomo/client.js:1396 msgid "Final DNS server" msgstr "兜底 DNS 伺服器" -#: htdocs/luci-static/resources/view/fchomo/client.js:1346 +#: htdocs/luci-static/resources/view/fchomo/client.js:1398 msgid "Final DNS server (For non-poisoned domains)" msgstr "兜底 DNS 伺服器 (用於未被投毒汙染的網域)" -#: htdocs/luci-static/resources/view/fchomo/client.js:1348 +#: htdocs/luci-static/resources/view/fchomo/client.js:1400 msgid "Final DNS server (For poisoned domains)" msgstr "兜底 DNS 伺服器 (用於已被投毒汙染的網域)" @@ -1035,7 +1045,7 @@ msgstr "" msgid "Flow" msgstr "流控" -#: htdocs/luci-static/resources/view/fchomo/client.js:1093 +#: htdocs/luci-static/resources/view/fchomo/client.js:1145 msgid "" "For details, see %s." @@ -1043,7 +1053,7 @@ msgstr "" "實作細節請參閱 %s." -#: htdocs/luci-static/resources/view/fchomo/client.js:1070 +#: htdocs/luci-static/resources/view/fchomo/client.js:1122 #: htdocs/luci-static/resources/view/fchomo/node.js:1539 #: htdocs/luci-static/resources/view/fchomo/node.js:1662 msgid "" @@ -1085,7 +1095,7 @@ msgstr "GFW 網域清單版本" msgid "General" msgstr "常規" -#: htdocs/luci-static/resources/view/fchomo/client.js:957 +#: htdocs/luci-static/resources/view/fchomo/client.js:1009 #: htdocs/luci-static/resources/view/fchomo/node.js:222 #: htdocs/luci-static/resources/view/fchomo/node.js:1419 #: htdocs/luci-static/resources/view/fchomo/server.js:171 @@ -1096,10 +1106,10 @@ msgstr "常規欄位" msgid "General settings" msgstr "常規設定" -#: htdocs/luci-static/resources/fchomo.js:520 -#: htdocs/luci-static/resources/fchomo.js:522 -#: htdocs/luci-static/resources/fchomo.js:536 -#: htdocs/luci-static/resources/fchomo.js:538 +#: htdocs/luci-static/resources/fchomo.js:524 +#: htdocs/luci-static/resources/fchomo.js:526 +#: htdocs/luci-static/resources/fchomo.js:540 +#: htdocs/luci-static/resources/fchomo.js:542 #: htdocs/luci-static/resources/view/fchomo/global.js:587 #: htdocs/luci-static/resources/view/fchomo/server.js:343 #: htdocs/luci-static/resources/view/fchomo/server.js:384 @@ -1121,17 +1131,17 @@ msgstr "GeoIP 版本" msgid "GeoSite version" msgstr "GeoSite 版本" -#: htdocs/luci-static/resources/view/fchomo/client.js:1744 +#: htdocs/luci-static/resources/view/fchomo/client.js:1802 msgid "Geoip code" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1741 +#: htdocs/luci-static/resources/view/fchomo/client.js:1799 msgid "Geoip enable" msgstr "Geoip 啟用" -#: htdocs/luci-static/resources/view/fchomo/client.js:1686 -#: htdocs/luci-static/resources/view/fchomo/client.js:1695 -#: htdocs/luci-static/resources/view/fchomo/client.js:1753 +#: htdocs/luci-static/resources/view/fchomo/client.js:844 +#: htdocs/luci-static/resources/view/fchomo/client.js:853 +#: htdocs/luci-static/resources/view/fchomo/client.js:1811 msgid "Geosite" msgstr "" @@ -1156,7 +1166,7 @@ msgstr "全域填充" msgid "Google" msgstr "Google" -#: htdocs/luci-static/resources/fchomo.js:222 +#: htdocs/luci-static/resources/fchomo.js:226 msgid "Google FCM" msgstr "" @@ -1164,12 +1174,12 @@ msgstr "" msgid "Grant access to fchomo configuration" msgstr "授予 fchomo 存取 UCI 配置的權限" -#: htdocs/luci-static/resources/view/fchomo/client.js:982 +#: htdocs/luci-static/resources/view/fchomo/client.js:1034 msgid "Group" msgstr "組" -#: htdocs/luci-static/resources/fchomo.js:135 -#: htdocs/luci-static/resources/fchomo.js:167 +#: htdocs/luci-static/resources/fchomo.js:139 +#: htdocs/luci-static/resources/fchomo.js:171 #: htdocs/luci-static/resources/view/fchomo/node.js:804 #: htdocs/luci-static/resources/view/fchomo/node.js:1106 #: htdocs/luci-static/resources/view/fchomo/node.js:1117 @@ -1213,7 +1223,7 @@ msgstr "HTTP 請求方法" msgid "HTTP root path" msgstr "HTTP 根路徑" -#: htdocs/luci-static/resources/view/fchomo/client.js:1506 +#: htdocs/luci-static/resources/view/fchomo/client.js:1558 msgid "HTTP/3" msgstr "" @@ -1245,27 +1255,27 @@ msgstr "握手目標 (支援 TLS 1.3)" msgid "Handshake timeout" msgstr "握手超時" -#: htdocs/luci-static/resources/view/fchomo/client.js:1039 +#: htdocs/luci-static/resources/view/fchomo/client.js:1091 #: htdocs/luci-static/resources/view/fchomo/node.js:1630 msgid "Health check URL" msgstr "健康檢查 URL" -#: htdocs/luci-static/resources/view/fchomo/client.js:1068 +#: htdocs/luci-static/resources/view/fchomo/client.js:1120 #: htdocs/luci-static/resources/view/fchomo/node.js:1660 msgid "Health check expected status" msgstr "健康檢查预期状态" -#: htdocs/luci-static/resources/view/fchomo/client.js:1048 +#: htdocs/luci-static/resources/view/fchomo/client.js:1100 #: htdocs/luci-static/resources/view/fchomo/node.js:1640 msgid "Health check interval" msgstr "健康檢查间隔" -#: htdocs/luci-static/resources/view/fchomo/client.js:1055 +#: htdocs/luci-static/resources/view/fchomo/client.js:1107 #: htdocs/luci-static/resources/view/fchomo/node.js:1647 msgid "Health check timeout" msgstr "健康檢查超时" -#: htdocs/luci-static/resources/view/fchomo/client.js:959 +#: htdocs/luci-static/resources/view/fchomo/client.js:1011 #: htdocs/luci-static/resources/view/fchomo/node.js:1421 msgid "Health fields" msgstr "健康欄位" @@ -1274,7 +1284,7 @@ msgstr "健康欄位" msgid "Heartbeat interval" msgstr "心跳間隔" -#: htdocs/luci-static/resources/view/fchomo/client.js:1119 +#: htdocs/luci-static/resources/view/fchomo/client.js:1171 msgid "Hidden" msgstr "隱藏" @@ -1299,17 +1309,17 @@ msgstr "主機/SNI 覆蓋" msgid "Hosts" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:146 -#: htdocs/luci-static/resources/fchomo.js:179 +#: htdocs/luci-static/resources/fchomo.js:150 +#: htdocs/luci-static/resources/fchomo.js:183 msgid "Hysteria2" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1746 -#: htdocs/luci-static/resources/view/fchomo/client.js:1759 +#: htdocs/luci-static/resources/view/fchomo/client.js:1804 +#: htdocs/luci-static/resources/view/fchomo/client.js:1817 msgid "IP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1757 +#: htdocs/luci-static/resources/view/fchomo/client.js:1815 msgid "IP CIDR" msgstr "" @@ -1322,20 +1332,20 @@ msgstr "IP 覆寫" msgid "IP version" msgstr "IP 版本" -#: htdocs/luci-static/resources/fchomo.js:153 +#: htdocs/luci-static/resources/fchomo.js:157 msgid "IPv4 only" msgstr "僅 IPv4" -#: htdocs/luci-static/resources/fchomo.js:154 +#: htdocs/luci-static/resources/fchomo.js:158 msgid "IPv6 only" msgstr "僅 IPv6" -#: htdocs/luci-static/resources/view/fchomo/client.js:1327 +#: htdocs/luci-static/resources/view/fchomo/client.js:1379 #: htdocs/luci-static/resources/view/fchomo/global.js:415 msgid "IPv6 support" msgstr "IPv6 支援" -#: htdocs/luci-static/resources/view/fchomo/client.js:1125 +#: htdocs/luci-static/resources/view/fchomo/client.js:1177 msgid "Icon" msgstr "圖標" @@ -1351,7 +1361,7 @@ msgstr "閒置會話逾時" msgid "Idle timeout" msgstr "閒置逾時" -#: htdocs/luci-static/resources/fchomo.js:1358 +#: htdocs/luci-static/resources/fchomo.js:1362 msgid "If All ports is selected, uncheck others" msgstr "如果選擇了“所有連接埠”,則取消選取“其他”" @@ -1363,20 +1373,22 @@ msgstr "如果選擇了“封鎖”,則取消選取“其他”" msgid "Ignore client bandwidth" msgstr "忽略客戶端頻寬" -#: htdocs/luci-static/resources/fchomo.js:705 +#: htdocs/luci-static/resources/fchomo.js:709 msgid "Import" msgstr "導入" -#: htdocs/luci-static/resources/view/fchomo/client.js:896 -#: htdocs/luci-static/resources/view/fchomo/client.js:951 -#: htdocs/luci-static/resources/view/fchomo/client.js:1148 -#: htdocs/luci-static/resources/view/fchomo/client.js:1199 -#: htdocs/luci-static/resources/view/fchomo/client.js:1267 -#: htdocs/luci-static/resources/view/fchomo/client.js:1291 -#: htdocs/luci-static/resources/view/fchomo/client.js:1392 -#: htdocs/luci-static/resources/view/fchomo/client.js:1428 -#: htdocs/luci-static/resources/view/fchomo/client.js:1642 -#: htdocs/luci-static/resources/view/fchomo/client.js:1663 +#: htdocs/luci-static/resources/view/fchomo/client.js:948 +#: htdocs/luci-static/resources/view/fchomo/client.js:1003 +#: htdocs/luci-static/resources/view/fchomo/client.js:1200 +#: htdocs/luci-static/resources/view/fchomo/client.js:1251 +#: htdocs/luci-static/resources/view/fchomo/client.js:1319 +#: htdocs/luci-static/resources/view/fchomo/client.js:1343 +#: htdocs/luci-static/resources/view/fchomo/client.js:1444 +#: htdocs/luci-static/resources/view/fchomo/client.js:1480 +#: htdocs/luci-static/resources/view/fchomo/client.js:1694 +#: htdocs/luci-static/resources/view/fchomo/client.js:1711 +#: htdocs/luci-static/resources/view/fchomo/client.js:1746 +#: htdocs/luci-static/resources/view/fchomo/client.js:1767 #: htdocs/luci-static/resources/view/fchomo/node.js:1326 #: htdocs/luci-static/resources/view/fchomo/node.js:1407 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:143 @@ -1409,8 +1421,8 @@ msgstr "單位為位元組。留空則使用 %s。" msgid "In millisecond." msgstr "單位為毫秒。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1056 -#: htdocs/luci-static/resources/view/fchomo/client.js:1085 +#: htdocs/luci-static/resources/view/fchomo/client.js:1108 +#: htdocs/luci-static/resources/view/fchomo/client.js:1137 #: htdocs/luci-static/resources/view/fchomo/node.js:1648 msgid "In millisecond. %s will be used if empty." msgstr "單位為毫秒。留空則使用 %s。" @@ -1423,7 +1435,7 @@ msgstr "單位為毫秒。留空則使用 %s。" msgid "In seconds." msgstr "單位為秒。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1049 +#: htdocs/luci-static/resources/view/fchomo/client.js:1101 #: htdocs/luci-static/resources/view/fchomo/global.js:425 #: htdocs/luci-static/resources/view/fchomo/global.js:430 #: htdocs/luci-static/resources/view/fchomo/global.js:515 @@ -1446,27 +1458,27 @@ msgstr "" msgid "Inbound" msgstr "入站" -#: htdocs/luci-static/resources/view/fchomo/client.js:1017 +#: htdocs/luci-static/resources/view/fchomo/client.js:1069 msgid "Include all" msgstr "引入所有" -#: htdocs/luci-static/resources/view/fchomo/client.js:1022 +#: htdocs/luci-static/resources/view/fchomo/client.js:1074 msgid "Include all node" msgstr "引入所有節點" -#: htdocs/luci-static/resources/view/fchomo/client.js:1027 +#: htdocs/luci-static/resources/view/fchomo/client.js:1079 msgid "Include all provider" msgstr "引入所有供應商" -#: htdocs/luci-static/resources/view/fchomo/client.js:1028 +#: htdocs/luci-static/resources/view/fchomo/client.js:1080 msgid "Includes all Provider." msgstr "引入所有供應商。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1018 +#: htdocs/luci-static/resources/view/fchomo/client.js:1070 msgid "Includes all Proxy Node and Provider." msgstr "引入所有代理節點及供應商。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1023 +#: htdocs/luci-static/resources/view/fchomo/client.js:1075 msgid "Includes all Proxy Node." msgstr "引入所有代理節點。" @@ -1484,8 +1496,8 @@ msgid "Interface Control" msgstr "介面控制" #: htdocs/luci-static/resources/fchomo.js:49 -#: htdocs/luci-static/resources/fchomo.js:151 -#: htdocs/luci-static/resources/fchomo.js:344 +#: htdocs/luci-static/resources/fchomo.js:155 +#: htdocs/luci-static/resources/fchomo.js:348 msgid "Keep default" msgstr "保持預設" @@ -1503,11 +1515,12 @@ msgstr "憑證路徑" msgid "Keypairs" msgstr "密鑰對" -#: htdocs/luci-static/resources/view/fchomo/client.js:962 -#: htdocs/luci-static/resources/view/fchomo/client.js:1205 -#: htdocs/luci-static/resources/view/fchomo/client.js:1297 -#: htdocs/luci-static/resources/view/fchomo/client.js:1434 -#: htdocs/luci-static/resources/view/fchomo/client.js:1669 +#: htdocs/luci-static/resources/view/fchomo/client.js:1014 +#: htdocs/luci-static/resources/view/fchomo/client.js:1257 +#: htdocs/luci-static/resources/view/fchomo/client.js:1349 +#: htdocs/luci-static/resources/view/fchomo/client.js:1486 +#: htdocs/luci-static/resources/view/fchomo/client.js:1717 +#: htdocs/luci-static/resources/view/fchomo/client.js:1773 #: htdocs/luci-static/resources/view/fchomo/node.js:229 #: htdocs/luci-static/resources/view/fchomo/node.js:1424 #: htdocs/luci-static/resources/view/fchomo/node.js:1709 @@ -1516,7 +1529,7 @@ msgstr "密鑰對" msgid "Label" msgstr "標籤" -#: htdocs/luci-static/resources/view/fchomo/client.js:1062 +#: htdocs/luci-static/resources/view/fchomo/client.js:1114 #: htdocs/luci-static/resources/view/fchomo/node.js:1654 msgid "Lazy" msgstr "懶惰狀態" @@ -1555,7 +1568,7 @@ msgstr "監聽欄位" msgid "Listen interfaces" msgstr "監聽介面" -#: htdocs/luci-static/resources/view/fchomo/client.js:1322 +#: htdocs/luci-static/resources/view/fchomo/client.js:1374 #: htdocs/luci-static/resources/view/fchomo/server.js:204 msgid "Listen port" msgstr "監聽埠" @@ -1564,7 +1577,7 @@ msgstr "監聽埠" msgid "Listen ports" msgstr "監聽埠" -#: htdocs/luci-static/resources/fchomo.js:211 +#: htdocs/luci-static/resources/fchomo.js:215 msgid "Load balance" msgstr "負載均衡" @@ -1599,7 +1612,7 @@ msgstr "日誌為空。" msgid "Log level" msgstr "日誌等級" -#: htdocs/luci-static/resources/fchomo.js:419 +#: htdocs/luci-static/resources/fchomo.js:423 msgid "Lowercase only" msgstr "僅限小寫" @@ -1609,7 +1622,7 @@ msgstr "僅限小寫" msgid "MTU" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:181 +#: htdocs/luci-static/resources/fchomo.js:185 msgid "Masque" msgstr "" @@ -1617,31 +1630,31 @@ msgstr "" msgid "Masquerade" msgstr "偽裝" -#: htdocs/luci-static/resources/view/fchomo/client.js:1691 +#: htdocs/luci-static/resources/view/fchomo/client.js:849 msgid "Match domain. Support wildcards." msgstr "匹配網域。支援通配符。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1763 +#: htdocs/luci-static/resources/view/fchomo/client.js:1821 msgid "Match domain. Support wildcards.
" msgstr "匹配網域。支援通配符。
" -#: htdocs/luci-static/resources/view/fchomo/client.js:1696 +#: htdocs/luci-static/resources/view/fchomo/client.js:854 msgid "Match geosite." msgstr "匹配 geosite。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1754 +#: htdocs/luci-static/resources/view/fchomo/client.js:1812 msgid "Match geosite.
" msgstr "匹配 geosite。
" -#: htdocs/luci-static/resources/view/fchomo/client.js:1745 +#: htdocs/luci-static/resources/view/fchomo/client.js:1803 msgid "Match response with geoip.
" msgstr "匹配回應通過 geoip。
" -#: htdocs/luci-static/resources/view/fchomo/client.js:1758 +#: htdocs/luci-static/resources/view/fchomo/client.js:1816 msgid "Match response with ipcidr.
" msgstr "匹配回應通過 ipcidr
" -#: htdocs/luci-static/resources/view/fchomo/client.js:1701 +#: htdocs/luci-static/resources/view/fchomo/client.js:859 msgid "Match rule set." msgstr "匹配規則集。" @@ -1654,7 +1667,7 @@ msgstr "前置數據最大值" msgid "Max UDP relay packet size" msgstr "UDP 中繼數據包最大尺寸" -#: htdocs/luci-static/resources/view/fchomo/client.js:1076 +#: htdocs/luci-static/resources/view/fchomo/client.js:1128 msgid "Max count of failures" msgstr "最大失敗次數" @@ -1692,19 +1705,21 @@ msgstr "最大填充率" #: htdocs/luci-static/resources/view/fchomo/node.js:421 #: htdocs/luci-static/resources/view/fchomo/server.js:409 -msgid "Maximum padding rate must be greater than or equal to the minimum padding rate." +msgid "" +"Maximum padding rate must be greater than or equal to the minimum padding " +"rate." msgstr "最大填充率必須大於等于最小填充率。" #: htdocs/luci-static/resources/view/fchomo/node.js:1230 msgid "Maximum streams" msgstr "最大流數量" -#: htdocs/luci-static/resources/fchomo.js:139 -#: htdocs/luci-static/resources/fchomo.js:171 +#: htdocs/luci-static/resources/fchomo.js:143 +#: htdocs/luci-static/resources/fchomo.js:175 msgid "Mieru" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:851 +#: htdocs/luci-static/resources/view/fchomo/client.js:903 #: htdocs/luci-static/resources/view/fchomo/log.js:149 #: htdocs/luci-static/resources/view/fchomo/log.js:154 msgid "Mihomo client" @@ -1735,7 +1750,7 @@ msgstr "最小填充率" msgid "Minimum streams" msgstr "最小流數量" -#: htdocs/luci-static/resources/fchomo.js:137 +#: htdocs/luci-static/resources/fchomo.js:141 #: htdocs/luci-static/resources/view/fchomo/global.js:497 msgid "Mixed" msgstr "混合" @@ -1778,7 +1793,7 @@ msgstr "用於下載規則集訂閱的代理組名稱。" msgid "Native UDP" msgstr "原生 UDP" -#: htdocs/luci-static/resources/fchomo.js:361 +#: htdocs/luci-static/resources/fchomo.js:365 msgid "Native appearance" msgstr "原生外觀" @@ -1786,16 +1801,16 @@ msgstr "原生外觀" msgid "No Authentication IP ranges" msgstr "無需認證的 IP 範圍" -#: htdocs/luci-static/resources/view/fchomo/client.js:1454 +#: htdocs/luci-static/resources/view/fchomo/client.js:1506 msgid "No add'l params" msgstr "無附加參數" -#: htdocs/luci-static/resources/view/fchomo/client.js:1063 +#: htdocs/luci-static/resources/view/fchomo/client.js:1115 #: htdocs/luci-static/resources/view/fchomo/node.js:1655 msgid "No testing is performed when this provider node is not in use." msgstr "當此供應商的節點未使用時,不執行任何測試。" -#: htdocs/luci-static/resources/fchomo.js:666 +#: htdocs/luci-static/resources/fchomo.js:670 msgid "No valid %s found." msgstr "未找到有效的%s。" @@ -1803,32 +1818,32 @@ msgstr "未找到有效的%s。" msgid "No valid rule-set link found." msgstr "未找到有效的規則集連結。" -#: htdocs/luci-static/resources/view/fchomo/client.js:989 +#: htdocs/luci-static/resources/view/fchomo/client.js:1041 #: htdocs/luci-static/resources/view/fchomo/node.js:217 #: root/usr/share/luci/menu.d/luci-app-fchomo.json:38 msgid "Node" msgstr "節點" -#: htdocs/luci-static/resources/view/fchomo/client.js:1108 +#: htdocs/luci-static/resources/view/fchomo/client.js:1160 #: htdocs/luci-static/resources/view/fchomo/node.js:1675 msgid "Node exclude filter" msgstr "排除節點" -#: htdocs/luci-static/resources/view/fchomo/client.js:1113 +#: htdocs/luci-static/resources/view/fchomo/client.js:1165 #: htdocs/luci-static/resources/view/fchomo/node.js:1682 msgid "Node exclude type" msgstr "排除節點類型" -#: htdocs/luci-static/resources/view/fchomo/client.js:1103 +#: htdocs/luci-static/resources/view/fchomo/client.js:1155 #: htdocs/luci-static/resources/view/fchomo/node.js:1669 msgid "Node filter" msgstr "過濾節點" -#: htdocs/luci-static/resources/view/fchomo/client.js:1084 +#: htdocs/luci-static/resources/view/fchomo/client.js:1136 msgid "Node switch tolerance" msgstr "節點切換容差" -#: htdocs/luci-static/resources/fchomo.js:388 +#: htdocs/luci-static/resources/fchomo.js:392 msgid "None" msgstr "無" @@ -1836,7 +1851,7 @@ msgstr "無" msgid "Not Installed" msgstr "未安裝" -#: htdocs/luci-static/resources/fchomo.js:1136 +#: htdocs/luci-static/resources/fchomo.js:1140 msgid "Not Running" msgstr "未在運作" @@ -1882,7 +1897,7 @@ msgstr "0-63 範圍內的一個或多個數字,以逗號分隔" msgid "Only process traffic from specific interfaces. Leave empty for all." msgstr "只處理來自指定介面的流量。留空表示全部。" -#: htdocs/luci-static/resources/fchomo.js:1130 +#: htdocs/luci-static/resources/fchomo.js:1134 msgid "Open Dashboard" msgstr "打開面板" @@ -1895,7 +1910,7 @@ msgstr "運作模式" msgid "Override destination" msgstr "覆蓋目標位址" -#: htdocs/luci-static/resources/view/fchomo/client.js:958 +#: htdocs/luci-static/resources/view/fchomo/client.js:1010 #: htdocs/luci-static/resources/view/fchomo/node.js:1420 msgid "Override fields" msgstr "覆蓋欄位" @@ -1904,7 +1919,7 @@ msgstr "覆蓋欄位" msgid "Override the IP address of the server that DNS response." msgstr "覆蓋 DNS 回應的伺服器的 IP 位址。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1724 +#: htdocs/luci-static/resources/view/fchomo/client.js:882 msgid "Override the Proxy group of DNS server." msgstr "覆蓋 DNS 伺服器所使用的代理組。" @@ -1912,7 +1927,7 @@ msgstr "覆蓋 DNS 伺服器所使用的代理組。" msgid "Override the connection destination address with the sniffed domain." msgstr "使用嗅探到的網域覆寫連線目標。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1558 +#: htdocs/luci-static/resources/view/fchomo/client.js:1610 msgid "Override the existing ECS in original request." msgstr "覆蓋原始請求中已有的 ECS。" @@ -2007,11 +2022,12 @@ msgid "" msgstr "" "請輸入 %s。" -#: htdocs/luci-static/resources/view/fchomo/client.js:897 -#: htdocs/luci-static/resources/view/fchomo/client.js:1149 -#: htdocs/luci-static/resources/view/fchomo/client.js:1268 -#: htdocs/luci-static/resources/view/fchomo/client.js:1393 -#: htdocs/luci-static/resources/view/fchomo/client.js:1643 +#: htdocs/luci-static/resources/view/fchomo/client.js:949 +#: htdocs/luci-static/resources/view/fchomo/client.js:1201 +#: htdocs/luci-static/resources/view/fchomo/client.js:1320 +#: htdocs/luci-static/resources/view/fchomo/client.js:1445 +#: htdocs/luci-static/resources/view/fchomo/client.js:1695 +#: htdocs/luci-static/resources/view/fchomo/client.js:1747 #: htdocs/luci-static/resources/view/fchomo/node.js:1327 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:144 msgid "Please type %s fields of mihomo config.
" @@ -2038,7 +2054,7 @@ msgstr "插件:" msgid "Port" msgstr "連接埠" -#: htdocs/luci-static/resources/fchomo.js:1367 +#: htdocs/luci-static/resources/fchomo.js:1371 msgid "Port %s alrealy exists!" msgstr "連接埠 %s 已存在!" @@ -2060,11 +2076,11 @@ msgstr "連接埠池" msgid "Pre-shared key" msgstr "預先共用金鑰" -#: htdocs/luci-static/resources/fchomo.js:155 +#: htdocs/luci-static/resources/fchomo.js:159 msgid "Prefer IPv4" msgstr "優先 IPv4" -#: htdocs/luci-static/resources/fchomo.js:156 +#: htdocs/luci-static/resources/fchomo.js:160 msgid "Prefer IPv6" msgstr "優先 IPv6" @@ -2114,7 +2130,7 @@ msgid "" "default in v2ray and cannot be disabled)." msgstr "協議參數。 如啟用會隨機浪費流量(在 v2ray 中預設為啟用且無法停用)。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1003 +#: htdocs/luci-static/resources/view/fchomo/client.js:1055 #: htdocs/luci-static/resources/view/fchomo/node.js:1310 #: htdocs/luci-static/resources/view/fchomo/node.js:1319 #: htdocs/luci-static/resources/view/fchomo/node.js:1720 @@ -2125,9 +2141,9 @@ msgstr "供應商" msgid "Provider URL" msgstr "供應商訂閱 URL" -#: htdocs/luci-static/resources/view/fchomo/client.js:871 -#: htdocs/luci-static/resources/view/fchomo/client.js:889 -#: htdocs/luci-static/resources/view/fchomo/client.js:1349 +#: htdocs/luci-static/resources/view/fchomo/client.js:923 +#: htdocs/luci-static/resources/view/fchomo/client.js:941 +#: htdocs/luci-static/resources/view/fchomo/client.js:1401 msgid "Proxy Group" msgstr "代理組" @@ -2154,13 +2170,13 @@ msgid "Proxy chain" msgstr "代理鏈" #: htdocs/luci-static/resources/view/fchomo/client.js:783 -#: htdocs/luci-static/resources/view/fchomo/client.js:1489 +#: htdocs/luci-static/resources/view/fchomo/client.js:1541 #: htdocs/luci-static/resources/view/fchomo/node.js:1508 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:381 msgid "Proxy group" msgstr "代理組" -#: htdocs/luci-static/resources/view/fchomo/client.js:1723 +#: htdocs/luci-static/resources/view/fchomo/client.js:881 msgid "Proxy group override" msgstr "代理組覆蓋" @@ -2181,7 +2197,7 @@ msgstr "" msgid "QUIC congestion controller." msgstr "QUIC 壅塞控制器。" -#: htdocs/luci-static/resources/view/fchomo/client.js:874 +#: htdocs/luci-static/resources/view/fchomo/client.js:926 #: htdocs/luci-static/resources/view/fchomo/server.js:152 msgid "Quick Reload" msgstr "快速重載" @@ -2223,7 +2239,7 @@ msgstr "REALITY 標識符" msgid "RTT" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:353 +#: htdocs/luci-static/resources/fchomo.js:357 msgid "Random" msgstr "隨機" @@ -2231,7 +2247,7 @@ msgstr "隨機" msgid "Random will be used if empty." msgstr "留空將使用隨機令牌。" -#: htdocs/luci-static/resources/fchomo.js:363 +#: htdocs/luci-static/resources/fchomo.js:367 msgid "Randomized traffic characteristics" msgstr "隨機化流量特徵" @@ -2255,8 +2271,8 @@ msgstr "Redirect TCP + Tun UDP" msgid "Refresh every %s seconds." msgstr "每 %s 秒刷新。" -#: htdocs/luci-static/resources/fchomo.js:1123 -#: htdocs/luci-static/resources/view/fchomo/client.js:875 +#: htdocs/luci-static/resources/fchomo.js:1127 +#: htdocs/luci-static/resources/view/fchomo/client.js:927 #: htdocs/luci-static/resources/view/fchomo/global.js:193 #: htdocs/luci-static/resources/view/fchomo/server.js:153 msgid "Reload" @@ -2276,11 +2292,11 @@ msgstr "遠端" msgid "Remote DNS resolve" msgstr "遠端 DNS 解析" -#: htdocs/luci-static/resources/fchomo.js:1288 +#: htdocs/luci-static/resources/fchomo.js:1292 msgid "Remove" msgstr "移除" -#: htdocs/luci-static/resources/fchomo.js:1293 +#: htdocs/luci-static/resources/fchomo.js:1297 #: htdocs/luci-static/resources/view/fchomo/node.js:1411 #: htdocs/luci-static/resources/view/fchomo/node.js:1413 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:244 @@ -2296,7 +2312,7 @@ msgstr "名稱替換" msgid "Replace node name." msgstr "替換節點名稱" -#: htdocs/luci-static/resources/fchomo.js:337 +#: htdocs/luci-static/resources/fchomo.js:341 msgid "Request" msgstr "" @@ -2310,15 +2326,15 @@ msgstr "請求路徑" msgid "Request timeout" msgstr "請求逾時" -#: htdocs/luci-static/resources/fchomo.js:340 +#: htdocs/luci-static/resources/fchomo.js:344 msgid "Require and verify" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:338 +#: htdocs/luci-static/resources/fchomo.js:342 msgid "Require any" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:371 +#: htdocs/luci-static/resources/fchomo.js:375 #: htdocs/luci-static/resources/view/fchomo/node.js:1093 msgid "Requires server support." msgstr "需要伺服器支援。" @@ -2335,12 +2351,12 @@ msgstr "資源管理" msgid "Restls script" msgstr "Restls 劇本" -#: htdocs/luci-static/resources/view/fchomo/client.js:1120 +#: htdocs/luci-static/resources/view/fchomo/client.js:1172 msgid "" "Returns hidden status in the API to hide the display of this proxy group." msgstr "在 API 傳回 hidden 狀態,以隱藏該代理組顯示。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1126 +#: htdocs/luci-static/resources/view/fchomo/client.js:1178 msgid "" "Returns the string input for icon in the API to display in this proxy group." msgstr "在 API 傳回 icon 所輸入的字串,以在該代理組顯示。" @@ -2393,8 +2409,8 @@ msgstr "路由模式將處理網域。" msgid "Routing ports" msgstr "路由連接埠" -#: htdocs/luci-static/resources/view/fchomo/client.js:1132 -#: htdocs/luci-static/resources/view/fchomo/client.js:1141 +#: htdocs/luci-static/resources/view/fchomo/client.js:1184 +#: htdocs/luci-static/resources/view/fchomo/client.js:1193 msgid "Routing rule" msgstr "路由規則" @@ -2410,8 +2426,8 @@ msgstr "路由表 ID" msgid "Rule" msgstr "規則" -#: htdocs/luci-static/resources/view/fchomo/client.js:1687 -#: htdocs/luci-static/resources/view/fchomo/client.js:1700 +#: htdocs/luci-static/resources/view/fchomo/client.js:845 +#: htdocs/luci-static/resources/view/fchomo/client.js:858 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:136 msgid "Rule set" msgstr "規則集" @@ -2428,31 +2444,31 @@ msgstr "規則集" msgid "Ruleset-URI-Scheme" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1136 +#: htdocs/luci-static/resources/fchomo.js:1140 msgid "Running" msgstr "正在運作" -#: htdocs/luci-static/resources/fchomo.js:219 +#: htdocs/luci-static/resources/fchomo.js:223 msgid "SMTP" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:136 +#: htdocs/luci-static/resources/fchomo.js:140 msgid "SOCKS" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:168 +#: htdocs/luci-static/resources/fchomo.js:172 msgid "SOCKS5" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:183 +#: htdocs/luci-static/resources/fchomo.js:187 msgid "SSH" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:220 +#: htdocs/luci-static/resources/fchomo.js:224 msgid "STUN" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1224 +#: htdocs/luci-static/resources/view/fchomo/client.js:1276 msgid "SUB-RULE" msgstr "SUB-RULE" @@ -2465,11 +2481,11 @@ msgstr "SUoT 版本" msgid "Salamander" msgstr "Salamander" -#: htdocs/luci-static/resources/fchomo.js:161 +#: htdocs/luci-static/resources/fchomo.js:165 msgid "Same dstaddr requests. Same node" msgstr "相同 目標位址 請求。相同節點" -#: htdocs/luci-static/resources/fchomo.js:162 +#: htdocs/luci-static/resources/fchomo.js:166 msgid "Same srcaddr and dstaddr requests. Same node" msgstr "相同 來源位址 和 目標位址 請求。相同節點" @@ -2477,7 +2493,7 @@ msgstr "相同 來源位址 和 目標位址 請求。相同節點" msgid "Segment maximum size" msgstr "分段最大尺寸" -#: htdocs/luci-static/resources/fchomo.js:208 +#: htdocs/luci-static/resources/fchomo.js:212 msgid "Select" msgstr "手動選擇" @@ -2485,12 +2501,12 @@ msgstr "手動選擇" msgid "Select Dashboard" msgstr "選擇面板" -#: htdocs/luci-static/resources/fchomo.js:377 +#: htdocs/luci-static/resources/fchomo.js:381 msgid "Send padding randomly 0-3333 bytes with 50% probability." msgstr "以 50% 的機率發送隨機 0 到 3333 位元組的填充。" -#: htdocs/luci-static/resources/fchomo.js:366 -#: htdocs/luci-static/resources/fchomo.js:367 +#: htdocs/luci-static/resources/fchomo.js:370 +#: htdocs/luci-static/resources/fchomo.js:371 msgid "Send random ticket of 300s-600s duration for client 0-RTT reuse." msgstr "發送 300-600 秒的隨機票證,以供客戶端 0-RTT 重用。" @@ -2518,8 +2534,8 @@ msgstr "服務端狀態" msgid "Service status" msgstr "服務狀態" -#: htdocs/luci-static/resources/fchomo.js:138 -#: htdocs/luci-static/resources/fchomo.js:169 +#: htdocs/luci-static/resources/fchomo.js:142 +#: htdocs/luci-static/resources/fchomo.js:173 msgid "Shadowsocks" msgstr "" @@ -2546,7 +2562,7 @@ msgstr "在面板中顯示連線以便於打斷連線。" msgid "Silent" msgstr "靜音" -#: htdocs/luci-static/resources/fchomo.js:160 +#: htdocs/luci-static/resources/fchomo.js:164 msgid "Simple round-robin all nodes" msgstr "簡單輪替所有節點" @@ -2555,7 +2571,7 @@ msgstr "簡單輪替所有節點" msgid "Size limit" msgstr "大小限制" -#: htdocs/luci-static/resources/view/fchomo/client.js:1522 +#: htdocs/luci-static/resources/view/fchomo/client.js:1574 #: htdocs/luci-static/resources/view/fchomo/node.js:1014 #: htdocs/luci-static/resources/view/fchomo/node.js:1588 msgid "Skip cert verify" @@ -2573,7 +2589,7 @@ msgstr "跳過嗅探目標位址" msgid "Skiped sniffing src address" msgstr "跳過嗅探來源位址" -#: htdocs/luci-static/resources/fchomo.js:173 +#: htdocs/luci-static/resources/fchomo.js:177 msgid "Snell" msgstr "" @@ -2589,7 +2605,7 @@ msgstr "嗅探器" msgid "Sniffer settings" msgstr "嗅探器設定" -#: htdocs/luci-static/resources/fchomo.js:409 +#: htdocs/luci-static/resources/fchomo.js:413 msgid "Specify a ID" msgstr "指定一個ID" @@ -2604,29 +2620,29 @@ msgstr "指定需要被代理的目標連接埠。多個連接埠必須以逗號 msgid "Stack" msgstr "堆栈" -#: htdocs/luci-static/resources/fchomo.js:223 +#: htdocs/luci-static/resources/fchomo.js:227 msgid "Steam Client" msgstr "Steam 客戶端" -#: htdocs/luci-static/resources/fchomo.js:224 +#: htdocs/luci-static/resources/fchomo.js:228 msgid "Steam P2P" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1092 -#: htdocs/luci-static/resources/view/fchomo/client.js:1094 +#: htdocs/luci-static/resources/view/fchomo/client.js:1144 +#: htdocs/luci-static/resources/view/fchomo/client.js:1146 msgid "Strategy" msgstr "策略" -#: htdocs/luci-static/resources/view/fchomo/client.js:1251 -#: htdocs/luci-static/resources/view/fchomo/client.js:1260 +#: htdocs/luci-static/resources/view/fchomo/client.js:1303 +#: htdocs/luci-static/resources/view/fchomo/client.js:1312 msgid "Sub rule" msgstr "子規則" -#: htdocs/luci-static/resources/view/fchomo/client.js:1306 +#: htdocs/luci-static/resources/view/fchomo/client.js:1358 msgid "Sub rule group" msgstr "子規則組" -#: htdocs/luci-static/resources/fchomo.js:669 +#: htdocs/luci-static/resources/fchomo.js:673 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:215 msgid "Successfully imported %s %s of total %s." msgstr "已成功匯入 %s 個%s (共 %s 個)。" @@ -2635,12 +2651,12 @@ msgstr "已成功匯入 %s 個%s (共 %s 個)。" msgid "Successfully updated." msgstr "更新成功。" -#: htdocs/luci-static/resources/fchomo.js:1638 +#: htdocs/luci-static/resources/fchomo.js:1642 msgid "Successfully uploaded." msgstr "已成功上傳。" -#: htdocs/luci-static/resources/fchomo.js:140 -#: htdocs/luci-static/resources/fchomo.js:172 +#: htdocs/luci-static/resources/fchomo.js:144 +#: htdocs/luci-static/resources/fchomo.js:176 msgid "Sudoku" msgstr "" @@ -2660,20 +2676,20 @@ msgstr "系統" msgid "System DNS" msgstr "系統 DNS" -#: htdocs/luci-static/resources/fchomo.js:135 -#: htdocs/luci-static/resources/fchomo.js:140 -#: htdocs/luci-static/resources/fchomo.js:141 -#: htdocs/luci-static/resources/fchomo.js:142 -#: htdocs/luci-static/resources/fchomo.js:143 +#: htdocs/luci-static/resources/fchomo.js:139 #: htdocs/luci-static/resources/fchomo.js:144 -#: htdocs/luci-static/resources/fchomo.js:167 -#: htdocs/luci-static/resources/fchomo.js:172 -#: htdocs/luci-static/resources/fchomo.js:173 -#: htdocs/luci-static/resources/fchomo.js:174 -#: htdocs/luci-static/resources/fchomo.js:175 +#: htdocs/luci-static/resources/fchomo.js:145 +#: htdocs/luci-static/resources/fchomo.js:146 +#: htdocs/luci-static/resources/fchomo.js:147 +#: htdocs/luci-static/resources/fchomo.js:148 +#: htdocs/luci-static/resources/fchomo.js:171 #: htdocs/luci-static/resources/fchomo.js:176 #: htdocs/luci-static/resources/fchomo.js:177 -#: htdocs/luci-static/resources/fchomo.js:183 +#: htdocs/luci-static/resources/fchomo.js:178 +#: htdocs/luci-static/resources/fchomo.js:179 +#: htdocs/luci-static/resources/fchomo.js:180 +#: htdocs/luci-static/resources/fchomo.js:181 +#: htdocs/luci-static/resources/fchomo.js:187 #: htdocs/luci-static/resources/view/fchomo/client.js:589 #: htdocs/luci-static/resources/view/fchomo/client.js:679 msgid "TCP" @@ -2695,14 +2711,14 @@ msgstr "TCP-Keep-Alive 閒置逾時" msgid "TCP-Keep-Alive interval" msgstr "TCP-Keep-Alive 間隔" -#: htdocs/luci-static/resources/fchomo.js:136 -#: htdocs/luci-static/resources/fchomo.js:137 -#: htdocs/luci-static/resources/fchomo.js:138 -#: htdocs/luci-static/resources/fchomo.js:139 -#: htdocs/luci-static/resources/fchomo.js:166 -#: htdocs/luci-static/resources/fchomo.js:168 -#: htdocs/luci-static/resources/fchomo.js:169 -#: htdocs/luci-static/resources/fchomo.js:171 +#: htdocs/luci-static/resources/fchomo.js:140 +#: htdocs/luci-static/resources/fchomo.js:141 +#: htdocs/luci-static/resources/fchomo.js:142 +#: htdocs/luci-static/resources/fchomo.js:143 +#: htdocs/luci-static/resources/fchomo.js:170 +#: htdocs/luci-static/resources/fchomo.js:172 +#: htdocs/luci-static/resources/fchomo.js:173 +#: htdocs/luci-static/resources/fchomo.js:175 msgid "TCP/UDP" msgstr "" @@ -2733,12 +2749,12 @@ msgstr "" msgid "TLS fields" msgstr "TLS欄位" -#: htdocs/luci-static/resources/fchomo.js:145 -#: htdocs/luci-static/resources/fchomo.js:180 +#: htdocs/luci-static/resources/fchomo.js:149 +#: htdocs/luci-static/resources/fchomo.js:184 msgid "TUIC" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:221 +#: htdocs/luci-static/resources/fchomo.js:225 msgid "TURN" msgstr "" @@ -2793,13 +2809,13 @@ msgid "" "The first padding must have a probability of 100% and at least 35 bytes." msgstr "首個填充必須為 100% 的機率並且至少 35 位元組。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1746 +#: htdocs/luci-static/resources/view/fchomo/client.js:1804 msgid "The matching %s will be deemed as not-poisoned." msgstr "匹配 %s 的將被視為未被投毒汙染。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1755 -#: htdocs/luci-static/resources/view/fchomo/client.js:1759 -#: htdocs/luci-static/resources/view/fchomo/client.js:1764 +#: htdocs/luci-static/resources/view/fchomo/client.js:1813 +#: htdocs/luci-static/resources/view/fchomo/client.js:1817 +#: htdocs/luci-static/resources/view/fchomo/client.js:1822 msgid "The matching %s will be deemed as poisoned." msgstr "匹配 %s 的將被視為已被投毒汙染。" @@ -2813,7 +2829,7 @@ msgstr "伺服器和客戶端可以設定不同的填充參數。" msgid "This ECH parameter needs to be added to the HTTPS record of the domain." msgstr "此 ECH 參數需要加入到網域的 HTTPS 記錄中。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1525 +#: htdocs/luci-static/resources/view/fchomo/client.js:1577 #: htdocs/luci-static/resources/view/fchomo/node.js:1017 #: htdocs/luci-static/resources/view/fchomo/node.js:1591 msgid "" @@ -2883,8 +2899,8 @@ msgstr "傳輸層類型" msgid "Treat the destination IP as the source IP." msgstr "將 目標 IP 視為 來源 IP。" -#: htdocs/luci-static/resources/fchomo.js:143 -#: htdocs/luci-static/resources/fchomo.js:176 +#: htdocs/luci-static/resources/fchomo.js:147 +#: htdocs/luci-static/resources/fchomo.js:180 msgid "Trojan" msgstr "" @@ -2907,8 +2923,8 @@ msgstr "Tun 堆栈" #: htdocs/luci-static/resources/view/fchomo/client.js:530 #: htdocs/luci-static/resources/view/fchomo/client.js:643 #: htdocs/luci-static/resources/view/fchomo/client.js:737 -#: htdocs/luci-static/resources/view/fchomo/client.js:976 -#: htdocs/luci-static/resources/view/fchomo/client.js:1684 +#: htdocs/luci-static/resources/view/fchomo/client.js:842 +#: htdocs/luci-static/resources/view/fchomo/client.js:1028 #: htdocs/luci-static/resources/view/fchomo/node.js:238 #: htdocs/luci-static/resources/view/fchomo/node.js:1433 #: htdocs/luci-static/resources/view/fchomo/node.js:1718 @@ -2917,12 +2933,12 @@ msgstr "Tun 堆栈" msgid "Type" msgstr "類型" -#: htdocs/luci-static/resources/fchomo.js:145 -#: htdocs/luci-static/resources/fchomo.js:146 -#: htdocs/luci-static/resources/fchomo.js:179 -#: htdocs/luci-static/resources/fchomo.js:180 -#: htdocs/luci-static/resources/fchomo.js:181 -#: htdocs/luci-static/resources/fchomo.js:182 +#: htdocs/luci-static/resources/fchomo.js:149 +#: htdocs/luci-static/resources/fchomo.js:150 +#: htdocs/luci-static/resources/fchomo.js:183 +#: htdocs/luci-static/resources/fchomo.js:184 +#: htdocs/luci-static/resources/fchomo.js:185 +#: htdocs/luci-static/resources/fchomo.js:186 #: htdocs/luci-static/resources/view/fchomo/client.js:588 #: htdocs/luci-static/resources/view/fchomo/client.js:678 #: htdocs/luci-static/resources/view/fchomo/node.js:845 @@ -2951,7 +2967,7 @@ msgstr "UDP 包中繼模式。" msgid "UDP relay mode" msgstr "UDP 中繼模式" -#: htdocs/luci-static/resources/fchomo.js:210 +#: htdocs/luci-static/resources/fchomo.js:214 msgid "URL test" msgstr "自動選擇" @@ -2963,7 +2979,7 @@ msgstr "自動選擇" msgid "UUID" msgstr "UUID" -#: htdocs/luci-static/resources/fchomo.js:1181 +#: htdocs/luci-static/resources/fchomo.js:1185 msgid "Unable to download unsupported type: %s" msgstr "無法下載不支援的類型: %s" @@ -3034,23 +3050,23 @@ msgstr "上傳金鑰" msgid "Upload..." msgstr "上傳..." -#: htdocs/luci-static/resources/view/fchomo/client.js:1347 +#: htdocs/luci-static/resources/view/fchomo/client.js:1399 msgid "" "Used to resolve domains that can be directly connected. Can use domestic DNS " "servers or ECS." msgstr "用於解析可直連的網域。可使用國內 DNS 伺服器或 ECS。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1349 +#: htdocs/luci-static/resources/view/fchomo/client.js:1401 msgid "" "Used to resolve domains you want to proxy. Recommended to configure %s for " "DNS servers." msgstr "用於解析想要代理的網域。建議為 DNS 伺服器配置%s。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1331 +#: htdocs/luci-static/resources/view/fchomo/client.js:1383 msgid "Used to resolve the domain of the DNS server. Must be IP." msgstr "用於解析 DNS 伺服器的網域。必須是 IP。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1338 +#: htdocs/luci-static/resources/view/fchomo/client.js:1390 msgid "Used to resolve the domain of the Proxy node." msgstr "用於解析代理節點的網域。" @@ -3079,13 +3095,13 @@ msgstr "" msgid "V2ray HTTPUpgrade fast open" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:142 -#: htdocs/luci-static/resources/fchomo.js:175 +#: htdocs/luci-static/resources/fchomo.js:146 +#: htdocs/luci-static/resources/fchomo.js:179 msgid "VLESS" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:141 -#: htdocs/luci-static/resources/fchomo.js:174 +#: htdocs/luci-static/resources/fchomo.js:145 +#: htdocs/luci-static/resources/fchomo.js:178 msgid "VMess" msgstr "" @@ -3095,7 +3111,7 @@ msgstr "" msgid "Value" msgstr "可視化值" -#: htdocs/luci-static/resources/fchomo.js:339 +#: htdocs/luci-static/resources/fchomo.js:343 msgid "Verify if given" msgstr "" @@ -3114,7 +3130,7 @@ msgstr "" msgid "Vless Encryption fields" msgstr "Vless Encryption 欄位" -#: htdocs/luci-static/resources/fchomo.js:376 +#: htdocs/luci-static/resources/fchomo.js:380 msgid "Wait a random 0-111 milliseconds with 75% probability." msgstr "以 75% 的機率等待隨機 0-111 毫秒。" @@ -3139,7 +3155,7 @@ msgstr "用作服務端時,HomeProxy 是更好的選擇。" msgid "White list" msgstr "白名單" -#: htdocs/luci-static/resources/fchomo.js:182 +#: htdocs/luci-static/resources/fchomo.js:186 msgid "WireGuard" msgstr "" @@ -3171,23 +3187,23 @@ msgstr "Yaml 格式文本" msgid "YouTube" msgstr "YouTube" -#: htdocs/luci-static/resources/fchomo.js:1620 +#: htdocs/luci-static/resources/fchomo.js:1624 msgid "Your %s was successfully uploaded. Size: %sB." msgstr "您的 %s 已成功上傳。大小:%sB。" -#: htdocs/luci-static/resources/fchomo.js:312 -#: htdocs/luci-static/resources/fchomo.js:325 -#: htdocs/luci-static/resources/fchomo.js:330 +#: htdocs/luci-static/resources/fchomo.js:316 +#: htdocs/luci-static/resources/fchomo.js:329 +#: htdocs/luci-static/resources/fchomo.js:334 #: htdocs/luci-static/resources/view/fchomo/node.js:640 msgid "aes-128-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:313 +#: htdocs/luci-static/resources/fchomo.js:317 msgid "aes-192-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:314 -#: htdocs/luci-static/resources/fchomo.js:331 +#: htdocs/luci-static/resources/fchomo.js:318 +#: htdocs/luci-static/resources/fchomo.js:335 msgid "aes-256-gcm" msgstr "" @@ -3205,9 +3221,9 @@ msgstr "bbr" msgid "certificate" msgstr "憑證" -#: htdocs/luci-static/resources/fchomo.js:315 -#: htdocs/luci-static/resources/fchomo.js:326 -#: htdocs/luci-static/resources/fchomo.js:332 +#: htdocs/luci-static/resources/fchomo.js:319 +#: htdocs/luci-static/resources/fchomo.js:330 +#: htdocs/luci-static/resources/fchomo.js:336 msgid "chacha20-ietf-poly1305" msgstr "" @@ -3277,17 +3293,18 @@ msgstr "至少需要一對密鑰" msgid "metacubexd" msgstr "metacubexd" -#: htdocs/luci-static/resources/view/fchomo/client.js:949 -#: htdocs/luci-static/resources/view/fchomo/client.js:1197 -#: htdocs/luci-static/resources/view/fchomo/client.js:1289 -#: htdocs/luci-static/resources/view/fchomo/client.js:1426 -#: htdocs/luci-static/resources/view/fchomo/client.js:1661 +#: htdocs/luci-static/resources/view/fchomo/client.js:1001 +#: htdocs/luci-static/resources/view/fchomo/client.js:1249 +#: htdocs/luci-static/resources/view/fchomo/client.js:1341 +#: htdocs/luci-static/resources/view/fchomo/client.js:1478 +#: htdocs/luci-static/resources/view/fchomo/client.js:1709 +#: htdocs/luci-static/resources/view/fchomo/client.js:1765 #: htdocs/luci-static/resources/view/fchomo/node.js:1405 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:232 msgid "mihomo config" msgstr "mihomo 配置" -#: htdocs/luci-static/resources/fchomo.js:358 +#: htdocs/luci-static/resources/fchomo.js:362 msgid "mlkem768x25519plus" msgstr "" @@ -3304,16 +3321,16 @@ msgstr "new_reno" msgid "no-resolve" msgstr "no-resolve" -#: htdocs/luci-static/resources/fchomo.js:1355 -#: htdocs/luci-static/resources/fchomo.js:1450 -#: htdocs/luci-static/resources/fchomo.js:1485 -#: htdocs/luci-static/resources/fchomo.js:1513 +#: htdocs/luci-static/resources/fchomo.js:1359 +#: htdocs/luci-static/resources/fchomo.js:1454 +#: htdocs/luci-static/resources/fchomo.js:1489 +#: htdocs/luci-static/resources/fchomo.js:1517 msgid "non-empty value" msgstr "非空值" -#: htdocs/luci-static/resources/fchomo.js:310 -#: htdocs/luci-static/resources/fchomo.js:324 -#: htdocs/luci-static/resources/fchomo.js:336 +#: htdocs/luci-static/resources/fchomo.js:314 +#: htdocs/luci-static/resources/fchomo.js:328 +#: htdocs/luci-static/resources/fchomo.js:340 #: htdocs/luci-static/resources/view/fchomo/node.js:638 #: htdocs/luci-static/resources/view/fchomo/node.js:658 #: htdocs/luci-static/resources/view/fchomo/node.js:793 @@ -3326,11 +3343,11 @@ msgstr "無" msgid "not found" msgstr "未找到" -#: htdocs/luci-static/resources/view/fchomo/client.js:966 +#: htdocs/luci-static/resources/view/fchomo/client.js:1018 msgid "not included \",\"" msgstr "不包含 \",\"" -#: htdocs/luci-static/resources/fchomo.js:196 +#: htdocs/luci-static/resources/fchomo.js:200 msgid "null" msgstr "" @@ -3364,8 +3381,8 @@ msgstr "私鑰" msgid "razord-meta" msgstr "razord-meta" -#: htdocs/luci-static/resources/view/fchomo/client.js:1121 -#: htdocs/luci-static/resources/view/fchomo/client.js:1127 +#: htdocs/luci-static/resources/view/fchomo/client.js:1173 +#: htdocs/luci-static/resources/view/fchomo/client.js:1179 msgid "requires front-end adaptation using the API." msgstr "需要使用 API 的前端適配。" @@ -3403,15 +3420,15 @@ msgstr "" msgid "unchecked" msgstr "未檢查" -#: htdocs/luci-static/resources/fchomo.js:422 +#: htdocs/luci-static/resources/fchomo.js:426 msgid "unique UCI identifier" msgstr "獨立 UCI 識別" -#: htdocs/luci-static/resources/fchomo.js:425 +#: htdocs/luci-static/resources/fchomo.js:429 msgid "unique identifier" msgstr "獨立標識" -#: htdocs/luci-static/resources/fchomo.js:1522 +#: htdocs/luci-static/resources/fchomo.js:1526 msgid "unique value" msgstr "獨立值" @@ -3440,8 +3457,8 @@ msgstr "" msgid "v3" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1402 -#: htdocs/luci-static/resources/fchomo.js:1405 +#: htdocs/luci-static/resources/fchomo.js:1406 +#: htdocs/luci-static/resources/fchomo.js:1409 msgid "valid JSON format" msgstr "有效的 JSON 格式" @@ -3449,41 +3466,41 @@ msgstr "有效的 JSON 格式" msgid "valid SHA256 string with %d characters" msgstr "包含 %d 個字元的有效 SHA256 字串" -#: htdocs/luci-static/resources/fchomo.js:1427 -#: htdocs/luci-static/resources/fchomo.js:1430 +#: htdocs/luci-static/resources/fchomo.js:1431 +#: htdocs/luci-static/resources/fchomo.js:1434 msgid "valid URL" msgstr "有效網址" -#: htdocs/luci-static/resources/fchomo.js:1440 +#: htdocs/luci-static/resources/fchomo.js:1444 msgid "valid base64 key with %d characters" msgstr "包含 %d 個字元的有效 base64 金鑰" -#: htdocs/luci-static/resources/fchomo.js:1500 -#: htdocs/luci-static/resources/fchomo.js:1506 +#: htdocs/luci-static/resources/fchomo.js:1504 +#: htdocs/luci-static/resources/fchomo.js:1510 msgid "valid format: 2x, 2p, 4v" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1487 +#: htdocs/luci-static/resources/fchomo.js:1491 msgid "valid key length with %d characters" msgstr "包含 %d 個字元的有效金鑰" -#: htdocs/luci-static/resources/fchomo.js:1365 +#: htdocs/luci-static/resources/fchomo.js:1369 msgid "valid port value" msgstr "有效連接埠值" -#: htdocs/luci-static/resources/fchomo.js:1415 +#: htdocs/luci-static/resources/fchomo.js:1419 msgid "valid uuid" msgstr "有效 uuid" -#: htdocs/luci-static/resources/fchomo.js:382 +#: htdocs/luci-static/resources/fchomo.js:386 msgid "vless-mlkem768" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:381 +#: htdocs/luci-static/resources/fchomo.js:385 msgid "vless-x25519" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:316 +#: htdocs/luci-static/resources/fchomo.js:320 msgid "xchacha20-ietf-poly1305" msgstr "" @@ -3503,7 +3520,7 @@ msgstr "" msgid "zero" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1183 +#: htdocs/luci-static/resources/fchomo.js:1187 msgid "🡇" msgstr "" diff --git a/small/luci-app-fchomo/root/etc/init.d/fchomo b/small/luci-app-fchomo/root/etc/init.d/fchomo index 4a9c1ed6be..ddbb35d903 100755 --- a/small/luci-app-fchomo/root/etc/init.d/fchomo +++ b/small/luci-app-fchomo/root/etc/init.d/fchomo @@ -122,6 +122,7 @@ start_service() { '.sniffer["force-domain"][] style="double" | .sniffer["skip-domain"][] style="double" | with(.dns["nameserver-policy"]; ... style="double") + | with(.dns["proxy-server-nameserver-policy"]; ... style="double") | .dns["fallback-filter"].domain[] style="double" | with(.["proxy-providers"][] | select(.payload); .payload style="literal") | with(.["rule-providers"][] | select(.payload); .payload style="literal")' \ diff --git a/small/luci-app-fchomo/root/usr/share/fchomo/generate_client.uc b/small/luci-app-fchomo/root/usr/share/fchomo/generate_client.uc index c6000bcda3..01edb8b4a0 100644 --- a/small/luci-app-fchomo/root/usr/share/fchomo/generate_client.uc +++ b/small/luci-app-fchomo/root/usr/share/fchomo/generate_client.uc @@ -37,6 +37,7 @@ const uciglobal = 'global', const ucisniff = 'sniff', ucidnser = 'dns_server', ucidnspoli = 'dns_policy', + ucidnsnpoli = 'dns_node_policy', ucipgrp = 'proxy_group', ucinode = 'node', uciprov = 'provider', @@ -411,6 +412,7 @@ config.dns = { "respect-rules": true, "default-nameserver": get_nameserver(uci.get(uciconf, ucidns, 'boot_server')), "proxy-server-nameserver": get_nameserver(uci.get(uciconf, ucidns, 'bootnode_server')), + "proxy-server-nameserver-policy": {}, nameserver: get_nameserver(uci.get(uciconf, ucidns, 'default_server')), fallback: get_nameserver(uci.get(uciconf, ucidns, 'fallback_server')), "nameserver-policy": {}, @@ -419,23 +421,31 @@ config.dns = { } }; /* DNS policy */ -uci.foreach(uciconf, ucidnspoli, (cfg) => { - if (cfg.enabled === '0') - return null; +map([ + [ucidnspoli, "nameserver-policy"], // DNS policy + [ucidnsnpoli, "proxy-server-nameserver-policy"] // Bootstrap DNS policy (Node) + ], (e) => { + const sectiontype = e[0]; + const field = e[1]; - let key; - if (cfg.type === 'domain') { - key = isEmpty(cfg.domain) ? null : join(',', cfg.domain); - } else if (cfg.type === 'geosite') { - key = isEmpty(cfg.geosite) ? null : 'geosite:' + join(',', cfg.geosite); - } else if (cfg.type === 'rule_set') { - key = isEmpty(cfg.rule_set) ? null : 'rule-set:' + join(',', cfg.rule_set); - }; + uci.foreach(uciconf, sectiontype, (cfg) => { + if (cfg.enabled === '0') + return null; - if (!key) - return null; + let key; + if (cfg.type === 'domain') { + key = isEmpty(cfg.domain) ? null : join(',', cfg.domain); + } else if (cfg.type === 'geosite') { + key = isEmpty(cfg.geosite) ? null : 'geosite:' + join(',', cfg.geosite); + } else if (cfg.type === 'rule_set') { + key = isEmpty(cfg.rule_set) ? null : 'rule-set:' + join(',', cfg.rule_set); + }; - config.dns["nameserver-policy"][key] = get_nameserver(cfg.server, cfg.proxy); + if (!key) + return null; + + config.dns[field][key] = get_nameserver(cfg.server, cfg.proxy); + }); }); /* Fallback filter */ if (!isEmpty(config.dns.fallback)) @@ -741,7 +751,7 @@ uci.foreach(uciconf, uciprov, (cfg) => { override: { "additional-prefix": cfg.override_prefix, "additional-suffix": cfg.override_suffix, - "proxy-name": isEmpty(cfg.override_replace) ? null : map(cfg.override_replace, (obj) => json(obj)), + "proxy-name": isEmpty(cfg.override_replace) ? null : map(cfg.override_replace, obj => json(obj)), // Configuration Items tfo: strToBool(cfg.override_tfo), mptcp: strToBool(cfg.override_mptcp), diff --git a/small/luci-app-passwall/Makefile b/small/luci-app-passwall/Makefile index 33aa4251da..e0587f2ff0 100644 --- a/small/luci-app-passwall/Makefile +++ b/small/luci-app-passwall/Makefile @@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall -PKG_VERSION:=26.1.30 +PKG_VERSION:=26.2.6 PKG_RELEASE:=1 PKG_PO_VERSION:=$(PKG_VERSION) diff --git a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe_config.lua b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe_config.lua index b3a24812fc..90b5f81e2e 100644 --- a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe_config.lua +++ b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe_config.lua @@ -259,7 +259,6 @@ o:value("1", translate("Preproxy Node")) o:value("2", translate("Landing Node")) local descrStr = "Chained proxy works only with Xray or Sing-box nodes.
" -descrStr = descrStr .. "The chained node must be the same type as your subscription node (Xray with Xray, Sing-box with Sing-box).
" descrStr = descrStr .. "You can only use manual or imported nodes as chained nodes." descrStr = translate(descrStr) .. "
" .. translate("Only support a layer of proxy.") diff --git a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua index ed1af33d5a..d2c1cc2ff0 100644 --- a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua +++ b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua @@ -732,7 +732,7 @@ o2.template = appname .. "/cbi/nodes_listvalue" o2.group = {} for k, v in pairs(nodes_list) do - if v.type == "Xray" and v.id ~= arg[1] and (not v.chain_proxy or v.chain_proxy == "") then + if v.id ~= arg[1] and (not v.chain_proxy or v.chain_proxy == "") then o1:value(v.id, v.remark) o1.group[#o1.group+1] = (v.group and v.group ~= "") and v.group or translate("default") o2:value(v.id, v.remark) diff --git a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua index 5188bb0c3d..91f964815a 100644 --- a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua +++ b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua @@ -778,7 +778,7 @@ o2.template = appname .. "/cbi/nodes_listvalue" o2.group = {} for k, v in pairs(nodes_list) do - if v.type == "sing-box" and v.id ~= arg[1] and (not v.chain_proxy or v.chain_proxy == "") then + if v.id ~= arg[1] and (not v.chain_proxy or v.chain_proxy == "") then o1:value(v.id, v.remark) o1.group[#o1.group+1] = (v.group and v.group ~= "") and v.group or translate("default") o2:value(v.id, v.remark) diff --git a/small/luci-app-passwall/luasrc/passwall/util_sing-box.lua b/small/luci-app-passwall/luasrc/passwall/util_sing-box.lua index da70b0a271..3816d7b902 100644 --- a/small/luci-app-passwall/luasrc/passwall/util_sing-box.lua +++ b/small/luci-app-passwall/luasrc/passwall/util_sing-box.lua @@ -1191,9 +1191,12 @@ function gen_config(var) else local preproxy_node = uci:get_all(appname, node.preproxy_node) if preproxy_node then - local preproxy_outbound = gen_outbound(nil, preproxy_node) + local preproxy_outbound = gen_outbound(node[".name"], preproxy_node) if preproxy_outbound then - preproxy_outbound.tag = preproxy_node[".name"] .. ":" .. preproxy_node.remarks + preproxy_outbound.tag = preproxy_node[".name"] + if preproxy_node.remarks then + preproxy_outbound.tag = preproxy_outbound.tag .. ":" .. preproxy_node.remarks + end outbound.tag = preproxy_outbound.tag .. " -> " .. outbound.tag outbound.detour = preproxy_outbound.tag last_insert_outbound = preproxy_outbound @@ -1205,16 +1208,47 @@ function gen_config(var) if node.chain_proxy == "2" and node.to_node then local to_node = uci:get_all(appname, node.to_node) if to_node then - local to_outbound = gen_outbound(nil, to_node) + local to_outbound + if to_node.type ~= "sing-box" then + local tag = to_node[".name"] + local new_port = api.get_new_port() + table.insert(inbounds, { + type = "direct", + tag = tag, + listen = "127.0.0.1", + listen_port = new_port, + override_address = to_node.address, + override_port = tonumber(to_node.port), + }) + table.insert(rules, 1, { + inbound = {tag}, + outbound = outbound.tag, + }) + if to_node.tls_serverName == nil then + to_node.tls_serverName = to_node.address + end + to_node.address = "127.0.0.1" + to_node.port = new_port + to_outbound = gen_outbound(node[".name"], to_node, tag, { + tag = tag, + run_socks_instance = not no_run + }) + else + to_outbound = gen_outbound(node[".name"], to_node) + end if to_outbound then if shunt_rule_name then to_outbound.tag = outbound.tag outbound.tag = node[".name"] else + if to_node.remarks then + to_outbound.tag = to_outbound.tag .. ":" .. to_node.remarks + end to_outbound.tag = outbound.tag .. " -> " .. to_outbound.tag end - - to_outbound.detour = outbound.tag + if to_node.type == "sing-box" then + to_outbound.detour = outbound.tag + end table.insert(outbounds_table, to_outbound) default_outTag = to_outbound.tag end @@ -1223,9 +1257,9 @@ function gen_config(var) return default_outTag, last_insert_outbound end - if node.protocol == "_shunt" then - local rules = {} + rules = {} + if node.protocol == "_shunt" then local preproxy_rule_name = node.preproxy_enabled == "1" and "main" or nil local preproxy_tag = preproxy_rule_name local preproxy_node_id = preproxy_rule_name and node["main_node"] or nil @@ -1544,10 +1578,6 @@ function gen_config(var) table.insert(rules, rule) end end) - - for index, value in ipairs(rules) do - table.insert(route.rules, rules[index]) - end elseif node.protocol == "_urltest" then if node.urltest_node then COMMON.default_outbound_tag = gen_urltest(node) @@ -1575,6 +1605,10 @@ function gen_config(var) end end end + + for index, value in ipairs(rules) do + table.insert(route.rules, rules[index]) + end end if COMMON.default_outbound_tag then diff --git a/small/luci-app-passwall/luasrc/passwall/util_xray.lua b/small/luci-app-passwall/luasrc/passwall/util_xray.lua index f535a053c3..41218f2b9c 100644 --- a/small/luci-app-passwall/luasrc/passwall/util_xray.lua +++ b/small/luci-app-passwall/luasrc/passwall/util_xray.lua @@ -937,9 +937,12 @@ function gen_config(var) else local preproxy_node = uci:get_all(appname, node.preproxy_node) if preproxy_node then - local preproxy_outbound = gen_outbound(nil, preproxy_node) + local preproxy_outbound = gen_outbound(node[".name"], preproxy_node) if preproxy_outbound then - preproxy_outbound.tag = preproxy_node[".name"] .. ":" .. preproxy_node.remarks + preproxy_outbound.tag = preproxy_node[".name"] + if preproxy_node.remarks then + preproxy_outbound.tag = preproxy_outbound.tag .. ":" .. preproxy_node.remarks + end outbound.tag = preproxy_outbound.tag .. " -> " .. outbound.tag outbound.proxySettings = { tag = preproxy_outbound.tag, @@ -954,19 +957,49 @@ function gen_config(var) if node.chain_proxy == "2" and node.to_node then local to_node = uci:get_all(appname, node.to_node) if to_node then - local to_outbound = gen_outbound(nil, to_node) + local to_outbound + if to_node.type ~= "Xray" then + local tag = to_node[".name"] + local new_port = api.get_new_port() + table.insert(inbounds, { + tag = tag, + listen = "127.0.0.1", + port = new_port, + protocol = "dokodemo-door", + settings = {network = "tcp,udp", address = to_node.address, port = tonumber(to_node.port)} + }) + if to_node.tls_serverName == nil then + to_node.tls_serverName = to_node.address + end + to_node.address = "127.0.0.1" + to_node.port = new_port + table.insert(rules, 1, { + inboundTag = {tag}, + outboundTag = outbound.tag + }) + to_outbound = gen_outbound(node[".name"], to_node, tag, { + tag = tag, + run_socks_instance = not no_run + }) + else + to_outbound = gen_outbound(node[".name"], to_node) + end if to_outbound then if shunt_rule_name then to_outbound.tag = outbound.tag outbound.tag = node[".name"] else + if to_node.remarks then + to_outbound.tag = to_outbound.tag .. ":" .. to_node.remarks + end to_outbound.tag = outbound.tag .. " -> " .. to_outbound.tag end - - to_outbound.proxySettings = { - tag = outbound.tag, - transportLayer = true - } + if to_node.type == "Xray" then + to_outbound.proxySettings = { + tag = outbound.tag, + transportLayer = true + } + end table.insert(outbounds_table, to_outbound) default_outTag = to_outbound.tag end @@ -1308,7 +1341,7 @@ function gen_config(var) routing = { domainStrategy = "AsIs", domainMatcher = "hybrid", - rules = {} + rules = rules } table.insert(routing.rules, { ruleTag = "default", diff --git a/small/luci-app-passwall/luasrc/view/passwall/cbi/nodes_listvalue_com.htm b/small/luci-app-passwall/luasrc/view/passwall/cbi/nodes_listvalue_com.htm index e2ec33b464..9de708e5f7 100644 --- a/small/luci-app-passwall/luasrc/view/passwall/cbi/nodes_listvalue_com.htm +++ b/small/luci-app-passwall/luasrc/view/passwall/cbi/nodes_listvalue_com.htm @@ -161,49 +161,31 @@ return cssRules.filter(Boolean).join(' ') } - function lv_parseColorToRgba(color) { - if (!color) return null; - - const ctx = document.createElement('canvas').getContext('2d'); - if (!ctx) return null; - - ctx.fillStyle = color; - const computedColor = ctx.fillStyle; - // Match #RRGGBB or #RRGGBBAA format - if (computedColor.startsWith('#')) { - const hex = computedColor.substring(1); - // #RRGGBB (6 digits) - if (hex.length === 6) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: 1 - }; - } - // #RRGGBBAA (8 digits) - if (hex.length === 8) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: parseInt(hex.substring(6, 8), 16) / 255 - }; - } - } - // Match rgba() or rgb() format (for browsers that return this format) - const rgbaMatch = computedColor.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)$/); - if (rgbaMatch) { - return { - r: parseInt(rgbaMatch[1], 10), - g: parseInt(rgbaMatch[2], 10), - b: parseInt(rgbaMatch[3], 10), - a: rgbaMatch[4] !== undefined ? parseFloat(rgbaMatch[4]) : 1 - }; - } - - return null; // Invalid color - } + const lv_parseColorToRgba = (function() { + // Create canvas and context once (Closure) + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d', { willReadFrequently: true }); + return function(colorStr) { + if (!colorStr) + return null; + ctx.clearRect(0, 0, 1, 1); + // 2. Apply the color + ctx.fillStyle = colorStr; + // 3. Fill a single pixel + ctx.fillRect(0, 0, 1, 1); + // 4. Extract pixel data [R, G, B, A] + const data = ctx.getImageData(0, 0, 1, 1).data; + return { + r: data[0], + g: data[1], + b: data[2], + // Convert alpha from 0-255 to 0-1 (rounded to 3 decimal places) + a: Math.round((data[3] / 255) * 1000) / 1000 + }; + }; + })(); // Helper to convert back to Hex (for output consistency) function lv_rgbToHex(r, g, b) { diff --git a/small/luci-app-passwall/luasrc/view/passwall/cbi/nodes_multivalue_com.htm b/small/luci-app-passwall/luasrc/view/passwall/cbi/nodes_multivalue_com.htm index 275cb73db6..646f691b48 100644 --- a/small/luci-app-passwall/luasrc/view/passwall/cbi/nodes_multivalue_com.htm +++ b/small/luci-app-passwall/luasrc/view/passwall/cbi/nodes_multivalue_com.htm @@ -117,49 +117,31 @@ return cssRules.filter(Boolean).join(' ') } - function mv_parseColorToRgba(color) { - if (!color) return null; - - const ctx = document.createElement('canvas').getContext('2d'); - if (!ctx) return null; - - ctx.fillStyle = color; - const computedColor = ctx.fillStyle; - // Match #RRGGBB or #RRGGBBAA format - if (computedColor.startsWith('#')) { - const hex = computedColor.substring(1); - // #RRGGBB (6 digits) - if (hex.length === 6) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: 1 - }; - } - // #RRGGBBAA (8 digits) - if (hex.length === 8) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: parseInt(hex.substring(6, 8), 16) / 255 - }; - } - } - // Match rgba() or rgb() format (for browsers that return this format) - const rgbaMatch = computedColor.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)$/); - if (rgbaMatch) { - return { - r: parseInt(rgbaMatch[1], 10), - g: parseInt(rgbaMatch[2], 10), - b: parseInt(rgbaMatch[3], 10), - a: rgbaMatch[4] !== undefined ? parseFloat(rgbaMatch[4]) : 1 - }; - } - - return null; // Invalid color - } + const mv_parseColorToRgba = (function() { + // Create canvas and context once (Closure) + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d', { willReadFrequently: true }); + return function(colorStr) { + if (!colorStr) + return null; + ctx.clearRect(0, 0, 1, 1); + // 2. Apply the color + ctx.fillStyle = colorStr; + // 3. Fill a single pixel + ctx.fillRect(0, 0, 1, 1); + // 4. Extract pixel data [R, G, B, A] + const data = ctx.getImageData(0, 0, 1, 1).data; + return { + r: data[0], + g: data[1], + b: data[2], + // Convert alpha from 0-255 to 0-1 (rounded to 3 decimal places) + a: Math.round((data[3] / 255) * 1000) / 1000 + }; + }; + })(); // Helper to convert back to Hex (for output consistency) function mv_rgbToHex(r, g, b) { diff --git a/small/luci-app-passwall/luasrc/view/passwall/cbi/nodes_value_com.htm b/small/luci-app-passwall/luasrc/view/passwall/cbi/nodes_value_com.htm index b49ba9d7b2..1f784d04b2 100644 --- a/small/luci-app-passwall/luasrc/view/passwall/cbi/nodes_value_com.htm +++ b/small/luci-app-passwall/luasrc/view/passwall/cbi/nodes_value_com.htm @@ -156,49 +156,31 @@ return cssRules.filter(Boolean).join(' ') } - function v_parseColorToRgba(color) { - if (!color) return null; - - const ctx = document.createElement('canvas').getContext('2d'); - if (!ctx) return null; - - ctx.fillStyle = color; - const computedColor = ctx.fillStyle; - // Match #RRGGBB or #RRGGBBAA format - if (computedColor.startsWith('#')) { - const hex = computedColor.substring(1); - // #RRGGBB (6 digits) - if (hex.length === 6) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: 1 - }; - } - // #RRGGBBAA (8 digits) - if (hex.length === 8) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: parseInt(hex.substring(6, 8), 16) / 255 - }; - } - } - // Match rgba() or rgb() format (for browsers that return this format) - const rgbaMatch = computedColor.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)$/); - if (rgbaMatch) { - return { - r: parseInt(rgbaMatch[1], 10), - g: parseInt(rgbaMatch[2], 10), - b: parseInt(rgbaMatch[3], 10), - a: rgbaMatch[4] !== undefined ? parseFloat(rgbaMatch[4]) : 1 - }; - } - - return null; // Invalid color - } + const v_parseColorToRgba = (function() { + // Create canvas and context once (Closure) + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d', { willReadFrequently: true }); + return function(colorStr) { + if (!colorStr) + return null; + ctx.clearRect(0, 0, 1, 1); + // 2. Apply the color + ctx.fillStyle = colorStr; + // 3. Fill a single pixel + ctx.fillRect(0, 0, 1, 1); + // 4. Extract pixel data [R, G, B, A] + const data = ctx.getImageData(0, 0, 1, 1).data; + return { + r: data[0], + g: data[1], + b: data[2], + // Convert alpha from 0-255 to 0-1 (rounded to 3 decimal places) + a: Math.round((data[3] / 255) * 1000) / 1000 + }; + }; + })(); // Helper to convert back to Hex (for output consistency) function v_rgbToHex(r, g, b) { diff --git a/small/luci-app-passwall/luasrc/view/passwall/node_list/link_add_node.htm b/small/luci-app-passwall/luasrc/view/passwall/node_list/link_add_node.htm index 83046a7daf..d7ee096608 100644 --- a/small/luci-app-passwall/luasrc/view/passwall/node_list/link_add_node.htm +++ b/small/luci-app-passwall/luasrc/view/passwall/node_list/link_add_node.htm @@ -457,8 +457,7 @@ local api = require "luci.passwall.api" background: #fff; cursor: pointer; box-sizing: border-box; - display: flex; - align-items: center; + display: block; } .selected-display { @@ -469,23 +468,21 @@ local api = require "luci.passwall.api" width: 100%; height: 100%; box-sizing: border-box; + font-size: 12px; + color: #666; } .selected-display:hover { background-color: #f7f7f7; } - .selected-display { - font-size: 12px; - color: #666; - } - .dropdown-list { position: absolute; - top: 100%; - left: 0; - width: 180px; + top: calc(100% + 2px); + left: -1px; + width: calc(100% + 2px); border: 1px solid #d9d9d9; + border-radius: 2px; border-top: none; box-shadow: 0 1px 3px rgba(0,0,0,0.15); background: #fff; @@ -497,6 +494,7 @@ local api = require "luci.passwall.api" overflow-x: hidden; z-index: 100; box-sizing: border-box; + color: #666; } .dropdown-item { diff --git a/small/luci-app-passwall/luasrc/view/passwall/node_list/node_list.htm b/small/luci-app-passwall/luasrc/view/passwall/node_list/node_list.htm index 3a5f7f6a3a..6c36be2dc3 100644 --- a/small/luci-app-passwall/luasrc/view/passwall/node_list/node_list.htm +++ b/small/luci-app-passwall/luasrc/view/passwall/node_list/node_list.htm @@ -1065,9 +1065,11 @@ table td, .table .td {
-
-
<%:You choose node is:%>
-
+
+
+ <%:You choose node is:%> +
+
diff --git a/small/luci-app-passwall/po/zh-cn/passwall.po b/small/luci-app-passwall/po/zh-cn/passwall.po index f1961dacb2..a255879f5c 100644 --- a/small/luci-app-passwall/po/zh-cn/passwall.po +++ b/small/luci-app-passwall/po/zh-cn/passwall.po @@ -1896,11 +1896,9 @@ msgstr "仅支持一层代理。" msgid "" "Chained proxy works only with Xray or Sing-box nodes.
" -"The chained node must be the same type as your subscription node (Xray with Xray, Sing-box with Sing-box).
" "You can only use manual or imported nodes as chained nodes." msgstr "" "链式代理仅支持 Xray 与 Sing-box 节点。
" -"链式节点需与订阅节点类型一致(Xray 对应 Xray,Sing-box 对应 Sing-box)。
" "仅支持手动添加或导入的节点用作链式节点。" msgid "Only work with using the %s node." diff --git a/small/luci-app-passwall/root/usr/share/passwall/subscribe.lua b/small/luci-app-passwall/root/usr/share/passwall/subscribe.lua index 21a2ea0c29..5a54ad983b 100755 --- a/small/luci-app-passwall/root/usr/share/passwall/subscribe.lua +++ b/small/luci-app-passwall/root/usr/share/passwall/subscribe.lua @@ -1840,7 +1840,7 @@ local function update_node(manual) uci:set(appname, cfgid, "domain_strategy", domain_strategy_node) end -- 订阅组链式代理 - if chain_node_type ~= "" and kkk == "type" and vvv == chain_node_type then + if chain_node_type ~= "" and kkk == "type" and (vvv == "Xray" or vvv == "sing-box") then if preproxy_node_group ~="" then uci:set(appname, cfgid, "chain_proxy", "1") uci:set(appname, cfgid, "preproxy_node", preproxy_node_group) diff --git a/small/luci-app-passwall2/Makefile b/small/luci-app-passwall2/Makefile index d80ec312da..e255986bf9 100644 --- a/small/luci-app-passwall2/Makefile +++ b/small/luci-app-passwall2/Makefile @@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall2 -PKG_VERSION:=26.1.31 +PKG_VERSION:=26.2.5 PKG_RELEASE:=1 PKG_PO_VERSION:=$(PKG_VERSION) diff --git a/small/luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_subscribe_config.lua b/small/luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_subscribe_config.lua index 3ce7e39ac3..c63e6b9937 100644 --- a/small/luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_subscribe_config.lua +++ b/small/luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_subscribe_config.lua @@ -253,7 +253,6 @@ o:value("1", translate("Preproxy Node")) o:value("2", translate("Landing Node")) local descrStr = "Chained proxy works only with Xray or Sing-box nodes.
" -descrStr = descrStr .. "The chained node must be the same type as your subscription node (Xray with Xray, Sing-box with Sing-box).
" descrStr = descrStr .. "You can only use manual or imported nodes as chained nodes." descrStr = translate(descrStr) .. "
" .. translate("Only support a layer of proxy.") diff --git a/small/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ray.lua b/small/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ray.lua index acb4d0a348..6e953c6ff3 100644 --- a/small/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ray.lua +++ b/small/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ray.lua @@ -38,10 +38,6 @@ local ss_method_list = { local security_list = { "none", "auto", "aes-128-gcm", "chacha20-poly1305", "zero" } -local header_type_list = { - "none", "srtp", "utp", "wechat-video", "dtls", "wireguard", "dns" -} - local xray_version = api.get_app_version("xray") o = s:option(ListValue, _n("protocol"), translate("Protocol")) @@ -521,11 +517,17 @@ o:depends({ [_n("tcp_guise")] = "http" }) -- [[ mKCP ]]-- o = s:option(ListValue, _n("mkcp_guise"), translate("Camouflage Type"), translate('
none: default, no masquerade, data sent is packets with no characteristics.
srtp: disguised as an SRTP packet, it will be recognized as video call data (such as FaceTime).
utp: packets disguised as uTP will be recognized as bittorrent downloaded data.
wechat-video: packets disguised as WeChat video calls.
dtls: disguised as DTLS 1.2 packet.
wireguard: disguised as a WireGuard packet. (not really WireGuard protocol)
dns: Disguising traffic as DNS requests.')) -for a, t in ipairs(header_type_list) do o:value(t) end +o:value("none", "none") +o:value("header-srtp", "srtp") +o:value("header-utp", "utp") +o:value("header-wechat", "wechat-video") +o:value("header-dtls", "dtls") +o:value("header-wireguard", "wireguard") +o:value("header-dns", "dns") o:depends({ [_n("transport")] = "mkcp" }) o = s:option(Value, _n("mkcp_domain"), translate("Camouflage Domain"), translate("Use it together with the DNS disguised type. You can fill in any domain.")) -o:depends({ [_n("mkcp_guise")] = "dns" }) +o:depends({ [_n("mkcp_guise")] = "header-dns" }) o = s:option(Value, _n("mkcp_mtu"), translate("KCP MTU")) o.default = "1350" @@ -723,7 +725,7 @@ o2.template = appname .. "/cbi/nodes_listvalue" o2.group = {} for k, v in pairs(nodes_list) do - if v.type == "Xray" and v.id ~= arg[1] and (not v.chain_proxy or v.chain_proxy == "") then + if v.id ~= arg[1] and (not v.chain_proxy or v.chain_proxy == "") then o1:value(v.id, v.remark) o1.group[#o1.group+1] = (v.group and v.group ~= "") and v.group or translate("default") o2:value(v.id, v.remark) diff --git a/small/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/sing-box.lua b/small/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/sing-box.lua index 70fa2c2227..811426a78b 100644 --- a/small/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/sing-box.lua +++ b/small/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/sing-box.lua @@ -827,7 +827,7 @@ o2.template = appname .. "/cbi/nodes_listvalue" o2.group = {} for k, v in pairs(nodes_list) do - if v.type == "sing-box" and v.id ~= arg[1] and (not v.chain_proxy or v.chain_proxy == "") then + if v.id ~= arg[1] and (not v.chain_proxy or v.chain_proxy == "") then o1:value(v.id, v.remark) o1.group[#o1.group+1] = (v.group and v.group ~= "") and v.group or translate("default") o2:value(v.id, v.remark) diff --git a/small/luci-app-passwall2/luasrc/model/cbi/passwall2/server/type/ray.lua b/small/luci-app-passwall2/luasrc/model/cbi/passwall2/server/type/ray.lua index adceeeb938..c7c8939d0d 100644 --- a/small/luci-app-passwall2/luasrc/model/cbi/passwall2/server/type/ray.lua +++ b/small/luci-app-passwall2/luasrc/model/cbi/passwall2/server/type/ray.lua @@ -18,10 +18,6 @@ local x_ss_method_list = { "none", "plain", "aes-128-gcm", "aes-256-gcm", "chacha20-poly1305", "xchacha20-poly1305", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305" } -local header_type_list = { - "none", "srtp", "utp", "wechat-video", "dtls", "wireguard", "dns" -} - -- [[ Xray ]] s.fields["type"]:value(type_name, "Xray") @@ -322,11 +318,17 @@ o:depends({ [_n("tcp_guise")] = "http" }) -- [[ mKCP ]]-- o = s:option(ListValue, _n("mkcp_guise"), translate("Camouflage Type"), translate('
none: default, no masquerade, data sent is packets with no characteristics.
srtp: disguised as an SRTP packet, it will be recognized as video call data (such as FaceTime).
utp: packets disguised as uTP will be recognized as bittorrent downloaded data.
wechat-video: packets disguised as WeChat video calls.
dtls: disguised as DTLS 1.2 packet.
wireguard: disguised as a WireGuard packet. (not really WireGuard protocol)
dns: Disguising traffic as DNS requests.')) -for a, t in ipairs(header_type_list) do o:value(t) end +o:value("none", "none") +o:value("header-srtp", "srtp") +o:value("header-utp", "utp") +o:value("header-wechat", "wechat-video") +o:value("header-dtls", "dtls") +o:value("header-wireguard", "wireguard") +o:value("header-dns", "dns") o:depends({ [_n("transport")] = "mkcp" }) o = s:option(Value, _n("mkcp_domain"), translate("Camouflage Domain"), translate("Use it together with the DNS disguised type. You can fill in any domain.")) -o:depends({ [_n("mkcp_guise")] = "dns" }) +o:depends({ [_n("mkcp_guise")] = "header-dns" }) o = s:option(Value, _n("mkcp_mtu"), translate("KCP MTU")) o.default = "1350" diff --git a/small/luci-app-passwall2/luasrc/passwall2/util_sing-box.lua b/small/luci-app-passwall2/luasrc/passwall2/util_sing-box.lua index 0cde82ae13..fa0c9b5f09 100644 --- a/small/luci-app-passwall2/luasrc/passwall2/util_sing-box.lua +++ b/small/luci-app-passwall2/luasrc/passwall2/util_sing-box.lua @@ -1199,9 +1199,12 @@ function gen_config(var) else local preproxy_node = uci:get_all(appname, node.preproxy_node) if preproxy_node then - local preproxy_outbound = gen_outbound(nil, preproxy_node) + local preproxy_outbound = gen_outbound(node[".name"], preproxy_node) if preproxy_outbound then - preproxy_outbound.tag = preproxy_node[".name"] .. ":" .. preproxy_node.remarks + preproxy_outbound.tag = preproxy_node[".name"] + if preproxy_node.remarks then + preproxy_outbound.tag = preproxy_outbound.tag .. ":" .. preproxy_node.remarks + end outbound.tag = preproxy_outbound.tag .. " -> " .. outbound.tag outbound.detour = preproxy_outbound.tag last_insert_outbound = preproxy_outbound @@ -1213,16 +1216,47 @@ function gen_config(var) if node.chain_proxy == "2" and node.to_node then local to_node = uci:get_all(appname, node.to_node) if to_node then - local to_outbound = gen_outbound(nil, to_node) + local to_outbound + if to_node.type ~= "sing-box" then + local tag = to_node[".name"] + local new_port = api.get_new_port() + table.insert(inbounds, { + type = "direct", + tag = tag, + listen = "127.0.0.1", + listen_port = new_port, + override_address = to_node.address, + override_port = tonumber(to_node.port), + }) + table.insert(rules, 1, { + inbound = {tag}, + outbound = outbound.tag, + }) + if to_node.tls_serverName == nil then + to_node.tls_serverName = to_node.address + end + to_node.address = "127.0.0.1" + to_node.port = new_port + to_outbound = gen_outbound(node[".name"], to_node, tag, { + tag = tag, + run_socks_instance = not no_run + }) + else + to_outbound = gen_outbound(node[".name"], to_node) + end if to_outbound then if shunt_rule_name then to_outbound.tag = outbound.tag outbound.tag = node[".name"] else + if to_node.remarks then + to_outbound.tag = to_outbound.tag .. ":" .. to_node.remarks + end to_outbound.tag = outbound.tag .. " -> " .. to_outbound.tag end - - to_outbound.detour = outbound.tag + if to_node.type == "sing-box" then + to_outbound.detour = outbound.tag + end table.insert(outbounds_table, to_outbound) default_outTag = to_outbound.tag end @@ -1231,9 +1265,9 @@ function gen_config(var) return default_outTag, last_insert_outbound end - if node.protocol == "_shunt" then - local rules = {} + rules = {} + if node.protocol == "_shunt" then local preproxy_rule_name = node.preproxy_enabled == "1" and "main" or nil local preproxy_tag = preproxy_rule_name local preproxy_node_id = preproxy_rule_name and node["main_node"] or nil @@ -1548,10 +1582,6 @@ function gen_config(var) table.insert(rules, rule) end end) - - for index, value in ipairs(rules) do - table.insert(route.rules, rules[index]) - end elseif node.protocol == "_urltest" then if node.urltest_node then COMMON.default_outbound_tag = gen_urltest(node) @@ -1579,6 +1609,10 @@ function gen_config(var) end end end + + for index, value in ipairs(rules) do + table.insert(route.rules, rules[index]) + end end if COMMON.default_outbound_tag then diff --git a/small/luci-app-passwall2/luasrc/passwall2/util_xray.lua b/small/luci-app-passwall2/luasrc/passwall2/util_xray.lua index efa3d4c8eb..80edc8ebb1 100644 --- a/small/luci-app-passwall2/luasrc/passwall2/util_xray.lua +++ b/small/luci-app-passwall2/luasrc/passwall2/util_xray.lua @@ -198,12 +198,7 @@ function gen_outbound(flag, node, tag, proxy_table) downlinkCapacity = tonumber(node.mkcp_downlinkCapacity), congestion = (node.mkcp_congestion == "1") and true or false, readBufferSize = tonumber(node.mkcp_readBufferSize), - writeBufferSize = tonumber(node.mkcp_writeBufferSize), - seed = (node.mkcp_seed and node.mkcp_seed ~= "") and node.mkcp_seed or nil, - header = { - type = node.mkcp_guise, - domain = node.mkcp_domain - } + writeBufferSize = tonumber(node.mkcp_writeBufferSize) } or nil, wsSettings = (node.transport == "ws") and { path = node.ws_path or "/", @@ -284,7 +279,24 @@ function gen_outbound(flag, node, tag, proxy_table) end)(), disablePathMTUDiscovery = (node.hysteria2_disable_mtu_discovery) and true or false } or nil, - finalmask = (node.transport == "hysteria" and node.hysteria2_obfs_type and node.hysteria2_obfs_type ~= "") and { + finalmask = (node.transport == "mkcp") and { + udp = (function() + local t = {} + if node.mkcp_guise and node.mkcp_guise ~= "none" then + local g = { type = node.mkcp_guise } + if node.mkcp_guise == "header-dns" and node.mkcp_domain and node.mkcp_domain ~= "" then + g.settings = { domain = node.mkcp_domain } + end + t[#t + 1] = g + end + local c = { type = (node.mkcp_seed and node.mkcp_seed ~= "") and "mkcp-aes128gcm" or "mkcp-original" } + if node.mkcp_seed and node.mkcp_seed ~= "" then + c.settings = { password = node.mkcp_seed } + end + t[#t + 1] = c + return t + end)() + } or (node.transport == "hysteria" and node.hysteria2_obfs_type and node.hysteria2_obfs_type ~= "") and { udp = { { type = node.hysteria2_obfs_type, @@ -558,12 +570,7 @@ function gen_config_server(node) downlinkCapacity = tonumber(node.mkcp_downlinkCapacity), congestion = (node.mkcp_congestion == "1") and true or false, readBufferSize = tonumber(node.mkcp_readBufferSize), - writeBufferSize = tonumber(node.mkcp_writeBufferSize), - seed = (node.mkcp_seed and node.mkcp_seed ~= "") and node.mkcp_seed or nil, - header = { - type = node.mkcp_guise, - domain = node.mkcp_domain - } + writeBufferSize = tonumber(node.mkcp_writeBufferSize) } or nil, wsSettings = (node.transport == "ws") and { host = node.ws_host or nil, @@ -582,6 +589,24 @@ function gen_config_server(node) maxUploadSize = node.xhttp_maxuploadsize, maxConcurrentUploads = node.xhttp_maxconcurrentuploads } or nil, + finalmask = (node.transport == "mkcp") and { + udp = (function() + local t = {} + if node.mkcp_guise and node.mkcp_guise ~= "none" then + local g = { type = node.mkcp_guise } + if node.mkcp_guise == "header-dns" and node.mkcp_domain and node.mkcp_domain ~= "" then + g.settings = { domain = node.mkcp_domain } + end + t[#t + 1] = g + end + local c = { type = (node.mkcp_seed and node.mkcp_seed ~= "") and "mkcp-aes128gcm" or "mkcp-original" } + if node.mkcp_seed and node.mkcp_seed ~= "" then + c.settings = { password = node.mkcp_seed } + end + t[#t + 1] = c + return t + end)() + } or nil, sockopt = { acceptProxyProtocol = (node.acceptProxyProtocol and node.acceptProxyProtocol == "1") and true or false } @@ -900,9 +925,12 @@ function gen_config(var) else local preproxy_node = uci:get_all(appname, node.preproxy_node) if preproxy_node then - local preproxy_outbound = gen_outbound(nil, preproxy_node) + local preproxy_outbound = gen_outbound(node[".name"], preproxy_node) if preproxy_outbound then - preproxy_outbound.tag = preproxy_node[".name"] .. ":" .. preproxy_node.remarks + preproxy_outbound.tag = preproxy_node[".name"] + if preproxy_node.remarks then + preproxy_outbound.tag = preproxy_outbound.tag .. ":" .. preproxy_node.remarks + end outbound.tag = preproxy_outbound.tag .. " -> " .. outbound.tag outbound.proxySettings = { tag = preproxy_outbound.tag, @@ -917,19 +945,49 @@ function gen_config(var) if node.chain_proxy == "2" and node.to_node then local to_node = uci:get_all(appname, node.to_node) if to_node then - local to_outbound = gen_outbound(nil, to_node) + local to_outbound + if to_node.type ~= "Xray" then + local tag = to_node[".name"] + local new_port = api.get_new_port() + table.insert(inbounds, { + tag = tag, + listen = "127.0.0.1", + port = new_port, + protocol = "dokodemo-door", + settings = {network = "tcp,udp", address = to_node.address, port = tonumber(to_node.port)} + }) + if to_node.tls_serverName == nil then + to_node.tls_serverName = to_node.address + end + to_node.address = "127.0.0.1" + to_node.port = new_port + table.insert(rules, 1, { + inboundTag = {tag}, + outboundTag = outbound.tag + }) + to_outbound = gen_outbound(node[".name"], to_node, tag, { + tag = tag, + run_socks_instance = not no_run + }) + else + to_outbound = gen_outbound(node[".name"], to_node) + end if to_outbound then if shunt_rule_name then to_outbound.tag = outbound.tag outbound.tag = node[".name"] else + if to_node.remarks then + to_outbound.tag = to_outbound.tag .. ":" .. to_node.remarks + end to_outbound.tag = outbound.tag .. " -> " .. to_outbound.tag end - - to_outbound.proxySettings = { - tag = outbound.tag, - transportLayer = true - } + if to_node.type == "Xray" then + to_outbound.proxySettings = { + tag = outbound.tag, + transportLayer = true + } + end table.insert(outbounds_table, to_outbound) default_outTag = to_outbound.tag end @@ -1271,7 +1329,7 @@ function gen_config(var) routing = { domainStrategy = "AsIs", domainMatcher = "hybrid", - rules = {} + rules = rules } table.insert(routing.rules, { ruleTag = "default", diff --git a/small/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_listvalue_com.htm b/small/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_listvalue_com.htm index e2ec33b464..9de708e5f7 100644 --- a/small/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_listvalue_com.htm +++ b/small/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_listvalue_com.htm @@ -161,49 +161,31 @@ return cssRules.filter(Boolean).join(' ') } - function lv_parseColorToRgba(color) { - if (!color) return null; - - const ctx = document.createElement('canvas').getContext('2d'); - if (!ctx) return null; - - ctx.fillStyle = color; - const computedColor = ctx.fillStyle; - // Match #RRGGBB or #RRGGBBAA format - if (computedColor.startsWith('#')) { - const hex = computedColor.substring(1); - // #RRGGBB (6 digits) - if (hex.length === 6) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: 1 - }; - } - // #RRGGBBAA (8 digits) - if (hex.length === 8) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: parseInt(hex.substring(6, 8), 16) / 255 - }; - } - } - // Match rgba() or rgb() format (for browsers that return this format) - const rgbaMatch = computedColor.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)$/); - if (rgbaMatch) { - return { - r: parseInt(rgbaMatch[1], 10), - g: parseInt(rgbaMatch[2], 10), - b: parseInt(rgbaMatch[3], 10), - a: rgbaMatch[4] !== undefined ? parseFloat(rgbaMatch[4]) : 1 - }; - } - - return null; // Invalid color - } + const lv_parseColorToRgba = (function() { + // Create canvas and context once (Closure) + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d', { willReadFrequently: true }); + return function(colorStr) { + if (!colorStr) + return null; + ctx.clearRect(0, 0, 1, 1); + // 2. Apply the color + ctx.fillStyle = colorStr; + // 3. Fill a single pixel + ctx.fillRect(0, 0, 1, 1); + // 4. Extract pixel data [R, G, B, A] + const data = ctx.getImageData(0, 0, 1, 1).data; + return { + r: data[0], + g: data[1], + b: data[2], + // Convert alpha from 0-255 to 0-1 (rounded to 3 decimal places) + a: Math.round((data[3] / 255) * 1000) / 1000 + }; + }; + })(); // Helper to convert back to Hex (for output consistency) function lv_rgbToHex(r, g, b) { diff --git a/small/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_multivalue_com.htm b/small/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_multivalue_com.htm index 275cb73db6..646f691b48 100644 --- a/small/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_multivalue_com.htm +++ b/small/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_multivalue_com.htm @@ -117,49 +117,31 @@ return cssRules.filter(Boolean).join(' ') } - function mv_parseColorToRgba(color) { - if (!color) return null; - - const ctx = document.createElement('canvas').getContext('2d'); - if (!ctx) return null; - - ctx.fillStyle = color; - const computedColor = ctx.fillStyle; - // Match #RRGGBB or #RRGGBBAA format - if (computedColor.startsWith('#')) { - const hex = computedColor.substring(1); - // #RRGGBB (6 digits) - if (hex.length === 6) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: 1 - }; - } - // #RRGGBBAA (8 digits) - if (hex.length === 8) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: parseInt(hex.substring(6, 8), 16) / 255 - }; - } - } - // Match rgba() or rgb() format (for browsers that return this format) - const rgbaMatch = computedColor.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)$/); - if (rgbaMatch) { - return { - r: parseInt(rgbaMatch[1], 10), - g: parseInt(rgbaMatch[2], 10), - b: parseInt(rgbaMatch[3], 10), - a: rgbaMatch[4] !== undefined ? parseFloat(rgbaMatch[4]) : 1 - }; - } - - return null; // Invalid color - } + const mv_parseColorToRgba = (function() { + // Create canvas and context once (Closure) + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d', { willReadFrequently: true }); + return function(colorStr) { + if (!colorStr) + return null; + ctx.clearRect(0, 0, 1, 1); + // 2. Apply the color + ctx.fillStyle = colorStr; + // 3. Fill a single pixel + ctx.fillRect(0, 0, 1, 1); + // 4. Extract pixel data [R, G, B, A] + const data = ctx.getImageData(0, 0, 1, 1).data; + return { + r: data[0], + g: data[1], + b: data[2], + // Convert alpha from 0-255 to 0-1 (rounded to 3 decimal places) + a: Math.round((data[3] / 255) * 1000) / 1000 + }; + }; + })(); // Helper to convert back to Hex (for output consistency) function mv_rgbToHex(r, g, b) { diff --git a/small/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_value_com.htm b/small/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_value_com.htm index b49ba9d7b2..1f784d04b2 100644 --- a/small/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_value_com.htm +++ b/small/luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_value_com.htm @@ -156,49 +156,31 @@ return cssRules.filter(Boolean).join(' ') } - function v_parseColorToRgba(color) { - if (!color) return null; - - const ctx = document.createElement('canvas').getContext('2d'); - if (!ctx) return null; - - ctx.fillStyle = color; - const computedColor = ctx.fillStyle; - // Match #RRGGBB or #RRGGBBAA format - if (computedColor.startsWith('#')) { - const hex = computedColor.substring(1); - // #RRGGBB (6 digits) - if (hex.length === 6) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: 1 - }; - } - // #RRGGBBAA (8 digits) - if (hex.length === 8) { - return { - r: parseInt(hex.substring(0, 2), 16), - g: parseInt(hex.substring(2, 4), 16), - b: parseInt(hex.substring(4, 6), 16), - a: parseInt(hex.substring(6, 8), 16) / 255 - }; - } - } - // Match rgba() or rgb() format (for browsers that return this format) - const rgbaMatch = computedColor.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)$/); - if (rgbaMatch) { - return { - r: parseInt(rgbaMatch[1], 10), - g: parseInt(rgbaMatch[2], 10), - b: parseInt(rgbaMatch[3], 10), - a: rgbaMatch[4] !== undefined ? parseFloat(rgbaMatch[4]) : 1 - }; - } - - return null; // Invalid color - } + const v_parseColorToRgba = (function() { + // Create canvas and context once (Closure) + const canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext('2d', { willReadFrequently: true }); + return function(colorStr) { + if (!colorStr) + return null; + ctx.clearRect(0, 0, 1, 1); + // 2. Apply the color + ctx.fillStyle = colorStr; + // 3. Fill a single pixel + ctx.fillRect(0, 0, 1, 1); + // 4. Extract pixel data [R, G, B, A] + const data = ctx.getImageData(0, 0, 1, 1).data; + return { + r: data[0], + g: data[1], + b: data[2], + // Convert alpha from 0-255 to 0-1 (rounded to 3 decimal places) + a: Math.round((data[3] / 255) * 1000) / 1000 + }; + }; + })(); // Helper to convert back to Hex (for output consistency) function v_rgbToHex(r, g, b) { diff --git a/small/luci-app-passwall2/luasrc/view/passwall2/haproxy/js.htm b/small/luci-app-passwall2/luasrc/view/passwall2/haproxy/js.htm index 94c4ae6e43..ec4e3c289b 100644 --- a/small/luci-app-passwall2/luasrc/view/passwall2/haproxy/js.htm +++ b/small/luci-app-passwall2/luasrc/view/passwall2/haproxy/js.htm @@ -21,6 +21,11 @@ table .cbi-button-down { line-height: inherit; user-select: none; align-self: stretch; + background-color: transparent; +} + +.drag-handle:hover { + background: transparent; } .dragging-row { diff --git a/small/luci-app-passwall2/luasrc/view/passwall2/node_list/link_add_node.htm b/small/luci-app-passwall2/luasrc/view/passwall2/node_list/link_add_node.htm index 5da8b889c2..aa9b6942ab 100644 --- a/small/luci-app-passwall2/luasrc/view/passwall2/node_list/link_add_node.htm +++ b/small/luci-app-passwall2/luasrc/view/passwall2/node_list/link_add_node.htm @@ -457,8 +457,7 @@ local api = require "luci.passwall2.api" background: #fff; cursor: pointer; box-sizing: border-box; - display: flex; - align-items: center; + display: block; } .selected-display { @@ -469,23 +468,21 @@ local api = require "luci.passwall2.api" width: 100%; height: 100%; box-sizing: border-box; + font-size: 12px; + color: #666; } .selected-display:hover { background-color: #f7f7f7; } - .selected-display { - font-size: 12px; - color: #666; - } - .dropdown-list { position: absolute; - top: 100%; - left: 0; - width: 180px; + top: calc(100% + 2px); + left: -1px; + width: calc(100% + 2px); border: 1px solid #d9d9d9; + border-radius: 2px; border-top: none; box-shadow: 0 1px 3px rgba(0,0,0,0.15); background: #fff; @@ -497,6 +494,7 @@ local api = require "luci.passwall2.api" overflow-x: hidden; z-index: 100; box-sizing: border-box; + color: #666; } .dropdown-item { diff --git a/small/luci-app-passwall2/luasrc/view/passwall2/node_list/node_list.htm b/small/luci-app-passwall2/luasrc/view/passwall2/node_list/node_list.htm index 0de6458425..a1cc1c1ba8 100644 --- a/small/luci-app-passwall2/luasrc/view/passwall2/node_list/node_list.htm +++ b/small/luci-app-passwall2/luasrc/view/passwall2/node_list/node_list.htm @@ -87,6 +87,11 @@ table td, .table .td { line-height: inherit; user-select: none; align-self: stretch; + background-color: transparent; +} + +.node-wrapper .drag-handle:hover { + background: transparent; } #cbi-<%=appname%>-nodes .pw-checkbox, #cbi-<%=appname%>-nodes th:nth-child(1) { @@ -1061,9 +1066,11 @@ table td, .table .td {
-
-
<%:You choose node is:%>
-
+
+
+ <%:You choose node is:%> +
+
<%- if default_node_type == "_shunt" then for i, v in ipairs(shunt_rule_list) do -%> diff --git a/small/luci-app-passwall2/luasrc/view/passwall2/node_subscribe/js.htm b/small/luci-app-passwall2/luasrc/view/passwall2/node_subscribe/js.htm index 4fb2293c17..963603fcff 100644 --- a/small/luci-app-passwall2/luasrc/view/passwall2/node_subscribe/js.htm +++ b/small/luci-app-passwall2/luasrc/view/passwall2/node_subscribe/js.htm @@ -21,6 +21,11 @@ table .cbi-button-down { line-height: inherit; user-select: none; align-self: stretch; + background-color: transparent; +} + +.drag-handle:hover { + background: transparent; } .dragging-row { diff --git a/small/luci-app-passwall2/luasrc/view/passwall2/rule/rule_version.htm b/small/luci-app-passwall2/luasrc/view/passwall2/rule/rule_version.htm index 642d67efd3..feca74b106 100644 --- a/small/luci-app-passwall2/luasrc/view/passwall2/rule/rule_version.htm +++ b/small/luci-app-passwall2/luasrc/view/passwall2/rule/rule_version.htm @@ -29,6 +29,11 @@ local has_old_geosite = fs.access("/tmp/bak_v2ray/geosite.dat") line-height: inherit; user-select: none; align-self: stretch; + background-color: transparent; + } + + .drag-handle:hover { + background: transparent; } .dragging-row { diff --git a/small/luci-app-passwall2/po/zh-cn/passwall2.po b/small/luci-app-passwall2/po/zh-cn/passwall2.po index dc46277f5e..f1657ff7e2 100644 --- a/small/luci-app-passwall2/po/zh-cn/passwall2.po +++ b/small/luci-app-passwall2/po/zh-cn/passwall2.po @@ -1722,11 +1722,9 @@ msgstr "仅支持一层代理。" msgid "" "Chained proxy works only with Xray or Sing-box nodes.
" -"The chained node must be the same type as your subscription node (Xray with Xray, Sing-box with Sing-box).
" "You can only use manual or imported nodes as chained nodes." msgstr "" "链式代理仅支持 Xray 与 Sing-box 节点。
" -"链式节点需与订阅节点类型一致(Xray 对应 Xray,Sing-box 对应 Sing-box)。
" "仅支持手动添加或导入的节点用作链式节点。" msgid "Set the default domain resolution strategy for the sing-box node." diff --git a/small/luci-app-passwall2/po/zh-tw/passwall2.po b/small/luci-app-passwall2/po/zh-tw/passwall2.po index 9706ecf039..503f7b00eb 100644 --- a/small/luci-app-passwall2/po/zh-tw/passwall2.po +++ b/small/luci-app-passwall2/po/zh-tw/passwall2.po @@ -1722,11 +1722,9 @@ msgstr "仅支持一層代理。" msgid "" "Chained proxy works only with Xray or Sing-box nodes.
" -"The chained node must be the same type as your subscription node (Xray with Xray, Sing-box with Sing-box).
" "You can only use manual or imported nodes as chained nodes." msgstr "" "鏈式代理仅支持 Xray 与 Sing-box 節點。
" -"鏈式節點需与訂閱節點類型一致(Xray 對應 Xray,Sing-box 對應 Sing-box)。
" "仅支持手動添加或導入的節點用作鏈式節點。" msgid "Set the default domain resolution strategy for the sing-box node." diff --git a/small/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua b/small/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua index 683c234339..1bdbea69ad 100755 --- a/small/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua +++ b/small/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua @@ -1828,7 +1828,7 @@ local function update_node(manual) uci:set(appname, cfgid, "domain_strategy", domain_strategy_node) end -- Subscription Group Chain Agent - if chain_node_type ~= "" and kkk == "type" and vvv == chain_node_type then + if chain_node_type ~= "" and kkk == "type" and (vvv == "Xray" or vvv == "sing-box") then if preproxy_node_group ~="" then uci:set(appname, cfgid, "chain_proxy", "1") uci:set(appname, cfgid, "preproxy_node", preproxy_node_group) diff --git a/small/luci-app-ssr-plus/root/etc/uci-defaults/luci-ssr-plus b/small/luci-app-ssr-plus/root/etc/uci-defaults/luci-ssr-plus index 00fa6ff860..5f54eb9974 100755 --- a/small/luci-app-ssr-plus/root/etc/uci-defaults/luci-ssr-plus +++ b/small/luci-app-ssr-plus/root/etc/uci-defaults/luci-ssr-plus @@ -14,7 +14,7 @@ uci -q batch <<-EOF set firewall.shadowsocksr=include set firewall.shadowsocksr.type=script set firewall.shadowsocksr.path=/var/etc/shadowsocksr.include - set firewall.shadowsocksr.reload=1 + $(command -v fw4 >/dev/null 2>&1 || echo "set firewall.shadowsocksr.reload=1") commit firewall EOF diff --git a/small/luci-app-ssr-plus/root/usr/bin/ssr-rules b/small/luci-app-ssr-plus/root/usr/bin/ssr-rules index f7f9ae46f4..a43d1267cf 100755 --- a/small/luci-app-ssr-plus/root/usr/bin/ssr-rules +++ b/small/luci-app-ssr-plus/root/usr/bin/ssr-rules @@ -340,8 +340,8 @@ ipset_nft() { done # Bulk import china ip list safely (avoid huge single element limitation) - if [ -f "${china_ip:=/etc/ssrplus/china_ssr.txt}" ]; then - $NFT add element inet ss_spec china "{ $(tr '\n' ',' < "${china_ip}" | sed 's/,$//') }" 2>/dev/null + if [ -f "$IGNORE_LIST" ]; then + SKIP_INET=1 /usr/share/shadowsocksr/chinaipset.sh "$IGNORE_LIST" fi # Bulk import xhttp ip list into nft whitelist (server + shunt) @@ -907,8 +907,8 @@ tp_rule_nft() { done # Bulk import china ip list safely (avoid huge single element limitation) - if [ -f "${china_ip:=/etc/ssrplus/china_ssr.txt}" ]; then - $NFT add element ip ss_spec_mangle china "{ $(tr '\n' ',' < "${china_ip}" | sed 's/,$//') }" 2>/dev/null + if [ -f "$IGNORE_LIST" ]; then + SKIP_INET=2 /usr/share/shadowsocksr/chinaipset.sh "$IGNORE_LIST" fi # Bulk import xhttp ip list into nft whitelist (server + shunt) diff --git a/small/luci-app-ssr-plus/root/usr/share/shadowsocksr/chinaipset.sh b/small/luci-app-ssr-plus/root/usr/share/shadowsocksr/chinaipset.sh index 4015644f92..48164d1cbe 100755 --- a/small/luci-app-ssr-plus/root/usr/share/shadowsocksr/chinaipset.sh +++ b/small/luci-app-ssr-plus/root/usr/share/shadowsocksr/chinaipset.sh @@ -1,7 +1,53 @@ #!/bin/sh -[ -f "$1" ] && china_ip=$1 -ipset -! flush china 2>/dev/null -ipset -! -R <<-EOF || exit 1 - create china hash:net - $(cat ${china_ip:=/etc/ssrplus/china_ssr.txt} | sed -e "s/^/add china /") -EOF + +. $IPKG_INSTROOT/etc/init.d/shadowsocksr + +check_run_environment + +# 设置 china_ip 变量并检查文件是否存在 +china_ip="${1:-${china_ip:-/etc/ssrplus/china_ssr.txt}}" +[ -f "$china_ip" ] || exit 1 + +case "$USE_TABLES" in + nftables) + skip_inet="${SKIP_INET:-0}" + + case "$skip_inet" in + 1) + { + # ss_spec / inet (仅在表和 set 存在时添加) + if nft list set inet ss_spec china >/dev/null 2>&1; then + echo "add element inet ss_spec china {" + grep -vE '^\s*#|^\s*$' "$china_ip" | sed 's/^/ /;s/$/,/' + echo "}" + fi + } | nft -f - || exit 1 + ;; + 2) + { + # ss_spec_mangle / ip (仅在表和 set 存在时添加) + if nft list set ip ss_spec_mangle china >/dev/null 2>&1; then + echo "add element ip ss_spec_mangle china {" + grep -vE '^\s*#|^\s*$' "$china_ip" | sed 's/^/ /;s/$/,/' + echo "}" + fi + } | nft -f - || exit 1 + ;; + *) + echolog "chinaipset: invalid SKIP_INET=$skip_inet" + exit 1 + ;; + esac + ;; + iptables) + ipset -! flush china 2>/dev/null + ipset -! -R <<-EOF || exit 1 + create china hash:net + $(grep -vE '^\s*#|^\s*$' "$china_ip" | sed 's/^/add china /') + EOF + ;; + *) + echolog "ERROR: No supported firewall backend detected" + exit 1 + ;; +esac diff --git a/small/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua b/small/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua index 648ab8cef2..26e35b720f 100755 --- a/small/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua +++ b/small/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua @@ -410,12 +410,14 @@ end keepAlivePeriod = (server.flag_quicparam == "1" and server.keepaliveperiod) and tonumber(server.keepaliveperiod) or nil, disablePathMTUDiscovery = (server.flag_quicparam == "1" and tostring(server.disablepathmtudiscovery) == "1") and true or nil } or nil, - udpmasks = (server.flag_obfs == "1" and (server.v2ray_protocol == "hysteria2" and server.obfs_type and server.obfs_type ~= "")) and { - { - type = server.obfs_type, - settings = server.salamander and { - password = server.salamander - } or nil + finalmask = (server.flag_obfs == "1" and (server.v2ray_protocol == "hysteria2" and server.obfs_type and server.obfs_type ~= "")) and { + udp = { + { + type = server.obfs_type, + settings = server.salamander and { + password = server.salamander + } or nil + } } } or nil, sockopt = { diff --git a/small/luci-app-ssr-plus/root/usr/share/shadowsocksr/gfw2ipset.sh b/small/luci-app-ssr-plus/root/usr/share/shadowsocksr/gfw2ipset.sh index 87e760b5ba..676732af08 100755 --- a/small/luci-app-ssr-plus/root/usr/share/shadowsocksr/gfw2ipset.sh +++ b/small/luci-app-ssr-plus/root/usr/share/shadowsocksr/gfw2ipset.sh @@ -21,7 +21,7 @@ esac netflix() { local port="$1" - if [ "$run_mode" = "gfw" ] && [ -f "$TMP_DNSMASQ_PATH/gfw_list.conf" ] && [ -s /etc/ssrplus/netflix.list ]; then + if [ -f "$TMP_DNSMASQ_PATH/gfw_list.conf" ] && [ -s /etc/ssrplus/netflix.list ]; then grep -vE '^\s*#|^\s*$' /etc/ssrplus/netflix.list > /tmp/ssrplus_netflix.list.clean if [ -s /tmp/ssrplus_netflix.list.clean ]; then grep -v -F -f /tmp/ssrplus_netflix.list.clean "$TMP_DNSMASQ_PATH/gfw_list.conf" > "$TMP_DNSMASQ_PATH/gfw_list.conf.tmp" @@ -46,34 +46,16 @@ run_mode=$(uci_get_by_type global run_mode router) if [ "$run_mode" = "oversea" ]; then cp -rf /etc/ssrplus/oversea_list.conf $TMP_DNSMASQ_PATH/ -elif [ "$run_mode" = "gfw" ]; then +else cp -rf /etc/ssrplus/gfw_list.conf $TMP_DNSMASQ_PATH/ cp -rf /etc/ssrplus/gfw_base.conf $TMP_DNSMASQ_PATH/ +fi - if [ "$nft_support" = "1" ]; then - # 移除 ipset - for conf_file in gfw_base.conf gfw_list.conf; do - if [ -f "$TMP_DNSMASQ_PATH/$conf_file" ]; then - sed -i 's|ipset=/\([^/]*\)/\([^[:space:]]*\)|nftset=/\1/inet#ss_spec#\2|g' "$TMP_DNSMASQ_PATH/$conf_file" - fi - done - fi - - # 仅在 gfw 模式下才需要从 gfw 列表中移除黑名单/白名单/拒绝列表的域名 - # 此处使用 for 方式读取 防止 /etc/ssrplus/ 目录下的 black.list white.list deny.list 等2个或多个文件一行中存在空格 比如:# abc.com 而丢失:server - # Optimize: Batch filter using grep - for list_file in /etc/ssrplus/black.list /etc/ssrplus/white.list /etc/ssrplus/deny.list; do - if [ -s "$list_file" ]; then - grep -vE '^\s*#|^\s*$' "$list_file" > "${list_file}.clean" - if [ -s "${list_file}.clean" ]; then - for target_file in "$TMP_DNSMASQ_PATH/gfw_list.conf" "$TMP_DNSMASQ_PATH/gfw_base.conf"; do - if [ -f "$target_file" ]; then - grep -v -F -f "${list_file}.clean" "$target_file" > "${target_file}.tmp" - mv "${target_file}.tmp" "$target_file" - fi - done - fi - rm -f "${list_file}.clean" +if [ "$nft_support" = "1" ]; then + # 移除 ipset + for conf_file in gfw_base.conf gfw_list.conf; do + if [ -f "$TMP_DNSMASQ_PATH/$conf_file" ]; then + sed -i 's|ipset=/\([^/]*\)/\([^[:space:]]*\)|nftset=/\1/inet#ss_spec#\2|g' "$TMP_DNSMASQ_PATH/$conf_file" fi done fi @@ -97,6 +79,23 @@ $(uci_get_by_type global global_server nil) | $switch_server | same) ;; esac +# 此处使用 for 方式读取 防止 /etc/ssrplus/ 目录下的 black.list white.list deny.list 等2个或多个文件一行中存在空格 比如:# abc.com 而丢失:server +# Optimize: Batch filter using grep +for list_file in /etc/ssrplus/black.list /etc/ssrplus/white.list /etc/ssrplus/deny.list; do + if [ -s "$list_file" ]; then + grep -vE '^\s*#|^\s*$' "$list_file" > "${list_file}.clean" + if [ -s "${list_file}.clean" ]; then + for target_file in "$TMP_DNSMASQ_PATH/gfw_list.conf" "$TMP_DNSMASQ_PATH/gfw_base.conf"; do + if [ -f "$target_file" ]; then + grep -v -F -f "${list_file}.clean" "$target_file" > "${target_file}.tmp" + mv "${target_file}.tmp" "$target_file" + fi + done + fi + rm -f "${list_file}.clean" + fi +done + # 此处直接使用 cat 因为有 sed '/#/d' 删除了 数据 if [ "$nft_support" = "1" ]; then cat /etc/ssrplus/black.list | sed '/^$/d' | sed '/#/d' | sed "/.*/s/.*/server=\/&\/127.0.0.1#$dns_port\nnftset=\/&\/inet#ss_spec#blacklist/" >$TMP_DNSMASQ_PATH/blacklist_forward.conf diff --git a/small/v2ray-geodata/Makefile b/small/v2ray-geodata/Makefile index 5c2f3db2e5..4980eb6144 100644 --- a/small/v2ray-geodata/Makefile +++ b/small/v2ray-geodata/Makefile @@ -21,22 +21,22 @@ define Download/geoip HASH:=838ab094bc01b9bafc849ce70c6f439dcb158d0c0dd41441ddb3c38d4d9ef563 endef -GEOSITE_VER:=20260205122100 +GEOSITE_VER:=20260206134541 GEOSITE_FILE:=dlc.dat.$(GEOSITE_VER) define Download/geosite URL:=https://github.com/v2fly/domain-list-community/releases/download/$(GEOSITE_VER)/ URL_FILE:=dlc.dat FILE:=$(GEOSITE_FILE) - HASH:=e70ba1606776ca9b77e817c147da2d174bc5a922cf789dd8fbc359840ec2f41d + HASH:=94a65265f9c7720c70d7c8a4aee0ef05e774d13ab22d7028cf726208cf3eb769 endef -GEOSITE_IRAN_VER:=202602020057 +GEOSITE_IRAN_VER:=202602061019 GEOSITE_IRAN_FILE:=iran.dat.$(GEOSITE_IRAN_VER) define Download/geosite-ir URL:=https://github.com/bootmortis/iran-hosted-domains/releases/download/$(GEOSITE_IRAN_VER)/ URL_FILE:=iran.dat FILE:=$(GEOSITE_IRAN_FILE) - HASH:=be8fa3fa6279f27f74cb077c224d7f52978b1a27c3ba5b3363611d0bf51b27de + HASH:=101d6a57d6c315c422916dd85b17aeec7d4ed9302f742154fe07b24d1a0ec1c6 endef define Package/v2ray-geodata/template diff --git a/small/xray-core/Makefile b/small/xray-core/Makefile index dee1337554..683d988709 100644 --- a/small/xray-core/Makefile +++ b/small/xray-core/Makefile @@ -1,12 +1,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=xray-core -PKG_VERSION:=26.2.4 +PKG_VERSION:=26.2.6 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/XTLS/Xray-core/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=192200a0b60232a5fd7f63edf5dfa88ecb568f9b40049ca4676b6441f8da6eac +PKG_HASH:=a41f170a03fa25d9d39f23f344540b02336a5c893d97b1b837b9477f4b35bc7f PKG_MAINTAINER:=Tianling Shen PKG_LICENSE:=MPL-2.0 diff --git a/v2raya/.github/workflows/beta_release_main.yml b/v2raya/.github/workflows/beta_release_main.yml index 08ef29e809..d68f4388c3 100644 --- a/v2raya/.github/workflows/beta_release_main.yml +++ b/v2raya/.github/workflows/beta_release_main.yml @@ -9,18 +9,18 @@ on: jobs: Build_v2rayA_Web: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Set up Node.js shell: bash run: | eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" - brew install node@20 - echo "PATH=\"$(brew --prefix)/opt/node@20/bin:$PATH\"" >> $GITHUB_ENV - echo "PATH=\"$(brew --prefix)/opt/node@20/bin:$PATH\"" >> ~/.bash_profile + brew install node@24 + echo "PATH=\"$(brew --prefix)/opt/node@24/bin:$PATH\"" >> $GITHUB_ENV + echo "PATH=\"$(brew --prefix)/opt/node@24/bin:$PATH\"" >> ~/.bash_profile - name: Install Dependencies run: | sudo apt-get update -y && sudo apt-get install -y gzip @@ -48,7 +48,7 @@ jobs: NAME: v2raya DESC: "A web GUI client of Project V which supports VMess, VLESS, SS, SSR, Trojan, Tuic and Juicity protocols" steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Download Artifact @@ -133,7 +133,7 @@ jobs: runs-on: windows-latest needs: [Build_v2rayA_Binaries] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Check Version @@ -164,6 +164,7 @@ jobs: shell: pwsh run: | ## Create Destination Directory + $CurrentDir = Get-Location New-Item -ItemType Directory -Path "D:\v2raya-x86_64-windows\data" New-Item -ItemType Directory -Path "D:\v2raya-x86_64-windows\bin" New-Item -ItemType Directory -Path "D:\v2raya-arm64-windows\data" @@ -183,26 +184,19 @@ jobs: Expand-Archive -Path "D:\v2ray-windows-A64.zip" -DestinationPath "D:\v2raya-arm64-windows\bin\" Move-Item -Path "D:\v2raya-arm64-windows\bin\*.dat" -Destination "D:\v2raya-arm64-windows\data\" Remove-Item -Path "D:\v2raya-arm64-windows\bin\*.json" -Force -Recurse -ErrorAction SilentlyContinue - ## Download WinSW - ## WinSW said they have a native ARM64 version, but I cannot find it, so use net4 version instead on ARM-based Windows. - ## See more in "https://visualstudiomagazine.com/articles/2022/08/12/net-framework-4-8-1.aspx" - $Url_WinSW = "https://github.com/winsw/winsw/releases/download/v3.0.0-alpha.11/WinSW-net461.exe" - Invoke-WebRequest $Url_WinSW -OutFile "D:\WinSW.exe" - Copy-Item -Path "D:\WinSW.exe" -Destination "D:\v2raya-x86_64-windows\v2rayA-service.exe" - Copy-Item -Path "D:\WinSW.exe" -Destination "D:\v2raya-arm64-windows\v2rayA-service.exe" - ## Copy License and Service Config Copy-Item -Path ".\LICENSE" -Destination "D:\LICENSE.txt" - Copy-Item -Path ".\install\windows-inno\v2rayA-service.xml" -Destination "D:\v2raya-x86_64-windows\v2rayA-service.xml" - Copy-Item -Path ".\install\windows-inno\v2rayA-service.xml" -Destination "D:\v2raya-arm64-windows\v2rayA-service.xml" + Copy-Item -Path ".\install\windows-inno\ChineseSimplified.isl" -Destination "D:\ChineseSimplified.isl" ## Set Version - $(Get-Content -Path .\install\windows-inno\windows_x86_64.iss).replace("TheRealVersion", "${{ steps.prep.outputs.VERSION }}") | Out-File "D:\windows_x86_64.iss" - $(Get-Content -Path .\install\windows-inno\windows_arm64.iss).replace("TheRealVersion", "${{ steps.prep.outputs.VERSION }}") | Out-File "D:\windows_arm64.iss" + $((Get-Content -Path .\install\windows-inno\windows.iss).replace("TheRealVersion", "${{ steps.prep.outputs.VERSION }}")).Replace("TheRealArch", "x64compatible") | Out-File "D:\windows_x86_64.iss" + $((Get-Content -Path .\install\windows-inno\windows.iss).replace("TheRealVersion", "${{ steps.prep.outputs.VERSION }}")).Replace("TheRealArch", "arm64") | Out-File "D:\windows_arm64.iss" ## Build Installer + Set-Location -Path "D:\" & 'C:\Program Files (x86)\Inno Setup 6\ISCC.exe' "D:\windows_x86_64.iss" & 'C:\Program Files (x86)\Inno Setup 6\ISCC.exe' "D:\windows_arm64.iss" ## Rename to Friendly Name - Copy-Item -Path D:\installer_windows_inno_x64.exe -Destination .\installer_windows_inno_x64_${{ steps.prep.outputs.VERSION }}.exe - Copy-Item -Path D:\installer_windows_inno_arm64.exe -Destination .\installer_windows_inno_arm64_${{ steps.prep.outputs.VERSION }}.exe + cd $CurrentDir + Copy-Item -Path D:\installer_windows_inno_x64compatible.exe -Destination $CurrentDir\installer_windows_inno_x64_${{ steps.prep.outputs.VERSION }}.exe + Copy-Item -Path D:\installer_windows_inno_arm64.exe -Destination $CurrentDir\installer_windows_inno_arm64_${{ steps.prep.outputs.VERSION }}.exe - name: Upload Artifact uses: nanoufo/action-upload-artifacts-and-release-assets@v2 with: @@ -210,7 +204,7 @@ jobs: installer_windows_inno_x64_${{ steps.prep.outputs.VERSION }}.exe installer_windows_inno_arm64_${{ steps.prep.outputs.VERSION }}.exe Build_Linux_Packages: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest needs: [Build_v2rayA_Binaries] strategy: matrix: @@ -228,7 +222,7 @@ jobs: NAME: v2raya DESC: "A web GUI client of Project V which supports VMess, VLESS, SS, SSR, Trojan, Tuic and Juicity protocols" steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Get Friendly File Name @@ -334,10 +328,10 @@ jobs: path: | fpm_packages/* GitHub_Release: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest needs: [Build_v2rayA_Binaries, Build_Windows_Installers, Build_Linux_Packages] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Check Version diff --git a/v2raya/.github/workflows/pull_request.yml b/v2raya/.github/workflows/pull_request.yml index 97e15f4549..d4e9dc6c22 100644 --- a/v2raya/.github/workflows/pull_request.yml +++ b/v2raya/.github/workflows/pull_request.yml @@ -9,18 +9,18 @@ on: - ".github/workflows/*.yml" jobs: Build_v2rayA_Web: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Set up Node.js shell: bash run: | eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" - brew install node@20 - echo "PATH=\"$(brew --prefix)/opt/node@20/bin:$PATH\"" >> $GITHUB_ENV - echo "PATH=\"$(brew --prefix)/opt/node@20/bin:$PATH\"" >> ~/.bash_profile + brew install node@24 + echo "PATH=\"$(brew --prefix)/opt/node@24/bin:$PATH\"" >> $GITHUB_ENV + echo "PATH=\"$(brew --prefix)/opt/node@24/bin:$PATH\"" >> ~/.bash_profile - name: Install Dependencies run: | sudo apt-get update -y && sudo apt-get install -y gzip @@ -43,7 +43,7 @@ jobs: os: [ubuntu-latest, windows-latest, macos-latest] needs: Build_v2rayA_Web steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Download Artifact diff --git a/v2raya/.github/workflows/release_main.yml b/v2raya/.github/workflows/release_main.yml index 060b0b94f6..c8bfbdb7bd 100644 --- a/v2raya/.github/workflows/release_main.yml +++ b/v2raya/.github/workflows/release_main.yml @@ -10,16 +10,16 @@ jobs: Build_v2rayA_Web: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Set up Node.js shell: bash run: | eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" - brew install node@20 - echo "PATH=\"$(brew --prefix)/opt/node@20/bin:$PATH\"" >> $GITHUB_ENV - echo "PATH=\"$(brew --prefix)/opt/node@20/bin:$PATH\"" >> ~/.bash_profile + brew install node@24 + echo "PATH=\"$(brew --prefix)/opt/node@24/bin:$PATH\"" >> $GITHUB_ENV + echo "PATH=\"$(brew --prefix)/opt/node@24/bin:$PATH\"" >> ~/.bash_profile - name: Install Dependencies run: | sudo apt-get update -y && sudo apt-get install -y gzip @@ -47,7 +47,7 @@ jobs: NAME: v2raya DESC: "A web GUI client of Project V which supports VMess, VLESS, SS, SSR, Trojan, Tuic and Juicity protocols" steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Download Artifact @@ -132,7 +132,7 @@ jobs: runs-on: windows-latest needs: [Build_v2rayA_Binaries] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Check Version @@ -163,6 +163,7 @@ jobs: shell: pwsh run: | ## Create Destination Directory + $CurrentDir = Get-Location New-Item -ItemType Directory -Path "D:\v2raya-x86_64-windows\data" New-Item -ItemType Directory -Path "D:\v2raya-x86_64-windows\bin" New-Item -ItemType Directory -Path "D:\v2raya-arm64-windows\data" @@ -182,26 +183,19 @@ jobs: Expand-Archive -Path "D:\v2ray-windows-A64.zip" -DestinationPath "D:\v2raya-arm64-windows\bin\" Move-Item -Path "D:\v2raya-arm64-windows\bin\*.dat" -Destination "D:\v2raya-arm64-windows\data\" Remove-Item -Path "D:\v2raya-arm64-windows\bin\*.json" -Force -Recurse -ErrorAction SilentlyContinue - ## Download WinSW - ## WinSW said they have a native ARM64 version, but I cannot find it, so use net4 version instead on ARM-based Windows. - ## See more in "https://visualstudiomagazine.com/articles/2022/08/12/net-framework-4-8-1.aspx" - $Url_WinSW = "https://github.com/winsw/winsw/releases/download/v3.0.0-alpha.11/WinSW-net461.exe" - Invoke-WebRequest $Url_WinSW -OutFile "D:\WinSW.exe" - Copy-Item -Path "D:\WinSW.exe" -Destination "D:\v2raya-x86_64-windows\v2rayA-service.exe" - Copy-Item -Path "D:\WinSW.exe" -Destination "D:\v2raya-arm64-windows\v2rayA-service.exe" - ## Copy License and Service Config Copy-Item -Path ".\LICENSE" -Destination "D:\LICENSE.txt" - Copy-Item -Path ".\install\windows-inno\v2rayA-service.xml" -Destination "D:\v2raya-x86_64-windows\v2rayA-service.xml" - Copy-Item -Path ".\install\windows-inno\v2rayA-service.xml" -Destination "D:\v2raya-arm64-windows\v2rayA-service.xml" + Copy-Item -Path ".\install\windows-inno\ChineseSimplified.isl" -Destination "D:\ChineseSimplified.isl" ## Set Version - $(Get-Content -Path .\install\windows-inno\windows_x86_64.iss).replace("TheRealVersion", "${{ steps.prep.outputs.VERSION }}") | Out-File "D:\windows_x86_64.iss" - $(Get-Content -Path .\install\windows-inno\windows_arm64.iss).replace("TheRealVersion", "${{ steps.prep.outputs.VERSION }}") | Out-File "D:\windows_arm64.iss" + $((Get-Content -Path .\install\windows-inno\windows.iss).replace("TheRealVersion", "${{ steps.prep.outputs.VERSION }}")).Replace("TheRealArch", "x64compatible") | Out-File "D:\windows_x86_64.iss" + $((Get-Content -Path .\install\windows-inno\windows.iss).replace("TheRealVersion", "${{ steps.prep.outputs.VERSION }}")).Replace("TheRealArch", "arm64") | Out-File "D:\windows_arm64.iss" ## Build Installer + Set-Location -Path "D:\" & 'C:\Program Files (x86)\Inno Setup 6\ISCC.exe' "D:\windows_x86_64.iss" & 'C:\Program Files (x86)\Inno Setup 6\ISCC.exe' "D:\windows_arm64.iss" ## Rename to Friendly Name - Copy-Item -Path D:\installer_windows_inno_x64.exe -Destination .\installer_windows_inno_x64_${{ steps.prep.outputs.VERSION }}.exe - Copy-Item -Path D:\installer_windows_inno_arm64.exe -Destination .\installer_windows_inno_arm64_${{ steps.prep.outputs.VERSION }}.exe + cd $CurrentDir + Copy-Item -Path D:\installer_windows_inno_x64compatible.exe -Destination $CurrentDir\installer_windows_inno_x64_${{ steps.prep.outputs.VERSION }}.exe + Copy-Item -Path D:\installer_windows_inno_arm64.exe -Destination $CurrentDir\installer_windows_inno_arm64_${{ steps.prep.outputs.VERSION }}.exe - name: Upload Artifact uses: nanoufo/action-upload-artifacts-and-release-assets@v2 with: @@ -227,7 +221,7 @@ jobs: NAME: v2raya DESC: "A web GUI client of Project V which supports VMess, VLESS, SS, SSR, Trojan, Tuic and Juicity protocols" steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Get Friendly File Name @@ -336,7 +330,7 @@ jobs: runs-on: ubuntu-latest needs: [Build_v2rayA_Binaries, Build_Windows_Installers, Build_Linux_Packages] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Check Version @@ -399,7 +393,7 @@ jobs: runs-on: ubuntu-latest needs: [Build_v2rayA_Binaries] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Check Version @@ -453,7 +447,7 @@ jobs: runs-on: ubuntu-latest needs: [GitHub_Release] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Check Version @@ -504,7 +498,7 @@ jobs: runs-on: ubuntu-latest needs: [Build_v2rayA_Web] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Check Version @@ -556,7 +550,7 @@ jobs: runs-on: windows-latest needs: [GitHub_Release] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Check Version @@ -580,7 +574,7 @@ jobs: runs-on: ubuntu-latest needs: [GitHub_Release] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Check Version diff --git a/v2raya/.github/workflows/test_build_main.yml b/v2raya/.github/workflows/test_build_main.yml index 6470476175..74023abfbc 100644 --- a/v2raya/.github/workflows/test_build_main.yml +++ b/v2raya/.github/workflows/test_build_main.yml @@ -14,18 +14,18 @@ on: jobs: Build_v2rayA_Web: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Set up Node.js shell: bash run: | eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" - brew install node@20 - echo "PATH=\"$(brew --prefix)/opt/node@20/bin:$PATH\"" >> $GITHUB_ENV - echo "PATH=\"$(brew --prefix)/opt/node@20/bin:$PATH\"" >> ~/.bash_profile + brew install node@24 + echo "PATH=\"$(brew --prefix)/opt/node@24/bin:$PATH\"" >> $GITHUB_ENV + echo "PATH=\"$(brew --prefix)/opt/node@24/bin:$PATH\"" >> ~/.bash_profile - name: Install Dependencies run: | sudo apt-get update -y && sudo apt-get install -y gzip @@ -49,7 +49,7 @@ jobs: NAME: v2raya DESC: "A web GUI client of Project V which supports VMess, VLESS, SS, SSR, Trojan, Tuic and Juicity protocols" steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Download Artifact @@ -140,7 +140,7 @@ jobs: NAME: v2raya DESC: "A web GUI client of Project V which supports VMess, VLESS, SS, SSR, Trojan, Tuic and Juicity protocols" steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Check Version @@ -172,6 +172,7 @@ jobs: shell: pwsh run: | ## Create Destination Directory + $CurrentDir = Get-Location New-Item -ItemType Directory -Path "D:\v2raya-x86_64-windows\data" New-Item -ItemType Directory -Path "D:\v2raya-x86_64-windows\bin" New-Item -ItemType Directory -Path "D:\v2raya-arm64-windows\data" @@ -191,26 +192,19 @@ jobs: Expand-Archive -Path "D:\v2ray-windows-A64.zip" -DestinationPath "D:\v2raya-arm64-windows\bin\" Move-Item -Path "D:\v2raya-arm64-windows\bin\*.dat" -Destination "D:\v2raya-arm64-windows\data\" Remove-Item -Path "D:\v2raya-arm64-windows\bin\*.json" -Force -Recurse -ErrorAction SilentlyContinue - ## Download WinSW - ## WinSW said they have a native ARM64 version, but I cannot find it, so use net4 version instead on ARM-based Windows. - ## See more in "https://visualstudiomagazine.com/articles/2022/08/12/net-framework-4-8-1.aspx" - $Url_WinSW = "https://github.com/winsw/winsw/releases/download/v3.0.0-alpha.11/WinSW-net461.exe" - Invoke-WebRequest $Url_WinSW -OutFile "D:\WinSW.exe" - Copy-Item -Path "D:\WinSW.exe" -Destination "D:\v2raya-x86_64-windows\v2rayA-service.exe" - Copy-Item -Path "D:\WinSW.exe" -Destination "D:\v2raya-arm64-windows\v2rayA-service.exe" - ## Copy License and Service Config Copy-Item -Path ".\LICENSE" -Destination "D:\LICENSE.txt" - Copy-Item -Path ".\install\windows-inno\v2rayA-service.xml" -Destination "D:\v2raya-x86_64-windows\v2rayA-service.xml" - Copy-Item -Path ".\install\windows-inno\v2rayA-service.xml" -Destination "D:\v2raya-arm64-windows\v2rayA-service.xml" + Copy-Item -Path ".\install\windows-inno\ChineseSimplified.isl" -Destination "D:\ChineseSimplified.isl" ## Set Version - $(Get-Content -Path .\install\windows-inno\windows_x86_64.iss).replace("TheRealVersion", "${{ steps.prep.outputs.VERSION }}") | Out-File "D:\windows_x86_64.iss" - $(Get-Content -Path .\install\windows-inno\windows_arm64.iss).replace("TheRealVersion", "${{ steps.prep.outputs.VERSION }}") | Out-File "D:\windows_arm64.iss" + $((Get-Content -Path .\install\windows-inno\windows.iss).replace("TheRealVersion", "${{ steps.prep.outputs.VERSION }}")).Replace("TheRealArch", "x64compatible") | Out-File "D:\windows_x86_64.iss" + $((Get-Content -Path .\install\windows-inno\windows.iss).replace("TheRealVersion", "${{ steps.prep.outputs.VERSION }}")).Replace("TheRealArch", "arm64") | Out-File "D:\windows_arm64.iss" ## Build Installer + Set-Location -Path "D:\" & 'C:\Program Files (x86)\Inno Setup 6\ISCC.exe' "D:\windows_x86_64.iss" & 'C:\Program Files (x86)\Inno Setup 6\ISCC.exe' "D:\windows_arm64.iss" ## Rename to Friendly Name - Copy-Item -Path D:\installer_windows_inno_x64.exe -Destination .\installer_windows_inno_x64_${{ steps.prep.outputs.VERSION }}.exe - Copy-Item -Path D:\installer_windows_inno_arm64.exe -Destination .\installer_windows_inno_arm64_${{ steps.prep.outputs.VERSION }}.exe + cd $CurrentDir + Copy-Item -Path D:\installer_windows_inno_x64compatible.exe -Destination $CurrentDir\installer_windows_inno_x64_${{ steps.prep.outputs.VERSION }}.exe + Copy-Item -Path D:\installer_windows_inno_arm64.exe -Destination $CurrentDir\installer_windows_inno_arm64_${{ steps.prep.outputs.VERSION }}.exe - name: Upload Artifact uses: nanoufo/action-upload-artifacts-and-release-assets@v2 with: diff --git a/v2raya/.gitignore b/v2raya/.gitignore index 788be4b229..7ffe0f208c 100644 --- a/v2raya/.gitignore +++ b/v2raya/.gitignore @@ -36,3 +36,16 @@ node_modules # Virtualenv .env + +# AI files +TUN_SOCKS_TEST.md +TUN_SOCKS_DEBUG.md +TUN_IPV6_AND_ENV_FIX.md +TUN_DEBUG_GUIDE.md +SENDTHROUGH_FIX.md +OBSERVATORY_API_FIX.md +DOMAIN_RESOLVE_FIX.md +ASSET_PATH_FIX.md +WINDOWS_SERVICE_README.md +WINDOWS_SERVICE_GUIDE.md +service\core\v2ray\CORE_CONFIGURATION.md \ No newline at end of file diff --git a/v2raya/build-in-pwsh.ps1 b/v2raya/build-in-pwsh.ps1 index 16e45d5c05..399aae5afa 100644 --- a/v2raya/build-in-pwsh.ps1 +++ b/v2raya/build-in-pwsh.ps1 @@ -3,22 +3,19 @@ Write-Host $PSScriptRoot Function Get-build-tools(){ if ([String]::IsNullOrEmpty($(Get-Command git -ErrorAction ignore))) { Write-Output "You don't install git, please install it and add it to your path." + $We_Should_Exit_Now = $true } if ([String]::IsNullOrEmpty($(Get-Command yarn -ErrorAction ignore))) { Write-Output "You don't install yarn, please install it and add it to your path." Write-Output "You should also install Node.js to make yarn work fine." + $We_Should_Exit_Now = $true } if ([String]::IsNullOrEmpty($(Get-Command go -ErrorAction ignore))) { Write-Output "You don't install go, please install it and add it to your path." + $We_Should_Exit_Now = $true } - if ([String]::IsNullOrEmpty($(Get-Command git -ErrorAction ignore))) { - exit 1 - } - if ([String]::IsNullOrEmpty($(Get-Command yarn -ErrorAction ignore))) { - exit 1 - } - if ([String]::IsNullOrEmpty($(Get-Command go -ErrorAction ignore))) { - exit 1 + if ($We_Should_Exit_Now) { + Exit 1 } } @@ -50,7 +47,7 @@ Function Build-v2rayA(){ yarn; yarn build #Build v2rayA Set-Location -Path "$CurrentPath/service" - go build -ldflags "-X github.com/v2rayA/v2rayA/conf.Version=$version -s -w" -o "$CurrentPath/$v2rayaBin" + go build -tags "with_gvisor" -ldflags "-X github.com/v2rayA/v2rayA/conf.Version=$version -s -w" -o "$CurrentPath/$v2rayaBin" Set-Location -Path "$TerminalPath" } diff --git a/v2raya/gui/src/assets/js/utils.js b/v2raya/gui/src/assets/js/utils.js index 935f4edb92..c282577a9c 100644 --- a/v2raya/gui/src/assets/js/utils.js +++ b/v2raya/gui/src/assets/js/utils.js @@ -113,7 +113,17 @@ function parseURL(u) { continue; } s = seg[i].split("="); - ret[s[0]] = decodeURIComponent(s[1]); + let key = s[0]; + let val = decodeURIComponent(s[1]); + if (ret[key]) { + if (Array.isArray(ret[key])) { + ret[key].push(val); + } else { + ret[key] = [ret[key], val]; + } + } else { + ret[key] = val; + } } return ret; })(), @@ -166,4 +176,9 @@ function toInt(s) { return s; } -export { locateServer, handleResponse, parseURL, generateURL, toInt }; +function sanitizeALPN(alpn) { + if (!alpn) return "h3"; // Default to "h3" if no ALPN is provided + return alpn; // Retain the original input +} + +export { locateServer, handleResponse, parseURL, generateURL, toInt, sanitizeALPN }; diff --git a/v2raya/gui/src/components/modalServer.vue b/v2raya/gui/src/components/modalServer.vue index 9376b06877..af18e5b3e7 100644 --- a/v2raya/gui/src/components/modalServer.vue +++ b/v2raya/gui/src/components/modalServer.vue @@ -34,9 +34,6 @@ - - - @@ -525,7 +522,7 @@ ref="v2ray_key" v-model="v2ray.key" :placeholder="$t('configureServer.password') - + @@ -640,6 +637,45 @@ ref="v2ray_key" v-model="v2ray.key" :placeholder="$t('configureServer.password') + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -687,6 +723,31 @@ ref="v2ray_key" v-model="v2ray.key" :placeholder="$t('configureServer.password') expanded /> + + + + + + + + + + + + + + + + + + + + + + + + +