From e49386619ea77d481027dfc62b0d966178b6b5ac Mon Sep 17 00:00:00 2001 From: "github-action[bot]" Date: Thu, 26 Sep 2024 20:35:56 +0200 Subject: [PATCH] Update On Thu Sep 26 20:35:56 CEST 2024 --- .github/update.log | 1 + clash-meta/component/nat/table.go | 44 +- clash-meta/constant/adapters.go | 30 +- clash-meta/tunnel/connection.go | 96 ++- clash-meta/tunnel/tunnel.go | 208 +++-- clash-nyanpasu/frontend/nyanpasu/package.json | 6 +- clash-nyanpasu/manifest/version.json | 6 +- clash-nyanpasu/package.json | 2 +- clash-nyanpasu/pnpm-lock.yaml | 774 +++++++++--------- lede/package/kernel/linux/modules/gpio.mk | 3 +- .../kernel/linux/modules/netdevices.mk | 98 ++- mihomo/component/nat/table.go | 44 +- mihomo/constant/adapters.go | 30 +- mihomo/tunnel/connection.go | 96 ++- mihomo/tunnel/tunnel.go | 208 +++-- .../model/cbi/passwall/client/other.lua | 38 + .../luasrc/passwall/util_xray.lua | 36 +- .../luci-app-passwall/po/zh-cn/passwall.po | 18 + .../src/Ryujinx.Graphics.GAL/Capabilities.cs | 6 +- .../Image/AutoDeleteCache.cs | 30 +- .../Image/TextureCache.cs | 8 + .../Memory/MemoryManager.cs | 2 + .../Shader/DiskCache/DiskCacheHostStorage.cs | 2 +- .../Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs | 3 +- .../Translation/Translator.cs | 12 +- .../Ryujinx.Graphics.Vulkan/VulkanRenderer.cs | 22 +- shadowsocks-rust/Cargo.lock | 8 +- .../crates/shadowsocks-service/Cargo.toml | 2 +- .../crates/shadowsocks/Cargo.toml | 2 +- .../model/cbi/passwall/client/other.lua | 38 + .../luasrc/passwall/util_xray.lua | 36 +- small/luci-app-passwall/po/zh-cn/passwall.po | 18 + small/v2ray-geodata/Makefile | 4 +- v2raya/service/core/v2ray/processManager.go | 94 +-- .../kotlin/com/v2ray/ang/AngApplication.kt | 8 + .../main/kotlin/com/v2ray/ang/AppConfig.kt | 1 + .../kotlin/com/v2ray/ang/dto/Hysteria2Bean.kt | 17 + .../com/v2ray/ang/dto/SubscriptionItem.kt | 1 + .../kotlin/com/v2ray/ang/extension/_Ext.kt | 27 +- .../com/v2ray/ang/plugin/NativePlugin.kt | 32 + .../kotlin/com/v2ray/ang/plugin/Plugin.kt | 43 + .../com/v2ray/ang/plugin/PluginContract.kt | 33 + .../kotlin/com/v2ray/ang/plugin/PluginList.kt | 53 ++ .../com/v2ray/ang/plugin/PluginManager.kt | 219 +++++ .../com/v2ray/ang/plugin/ResolvedPlugin.kt | 45 + .../v2ray/ang/service/V2RayServiceManager.kt | 4 + .../com/v2ray/ang/service/V2RayVpnService.kt | 5 +- .../kotlin/com/v2ray/ang/ui/MainActivity.kt | 8 +- .../com/v2ray/ang/ui/SubEditActivity.kt | 5 +- .../com/v2ray/ang/ui/UserAssetActivity.kt | 3 +- .../com/v2ray/ang/util/AngConfigManager.kt | 25 +- .../kotlin/com/v2ray/ang/util/PluginUtil.kt | 93 +++ .../com/v2ray/ang/util/SpeedtestUtil.kt | 3 +- .../main/kotlin/com/v2ray/ang/util/Utils.kt | 3 +- .../com/v2ray/ang/util/V2rayConfigUtil.kt | 31 +- .../com/v2ray/ang/util/fmt/Hysteria2Fmt.kt | 17 +- .../com/v2ray/ang/util/fmt/ShadowsocksFmt.kt | 2 +- .../kotlin/com/v2ray/ang/util/fmt/SocksFmt.kt | 2 +- .../com/v2ray/ang/util/fmt/TrojanFmt.kt | 2 +- .../kotlin/com/v2ray/ang/util/fmt/VlessFmt.kt | 2 +- .../kotlin/com/v2ray/ang/util/fmt/VmessFmt.kt | 2 +- .../com/v2ray/ang/util/fmt/WireguardFmt.kt | 2 +- .../src/main/res/layout/activity_sub_edit.xml | 19 + .../app/src/main/res/menu/menu_main.xml | 8 +- .../app/src/main/res/values-ar/strings.xml | 1 + .../app/src/main/res/values-bn/strings.xml | 1 + .../app/src/main/res/values-fa/strings.xml | 1 + .../app/src/main/res/values-ru/strings.xml | 1 + .../app/src/main/res/values-vi/strings.xml | 1 + .../src/main/res/values-zh-rCN/strings.xml | 1 + .../src/main/res/values-zh-rTW/strings.xml | 3 +- .../app/src/main/res/values/strings.xml | 1 + xray-core/infra/conf/transport_internet.go | 2 +- xray-core/transport/internet/http/dialer.go | 175 ++-- .../transport/internet/http/http_test.go | 78 ++ xray-core/transport/internet/http/hub.go | 181 ++-- xray-core/transport/internet/splithttp/hub.go | 8 +- yass/.github/workflows/releases-deb.yml | 4 +- yass/src/win32/yass_frame.cpp | 2 +- yt-dlp/.github/workflows/build.yml | 4 +- yt-dlp/pyproject.toml | 4 +- yt-dlp/yt_dlp/cookies.py | 5 +- yt-dlp/yt_dlp/extractor/_extractors.py | 3 + yt-dlp/yt_dlp/extractor/ertgr.py | 44 +- yt-dlp/yt_dlp/extractor/germanupa.py | 91 ++ yt-dlp/yt_dlp/extractor/mediaklikk.py | 18 +- yt-dlp/yt_dlp/extractor/mojevideo.py | 121 +++ yt-dlp/yt_dlp/extractor/rumble.py | 9 +- yt-dlp/yt_dlp/extractor/snapchat.py | 76 ++ yt-dlp/yt_dlp/extractor/svt.py | 2 +- yt-dlp/yt_dlp/networking/_curlcffi.py | 4 +- 91 files changed, 2609 insertions(+), 972 deletions(-) create mode 100644 v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/Hysteria2Bean.kt create mode 100644 v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/NativePlugin.kt create mode 100644 v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/Plugin.kt create mode 100644 v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/PluginContract.kt create mode 100644 v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/PluginList.kt create mode 100644 v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/PluginManager.kt create mode 100644 v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/ResolvedPlugin.kt create mode 100644 v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/PluginUtil.kt create mode 100644 yt-dlp/yt_dlp/extractor/germanupa.py create mode 100644 yt-dlp/yt_dlp/extractor/mojevideo.py create mode 100644 yt-dlp/yt_dlp/extractor/snapchat.py diff --git a/.github/update.log b/.github/update.log index b2f9bbc0b2..26dfffb3a8 100644 --- a/.github/update.log +++ b/.github/update.log @@ -775,3 +775,4 @@ Update On Sun Sep 22 20:33:25 CEST 2024 Update On Mon Sep 23 20:34:03 CEST 2024 Update On Tue Sep 24 20:37:16 CEST 2024 Update On Wed Sep 25 20:37:03 CEST 2024 +Update On Thu Sep 26 20:35:45 CEST 2024 diff --git a/clash-meta/component/nat/table.go b/clash-meta/component/nat/table.go index bb5ab75579..66241fb472 100644 --- a/clash-meta/component/nat/table.go +++ b/clash-meta/component/nat/table.go @@ -10,47 +10,30 @@ import ( ) type Table struct { - mapping *xsync.MapOf[string, *Entry] - lockMap *xsync.MapOf[string, *sync.Cond] + mapping *xsync.MapOf[string, *entry] } -type Entry struct { - PacketConn C.PacketConn - WriteBackProxy C.WriteBackProxy +type entry struct { + PacketSender C.PacketSender LocalUDPConnMap *xsync.MapOf[string, *net.UDPConn] LocalLockMap *xsync.MapOf[string, *sync.Cond] } -func (t *Table) Set(key string, e C.PacketConn, w C.WriteBackProxy) { - t.mapping.Store(key, &Entry{ - PacketConn: e, - WriteBackProxy: w, - LocalUDPConnMap: xsync.NewMapOf[string, *net.UDPConn](), - LocalLockMap: xsync.NewMapOf[string, *sync.Cond](), +func (t *Table) GetOrCreate(key string, maker func() C.PacketSender) (C.PacketSender, bool) { + item, loaded := t.mapping.LoadOrCompute(key, func() *entry { + return &entry{ + PacketSender: maker(), + LocalUDPConnMap: xsync.NewMapOf[string, *net.UDPConn](), + LocalLockMap: xsync.NewMapOf[string, *sync.Cond](), + } }) -} - -func (t *Table) Get(key string) (C.PacketConn, C.WriteBackProxy) { - entry, exist := t.getEntry(key) - if !exist { - return nil, nil - } - return entry.PacketConn, entry.WriteBackProxy -} - -func (t *Table) GetOrCreateLock(key string) (*sync.Cond, bool) { - item, loaded := t.lockMap.LoadOrCompute(key, makeLock) - return item, loaded + return item.PacketSender, loaded } func (t *Table) Delete(key string) { t.mapping.Delete(key) } -func (t *Table) DeleteLock(lockKey string) { - t.lockMap.Delete(lockKey) -} - func (t *Table) GetForLocalConn(lAddr, rAddr string) *net.UDPConn { entry, exist := t.getEntry(lAddr) if !exist { @@ -105,7 +88,7 @@ func (t *Table) DeleteLockForLocalConn(lAddr, key string) { entry.LocalLockMap.Delete(key) } -func (t *Table) getEntry(key string) (*Entry, bool) { +func (t *Table) getEntry(key string) (*entry, bool) { return t.mapping.Load(key) } @@ -116,7 +99,6 @@ func makeLock() *sync.Cond { // New return *Cache func New() *Table { return &Table{ - mapping: xsync.NewMapOf[string, *Entry](), - lockMap: xsync.NewMapOf[string, *sync.Cond](), + mapping: xsync.NewMapOf[string, *entry](), } } diff --git a/clash-meta/constant/adapters.go b/clash-meta/constant/adapters.go index cb213b3c34..cb47f87166 100644 --- a/clash-meta/constant/adapters.go +++ b/clash-meta/constant/adapters.go @@ -255,12 +255,16 @@ type UDPPacketInAddr interface { // PacketAdapter is a UDP Packet adapter for socks/redir/tun type PacketAdapter interface { UDPPacket + // Metadata returns destination metadata Metadata() *Metadata + // Key is a SNAT key + Key() string } type packetAdapter struct { UDPPacket metadata *Metadata + key string } // Metadata returns destination metadata @@ -268,10 +272,16 @@ func (s *packetAdapter) Metadata() *Metadata { return s.metadata } +// Key is a SNAT key +func (s *packetAdapter) Key() string { + return s.key +} + func NewPacketAdapter(packet UDPPacket, metadata *Metadata) PacketAdapter { return &packetAdapter{ packet, metadata, + packet.LocalAddr().String(), } } @@ -284,17 +294,23 @@ type WriteBackProxy interface { UpdateWriteBack(wb WriteBack) } +type PacketSender interface { + // Send will send PacketAdapter nonblocking + // the implement must call UDPPacket.Drop() inside Send + Send(PacketAdapter) + // Process is a blocking loop to send PacketAdapter to PacketConn and update the WriteBackProxy + Process(PacketConn, WriteBackProxy) + // ResolveUDP do a local resolve UDP dns blocking if metadata is not resolved + ResolveUDP(*Metadata) error + // Close stop the Process loop + Close() +} + type NatTable interface { - Set(key string, e PacketConn, w WriteBackProxy) - - Get(key string) (PacketConn, WriteBackProxy) - - GetOrCreateLock(key string) (*sync.Cond, bool) + GetOrCreate(key string, maker func() PacketSender) (PacketSender, bool) Delete(key string) - DeleteLock(key string) - GetForLocalConn(lAddr, rAddr string) *net.UDPConn AddForLocalConn(lAddr, rAddr string, conn *net.UDPConn) bool diff --git a/clash-meta/tunnel/connection.go b/clash-meta/tunnel/connection.go index e96545e80b..1ea0678cd7 100644 --- a/clash-meta/tunnel/connection.go +++ b/clash-meta/tunnel/connection.go @@ -1,16 +1,109 @@ package tunnel import ( + "context" "errors" "net" "net/netip" "time" + "github.com/metacubex/mihomo/common/lru" N "github.com/metacubex/mihomo/common/net" + "github.com/metacubex/mihomo/component/resolver" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/log" ) +type packetSender struct { + ctx context.Context + cancel context.CancelFunc + ch chan C.PacketAdapter + cache *lru.LruCache[string, netip.Addr] +} + +// newPacketSender return a chan based C.PacketSender +// It ensures that packets can be sent sequentially and without blocking +func newPacketSender() C.PacketSender { + ctx, cancel := context.WithCancel(context.Background()) + ch := make(chan C.PacketAdapter, senderCapacity) + return &packetSender{ + ctx: ctx, + cancel: cancel, + ch: ch, + cache: lru.New[string, netip.Addr](lru.WithSize[string, netip.Addr](senderCapacity)), + } +} + +func (s *packetSender) Process(pc C.PacketConn, proxy C.WriteBackProxy) { + for { + select { + case <-s.ctx.Done(): + return // sender closed + case packet := <-s.ch: + if proxy != nil { + proxy.UpdateWriteBack(packet) + } + if err := s.ResolveUDP(packet.Metadata()); err != nil { + log.Warnln("[UDP] Resolve Ip error: %s", err) + } else { + _ = handleUDPToRemote(packet, pc, packet.Metadata()) + } + packet.Drop() + } + } +} + +func (s *packetSender) dropAll() { + for { + select { + case data := <-s.ch: + data.Drop() // drop all data still in chan + default: + return // no data, exit goroutine + } + } +} + +func (s *packetSender) Send(packet C.PacketAdapter) { + select { + case <-s.ctx.Done(): + packet.Drop() // sender closed before Send() + return + default: + } + + select { + case s.ch <- packet: + // put ok, so don't drop packet, will process by other side of chan + case <-s.ctx.Done(): + packet.Drop() // sender closed when putting data to chan + default: + packet.Drop() // chan is full + } +} + +func (s *packetSender) Close() { + s.cancel() + s.dropAll() +} + +func (s *packetSender) ResolveUDP(metadata *C.Metadata) (err error) { + // local resolve UDP dns + if !metadata.Resolved() { + ip, ok := s.cache.Get(metadata.Host) + if !ok { + ip, err = resolver.ResolveIP(s.ctx, metadata.Host) + if err != nil { + return err + } + s.cache.Set(metadata.Host, ip) + } + + metadata.DstIP = ip + } + return nil +} + func handleUDPToRemote(packet C.UDPPacket, pc C.PacketConn, metadata *C.Metadata) error { addr := metadata.UDPAddr() if addr == nil { @@ -26,8 +119,9 @@ func handleUDPToRemote(packet C.UDPPacket, pc C.PacketConn, metadata *C.Metadata return nil } -func handleUDPToLocal(writeBack C.WriteBack, pc N.EnhancePacketConn, key string, oAddrPort netip.AddrPort, fAddr netip.Addr) { +func handleUDPToLocal(writeBack C.WriteBack, pc N.EnhancePacketConn, sender C.PacketSender, key string, oAddrPort netip.AddrPort, fAddr netip.Addr) { defer func() { + sender.Close() _ = pc.Close() closeAllLocalCoon(key) natTable.Delete(key) diff --git a/clash-meta/tunnel/tunnel.go b/clash-meta/tunnel/tunnel.go index b6c61d7641..5c136eb24e 100644 --- a/clash-meta/tunnel/tunnel.go +++ b/clash-meta/tunnel/tunnel.go @@ -28,11 +28,14 @@ import ( "github.com/metacubex/mihomo/tunnel/statistic" ) -const queueSize = 200 +const ( + queueCapacity = 64 // chan capacity tcpQueue and udpQueue + senderCapacity = 128 // chan capacity of PacketSender +) var ( status = newAtomicStatus(Suspend) - tcpQueue = make(chan C.ConnContext, queueSize) + udpInit sync.Once udpQueues []chan C.PacketAdapter natTable = nat.New() rules []C.Rule @@ -43,6 +46,12 @@ var ( ruleProviders map[string]provider.RuleProvider configMux sync.RWMutex + // for compatibility, lazy init + tcpQueue chan C.ConnContext + tcpInOnce sync.Once + udpQueue chan C.PacketAdapter + udpInOnce sync.Once + // Outbound Rule mode = Rule @@ -70,15 +79,33 @@ func (t tunnel) HandleTCPConn(conn net.Conn, metadata *C.Metadata) { handleTCPConn(connCtx) } -func (t tunnel) HandleUDPPacket(packet C.UDPPacket, metadata *C.Metadata) { - packetAdapter := C.NewPacketAdapter(packet, metadata) +func initUDP() { + numUDPWorkers := 4 + if num := runtime.GOMAXPROCS(0); num > numUDPWorkers { + numUDPWorkers = num + } - hash := utils.MapHash(metadata.SourceAddress() + "-" + metadata.RemoteAddress()) + udpQueues = make([]chan C.PacketAdapter, numUDPWorkers) + for i := 0; i < numUDPWorkers; i++ { + queue := make(chan C.PacketAdapter, queueCapacity) + udpQueues[i] = queue + go processUDP(queue) + } +} + +func (t tunnel) HandleUDPPacket(packet C.UDPPacket, metadata *C.Metadata) { + udpInit.Do(initUDP) + + packetAdapter := C.NewPacketAdapter(packet, metadata) + key := packetAdapter.Key() + + hash := utils.MapHash(key) queueNo := uint(hash) % uint(len(udpQueues)) select { case udpQueues[queueNo] <- packetAdapter: default: + packet.Drop() } } @@ -134,21 +161,32 @@ func IsSniffing() bool { return sniffingEnable } -func init() { - go process() -} - // TCPIn return fan-in queue // Deprecated: using Tunnel instead func TCPIn() chan<- C.ConnContext { + tcpInOnce.Do(func() { + tcpQueue = make(chan C.ConnContext, queueCapacity) + go func() { + for connCtx := range tcpQueue { + go handleTCPConn(connCtx) + } + }() + }) return tcpQueue } // UDPIn return fan-in udp queue // Deprecated: using Tunnel instead func UDPIn() chan<- C.PacketAdapter { - // compatibility: first queue is always available for external callers - return udpQueues[0] + udpInOnce.Do(func() { + udpQueue = make(chan C.PacketAdapter, queueCapacity) + go func() { + for packet := range udpQueue { + Tunnel.HandleUDPPacket(packet, packet.Metadata()) + } + }() + }) + return udpQueue } // NatTable return nat table @@ -249,32 +287,6 @@ func isHandle(t C.Type) bool { return status == Running || (status == Inner && t == C.INNER) } -// processUDP starts a loop to handle udp packet -func processUDP(queue chan C.PacketAdapter) { - for conn := range queue { - handleUDPConn(conn) - } -} - -func process() { - numUDPWorkers := 4 - if num := runtime.GOMAXPROCS(0); num > numUDPWorkers { - numUDPWorkers = num - } - - udpQueues = make([]chan C.PacketAdapter, numUDPWorkers) - for i := 0; i < numUDPWorkers; i++ { - queue := make(chan C.PacketAdapter, queueSize) - udpQueues[i] = queue - go processUDP(queue) - } - - queue := tcpQueue - for conn := range queue { - go handleTCPConn(conn) - } -} - func needLookupIP(metadata *C.Metadata) bool { return resolver.MappingEnabled() && metadata.Host == "" && metadata.DstIP.IsValid() } @@ -334,6 +346,13 @@ func resolveMetadata(metadata *C.Metadata) (proxy C.Proxy, rule C.Rule, err erro return } +// processUDP starts a loop to handle udp packet +func processUDP(queue chan C.PacketAdapter) { + for conn := range queue { + handleUDPConn(conn) + } +} + func handleUDPConn(packet C.PacketAdapter) { if !isHandle(packet.Metadata().Type) { packet.Drop() @@ -363,85 +382,58 @@ func handleUDPConn(packet C.PacketAdapter) { snifferDispatcher.UDPSniff(packet) } - // local resolve UDP dns - if !metadata.Resolved() { - ip, err := resolver.ResolveIP(context.Background(), metadata.Host) - if err != nil { - return - } - metadata.DstIP = ip - } - - key := packet.LocalAddr().String() - - handle := func() bool { - pc, proxy := natTable.Get(key) - if pc != nil { - if proxy != nil { - proxy.UpdateWriteBack(packet) + key := packet.Key() + sender, loaded := natTable.GetOrCreate(key, newPacketSender) + if !loaded { + dial := func() (C.PacketConn, C.WriteBackProxy, error) { + if err := sender.ResolveUDP(metadata); err != nil { + log.Warnln("[UDP] Resolve Ip error: %s", err) + return nil, nil, err } - _ = handleUDPToRemote(packet, pc, metadata) - return true - } - return false - } - if handle() { - packet.Drop() - return - } + proxy, rule, err := resolveMetadata(metadata) + if err != nil { + log.Warnln("[UDP] Parse metadata failed: %s", err.Error()) + return nil, nil, err + } - cond, loaded := natTable.GetOrCreateLock(key) + ctx, cancel := context.WithTimeout(context.Background(), C.DefaultUDPTimeout) + defer cancel() + rawPc, err := retry(ctx, func(ctx context.Context) (C.PacketConn, error) { + return proxy.ListenPacketContext(ctx, metadata.Pure()) + }, func(err error) { + logMetadataErr(metadata, rule, proxy, err) + }) + if err != nil { + return nil, nil, err + } + logMetadata(metadata, rule, rawPc) - go func() { - defer packet.Drop() + pc := statistic.NewUDPTracker(rawPc, statistic.DefaultManager, metadata, rule, 0, 0, true) - if loaded { - cond.L.Lock() - cond.Wait() - handle() - cond.L.Unlock() - return + if rawPc.Chains().Last() == "REJECT-DROP" { + _ = pc.Close() + return nil, nil, errors.New("rejected drop packet") + } + + oAddrPort := metadata.AddrPort() + writeBackProxy := nat.NewWriteBackProxy(packet) + + go handleUDPToLocal(writeBackProxy, pc, sender, key, oAddrPort, fAddr) + return pc, writeBackProxy, nil } - defer func() { - natTable.DeleteLock(key) - cond.Broadcast() + go func() { + pc, proxy, err := dial() + if err != nil { + sender.Close() + natTable.Delete(key) + return + } + sender.Process(pc, proxy) }() - - proxy, rule, err := resolveMetadata(metadata) - if err != nil { - log.Warnln("[UDP] Parse metadata failed: %s", err.Error()) - return - } - - ctx, cancel := context.WithTimeout(context.Background(), C.DefaultUDPTimeout) - defer cancel() - rawPc, err := retry(ctx, func(ctx context.Context) (C.PacketConn, error) { - return proxy.ListenPacketContext(ctx, metadata.Pure()) - }, func(err error) { - logMetadataErr(metadata, rule, proxy, err) - }) - if err != nil { - return - } - logMetadata(metadata, rule, rawPc) - - pc := statistic.NewUDPTracker(rawPc, statistic.DefaultManager, metadata, rule, 0, 0, true) - - if rawPc.Chains().Last() == "REJECT-DROP" { - pc.Close() - return - } - - oAddrPort := metadata.AddrPort() - writeBackProxy := nat.NewWriteBackProxy(packet) - natTable.Set(key, pc, writeBackProxy) - - go handleUDPToLocal(writeBackProxy, pc, key, oAddrPort, fAddr) - - handle() - }() + } + sender.Send(packet) // nonblocking } func handleTCPConn(connCtx C.ConnContext) { diff --git a/clash-nyanpasu/frontend/nyanpasu/package.json b/clash-nyanpasu/frontend/nyanpasu/package.json index 6d53cce143..cf70ddcd45 100644 --- a/clash-nyanpasu/frontend/nyanpasu/package.json +++ b/clash-nyanpasu/frontend/nyanpasu/package.json @@ -53,11 +53,11 @@ "@csstools/normalize.css": "12.1.1", "@emotion/babel-plugin": "11.12.0", "@emotion/react": "11.13.3", - "@iconify/json": "2.2.252", + "@iconify/json": "2.2.253", "@monaco-editor/react": "4.6.0", "@tanstack/react-router": "1.58.9", "@tanstack/router-devtools": "1.58.9", - "@tanstack/router-plugin": "1.58.4", + "@tanstack/router-plugin": "1.58.10", "@tauri-apps/plugin-clipboard-manager": "2.0.0-rc.2", "@tauri-apps/plugin-dialog": "2.0.0-rc.1", "@tauri-apps/plugin-fs": "2.0.0-rc.2", @@ -76,7 +76,7 @@ "monaco-yaml": "5.2.2", "nanoid": "5.0.7", "sass": "1.79.3", - "shiki": "1.18.0", + "shiki": "1.19.0", "tailwindcss-textshadow": "2.1.3", "unplugin-auto-import": "0.18.3", "unplugin-icons": "0.19.3", diff --git a/clash-nyanpasu/manifest/version.json b/clash-nyanpasu/manifest/version.json index 6d374e1c8f..7c855cf0d5 100644 --- a/clash-nyanpasu/manifest/version.json +++ b/clash-nyanpasu/manifest/version.json @@ -2,10 +2,10 @@ "manifest_version": 1, "latest": { "mihomo": "v1.18.8", - "mihomo_alpha": "alpha-2b3bd6e", + "mihomo_alpha": "alpha-5812a7b", "clash_rs": "v0.4.0", "clash_premium": "2023-09-05-gdcc8d87", - "clash_rs_alpha": "0.4.0-alpha+sha.c24fea0" + "clash_rs_alpha": "0.4.0-alpha+sha.afe4cb0" }, "arch_template": { "mihomo": { @@ -69,5 +69,5 @@ "linux-armv7hf": "clash-armv7-unknown-linux-gnueabihf" } }, - "updated_at": "2024-09-24T22:20:39.694Z" + "updated_at": "2024-09-25T22:20:40.764Z" } diff --git a/clash-nyanpasu/package.json b/clash-nyanpasu/package.json index f96481fe3f..6b674cb2bd 100644 --- a/clash-nyanpasu/package.json +++ b/clash-nyanpasu/package.json @@ -63,7 +63,7 @@ "@tauri-apps/cli": "2.0.0-rc.16", "@types/fs-extra": "11.0.4", "@types/lodash-es": "4.17.12", - "@types/node": "22.7.0", + "@types/node": "22.7.2", "@typescript-eslint/eslint-plugin": "8.7.0", "@typescript-eslint/parser": "8.7.0", "autoprefixer": "10.4.20", diff --git a/clash-nyanpasu/pnpm-lock.yaml b/clash-nyanpasu/pnpm-lock.yaml index 1b189e533d..3143ba11c4 100644 --- a/clash-nyanpasu/pnpm-lock.yaml +++ b/clash-nyanpasu/pnpm-lock.yaml @@ -22,7 +22,7 @@ importers: devDependencies: '@commitlint/cli': specifier: 19.5.0 - version: 19.5.0(@types/node@22.7.0)(typescript@5.6.2) + version: 19.5.0(@types/node@22.7.2)(typescript@5.6.2) '@commitlint/config-conventional': specifier: 19.5.0 version: 19.5.0 @@ -39,8 +39,8 @@ importers: specifier: 4.17.12 version: 4.17.12 '@types/node': - specifier: 22.7.0 - version: 22.7.0 + specifier: 22.7.2 + version: 22.7.2 '@typescript-eslint/eslint-plugin': specifier: 8.7.0 version: 8.7.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) @@ -97,7 +97,7 @@ importers: version: 4.6.2(eslint@8.57.1) knip: specifier: 5.30.5 - version: 5.30.5(@types/node@22.7.0)(typescript@5.6.2) + version: 5.30.5(@types/node@22.7.2)(typescript@5.6.2) lint-staged: specifier: 15.2.10 version: 15.2.10 @@ -166,16 +166,16 @@ importers: version: 2.0.0-rc.5 ahooks: specifier: 3.8.1 - version: 3.8.1(react@19.0.0-rc-f9ebd85a-20240925) + version: 3.8.1(react@19.0.0-rc-778e1ed2-20240926) ofetch: specifier: 1.4.0 version: 1.4.0 react: specifier: rc - version: 19.0.0-rc-f9ebd85a-20240925 + version: 19.0.0-rc-778e1ed2-20240926 swr: specifier: 2.2.5 - version: 2.2.5(react@19.0.0-rc-f9ebd85a-20240925) + version: 2.2.5(react@19.0.0-rc-778e1ed2-20240926) devDependencies: '@types/react': specifier: npm:types-react@rc @@ -185,16 +185,16 @@ importers: dependencies: '@dnd-kit/core': specifier: 6.1.0 - version: 6.1.0(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) + version: 6.1.0(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) '@dnd-kit/sortable': specifier: 8.0.0 - version: 8.0.0(@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) + version: 8.0.0(@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) '@dnd-kit/utilities': specifier: 3.2.2 - version: 3.2.2(react@19.0.0-rc-f9ebd85a-20240925) + version: 3.2.2(react@19.0.0-rc-778e1ed2-20240926) '@emotion/styled': specifier: 11.13.0 - version: 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + version: 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) '@juggle/resize-observer': specifier: 3.4.0 version: 3.4.0 @@ -203,13 +203,13 @@ importers: version: 0.3.0 '@mui/icons-material': specifier: 6.1.1 - version: 6.1.1(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + version: 6.1.1(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) '@mui/lab': specifier: 6.0.0-beta.10 - version: 6.0.0-beta.10(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + version: 6.0.0-beta.10(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) '@mui/material': specifier: 6.1.1 - version: 6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + version: 6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) '@nyanpasu/interface': specifier: workspace:^ version: link:../interface @@ -218,7 +218,7 @@ importers: version: link:../ui '@tanstack/router-zod-adapter': specifier: 1.58.9 - version: 1.58.9(@tanstack/react-router@1.58.9(@tanstack/router-generator@1.58.1)(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925))(zod@3.23.8) + version: 1.58.9(@tanstack/react-router@1.58.9(@tanstack/router-generator@1.58.1)(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926))(zod@3.23.8) '@tauri-apps/api': specifier: 2.0.0-rc.5 version: 2.0.0-rc.5 @@ -227,10 +227,10 @@ importers: version: 7.0.15 ahooks: specifier: 3.8.1 - version: 3.8.1(react@19.0.0-rc-f9ebd85a-20240925) + version: 3.8.1(react@19.0.0-rc-778e1ed2-20240926) allotment: specifier: 1.20.2 - version: 1.20.2(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) + version: 1.20.2(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) country-code-emoji: specifier: 2.3.0 version: 2.3.0 @@ -239,61 +239,61 @@ importers: version: 1.11.13 framer-motion: specifier: 12.0.0-alpha.1 - version: 12.0.0-alpha.1(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) + version: 12.0.0-alpha.1(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) i18next: specifier: 23.15.1 version: 23.15.1 jotai: specifier: 2.10.0 - version: 2.10.0(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + version: 2.10.0(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) json-schema: specifier: 0.4.0 version: 0.4.0 material-react-table: specifier: 3.0.1 - version: 3.0.1(tk74sipl6fb4w5cnuyckd67l2q) + version: 3.0.1(scdjpuj6p6tus776axypnmttum) monaco-editor: specifier: 0.52.0 version: 0.52.0 mui-color-input: specifier: 4.0.1 - version: 4.0.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + version: 4.0.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) react: specifier: rc - version: 19.0.0-rc-f9ebd85a-20240925 + version: 19.0.0-rc-778e1ed2-20240926 react-dom: specifier: rc - version: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + version: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) react-error-boundary: specifier: 4.0.13 - version: 4.0.13(react@19.0.0-rc-f9ebd85a-20240925) + version: 4.0.13(react@19.0.0-rc-778e1ed2-20240926) react-fast-marquee: specifier: 1.6.5 - version: 1.6.5(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) + version: 1.6.5(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) react-hook-form-mui: specifier: 7.2.0 - version: 7.2.0(qjysoxakmzlaldi46ut6vobrcu) + version: 7.2.0(kxevavldinoaaue37dtxsp7rui) react-i18next: specifier: 15.0.2 - version: 15.0.2(i18next@23.15.1)(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) + version: 15.0.2(i18next@23.15.1)(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) react-markdown: specifier: 9.0.1 - version: 9.0.1(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + version: 9.0.1(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) react-router-dom: specifier: 6.26.2 - version: 6.26.2(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) + version: 6.26.2(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) react-split-grid: specifier: 1.0.4 - version: 1.0.4(react@19.0.0-rc-f9ebd85a-20240925) + version: 1.0.4(react@19.0.0-rc-778e1ed2-20240926) react-use: specifier: 17.5.1 - version: 17.5.1(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) + version: 17.5.1(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) swr: specifier: 2.2.5 - version: 2.2.5(react@19.0.0-rc-f9ebd85a-20240925) + version: 2.2.5(react@19.0.0-rc-778e1ed2-20240926) virtua: specifier: 0.34.2 - version: 0.34.2(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) + version: 0.34.2(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) vite-bundle-visualizer: specifier: 1.2.1 version: 1.2.1(rollup@4.21.0) @@ -306,22 +306,22 @@ importers: version: 11.12.0 '@emotion/react': specifier: 11.13.3 - version: 11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + version: 11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) '@iconify/json': - specifier: 2.2.252 - version: 2.2.252 + specifier: 2.2.253 + version: 2.2.253 '@monaco-editor/react': specifier: 4.6.0 - version: 4.6.0(monaco-editor@0.52.0)(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) + version: 4.6.0(monaco-editor@0.52.0)(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) '@tanstack/react-router': specifier: 1.58.9 - version: 1.58.9(@tanstack/router-generator@1.58.1)(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) + version: 1.58.9(@tanstack/router-generator@1.58.1)(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) '@tanstack/router-devtools': specifier: 1.58.9 - version: 1.58.9(@tanstack/react-router@1.58.9(@tanstack/router-generator@1.58.1)(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925))(csstype@3.1.3)(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) + version: 1.58.9(@tanstack/react-router@1.58.9(@tanstack/router-generator@1.58.1)(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926))(csstype@3.1.3)(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) '@tanstack/router-plugin': - specifier: 1.58.4 - version: 1.58.4(vite@5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0))(webpack-sources@3.2.3) + specifier: 1.58.10 + version: 1.58.10(vite@5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0))(webpack-sources@3.2.3) '@tauri-apps/plugin-clipboard-manager': specifier: 2.0.0-rc.2 version: 2.0.0-rc.2 @@ -357,10 +357,10 @@ importers: version: 13.12.2 '@vitejs/plugin-react': specifier: 4.3.1 - version: 4.3.1(vite@5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)) + version: 4.3.1(vite@5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)) '@vitejs/plugin-react-swc': specifier: 3.7.0 - version: 3.7.0(vite@5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)) + version: 3.7.0(vite@5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)) clsx: specifier: 2.1.1 version: 2.1.1 @@ -377,8 +377,8 @@ importers: specifier: 1.79.3 version: 1.79.3 shiki: - specifier: 1.18.0 - version: 1.18.0 + specifier: 1.19.0 + version: 1.19.0 tailwindcss-textshadow: specifier: 2.1.3 version: 2.1.3 @@ -393,16 +393,16 @@ importers: version: 13.12.0 vite: specifier: 5.4.8 - version: 5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0) + version: 5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0) vite-plugin-sass-dts: specifier: 1.3.29 - version: 1.3.29(postcss@8.4.47)(prettier@3.3.3)(sass-embedded@1.78.0)(vite@5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)) + version: 1.3.29(postcss@8.4.47)(prettier@3.3.3)(sass-embedded@1.78.0)(vite@5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)) vite-plugin-svgr: specifier: 4.2.0 - version: 4.2.0(rollup@4.21.0)(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)) + version: 4.2.0(rollup@4.21.0)(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)) vite-tsconfig-paths: specifier: 5.0.1 - version: 5.0.1(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)) + version: 5.0.1(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)) zod: specifier: 3.23.8 version: 3.23.8 @@ -414,19 +414,19 @@ importers: version: 0.3.0 '@mui/icons-material': specifier: 6.1.1 - version: 6.1.1(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + version: 6.1.1(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) '@mui/lab': specifier: 6.0.0-beta.10 - version: 6.0.0-beta.10(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + version: 6.0.0-beta.10(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) '@mui/material': specifier: 6.1.1 - version: 6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + version: 6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) '@radix-ui/react-portal': specifier: 1.1.1 - version: 1.1.1(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + version: 1.1.1(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) '@radix-ui/react-scroll-area': specifier: 1.1.0 - version: 1.1.0(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + version: 1.1.0(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) '@tauri-apps/api': specifier: 2.0.0-rc.5 version: 2.0.0-rc.5 @@ -438,41 +438,41 @@ importers: version: types-react@19.0.0-rc.1 '@vitejs/plugin-react': specifier: 4.3.1 - version: 4.3.1(vite@5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)) + version: 4.3.1(vite@5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)) ahooks: specifier: 3.8.1 - version: 3.8.1(react@19.0.0-rc-f9ebd85a-20240925) + version: 3.8.1(react@19.0.0-rc-778e1ed2-20240926) d3: specifier: 7.9.0 version: 7.9.0 framer-motion: specifier: 12.0.0-alpha.1 - version: 12.0.0-alpha.1(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) + version: 12.0.0-alpha.1(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) react: specifier: rc - version: 19.0.0-rc-f9ebd85a-20240925 + version: 19.0.0-rc-778e1ed2-20240926 react-dom: specifier: rc - version: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + version: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) react-error-boundary: specifier: 4.0.13 - version: 4.0.13(react@19.0.0-rc-f9ebd85a-20240925) + version: 4.0.13(react@19.0.0-rc-778e1ed2-20240926) react-i18next: specifier: 15.0.2 - version: 15.0.2(i18next@23.15.1)(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) + version: 15.0.2(i18next@23.15.1)(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) react-use: specifier: 17.5.1 - version: 17.5.1(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) + version: 17.5.1(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) vite: specifier: 5.4.8 - version: 5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0) + version: 5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0) vite-tsconfig-paths: specifier: 5.0.1 - version: 5.0.1(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)) + version: 5.0.1(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)) devDependencies: '@emotion/react': specifier: 11.13.3 - version: 11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + version: 11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) '@types/d3-interpolate-path': specifier: 2.0.3 version: 2.0.3 @@ -493,7 +493,7 @@ importers: version: 5.1.0(typescript@5.6.2) vite-plugin-dts: specifier: 4.2.2 - version: 4.2.2(@types/node@22.7.0)(rollup@4.21.0)(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)) + version: 4.2.2(@types/node@22.7.2)(rollup@4.21.0)(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)) scripts: dependencies: @@ -1351,8 +1351,8 @@ packages: '@vue/compiler-sfc': optional: true - '@iconify/json@2.2.252': - resolution: {integrity: sha512-AtdDjLhN4aBEncnWghiw9JdBRxKAXFcaQmwDFDWPL1UF/cPuuC8BADZzfHIoVcVlEvEbv69tFrzmhj1z/+PGlA==} + '@iconify/json@2.2.253': + resolution: {integrity: sha512-lGfG3aaprpO+zg0mP4BJR69ezBG7V/rIyJy/76kWxmJFyKXLhEfdmnlH+wn5D7uOl5CpApTVBbSTrusf7fe0ww==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -2037,17 +2037,17 @@ packages: '@rushstack/ts-command-line@4.22.6': resolution: {integrity: sha512-QSRqHT/IfoC5nk9zn6+fgyqOPXHME0BfchII9EUPR19pocsNp/xSbeBCbD3PIR2Lg+Q5qk7OFqk1VhWPMdKHJg==} - '@shikijs/core@1.18.0': - resolution: {integrity: sha512-VK4BNVCd2leY62Nm2JjyxtRLkyrZT/tv104O81eyaCjHq4Adceq2uJVFJJAIof6lT1mBwZrEo2qT/T+grv3MQQ==} + '@shikijs/core@1.19.0': + resolution: {integrity: sha512-314J5MPdS1wzfjuD856MXvbAI2wN03ofMnUGkZ5ZDBOza/d38paLwd+YVyuKrrjxJ4hfPMjc4tRmPkXd6UDMPQ==} - '@shikijs/engine-javascript@1.18.0': - resolution: {integrity: sha512-qoP/aO/ATNwYAUw1YMdaip/YVEstMZEgrwhePm83Ll9OeQPuxDZd48szZR8oSQNQBT8m8UlWxZv8EA3lFuyI5A==} + '@shikijs/engine-javascript@1.19.0': + resolution: {integrity: sha512-D1sioU61n7fLWfDzTC9JNS19zEYZMr7qxkSVzv6ziEWDxnwzy2PvYoKPedJV4qUf+2VnrYPSaArDz2W0XgGB7A==} - '@shikijs/engine-oniguruma@1.18.0': - resolution: {integrity: sha512-B9u0ZKI/cud+TcmF8Chyh+R4V5qQVvyDOqXC2l2a4x73PBSBc6sZ0JRAX3eqyJswqir6ktwApUUGBYePdKnMJg==} + '@shikijs/engine-oniguruma@1.19.0': + resolution: {integrity: sha512-/JxwIefNVLGB4EmpB8i6P4JB/oVYRuzSixbqvx7m6iPW0lQ1T97c/0wmA+JlKbngEiExckSuPwa48fajlShB7A==} - '@shikijs/types@1.18.0': - resolution: {integrity: sha512-O9N36UEaGGrxv1yUrN2nye7gDLG5Uq0/c1LyfmxsvzNPqlHzWo9DI0A4+fhW2y3bGKuQu/fwS7EPdKJJCowcVA==} + '@shikijs/types@1.19.0': + resolution: {integrity: sha512-NZvVp3k1bP4MTRUbmnkGhYzPdoNMjNLSAwczMRUbtUl4oj2LlNRNbwERyeIyJt56Ac9fvPVZ2nn13OXk86E5UQ==} '@shikijs/vscode-textmate@9.2.2': resolution: {integrity: sha512-TMp15K+GGYrWlZM8+Lnj9EaHEFmOen0WJBrfa17hF7taDOYthuPPV0GWzfd/9iMij0akS/8Yw2ikquH7uVi/fg==} @@ -2258,8 +2258,8 @@ packages: resolution: {integrity: sha512-oj/97KWi8EHFx/w07fAuXXyhWi5xgSMCfzbB9q42c1ZdLbv8wzBo4a6PO1fCi01tpKKHUopA8dSlGIOeJDhBAA==} engines: {node: '>=12'} - '@tanstack/router-plugin@1.58.4': - resolution: {integrity: sha512-Ypoy+HrHwpv9A41bj7dpHhtLYavu7CU8WyuJnuFBY3SI5ZKWF7s/hMYUtVmEVwwT7fJCVQ8gcTkbfAag4uy/pA==} + '@tanstack/router-plugin@1.58.10': + resolution: {integrity: sha512-Jc7ks7vC8H4yCU74kc0YM4zO5KK2hJlncaTMPB9muZoeMgbk/3QaliNXr6JrpnnO9JQ1bUIslTdgNVCWJa0Hdw==} engines: {node: '>=12'} peerDependencies: '@rsbuild/core': '>=1.0.2' @@ -2581,8 +2581,8 @@ packages: '@types/node@22.5.0': resolution: {integrity: sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==} - '@types/node@22.7.0': - resolution: {integrity: sha512-MOdOibwBs6KW1vfqz2uKMlxq5xAfAZ98SZjO8e3XnAbFnTJtAspqhWk7hrdSAs9/Y14ZWMiy7/MxMUzAOadYEw==} + '@types/node@22.7.2': + resolution: {integrity: sha512-866lXSrpGpgyHBZUa2m9YNWqHDjjM0aBTJlNtYaGEw4rqY/dcD7deRVTbBBAJelfA7oaGDbNftXF/TL/A6RgoA==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -5768,10 +5768,10 @@ packages: resolution: {integrity: sha512-RcSV/u+lPChcTB+A4fij0xkE204yzKdAsGUFy6+DrfUzWSawB+cu0n3WLmJcJXQ/VnmjSUlIrqmVLicRhT/gLA==} hasBin: true - react-dom@19.0.0-rc-f9ebd85a-20240925: - resolution: {integrity: sha512-UZOxsIANgXkpAdQOfM/qDeMm/+PYYM3YdM8hmpkGigR9qSm7rLaReKSMR+IUsivd4t5SC5NLIBhl6dhc9ATSaQ==} + react-dom@19.0.0-rc-778e1ed2-20240926: + resolution: {integrity: sha512-9FLXiKN8/nxd+TcrjIPKxxWQZVTr4lBbuPIcRly8Ch6FZsTrFmpF3I++0+1HoKDlg4JwPvQ/H3+4OfRpgNn7bQ==} peerDependencies: - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 react-error-boundary@4.0.13: resolution: {integrity: sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==} @@ -5873,8 +5873,8 @@ packages: react: '*' react-dom: '*' - react@19.0.0-rc-f9ebd85a-20240925: - resolution: {integrity: sha512-YRbWSW32HAvIovsE20PwB4/9/peFDxBlFvQ655nbY5oF9HdAgTj3uH/3mDtfI4UpwsD6Jc904JzlILY1tu8Cbw==} + react@19.0.0-rc-778e1ed2-20240926: + resolution: {integrity: sha512-Z0qJs/iVQ+tHmnTa+4jK9kx+GEwDj5GmbqX26CQE6RPx2RCHzpls/o/UeN6IC8xCZL5hQiLcF5dtq3cWo7F8Fg==} engines: {node: '>=0.10.0'} read-cache@1.0.0: @@ -6173,8 +6173,8 @@ packages: sax@1.3.0: resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} - scheduler@0.25.0-rc-f9ebd85a-20240925: - resolution: {integrity: sha512-d1WcHlilB64a37qcafwYE3vCEywShAQkE2g96dtWJI6AAViuZUh527UgAoI15hoEN08GRZ1oYVpfVRrKm3s9lg==} + scheduler@0.25.0-rc-778e1ed2-20240926: + resolution: {integrity: sha512-X3XrKE/18iWn/pG0QA9WEx7P1ohOzrddY5Jv8V7tC3U1+mO/eQTn7OjemdWAJ+BOyhbeYZxye5BIOq6Auvo67A==} screenfull@5.2.0: resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} @@ -6243,8 +6243,8 @@ packages: shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - shiki@1.18.0: - resolution: {integrity: sha512-8jo7tOXr96h9PBQmOHVrltnETn1honZZY76YA79MHheGQg55jBvbm9dtU+MI5pjC5NJCFuA6rvVTLVeSW5cE4A==} + shiki@1.19.0: + resolution: {integrity: sha512-Ng7Gd6XgWFLsv4Z3so65hOyXjV78qz1M117MuZHwdPQD6fgb5wR2IoLMvSlM/Ml14EXH7n+/YxIpTD74i7kDdw==} side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} @@ -7548,11 +7548,11 @@ snapshots: '@bufbuild/protobuf@1.10.0': {} - '@commitlint/cli@19.5.0(@types/node@22.7.0)(typescript@5.6.2)': + '@commitlint/cli@19.5.0(@types/node@22.7.2)(typescript@5.6.2)': dependencies: '@commitlint/format': 19.5.0 '@commitlint/lint': 19.5.0 - '@commitlint/load': 19.5.0(@types/node@22.7.0)(typescript@5.6.2) + '@commitlint/load': 19.5.0(@types/node@22.7.2)(typescript@5.6.2) '@commitlint/read': 19.5.0 '@commitlint/types': 19.5.0 tinyexec: 0.3.0 @@ -7599,7 +7599,7 @@ snapshots: '@commitlint/rules': 19.5.0 '@commitlint/types': 19.5.0 - '@commitlint/load@19.5.0(@types/node@22.7.0)(typescript@5.6.2)': + '@commitlint/load@19.5.0(@types/node@22.7.2)(typescript@5.6.2)': dependencies: '@commitlint/config-validator': 19.5.0 '@commitlint/execute-rule': 19.5.0 @@ -7607,7 +7607,7 @@ snapshots: '@commitlint/types': 19.5.0 chalk: 5.3.0 cosmiconfig: 9.0.0(typescript@5.6.2) - cosmiconfig-typescript-loader: 5.0.0(@types/node@22.7.0)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2) + cosmiconfig-typescript-loader: 5.0.0(@types/node@22.7.2)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -7679,29 +7679,29 @@ snapshots: '@ctrl/tinycolor@4.1.0': {} - '@dnd-kit/accessibility@3.1.0(react@19.0.0-rc-f9ebd85a-20240925)': + '@dnd-kit/accessibility@3.1.0(react@19.0.0-rc-778e1ed2-20240926)': dependencies: - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 tslib: 2.6.2 - '@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)': + '@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)': dependencies: - '@dnd-kit/accessibility': 3.1.0(react@19.0.0-rc-f9ebd85a-20240925) - '@dnd-kit/utilities': 3.2.2(react@19.0.0-rc-f9ebd85a-20240925) - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + '@dnd-kit/accessibility': 3.1.0(react@19.0.0-rc-778e1ed2-20240926) + '@dnd-kit/utilities': 3.2.2(react@19.0.0-rc-778e1ed2-20240926) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) tslib: 2.6.2 - '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)': + '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)': dependencies: - '@dnd-kit/core': 6.1.0(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) - '@dnd-kit/utilities': 3.2.2(react@19.0.0-rc-f9ebd85a-20240925) - react: 19.0.0-rc-f9ebd85a-20240925 + '@dnd-kit/core': 6.1.0(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) + '@dnd-kit/utilities': 3.2.2(react@19.0.0-rc-778e1ed2-20240926) + react: 19.0.0-rc-778e1ed2-20240926 tslib: 2.6.2 - '@dnd-kit/utilities@3.2.2(react@19.0.0-rc-f9ebd85a-20240925)': + '@dnd-kit/utilities@3.2.2(react@19.0.0-rc-778e1ed2-20240926)': dependencies: - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 tslib: 2.6.2 '@dual-bundle/import-meta-resolve@4.1.0': {} @@ -7758,17 +7758,17 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.24.8 '@emotion/babel-plugin': 11.12.0 '@emotion/cache': 11.13.0 '@emotion/serialize': 1.3.1 - '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@19.0.0-rc-f9ebd85a-20240925) + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@19.0.0-rc-778e1ed2-20240926) '@emotion/utils': 1.4.0 '@emotion/weak-memoize': 0.4.0 hoist-non-react-statics: 3.3.2 - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 @@ -7790,16 +7790,16 @@ snapshots: '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.24.8 '@emotion/babel-plugin': 11.12.0 '@emotion/is-prop-valid': 1.3.0 - '@emotion/react': 11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) '@emotion/serialize': 1.3.0 - '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@19.0.0-rc-f9ebd85a-20240925) + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@19.0.0-rc-778e1ed2-20240926) '@emotion/utils': 1.4.0 - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 @@ -7807,9 +7807,9 @@ snapshots: '@emotion/unitless@0.9.0': {} - '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@19.0.0-rc-f9ebd85a-20240925)': + '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@19.0.0-rc-778e1ed2-20240926)': dependencies: - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 '@emotion/utils@1.4.0': {} @@ -7990,11 +7990,11 @@ snapshots: '@floating-ui/core': 1.6.1 '@floating-ui/utils': 0.2.2 - '@floating-ui/react-dom@2.1.2(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)': + '@floating-ui/react-dom@2.1.2(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)': dependencies: '@floating-ui/dom': 1.6.5 - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) '@floating-ui/utils@0.2.2': {} @@ -8027,7 +8027,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@iconify/json@2.2.252': + '@iconify/json@2.2.253': dependencies: '@iconify/types': 2.0.0 pathe: 1.1.2 @@ -8080,23 +8080,23 @@ snapshots: '@material/material-color-utilities@0.3.0': {} - '@microsoft/api-extractor-model@7.29.6(@types/node@22.7.0)': + '@microsoft/api-extractor-model@7.29.6(@types/node@22.7.2)': dependencies: '@microsoft/tsdoc': 0.15.0 '@microsoft/tsdoc-config': 0.17.0 - '@rushstack/node-core-library': 5.7.0(@types/node@22.7.0) + '@rushstack/node-core-library': 5.7.0(@types/node@22.7.2) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.47.7(@types/node@22.7.0)': + '@microsoft/api-extractor@7.47.7(@types/node@22.7.2)': dependencies: - '@microsoft/api-extractor-model': 7.29.6(@types/node@22.7.0) + '@microsoft/api-extractor-model': 7.29.6(@types/node@22.7.2) '@microsoft/tsdoc': 0.15.0 '@microsoft/tsdoc-config': 0.17.0 - '@rushstack/node-core-library': 5.7.0(@types/node@22.7.0) + '@rushstack/node-core-library': 5.7.0(@types/node@22.7.2) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.14.0(@types/node@22.7.0) - '@rushstack/ts-command-line': 4.22.6(@types/node@22.7.0) + '@rushstack/terminal': 0.14.0(@types/node@22.7.2) + '@rushstack/ts-command-line': 4.22.6(@types/node@22.7.2) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.8 @@ -8120,204 +8120,204 @@ snapshots: monaco-editor: 0.52.0 state-local: 1.0.7 - '@monaco-editor/react@4.6.0(monaco-editor@0.52.0)(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)': + '@monaco-editor/react@4.6.0(monaco-editor@0.52.0)(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)': dependencies: '@monaco-editor/loader': 1.4.0(monaco-editor@0.52.0) monaco-editor: 0.52.0 - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) - '@mui/base@5.0.0-beta.58(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@mui/base@5.0.0-beta.58(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 - '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) + '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) '@mui/types': 7.2.17(types-react@19.0.0-rc.1) - '@mui/utils': 6.0.0-rc.0(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + '@mui/utils': 6.0.0-rc.0(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) '@popperjs/core': 2.11.8 clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) optionalDependencies: '@types/react': types-react@19.0.0-rc.1 '@mui/core-downloads-tracker@6.1.1': {} - '@mui/icons-material@6.1.1(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@mui/icons-material@6.1.1(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 - '@mui/material': 6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-f9ebd85a-20240925 + '@mui/material': 6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-778e1ed2-20240926 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@mui/lab@6.0.0-beta.10(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@mui/lab@6.0.0-beta.10(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 - '@mui/base': 5.0.0-beta.58(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@mui/material': 6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@mui/system': 6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + '@mui/base': 5.0.0-beta.58(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@mui/material': 6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@mui/system': 6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) '@mui/types': 7.2.17(types-react@19.0.0-rc.1) - '@mui/utils': 6.1.1(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + '@mui/utils': 6.1.1(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) optionalDependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) '@types/react': types-react@19.0.0-rc.1 - '@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 '@mui/core-downloads-tracker': 6.1.1 - '@mui/system': 6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + '@mui/system': 6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) '@mui/types': 7.2.17(types-react@19.0.0-rc.1) - '@mui/utils': 6.1.1(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + '@mui/utils': 6.1.1(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) '@popperjs/core': 2.11.8 '@types/react-transition-group': 4.4.11 clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) react-is: 18.3.1 - react-transition-group: 4.4.5(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) + react-transition-group: 4.4.5(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) optionalDependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) '@types/react': types-react@19.0.0-rc.1 - '@mui/private-theming@5.16.6(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@mui/private-theming@5.16.6(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 - '@mui/utils': 5.16.6(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + '@mui/utils': 5.16.6(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) prop-types: 15.8.1 - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@mui/private-theming@6.1.1(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@mui/private-theming@6.1.1(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 - '@mui/utils': 6.1.1(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + '@mui/utils': 6.1.1(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) prop-types: 15.8.1 - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@mui/styled-engine@5.16.6(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)': + '@mui/styled-engine@5.16.6(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)': dependencies: '@babel/runtime': 7.25.6 '@emotion/cache': 11.13.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 optionalDependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) - '@mui/styled-engine@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)': + '@mui/styled-engine@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)': dependencies: '@babel/runtime': 7.25.6 '@emotion/cache': 11.13.1 '@emotion/sheet': 1.4.0 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 optionalDependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) - '@mui/system@5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@mui/system@5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 - '@mui/private-theming': 5.16.6(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@mui/styled-engine': 5.16.6(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925) + '@mui/private-theming': 5.16.6(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@mui/styled-engine': 5.16.6(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926) '@mui/types': 7.2.17(types-react@19.0.0-rc.1) - '@mui/utils': 5.16.6(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + '@mui/utils': 5.16.6(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 optionalDependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) '@types/react': types-react@19.0.0-rc.1 - '@mui/system@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@mui/system@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 - '@mui/private-theming': 6.1.1(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@mui/styled-engine': 6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925) + '@mui/private-theming': 6.1.1(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@mui/styled-engine': 6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926) '@mui/types': 7.2.17(types-react@19.0.0-rc.1) - '@mui/utils': 6.1.1(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + '@mui/utils': 6.1.1(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 optionalDependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) '@types/react': types-react@19.0.0-rc.1 '@mui/types@7.2.17(types-react@19.0.0-rc.1)': optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@mui/utils@5.16.6(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@mui/utils@5.16.6(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 '@mui/types': 7.2.17(types-react@19.0.0-rc.1) '@types/prop-types': 15.7.12 clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 react-is: 18.3.1 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@mui/utils@6.0.0-rc.0(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@mui/utils@6.0.0-rc.0(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 '@mui/types': 7.2.17(types-react@19.0.0-rc.1) '@types/prop-types': 15.7.12 clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 react-is: 18.3.1 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@mui/utils@6.1.1(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@mui/utils@6.1.1(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 '@mui/types': 7.2.17(types-react@19.0.0-rc.1) '@types/prop-types': 15.7.12 clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 react-is: 18.3.1 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@mui/x-date-pickers@7.9.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(dayjs@1.11.13)(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@mui/x-date-pickers@7.9.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(dayjs@1.11.13)(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 - '@mui/base': 5.0.0-beta.58(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@mui/material': 6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@mui/system': 5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@mui/utils': 5.16.6(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + '@mui/base': 5.0.0-beta.58(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@mui/material': 6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@mui/system': 5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@mui/utils': 5.16.6(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) '@types/react-transition-group': 4.4.11 clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) - react-transition-group: 4.4.5(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) + react-transition-group: 4.4.5(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) optionalDependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) dayjs: 1.11.13 transitivePeerDependencies: - '@types/react' @@ -8544,82 +8544,82 @@ snapshots: '@radix-ui/primitive@1.1.0': {} - '@radix-ui/react-compose-refs@1.1.0(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@radix-ui/react-compose-refs@1.1.0(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-context@1.1.0(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@radix-ui/react-context@1.1.0(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-direction@1.1.0(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@radix-ui/react-direction@1.1.0(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-portal@1.1.1(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@radix-ui/react-portal@1.1.1(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-presence@1.1.0(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@radix-ui/react-presence@1.1.0(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-primitive@2.0.0(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@radix-ui/react-primitive@2.0.0(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: - '@radix-ui/react-slot': 1.1.0(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + '@radix-ui/react-slot': 1.1.0(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-scroll-area@1.1.0(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@radix-ui/react-scroll-area@1.1.0(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: '@radix-ui/number': 1.1.0 '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@radix-ui/react-context': 1.1.0(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@radix-ui/react-direction': 1.1.0(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@radix-ui/react-presence': 1.1.0(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@radix-ui/react-context': 1.1.0(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@radix-ui/react-direction': 1.1.0(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@radix-ui/react-presence': 1.1.0(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-slot@1.1.0(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@radix-ui/react-slot@1.1.0(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-f9ebd85a-20240925 + '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-778e1ed2-20240926 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-use-callback-ref@1.1.0(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@radix-ui/react-use-callback-ref@1.1.0(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-use-layout-effect@1.1.0(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1)': + '@radix-ui/react-use-layout-effect@1.1.0(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1)': dependencies: - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 @@ -8683,7 +8683,7 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@rushstack/node-core-library@5.7.0(@types/node@22.7.0)': + '@rushstack/node-core-library@5.7.0(@types/node@22.7.2)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -8694,50 +8694,50 @@ snapshots: resolve: 1.22.8 semver: 7.5.4 optionalDependencies: - '@types/node': 22.7.0 + '@types/node': 22.7.2 '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.8 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.14.0(@types/node@22.7.0)': + '@rushstack/terminal@0.14.0(@types/node@22.7.2)': dependencies: - '@rushstack/node-core-library': 5.7.0(@types/node@22.7.0) + '@rushstack/node-core-library': 5.7.0(@types/node@22.7.2) supports-color: 8.1.1 optionalDependencies: - '@types/node': 22.7.0 + '@types/node': 22.7.2 - '@rushstack/ts-command-line@4.22.6(@types/node@22.7.0)': + '@rushstack/ts-command-line@4.22.6(@types/node@22.7.2)': dependencies: - '@rushstack/terminal': 0.14.0(@types/node@22.7.0) + '@rushstack/terminal': 0.14.0(@types/node@22.7.2) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 transitivePeerDependencies: - '@types/node' - '@shikijs/core@1.18.0': + '@shikijs/core@1.19.0': dependencies: - '@shikijs/engine-javascript': 1.18.0 - '@shikijs/engine-oniguruma': 1.18.0 - '@shikijs/types': 1.18.0 + '@shikijs/engine-javascript': 1.19.0 + '@shikijs/engine-oniguruma': 1.19.0 + '@shikijs/types': 1.19.0 '@shikijs/vscode-textmate': 9.2.2 '@types/hast': 3.0.4 hast-util-to-html: 9.0.3 - '@shikijs/engine-javascript@1.18.0': + '@shikijs/engine-javascript@1.19.0': dependencies: - '@shikijs/types': 1.18.0 + '@shikijs/types': 1.19.0 '@shikijs/vscode-textmate': 9.2.2 oniguruma-to-js: 0.4.3 - '@shikijs/engine-oniguruma@1.18.0': + '@shikijs/engine-oniguruma@1.19.0': dependencies: - '@shikijs/types': 1.18.0 + '@shikijs/types': 1.19.0 '@shikijs/vscode-textmate': 9.2.2 - '@shikijs/types@1.18.0': + '@shikijs/types@1.19.0': dependencies: '@shikijs/vscode-textmate': 9.2.2 '@types/hast': 3.0.4 @@ -8884,43 +8884,43 @@ snapshots: dependencies: remove-accents: 0.5.0 - '@tanstack/react-router@1.58.9(@tanstack/router-generator@1.58.1)(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)': + '@tanstack/react-router@1.58.9(@tanstack/router-generator@1.58.1)(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)': dependencies: '@tanstack/history': 1.57.6 - '@tanstack/react-store': 0.5.5(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + '@tanstack/react-store': 0.5.5(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 optionalDependencies: '@tanstack/router-generator': 1.58.1 - '@tanstack/react-store@0.5.5(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)': + '@tanstack/react-store@0.5.5(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)': dependencies: '@tanstack/store': 0.5.5 - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) - use-sync-external-store: 1.2.2(react@19.0.0-rc-f9ebd85a-20240925) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) + use-sync-external-store: 1.2.2(react@19.0.0-rc-778e1ed2-20240926) - '@tanstack/react-table@8.20.5(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)': + '@tanstack/react-table@8.20.5(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)': dependencies: '@tanstack/table-core': 8.20.5 - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) - '@tanstack/react-virtual@3.10.6(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)': + '@tanstack/react-virtual@3.10.6(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)': dependencies: '@tanstack/virtual-core': 3.10.6 - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) - '@tanstack/router-devtools@1.58.9(@tanstack/react-router@1.58.9(@tanstack/router-generator@1.58.1)(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925))(csstype@3.1.3)(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)': + '@tanstack/router-devtools@1.58.9(@tanstack/react-router@1.58.9(@tanstack/router-generator@1.58.1)(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926))(csstype@3.1.3)(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)': dependencies: - '@tanstack/react-router': 1.58.9(@tanstack/router-generator@1.58.1)(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) + '@tanstack/react-router': 1.58.9(@tanstack/router-generator@1.58.1)(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) clsx: 2.1.1 goober: 2.1.14(csstype@3.1.3) - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) transitivePeerDependencies: - csstype @@ -8931,7 +8931,7 @@ snapshots: tsx: 4.19.1 zod: 3.23.8 - '@tanstack/router-plugin@1.58.4(vite@5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0))(webpack-sources@3.2.3)': + '@tanstack/router-plugin@1.58.10(vite@5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0))(webpack-sources@3.2.3)': dependencies: '@babel/core': 7.25.2 '@babel/generator': 7.25.6 @@ -8952,14 +8952,14 @@ snapshots: unplugin: 1.14.1(webpack-sources@3.2.3) zod: 3.23.8 optionalDependencies: - vite: 5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0) + vite: 5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0) transitivePeerDependencies: - supports-color - webpack-sources - '@tanstack/router-zod-adapter@1.58.9(@tanstack/react-router@1.58.9(@tanstack/router-generator@1.58.1)(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925))(zod@3.23.8)': + '@tanstack/router-zod-adapter@1.58.9(@tanstack/react-router@1.58.9(@tanstack/router-generator@1.58.1)(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926))(zod@3.23.8)': dependencies: - '@tanstack/react-router': 1.58.9(@tanstack/router-generator@1.58.1)(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) + '@tanstack/react-router': 1.58.9(@tanstack/router-generator@1.58.1)(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) zod: 3.23.8 '@tanstack/store@0.5.5': {} @@ -9099,12 +9099,12 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 22.7.0 + '@types/node': 22.7.2 '@types/responselike': 1.0.3 '@types/conventional-commits-parser@5.0.0': dependencies: - '@types/node': 22.7.0 + '@types/node': 22.7.2 '@types/d3-array@3.2.1': {} @@ -9240,7 +9240,7 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 22.7.0 + '@types/node': 22.7.2 '@types/geojson@7946.0.14': {} @@ -9258,11 +9258,11 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 22.7.0 + '@types/node': 22.7.2 '@types/keyv@3.1.4': dependencies: - '@types/node': 22.7.0 + '@types/node': 22.7.2 '@types/lodash-es@4.17.12': dependencies: @@ -9282,7 +9282,7 @@ snapshots: dependencies: undici-types: 6.19.8 - '@types/node@22.7.0': + '@types/node@22.7.2': dependencies: undici-types: 6.19.8 @@ -9304,7 +9304,7 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 22.7.0 + '@types/node': 22.7.2 '@types/retry@0.12.2': {} @@ -9316,7 +9316,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.7.0 + '@types/node': 22.7.2 optional: true '@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2)': @@ -9402,21 +9402,21 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react-swc@3.7.0(vite@5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0))': + '@vitejs/plugin-react-swc@3.7.0(vite@5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0))': dependencies: '@swc/core': 1.6.1 - vite: 5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0) + vite: 5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@4.3.1(vite@5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0))': + '@vitejs/plugin-react@4.3.1(vite@5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0))': dependencies: '@babel/core': 7.24.5 '@babel/plugin-transform-react-jsx-self': 7.24.5(@babel/core@7.24.5) '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.5) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0) + vite: 5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0) transitivePeerDependencies: - supports-color @@ -9506,14 +9506,14 @@ snapshots: clean-stack: 5.2.0 indent-string: 5.0.0 - ahooks@3.8.1(react@19.0.0-rc-f9ebd85a-20240925): + ahooks@3.8.1(react@19.0.0-rc-778e1ed2-20240926): dependencies: '@babel/runtime': 7.24.8 dayjs: 1.11.12 intersection-observer: 0.12.2 js-cookie: 3.0.5 lodash: 4.17.21 - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 react-fast-compare: 3.2.2 resize-observer-polyfill: 1.5.1 screenfull: 5.2.0 @@ -9555,16 +9555,16 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - allotment@1.20.2(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925): + allotment@1.20.2(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926): dependencies: classnames: 2.5.1 eventemitter3: 5.0.1 lodash.clamp: 4.0.3 lodash.debounce: 4.0.8 lodash.isequal: 4.5.0 - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) - use-resize-observer: 9.1.0(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) + use-resize-observer: 9.1.0(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) ansi-align@2.0.0: dependencies: @@ -9998,9 +9998,9 @@ snapshots: dependencies: toggle-selection: 1.0.6 - cosmiconfig-typescript-loader@5.0.0(@types/node@22.7.0)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2): + cosmiconfig-typescript-loader@5.0.0(@types/node@22.7.2)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2): dependencies: - '@types/node': 22.7.0 + '@types/node': 22.7.2 cosmiconfig: 9.0.0(typescript@5.6.2) jiti: 1.21.6 typescript: 5.6.2 @@ -11024,13 +11024,13 @@ snapshots: fraction.js@4.3.7: {} - framer-motion@12.0.0-alpha.1(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925): + framer-motion@12.0.0-alpha.1(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926): dependencies: tslib: 2.6.2 optionalDependencies: '@emotion/is-prop-valid': 1.3.0 - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) fs-extra@11.2.0: dependencies: @@ -11642,10 +11642,10 @@ snapshots: jju@1.4.0: {} - jotai@2.10.0(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1): + jotai@2.10.0(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1): optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 js-cookie@2.2.1: {} @@ -11713,11 +11713,11 @@ snapshots: kind-of@6.0.3: {} - knip@5.30.5(@types/node@22.7.0)(typescript@5.6.2): + knip@5.30.5(@types/node@22.7.2)(typescript@5.6.2): dependencies: '@nodelib/fs.walk': 1.2.8 '@snyk/github-codeowners': 1.1.0 - '@types/node': 22.7.0 + '@types/node': 22.7.2 easy-table: 1.2.0 enhanced-resolve: 5.17.1 fast-glob: 3.3.2 @@ -11892,19 +11892,19 @@ snapshots: escape-string-regexp: 4.0.0 optional: true - material-react-table@3.0.1(tk74sipl6fb4w5cnuyckd67l2q): + material-react-table@3.0.1(scdjpuj6p6tus776axypnmttum): dependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@mui/icons-material': 6.1.1(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@mui/material': 6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@mui/x-date-pickers': 7.9.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(dayjs@1.11.13)(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@mui/icons-material': 6.1.1(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@mui/material': 6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@mui/x-date-pickers': 7.9.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(dayjs@1.11.13)(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) '@tanstack/match-sorter-utils': 8.19.4 - '@tanstack/react-table': 8.20.5(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) - '@tanstack/react-virtual': 3.10.6(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) + '@tanstack/react-table': 8.20.5(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) + '@tanstack/react-virtual': 3.10.6(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) highlight-words: 1.2.2 - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) mathml-tag-names@2.1.3: {} @@ -12237,14 +12237,14 @@ snapshots: muggle-string@0.4.1: {} - mui-color-input@4.0.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1): + mui-color-input@4.0.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1): dependencies: '@ctrl/tinycolor': 4.1.0 - '@emotion/react': 11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@mui/material': 6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + '@emotion/react': 11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@mui/material': 6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) optionalDependencies: '@types/react': types-react@19.0.0-rc.1 @@ -12254,15 +12254,15 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nano-css@5.6.2(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925): + nano-css@5.6.2(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926): dependencies: '@jridgewell/sourcemap-codec': 1.5.0 css-tree: 1.1.3 csstype: 3.1.3 fastest-stable-stringify: 2.0.2 inline-style-prefixer: 7.0.1 - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) rtl-css-js: 1.16.1 stacktrace-js: 2.0.2 stylis: 4.3.2 @@ -12805,50 +12805,50 @@ snapshots: - supports-color - utf-8-validate - react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925): + react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926): dependencies: - react: 19.0.0-rc-f9ebd85a-20240925 - scheduler: 0.25.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 + scheduler: 0.25.0-rc-778e1ed2-20240926 - react-error-boundary@4.0.13(react@19.0.0-rc-f9ebd85a-20240925): + react-error-boundary@4.0.13(react@19.0.0-rc-778e1ed2-20240926): dependencies: '@babel/runtime': 7.24.5 - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 react-fast-compare@3.2.2: {} - react-fast-marquee@1.6.5(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925): + react-fast-marquee@1.6.5(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926): dependencies: - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) - react-hook-form-mui@7.2.0(qjysoxakmzlaldi46ut6vobrcu): + react-hook-form-mui@7.2.0(kxevavldinoaaue37dtxsp7rui): dependencies: - '@mui/material': 6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-f9ebd85a-20240925 - react-hook-form: 7.52.1(react@19.0.0-rc-f9ebd85a-20240925) + '@mui/material': 6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-778e1ed2-20240926 + react-hook-form: 7.52.1(react@19.0.0-rc-778e1ed2-20240926) optionalDependencies: - '@mui/icons-material': 6.1.1(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) - '@mui/x-date-pickers': 7.9.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1))(dayjs@1.11.13)(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1) + '@mui/icons-material': 6.1.1(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) + '@mui/x-date-pickers': 7.9.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@mui/material@6.1.1(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1))(dayjs@1.11.13)(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1) - react-hook-form@7.52.1(react@19.0.0-rc-f9ebd85a-20240925): + react-hook-form@7.52.1(react@19.0.0-rc-778e1ed2-20240926): dependencies: - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 - react-i18next@15.0.2(i18next@23.15.1)(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925): + react-i18next@15.0.2(i18next@23.15.1)(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926): dependencies: '@babel/runtime': 7.25.6 html-parse-stringify: 3.0.1 i18next: 23.15.1 - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 optionalDependencies: - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) react-is@16.13.1: {} react-is@18.3.1: {} - react-markdown@9.0.1(react@19.0.0-rc-f9ebd85a-20240925)(types-react@19.0.0-rc.1): + react-markdown@9.0.1(react@19.0.0-rc-778e1ed2-20240926)(types-react@19.0.0-rc.1): dependencies: '@types/hast': 3.0.4 '@types/react': types-react@19.0.0-rc.1 @@ -12856,7 +12856,7 @@ snapshots: hast-util-to-jsx-runtime: 2.3.0 html-url-attributes: 3.0.0 mdast-util-to-hast: 13.1.0 - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 remark-parse: 11.0.0 remark-rehype: 11.1.0 unified: 11.0.4 @@ -12867,39 +12867,39 @@ snapshots: react-refresh@0.14.2: {} - react-router-dom@6.26.2(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925): + react-router-dom@6.26.2(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926): dependencies: '@remix-run/router': 1.19.2 - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) - react-router: 6.26.2(react@19.0.0-rc-f9ebd85a-20240925) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) + react-router: 6.26.2(react@19.0.0-rc-778e1ed2-20240926) - react-router@6.26.2(react@19.0.0-rc-f9ebd85a-20240925): + react-router@6.26.2(react@19.0.0-rc-778e1ed2-20240926): dependencies: '@remix-run/router': 1.19.2 - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 - react-split-grid@1.0.4(react@19.0.0-rc-f9ebd85a-20240925): + react-split-grid@1.0.4(react@19.0.0-rc-778e1ed2-20240926): dependencies: prop-types: 15.8.1 - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 split-grid: 1.0.11 - react-transition-group@4.4.5(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925): + react-transition-group@4.4.5(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926): dependencies: '@babel/runtime': 7.25.6 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) - react-universal-interface@0.6.2(react@19.0.0-rc-f9ebd85a-20240925)(tslib@2.6.2): + react-universal-interface@0.6.2(react@19.0.0-rc-778e1ed2-20240926)(tslib@2.6.2): dependencies: - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 tslib: 2.6.2 - react-use@17.5.1(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925): + react-use@17.5.1(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926): dependencies: '@types/js-cookie': 2.2.7 '@xobotyi/scrollbar-width': 1.9.5 @@ -12907,10 +12907,10 @@ snapshots: fast-deep-equal: 3.1.3 fast-shallow-equal: 1.0.0 js-cookie: 2.2.1 - nano-css: 5.6.2(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925) - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) - react-universal-interface: 0.6.2(react@19.0.0-rc-f9ebd85a-20240925)(tslib@2.6.2) + nano-css: 5.6.2(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) + react-universal-interface: 0.6.2(react@19.0.0-rc-778e1ed2-20240926)(tslib@2.6.2) resize-observer-polyfill: 1.5.1 screenfull: 5.2.0 set-harmonic-interval: 1.0.1 @@ -12918,7 +12918,7 @@ snapshots: ts-easing: 0.2.0 tslib: 2.6.2 - react@19.0.0-rc-f9ebd85a-20240925: {} + react@19.0.0-rc-778e1ed2-20240926: {} read-cache@1.0.0: dependencies: @@ -13214,7 +13214,7 @@ snapshots: sax@1.3.0: {} - scheduler@0.25.0-rc-f9ebd85a-20240925: {} + scheduler@0.25.0-rc-778e1ed2-20240926: {} screenfull@5.2.0: {} @@ -13274,12 +13274,12 @@ snapshots: shell-quote@1.8.1: {} - shiki@1.18.0: + shiki@1.19.0: dependencies: - '@shikijs/core': 1.18.0 - '@shikijs/engine-javascript': 1.18.0 - '@shikijs/engine-oniguruma': 1.18.0 - '@shikijs/types': 1.18.0 + '@shikijs/core': 1.19.0 + '@shikijs/engine-javascript': 1.19.0 + '@shikijs/engine-oniguruma': 1.19.0 + '@shikijs/types': 1.19.0 '@shikijs/vscode-textmate': 9.2.2 '@types/hast': 3.0.4 @@ -13622,11 +13622,11 @@ snapshots: svg-tags@1.0.0: {} - swr@2.2.5(react@19.0.0-rc-f9ebd85a-20240925): + swr@2.2.5(react@19.0.0-rc-778e1ed2-20240926): dependencies: client-only: 0.0.1 - react: 19.0.0-rc-f9ebd85a-20240925 - use-sync-external-store: 1.2.2(react@19.0.0-rc-f9ebd85a-20240925) + react: 19.0.0-rc-778e1ed2-20240926 + use-sync-external-store: 1.2.2(react@19.0.0-rc-778e1ed2-20240926) synckit@0.9.1: dependencies: @@ -14065,15 +14065,15 @@ snapshots: dependencies: prepend-http: 1.0.4 - use-resize-observer@9.1.0(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925): + use-resize-observer@9.1.0(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926): dependencies: '@juggle/resize-observer': 3.4.0 - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) - use-sync-external-store@1.2.2(react@19.0.0-rc-f9ebd85a-20240925): + use-sync-external-store@1.2.2(react@19.0.0-rc-778e1ed2-20240926): dependencies: - react: 19.0.0-rc-f9ebd85a-20240925 + react: 19.0.0-rc-778e1ed2-20240926 utf-8-validate@5.0.10: dependencies: @@ -14096,10 +14096,10 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - virtua@0.34.2(react-dom@19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925))(react@19.0.0-rc-f9ebd85a-20240925): + virtua@0.34.2(react-dom@19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926))(react@19.0.0-rc-778e1ed2-20240926): optionalDependencies: - react: 19.0.0-rc-f9ebd85a-20240925 - react-dom: 19.0.0-rc-f9ebd85a-20240925(react@19.0.0-rc-f9ebd85a-20240925) + react: 19.0.0-rc-778e1ed2-20240926 + react-dom: 19.0.0-rc-778e1ed2-20240926(react@19.0.0-rc-778e1ed2-20240926) vite-bundle-visualizer@1.2.1(rollup@4.21.0): dependencies: @@ -14111,9 +14111,9 @@ snapshots: - rollup - supports-color - vite-plugin-dts@4.2.2(@types/node@22.7.0)(rollup@4.21.0)(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)): + vite-plugin-dts@4.2.2(@types/node@22.7.2)(rollup@4.21.0)(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)): dependencies: - '@microsoft/api-extractor': 7.47.7(@types/node@22.7.0) + '@microsoft/api-extractor': 7.47.7(@types/node@22.7.2) '@rollup/pluginutils': 5.1.0(rollup@4.21.0) '@volar/typescript': 2.4.5 '@vue/language-core': 2.1.6(typescript@5.6.2) @@ -14124,49 +14124,49 @@ snapshots: magic-string: 0.30.11 typescript: 5.6.2 optionalDependencies: - vite: 5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0) + vite: 5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-sass-dts@1.3.29(postcss@8.4.47)(prettier@3.3.3)(sass-embedded@1.78.0)(vite@5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)): + vite-plugin-sass-dts@1.3.29(postcss@8.4.47)(prettier@3.3.3)(sass-embedded@1.78.0)(vite@5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)): dependencies: postcss: 8.4.47 postcss-js: 4.0.1(postcss@8.4.47) prettier: 3.3.3 sass-embedded: 1.78.0 - vite: 5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0) + vite: 5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0) - vite-plugin-svgr@4.2.0(rollup@4.21.0)(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)): + vite-plugin-svgr@4.2.0(rollup@4.21.0)(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)): dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.21.0) '@svgr/core': 8.1.0(typescript@5.6.2) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.6.2)) - vite: 5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0) + vite: 5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0) transitivePeerDependencies: - rollup - supports-color - typescript - vite-tsconfig-paths@5.0.1(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)): + vite-tsconfig-paths@5.0.1(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0)): dependencies: debug: 4.3.6 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.6.2) optionalDependencies: - vite: 5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0) + vite: 5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0) transitivePeerDependencies: - supports-color - typescript - vite@5.4.8(@types/node@22.7.0)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0): + vite@5.4.8(@types/node@22.7.2)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.3)(stylus@0.62.0): dependencies: esbuild: 0.21.5 postcss: 8.4.47 rollup: 4.21.0 optionalDependencies: - '@types/node': 22.7.0 + '@types/node': 22.7.2 fsevents: 2.3.3 less: 4.2.0 sass: 1.79.3 diff --git a/lede/package/kernel/linux/modules/gpio.mk b/lede/package/kernel/linux/modules/gpio.mk index 511cd3af8c..fc6ab66ba8 100644 --- a/lede/package/kernel/linux/modules/gpio.mk +++ b/lede/package/kernel/linux/modules/gpio.mk @@ -109,7 +109,8 @@ define KernelPackage/gpio-pca953x SUBMENU:=$(GPIO_MENU) DEPENDS:=@GPIO_SUPPORT +kmod-i2c-core +kmod-regmap-i2c TITLE:=PCA95xx, TCA64xx, and MAX7310 I/O ports - KCONFIG:=CONFIG_GPIO_PCA953X + KCONFIG:=CONFIG_GPIO_PCA953X \ + CONFIG_GPIO_PCA953X_IRQ=y FILES:=$(LINUX_DIR)/drivers/gpio/gpio-pca953x.ko AUTOLOAD:=$(call AutoLoad,55,gpio-pca953x) endef diff --git a/lede/package/kernel/linux/modules/netdevices.mk b/lede/package/kernel/linux/modules/netdevices.mk index 8bc0bc8a08..6a8bfd3de0 100644 --- a/lede/package/kernel/linux/modules/netdevices.mk +++ b/lede/package/kernel/linux/modules/netdevices.mk @@ -96,7 +96,8 @@ $(eval $(call KernelPackage,atl1e)) define KernelPackage/libphy SUBMENU:=$(NETWORK_DEVICES_MENU) TITLE:=PHY library - KCONFIG:=CONFIG_PHYLIB + KCONFIG:=CONFIG_PHYLIB \ + CONFIG_PHYLIB_LEDS=y FILES:=$(LINUX_DIR)/drivers/net/phy/libphy.ko AUTOLOAD:=$(call AutoLoad,15,libphy,1) endef @@ -226,6 +227,19 @@ endef $(eval $(call KernelPackage,phylib-broadcom)) +define KernelPackage/phylib-qcom + SUBMENU:=$(NETWORK_DEVICES_MENU) + TITLE:=Qualcomm Ethernet PHY library + KCONFIG:=CONFIG_QCOM_NET_PHYLIB + HIDDEN:=1 + DEPENDS:=+kmod-libphy + FILES:=$(LINUX_DIR)/drivers/net/phy/qcom/qcom-phy-lib.ko + AUTOLOAD:=$(call AutoLoad,17,qcom-phy-lib) +endef + +$(eval $(call KernelPackage,phylib-qcom)) + + define KernelPackage/phy-amd SUBMENU:=$(NETWORK_DEVICES_MENU) TITLE:=AMD PHY driver @@ -242,6 +256,18 @@ endef $(eval $(call KernelPackage,phy-amd)) +define KernelPackage/phy-at803x + SUBMENU:=$(NETWORK_DEVICES_MENU) + TITLE:=Qualcomm Atheros 8337 internal PHY + KCONFIG:=CONFIG_AT803X_PHY + DEPENDS:=+kmod-phylib-qcom + FILES:=$(LINUX_DIR)/drivers/net/phy/qcom/at803x.ko + AUTOLOAD:=$(call AutoLoad,18,at803x,1) +endef + +$(eval $(call KernelPackage,phy-at803x)) + + define KernelPackage/phy-ax88796b SUBMENU:=$(NETWORK_DEVICES_MENU) TITLE:=Asix PHY driver @@ -292,6 +318,37 @@ endef $(eval $(call KernelPackage,phy-bcm84881)) +define KernelPackage/phy-intel-xway + SUBMENU:=$(NETWORK_DEVICES_MENU) + TITLE:=Intel XWAY PHYs + KCONFIG:=CONFIG_INTEL_XWAY_PHY + DEPENDS:=+kmod-libphy + FILES:=$(LINUX_DIR)/drivers/net/phy/intel-xway.ko + AUTOLOAD:=$(call AutoLoad,18,intel-xway,1) +endef + +define KernelPackage/phy-intel-xway/description + Supports the Intel XWAY (former Lantiq) 11G and 22E PHYs. + These PHYs are marked as standalone chips under the names + PEF 7061, PEF 7071 and PEF 7072 or integrated into the Intel + SoCs xRX200, xRX300, xRX330, xRX350 and xRX550. +endef + +$(eval $(call KernelPackage,phy-intel-xway)) + + +define KernelPackage/phy-qca83xx + SUBMENU:=$(NETWORK_DEVICES_MENU) + TITLE:=Qualcomm Atheros QCA833x PHY driver + KCONFIG:=CONFIG_QCA83XX_PHY + DEPENDS:=+kmod-phylib-qcom + FILES:=$(LINUX_DIR)/drivers/net/phy/qcom/qca83xx.ko + AUTOLOAD:=$(call AutoLoad,18,qca83xx,1) +endef + +$(eval $(call KernelPackage,phy-qca83xx)) + + define KernelPackage/phy-marvell SUBMENU:=$(NETWORK_DEVICES_MENU) TITLE:=Marvell Gigabit Ethernet PHY driver @@ -345,6 +402,23 @@ endef $(eval $(call KernelPackage,phy-marvell-10g)) + +define KernelPackage/phy-micrel + SUBMENU:=$(NETWORK_DEVICES_MENU) + TITLE:=Micrel PHYs + KCONFIG:=CONFIG_MICREL_PHY + DEPENDS:=+kmod-libphy +kmod-ptp + FILES:=$(LINUX_DIR)/drivers/net/phy/micrel.ko + AUTOLOAD:=$(call AutoLoad,18,micrel,1) +endef + +define KernelPackage/phy-micrel/description + Supports the KSZ9021, VSC8201, KS8001 PHYs. +endef + +$(eval $(call KernelPackage,phy-micrel)) + + define KernelPackage/phy-realtek SUBMENU:=$(NETWORK_DEVICES_MENU) TITLE:=Realtek Ethernet PHY driver @@ -377,6 +451,22 @@ endef $(eval $(call KernelPackage,phy-smsc)) +define KernelPackage/phy-vitesse + SUBMENU:=$(NETWORK_DEVICES_MENU) + TITLE:=Vitesse PHYs + KCONFIG:=CONFIG_VITESSE_PHY + DEPENDS:=+kmod-libphy + FILES:=$(LINUX_DIR)/drivers/net/phy/vitesse.ko + AUTOLOAD:=$(call AutoLoad,18,vitesse,1) +endef + +define KernelPackage/phy-vitesse/description + Currently supports the vsc8244 +endef + +$(eval $(call KernelPackage,phy-vitesse)) + + define KernelPackage/phy-aquantia SUBMENU:=$(NETWORK_DEVICES_MENU) TITLE:=Aquantia Ethernet PHYs @@ -398,7 +488,8 @@ define KernelPackage/swconfig SUBMENU:=$(NETWORK_DEVICES_MENU) TITLE:=switch configuration API DEPENDS:=+kmod-libphy - KCONFIG:=CONFIG_SWCONFIG + KCONFIG:=CONFIG_SWCONFIG \ + CONFIG_SWCONFIG_LEDS=y FILES:=$(LINUX_DIR)/drivers/net/phy/swconfig.ko AUTOLOAD:=$(call AutoLoad,41,swconfig) endef @@ -556,7 +647,8 @@ define KernelPackage/switch-ar8xxx SUBMENU:=$(NETWORK_DEVICES_MENU) TITLE:=Atheros AR8216/8327 switch support DEPENDS:=+kmod-swconfig +!LINUX_5_4:kmod-mdio-devres - KCONFIG:=CONFIG_AR8216_PHY + KCONFIG:=CONFIG_AR8216_PHY \ + CONFIG_AR8216_PHY_LEDS=y FILES:=$(LINUX_DIR)/drivers/net/phy/ar8xxx.ko AUTOLOAD:=$(call AutoLoad,43,ar8xxx,1) endef diff --git a/mihomo/component/nat/table.go b/mihomo/component/nat/table.go index bb5ab75579..66241fb472 100644 --- a/mihomo/component/nat/table.go +++ b/mihomo/component/nat/table.go @@ -10,47 +10,30 @@ import ( ) type Table struct { - mapping *xsync.MapOf[string, *Entry] - lockMap *xsync.MapOf[string, *sync.Cond] + mapping *xsync.MapOf[string, *entry] } -type Entry struct { - PacketConn C.PacketConn - WriteBackProxy C.WriteBackProxy +type entry struct { + PacketSender C.PacketSender LocalUDPConnMap *xsync.MapOf[string, *net.UDPConn] LocalLockMap *xsync.MapOf[string, *sync.Cond] } -func (t *Table) Set(key string, e C.PacketConn, w C.WriteBackProxy) { - t.mapping.Store(key, &Entry{ - PacketConn: e, - WriteBackProxy: w, - LocalUDPConnMap: xsync.NewMapOf[string, *net.UDPConn](), - LocalLockMap: xsync.NewMapOf[string, *sync.Cond](), +func (t *Table) GetOrCreate(key string, maker func() C.PacketSender) (C.PacketSender, bool) { + item, loaded := t.mapping.LoadOrCompute(key, func() *entry { + return &entry{ + PacketSender: maker(), + LocalUDPConnMap: xsync.NewMapOf[string, *net.UDPConn](), + LocalLockMap: xsync.NewMapOf[string, *sync.Cond](), + } }) -} - -func (t *Table) Get(key string) (C.PacketConn, C.WriteBackProxy) { - entry, exist := t.getEntry(key) - if !exist { - return nil, nil - } - return entry.PacketConn, entry.WriteBackProxy -} - -func (t *Table) GetOrCreateLock(key string) (*sync.Cond, bool) { - item, loaded := t.lockMap.LoadOrCompute(key, makeLock) - return item, loaded + return item.PacketSender, loaded } func (t *Table) Delete(key string) { t.mapping.Delete(key) } -func (t *Table) DeleteLock(lockKey string) { - t.lockMap.Delete(lockKey) -} - func (t *Table) GetForLocalConn(lAddr, rAddr string) *net.UDPConn { entry, exist := t.getEntry(lAddr) if !exist { @@ -105,7 +88,7 @@ func (t *Table) DeleteLockForLocalConn(lAddr, key string) { entry.LocalLockMap.Delete(key) } -func (t *Table) getEntry(key string) (*Entry, bool) { +func (t *Table) getEntry(key string) (*entry, bool) { return t.mapping.Load(key) } @@ -116,7 +99,6 @@ func makeLock() *sync.Cond { // New return *Cache func New() *Table { return &Table{ - mapping: xsync.NewMapOf[string, *Entry](), - lockMap: xsync.NewMapOf[string, *sync.Cond](), + mapping: xsync.NewMapOf[string, *entry](), } } diff --git a/mihomo/constant/adapters.go b/mihomo/constant/adapters.go index cb213b3c34..cb47f87166 100644 --- a/mihomo/constant/adapters.go +++ b/mihomo/constant/adapters.go @@ -255,12 +255,16 @@ type UDPPacketInAddr interface { // PacketAdapter is a UDP Packet adapter for socks/redir/tun type PacketAdapter interface { UDPPacket + // Metadata returns destination metadata Metadata() *Metadata + // Key is a SNAT key + Key() string } type packetAdapter struct { UDPPacket metadata *Metadata + key string } // Metadata returns destination metadata @@ -268,10 +272,16 @@ func (s *packetAdapter) Metadata() *Metadata { return s.metadata } +// Key is a SNAT key +func (s *packetAdapter) Key() string { + return s.key +} + func NewPacketAdapter(packet UDPPacket, metadata *Metadata) PacketAdapter { return &packetAdapter{ packet, metadata, + packet.LocalAddr().String(), } } @@ -284,17 +294,23 @@ type WriteBackProxy interface { UpdateWriteBack(wb WriteBack) } +type PacketSender interface { + // Send will send PacketAdapter nonblocking + // the implement must call UDPPacket.Drop() inside Send + Send(PacketAdapter) + // Process is a blocking loop to send PacketAdapter to PacketConn and update the WriteBackProxy + Process(PacketConn, WriteBackProxy) + // ResolveUDP do a local resolve UDP dns blocking if metadata is not resolved + ResolveUDP(*Metadata) error + // Close stop the Process loop + Close() +} + type NatTable interface { - Set(key string, e PacketConn, w WriteBackProxy) - - Get(key string) (PacketConn, WriteBackProxy) - - GetOrCreateLock(key string) (*sync.Cond, bool) + GetOrCreate(key string, maker func() PacketSender) (PacketSender, bool) Delete(key string) - DeleteLock(key string) - GetForLocalConn(lAddr, rAddr string) *net.UDPConn AddForLocalConn(lAddr, rAddr string, conn *net.UDPConn) bool diff --git a/mihomo/tunnel/connection.go b/mihomo/tunnel/connection.go index e96545e80b..1ea0678cd7 100644 --- a/mihomo/tunnel/connection.go +++ b/mihomo/tunnel/connection.go @@ -1,16 +1,109 @@ package tunnel import ( + "context" "errors" "net" "net/netip" "time" + "github.com/metacubex/mihomo/common/lru" N "github.com/metacubex/mihomo/common/net" + "github.com/metacubex/mihomo/component/resolver" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/log" ) +type packetSender struct { + ctx context.Context + cancel context.CancelFunc + ch chan C.PacketAdapter + cache *lru.LruCache[string, netip.Addr] +} + +// newPacketSender return a chan based C.PacketSender +// It ensures that packets can be sent sequentially and without blocking +func newPacketSender() C.PacketSender { + ctx, cancel := context.WithCancel(context.Background()) + ch := make(chan C.PacketAdapter, senderCapacity) + return &packetSender{ + ctx: ctx, + cancel: cancel, + ch: ch, + cache: lru.New[string, netip.Addr](lru.WithSize[string, netip.Addr](senderCapacity)), + } +} + +func (s *packetSender) Process(pc C.PacketConn, proxy C.WriteBackProxy) { + for { + select { + case <-s.ctx.Done(): + return // sender closed + case packet := <-s.ch: + if proxy != nil { + proxy.UpdateWriteBack(packet) + } + if err := s.ResolveUDP(packet.Metadata()); err != nil { + log.Warnln("[UDP] Resolve Ip error: %s", err) + } else { + _ = handleUDPToRemote(packet, pc, packet.Metadata()) + } + packet.Drop() + } + } +} + +func (s *packetSender) dropAll() { + for { + select { + case data := <-s.ch: + data.Drop() // drop all data still in chan + default: + return // no data, exit goroutine + } + } +} + +func (s *packetSender) Send(packet C.PacketAdapter) { + select { + case <-s.ctx.Done(): + packet.Drop() // sender closed before Send() + return + default: + } + + select { + case s.ch <- packet: + // put ok, so don't drop packet, will process by other side of chan + case <-s.ctx.Done(): + packet.Drop() // sender closed when putting data to chan + default: + packet.Drop() // chan is full + } +} + +func (s *packetSender) Close() { + s.cancel() + s.dropAll() +} + +func (s *packetSender) ResolveUDP(metadata *C.Metadata) (err error) { + // local resolve UDP dns + if !metadata.Resolved() { + ip, ok := s.cache.Get(metadata.Host) + if !ok { + ip, err = resolver.ResolveIP(s.ctx, metadata.Host) + if err != nil { + return err + } + s.cache.Set(metadata.Host, ip) + } + + metadata.DstIP = ip + } + return nil +} + func handleUDPToRemote(packet C.UDPPacket, pc C.PacketConn, metadata *C.Metadata) error { addr := metadata.UDPAddr() if addr == nil { @@ -26,8 +119,9 @@ func handleUDPToRemote(packet C.UDPPacket, pc C.PacketConn, metadata *C.Metadata return nil } -func handleUDPToLocal(writeBack C.WriteBack, pc N.EnhancePacketConn, key string, oAddrPort netip.AddrPort, fAddr netip.Addr) { +func handleUDPToLocal(writeBack C.WriteBack, pc N.EnhancePacketConn, sender C.PacketSender, key string, oAddrPort netip.AddrPort, fAddr netip.Addr) { defer func() { + sender.Close() _ = pc.Close() closeAllLocalCoon(key) natTable.Delete(key) diff --git a/mihomo/tunnel/tunnel.go b/mihomo/tunnel/tunnel.go index b6c61d7641..5c136eb24e 100644 --- a/mihomo/tunnel/tunnel.go +++ b/mihomo/tunnel/tunnel.go @@ -28,11 +28,14 @@ import ( "github.com/metacubex/mihomo/tunnel/statistic" ) -const queueSize = 200 +const ( + queueCapacity = 64 // chan capacity tcpQueue and udpQueue + senderCapacity = 128 // chan capacity of PacketSender +) var ( status = newAtomicStatus(Suspend) - tcpQueue = make(chan C.ConnContext, queueSize) + udpInit sync.Once udpQueues []chan C.PacketAdapter natTable = nat.New() rules []C.Rule @@ -43,6 +46,12 @@ var ( ruleProviders map[string]provider.RuleProvider configMux sync.RWMutex + // for compatibility, lazy init + tcpQueue chan C.ConnContext + tcpInOnce sync.Once + udpQueue chan C.PacketAdapter + udpInOnce sync.Once + // Outbound Rule mode = Rule @@ -70,15 +79,33 @@ func (t tunnel) HandleTCPConn(conn net.Conn, metadata *C.Metadata) { handleTCPConn(connCtx) } -func (t tunnel) HandleUDPPacket(packet C.UDPPacket, metadata *C.Metadata) { - packetAdapter := C.NewPacketAdapter(packet, metadata) +func initUDP() { + numUDPWorkers := 4 + if num := runtime.GOMAXPROCS(0); num > numUDPWorkers { + numUDPWorkers = num + } - hash := utils.MapHash(metadata.SourceAddress() + "-" + metadata.RemoteAddress()) + udpQueues = make([]chan C.PacketAdapter, numUDPWorkers) + for i := 0; i < numUDPWorkers; i++ { + queue := make(chan C.PacketAdapter, queueCapacity) + udpQueues[i] = queue + go processUDP(queue) + } +} + +func (t tunnel) HandleUDPPacket(packet C.UDPPacket, metadata *C.Metadata) { + udpInit.Do(initUDP) + + packetAdapter := C.NewPacketAdapter(packet, metadata) + key := packetAdapter.Key() + + hash := utils.MapHash(key) queueNo := uint(hash) % uint(len(udpQueues)) select { case udpQueues[queueNo] <- packetAdapter: default: + packet.Drop() } } @@ -134,21 +161,32 @@ func IsSniffing() bool { return sniffingEnable } -func init() { - go process() -} - // TCPIn return fan-in queue // Deprecated: using Tunnel instead func TCPIn() chan<- C.ConnContext { + tcpInOnce.Do(func() { + tcpQueue = make(chan C.ConnContext, queueCapacity) + go func() { + for connCtx := range tcpQueue { + go handleTCPConn(connCtx) + } + }() + }) return tcpQueue } // UDPIn return fan-in udp queue // Deprecated: using Tunnel instead func UDPIn() chan<- C.PacketAdapter { - // compatibility: first queue is always available for external callers - return udpQueues[0] + udpInOnce.Do(func() { + udpQueue = make(chan C.PacketAdapter, queueCapacity) + go func() { + for packet := range udpQueue { + Tunnel.HandleUDPPacket(packet, packet.Metadata()) + } + }() + }) + return udpQueue } // NatTable return nat table @@ -249,32 +287,6 @@ func isHandle(t C.Type) bool { return status == Running || (status == Inner && t == C.INNER) } -// processUDP starts a loop to handle udp packet -func processUDP(queue chan C.PacketAdapter) { - for conn := range queue { - handleUDPConn(conn) - } -} - -func process() { - numUDPWorkers := 4 - if num := runtime.GOMAXPROCS(0); num > numUDPWorkers { - numUDPWorkers = num - } - - udpQueues = make([]chan C.PacketAdapter, numUDPWorkers) - for i := 0; i < numUDPWorkers; i++ { - queue := make(chan C.PacketAdapter, queueSize) - udpQueues[i] = queue - go processUDP(queue) - } - - queue := tcpQueue - for conn := range queue { - go handleTCPConn(conn) - } -} - func needLookupIP(metadata *C.Metadata) bool { return resolver.MappingEnabled() && metadata.Host == "" && metadata.DstIP.IsValid() } @@ -334,6 +346,13 @@ func resolveMetadata(metadata *C.Metadata) (proxy C.Proxy, rule C.Rule, err erro return } +// processUDP starts a loop to handle udp packet +func processUDP(queue chan C.PacketAdapter) { + for conn := range queue { + handleUDPConn(conn) + } +} + func handleUDPConn(packet C.PacketAdapter) { if !isHandle(packet.Metadata().Type) { packet.Drop() @@ -363,85 +382,58 @@ func handleUDPConn(packet C.PacketAdapter) { snifferDispatcher.UDPSniff(packet) } - // local resolve UDP dns - if !metadata.Resolved() { - ip, err := resolver.ResolveIP(context.Background(), metadata.Host) - if err != nil { - return - } - metadata.DstIP = ip - } - - key := packet.LocalAddr().String() - - handle := func() bool { - pc, proxy := natTable.Get(key) - if pc != nil { - if proxy != nil { - proxy.UpdateWriteBack(packet) + key := packet.Key() + sender, loaded := natTable.GetOrCreate(key, newPacketSender) + if !loaded { + dial := func() (C.PacketConn, C.WriteBackProxy, error) { + if err := sender.ResolveUDP(metadata); err != nil { + log.Warnln("[UDP] Resolve Ip error: %s", err) + return nil, nil, err } - _ = handleUDPToRemote(packet, pc, metadata) - return true - } - return false - } - if handle() { - packet.Drop() - return - } + proxy, rule, err := resolveMetadata(metadata) + if err != nil { + log.Warnln("[UDP] Parse metadata failed: %s", err.Error()) + return nil, nil, err + } - cond, loaded := natTable.GetOrCreateLock(key) + ctx, cancel := context.WithTimeout(context.Background(), C.DefaultUDPTimeout) + defer cancel() + rawPc, err := retry(ctx, func(ctx context.Context) (C.PacketConn, error) { + return proxy.ListenPacketContext(ctx, metadata.Pure()) + }, func(err error) { + logMetadataErr(metadata, rule, proxy, err) + }) + if err != nil { + return nil, nil, err + } + logMetadata(metadata, rule, rawPc) - go func() { - defer packet.Drop() + pc := statistic.NewUDPTracker(rawPc, statistic.DefaultManager, metadata, rule, 0, 0, true) - if loaded { - cond.L.Lock() - cond.Wait() - handle() - cond.L.Unlock() - return + if rawPc.Chains().Last() == "REJECT-DROP" { + _ = pc.Close() + return nil, nil, errors.New("rejected drop packet") + } + + oAddrPort := metadata.AddrPort() + writeBackProxy := nat.NewWriteBackProxy(packet) + + go handleUDPToLocal(writeBackProxy, pc, sender, key, oAddrPort, fAddr) + return pc, writeBackProxy, nil } - defer func() { - natTable.DeleteLock(key) - cond.Broadcast() + go func() { + pc, proxy, err := dial() + if err != nil { + sender.Close() + natTable.Delete(key) + return + } + sender.Process(pc, proxy) }() - - proxy, rule, err := resolveMetadata(metadata) - if err != nil { - log.Warnln("[UDP] Parse metadata failed: %s", err.Error()) - return - } - - ctx, cancel := context.WithTimeout(context.Background(), C.DefaultUDPTimeout) - defer cancel() - rawPc, err := retry(ctx, func(ctx context.Context) (C.PacketConn, error) { - return proxy.ListenPacketContext(ctx, metadata.Pure()) - }, func(err error) { - logMetadataErr(metadata, rule, proxy, err) - }) - if err != nil { - return - } - logMetadata(metadata, rule, rawPc) - - pc := statistic.NewUDPTracker(rawPc, statistic.DefaultManager, metadata, rule, 0, 0, true) - - if rawPc.Chains().Last() == "REJECT-DROP" { - pc.Close() - return - } - - oAddrPort := metadata.AddrPort() - writeBackProxy := nat.NewWriteBackProxy(packet) - natTable.Set(key, pc, writeBackProxy) - - go handleUDPToLocal(writeBackProxy, pc, key, oAddrPort, fAddr) - - handle() - }() + } + sender.Send(packet) // nonblocking } func handleTCPConn(connCtx C.ConnContext) { diff --git a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/other.lua b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/other.lua index a541021315..2a387b5a6c 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/other.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/other.lua @@ -174,6 +174,9 @@ if has_xray then o.default = "10-20" o:depends("fragment", true) + o = s_xray:option(Flag, "noise", translate("Noise"), translate("UDP noise, Under some circumstances it can bypass some UDP based protocol restrictions.")) + o.default = 0 + o = s_xray:option(Flag, "sniffing_override_dest", translate("Override the connection destination address"), translate("Override the connection destination address with the sniffed domain.")) o.default = 0 @@ -187,6 +190,41 @@ if has_xray then o = s_xray:option(Value, "buffer_size", translate("Buffer Size"), translate("Buffer size for every connection (kB)")) o.datatype = "uinteger" + + s_xray_noise = m:section(TypedSection, "xray_noise_packets", translate("Xray Noise Packets"),"" .. translate("To send noise packets, select \"Noise\" in Xray Settings.") .. "") + s_xray_noise.template = "cbi/tblsection" + s_xray_noise.sortable = true + s_xray_noise.anonymous = true + s_xray_noise.addremove = true + + s_xray_noise.create = function(e, t) + TypedSection.create(e, api.gen_short_uuid()) + end + + s_xray_noise.remove = function(self, section) + for k, v in pairs(self.children) do + v.rmempty = true + v.validate = nil + end + TypedSection.remove(self, section) + end + + o = s_xray_noise:option(Flag, "enabled", translate("Enable")) + o.default = 1 + o.rmempty = false + + o = s_xray_noise:option(ListValue, "type", translate("Type")) + o:value("rand", "rand") + o:value("str", "str") + o:value("base64", "base64") + + o = s_xray_noise:option(Value, "packet", translate("Packet")) + o.datatype = "minlength(1)" + o.rmempty = false + + o = s_xray_noise:option(Value, "delay", translate("Delay (ms)")) + o.datatype = "or(uinteger,portrange)" + o.rmempty = false end if has_singbox 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 fbd858425f..fa11fe37f5 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/passwall/util_xray.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/passwall/util_xray.lua @@ -17,6 +17,20 @@ local function get_new_port() return new_port end +local function get_noise_packets() + local noises = {} + uci:foreach(appname, "xray_noise_packets", function(n) + local noise = (n.enabled == "1") and { + type = n.type, + packet = n.packet, + delay = string.find(n.delay, "-") and n.delay or tonumber(n.delay) + } or nil + table.insert(noises, noise) + end) + if #noises == 0 then noises = nil end + return noises +end + local function get_domain_excluded() local path = string.format("/usr/share/%s/rules/domains_excluded", appname) local content = fs.readfile(path) @@ -43,10 +57,12 @@ function gen_outbound(flag, node, tag, proxy_table) local proxy = 0 local proxy_tag = "nil" local fragment = nil + local noise = nil if proxy_table ~= nil and type(proxy_table) == "table" then proxy = proxy_table.proxy or 0 proxy_tag = proxy_table.tag or "nil" fragment = proxy_table.fragment or nil + noise = proxy_table.noise or nil end if node.type == "Xray" then @@ -135,7 +151,7 @@ function gen_outbound(flag, node, tag, proxy_table) mark = 255, tcpMptcp = (node.tcpMptcp == "1") and true or nil, tcpNoDelay = (node.tcpNoDelay == "1") and true or nil, - dialerProxy = fragment and "fragment" or nil + dialerProxy = (fragment or noise) and "dialerproxy" or nil }, network = node.transport, security = node.stream_security, @@ -690,7 +706,7 @@ function gen_config(var) end if is_new_blc_node then local blc_node = uci:get_all(appname, blc_node_id) - local outbound = gen_outbound(flag, blc_node, blc_node_tag, { fragment = xray_settings.fragment == "1" or nil }) + local outbound = gen_outbound(flag, blc_node, blc_node_tag, { fragment = xray_settings.fragment == "1" or nil, noise = xray_settings.noise == "1" or nil }) if outbound then table.insert(outbounds, outbound) valid_nodes[#valid_nodes + 1] = blc_node_tag @@ -713,7 +729,7 @@ function gen_config(var) if is_new_node then local fallback_node = uci:get_all(appname, fallback_node_id) if fallback_node.protocol ~= "_balancing" then - local outbound = gen_outbound(flag, fallback_node, fallback_node_id, { fragment = xray_settings.fragment == "1" or nil }) + local outbound = gen_outbound(flag, fallback_node, fallback_node_id, { fragment = xray_settings.fragment == "1" or nil, noise = xray_settings.noise == "1" or nil }) if outbound then table.insert(outbounds, outbound) else @@ -862,6 +878,9 @@ function gen_config(var) if xray_settings.fragment == "1" and not proxy_table.tag then proxy_table.fragment = true end + if xray_settings.noise == "1" and not proxy_table.tag then + proxy_table.noise = true + end local outbound = gen_outbound(flag, _node, rule_name, proxy_table) local outbound_tag if outbound then @@ -1047,7 +1066,7 @@ function gen_config(var) sys.call("touch /tmp/etc/passwall/iface/" .. node.iface) end else - local outbound = gen_outbound(flag, node, nil, { fragment = xray_settings.fragment == "1" or nil }) + local outbound = gen_outbound(flag, node, nil, { fragment = xray_settings.fragment == "1" or nil, noise = xray_settings.fragment == "1" or nil }) if outbound then set_outbound_detour(node, outbound, outbounds) table.insert(outbounds, outbound) @@ -1290,17 +1309,18 @@ function gen_config(var) } } - if xray_settings.fragment == "1" then + if xray_settings.fragment == "1" or xray_settings.noise == "1" then table.insert(outbounds, { protocol = "freedom", - tag = "fragment", + tag = "dialerproxy", settings = { domainStrategy = (direct_dns_query_strategy and direct_dns_query_strategy ~= "") and direct_dns_query_strategy or "UseIP", - fragment = { + fragment = (xray_settings.fragment == "1") and { packets = (xray_settings.fragment_packets and xray_settings.fragment_packets ~= "") and xray_settings.fragment_packets, length = (xray_settings.fragment_length and xray_settings.fragment_length ~= "") and xray_settings.fragment_length, interval = (xray_settings.fragment_interval and xray_settings.fragment_interval ~= "") and xray_settings.fragment_interval - } + } or nil, + noises = (xray_settings.noise == "1") and get_noise_packets() or nil }, streamSettings = { sockopt = { 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 b31dddb2ea..da6f05a1fd 100644 --- a/openwrt-passwall/luci-app-passwall/po/zh-cn/passwall.po +++ b/openwrt-passwall/luci-app-passwall/po/zh-cn/passwall.po @@ -1657,6 +1657,24 @@ msgstr "分片间隔" msgid "Fragmentation interval (ms)" msgstr "分片间隔(ms)" +msgid "Noise" +msgstr "噪声" + +msgid "UDP noise, Under some circumstances it can bypass some UDP based protocol restrictions." +msgstr "UDP 噪声,在某些情况下可以绕过一些针对 UDP 协议的限制。" + +msgid "To send noise packets, select \"Noise\" in Xray Settings." +msgstr "在 Xray 设置中勾选 “噪声” 以发送噪声包。" + +msgid "Xray Noise Packets" +msgstr "Xray 噪声数据包" + +msgid "Packet" +msgstr "数据包" + +msgid "Delay (ms)" +msgstr "延迟(ms)" + msgid "If is domain name, The requested domain name will be resolved to IP before connect." msgstr "如果是域名,域名将在请求发出之前解析为 IP。" diff --git a/ryujinx/src/Ryujinx.Graphics.GAL/Capabilities.cs b/ryujinx/src/Ryujinx.Graphics.GAL/Capabilities.cs index a5c6eb5c8e..1eec80e51b 100644 --- a/ryujinx/src/Ryujinx.Graphics.GAL/Capabilities.cs +++ b/ryujinx/src/Ryujinx.Graphics.GAL/Capabilities.cs @@ -71,6 +71,8 @@ namespace Ryujinx.Graphics.GAL public readonly int GatherBiasPrecision; + public readonly ulong MaximumGpuMemory; + public Capabilities( TargetApi api, string vendorName, @@ -131,7 +133,8 @@ namespace Ryujinx.Graphics.GAL int shaderSubgroupSize, int storageBufferOffsetAlignment, int textureBufferOffsetAlignment, - int gatherBiasPrecision) + int gatherBiasPrecision, + ulong maximumGpuMemory) { Api = api; VendorName = vendorName; @@ -193,6 +196,7 @@ namespace Ryujinx.Graphics.GAL StorageBufferOffsetAlignment = storageBufferOffsetAlignment; TextureBufferOffsetAlignment = textureBufferOffsetAlignment; GatherBiasPrecision = gatherBiasPrecision; + MaximumGpuMemory = maximumGpuMemory; } } } diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Image/AutoDeleteCache.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Image/AutoDeleteCache.cs index 5e66a3b543..ad6c1fecb2 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Image/AutoDeleteCache.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Image/AutoDeleteCache.cs @@ -1,3 +1,4 @@ +using System; using System.Collections; using System.Collections.Generic; @@ -46,7 +47,11 @@ namespace Ryujinx.Graphics.Gpu.Image { private const int MinCountForDeletion = 32; private const int MaxCapacity = 2048; - private const ulong MaxTextureSizeCapacity = 1024 * 1024 * 1024; // MB; + private const ulong MinTextureSizeCapacity = 512 * 1024 * 1024; + private const ulong MaxTextureSizeCapacity = 4UL * 1024 * 1024 * 1024; + private const ulong DefaultTextureSizeCapacity = 1UL * 1024 * 1024 * 1024; + private const float MemoryScaleFactor = 0.50f; + private ulong _maxCacheMemoryUsage = 0; private readonly LinkedList _textures; private ulong _totalSize; @@ -56,6 +61,25 @@ namespace Ryujinx.Graphics.Gpu.Image private readonly Dictionary _shortCacheLookup; + /// + /// Initializes the cache, setting the maximum texture capacity for the specified GPU context. + /// + /// + /// If the backend GPU has 0 memory capacity, the cache size defaults to `DefaultTextureSizeCapacity`. + /// + /// The GPU context that the cache belongs to + public void Initialize(GpuContext context) + { + var cacheMemory = (ulong)(context.Capabilities.MaximumGpuMemory * MemoryScaleFactor); + + _maxCacheMemoryUsage = Math.Clamp(cacheMemory, MinTextureSizeCapacity, MaxTextureSizeCapacity); + + if (context.Capabilities.MaximumGpuMemory == 0) + { + _maxCacheMemoryUsage = DefaultTextureSizeCapacity; + } + } + /// /// Creates a new instance of the automatic deletion cache. /// @@ -85,7 +109,7 @@ namespace Ryujinx.Graphics.Gpu.Image texture.CacheNode = _textures.AddLast(texture); if (_textures.Count > MaxCapacity || - (_totalSize > MaxTextureSizeCapacity && _textures.Count >= MinCountForDeletion)) + (_totalSize > _maxCacheMemoryUsage && _textures.Count >= MinCountForDeletion)) { RemoveLeastUsedTexture(); } @@ -110,7 +134,7 @@ namespace Ryujinx.Graphics.Gpu.Image _textures.AddLast(texture.CacheNode); } - if (_totalSize > MaxTextureSizeCapacity && _textures.Count >= MinCountForDeletion) + if (_totalSize > _maxCacheMemoryUsage && _textures.Count >= MinCountForDeletion) { RemoveLeastUsedTexture(); } diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureCache.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureCache.cs index 5a3319b06a..1587e20189 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureCache.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureCache.cs @@ -68,6 +68,14 @@ namespace Ryujinx.Graphics.Gpu.Image _cache = new AutoDeleteCache(); } + /// + /// Initializes the cache, setting the maximum texture capacity for the specified GPU context. + /// + public void Initialize() + { + _cache.Initialize(_context); + } + /// /// Handles marking of textures written to a memory region being (partially) remapped. /// diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs index 59a940a4f9..d1065431d1 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs @@ -1,4 +1,5 @@ using Ryujinx.Common.Memory; +using Ryujinx.Graphics.Gpu.Image; using Ryujinx.Memory; using Ryujinx.Memory.Range; using System; @@ -64,6 +65,7 @@ namespace Ryujinx.Graphics.Gpu.Memory MemoryUnmapped += Physical.BufferCache.MemoryUnmappedHandler; MemoryUnmapped += VirtualRangeCache.MemoryUnmappedHandler; MemoryUnmapped += CounterCache.MemoryUnmappedHandler; + Physical.TextureCache.Initialize(); } /// diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs index a5c5abd4bb..c36fc0ada2 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs @@ -22,7 +22,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache private const ushort FileFormatVersionMajor = 1; private const ushort FileFormatVersionMinor = 2; private const uint FileFormatVersionPacked = ((uint)FileFormatVersionMajor << 16) | FileFormatVersionMinor; - private const uint CodeGenVersion = 7331; + private const uint CodeGenVersion = 7353; private const string SharedTocFileName = "shared.toc"; private const string SharedDataFileName = "shared.data"; diff --git a/ryujinx/src/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs b/ryujinx/src/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs index ba9cd45c67..9fcdf1ad79 100644 --- a/ryujinx/src/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs +++ b/ryujinx/src/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs @@ -202,7 +202,8 @@ namespace Ryujinx.Graphics.OpenGL shaderSubgroupSize: Constants.MaxSubgroupSize, storageBufferOffsetAlignment: HwCapabilities.StorageBufferOffsetAlignment, textureBufferOffsetAlignment: HwCapabilities.TextureBufferOffsetAlignment, - gatherBiasPrecision: intelWindows || amdWindows ? 8 : 0); // Precision is 8 for these vendors on Vulkan. + gatherBiasPrecision: intelWindows || amdWindows ? 8 : 0, // Precision is 8 for these vendors on Vulkan. + maximumGpuMemory: 0); } public void SetBufferData(BufferHandle buffer, int offset, ReadOnlySpan data) diff --git a/ryujinx/src/Ryujinx.Graphics.Shader/Translation/Translator.cs b/ryujinx/src/Ryujinx.Graphics.Shader/Translation/Translator.cs index 6a31ea2e79..d1fbca0eb0 100644 --- a/ryujinx/src/Ryujinx.Graphics.Shader/Translation/Translator.cs +++ b/ryujinx/src/Ryujinx.Graphics.Shader/Translation/Translator.cs @@ -190,7 +190,7 @@ namespace Ryujinx.Graphics.Shader.Translation if (stage == ShaderStage.Vertex) { - InitializePositionOutput(context); + InitializeVertexOutputs(context); } UInt128 usedAttributes = context.TranslatorContext.AttributeUsage.NextInputAttributesComponents; @@ -236,12 +236,20 @@ namespace Ryujinx.Graphics.Shader.Translation } } - private static void InitializePositionOutput(EmitterContext context) + private static void InitializeVertexOutputs(EmitterContext context) { for (int c = 0; c < 4; c++) { context.Store(StorageKind.Output, IoVariable.Position, null, Const(c), ConstF(c == 3 ? 1f : 0f)); } + + if (context.Program.ClipDistancesWritten != 0) + { + for (int i = 0; i < 8; i++) + { + context.Store(StorageKind.Output, IoVariable.ClipDistance, null, Const(i), ConstF(0f)); + } + } } private static void InitializeOutput(EmitterContext context, int location, bool perPatch) diff --git a/ryujinx/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs b/ryujinx/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs index 33e41ab489..0faaec82a4 100644 --- a/ryujinx/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs +++ b/ryujinx/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs @@ -781,7 +781,26 @@ namespace Ryujinx.Graphics.Vulkan shaderSubgroupSize: (int)Capabilities.SubgroupSize, storageBufferOffsetAlignment: (int)limits.MinStorageBufferOffsetAlignment, textureBufferOffsetAlignment: (int)limits.MinTexelBufferOffsetAlignment, - gatherBiasPrecision: IsIntelWindows || IsAmdWindows ? (int)Capabilities.SubTexelPrecisionBits : 0); + gatherBiasPrecision: IsIntelWindows || IsAmdWindows ? (int)Capabilities.SubTexelPrecisionBits : 0, + maximumGpuMemory: GetTotalGPUMemory()); + } + + private ulong GetTotalGPUMemory() + { + ulong totalMemory = 0; + + Api.GetPhysicalDeviceMemoryProperties(_physicalDevice.PhysicalDevice, out PhysicalDeviceMemoryProperties memoryProperties); + + for (int i = 0; i < memoryProperties.MemoryHeapCount; i++) + { + var heap = memoryProperties.MemoryHeaps[i]; + if ((heap.Flags & MemoryHeapFlags.DeviceLocalBit) == MemoryHeapFlags.DeviceLocalBit) + { + totalMemory += heap.Size; + } + } + + return totalMemory; } public HardwareInfo GetHardwareInfo() @@ -865,6 +884,7 @@ namespace Ryujinx.Graphics.Vulkan private void PrintGpuInformation() { Logger.Notice.Print(LogClass.Gpu, $"{GpuVendor} {GpuRenderer} ({GpuVersion})"); + Logger.Notice.Print(LogClass.Gpu, $"GPU Memory: {GetTotalGPUMemory() / (1024 * 1024)} MiB"); } public void Initialize(GraphicsDebugLevel logLevel) diff --git a/shadowsocks-rust/Cargo.lock b/shadowsocks-rust/Cargo.lock index 495cd2814d..7146cbc1d1 100644 --- a/shadowsocks-rust/Cargo.lock +++ b/shadowsocks-rust/Cargo.lock @@ -228,9 +228,9 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.82" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", @@ -1910,9 +1910,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.158" +version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "libloading" diff --git a/shadowsocks-rust/crates/shadowsocks-service/Cargo.toml b/shadowsocks-rust/crates/shadowsocks-service/Cargo.toml index 6a699f49a1..9658447569 100644 --- a/shadowsocks-rust/crates/shadowsocks-service/Cargo.toml +++ b/shadowsocks-rust/crates/shadowsocks-service/Cargo.toml @@ -165,7 +165,7 @@ rustls-native-certs = { version = "0.8", optional = true } async-trait = "0.1" socket2 = { version = "0.5", features = ["all"] } -libc = "0.2.141" +libc = "~0.2.141" hyper = { version = "1.4", optional = true, features = ["full"] } http-body-util = { version = "0.1", optional = true } diff --git a/shadowsocks-rust/crates/shadowsocks/Cargo.toml b/shadowsocks-rust/crates/shadowsocks/Cargo.toml index c948bca621..a63c4f211c 100644 --- a/shadowsocks-rust/crates/shadowsocks/Cargo.toml +++ b/shadowsocks-rust/crates/shadowsocks/Cargo.toml @@ -48,7 +48,7 @@ security-replay-attack-detect = ["bloomfilter"] [dependencies] log = "0.4" -libc = "0.2.141" +libc = "~0.2.141" bytes = "1.7" cfg-if = "1" byte_string = "1.0" diff --git a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/other.lua b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/other.lua index a541021315..5dd95324eb 100644 --- a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/other.lua +++ b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/other.lua @@ -174,6 +174,9 @@ if has_xray then o.default = "10-20" o:depends("fragment", true) + o = s_xray:option(Flag, "noise", translate("Noise"), translate("UDP noise. Under some circumstances it can bypass some udp based protocol restrictions.")) + o.default = 0 + o = s_xray:option(Flag, "sniffing_override_dest", translate("Override the connection destination address"), translate("Override the connection destination address with the sniffed domain.")) o.default = 0 @@ -187,6 +190,41 @@ if has_xray then o = s_xray:option(Value, "buffer_size", translate("Buffer Size"), translate("Buffer size for every connection (kB)")) o.datatype = "uinteger" + + s_xray_noise = m:section(TypedSection, "xray_noise_packets", translate("Xray Noise Packets"),"" .. translate("To send noise packets, select \"Noise\" in Xray Settings.") .. "") + s_xray_noise.template = "cbi/tblsection" + s_xray_noise.sortable = true + s_xray_noise.anonymous = true + s_xray_noise.addremove = true + + s_xray_noise.create = function(e, t) + TypedSection.create(e, api.gen_short_uuid()) + end + + s_xray_noise.remove = function(self, section) + for k, v in pairs(self.children) do + v.rmempty = true + v.validate = nil + end + TypedSection.remove(self, section) + end + + o = s_xray_noise:option(Flag, "enabled", translate("Enable")) + o.default = 1 + o.rmempty = false + + o = s_xray_noise:option(ListValue, "type", translate("Type")) + o:value("rand", "rand") + o:value("str", "str") + o:value("base64", "base64") + + o = s_xray_noise:option(Value, "packet", translate("Packet")) + o.datatype = "minlength(1)" + o.rmempty = false + + o = s_xray_noise:option(Value, "delay", translate("Delay (ms)")) + o.datatype = "or(uinteger,portrange)" + o.rmempty = false end if has_singbox then diff --git a/small/luci-app-passwall/luasrc/passwall/util_xray.lua b/small/luci-app-passwall/luasrc/passwall/util_xray.lua index fbd858425f..fa11fe37f5 100644 --- a/small/luci-app-passwall/luasrc/passwall/util_xray.lua +++ b/small/luci-app-passwall/luasrc/passwall/util_xray.lua @@ -17,6 +17,20 @@ local function get_new_port() return new_port end +local function get_noise_packets() + local noises = {} + uci:foreach(appname, "xray_noise_packets", function(n) + local noise = (n.enabled == "1") and { + type = n.type, + packet = n.packet, + delay = string.find(n.delay, "-") and n.delay or tonumber(n.delay) + } or nil + table.insert(noises, noise) + end) + if #noises == 0 then noises = nil end + return noises +end + local function get_domain_excluded() local path = string.format("/usr/share/%s/rules/domains_excluded", appname) local content = fs.readfile(path) @@ -43,10 +57,12 @@ function gen_outbound(flag, node, tag, proxy_table) local proxy = 0 local proxy_tag = "nil" local fragment = nil + local noise = nil if proxy_table ~= nil and type(proxy_table) == "table" then proxy = proxy_table.proxy or 0 proxy_tag = proxy_table.tag or "nil" fragment = proxy_table.fragment or nil + noise = proxy_table.noise or nil end if node.type == "Xray" then @@ -135,7 +151,7 @@ function gen_outbound(flag, node, tag, proxy_table) mark = 255, tcpMptcp = (node.tcpMptcp == "1") and true or nil, tcpNoDelay = (node.tcpNoDelay == "1") and true or nil, - dialerProxy = fragment and "fragment" or nil + dialerProxy = (fragment or noise) and "dialerproxy" or nil }, network = node.transport, security = node.stream_security, @@ -690,7 +706,7 @@ function gen_config(var) end if is_new_blc_node then local blc_node = uci:get_all(appname, blc_node_id) - local outbound = gen_outbound(flag, blc_node, blc_node_tag, { fragment = xray_settings.fragment == "1" or nil }) + local outbound = gen_outbound(flag, blc_node, blc_node_tag, { fragment = xray_settings.fragment == "1" or nil, noise = xray_settings.noise == "1" or nil }) if outbound then table.insert(outbounds, outbound) valid_nodes[#valid_nodes + 1] = blc_node_tag @@ -713,7 +729,7 @@ function gen_config(var) if is_new_node then local fallback_node = uci:get_all(appname, fallback_node_id) if fallback_node.protocol ~= "_balancing" then - local outbound = gen_outbound(flag, fallback_node, fallback_node_id, { fragment = xray_settings.fragment == "1" or nil }) + local outbound = gen_outbound(flag, fallback_node, fallback_node_id, { fragment = xray_settings.fragment == "1" or nil, noise = xray_settings.noise == "1" or nil }) if outbound then table.insert(outbounds, outbound) else @@ -862,6 +878,9 @@ function gen_config(var) if xray_settings.fragment == "1" and not proxy_table.tag then proxy_table.fragment = true end + if xray_settings.noise == "1" and not proxy_table.tag then + proxy_table.noise = true + end local outbound = gen_outbound(flag, _node, rule_name, proxy_table) local outbound_tag if outbound then @@ -1047,7 +1066,7 @@ function gen_config(var) sys.call("touch /tmp/etc/passwall/iface/" .. node.iface) end else - local outbound = gen_outbound(flag, node, nil, { fragment = xray_settings.fragment == "1" or nil }) + local outbound = gen_outbound(flag, node, nil, { fragment = xray_settings.fragment == "1" or nil, noise = xray_settings.fragment == "1" or nil }) if outbound then set_outbound_detour(node, outbound, outbounds) table.insert(outbounds, outbound) @@ -1290,17 +1309,18 @@ function gen_config(var) } } - if xray_settings.fragment == "1" then + if xray_settings.fragment == "1" or xray_settings.noise == "1" then table.insert(outbounds, { protocol = "freedom", - tag = "fragment", + tag = "dialerproxy", settings = { domainStrategy = (direct_dns_query_strategy and direct_dns_query_strategy ~= "") and direct_dns_query_strategy or "UseIP", - fragment = { + fragment = (xray_settings.fragment == "1") and { packets = (xray_settings.fragment_packets and xray_settings.fragment_packets ~= "") and xray_settings.fragment_packets, length = (xray_settings.fragment_length and xray_settings.fragment_length ~= "") and xray_settings.fragment_length, interval = (xray_settings.fragment_interval and xray_settings.fragment_interval ~= "") and xray_settings.fragment_interval - } + } or nil, + noises = (xray_settings.noise == "1") and get_noise_packets() or nil }, streamSettings = { sockopt = { diff --git a/small/luci-app-passwall/po/zh-cn/passwall.po b/small/luci-app-passwall/po/zh-cn/passwall.po index b31dddb2ea..59b5536719 100644 --- a/small/luci-app-passwall/po/zh-cn/passwall.po +++ b/small/luci-app-passwall/po/zh-cn/passwall.po @@ -1657,6 +1657,24 @@ msgstr "分片间隔" msgid "Fragmentation interval (ms)" msgstr "分片间隔(ms)" +msgid "Noise" +msgstr "噪声" + +msgid "UDP noise. Under some circumstances it can bypass some udp based protocol restrictions." +msgstr "UDP噪声。在某些情况下,它可以绕过一些针对UDP协议的限制。" + +msgid "To send noise packets, select \"Noise\" in Xray Settings." +msgstr "在 Xray 设置中勾选 “噪声” 以发送噪声包。" + +msgid "Xray Noise Packets" +msgstr "Xray 噪声数据包" + +msgid "Packet" +msgstr "数据包" + +msgid "Delay (ms)" +msgstr "延迟(ms)" + msgid "If is domain name, The requested domain name will be resolved to IP before connect." msgstr "如果是域名,域名将在请求发出之前解析为 IP。" diff --git a/small/v2ray-geodata/Makefile b/small/v2ray-geodata/Makefile index 8ea51f1d7e..e0605e17bf 100644 --- a/small/v2ray-geodata/Makefile +++ b/small/v2ray-geodata/Makefile @@ -12,13 +12,13 @@ PKG_MAINTAINER:=Tianling Shen include $(INCLUDE_DIR)/package.mk -GEOIP_VER:=202409190051 +GEOIP_VER:=202409260052 GEOIP_FILE:=geoip.dat.$(GEOIP_VER) define Download/geoip URL:=https://github.com/v2fly/geoip/releases/download/$(GEOIP_VER)/ URL_FILE:=geoip.dat FILE:=$(GEOIP_FILE) - HASH:=b9d2ae86f70922be6426d734464e395ae00f537af40eb69d74ee41d65b29fdf0 + HASH:=334bd38a791c41a6b95f3afec7350c8a86ac9b2a9dde1e63c80d183edcb81af4 endef GEOSITE_VER:=20240920063125 diff --git a/v2raya/service/core/v2ray/processManager.go b/v2raya/service/core/v2ray/processManager.go index 86cb3b2560..27d3af0377 100644 --- a/v2raya/service/core/v2ray/processManager.go +++ b/v2raya/service/core/v2ray/processManager.go @@ -2,14 +2,16 @@ package v2ray import ( "fmt" + "os/exec" + "strings" + "sync" + "github.com/v2rayA/v2rayA/common/resolv" "github.com/v2rayA/v2rayA/conf" "github.com/v2rayA/v2rayA/core/specialMode" "github.com/v2rayA/v2rayA/core/v2ray/asset" "github.com/v2rayA/v2rayA/db/configure" "github.com/v2rayA/v2rayA/pkg/util/log" - "os/exec" - "sync" ) type CoreProcessManager struct { @@ -23,12 +25,11 @@ func (m *CoreProcessManager) beforeStop(p *Process) { m.CheckAndStopTransparentProxy(p.template.Setting) specialMode.StopDNSSupervisor() - if conf.GetEnvironmentConfig().CoreHook != "" { - log.Info("Execute the core pre stop hook: %v", conf.GetEnvironmentConfig().CoreHook) - b, err := exec.Command(conf.GetEnvironmentConfig().CoreHook, - "--stage=pre-stop", - fmt.Sprintf("--v2raya-confdir=%v", conf.GetEnvironmentConfig().Config), - ).CombinedOutput() + if corehook := conf.GetEnvironmentConfig().CoreHook; corehook != "" { + hook := strings.Split(corehook, " ") + hook = append(hook, "--stage=pre-stop", fmt.Sprintf("--v2raya-confdir=%v", conf.GetEnvironmentConfig().Config)) + log.Info("Execute the core pre stop hook: %v", hook) + b, err := exec.Command(hook[0], hook[1:]...).CombinedOutput() if len(b) > 0 { log.Info("Executing the core pre stop hook: %v", string(b)) } @@ -57,13 +58,14 @@ func (m *CoreProcessManager) CheckAndSetupTransparentProxy(checkRunning bool, se if (!checkRunning || ProcessManager.Running()) && IsTransparentOn(setting) { deleteTransparentProxyRules() - if conf.GetEnvironmentConfig().TransparentHook != "" { - log.Info("Execute the transparent pre start hook: %v", conf.GetEnvironmentConfig().TransparentHook) - b, err := exec.Command(conf.GetEnvironmentConfig().TransparentHook, + if thook := conf.GetEnvironmentConfig().TransparentHook; thook != "" { + hook := strings.Split(thook, " ") + hook = append(hook, fmt.Sprintf("--transparent-type=%v", setting.TransparentType), "--stage=pre-start", - fmt.Sprintf("--v2raya-confdir=%v", conf.GetEnvironmentConfig().Config), - ).CombinedOutput() + fmt.Sprintf("--v2raya-confdir=%v", conf.GetEnvironmentConfig().Config)) + log.Info("Execute the transparent pre start hook: %v", hook) + b, err := exec.Command(hook[0], hook[1:]...).CombinedOutput() if len(b) > 0 { log.Info("Executing the transparent pre start hook: %v", string(b)) } @@ -74,13 +76,14 @@ func (m *CoreProcessManager) CheckAndSetupTransparentProxy(checkRunning bool, se err = writeTransparentProxyRules() - if conf.GetEnvironmentConfig().TransparentHook != "" { - log.Info("Execute the transparent post start hook: %v", conf.GetEnvironmentConfig().TransparentHook) - b, err := exec.Command(conf.GetEnvironmentConfig().TransparentHook, + if thook := conf.GetEnvironmentConfig().TransparentHook; thook != "" { + hook := strings.Split(thook, " ") + hook = append(hook, fmt.Sprintf("--transparent-type=%v", setting.TransparentType), "--stage=post-start", - fmt.Sprintf("--v2raya-confdir=%v", conf.GetEnvironmentConfig().Config), - ).CombinedOutput() + fmt.Sprintf("--v2raya-confdir=%v", conf.GetEnvironmentConfig().Config)) + log.Info("Execute the transparent post start hook: %v", hook) + b, err := exec.Command(hook[0], hook[1:]...).CombinedOutput() if len(b) > 0 { log.Info("Executing the transparent post start hook: %v", string(b)) } @@ -101,13 +104,14 @@ func (m *CoreProcessManager) CheckAndStopTransparentProxy(setting *configure.Set } } if setting.Transparent != configure.TransparentClose { - if conf.GetEnvironmentConfig().TransparentHook != "" { - log.Info("Execute the transparent pre stop hook: %v", conf.GetEnvironmentConfig().TransparentHook) - b, err := exec.Command(conf.GetEnvironmentConfig().TransparentHook, + if thook := conf.GetEnvironmentConfig().TransparentHook; thook != "" { + hook := strings.Split(thook, " ") + hook = append(hook, fmt.Sprintf("--transparent-type=%v", setting.TransparentType), "--stage=pre-stop", - fmt.Sprintf("--v2raya-confdir=%v", conf.GetEnvironmentConfig().Config), - ).CombinedOutput() + fmt.Sprintf("--v2raya-confdir=%v", conf.GetEnvironmentConfig().Config)) + log.Info("Execute the transparent pre stop hook: %v", hook) + b, err := exec.Command(hook[0], hook[1:]...).CombinedOutput() if len(b) > 0 { log.Info("Executing the transparent pre stop hook: %v", string(b)) } @@ -119,13 +123,14 @@ func (m *CoreProcessManager) CheckAndStopTransparentProxy(setting *configure.Set deleteTransparentProxyRules() - if conf.GetEnvironmentConfig().TransparentHook != "" { - log.Info("Execute the transparent post stop hook: %v", conf.GetEnvironmentConfig().TransparentHook) - b, err := exec.Command(conf.GetEnvironmentConfig().TransparentHook, + if thook := conf.GetEnvironmentConfig().TransparentHook; thook != "" { + hook := strings.Split(thook, " ") + hook = append(hook, fmt.Sprintf("--transparent-type=%v", setting.TransparentType), "--stage=post-stop", - fmt.Sprintf("--v2raya-confdir=%v", conf.GetEnvironmentConfig().Config), - ).CombinedOutput() + fmt.Sprintf("--v2raya-confdir=%v", conf.GetEnvironmentConfig().Config)) + log.Info("Execute the transparent post stop hook: %v", hook) + b, err := exec.Command(hook[0], hook[1:]...).CombinedOutput() if len(b) > 0 { log.Info("Executing the transparent post stop hook: %v", string(b)) } @@ -138,12 +143,11 @@ func (m *CoreProcessManager) CheckAndStopTransparentProxy(setting *configure.Set } func (m *CoreProcessManager) afterStop(p *Process) { - if conf.GetEnvironmentConfig().CoreHook != "" { - log.Info("Execute the core post stop hook: %v", conf.GetEnvironmentConfig().CoreHook) - b, err := exec.Command(conf.GetEnvironmentConfig().CoreHook, - "--stage=post-stop", - fmt.Sprintf("--v2raya-confdir=%v", conf.GetEnvironmentConfig().Config), - ).CombinedOutput() + if corehook := conf.GetEnvironmentConfig().CoreHook; corehook != "" { + hook := strings.Split(corehook, " ") + hook = append(hook, "--stage=post-stop", fmt.Sprintf("--v2raya-confdir=%v", conf.GetEnvironmentConfig().Config)) + log.Info("Execute the core post stop hook: %v", hook) + b, err := exec.Command(hook[0], hook[1:]...).CombinedOutput() if len(b) > 0 { log.Info("Executing the core post stop hook: %v", string(b)) } @@ -197,12 +201,11 @@ func (m *CoreProcessManager) beforeStart(t *Template) (err error) { return err } - if conf.GetEnvironmentConfig().CoreHook != "" { - log.Info("Execute the core pre start hook: %v", conf.GetEnvironmentConfig().CoreHook) - b, err := exec.Command(conf.GetEnvironmentConfig().CoreHook, - "--stage=pre-start", - fmt.Sprintf("--v2raya-confdir=%v", conf.GetEnvironmentConfig().Config), - ).CombinedOutput() + if corehook := conf.GetEnvironmentConfig().CoreHook; corehook != "" { + hook := strings.Split(corehook, " ") + hook = append(hook, "--stage=pre-start", fmt.Sprintf("--v2raya-confdir=%v", conf.GetEnvironmentConfig().Config)) + log.Info("Execute the core pre start hook: %v", hook) + b, err := exec.Command(hook[0], hook[1:]...).CombinedOutput() if len(b) > 0 { log.Info("Executing the core pre start hook: %v", string(b)) } @@ -219,12 +222,11 @@ func (m *CoreProcessManager) afterStart(t *Template) (err error) { } specialMode.CheckAndSetupDNSSupervisor() - if conf.GetEnvironmentConfig().CoreHook != "" { - log.Info("Execute the core post start hook: %v", conf.GetEnvironmentConfig().CoreHook) - b, err := exec.Command(conf.GetEnvironmentConfig().CoreHook, - "--stage=post-start", - fmt.Sprintf("--v2raya-confdir=%v", conf.GetEnvironmentConfig().Config), - ).CombinedOutput() + if corehook := conf.GetEnvironmentConfig().CoreHook; corehook != "" { + hook := strings.Split(corehook, " ") + hook = append(hook, "--stage=post-start", fmt.Sprintf("--v2raya-confdir=%v", conf.GetEnvironmentConfig().Config)) + log.Info("Execute the core post start hook: %v", hook) + b, err := exec.Command(hook[0], hook[1:]...).CombinedOutput() if len(b) > 0 { log.Info("Executing the core post start hook: %v", string(b)) } diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AngApplication.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AngApplication.kt index fb81a00e41..23ca7b8f34 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AngApplication.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AngApplication.kt @@ -1,6 +1,8 @@ package com.v2ray.ang import android.content.Context +import android.content.pm.PackageManager +import android.os.Build import androidx.multidex.MultiDexApplication import androidx.work.Configuration import androidx.work.WorkManager @@ -41,4 +43,10 @@ class AngApplication : MultiDexApplication() { SettingsManager.initRoutingRulesets(this) } + + fun getPackageInfo(packageName: String) = packageManager.getPackageInfo( + packageName, if (Build.VERSION.SDK_INT >= 28) PackageManager.GET_SIGNING_CERTIFICATES + else @Suppress("DEPRECATION") PackageManager.GET_SIGNATURES + )!! + } diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AppConfig.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AppConfig.kt index bf5803a97e..f17c93f569 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AppConfig.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AppConfig.kt @@ -113,6 +113,7 @@ object AppConfig { const val WIREGUARD_LOCAL_ADDRESS_V4 = "172.16.0.2/32" const val WIREGUARD_LOCAL_ADDRESS_V6 = "2606:4700:110:8f81:d551:a0:532e:a2b3/128" const val WIREGUARD_LOCAL_MTU = "1420" + const val LOOPBACK = "127.0.0.1" /** Message constants for communication. */ const val MSG_REGISTER_CLIENT = 1 diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/Hysteria2Bean.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/Hysteria2Bean.kt new file mode 100644 index 0000000000..fe59818535 --- /dev/null +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/Hysteria2Bean.kt @@ -0,0 +1,17 @@ +package com.v2ray.ang.dto + +data class Hysteria2Bean( + val server: String?, + val auth: String?, + val lazy: Boolean? = true, + val socks5: Socks5Bean?, + val tls: TlsBean? +) { + data class Socks5Bean( + val listen: String?, + ) + + data class TlsBean( + val sni: String? + ) +} \ No newline at end of file diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/SubscriptionItem.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/SubscriptionItem.kt index b2a3a9a330..8e8c66a403 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/SubscriptionItem.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/SubscriptionItem.kt @@ -10,5 +10,6 @@ data class SubscriptionItem( val updateInterval: Int? = null, var prevProfile: String? = null, var nextProfile: String? = null, + var filter: String? = null, ) diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/extension/_Ext.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/extension/_Ext.kt index 77ace45f0d..8f839409d0 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/extension/_Ext.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/extension/_Ext.kt @@ -1,6 +1,9 @@ package com.v2ray.ang.extension +import android.content.BroadcastReceiver import android.content.Context +import android.content.Intent +import android.content.IntentFilter import android.os.Build import android.widget.Toast import com.v2ray.ang.AngApplication @@ -56,4 +59,26 @@ val URI.idnHost: String fun String.removeWhiteSpace(): String = replace("\\s+".toRegex(), "") -fun String.toLongEx(): Long = toLongOrNull() ?: 0 \ No newline at end of file +fun String.toLongEx(): Long = toLongOrNull() ?: 0 + +fun Context.listenForPackageChanges(onetime: Boolean = true, callback: () -> Unit) = + object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + callback() + if (onetime) context.unregisterReceiver(this) + } + }.apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + registerReceiver(this, IntentFilter().apply { + addAction(Intent.ACTION_PACKAGE_ADDED) + addAction(Intent.ACTION_PACKAGE_REMOVED) + addDataScheme("package") + }, Context.RECEIVER_EXPORTED) + } else { + registerReceiver(this, IntentFilter().apply { + addAction(Intent.ACTION_PACKAGE_ADDED) + addAction(Intent.ACTION_PACKAGE_REMOVED) + addDataScheme("package") + }) + } + } \ No newline at end of file diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/NativePlugin.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/NativePlugin.kt new file mode 100644 index 0000000000..7a072cd0f1 --- /dev/null +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/NativePlugin.kt @@ -0,0 +1,32 @@ +/****************************************************************************** + * * + * Copyright (C) 2021 by nekohasekai * + * Copyright (C) 2021 by Max Lv * + * Copyright (C) 2021 by Mygod Studio * + * * + * 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 com.v2ray.ang.plugin + +import android.content.pm.ResolveInfo + +class NativePlugin(resolveInfo: ResolveInfo) : ResolvedPlugin(resolveInfo) { + init { + check(resolveInfo.providerInfo != null) + } + + override val componentInfo get() = resolveInfo.providerInfo!! +} diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/Plugin.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/Plugin.kt new file mode 100644 index 0000000000..04294ac61a --- /dev/null +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/Plugin.kt @@ -0,0 +1,43 @@ +/****************************************************************************** + * * + * Copyright (C) 2021 by nekohasekai * + * Copyright (C) 2021 by Max Lv * + * Copyright (C) 2021 by Mygod Studio * + * * + * 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 com.v2ray.ang.plugin + +import android.graphics.drawable.Drawable + +abstract class Plugin { + abstract val id: String + abstract val label: CharSequence + abstract val version: Int + abstract val versionName: String + open val icon: Drawable? get() = null + open val defaultConfig: String? get() = null + open val packageName: String get() = "" + open val directBootAware: Boolean get() = true + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + return id == (other as Plugin).id + } + + override fun hashCode() = id.hashCode() +} diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/PluginContract.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/PluginContract.kt new file mode 100644 index 0000000000..5aa253f828 --- /dev/null +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/PluginContract.kt @@ -0,0 +1,33 @@ +/****************************************************************************** + * * + * Copyright (C) 2021 by nekohasekai * + * * + * 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 com.v2ray.ang.plugin + +object PluginContract { + + const val ACTION_NATIVE_PLUGIN = "io.nekohasekai.sagernet.plugin.ACTION_NATIVE_PLUGIN" + const val EXTRA_ENTRY = "io.nekohasekai.sagernet.plugin.EXTRA_ENTRY" + const val METADATA_KEY_ID = "io.nekohasekai.sagernet.plugin.id" + const val METADATA_KEY_EXECUTABLE_PATH = "io.nekohasekai.sagernet.plugin.executable_path" + const val METHOD_GET_EXECUTABLE = "sagernet:getExecutable" + + const val COLUMN_PATH = "path" + const val COLUMN_MODE = "mode" + const val SCHEME = "plugin" +} diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/PluginList.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/PluginList.kt new file mode 100644 index 0000000000..9c247286a3 --- /dev/null +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/PluginList.kt @@ -0,0 +1,53 @@ +/****************************************************************************** + * * + * Copyright (C) 2021 by nekohasekai * + * Copyright (C) 2021 by Max Lv * + * Copyright (C) 2021 by Mygod Studio * + * * + * 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 com.v2ray.ang.plugin + +import android.content.Intent +import android.content.pm.PackageManager +import com.v2ray.ang.AngApplication + +class PluginList : ArrayList() { + init { + addAll( + AngApplication.application.packageManager.queryIntentContentProviders( + Intent(PluginContract.ACTION_NATIVE_PLUGIN), PackageManager.GET_META_DATA) + .filter { it.providerInfo.exported }.map { NativePlugin(it) }) + } + + val lookup = mutableMapOf().apply { + for (plugin in this@PluginList.toList()) { + fun check(old: Plugin?) { + if (old != null && old != plugin) { + this@PluginList.remove(old) + } + /* if (old != null && old !== plugin) { + val packages = this@PluginList.filter { it.id == plugin.id } + .joinToString { it.packageName } + val message = "Conflicting plugins found from: $packages" + Toast.makeText(SagerNet.application, message, Toast.LENGTH_LONG).show() + throw IllegalStateException(message) + }*/ + } + check(put(plugin.id, plugin)) + } + } +} diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/PluginManager.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/PluginManager.kt new file mode 100644 index 0000000000..19fb6f2e35 --- /dev/null +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/PluginManager.kt @@ -0,0 +1,219 @@ +/****************************************************************************** + * * + * Copyright (C) 2021 by nekohasekai * + * Copyright (C) 2021 by Max Lv * + * Copyright (C) 2021 by Mygod Studio * + * * + * 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 com.v2ray.ang.plugin + +import android.annotation.SuppressLint +import android.content.BroadcastReceiver +import android.content.ContentResolver +import android.content.Intent +import android.content.pm.ComponentInfo +import android.content.pm.PackageManager +import android.content.pm.ProviderInfo +import android.database.Cursor +import android.net.Uri +import android.os.Build +import android.system.Os +import android.widget.Toast +import androidx.core.os.bundleOf +import com.v2ray.ang.AngApplication +import com.v2ray.ang.extension.listenForPackageChanges +import com.v2ray.ang.plugin.PluginContract.METADATA_KEY_ID +import java.io.File +import java.io.FileNotFoundException + +object PluginManager { + + class PluginNotFoundException(val plugin: String) : FileNotFoundException(plugin) + private var receiver: BroadcastReceiver? = null + private var cachedPlugins: PluginList? = null + fun fetchPlugins() = synchronized(this) { + if (receiver == null) receiver = AngApplication.application.listenForPackageChanges { + synchronized(this) { + receiver = null + cachedPlugins = null + } + } + if (cachedPlugins == null) cachedPlugins = PluginList() + cachedPlugins!! + } + + private fun buildUri(id: String, authority: String) = Uri.Builder() + .scheme(PluginContract.SCHEME) + .authority(authority) + .path("/$id") + .build() + + data class InitResult( + val path: String, + ) + + @Throws(Throwable::class) + fun init(pluginId: String): InitResult? { + if (pluginId.isEmpty()) return null + var throwable: Throwable? = null + + try { + val result = initNative(pluginId) + if (result != null) return result + } catch (t: Throwable) { + if (throwable == null) throwable = t //Logs.w(t) + } + + throw throwable ?: PluginNotFoundException(pluginId) + } + + private fun initNative(pluginId: String): InitResult? { + var flags = PackageManager.GET_META_DATA + if (Build.VERSION.SDK_INT >= 24) { + flags = + flags or PackageManager.MATCH_DIRECT_BOOT_UNAWARE or PackageManager.MATCH_DIRECT_BOOT_AWARE + } + var providers = AngApplication.application.packageManager.queryIntentContentProviders( + Intent(PluginContract.ACTION_NATIVE_PLUGIN, buildUri(pluginId, "com.github.dyhkwong.AngApplication")), flags) + .filter { it.providerInfo.exported } + if (providers.isEmpty()) { + providers = AngApplication.application.packageManager.queryIntentContentProviders( + Intent(PluginContract.ACTION_NATIVE_PLUGIN, buildUri(pluginId, "io.nekohasekai.AngApplication")), flags) + .filter { it.providerInfo.exported } + } + if (providers.isEmpty()) { + providers = AngApplication.application.packageManager.queryIntentContentProviders( + Intent(PluginContract.ACTION_NATIVE_PLUGIN, buildUri(pluginId, "moe.matsuri.lite")), flags) + .filter { it.providerInfo.exported } + } + if (providers.isEmpty()) { + providers = AngApplication.application.packageManager.queryIntentContentProviders( + Intent(PluginContract.ACTION_NATIVE_PLUGIN, buildUri(pluginId, "fr.husi")), flags) + .filter { it.providerInfo.exported } + } + if (providers.isEmpty()) { + providers = AngApplication.application.packageManager.queryIntentContentProviders( + Intent(PluginContract.ACTION_NATIVE_PLUGIN), PackageManager.GET_META_DATA + ).filter { + it.providerInfo.exported && + it.providerInfo.metaData.containsKey(METADATA_KEY_ID) && + it.providerInfo.metaData.getString(METADATA_KEY_ID) == pluginId + } + if (providers.size > 1) { + providers = listOf(providers[0]) // What if there is more than one? + } + } + if (providers.isEmpty()) return null + if (providers.size > 1) { + val message = + "Conflicting plugins found from: ${providers.joinToString { it.providerInfo.packageName }}" + Toast.makeText(AngApplication.application, message, Toast.LENGTH_LONG).show() + throw IllegalStateException(message) + } + val provider = providers.single().providerInfo + var failure: Throwable? = null + try { + initNativeFaster(provider)?.also { return InitResult(it) } + } catch (t: Throwable) { + // Logs.w("Initializing native plugin faster mode failed") + failure = t + } + + val uri = Uri.Builder().apply { + scheme(ContentResolver.SCHEME_CONTENT) + authority(provider.authority) + }.build() + try { + return initNativeFast(AngApplication.application.contentResolver, + pluginId, + uri)?.let { InitResult(it) } + } catch (t: Throwable) { + // Logs.w("Initializing native plugin fast mode failed") + failure?.also { t.addSuppressed(it) } + failure = t + } + + try { + return initNativeSlow(AngApplication.application.contentResolver, + pluginId, + uri)?.let { InitResult(it) } + } catch (t: Throwable) { + failure?.also { t.addSuppressed(it) } + throw t + } + } + + private fun initNativeFaster(provider: ProviderInfo): String? { + return provider.loadString(PluginContract.METADATA_KEY_EXECUTABLE_PATH) + ?.let { relativePath -> + File(provider.applicationInfo.nativeLibraryDir).resolve(relativePath).apply { + check(canExecute()) + }.absolutePath + } + } + + private fun initNativeFast(cr: ContentResolver, pluginId: String, uri: Uri): String? { + return cr.call(uri, PluginContract.METHOD_GET_EXECUTABLE, null, bundleOf()) + ?.getString(PluginContract.EXTRA_ENTRY)?.also { + check(File(it).canExecute()) + } + } + + @SuppressLint("Recycle") + private fun initNativeSlow(cr: ContentResolver, pluginId: String, uri: Uri): String? { + var initialized = false + fun entryNotFound(): Nothing = + throw IndexOutOfBoundsException("Plugin entry binary not found") + + val pluginDir = File(AngApplication.application.noBackupFilesDir, "plugin") + (cr.query(uri, + arrayOf(PluginContract.COLUMN_PATH, PluginContract.COLUMN_MODE), + null, + null, + null) + ?: return null).use { cursor -> + if (!cursor.moveToFirst()) entryNotFound() + pluginDir.deleteRecursively() + if (!pluginDir.mkdirs()) throw FileNotFoundException("Unable to create plugin directory") + val pluginDirPath = pluginDir.absolutePath + '/' + do { + val path = cursor.getString(0) + val file = File(pluginDir, path) + check(file.absolutePath.startsWith(pluginDirPath)) + cr.openInputStream(uri.buildUpon().path(path).build())!!.use { inStream -> + file.outputStream().use { outStream -> inStream.copyTo(outStream) } + } + Os.chmod(file.absolutePath, when (cursor.getType(1)) { + Cursor.FIELD_TYPE_INTEGER -> cursor.getInt(1) + Cursor.FIELD_TYPE_STRING -> cursor.getString(1).toInt(8) + else -> throw IllegalArgumentException("File mode should be of type int") + }) + if (path == pluginId) initialized = true + } while (cursor.moveToNext()) + } + if (!initialized) entryNotFound() + return File(pluginDir, pluginId).absolutePath + } + + fun ComponentInfo.loadString(key: String) = when (val value = metaData.get(key)) { + is String -> value + is Int -> AngApplication.application.packageManager.getResourcesForApplication(applicationInfo) + .getString(value) + null -> null + else -> error("meta-data $key has invalid type ${value.javaClass}") + } +} diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/ResolvedPlugin.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/ResolvedPlugin.kt new file mode 100644 index 0000000000..3b2f200325 --- /dev/null +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/ResolvedPlugin.kt @@ -0,0 +1,45 @@ +/****************************************************************************** + * * + * Copyright (C) 2021 by nekohasekai * + * Copyright (C) 2021 by Max Lv * + * Copyright (C) 2021 by Mygod Studio * + * * + * 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 com.v2ray.ang.plugin + +import android.content.pm.ComponentInfo +import android.content.pm.ResolveInfo +import android.graphics.drawable.Drawable +import android.os.Build +import com.v2ray.ang.AngApplication +import com.v2ray.ang.plugin.PluginManager.loadString + +abstract class ResolvedPlugin(protected val resolveInfo: ResolveInfo) : Plugin() { + protected abstract val componentInfo: ComponentInfo + + override val id by lazy { componentInfo.loadString(PluginContract.METADATA_KEY_ID)!! } + override val version by lazy { + AngApplication.application.getPackageInfo(componentInfo.packageName).versionCode + } + override val versionName: String by lazy { + AngApplication.application.getPackageInfo(componentInfo.packageName).versionName!! + } + override val label: CharSequence get() = resolveInfo.loadLabel(AngApplication.application.packageManager) + override val icon: Drawable get() = resolveInfo.loadIcon(AngApplication.application.packageManager) + override val packageName: String get() = componentInfo.packageName + override val directBootAware get() = Build.VERSION.SDK_INT < 24 || componentInfo.directBootAware +} diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayServiceManager.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayServiceManager.kt index 86a09153a8..97819a4045 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayServiceManager.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayServiceManager.kt @@ -24,6 +24,7 @@ import com.v2ray.ang.ui.MainActivity import com.v2ray.ang.util.MessageUtil import com.v2ray.ang.util.MmkvManager import com.v2ray.ang.util.MmkvManager.settingsStorage +import com.v2ray.ang.util.PluginUtil import com.v2ray.ang.util.Utils import com.v2ray.ang.util.V2rayConfigUtil import go.Seq @@ -161,6 +162,8 @@ object V2RayServiceManager { if (v2rayPoint.isRunning) { MessageUtil.sendMsg2UI(service, AppConfig.MSG_STATE_START_SUCCESS, "") showNotification() + + PluginUtil.runPlugin(service, config) } else { MessageUtil.sendMsg2UI(service, AppConfig.MSG_STATE_START_FAILURE, "") cancelNotification() @@ -188,6 +191,7 @@ object V2RayServiceManager { } catch (e: Exception) { Log.d(ANG_PACKAGE, e.toString()) } + PluginUtil.stopPlugin() } private class ReceiveMessageHandler : BroadcastReceiver() { diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayVpnService.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayVpnService.kt index 8a132d2278..c42e33fb06 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayVpnService.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayVpnService.kt @@ -17,6 +17,7 @@ import android.os.StrictMode import android.util.Log import androidx.annotation.RequiresApi import com.v2ray.ang.AppConfig +import com.v2ray.ang.AppConfig.LOOPBACK import com.v2ray.ang.BuildConfig import com.v2ray.ang.R import com.v2ray.ang.util.MmkvManager.settingsStorage @@ -207,7 +208,7 @@ class V2RayVpnService : VpnService(), ServiceControl { File(applicationContext.applicationInfo.nativeLibraryDir, TUN2SOCKS).absolutePath, "--netif-ipaddr", PRIVATE_VLAN4_ROUTER, "--netif-netmask", "255.255.255.252", - "--socks-server-addr", "127.0.0.1:${socksPort}", + "--socks-server-addr", "$LOOPBACK:${socksPort}", "--tunmtu", VPN_MTU.toString(), "--sock-path", "sock_path",//File(applicationContext.filesDir, "sock_path").absolutePath, "--enable-udprelay", @@ -221,7 +222,7 @@ class V2RayVpnService : VpnService(), ServiceControl { if (settingsStorage?.decodeBool(AppConfig.PREF_LOCAL_DNS_ENABLED) == true) { val localDnsPort = Utils.parseInt(settingsStorage?.decodeString(AppConfig.PREF_LOCAL_DNS_PORT), AppConfig.PORT_LOCAL_DNS.toInt()) cmd.add("--dnsgw") - cmd.add("127.0.0.1:${localDnsPort}") + cmd.add("$LOOPBACK:${localDnsPort}") } Log.d(packageName, cmd.toString()) diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt index d0904b8413..ab31d8f0ba 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt @@ -292,10 +292,10 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList true } -// R.id.import_manually_hysteria2 -> { -// importManually(EConfigType.HYSTERIA2.value) -// true -// } + R.id.import_manually_hysteria2 -> { + importManually(EConfigType.HYSTERIA2.value) + true + } R.id.import_config_custom_clipboard -> { importConfigCustomClipboard() diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubEditActivity.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubEditActivity.kt index 76a433302f..86b27da5c8 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubEditActivity.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubEditActivity.kt @@ -42,6 +42,7 @@ class SubEditActivity : BaseActivity() { private fun bindingServer(subItem: SubscriptionItem): Boolean { binding.etRemarks.text = Utils.getEditable(subItem.remarks) binding.etUrl.text = Utils.getEditable(subItem.url) + binding.etFilter.text = Utils.getEditable(subItem.filter) binding.chkEnable.isChecked = subItem.enabled binding.autoUpdateCheck.isChecked = subItem.autoUpdate binding.etPreProfile.text = Utils.getEditable(subItem.prevProfile) @@ -55,6 +56,7 @@ class SubEditActivity : BaseActivity() { private fun clearServer(): Boolean { binding.etRemarks.text = null binding.etUrl.text = null + binding.etFilter.text = null binding.chkEnable.isChecked = true binding.etPreProfile.text = null binding.etNextProfile.text = null @@ -65,10 +67,11 @@ class SubEditActivity : BaseActivity() { * save server config */ private fun saveServer(): Boolean { - val subItem = MmkvManager.decodeSubscription(editSubId)?:SubscriptionItem() + val subItem = MmkvManager.decodeSubscription(editSubId) ?: SubscriptionItem() subItem.remarks = binding.etRemarks.text.toString() subItem.url = binding.etUrl.text.toString() + subItem.filter = binding.etFilter.text.toString() subItem.enabled = binding.chkEnable.isChecked subItem.autoUpdate = binding.autoUpdateCheck.isChecked subItem.prevProfile = binding.etPreProfile.text.toString() diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/UserAssetActivity.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/UserAssetActivity.kt index 3cfa7c4ec3..00983e2d19 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/UserAssetActivity.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/UserAssetActivity.kt @@ -21,6 +21,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.tbruyelle.rxpermissions3.RxPermissions import com.v2ray.ang.AppConfig +import com.v2ray.ang.AppConfig.LOOPBACK import com.v2ray.ang.R import com.v2ray.ang.databinding.ActivitySubSettingBinding import com.v2ray.ang.databinding.ItemRecyclerUserAssetBinding @@ -212,7 +213,7 @@ class UserAssetActivity : BaseActivity() { URL(item.url).openConnection( Proxy( Proxy.Type.HTTP, - InetSocketAddress("127.0.0.1", httpPort) + InetSocketAddress(LOOPBACK, httpPort) ) ) as HttpURLConnection } diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt index 6d48a0aa17..14974e15cc 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt @@ -32,6 +32,7 @@ object AngConfigManager { private fun parseConfig( str: String?, subid: String, + subItem: SubscriptionItem?, removedSelectedServer: ServerConfig? ): Int { try { @@ -40,19 +41,19 @@ object AngConfigManager { } val config = if (str.startsWith(EConfigType.VMESS.protocolScheme)) { - VmessFmt.parseVmess(str) + VmessFmt.parse(str) } else if (str.startsWith(EConfigType.SHADOWSOCKS.protocolScheme)) { - ShadowsocksFmt.parseShadowsocks(str) + ShadowsocksFmt.parse(str) } else if (str.startsWith(EConfigType.SOCKS.protocolScheme)) { - SocksFmt.parseSocks(str) + SocksFmt.parse(str) } else if (str.startsWith(EConfigType.TROJAN.protocolScheme)) { - TrojanFmt.parseTrojan(str) + TrojanFmt.parse(str) } else if (str.startsWith(EConfigType.VLESS.protocolScheme)) { - VlessFmt.parseVless(str) + VlessFmt.parse(str) } else if (str.startsWith(EConfigType.WIREGUARD.protocolScheme)) { - WireguardFmt.parseWireguard(str) + WireguardFmt.parse(str) } else if (str.startsWith(EConfigType.HYSTERIA2.protocolScheme)) { - Hysteria2Fmt.parseHysteria2(str) + Hysteria2Fmt.parse(str) } else { null } @@ -60,6 +61,13 @@ object AngConfigManager { if (config == null) { return R.string.toast_incorrect_protocol } + //filter + if (subItem?.filter != null && subItem.filter?.isNotEmpty() == true && config.remarks.isNotEmpty()) { + val matched = Regex(pattern = subItem.filter ?: "") + .containsMatchIn(input = config.remarks) + if (!matched) return -1 + } + config.subscriptionId = subid val guid = MmkvManager.encodeServerConfig("", config) if (removedSelectedServer != null && @@ -244,11 +252,12 @@ object AngConfigManager { MmkvManager.removeServerViaSubid(subid) } + val subItem = MmkvManager.decodeSubscription(subid) var count = 0 servers.lines() .reversed() .forEach { - val resId = parseConfig(it, subid, removedSelectedServer) + val resId = parseConfig(it, subid, subItem, removedSelectedServer) if (resId == 0) { count++ } diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/PluginUtil.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/PluginUtil.kt new file mode 100644 index 0000000000..e26f001619 --- /dev/null +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/PluginUtil.kt @@ -0,0 +1,93 @@ +package com.v2ray.ang.util + +import android.content.Context +import android.os.SystemClock +import android.util.Log +import com.google.gson.Gson +import com.v2ray.ang.AppConfig +import com.v2ray.ang.dto.EConfigType +import com.v2ray.ang.dto.ServerConfig +import com.v2ray.ang.util.MmkvManager.settingsStorage +import com.v2ray.ang.util.fmt.Hysteria2Fmt +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import java.io.File + +object PluginUtil { + //private const val HYSTERIA2 = "hysteria2-plugin" + private const val HYSTERIA2 = "libhysteria2.so" + private const val packageName = "PluginUtil" + private lateinit var process: Process + +// fun initPlugin(name: String): PluginManager.InitResult { +// return PluginManager.init(name)!! +// } + + fun runPlugin(context: Context, config: ServerConfig?) { + Log.d(packageName, "runPlugin") + + val outbound = config?.getProxyOutbound() ?: return + if (outbound.protocol.equals(EConfigType.HYSTERIA2.name, true)) { + Log.d(packageName, "runPlugin $HYSTERIA2") + + val socksPort = 100 + Utils.parseInt(settingsStorage?.decodeString(AppConfig.PREF_SOCKS_PORT), AppConfig.PORT_SOCKS.toInt()) + val hy2Config = Hysteria2Fmt.toNativeConfig(config, socksPort) ?: return + + val configFile = File(context.noBackupFilesDir, "hy2_${SystemClock.elapsedRealtime()}.json") + Log.d(packageName, "runPlugin ${configFile.absolutePath}") + + configFile.parentFile?.mkdirs() + configFile.writeText(Gson().toJson(hy2Config)) + Log.d(packageName, Gson().toJson(hy2Config)) + + runHy2(context, configFile) + } + } + + fun stopPlugin() { + stopHy2() + } + + private fun runHy2(context: Context, configFile: File) { + val cmd = mutableListOf( + File(context.applicationInfo.nativeLibraryDir, HYSTERIA2).absolutePath, + //initPlugin(HYSTERIA2).path, + "--disable-update-check", + "--config", + configFile.absolutePath, + "--log-level", + "warn", + "client" + ) + Log.d(packageName, cmd.toString()) + + try { + val proBuilder = ProcessBuilder(cmd) + proBuilder.redirectErrorStream(true) + process = proBuilder + .directory(context.filesDir) + .start() + + CoroutineScope(Dispatchers.IO).launch { + Thread.sleep(500L) + Log.d(packageName, "$HYSTERIA2 check") + process.waitFor() + Log.d(packageName, "$HYSTERIA2 exited") + } + Log.d(packageName, process.toString()) + + } catch (e: Exception) { + Log.d(packageName, e.toString()) + } + } + + private fun stopHy2() { + try { + Log.d(packageName, "$HYSTERIA2 destroy") + process?.destroy() + } catch (e: Exception) { + Log.d(packageName, e.toString()) + } + } +} \ No newline at end of file diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/SpeedtestUtil.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/SpeedtestUtil.kt index 03a3f6ba7a..29e27de0ac 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/SpeedtestUtil.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/SpeedtestUtil.kt @@ -5,6 +5,7 @@ import android.os.SystemClock import android.text.TextUtils import android.util.Log import com.v2ray.ang.AppConfig +import com.v2ray.ang.AppConfig.LOOPBACK import com.v2ray.ang.R import com.v2ray.ang.extension.responseLength import kotlinx.coroutines.isActive @@ -108,7 +109,7 @@ object SpeedtestUtil { conn = url.openConnection( Proxy( Proxy.Type.HTTP, - InetSocketAddress("127.0.0.1", port) + InetSocketAddress(LOOPBACK, port) ) ) as HttpURLConnection conn.connectTimeout = 30000 diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt index 24271013bb..062cef60b8 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt @@ -19,6 +19,7 @@ import android.webkit.URLUtil import androidx.appcompat.app.AppCompatDelegate import com.v2ray.ang.AppConfig import com.v2ray.ang.AppConfig.ANG_PACKAGE +import com.v2ray.ang.AppConfig.LOOPBACK import com.v2ray.ang.BuildConfig import com.v2ray.ang.R import com.v2ray.ang.extension.toast @@ -359,7 +360,7 @@ object Utils { url.openConnection( Proxy( Proxy.Type.HTTP, - InetSocketAddress("127.0.0.1", httpPort) + InetSocketAddress(LOOPBACK, httpPort) ) ) } diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/V2rayConfigUtil.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/V2rayConfigUtil.kt index eb6681743f..27f0ab0c2e 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/V2rayConfigUtil.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/V2rayConfigUtil.kt @@ -6,6 +6,7 @@ import android.util.Log import com.google.gson.Gson import com.v2ray.ang.AppConfig import com.v2ray.ang.AppConfig.ANG_PACKAGE +import com.v2ray.ang.AppConfig.LOOPBACK import com.v2ray.ang.AppConfig.PROTOCOL_FREEDOM import com.v2ray.ang.AppConfig.TAG_BLOCKED import com.v2ray.ang.AppConfig.TAG_DIRECT @@ -41,7 +42,7 @@ object V2rayConfigUtil { } val result = getV2rayNonCustomConfig(context, config) - Log.d(ANG_PACKAGE, result.content) + //Log.d(ANG_PACKAGE, result.content) return result } catch (e: Exception) { e.printStackTrace() @@ -110,7 +111,7 @@ object V2rayConfigUtil { v2rayConfig.inbounds.forEach { curInbound -> if (settingsStorage?.decodeBool(AppConfig.PREF_PROXY_SHARING) != true) { //bind all inbounds to localhost if the user requests - curInbound.listen = "127.0.0.1" + curInbound.listen = LOOPBACK } } v2rayConfig.inbounds[0].port = socksPort @@ -145,6 +146,28 @@ object V2rayConfigUtil { } private fun outbounds(v2rayConfig: V2rayConfig, outbound: V2rayConfig.OutboundBean): Boolean { + if (outbound.protocol.equals(EConfigType.HYSTERIA2.name, true)) { + val socksPort = 100 + Utils.parseInt(settingsStorage?.decodeString(AppConfig.PREF_SOCKS_PORT), AppConfig.PORT_SOCKS.toInt()) + val outboundNew = V2rayConfig.OutboundBean( + mux = null, + protocol = EConfigType.SOCKS.name.lowercase(), + settings = V2rayConfig.OutboundBean.OutSettingsBean( + servers = listOf( + V2rayConfig.OutboundBean.OutSettingsBean.ServersBean( + address = LOOPBACK, + port = socksPort + ) + ) + ) + ) + if (v2rayConfig.outbounds.isNotEmpty()) { + v2rayConfig.outbounds[0] = outboundNew + } else { + v2rayConfig.outbounds.add(outboundNew) + } + return true + } + val ret = updateOutboundWithGlobalSettings(outbound) if (!ret) return false @@ -247,7 +270,7 @@ object V2rayConfigUtil { V2rayConfig.InboundBean( tag = "dns-in", port = localDnsPort, - listen = "127.0.0.1", + listen = LOOPBACK, protocol = "dokodemo-door", settings = dnsInboundSettings, sniffing = null @@ -335,7 +358,7 @@ object V2rayConfigUtil { //block dns val blkDomain = userRule2Domain(TAG_BLOCKED) if (blkDomain.size > 0) { - hosts.putAll(blkDomain.map { it to "127.0.0.1" }) + hosts.putAll(blkDomain.map { it to LOOPBACK }) } // hardcode googleapi rule to fix play store problems diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/Hysteria2Fmt.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/Hysteria2Fmt.kt index 899ce782aa..e104251566 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/Hysteria2Fmt.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/Hysteria2Fmt.kt @@ -2,7 +2,9 @@ package com.v2ray.ang.util.fmt import android.text.TextUtils import com.v2ray.ang.AppConfig +import com.v2ray.ang.AppConfig.LOOPBACK import com.v2ray.ang.dto.EConfigType +import com.v2ray.ang.dto.Hysteria2Bean import com.v2ray.ang.dto.ServerConfig import com.v2ray.ang.dto.V2rayConfig import com.v2ray.ang.extension.idnHost @@ -12,7 +14,7 @@ import java.net.URI object Hysteria2Fmt { - fun parseHysteria2(str: String): ServerConfig { + fun parse(str: String): ServerConfig { var allowInsecure = settingsStorage?.decodeBool(AppConfig.PREF_ALLOW_INSECURE) ?: false val config = ServerConfig.create(EConfigType.HYSTERIA2) @@ -70,4 +72,17 @@ object Hysteria2Fmt { ) return url + query + remark } + + fun toNativeConfig(config: ServerConfig, socksPort: Int): Hysteria2Bean? { + val outbound = config.getProxyOutbound() ?: return null + val bean = Hysteria2Bean( + server = outbound.getServerAddressAndPort(), + auth = outbound.getPassword(), + socks5 = Hysteria2Bean.Socks5Bean( + listen = "$LOOPBACK:${socksPort}" + ), + tls = Hysteria2Bean.TlsBean(outbound.getServerAddress()) + ) + return bean + } } \ No newline at end of file diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/ShadowsocksFmt.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/ShadowsocksFmt.kt index 40e068ee07..afd2d350f3 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/ShadowsocksFmt.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/ShadowsocksFmt.kt @@ -9,7 +9,7 @@ import com.v2ray.ang.util.Utils import java.net.URI object ShadowsocksFmt { - fun parseShadowsocks(str: String): ServerConfig? { + fun parse(str: String): ServerConfig? { val config = ServerConfig.create(EConfigType.SHADOWSOCKS) if (!tryResolveResolveSip002(str, config)) { var result = str.replace(EConfigType.SHADOWSOCKS.protocolScheme, "") diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/SocksFmt.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/SocksFmt.kt index 0148ec886e..106541f83e 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/SocksFmt.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/SocksFmt.kt @@ -6,7 +6,7 @@ import com.v2ray.ang.dto.V2rayConfig import com.v2ray.ang.util.Utils object SocksFmt { - fun parseSocks(str: String): ServerConfig? { + fun parse(str: String): ServerConfig? { val config = ServerConfig.create(EConfigType.SOCKS) var result = str.replace(EConfigType.SOCKS.protocolScheme, "") val indexSplit = result.indexOf("#") diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/TrojanFmt.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/TrojanFmt.kt index 9ebf870044..db3a2a3415 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/TrojanFmt.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/TrojanFmt.kt @@ -12,7 +12,7 @@ import java.net.URI object TrojanFmt { - fun parseTrojan(str: String): ServerConfig { + fun parse(str: String): ServerConfig { var allowInsecure = settingsStorage?.decodeBool(AppConfig.PREF_ALLOW_INSECURE) ?: false val config = ServerConfig.create(EConfigType.TROJAN) diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/VlessFmt.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/VlessFmt.kt index 46669c38e6..ea37d31030 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/VlessFmt.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/VlessFmt.kt @@ -12,7 +12,7 @@ import java.net.URI object VlessFmt { - fun parseVless(str: String): ServerConfig? { + fun parse(str: String): ServerConfig? { var allowInsecure = settingsStorage?.decodeBool(AppConfig.PREF_ALLOW_INSECURE) ?: false val config = ServerConfig.create(EConfigType.VLESS) diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/VmessFmt.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/VmessFmt.kt index 79052f930c..eca35e8591 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/VmessFmt.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/VmessFmt.kt @@ -15,7 +15,7 @@ import java.net.URI object VmessFmt { - fun parseVmess(str: String): ServerConfig? { + fun parse(str: String): ServerConfig? { if (str.indexOf('?') > 0 && str.indexOf('&') > 0) { return parseVmessStd(str) } diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/WireguardFmt.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/WireguardFmt.kt index 52edc42a75..a198d3c809 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/WireguardFmt.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/fmt/WireguardFmt.kt @@ -9,7 +9,7 @@ import com.v2ray.ang.util.Utils import java.net.URI object WireguardFmt { - fun parseWireguard(str: String): ServerConfig? { + fun parse(str: String): ServerConfig? { val uri = URI(Utils.fixIllegalUrl(str)) if (uri.rawQuery != null) { val config = ServerConfig.create(EConfigType.WIREGUARD) diff --git a/v2rayng/V2rayNG/app/src/main/res/layout/activity_sub_edit.xml b/v2rayng/V2rayNG/app/src/main/res/layout/activity_sub_edit.xml index 0ea797c4c6..00b8fcbbfe 100644 --- a/v2rayng/V2rayNG/app/src/main/res/layout/activity_sub_edit.xml +++ b/v2rayng/V2rayNG/app/src/main/res/layout/activity_sub_edit.xml @@ -72,6 +72,25 @@ + + + + + + + + - - - - + إعداد مجموعة الاشتراك ملاحظات عنوان URL اختياري + Remarks regular filter تفعيل التحديث تفعيل التحديث التلقائي Previous proxy remarks diff --git a/v2rayng/V2rayNG/app/src/main/res/values-bn/strings.xml b/v2rayng/V2rayNG/app/src/main/res/values-bn/strings.xml index f4836dc5e8..7c47a85465 100644 --- a/v2rayng/V2rayNG/app/src/main/res/values-bn/strings.xml +++ b/v2rayng/V2rayNG/app/src/main/res/values-bn/strings.xml @@ -229,6 +229,7 @@ সাবস্ক্রিপশন গ্রুপ সেটিং মন্তব্য ঐচ্ছিক URL + Remarks regular filter আপডেট সক্রিয় করুন স্বয়ংক্রিয় আপডেট সক্রিয় করুন Previous proxy remarks diff --git a/v2rayng/V2rayNG/app/src/main/res/values-fa/strings.xml b/v2rayng/V2rayNG/app/src/main/res/values-fa/strings.xml index dea8ed51e3..a232679098 100644 --- a/v2rayng/V2rayNG/app/src/main/res/values-fa/strings.xml +++ b/v2rayng/V2rayNG/app/src/main/res/values-fa/strings.xml @@ -227,6 +227,7 @@ تنظیمات گروه‌ی اشتراک ملاحظات نشانی اینترنتی اختیاری + Remarks regular filter فعال کردن به‌روزرسانی فعال سازی به‌روزرسانی خودکار Previous proxy remarks diff --git a/v2rayng/V2rayNG/app/src/main/res/values-ru/strings.xml b/v2rayng/V2rayNG/app/src/main/res/values-ru/strings.xml index 86d01e453b..835c6cb956 100644 --- a/v2rayng/V2rayNG/app/src/main/res/values-ru/strings.xml +++ b/v2rayng/V2rayNG/app/src/main/res/values-ru/strings.xml @@ -231,6 +231,7 @@ Группы Название URL (необязательно) + Remarks regular filter Использовать обновление Использовать автоматическое обновление Название предыдущего прокси diff --git a/v2rayng/V2rayNG/app/src/main/res/values-vi/strings.xml b/v2rayng/V2rayNG/app/src/main/res/values-vi/strings.xml index 5621af0066..b44a91f26b 100644 --- a/v2rayng/V2rayNG/app/src/main/res/values-vi/strings.xml +++ b/v2rayng/V2rayNG/app/src/main/res/values-vi/strings.xml @@ -230,6 +230,7 @@ Các gói đăng ký Tên gói đăng ký URL gói đăng ký + Remarks regular filter Sử dụng gói đăng ký này Bật tự động cập nhật Previous proxy remarks diff --git a/v2rayng/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml b/v2rayng/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml index d1e31ba7b6..603f40fab6 100644 --- a/v2rayng/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml +++ b/v2rayng/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml @@ -228,6 +228,7 @@ 订阅分组设置 备注 可选地址(url) + 别名正则过滤 启用更新 启用自动更新 前置代理别名 diff --git a/v2rayng/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml b/v2rayng/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml index f95323e228..1d9e85ac73 100644 --- a/v2rayng/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml +++ b/v2rayng/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml @@ -228,7 +228,8 @@ 匯出目前群組配置至剪貼簿 訂閱分組設定 備註 - Optional URL + 可選位址(url) + 別名正規過濾 啟用更新 啟用自動更新 前置代理别名 diff --git a/v2rayng/V2rayNG/app/src/main/res/values/strings.xml b/v2rayng/V2rayNG/app/src/main/res/values/strings.xml index 764cdbd8a0..217567ea93 100644 --- a/v2rayng/V2rayNG/app/src/main/res/values/strings.xml +++ b/v2rayng/V2rayNG/app/src/main/res/values/strings.xml @@ -234,6 +234,7 @@ Subscription group setting remarks Optional URL + Remarks regular filter Enable update Enable automatic update Previous proxy remarks diff --git a/xray-core/infra/conf/transport_internet.go b/xray-core/infra/conf/transport_internet.go index 21cffc0792..e89cef0db4 100644 --- a/xray-core/infra/conf/transport_internet.go +++ b/xray-core/infra/conf/transport_internet.go @@ -650,7 +650,7 @@ func (p TransportProtocol) Build() (string, error) { return "mkcp", nil case "ws", "websocket": return "websocket", nil - case "h2", "http": + case "h2", "h3", "http": return "http", nil case "grpc", "gun": return "grpc", nil diff --git a/xray-core/transport/internet/http/dialer.go b/xray-core/transport/internet/http/dialer.go index a1421d3f9f..31ded010de 100644 --- a/xray-core/transport/internet/http/dialer.go +++ b/xray-core/transport/internet/http/dialer.go @@ -9,6 +9,8 @@ import ( "sync" "time" + "github.com/quic-go/quic-go" + "github.com/quic-go/quic-go/http3" "github.com/xtls/xray-core/common" "github.com/xtls/xray-core/common/buf" c "github.com/xtls/xray-core/common/ctx" @@ -24,6 +26,13 @@ import ( "golang.org/x/net/http2" ) +// defines the maximum time an idle TCP session can survive in the tunnel, so +// it should be consistent across HTTP versions and with other transports. +const connIdleTimeout = 300 * time.Second + +// consistent with quic-go +const h3KeepalivePeriod = 10 * time.Second + type dialerConf struct { net.Destination *internet.MemoryStreamConfig @@ -48,72 +57,129 @@ func getHTTPClient(ctx context.Context, dest net.Destination, streamSettings *in if tlsConfigs == nil && realityConfigs == nil { return nil, errors.New("TLS or REALITY must be enabled for http transport.").AtWarning() } + isH3 := tlsConfigs != nil && (len(tlsConfigs.NextProtocol) == 1 && tlsConfigs.NextProtocol[0] == "h3") + if isH3 { + dest.Network = net.Network_UDP + } sockopt := streamSettings.SocketSettings if client, found := globalDialerMap[dialerConf{dest, streamSettings}]; found { return client, nil } - transport := &http2.Transport{ - DialTLSContext: func(hctx context.Context, string, addr string, tlsConfig *gotls.Config) (net.Conn, error) { - rawHost, rawPort, err := net.SplitHostPort(addr) - if err != nil { - return nil, err - } - if len(rawPort) == 0 { - rawPort = "443" - } - port, err := net.PortFromString(rawPort) - if err != nil { - return nil, err - } - address := net.ParseAddress(rawHost) + var transport http.RoundTripper + if isH3 { + quicConfig := &quic.Config{ + MaxIdleTimeout: connIdleTimeout, - hctx = c.ContextWithID(hctx, c.IDFromContext(ctx)) - hctx = session.ContextWithOutbounds(hctx, session.OutboundsFromContext(ctx)) - hctx = session.ContextWithTimeoutOnly(hctx, true) + // these two are defaults of quic-go/http3. the default of quic-go (no + // http3) is different, so it is hardcoded here for clarity. + // https://github.com/quic-go/quic-go/blob/b8ea5c798155950fb5bbfdd06cad1939c9355878/http3/client.go#L36-L39 + MaxIncomingStreams: -1, + KeepAlivePeriod: h3KeepalivePeriod, + } + roundTripper := &http3.RoundTripper{ + QUICConfig: quicConfig, + TLSClientConfig: tlsConfigs.GetTLSConfig(tls.WithDestination(dest)), + Dial: func(ctx context.Context, addr string, tlsCfg *gotls.Config, cfg *quic.Config) (quic.EarlyConnection, error) { + conn, err := internet.DialSystem(ctx, dest, streamSettings.SocketSettings) + if err != nil { + return nil, err + } - pconn, err := internet.DialSystem(hctx, net.TCPDestination(address, port), sockopt) - if err != nil { - errors.LogErrorInner(ctx, err, "failed to dial to " + addr) - return nil, err - } + var udpConn net.PacketConn + var udpAddr *net.UDPAddr - if realityConfigs != nil { - return reality.UClient(pconn, realityConfigs, hctx, dest) - } + switch c := conn.(type) { + case *internet.PacketConnWrapper: + var ok bool + udpConn, ok = c.Conn.(*net.UDPConn) + if !ok { + return nil, errors.New("PacketConnWrapper does not contain a UDP connection") + } + udpAddr, err = net.ResolveUDPAddr("udp", c.Dest.String()) + if err != nil { + return nil, err + } + case *net.UDPConn: + udpConn = c + udpAddr, err = net.ResolveUDPAddr("udp", c.RemoteAddr().String()) + if err != nil { + return nil, err + } + default: + udpConn = &internet.FakePacketConn{c} + udpAddr, err = net.ResolveUDPAddr("udp", c.RemoteAddr().String()) + if err != nil { + return nil, err + } + } - var cn tls.Interface - if fingerprint := tls.GetFingerprint(tlsConfigs.Fingerprint); fingerprint != nil { - cn = tls.UClient(pconn, tlsConfig, fingerprint).(*tls.UConn) - } else { - cn = tls.Client(pconn, tlsConfig).(*tls.Conn) - } - if err := cn.HandshakeContext(ctx); err != nil { - errors.LogErrorInner(ctx, err, "failed to dial to " + addr) - return nil, err - } - if !tlsConfig.InsecureSkipVerify { - if err := cn.VerifyHostname(tlsConfig.ServerName); err != nil { + return quic.DialEarly(ctx, udpConn, udpAddr, tlsCfg, cfg) + }, + } + transport = roundTripper + } else { + transportH2 := &http2.Transport{ + DialTLSContext: func(hctx context.Context, string, addr string, tlsConfig *gotls.Config) (net.Conn, error) { + rawHost, rawPort, err := net.SplitHostPort(addr) + if err != nil { + return nil, err + } + if len(rawPort) == 0 { + rawPort = "443" + } + port, err := net.PortFromString(rawPort) + if err != nil { + return nil, err + } + address := net.ParseAddress(rawHost) + + hctx = c.ContextWithID(hctx, c.IDFromContext(ctx)) + hctx = session.ContextWithOutbounds(hctx, session.OutboundsFromContext(ctx)) + hctx = session.ContextWithTimeoutOnly(hctx, true) + + pconn, err := internet.DialSystem(hctx, net.TCPDestination(address, port), sockopt) + if err != nil { errors.LogErrorInner(ctx, err, "failed to dial to " + addr) return nil, err } - } - negotiatedProtocol := cn.NegotiatedProtocol() - if negotiatedProtocol != http2.NextProtoTLS { - return nil, errors.New("http2: unexpected ALPN protocol " + negotiatedProtocol + "; want q" + http2.NextProtoTLS).AtError() - } - return cn, nil - }, - } - - if tlsConfigs != nil { - transport.TLSClientConfig = tlsConfigs.GetTLSConfig(tls.WithDestination(dest)) - } - - if httpSettings.IdleTimeout > 0 || httpSettings.HealthCheckTimeout > 0 { - transport.ReadIdleTimeout = time.Second * time.Duration(httpSettings.IdleTimeout) - transport.PingTimeout = time.Second * time.Duration(httpSettings.HealthCheckTimeout) + + if realityConfigs != nil { + return reality.UClient(pconn, realityConfigs, hctx, dest) + } + + var cn tls.Interface + if fingerprint := tls.GetFingerprint(tlsConfigs.Fingerprint); fingerprint != nil { + cn = tls.UClient(pconn, tlsConfig, fingerprint).(*tls.UConn) + } else { + cn = tls.Client(pconn, tlsConfig).(*tls.Conn) + } + if err := cn.HandshakeContext(ctx); err != nil { + errors.LogErrorInner(ctx, err, "failed to dial to " + addr) + return nil, err + } + if !tlsConfig.InsecureSkipVerify { + if err := cn.VerifyHostname(tlsConfig.ServerName); err != nil { + errors.LogErrorInner(ctx, err, "failed to dial to " + addr) + return nil, err + } + } + negotiatedProtocol := cn.NegotiatedProtocol() + if negotiatedProtocol != http2.NextProtoTLS { + return nil, errors.New("http2: unexpected ALPN protocol " + negotiatedProtocol + "; want q" + http2.NextProtoTLS).AtError() + } + return cn, nil + }, + } + if tlsConfigs != nil { + transportH2.TLSClientConfig = tlsConfigs.GetTLSConfig(tls.WithDestination(dest)) + } + if httpSettings.IdleTimeout > 0 || httpSettings.HealthCheckTimeout > 0 { + transportH2.ReadIdleTimeout = time.Second * time.Duration(httpSettings.IdleTimeout) + transportH2.PingTimeout = time.Second * time.Duration(httpSettings.HealthCheckTimeout) + } + transport = transportH2 } client := &http.Client{ @@ -158,9 +224,6 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me Host: dest.NetAddr(), Path: httpSettings.getNormalizedPath(), }, - Proto: "HTTP/2", - ProtoMajor: 2, - ProtoMinor: 0, Header: httpHeaders, } // Disable any compression method from server. diff --git a/xray-core/transport/internet/http/http_test.go b/xray-core/transport/internet/http/http_test.go index 3639eb8464..dd6c852dae 100644 --- a/xray-core/transport/internet/http/http_test.go +++ b/xray-core/transport/internet/http/http_test.go @@ -12,6 +12,7 @@ import ( "github.com/xtls/xray-core/common/net" "github.com/xtls/xray-core/common/protocol/tls/cert" "github.com/xtls/xray-core/testing/servers/tcp" + "github.com/xtls/xray-core/testing/servers/udp" "github.com/xtls/xray-core/transport/internet" . "github.com/xtls/xray-core/transport/internet/http" "github.com/xtls/xray-core/transport/internet/stat" @@ -92,3 +93,80 @@ func TestHTTPConnection(t *testing.T) { t.Error(r) } } + +func TestH3Connection(t *testing.T) { + port := udp.PickPort() + + listener, err := Listen(context.Background(), net.LocalHostIP, port, &internet.MemoryStreamConfig{ + ProtocolName: "http", + ProtocolSettings: &Config{}, + SecurityType: "tls", + SecuritySettings: &tls.Config{ + NextProtocol: []string{"h3"}, + Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil, cert.CommonName("www.example.com")))}, + }, + }, func(conn stat.Connection) { + go func() { + defer conn.Close() + + b := buf.New() + defer b.Release() + + for { + if _, err := b.ReadFrom(conn); err != nil { + return + } + _, err := conn.Write(b.Bytes()) + common.Must(err) + } + }() + }) + common.Must(err) + + defer listener.Close() + + time.Sleep(time.Second) + + dctx := context.Background() + conn, err := Dial(dctx, net.TCPDestination(net.LocalHostIP, port), &internet.MemoryStreamConfig{ + ProtocolName: "http", + ProtocolSettings: &Config{}, + SecurityType: "tls", + SecuritySettings: &tls.Config{ + NextProtocol: []string{"h3"}, + ServerName: "www.example.com", + AllowInsecure: true, + }, + }) + common.Must(err) + defer conn.Close() + + const N = 1024 + b1 := make([]byte, N) + common.Must2(rand.Read(b1)) + b2 := buf.New() + + nBytes, err := conn.Write(b1) + common.Must(err) + if nBytes != N { + t.Error("write: ", nBytes) + } + + b2.Clear() + common.Must2(b2.ReadFullFrom(conn, N)) + if r := cmp.Diff(b2.Bytes(), b1); r != "" { + t.Error(r) + } + + nBytes, err = conn.Write(b1) + common.Must(err) + if nBytes != N { + t.Error("write: ", nBytes) + } + + b2.Clear() + common.Must2(b2.ReadFullFrom(conn, N)) + if r := cmp.Diff(b2.Bytes(), b1); r != "" { + t.Error(r) + } +} diff --git a/xray-core/transport/internet/http/hub.go b/xray-core/transport/internet/http/hub.go index 3421ae649d..96fe8f629d 100644 --- a/xray-core/transport/internet/http/hub.go +++ b/xray-core/transport/internet/http/hub.go @@ -2,11 +2,14 @@ package http import ( "context" + gotls "crypto/tls" "io" "net/http" "strings" "time" + "github.com/quic-go/quic-go" + "github.com/quic-go/quic-go/http3" goreality "github.com/xtls/reality" "github.com/xtls/xray-core/common" "github.com/xtls/xray-core/common/errors" @@ -23,10 +26,12 @@ import ( ) type Listener struct { - server *http.Server - handler internet.ConnHandler - local net.Addr - config *Config + server *http.Server + h3server *http3.Server + handler internet.ConnHandler + local net.Addr + config *Config + isH3 bool } func (l *Listener) Addr() net.Addr { @@ -34,7 +39,14 @@ func (l *Listener) Addr() net.Addr { } func (l *Listener) Close() error { - return l.server.Close() + if l.h3server != nil { + if err := l.h3server.Close(); err != nil { + return err + } + } else if l.server != nil { + return l.server.Close() + } + return errors.New("listener does not have an HTTP/3 server or h2 server") } type flushWriter struct { @@ -119,43 +131,33 @@ func (l *Listener) ServeHTTP(writer http.ResponseWriter, request *http.Request) func Listen(ctx context.Context, address net.Address, port net.Port, streamSettings *internet.MemoryStreamConfig, handler internet.ConnHandler) (internet.Listener, error) { httpSettings := streamSettings.ProtocolSettings.(*Config) - var listener *Listener - if port == net.Port(0) { // unix - listener = &Listener{ - handler: handler, - local: &net.UnixAddr{ - Name: address.Domain(), - Net: "unix", - }, - config: httpSettings, - } - } else { // tcp - listener = &Listener{ - handler: handler, - local: &net.TCPAddr{ - IP: address.IP(), - Port: int(port), - }, - config: httpSettings, - } - } - - var server *http.Server config := tls.ConfigFromStreamSettings(streamSettings) + var tlsConfig *gotls.Config if config == nil { - h2s := &http2.Server{} - - server = &http.Server{ - Addr: serial.Concat(address, ":", port), - Handler: h2c.NewHandler(listener, h2s), - ReadHeaderTimeout: time.Second * 4, + tlsConfig = &gotls.Config{} + } else { + tlsConfig = config.GetTLSConfig() + } + isH3 := len(tlsConfig.NextProtos) == 1 && tlsConfig.NextProtos[0] == "h3" + listener := &Listener{ + handler: handler, + config: httpSettings, + isH3: isH3, + } + if port == net.Port(0) { // unix + listener.local = &net.UnixAddr{ + Name: address.Domain(), + Net: "unix", + } + } else if isH3 { // udp + listener.local = &net.UDPAddr{ + IP: address.IP(), + Port: int(port), } } else { - server = &http.Server{ - Addr: serial.Concat(address, ":", port), - TLSConfig: config.GetTLSConfig(tls.WithNextProto("h2")), - Handler: listener, - ReadHeaderTimeout: time.Second * 4, + listener.local = &net.TCPAddr{ + IP: address.IP(), + Port: int(port), } } @@ -163,45 +165,84 @@ func Listen(ctx context.Context, address net.Address, port net.Port, streamSetti errors.LogWarning(ctx, "accepting PROXY protocol") } - listener.server = server - go func() { - var streamListener net.Listener - var err error - if port == net.Port(0) { // unix - streamListener, err = internet.ListenSystem(ctx, &net.UnixAddr{ - Name: address.Domain(), - Net: "unix", - }, streamSettings.SocketSettings) - if err != nil { - errors.LogErrorInner(ctx, err, "failed to listen on ", address) - return - } - } else { // tcp - streamListener, err = internet.ListenSystem(ctx, &net.TCPAddr{ - IP: address.IP(), - Port: int(port), - }, streamSettings.SocketSettings) - if err != nil { - errors.LogErrorInner(ctx, err, "failed to listen on ", address, ":", port) - return - } + if isH3 { + Conn, err := internet.ListenSystemPacket(context.Background(), listener.local, streamSettings.SocketSettings) + if err != nil { + return nil, errors.New("failed to listen UDP(for SH3) on ", address, ":", port).Base(err) } + h3listener, err := quic.ListenEarly(Conn, tlsConfig, nil) + if err != nil { + return nil, errors.New("failed to listen QUIC(for SH3) on ", address, ":", port).Base(err) + } + errors.LogInfo(ctx, "listening QUIC(for SH3) on ", address, ":", port) - if config == nil { - if config := reality.ConfigFromStreamSettings(streamSettings); config != nil { - streamListener = goreality.NewListener(streamListener, config.GetREALITYConfig()) + listener.h3server = &http3.Server{ + Handler: listener, + } + go func() { + if err := listener.h3server.ServeListener(h3listener); err != nil { + errors.LogWarningInner(ctx, err, "failed to serve http3 for splithttp") } - err = server.Serve(streamListener) - if err != nil { - errors.LogInfoInner(ctx, err, "stopping serving H2C or REALITY H2") + }() + } else { + var server *http.Server + if config == nil { + h2s := &http2.Server{} + + server = &http.Server{ + Addr: serial.Concat(address, ":", port), + Handler: h2c.NewHandler(listener, h2s), + ReadHeaderTimeout: time.Second * 4, } } else { - err = server.ServeTLS(streamListener, "", "") - if err != nil { - errors.LogInfoInner(ctx, err, "stopping serving TLS H2") + server = &http.Server{ + Addr: serial.Concat(address, ":", port), + TLSConfig: config.GetTLSConfig(tls.WithNextProto("h2")), + Handler: listener, + ReadHeaderTimeout: time.Second * 4, } } - }() + + listener.server = server + go func() { + var streamListener net.Listener + var err error + if port == net.Port(0) { // unix + streamListener, err = internet.ListenSystem(ctx, &net.UnixAddr{ + Name: address.Domain(), + Net: "unix", + }, streamSettings.SocketSettings) + if err != nil { + errors.LogErrorInner(ctx, err, "failed to listen on ", address) + return + } + } else { // tcp + streamListener, err = internet.ListenSystem(ctx, &net.TCPAddr{ + IP: address.IP(), + Port: int(port), + }, streamSettings.SocketSettings) + if err != nil { + errors.LogErrorInner(ctx, err, "failed to listen on ", address, ":", port) + return + } + } + + if config == nil { + if config := reality.ConfigFromStreamSettings(streamSettings); config != nil { + streamListener = goreality.NewListener(streamListener, config.GetREALITYConfig()) + } + err = server.Serve(streamListener) + if err != nil { + errors.LogInfoInner(ctx, err, "stopping serving H2C or REALITY H2") + } + } else { + err = server.ServeTLS(streamListener, "", "") + if err != nil { + errors.LogInfoInner(ctx, err, "stopping serving TLS H2") + } + } + }() + } return listener, nil } diff --git a/xray-core/transport/internet/splithttp/hub.go b/xray-core/transport/internet/splithttp/hub.go index 423bf6e37f..4545db644a 100644 --- a/xray-core/transport/internet/splithttp/hub.go +++ b/xray-core/transport/internet/splithttp/hub.go @@ -365,7 +365,13 @@ func ListenSH(ctx context.Context, address net.Address, port net.Port, streamSet // Addr implements net.Listener.Addr(). func (ln *Listener) Addr() net.Addr { - return ln.listener.Addr() + if ln.h3listener != nil { + return ln.h3listener.Addr() + } + if ln.listener != nil { + return ln.listener.Addr() + } + return nil } // Close implements net.Listener.Close(). diff --git a/yass/.github/workflows/releases-deb.yml b/yass/.github/workflows/releases-deb.yml index 2ec3e2f642..5364528e06 100644 --- a/yass/.github/workflows/releases-deb.yml +++ b/yass/.github/workflows/releases-deb.yml @@ -279,9 +279,9 @@ jobs: if: ${{ steps.schroot-cache.outputs.cache-hit != 'true' && matrix.arch == 'riscv64' && matrix.distro == 'trixie' }} run: | # https://launchpad.net/ubuntu/oracular/amd64/libc6-dev-riscv64-cross - curl -O http://launchpadlibrarian.net/742667245/libc6-dev-riscv64-cross_2.40-1ubuntu1cross2_all.deb + curl -O http://launchpadlibrarian.net/749345307/libc6-dev-riscv64-cross_2.40-1ubuntu3cross1_all.deb # https://launchpad.net/ubuntu/oracular/amd64/libc6-riscv64-cross - curl -O http://launchpadlibrarian.net/742667260/libc6-riscv64-cross_2.40-1ubuntu1cross2_all.deb + curl -O http://launchpadlibrarian.net/749345318/libc6-riscv64-cross_2.40-1ubuntu3cross1_all.deb sudo schroot --chroot "source:${{ matrix.distro }}-${{ env.BUILD_ARCH }}-${{ matrix.arch }}" --user root -- \ dpkg --force-depends -i $PWD/*.deb || true sudo schroot --chroot "source:${{ matrix.distro }}-${{ env.BUILD_ARCH }}-${{ matrix.arch }}" --user root -- \ diff --git a/yass/src/win32/yass_frame.cpp b/yass/src/win32/yass_frame.cpp index ac2475b277..0366e60632 100644 --- a/yass/src/win32/yass_frame.cpp +++ b/yass/src/win32/yass_frame.cpp @@ -1153,7 +1153,7 @@ INT_PTR CALLBACK CYassFrame::OnAppAboutMessage(HWND hDlg, UINT message, WPARAM w return static_cast(TRUE); } case WM_COMMAND: - if (LOWORD(wParam) == IDOK) { + if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return static_cast(TRUE); } diff --git a/yt-dlp/.github/workflows/build.yml b/yt-dlp/.github/workflows/build.yml index 4ff1cbc1dd..bd2e42d9af 100644 --- a/yt-dlp/.github/workflows/build.yml +++ b/yt-dlp/.github/workflows/build.yml @@ -409,7 +409,7 @@ jobs: run: | # Custom pyinstaller built with https://github.com/yt-dlp/pyinstaller-builds python devscripts/install_deps.py -o --include build python devscripts/install_deps.py --include curl-cffi - python -m pip install -U "https://yt-dlp.github.io/Pyinstaller-Builds/x86_64/pyinstaller-6.7.0-py3-none-any.whl" + python -m pip install -U "https://yt-dlp.github.io/Pyinstaller-Builds/x86_64/pyinstaller-6.10.0-py3-none-any.whl" - name: Prepare run: | @@ -469,7 +469,7 @@ jobs: run: | python devscripts/install_deps.py -o --include build python devscripts/install_deps.py - python -m pip install -U "https://yt-dlp.github.io/Pyinstaller-Builds/i686/pyinstaller-6.7.0-py3-none-any.whl" + python -m pip install -U "https://yt-dlp.github.io/Pyinstaller-Builds/i686/pyinstaller-6.10.0-py3-none-any.whl" - name: Prepare run: | diff --git a/yt-dlp/pyproject.toml b/yt-dlp/pyproject.toml index fe6894a428..18d9a0a3a7 100644 --- a/yt-dlp/pyproject.toml +++ b/yt-dlp/pyproject.toml @@ -56,7 +56,7 @@ dependencies = [ default = [] curl-cffi = [ "curl-cffi==0.5.10; os_name=='nt' and implementation_name=='cpython'", - "curl-cffi>=0.5.10,!=0.6.*,<0.8; os_name!='nt' and implementation_name=='cpython'", + "curl-cffi>=0.5.10,!=0.6.*,<0.7.2; os_name!='nt' and implementation_name=='cpython'", ] secretstorage = [ "cffi", @@ -82,7 +82,7 @@ test = [ "pytest~=8.1", ] pyinstaller = [ - "pyinstaller>=6.7.0", # for compat with setuptools>=70 + "pyinstaller>=6.10.0", # Windows temp cleanup fixed in 6.10.0 ] py2exe = [ "py2exe>=0.12", diff --git a/yt-dlp/yt_dlp/cookies.py b/yt-dlp/yt_dlp/cookies.py index 070d2fcb98..cff8d74a74 100644 --- a/yt-dlp/yt_dlp/cookies.py +++ b/yt-dlp/yt_dlp/cookies.py @@ -1053,8 +1053,9 @@ def _decrypt_windows_dpapi(ciphertext, logger): ctypes.byref(blob_out), # pDataOut ) if not ret: - logger.warning('failed to decrypt with DPAPI', only_once=True) - return None + message = 'Failed to decrypt with DPAPI. See https://github.com/yt-dlp/yt-dlp/issues/10927 for more info' + logger.error(message) + raise DownloadError(message) # force exit result = ctypes.string_at(blob_out.pbData, blob_out.cbData) ctypes.windll.kernel32.LocalFree(blob_out.pbData) diff --git a/yt-dlp/yt_dlp/extractor/_extractors.py b/yt-dlp/yt_dlp/extractor/_extractors.py index d8abf0b5d3..4b1f4c316d 100644 --- a/yt-dlp/yt_dlp/extractor/_extractors.py +++ b/yt-dlp/yt_dlp/extractor/_extractors.py @@ -730,6 +730,7 @@ from .genius import ( GeniusIE, GeniusLyricsIE, ) +from .germanupa import GermanupaIE from .getcourseru import ( GetCourseRuIE, GetCourseRuPlayerIE, @@ -1166,6 +1167,7 @@ from .mlb import ( ) from .mlssoccer import MLSSoccerIE from .mocha import MochaVideoIE +from .mojevideo import MojevideoIE from .mojvideo import MojvideoIE from .monstercat import MonstercatIE from .motherless import ( @@ -1879,6 +1881,7 @@ from .slideshare import SlideshareIE from .slideslive import SlidesLiveIE from .slutload import SlutloadIE from .smotrim import SmotrimIE +from .snapchat import SnapchatSpotlightIE from .snotr import SnotrIE from .sohu import ( SohuIE, diff --git a/yt-dlp/yt_dlp/extractor/ertgr.py b/yt-dlp/yt_dlp/extractor/ertgr.py index 864aa6dc5a..6f3f60ff43 100644 --- a/yt-dlp/yt_dlp/extractor/ertgr.py +++ b/yt-dlp/yt_dlp/extractor/ertgr.py @@ -17,6 +17,7 @@ from ..utils import ( url_or_none, variadic, ) +from ..utils.traversal import traverse_obj class ERTFlixBaseIE(InfoExtractor): @@ -74,29 +75,28 @@ class ERTFlixCodenameIE(ERTFlixBaseIE): def _extract_formats_and_subs(self, video_id): media_info = self._call_api(video_id, codename=video_id) - formats, subs = [], {} - for media_file in try_get(media_info, lambda x: x['MediaFiles'], list) or []: - for media in try_get(media_file, lambda x: x['Formats'], list) or []: - fmt_url = url_or_none(try_get(media, lambda x: x['Url'])) - if not fmt_url: - continue - ext = determine_ext(fmt_url) - if ext == 'm3u8': - formats_, subs_ = self._extract_m3u8_formats_and_subtitles( - fmt_url, video_id, m3u8_id='hls', ext='mp4', fatal=False) - elif ext == 'mpd': - formats_, subs_ = self._extract_mpd_formats_and_subtitles( - fmt_url, video_id, mpd_id='dash', fatal=False) - else: - formats.append({ - 'url': fmt_url, - 'format_id': str_or_none(media.get('Id')), - }) - continue - formats.extend(formats_) - self._merge_subtitles(subs_, target=subs) + formats, subtitles = [], {} + for media in traverse_obj(media_info, ( + 'MediaFiles', lambda _, v: v['RoleCodename'] == 'main', + 'Formats', lambda _, v: url_or_none(v['Url']))): + fmt_url = media['Url'] + ext = determine_ext(fmt_url) + if ext == 'm3u8': + fmts, subs = self._extract_m3u8_formats_and_subtitles( + fmt_url, video_id, m3u8_id='hls', ext='mp4', fatal=False) + elif ext == 'mpd': + fmts, subs = self._extract_mpd_formats_and_subtitles( + fmt_url, video_id, mpd_id='dash', fatal=False) + else: + formats.append({ + 'url': fmt_url, + 'format_id': str_or_none(media.get('Id')), + }) + continue + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) - return formats, subs + return formats, subtitles def _real_extract(self, url): video_id = self._match_id(url) diff --git a/yt-dlp/yt_dlp/extractor/germanupa.py b/yt-dlp/yt_dlp/extractor/germanupa.py new file mode 100644 index 0000000000..e40f016b2f --- /dev/null +++ b/yt-dlp/yt_dlp/extractor/germanupa.py @@ -0,0 +1,91 @@ +from .common import InfoExtractor +from .vimeo import VimeoIE +from ..utils import ( + parse_qs, + traverse_obj, + url_or_none, +) + + +class GermanupaIE(InfoExtractor): + IE_DESC = 'germanupa.de' + _VALID_URL = r'https?://germanupa\.de/mediathek/(?P[\w-]+)' + _TESTS = [{ + 'url': 'https://germanupa.de/mediathek/4-figma-beratung-deine-sprechstunde-fuer-figma-fragen', + 'info_dict': { + 'id': '909179246', + 'title': 'Tutorial: #4 Figma Beratung - Deine Sprechstunde für Figma-Fragen', + 'ext': 'mp4', + 'uploader': 'German UPA', + 'uploader_id': 'germanupa', + 'thumbnail': 'https://i.vimeocdn.com/video/1792564420-7415283ccef8bf8702dab8c6b7515555ceeb7a1c11371ffcc133b8e887dbf70e-d_1280', + 'uploader_url': 'https://vimeo.com/germanupa', + 'duration': 3987, + }, + 'expected_warnings': ['Failed to parse XML: not well-formed'], + 'params': {'skip_download': 'm3u8'}, + }, { + 'note': 'audio, uses GenericIE', + 'url': 'https://germanupa.de/mediathek/live-vom-ux-festival-neuigkeiten-von-figma-jobmarkt-agenturszene-interview-zu-sustainable', + 'info_dict': { + 'id': '1867346676', + 'title': 'Live vom UX Festival: Neuigkeiten von Figma, Jobmarkt, Agenturszene & Interview zu Sustainable UX', + 'ext': 'opus', + 'timestamp': 1720545088, + 'upload_date': '20240709', + 'duration': 3910.557, + 'like_count': int, + 'description': 'md5:db2aed5ff131e177a7b33901e9a8db05', + 'uploader': 'German UPA', + 'repost_count': int, + 'genres': ['Science'], + 'license': 'all-rights-reserved', + 'uploader_url': 'https://soundcloud.com/user-80097677', + 'uploader_id': '471579486', + 'view_count': int, + 'comment_count': int, + 'thumbnail': 'https://i1.sndcdn.com/artworks-oCti2e9GhaZFWBqY-48ybGw-original.jpg', + }, + }, { + 'note': 'Nur für Mitglieder/Just for members', + 'url': 'https://germanupa.de/mediathek/ux-festival-2024-usability-tests-und-ai', + 'info_dict': { + 'id': '986994430', + 'title': 'UX Festival 2024 "Usability Tests und AI" von Lennart Weber', + 'ext': 'mp4', + 'release_date': '20240719', + 'uploader_url': 'https://vimeo.com/germanupa', + 'timestamp': 1721373980, + 'license': 'by-sa', + 'like_count': int, + 'thumbnail': 'https://i.vimeocdn.com/video/1904187064-2a672630c30f9ad787bd390bff3f51d7506a3e8416763ba6dbf465732b165c5c-d_1280', + 'duration': 2146, + 'release_timestamp': 1721373980, + 'uploader': 'German UPA', + 'uploader_id': 'germanupa', + 'upload_date': '20240719', + 'comment_count': int, + }, + 'expected_warnings': ['Failed to parse XML: not well-formed'], + 'skip': 'login required', + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + + param_url = traverse_obj( + self._search_regex( + r']+data-src\s*?=\s*?([\'"])(?Phttps://germanupa\.de/media/oembed\?url=(?:(?!\1).)+)\1', + webpage, 'embedded video', default=None, group='url'), + ({parse_qs}, 'url', 0, {url_or_none})) + + if not param_url: + if self._search_regex( + r']+class\s*?=\s*?([\'"])(?:(?!\1).)*login-wrapper(?:(?!\1).)*\1', + webpage, 'login wrapper', default=None): + self.raise_login_required('This video is only available for members') + return self.url_result(url, 'Generic') # Fall back to generic to extract audio + + real_url = param_url.replace('https://vimeo.com/', 'https://player.vimeo.com/video/') + return self.url_result(VimeoIE._smuggle_referrer(real_url, url), VimeoIE, video_id) diff --git a/yt-dlp/yt_dlp/extractor/mediaklikk.py b/yt-dlp/yt_dlp/extractor/mediaklikk.py index f51342060b..197e91d1d9 100644 --- a/yt-dlp/yt_dlp/extractor/mediaklikk.py +++ b/yt-dlp/yt_dlp/extractor/mediaklikk.py @@ -16,6 +16,15 @@ class MediaKlikkIE(InfoExtractor): (?P[^/#?_]+)''' _TESTS = [{ + 'url': 'https://mediaklikk.hu/filmajanlo/cikk/az-ajto/', + 'info_dict': { + 'id': '668177', + 'title': 'Az ajtó', + 'display_id': 'az-ajto', + 'ext': 'mp4', + 'thumbnail': 'https://cdn.cms.mtv.hu/wp-content/uploads/sites/4/2016/01/vlcsnap-2023-07-31-14h18m52s111.jpg', + }, + }, { # (old) mediaklikk. date in html. 'url': 'https://mediaklikk.hu/video/hazajaro-delnyugat-bacska-a-duna-menten-palankatol-doroszloig/', 'info_dict': { @@ -37,6 +46,7 @@ class MediaKlikkIE(InfoExtractor): 'upload_date': '20230903', 'thumbnail': 'https://mediaklikk.hu/wp-content/uploads/sites/4/2014/02/hazajarouj_JO.jpg', }, + 'skip': 'Webpage redirects to 404 page', }, { # (old) m4sport 'url': 'https://m4sport.hu/video/2021/08/30/gyemant-liga-parizs/', @@ -59,6 +69,7 @@ class MediaKlikkIE(InfoExtractor): 'upload_date': '20230908', 'thumbnail': 'https://m4sport.hu/wp-content/uploads/sites/4/2023/09/vlcsnap-2023-09-08-22h43m18s691.jpg', }, + 'skip': 'Webpage redirects to 404 page', }, { # m4sport with *video/ url and no date 'url': 'https://m4sport.hu/bl-video/real-madrid-chelsea-1-1/', @@ -69,6 +80,7 @@ class MediaKlikkIE(InfoExtractor): 'ext': 'mp4', 'thumbnail': 'https://m4sport.hu/wp-content/uploads/sites/4/2021/04/Sequence-01.Still001-1024x576.png', }, + 'skip': 'Webpage redirects to 404 page', }, { # (old) hirado 'url': 'https://hirado.hu/videok/felteteleket-szabott-a-fovaros/', @@ -90,6 +102,7 @@ class MediaKlikkIE(InfoExtractor): 'upload_date': '20230911', 'thumbnail': 'https://hirado.hu/wp-content/uploads/sites/4/2023/09/vlcsnap-2023-09-11-09h16m09s882.jpg', }, + 'skip': 'Webpage redirects to video list page', }, { # (old) petofilive 'url': 'https://petofilive.hu/video/2021/06/07/tha-shudras-az-akusztikban/', @@ -112,6 +125,7 @@ class MediaKlikkIE(InfoExtractor): 'upload_date': '20230909', 'thumbnail': 'https://petofilive.hu/wp-content/uploads/sites/4/2023/09/Clipboard11-2.jpg', }, + 'skip': 'Webpage redirects to video list page', }] def _real_extract(self, url): @@ -143,14 +157,14 @@ class MediaKlikkIE(InfoExtractor): if not playlist_url: raise ExtractorError('Unable to extract playlist url') - formats = self._extract_wowza_formats( - playlist_url, video_id, skip_protocols=['f4m', 'smil', 'dash']) + formats, subtitles = self._extract_m3u8_formats_and_subtitles(playlist_url, video_id) return { 'id': video_id, 'title': title, 'display_id': display_id, 'formats': formats, + 'subtitles': subtitles, 'upload_date': upload_date, 'thumbnail': player_data.get('bgImage') or self._og_search_thumbnail(webpage), } diff --git a/yt-dlp/yt_dlp/extractor/mojevideo.py b/yt-dlp/yt_dlp/extractor/mojevideo.py new file mode 100644 index 0000000000..145e306970 --- /dev/null +++ b/yt-dlp/yt_dlp/extractor/mojevideo.py @@ -0,0 +1,121 @@ +from .common import InfoExtractor +from ..utils import js_to_json, remove_end, update_url_query + + +class MojevideoIE(InfoExtractor): + IE_DESC = 'mojevideo.sk' + _VALID_URL = r'https?://(?:www\.)?mojevideo\.sk/video/(?P\w+)/(?P[\w()]+?)\.html' + + _TESTS = [{ + 'url': 'https://www.mojevideo.sk/video/3d17c/chlapci_dobetonovali_sme_mame_hotovo.html', + 'md5': '384a4628bd2bbd261c5206cf77c38c17', + 'info_dict': { + 'id': '3d17c', + 'ext': 'mp4', + 'title': 'Chlapci dobetónovali sme, máme hotovo!', + 'display_id': 'chlapci_dobetonovali_sme_mame_hotovo', + 'description': 'md5:a0822126044050d304a9ef58c92ddb34', + 'thumbnail': 'https://fs5.mojevideo.sk/imgfb/250236.jpg', + 'duration': 21.0, + 'upload_date': '20230919', + 'timestamp': 1695129706, + 'like_count': int, + 'dislike_count': int, + 'view_count': int, + 'comment_count': int, + }, + }, { + # 720p + 'url': 'https://www.mojevideo.sk/video/14677/den_blbec.html', + 'md5': '517c3e111c53a67d10b429c1f344ba2f', + 'info_dict': { + 'id': '14677', + 'ext': 'mp4', + 'title': 'Deň blbec?', + 'display_id': 'den_blbec', + 'description': 'I maličkosť vám môže zmeniť celý deň. Nikdy nezahadzujte žuvačky na zem!', + 'thumbnail': 'https://fs5.mojevideo.sk/imgfb/83575.jpg', + 'duration': 100.0, + 'upload_date': '20120515', + 'timestamp': 1337076481, + 'like_count': int, + 'dislike_count': int, + 'view_count': int, + 'comment_count': int, + }, + }, { + # 1080p + 'url': 'https://www.mojevideo.sk/video/2feb2/band_maid_onset_(instrumental)_live_zepp_tokyo_(full_hd).html', + 'md5': '64599a23d3ac31cf2fe069e4353d8162', + 'info_dict': { + 'id': '2feb2', + 'ext': 'mp4', + 'title': 'BAND-MAID - onset (Instrumental) Live - Zepp Tokyo (Full HD)', + 'display_id': 'band_maid_onset_(instrumental)_live_zepp_tokyo_(full_hd)', + 'description': 'Výborná inštrumentálna skladba od skupiny BAND-MAID.', + 'thumbnail': 'https://fs5.mojevideo.sk/imgfb/196274.jpg', + 'duration': 240.0, + 'upload_date': '20190708', + 'timestamp': 1562576592, + 'like_count': int, + 'dislike_count': int, + 'view_count': int, + 'comment_count': int, + }, + }, { + # 720p + 'url': 'https://www.mojevideo.sk/video/358c8/dva_nissany_skyline_strielaju_v_londyne.html', + 'only_matching': True, + }, { + # 720p + 'url': 'https://www.mojevideo.sk/video/2455d/gopro_hero4_session_nova_sportova_vodotesna_kamera.html', + 'only_matching': True, + }, { + # 1080p + 'url': 'https://www.mojevideo.sk/video/352ee/amd_rx_6800_xt_vs_nvidia_rtx_3080_(test_v_9_hrach).html', + 'only_matching': True, + }, { + # 1080p + 'url': 'https://www.mojevideo.sk/video/2cbeb/trailer_z_avengers_infinity_war.html', + 'only_matching': True, + }] + + def _real_extract(self, url): + video_id, display_id = self._match_valid_url(url).groups() + webpage = self._download_webpage(url, video_id) + + video_id_dec = self._search_regex( + r'\bvId\s*=\s*(\d+)', webpage, 'video id', fatal=False) or str(int(video_id, 16)) + video_exp = self._search_regex(r'\bvEx\s*=\s*["\'](\d+)', webpage, 'video expiry') + video_hashes = self._search_json( + r'\bvHash\s*=', webpage, 'video hashes', video_id, + contains_pattern=r'\[(?s:.+)\]', transform_source=js_to_json) + + formats = [] + for video_hash, (suffix, quality, format_note) in zip(video_hashes, [ + ('', 1, 'normálna kvalita'), + ('_lq', 0, 'nízka kvalita'), + ('_hd', 2, 'HD-720p'), + ('_fhd', 3, 'FULL HD-1080p'), + ('_2k', 4, '2K-1440p'), + ]): + formats.append({ + 'format_id': f'mp4-{quality}', + 'quality': quality, + 'format_note': format_note, + 'url': update_url_query( + f'https://cache01.mojevideo.sk/securevideos69/{video_id_dec}{suffix}.mp4', { + 'md5': video_hash, + 'expires': video_exp, + }), + }) + + return { + 'id': video_id, + 'display_id': display_id, + 'formats': formats, + 'title': (self._og_search_title(webpage, default=None) + or remove_end(self._html_extract_title(webpage, 'title'), ' - Mojevideo')), + 'description': self._og_search_description(webpage), + **self._search_json_ld(webpage, video_id, default={}), + } diff --git a/yt-dlp/yt_dlp/extractor/rumble.py b/yt-dlp/yt_dlp/extractor/rumble.py index db780a2cf4..74c7e4f176 100644 --- a/yt-dlp/yt_dlp/extractor/rumble.py +++ b/yt-dlp/yt_dlp/extractor/rumble.py @@ -8,14 +8,17 @@ from ..utils import ( UnsupportedError, clean_html, determine_ext, + extract_attributes, format_field, get_element_by_class, + get_elements_html_by_class, int_or_none, join_nonempty, parse_count, parse_iso8601, traverse_obj, unescapeHTML, + urljoin, ) @@ -382,8 +385,10 @@ class RumbleChannelIE(InfoExtractor): if isinstance(e.cause, HTTPError) and e.cause.status == 404: break raise - for video_url in re.findall(r'class="[^>"]*videostream__link[^>]+href="([^"]+\.html)"', webpage): - yield self.url_result('https://rumble.com' + video_url) + for video_url in traverse_obj( + get_elements_html_by_class('videostream__link', webpage), (..., {extract_attributes}, 'href'), + ): + yield self.url_result(urljoin('https://rumble.com', video_url)) def _real_extract(self, url): url, playlist_id = self._match_valid_url(url).groups() diff --git a/yt-dlp/yt_dlp/extractor/snapchat.py b/yt-dlp/yt_dlp/extractor/snapchat.py new file mode 100644 index 0000000000..732677c190 --- /dev/null +++ b/yt-dlp/yt_dlp/extractor/snapchat.py @@ -0,0 +1,76 @@ +from .common import InfoExtractor +from ..utils import float_or_none, int_or_none, url_or_none +from ..utils.traversal import traverse_obj + + +class SnapchatSpotlightIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?snapchat\.com/spotlight/(?P\w+)' + + _TESTS = [{ + 'url': 'https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYYWtidGhudGZpAX1TKn0JAX1TKnXJAAAAAA', + 'md5': '46c580f63592d0cbb76e974d2f9f0fcc', + 'info_dict': { + 'id': 'W7_EDlXWTBiXAEEniNoMPwAAYYWtidGhudGZpAX1TKn0JAX1TKnXJAAAAAA', + 'ext': 'mp4', + 'title': 'Views 💕', + 'description': '', + 'thumbnail': r're:https://cf-st\.sc-cdn\.net/d/kKJHIR1QAznRKK9jgYYDq\.256\.IRZXSOY', + 'duration': 4.665, + 'timestamp': 1637777831.369, + 'upload_date': '20211124', + 'repost_count': int, + 'uploader': 'shreypatel57', + 'uploader_url': 'https://www.snapchat.com/add/shreypatel57', + }, + }, { + 'url': 'https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYcnVjYWdwcGV1AZEaIYn5AZEaIYnrAAAAAQ', + 'md5': '4cd9626458c1a0e3e6dbe72c544a9ec2', + 'info_dict': { + 'id': 'W7_EDlXWTBiXAEEniNoMPwAAYcnVjYWdwcGV1AZEaIYn5AZEaIYnrAAAAAQ', + 'ext': 'mp4', + 'title': 'Spotlight Snap', + 'description': 'How he flirt her teacher🤭🤭🤩😍 #kdrama#cdrama #dramaclips #dramaspotlight', + 'thumbnail': r're:https://cf-st\.sc-cdn\.net/i/ztfr6xFs0FOcFhwVczWfj\.256\.IRZXSOY', + 'duration': 10.91, + 'timestamp': 1722720291.307, + 'upload_date': '20240803', + 'view_count': int, + 'repost_count': int, + 'uploader': 'ganda0535', + 'uploader_url': 'https://www.snapchat.com/add/ganda0535', + 'tags': ['#dramaspotlight', '#dramaclips', '#cdrama', '#kdrama'], + }, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + page_props = self._search_nextjs_data(webpage, video_id)['props']['pageProps'] + video_data = traverse_obj(page_props, ( + 'spotlightFeed', 'spotlightStories', + lambda _, v: v['story']['storyId']['value'] == video_id, 'metadata', any), None) + + return { + 'id': video_id, + 'ext': 'mp4', + **traverse_obj(video_data, ('videoMetadata', { + 'title': ('name', {str}), + 'description': ('description', {str}), + 'timestamp': ('uploadDateMs', {lambda x: float_or_none(x, 1000)}), + 'view_count': ('viewCount', {int_or_none}, {lambda x: None if x == -1 else x}), + 'repost_count': ('shareCount', {int_or_none}), + 'url': ('contentUrl', {url_or_none}), + 'width': ('width', {int_or_none}), + 'height': ('height', {int_or_none}), + 'duration': ('durationMs', {lambda x: float_or_none(x, 1000)}), + 'thumbnail': ('thumbnailUrl', {url_or_none}), + 'uploader': ('creator', 'personCreator', 'username', {str}), + 'uploader_url': ('creator', 'personCreator', 'url', {url_or_none}), + })), + **traverse_obj(video_data, { + 'description': ('description', {str}), + 'tags': ('hashtags', ..., {str}), + 'view_count': ('engagementStats', 'viewCount', {int_or_none}, {lambda x: None if x == -1 else x}), + 'repost_count': ('engagementStats', 'shareCount', {int_or_none}), + }), + } diff --git a/yt-dlp/yt_dlp/extractor/svt.py b/yt-dlp/yt_dlp/extractor/svt.py index 38782abac7..b5df2e1a18 100644 --- a/yt-dlp/yt_dlp/extractor/svt.py +++ b/yt-dlp/yt_dlp/extractor/svt.py @@ -472,7 +472,7 @@ class SVTPageIE(SVTBaseIE): title = self._og_search_title(webpage) urql_state = self._search_json( - r'window\.svt\.nyh\.urqlState\s*=', webpage, 'json data', display_id) + r'window\.svt\.(?:nyh\.)?urqlState\s*=', webpage, 'json data', display_id) data = traverse_obj(urql_state, (..., 'data', {str}, {json.loads}), get_all=False) or {} diff --git a/yt-dlp/yt_dlp/networking/_curlcffi.py b/yt-dlp/yt_dlp/networking/_curlcffi.py index e8a67b7347..0643348e7e 100644 --- a/yt-dlp/yt_dlp/networking/_curlcffi.py +++ b/yt-dlp/yt_dlp/networking/_curlcffi.py @@ -31,9 +31,9 @@ if curl_cffi is None: curl_cffi_version = tuple(map(int, re.split(r'[^\d]+', curl_cffi.__version__)[:3])) -if curl_cffi_version != (0, 5, 10) and not ((0, 7, 0) <= curl_cffi_version < (0, 8, 0)): +if curl_cffi_version != (0, 5, 10) and not ((0, 7, 0) <= curl_cffi_version < (0, 7, 2)): curl_cffi._yt_dlp__version = f'{curl_cffi.__version__} (unsupported)' - raise ImportError('Only curl_cffi versions 0.5.10, 0.7.X are supported') + raise ImportError('Only curl_cffi versions 0.5.10, 0.7.0 and 0.7.1 are supported') import curl_cffi.requests from curl_cffi.const import CurlECode, CurlOpt