commit e820143b3c12a463bf82d5ab678b70418932dcfe Author: TSM.ID Date: Mon May 25 03:50:05 2026 +0700 [TSM.ID].[11031972] PXE : Platform X Ecosystem I [118 Module -LIVE-] diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5a105ed --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +target/ +node_modules/ +.next/ +*.tar.gz +.env +.env.local diff --git a/ARCHITECTURE_GITEA_PHANTOM.md b/ARCHITECTURE_GITEA_PHANTOM.md new file mode 100644 index 0000000..53d8280 --- /dev/null +++ b/ARCHITECTURE_GITEA_PHANTOM.md @@ -0,0 +1,342 @@ +# [TSM.ID].[11031972] Arsitektur Gitea & Phantom + +--- + +## Overview + +``` + DEVELOPER (Local) + | + git push + | + v + ┌─────────────────────────────────────────────┐ + │ GITEA (gitea.ultramodul.xyz) │ + │ Port 3050 (Internal) │ + │ NGINX Reverse Proxy :443 │ + ├─────────────────────────────────────────────┤ + │ │ + │ ┌──────────────────────────────────────┐ │ + │ │ Repositories │ │ + │ │ ├── supreme_commander/multiverse │ │ + │ │ │ (Induk - Dokumentasi Ekosistem) │ │ + │ │ └── supreme_commander/xcom-ultra │ │ + │ │ (119 Modul Rust - PXE Engine) │ │ + │ └──────────────────────────────────────┘ │ + │ │ + │ ┌──────────────────────────────────────┐ │ + │ │ Forgejo Actions (CI/CD) │ │ + │ │ ├── act_runner (ALPHA) │ │ + │ │ ├── act_runner (BETA) │ │ + │ │ └── act_runner (GAMMA) │ │ + │ └──────────┬───────────────────────────┘ │ + │ │ │ + │ ┌──────────┴───────────────────────────┐ │ + │ │ Webhooks │ │ + │ │ └── POST /phantom/deploy │ │ + │ └──────────┬───────────────────────────┘ │ + │ │ │ + └─────────────┼───────────────────────────────┘ + │ + │ webhook trigger + v + ┌─────────────────────────────────────────────┐ + │ PHANTOM DEPLOYMENT ENGINE │ + │ (Auto-Deploy Orchestrator) │ + ├─────────────────────────────────────────────┤ + │ │ + │ ┌──────────────────────────────────────┐ │ + │ │ Phantom Listener │ │ + │ │ ├── Webhook Receiver (HTTP) │ │ + │ │ ├── Signature Verifier (HMAC) │ │ + │ │ └── Event Parser (push/tag/PR) │ │ + │ └──────────┬───────────────────────────┘ │ + │ │ │ + │ ┌──────────┴───────────────────────────┐ │ + │ │ Deploy Pipeline │ │ + │ │ ├── 1. git pull (latest code) │ │ + │ │ ├── 2. cargo build --release │ │ + │ │ ├── 3. cargo test --workspace │ │ + │ │ ├── 4. Binary swap (zero downtime) │ │ + │ │ ├── 5. Health check │ │ + │ │ └── 6. Rollback (if failed) │ │ + │ └──────────┬───────────────────────────┘ │ + │ │ │ + │ ┌──────────┴───────────────────────────┐ │ + │ │ Node Distributor │ │ + │ │ ├── ALPHA (Primary Build) │ │ + │ │ ├── BETA (Canary Deploy) │ │ + │ │ └── GAMMA (Full Rollout) │ │ + │ └──────────────────────────────────────┘ │ + │ │ + └─────────────────────────────────────────────┘ +``` + +--- + +## Gitea Server + +### Konfigurasi + +| Parameter | Nilai | +|:----------|:------| +| Domain | `gitea.ultramodul.xyz` | +| Internal Port | 3050 | +| External | NGINX → HTTPS :443 | +| Database | PostgreSQL | +| User | `supreme_commander` | +| Runner | Forgejo Actions (act_runner) | + +### Repositories + +``` +supreme_commander/ +├── multiverse # Repo induk - dokumentasi ekosistem +│ └── README.md # Peta 119 modul + arsitektur +│ +└── xcom-ultra # Repo engine - 119 modul Rust + ├── Cargo.toml # Workspace 119 members + ├── README.md # Dokumentasi teknis + ├── .gitignore + ├── .forgejo/ + │ └── workflows/ + │ └── ci.yml # CI/CD pipeline + │ + ├── xcu-core/ # [01] Foundation engine + ├── xcu-sfu/ # [02] Selective Forwarding Unit + ├── xcu-quic/ # [03] QUIC transport + ├── ... # ... 116 modul lainnya + └── xcu-veritas/ # [119] Truth verification +``` + +### Forgejo Actions Pipeline + +```yaml +# .forgejo/workflows/ci.yml +name: "[TSM.ID].[11031972] 3Z Pipeline" + +on: + push: + branches: [master] + pull_request: + branches: [master] + +jobs: + check: + name: "Zero Error Check" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + - run: cargo check --workspace + + test: + name: "Zero Warning Test" + runs-on: ubuntu-latest + needs: check + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + - run: cargo test --workspace + + audit: + name: "3Z Audit" + runs-on: ubuntu-latest + needs: test + steps: + - uses: actions/checkout@v4 + - name: "Watermark Check" + run: | + count=$(grep -rl "TSM.ID.*11031972" --include="*.rs" | wc -l) + echo "Watermarked files: $count" + - name: "No unwrap() in production" + run: | + # Exclude test blocks + violations=$(grep -rn "\.unwrap()" --include="*.rs" | grep -v "mod tests" | grep -v "#\[test\]" | grep -v "fn test_" | wc -l) + echo "unwrap() violations: $violations" + - name: "No panic!() in production" + run: | + violations=$(grep -rn "panic!(" --include="*.rs" | grep -v "mod tests" | grep -v "#\[test\]" | wc -l) + echo "panic!() violations: $violations" + + deploy: + name: "Phantom Deploy" + runs-on: ubuntu-latest + needs: [check, test, audit] + if: github.ref == 'refs/heads/master' + steps: + - name: "Trigger Phantom" + run: | + curl -X POST https://phantom.ultramodul.xyz/deploy \ + -H "X-Signature: ${{ secrets.PHANTOM_SECRET }}" \ + -d '{"repo":"xcom-ultra","branch":"master"}' +``` + +--- + +## Phantom Deployment Engine + +### Arsitektur Internal + +``` +┌─────────────────────────────────────────────────────────┐ +│ PHANTOM ENGINE │ +├─────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────┐ ┌──────────────┐ ┌────────────┐ │ +│ │ RECEIVER │───>│ VALIDATOR │───>│ BUILDER │ │ +│ │ (Webhook) │ │ (HMAC+Auth) │ │ (Cargo) │ │ +│ └─────────────┘ └──────────────┘ └─────┬──────┘ │ +│ │ │ +│ v │ +│ ┌─────────────┐ ┌──────────────┐ ┌────────────┐ │ +│ │ MONITOR │<───│ HEALTH │<───│ DEPLOYER │ │ +│ │ (Telemetry) │ │ CHECK │ │ (Swap) │ │ +│ └─────────────┘ └──────────────┘ └────────────┘ │ +│ │ +│ ┌──────────────────────────────────────────────────┐ │ +│ │ ROLLBACK ENGINE │ │ +│ │ ├── Binary versioning (keep last 3) │ │ +│ │ ├── Auto-rollback on health check fail │ │ +│ │ └── Manual rollback via API │ │ +│ └──────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────┘ +``` + +### Deploy Flow (Zero Downtime) + +``` +Step 1: RECEIVE + Webhook POST dari Gitea + ├── Verify HMAC signature + ├── Parse event (push/tag) + └── Queue deploy job + +Step 2: BUILD + ├── git pull --ff-only + ├── cargo check --workspace + ├── cargo build --workspace --release + └── cargo test --workspace + +Step 3: SWAP (Zero Downtime) + ├── Copy new binary → /opt/xcu/bin/xcu-core.new + ├── Signal graceful shutdown (SIGTERM) + ├── Wait for connections to drain (max 30s) + ├── mv xcu-core.new → xcu-core + └── Start new process + +Step 4: VERIFY + ├── Health check (HTTP 200) + ├── Memory usage check + ├── CPU usage check + └── Response time < 100ms + +Step 5: ROLLBACK (if Step 4 fails) + ├── mv xcu-core.backup → xcu-core + ├── Restart old binary + ├── Alert via webhook + └── Log failure reason +``` + +### Node Distribution + +``` +┌──────────────────────────────────────────────────────────┐ +│ DEPLOY STRATEGY │ +├──────────────────────────────────────────────────────────┤ +│ │ +│ Phase 1: ALPHA (160.187.143.253) │ +│ ├── Primary build node │ +│ ├── First deploy target │ +│ ├── Run full test suite │ +│ └── If OK → proceed to Phase 2 │ +│ │ +│ Phase 2: BETA (160.187.143.133) │ +│ ├── Canary deploy (10% traffic) │ +│ ├── Monitor for 5 minutes │ +│ ├── Compare metrics vs ALPHA │ +│ └── If OK → proceed to Phase 3 │ +│ │ +│ Phase 3: GAMMA (160.187.143.172) │ +│ ├── Full rollout (100% traffic) │ +│ ├── Final health verification │ +│ └── Deploy complete │ +│ │ +└──────────────────────────────────────────────────────────┘ +``` + +### Systemd Service + +```ini +# /etc/systemd/system/phantom.service +[Unit] +Description=[TSM.ID].[11031972] Phantom Deploy Engine +After=network.target gitea.service + +[Service] +Type=simple +User=root +WorkingDirectory=/var/www/phantom_workspace +ExecStart=/usr/bin/node phantom_listener.js +Restart=always +RestartSec=5 +Environment=PHANTOM_PORT=9090 +Environment=GITEA_URL=https://gitea.ultramodul.xyz +Environment=DEPLOY_PATH=/opt/xcu + +[Install] +WantedBy=multi-user.target +``` + +--- + +## Network Topology + +``` + INTERNET + │ + │ HTTPS :443 + v + ┌───────────────┐ + │ NGINX │ + │ (SSL Termn) │ + └───────┬───────┘ + │ + ┌───────────┼───────────┐ + │ │ │ + v v v + ┌─────────┐ ┌─────────┐ ┌─────────┐ + │ GITEA │ │ PHANTOM │ │ XCU │ + │ :3050 │ │ :9090 │ │ SERVICES│ + └─────────┘ └─────────┘ └─────────┘ + │ │ │ + v v v + ┌─────────────────────────────────┐ + │ PostgreSQL :5432 │ + │ Redis :6379 │ + └─────────────────────────────────┘ +``` + +--- + +## Security + +| Layer | Mekanisme | +|:------|:----------| +| Transport | TLS 1.3 (Let's Encrypt) | +| Auth | Basic Auth + API Token | +| Webhook | HMAC-SHA256 signature | +| Deploy | Binary checksum verification | +| Access | UFW firewall + fail2ban | +| Secrets | Environment variables (not in repo) | + +--- + +## Watermark + +``` +[TSM.ID].[11031972] +``` + +**All Rights Reserved. Proprietary & Confidential.** diff --git a/README.md b/README.md new file mode 100644 index 0000000..977c328 --- /dev/null +++ b/README.md @@ -0,0 +1,74 @@ +
+ +# Platform X Ecosystem + +### `[TSM.ID].[11031972]` + +**Multiverse** — Semesta tunggal. Semua hidup di sini. + +--- + +![Status](https://img.shields.io/badge/STATUS-LIVE-00ff88?style=for-the-badge&labelColor=0d1117) +![3Z](https://img.shields.io/badge/3Z-VERIFIED-00d4ff?style=for-the-badge&labelColor=0d1117) + +
+ +--- + +## Struktur + +``` +multiverse/ +├── engine/ XCU Engine — 116 Rust modules (Cargo workspace) +├── bare-metal/ 3 standalone modules (omega, ebpf, ebpf-loader) +├── jumpa-chat/ Jumpa Chat — Next.js +├── jumpa-vc/ Jumpa Video Call — Next.js +├── jumpa-iam/ IAM Gatekeeper — Next.js +└── .gitea/workflows/ CI/CD Pipeline +``` + +| Komponen | Stack | Deskripsi | +|:---------|:------|:----------| +| `engine/` | Rust · Tokio · Serde | 116 modul XCU dalam 1 Cargo workspace | +| `bare-metal/` | Rust `#![no_std]` | omega (unikernel), ebpf, ebpf-loader | +| `jumpa-chat/` | Next.js · TypeScript | Real-time chat (WebSocket, E2E encrypt) | +| `jumpa-vc/` | Next.js · TypeScript | Video call (WebRTC, SFU) | +| `jumpa-iam/` | Next.js · TypeScript | IAM Gatekeeper (JWT, RBAC) | + +--- + +## 3Z Constitution + +| | Prinsip | Implementasi | +|:-:|:--------|:-------------| +| 🔴 | **Zero Error** | `Result` everywhere. No `unwrap()`. No crash. | +| 🟡 | **Zero Warning** | `#![deny(warnings)]` di setiap modul | +| 🟢 | **Zero Downtime** | Hot-reload, graceful shutdown, self-healing | + +--- + +## Domain + +| Domain | Service | +|:-------|:--------| +| `xc.ultramodul.xyz` | XCU Engine (Dapur Pacu) | +| `mesh.ultramodul.xyz` | Jumpa Chat + Video Call | +| `gitea.ultramodul.xyz` | Gitea Forge + Phantom Deploy | + +--- + +## Panca Konstitusi X (PKX) + +1. **Kedaulatan Data** — Data milik pengguna, bukan platform +2. **Transparansi Absolut** — Merkle tree audit trail +3. **Keamanan Berlapis** — Post-quantum crypto by default +4. **Ketahanan Tanpa Batas** — Chaos-tested, self-healing +5. **Privasi Maksimal** — Zero-knowledge, E2E encryption + +--- + +``` +[TSM.ID].[11031972] +``` + +**All Rights Reserved. Proprietary & Confidential.** diff --git a/bare-metal/xcu-ebpf-loader/Cargo.toml b/bare-metal/xcu-ebpf-loader/Cargo.toml new file mode 100644 index 0000000..61a8f92 --- /dev/null +++ b/bare-metal/xcu-ebpf-loader/Cargo.toml @@ -0,0 +1,11 @@ +# [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. +[package] +name = "xcu-ebpf-loader" +version = "0.1.0" +edition = "2021" +authors = ["TSM.ID "] +description = "[TSM.ID].[11031972] eBPF Program Loader" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/bare-metal/xcu-ebpf-loader/src/lib.rs b/bare-metal/xcu-ebpf-loader/src/lib.rs new file mode 100644 index 0000000..abaa9e1 --- /dev/null +++ b/bare-metal/xcu-ebpf-loader/src/lib.rs @@ -0,0 +1,82 @@ +//! [TSM.ID].[11031972] -- Platform X Ecosystem +//! xcu-ebpf-loader -- Cross-platform eBPF program loader +#![deny(warnings)] + +use serde::{Serialize, Deserialize}; +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; + +#[derive(Debug)] +pub enum LoaderError { + FileNotFound(String), + ParseFailed(String), + ValidationFailed(String), + LoadFailed(String), +} + +impl std::fmt::Display for LoaderError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::FileNotFound(e) => write!(f, "File not found: {e}"), + Self::ParseFailed(e) => write!(f, "Parse failed: {e}"), + Self::ValidationFailed(e) => write!(f, "Validation: {e}"), + Self::LoadFailed(e) => write!(f, "Load failed: {e}"), + } + } +} +impl std::error::Error for LoaderError {} +pub type Result = std::result::Result; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ProgramSpec { + pub name: String, + pub prog_type: String, + pub bytecode_path: String, + pub maps: Vec, +} + +pub struct ProgramLoader { + loaded: Arc>>, + verified: Arc>>, +} + +impl ProgramLoader { + pub fn new() -> Self { + Self { loaded: Arc::new(Mutex::new(HashMap::new())), verified: Arc::new(Mutex::new(Vec::new())) } + } + + pub fn load_spec(&self, spec: ProgramSpec) -> Result<()> { + let mut loaded = self.loaded.lock().map_err(|e| LoaderError::LoadFailed(e.to_string()))?; + loaded.insert(spec.name.clone(), spec); + Ok(()) + } + + pub fn verify(&self, name: &str) -> Result { + let loaded = self.loaded.lock().map_err(|e| LoaderError::LoadFailed(e.to_string()))?; + if !loaded.contains_key(name) { return Err(LoaderError::FileNotFound(name.into())); } + let mut verified = self.verified.lock().map_err(|e| LoaderError::LoadFailed(e.to_string()))?; + verified.push(name.to_string()); + Ok(true) + } + + pub fn loaded_count(&self) -> usize { self.loaded.lock().map(|l| l.len()).unwrap_or(0) } +} + +impl Default for ProgramLoader { + fn default() -> Self { Self::new() } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_loader() { + let loader = ProgramLoader::new(); + loader.load_spec(ProgramSpec { + name: "test".into(), prog_type: "xdp".into(), + bytecode_path: "/dev/null".into(), maps: vec![], + }).unwrap(); + assert_eq!(loader.loaded_count(), 1); + assert!(loader.verify("test").unwrap()); + } +} diff --git a/bare-metal/xcu-ebpf/Cargo.toml b/bare-metal/xcu-ebpf/Cargo.toml new file mode 100644 index 0000000..0452019 --- /dev/null +++ b/bare-metal/xcu-ebpf/Cargo.toml @@ -0,0 +1,11 @@ +# [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. +[package] +name = "xcu-ebpf" +version = "0.1.0" +edition = "2021" +authors = ["TSM.ID "] +description = "[TSM.ID].[11031972] eBPF Abstraction Layer" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/bare-metal/xcu-ebpf/src/lib.rs b/bare-metal/xcu-ebpf/src/lib.rs new file mode 100644 index 0000000..1acf16b --- /dev/null +++ b/bare-metal/xcu-ebpf/src/lib.rs @@ -0,0 +1,92 @@ +//! [TSM.ID].[11031972] -- Platform X Ecosystem +//! xcu-ebpf -- eBPF Abstraction Layer (cross-platform) +#![deny(warnings)] + +use serde::{Serialize, Deserialize}; +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; + +#[derive(Debug)] +pub enum EbpfError { + ProgramLoadFailed(String), + MapAccessFailed(String), + NotSupported(String), + AttachFailed(String), +} + +impl std::fmt::Display for EbpfError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::ProgramLoadFailed(e) => write!(f, "eBPF load failed: {e}"), + Self::MapAccessFailed(e) => write!(f, "Map access: {e}"), + Self::NotSupported(e) => write!(f, "Not supported: {e}"), + Self::AttachFailed(e) => write!(f, "Attach failed: {e}"), + } + } +} +impl std::error::Error for EbpfError {} +pub type Result = std::result::Result; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct EbpfProgram { + pub name: String, + pub prog_type: String, + pub bytecode: Vec, + pub attach_point: String, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum EbpfState { Unloaded, Loaded, Attached, Detached, Error(String) } + +pub struct EbpfManager { + programs: Arc>>, + supported: bool, +} + +impl EbpfManager { + pub fn new() -> Self { + let supported = cfg!(target_os = "linux"); + Self { programs: Arc::new(Mutex::new(HashMap::new())), supported } + } + + pub fn is_supported(&self) -> bool { self.supported } + + pub fn load(&self, program: EbpfProgram) -> Result<()> { + if !self.supported { return Err(EbpfError::NotSupported("eBPF requires Linux".into())); } + let mut progs = self.programs.lock().map_err(|e| EbpfError::ProgramLoadFailed(e.to_string()))?; + progs.insert(program.name.clone(), (program, EbpfState::Loaded)); + Ok(()) + } + + pub fn attach(&self, name: &str) -> Result<()> { + let mut progs = self.programs.lock().map_err(|e| EbpfError::AttachFailed(e.to_string()))?; + match progs.get_mut(name) { + Some((_, state)) => { *state = EbpfState::Attached; Ok(()) } + None => Err(EbpfError::AttachFailed(format!("Program {name} not found"))), + } + } + + pub fn detach(&self, name: &str) -> Result<()> { + let mut progs = self.programs.lock().map_err(|e| EbpfError::AttachFailed(e.to_string()))?; + match progs.get_mut(name) { + Some((_, state)) => { *state = EbpfState::Detached; Ok(()) } + None => Err(EbpfError::AttachFailed(format!("Program {name} not found"))), + } + } + + pub fn program_count(&self) -> usize { self.programs.lock().map(|p| p.len()).unwrap_or(0) } +} + +impl Default for EbpfManager { + fn default() -> Self { Self::new() } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_ebpf_manager() { + let mgr = EbpfManager::new(); + assert_eq!(mgr.program_count(), 0); + } +} diff --git a/bare-metal/xcu-omega/Cargo.toml b/bare-metal/xcu-omega/Cargo.toml new file mode 100644 index 0000000..ef9fa4f --- /dev/null +++ b/bare-metal/xcu-omega/Cargo.toml @@ -0,0 +1,11 @@ +# [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. +[package] +name = "xcu-omega" +version = "0.1.0" +edition = "2021" +authors = ["TSM.ID "] +description = "[TSM.ID].[11031972] Phase 40: The Omega Unikernel Runtime" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/bare-metal/xcu-omega/src/lib.rs b/bare-metal/xcu-omega/src/lib.rs new file mode 100644 index 0000000..2a7f802 --- /dev/null +++ b/bare-metal/xcu-omega/src/lib.rs @@ -0,0 +1,111 @@ +//! [TSM.ID].[11031972] -- Platform X Ecosystem +//! xcu-omega -- Omega Unikernel Runtime Abstraction Layer +//! Provides bare-metal abstractions that compile on all platforms +#![deny(warnings)] + +use serde::{Serialize, Deserialize}; +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; + +#[derive(Debug)] +pub enum OmegaError { + BootFailed(String), + HardwareFault(String), + MemoryViolation(String), + SchedulerFailed(String), +} + +impl std::fmt::Display for OmegaError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::BootFailed(e) => write!(f, "Boot failed: {e}"), + Self::HardwareFault(e) => write!(f, "HW fault: {e}"), + Self::MemoryViolation(e) => write!(f, "Memory violation: {e}"), + Self::SchedulerFailed(e) => write!(f, "Scheduler: {e}"), + } + } +} +impl std::error::Error for OmegaError {} +pub type Result = std::result::Result; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct KernelConfig { + pub stack_size: usize, + pub heap_size: usize, + pub tick_hz: u32, + pub max_tasks: usize, + pub params: HashMap, +} + +impl Default for KernelConfig { + fn default() -> Self { + Self { stack_size: 8192, heap_size: 1_048_576, tick_hz: 1000, max_tasks: 64, params: HashMap::new() } + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum KernelState { Boot, Init, Running, Idle, Panic, Shutdown } + +pub struct MicroKernel { + config: KernelConfig, + state: Arc>, + uptime_ms: Arc>, + task_count: Arc>, +} + +impl MicroKernel { + pub fn new(config: KernelConfig) -> Result { + Ok(Self { + config, state: Arc::new(Mutex::new(KernelState::Boot)), + uptime_ms: Arc::new(Mutex::new(0)), + task_count: Arc::new(Mutex::new(0)), + }) + } + + pub fn boot(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| OmegaError::BootFailed(e.to_string()))?; + *s = KernelState::Init; + *s = KernelState::Running; + Ok(()) + } + + pub fn shutdown(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| OmegaError::SchedulerFailed(e.to_string()))?; + *s = KernelState::Shutdown; + Ok(()) + } + + pub fn state(&self) -> Result { + Ok(self.state.lock().map_err(|e| OmegaError::SchedulerFailed(e.to_string()))?.clone()) + } + + pub fn tick(&self) -> Result { + let mut t = self.uptime_ms.lock().map_err(|e| OmegaError::SchedulerFailed(e.to_string()))?; + *t += 1000 / self.config.tick_hz as u64; + Ok(*t) + } + + pub fn spawn_task(&self) -> Result { + let mut c = self.task_count.lock().map_err(|e| OmegaError::SchedulerFailed(e.to_string()))?; + if *c >= self.config.max_tasks { return Err(OmegaError::SchedulerFailed("max tasks reached".into())); } + *c += 1; + Ok(*c) + } + + pub fn config(&self) -> &KernelConfig { &self.config } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_kernel() { + let k = MicroKernel::new(KernelConfig::default()).unwrap(); + k.boot().unwrap(); + assert_eq!(k.state().unwrap(), KernelState::Running); + k.tick().unwrap(); + k.spawn_task().unwrap(); + k.shutdown().unwrap(); + assert_eq!(k.state().unwrap(), KernelState::Shutdown); + } +} diff --git a/engine/.gitignore b/engine/.gitignore new file mode 100644 index 0000000..5cfba58 --- /dev/null +++ b/engine/.gitignore @@ -0,0 +1,16 @@ +# [TSM.ID].[11031972] +target/ +node_modules/ +dist/ +.next/ +*.lock +!Cargo.lock +.env +.env.local +.env.production +*.log +*.swp +*.swo +*~ +.DS_Store +Thumbs.db diff --git a/engine/Cargo.lock b/engine/Cargo.lock new file mode 100644 index 0000000..9801d90 --- /dev/null +++ b/engine/Cargo.lock @@ -0,0 +1,6259 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.17", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "const-random", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "argminmax" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70f13d10a41ac8d2ec79ee34178d61e6f47a29c2edfe7ef1721c7383b0359e65" +dependencies = [ + "num-traits", +] + +[[package]] +name = "array-init-cursor" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed51fe0f224d1d4ea768be38c51f9f831dee9d05c163c11fba0b8c44387b1fc3" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "arrow" +version = "58.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "607e64bb911ee4f90483e044fe78f175989148c2892e659a2cd25429e782ec54" +dependencies = [ + "arrow-arith", + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-data", + "arrow-ord", + "arrow-row", + "arrow-schema", + "arrow-select", + "arrow-string", +] + +[[package]] +name = "arrow-arith" +version = "58.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e754319ed8a85d817fe7adf183227e0b5308b82790a737b426c1124626b48118" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "chrono", + "num-traits", +] + +[[package]] +name = "arrow-array" +version = "58.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841321891f247aa86c6112c80d83d89cb36e0addd020fa2425085b8eb6c3f579" +dependencies = [ + "ahash 0.8.12", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "chrono", + "half", + "hashbrown 0.17.1", + "num-complex", + "num-integer", + "num-traits", +] + +[[package]] +name = "arrow-buffer" +version = "58.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f955dfb73fae000425f49c8226d2044dab60fb7ad4af1e24f961756354d996c9" +dependencies = [ + "bytes", + "half", + "num-bigint", + "num-traits", +] + +[[package]] +name = "arrow-cast" +version = "58.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5e686972523798f76bef355145bc1ae25a84c731e650268d31ab763c701663" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-ord", + "arrow-schema", + "arrow-select", + "atoi", + "base64 0.22.1", + "chrono", + "comfy-table", + "half", + "lexical-core", + "num-traits", + "ryu", +] + +[[package]] +name = "arrow-data" +version = "58.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3b5846209775b6dc8056d77ff9a032b27043383dd5488abd0b663e265b9373" +dependencies = [ + "arrow-buffer", + "arrow-schema", + "half", + "num-integer", + "num-traits", +] + +[[package]] +name = "arrow-ord" +version = "58.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efa70d9d6b1356f1fb9f1f651b84a725b7e0abb93f188cf7d31f14abfa2f2e6f" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", +] + +[[package]] +name = "arrow-row" +version = "58.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faec88a945338192beffbbd4be0def70135422930caa244ac3cec0cd213b26b4" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "half", +] + +[[package]] +name = "arrow-schema" +version = "58.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18aa020f6bc8e5201dcd2d4b7f98c68f8a410ef37128263243e6ff2a47a67d4f" +dependencies = [ + "bitflags 2.11.1", +] + +[[package]] +name = "arrow-select" +version = "58.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a657ab5132e9c8ca3b24eb15a823d0ced38017fe3930ff50167466b02e2d592c" +dependencies = [ + "ahash 0.8.12", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "num-traits", +] + +[[package]] +name = "arrow-string" +version = "58.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6de2efbbd1a9f9780ceb8d1ff5d20421b35863b361e3386b4f571f1fc69fcb8" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", + "memchr", + "num-traits", + "regex", + "regex-syntax", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + +[[package]] +name = "atoi_simd" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae037714f313c1353189ead58ef9eec30a8e8dc101b2622d461418fd59e28a9" + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "borsh" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfd1e3f8955a5d7de9fab72fc8373fade9fb8a703968cb200ae3dc6cf08e185a" +dependencies = [ + "borsh-derive", + "bytes", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfcfdc083699101d5a7965e49925975f2f55060f94f9a05e7187be95d530ca59" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "brotli" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d640d25bc63c50fb1f0b545ffd80207d2e10a4c965530809b40ba3386825c391" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + +[[package]] +name = "cassowary" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "castaway" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" +dependencies = [ + "rustversion", +] + +[[package]] +name = "cc" +version = "1.2.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "chacha20poly1305" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +dependencies = [ + "aead", + "chacha20", + "cipher", + "poly1305", + "zeroize", +] + +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "iana-time-zone", + "num-traits", + "windows-link", +] + +[[package]] +name = "chrono-tz" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59ae0466b83e838b81a54256c39d5d7c20b9d7daa10510a242d9b75abd5936e" +dependencies = [ + "chrono", + "chrono-tz-build", + "phf", +] + +[[package]] +name = "chrono-tz-build" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "433e39f13c9a060046954e0592a8d0a4bcb1040125cbf91cb8ee58964cfb350f" +dependencies = [ + "parse-zoneinfo", + "phf", + "phf_codegen", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", + "zeroize", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "comfy-table" +version = "7.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958c5d6ecf1f214b4c2bbbbf6ab9523a864bd136dcf71a7e8904799acfe1ad47" +dependencies = [ + "crossterm 0.29.0", + "unicode-segmentation", + "unicode-width 0.2.2", +] + +[[package]] +name = "compact_str" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f86b9c4c00838774a6d902ef931eff7470720c51d90c2e32cfe15dc304737b3f" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "ryu", + "static_assertions", +] + +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.17", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crdts" +version = "7.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "387808c885b79055facbd4b2e806a683fe1bc37abc7dfa5fea1974ad2d4137b0" +dependencies = [ + "num", + "quickcheck", + "serde", + "tiny-keccak", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crossterm" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" +dependencies = [ + "bitflags 2.11.1", + "crossterm_winapi", + "libc", + "mio 0.8.11", + "parking_lot 0.12.5", + "signal-hook", + "signal-hook-mio", + "winapi", +] + +[[package]] +name = "crossterm" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" +dependencies = [ + "bitflags 2.11.1", + "crossterm_winapi", + "document-features", + "parking_lot 0.12.5", + "rustix", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "typenum", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core 0.9.12", +] + +[[package]] +name = "data-encoding" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derive_arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + +[[package]] +name = "duckdb" +version = "1.10501.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f13bc6d6487032fc2825a62ef8b4924b2378a2eb3166e132e5f3141ae9dd633f" +dependencies = [ + "arrow", + "cast", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libduckdb-sys", + "num-integer", + "rust_decimal", + "strum 0.27.2", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "enum_dispatch" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecd" +dependencies = [ + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "env_filter" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a" +dependencies = [ + "env_filter", + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "ethnum" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40404c3f5f511ec4da6fe866ddf6a717c309fdbb69fbbad7b0f3edab8f2e835f" + +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + +[[package]] +name = "fast-float" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95765f67b4b18863968b4a1bd5bb576f732b29a4a28c7cd84c09fa3e2875f33c" + +[[package]] +name = "filetime" +version = "0.2.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5b2eef6fafbf69f877e55509ce5b11a760690ac9700a2921be067aa6afaef6" +dependencies = [ + "cfg-if", + "libc", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", + "zlib-rs", +] + +[[package]] +name = "foca" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e69c9bcb0026b66c94cfde229554e33322a9a908999cad4aa83e02cd779b9c" +dependencies = [ + "anyhow", + "bytes", + "rand 0.8.6", +] + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foreign_vec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee1b05cbd864bcaecbd3455d6d967862d446e4ebfc3c2e5e5b9841e53cba6673" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 5.3.0", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", + "wasip2", + "wasip3", +] + +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "num-traits", + "zerocopy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash 0.8.12", + "allocator-api2", + "rayon", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls 0.23.40", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2 0.6.3", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "itoap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9028f49264629065d057f340a86acb84867925865f73bbf8d47b4d149a7e88b8" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" +dependencies = [ + "cfg-if", + "futures-util", + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "lexical-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56" +dependencies = [ + "lexical-parse-integer", + "lexical-util", +] + +[[package]] +name = "lexical-parse-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "lexical-util" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" + +[[package]] +name = "lexical-write-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" +dependencies = [ + "lexical-util", + "lexical-write-integer", +] + +[[package]] +name = "lexical-write-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "libduckdb-sys" +version = "1.10501.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12096c1694924782b3fe21e790630b77bacb4fcb7ad9d7ee0fec626f985bf248" +dependencies = [ + "cc", + "flate2", + "pkg-config", + "reqwest", + "serde", + "serde_json", + "tar", + "vcpkg", + "zip", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "lru" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" +dependencies = [ + "hashbrown 0.12.3", +] + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "lz4" +version = "1.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a20b523e860d03443e98350ceaac5e71c6ba89aea7d960769ec3ce37f4de5af4" +dependencies = [ + "lz4-sys", +] + +[[package]] +name = "lz4-sys" +version = "1.11.1+lz4-1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memmap2" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f49388d20533534cd19360ad3d6a7dadc885944aa802ba3995040c5ec11288c6" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "mio" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "multiversion" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4851161a11d3ad0bf9402d90ffc3967bf231768bfd7aeb61755ad06dbf1a142" +dependencies = [ + "multiversion-macros", + "target-features", +] + +[[package]] +name = "multiversion-macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79a74ddee9e0c27d2578323c13905793e91622148f138ba29738f9dddb835e90" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "target-features", +] + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.6.5", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.7.1", + "pin-utils", +] + +[[package]] +name = "now" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d89e9874397a1f0a52fc1f197a8effd9735223cb2390e9dcc83ac6cd02923d0" +dependencies = [ + "chrono", +] + +[[package]] +name = "ntapi" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae" +dependencies = [ + "winapi", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", + "serde", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", + "serde", +] + +[[package]] +name = "num-conv" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", + "serde", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.12", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", +] + +[[package]] +name = "parquet-format-safe" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1131c54b167dd4e4799ce762e1ab01549ebb94d5bdd13e6ec1b467491c378e1f" +dependencies = [ + "async-trait", + "futures", +] + +[[package]] +name = "parse-zoneinfo" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f2a05b18d44e2957b88f96ba460715e295bc1d7510468a2f3d3b44535d26c24" +dependencies = [ + "regex", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pem" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +dependencies = [ + "base64 0.22.1", + "serde_core", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand 0.8.6", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "planus" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1691dd09e82f428ce8d6310bd6d5da2557c82ff17694d2a32cad7242aea89f" +dependencies = [ + "array-init-cursor", +] + +[[package]] +name = "polars" +version = "0.38.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f01006048a264047d6cba081fed8e11adbd69c15956f9e53185a9ac4a541853c" +dependencies = [ + "getrandom 0.2.17", + "polars-arrow", + "polars-core", + "polars-error", + "polars-io", + "polars-lazy", + "polars-ops", + "polars-parquet", + "polars-sql", + "polars-time", + "polars-utils", + "version_check", +] + +[[package]] +name = "polars-arrow" +version = "0.38.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25197f40d71f82b2f79bb394f03e555d3cc1ce4db1dd052c28318721c71e96ad" +dependencies = [ + "ahash 0.8.12", + "atoi", + "atoi_simd", + "bytemuck", + "chrono", + "chrono-tz", + "dyn-clone", + "either", + "ethnum", + "fast-float", + "foreign_vec", + "futures", + "getrandom 0.2.17", + "hashbrown 0.14.5", + "itoa", + "itoap", + "lz4", + "multiversion", + "num-traits", + "polars-arrow-format", + "polars-error", + "polars-utils", + "ryu", + "simdutf8", + "streaming-iterator", + "strength_reduce", + "version_check", + "zstd", +] + +[[package]] +name = "polars-arrow-format" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b0ef2474af9396b19025b189d96e992311e6a47f90c53cd998b36c4c64b84c" +dependencies = [ + "planus", + "serde", +] + +[[package]] +name = "polars-compute" +version = "0.38.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c354515f73cdbbad03c2bf723fcd68e6825943b3ec503055abc8a8cb08ce46bb" +dependencies = [ + "bytemuck", + "either", + "num-traits", + "polars-arrow", + "polars-error", + "polars-utils", + "strength_reduce", + "version_check", +] + +[[package]] +name = "polars-core" +version = "0.38.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f20d3c227186f74aa3c228c64ef72f5a15617322fed30b4323eaf53b25f8e7b" +dependencies = [ + "ahash 0.8.12", + "bitflags 2.11.1", + "bytemuck", + "chrono", + "chrono-tz", + "comfy-table", + "either", + "hashbrown 0.14.5", + "indexmap", + "num-traits", + "once_cell", + "polars-arrow", + "polars-compute", + "polars-error", + "polars-row", + "polars-utils", + "rand 0.8.6", + "rand_distr", + "rayon", + "regex", + "smartstring", + "thiserror 1.0.69", + "version_check", + "xxhash-rust", +] + +[[package]] +name = "polars-error" +version = "0.38.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dd0ce51f8bd620eb8bd376502fe68a2b1a446d5433ecd2e75270b0755ce76" +dependencies = [ + "polars-arrow-format", + "regex", + "simdutf8", + "thiserror 1.0.69", +] + +[[package]] +name = "polars-io" +version = "0.38.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b40bef2edcdc58394792c4d779465144283a09ff1836324e7b72df7978a6e992" +dependencies = [ + "ahash 0.8.12", + "async-trait", + "atoi_simd", + "bytes", + "chrono", + "fast-float", + "futures", + "home", + "itoa", + "memchr", + "memmap2", + "num-traits", + "once_cell", + "percent-encoding", + "polars-arrow", + "polars-core", + "polars-error", + "polars-parquet", + "polars-time", + "polars-utils", + "rayon", + "regex", + "ryu", + "simdutf8", + "smartstring", + "tokio", + "tokio-util", +] + +[[package]] +name = "polars-lazy" +version = "0.38.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c27df26a19d3092298d31d47614ad84dc330c106e38aa8cd53727cd91c07cf56" +dependencies = [ + "ahash 0.8.12", + "bitflags 2.11.1", + "glob", + "once_cell", + "polars-arrow", + "polars-core", + "polars-io", + "polars-ops", + "polars-pipe", + "polars-plan", + "polars-time", + "polars-utils", + "rayon", + "smartstring", + "version_check", +] + +[[package]] +name = "polars-ops" +version = "0.38.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f8a51c3bdc9e7c34196ff6f5c3cb17da134e5aafb1756aaf24b76c7118e63dc" +dependencies = [ + "ahash 0.8.12", + "argminmax", + "base64 0.21.7", + "bytemuck", + "chrono", + "chrono-tz", + "either", + "hashbrown 0.14.5", + "hex", + "indexmap", + "memchr", + "num-traits", + "polars-arrow", + "polars-compute", + "polars-core", + "polars-error", + "polars-utils", + "rayon", + "regex", + "smartstring", + "unicode-reverse", + "version_check", +] + +[[package]] +name = "polars-parquet" +version = "0.38.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8824ee00fbbe83d69553f2711014c50361238d210ed81a7a297695b7db97d42" +dependencies = [ + "ahash 0.8.12", + "async-stream", + "base64 0.21.7", + "brotli", + "ethnum", + "flate2", + "futures", + "lz4", + "num-traits", + "parquet-format-safe", + "polars-arrow", + "polars-error", + "polars-utils", + "seq-macro", + "simdutf8", + "snap", + "streaming-decompression", + "zstd", +] + +[[package]] +name = "polars-pipe" +version = "0.38.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c5e2c1f14e81d60cfa9afe4e611a9bad9631a2cb7cd19b7c0094d0dc32f0231" +dependencies = [ + "crossbeam-channel", + "crossbeam-queue", + "enum_dispatch", + "hashbrown 0.14.5", + "num-traits", + "polars-arrow", + "polars-compute", + "polars-core", + "polars-io", + "polars-ops", + "polars-plan", + "polars-row", + "polars-utils", + "rayon", + "smartstring", + "uuid", + "version_check", +] + +[[package]] +name = "polars-plan" +version = "0.38.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff48362bd1b078bbbec7e7ba9ec01fea58fee2887db22a8e3deaf78f322fa3c4" +dependencies = [ + "ahash 0.8.12", + "bytemuck", + "chrono-tz", + "once_cell", + "percent-encoding", + "polars-arrow", + "polars-core", + "polars-io", + "polars-ops", + "polars-parquet", + "polars-time", + "polars-utils", + "rayon", + "regex", + "smartstring", + "strum_macros 0.25.3", + "version_check", +] + +[[package]] +name = "polars-row" +version = "0.38.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63029da56ff6a720b190490bbc7b6263f9b72d1134311b1f381fc8d306d37770" +dependencies = [ + "bytemuck", + "polars-arrow", + "polars-error", + "polars-utils", +] + +[[package]] +name = "polars-sql" +version = "0.38.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3652c362959f608d1297196b973d1e3acb508a9562b886ac39bf7606b841052b" +dependencies = [ + "hex", + "polars-arrow", + "polars-core", + "polars-error", + "polars-lazy", + "polars-plan", + "rand 0.8.6", + "serde", + "serde_json", + "sqlparser", +] + +[[package]] +name = "polars-time" +version = "0.38.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86eb74ea6ddfe675aa5c3f33c00dadbe2b85f0e8e3887b85db1fd5a3397267fd" +dependencies = [ + "atoi", + "chrono", + "chrono-tz", + "now", + "once_cell", + "polars-arrow", + "polars-core", + "polars-error", + "polars-ops", + "polars-utils", + "regex", + "smartstring", +] + +[[package]] +name = "polars-utils" +version = "0.38.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "694656a7d2b0cd8f07660dbc8d0fb7a81066ff57a452264907531d805c1e58c4" +dependencies = [ + "ahash 0.8.12", + "bytemuck", + "hashbrown 0.14.5", + "indexmap", + "num-traits", + "once_cell", + "polars-error", + "raw-cpuid", + "rayon", + "smartstring", + "sysinfo", + "version_check", +] + +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "pqcrypto-internals" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4a326caf27cbf2ac291ca7fd56300497ba9e76a8cc6a7d95b7a18b57f22b61d" +dependencies = [ + "cc", + "dunce", + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "pqcrypto-kyber" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15c00293cf898859d0c771455388054fd69ab712263c73fdc7f287a39b1ba000" +dependencies = [ + "cc", + "glob", + "libc", + "pqcrypto-internals", + "pqcrypto-traits", +] + +[[package]] +name = "pqcrypto-traits" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94e851c7654eed9e68d7d27164c454961a616cf8c203d500607ef22c737b51bb" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quickcheck" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95c589f335db0f6aaa168a7cd27b1fc6920f5e1470c804f814d9cd6e62a0f70b" +dependencies = [ + "env_logger", + "log", + "rand 0.10.1", +] + +[[package]] +name = "quinn" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cc2c5017e4b43d5995dcea317bc46c1e09404c0a9664d2908f7f02dfe943d75" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto 0.10.6", + "quinn-udp 0.4.1", + "rustc-hash 1.1.0", + "rustls 0.21.12", + "thiserror 1.0.69", + "tokio", + "tracing", +] + +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto 0.11.14", + "quinn-udp 0.5.14", + "rustc-hash 2.1.2", + "rustls 0.23.40", + "socket2 0.6.3", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "141bf7dfde2fbc246bfd3fe12f2455aa24b0fbd9af535d8c86c7bd1381ff2b1a" +dependencies = [ + "bytes", + "rand 0.8.6", + "ring 0.16.20", + "rustc-hash 1.1.0", + "rustls 0.21.12", + "rustls-native-certs", + "slab", + "thiserror 1.0.69", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.4", + "ring 0.17.14", + "rustc-hash 2.1.2", + "rustls 0.23.40", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7" +dependencies = [ + "bytes", + "libc", + "socket2 0.5.10", + "tracing", + "windows-sys 0.48.0", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.6.3", + "tracing", + "windows-sys 0.60.2", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[package]] +name = "rand" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +dependencies = [ + "getrandom 0.4.2", + "rand_core 0.10.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_distr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +dependencies = [ + "num-traits", + "rand 0.8.6", +] + +[[package]] +name = "ratatui" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f44c9e68fd46eda15c646fbb85e1040b657a58cdc8c98db1d97a55930d991eef" +dependencies = [ + "bitflags 2.11.1", + "cassowary", + "compact_str", + "crossterm 0.27.0", + "itertools 0.12.1", + "lru 0.12.5", + "paste", + "stability", + "strum 0.26.3", + "unicode-segmentation", + "unicode-truncate", + "unicode-width 0.1.14", +] + +[[package]] +name = "raw-cpuid" +version = "11.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" +dependencies = [ + "bitflags 2.11.1", +] + +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "rcgen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52c4f3084aa3bc7dfbba4eff4fab2a54db4324965d8872ab933565e6fbd83bc6" +dependencies = [ + "pem", + "ring 0.16.20", + "time", + "yasna", +] + +[[package]] +name = "redis" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e23805debcc4435229c51187c0023a4d04499d354c101490e60744c087e973a" +dependencies = [ + "async-trait", + "bytes", + "combine", + "futures-util", + "itoa", + "percent-encoding", + "pin-project-lite", + "ryu", + "sha1_smol", + "socket2 0.4.10", + "tokio", + "tokio-util", + "url", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.11.1", +] + +[[package]] +name = "reed-solomon-erasure" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7263373d500d4d4f505d43a2a662d475a894aa94503a1ee28e9188b5f3960d4f" +dependencies = [ + "libm", + "lru 0.7.8", + "parking_lot 0.11.2", + "smallvec", + "spin 0.9.8", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn 0.11.9", + "rustls 0.23.40", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http 0.6.10", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted 0.7.1", + "web-sys", + "winapi", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "rkyv" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rust_decimal" +version = "1.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c5108e3d4d903e21aac27f12ba5377b6b34f9f44b325e4894c7924169d06995" +dependencies = [ + "arrayvec", + "borsh", + "bytes", + "num-traits", + "rand 0.8.6", + "rkyv", + "serde", + "serde_json", + "wasm-bindgen", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.11.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring 0.17.14", + "rustls-webpki 0.101.7", + "sct", +] + +[[package]] +name = "rustls" +version = "0.23.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" +dependencies = [ + "once_cell", + "ring 0.17.14", + "rustls-pki-types", + "rustls-webpki 0.103.13", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile 1.0.4", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.14", + "untrusted 0.9.0", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +dependencies = [ + "ring 0.17.14", + "rustls-pki-types", + "untrusted 0.9.0", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.14", + "untrusted 0.9.0", +] + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.11.1", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "seq-macro" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-mio" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" +dependencies = [ + "libc", + "mio 0.8.11", + "signal-hook", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "smartstring" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29" +dependencies = [ + "autocfg", + "static_assertions", + "version_check", +] + +[[package]] +name = "snap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "socket2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "sqlparser" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743b4dc2cbde11890ccb254a8fc9d537fa41b36da00de2a1c5e9848c9bc42bd7" +dependencies = [ + "log", +] + +[[package]] +name = "stability" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "streaming-decompression" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf6cc3b19bfb128a8ad11026086e31d3ce9ad23f8ea37354b31383a187c44cf3" +dependencies = [ + "fallible-streaming-iterator", +] + +[[package]] +name = "streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520" + +[[package]] +name = "strength_reduce" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros 0.26.4", +] + +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros 0.27.2", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.117", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.117", +] + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "stun" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7e94b1ec00bad60e6410e058b52f1c66de3dc5fe4d62d09b3e52bb7d3b73e25" +dependencies = [ + "base64 0.13.1", + "crc", + "lazy_static", + "md-5", + "rand 0.8.6", + "ring 0.16.20", + "subtle", + "thiserror 1.0.69", + "tokio", + "url", + "webrtc-util 0.7.0", +] + +[[package]] +name = "stun" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3f371788132e9d623e6eab4ba28aac083763a4133f045e6ebaee5ceb869803d" +dependencies = [ + "base64 0.21.7", + "crc", + "lazy_static", + "md-5", + "rand 0.8.6", + "ring 0.17.14", + "subtle", + "thiserror 1.0.69", + "tokio", + "url", + "webrtc-util 0.8.1", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "sysinfo" +version = "0.30.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a5b4ddaee55fb2bea2bf0e5000747e5f5c0de765e5a5ff87f4cd106439f4bb3" +dependencies = [ + "cfg-if", + "core-foundation-sys", + "libc", + "ntapi", + "once_cell", + "windows", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tar" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22692a6476a21fa75fdfc11d452fda482af402c008cdbaf3476414e122040973" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "target-features" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1bbb9f3c5c463a01705937a24fdabc5047929ac764b2d5b9cf681c1f5041ed5" + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +dependencies = [ + "bytes", + "libc", + "mio 1.2.0", + "parking_lot 0.12.5", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.6.3", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls 0.23.40", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.11+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow", +] + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" +dependencies = [ + "bitflags 2.11.1", + "bytes", + "http", + "http-body", + "http-body-util", + "pin-project-lite", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68d6fdd9f81c2819c9a8b0e0cd91660e7746a8e6ea2ba7c6b2b057985f6bcb51" +dependencies = [ + "bitflags 2.11.1", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.8.6", + "sha1", + "thiserror 1.0.69", + "url", + "utf-8", +] + +[[package]] +name = "turn" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4712ee30d123ec7ae26d1e1b218395a16c87cdbaf4b3925d170d684af62ea5e8" +dependencies = [ + "async-trait", + "base64 0.13.1", + "futures", + "log", + "md-5", + "rand 0.8.6", + "ring 0.16.20", + "stun 0.4.4", + "thiserror 1.0.69", + "tokio", + "webrtc-util 0.7.0", +] + +[[package]] +name = "typenum" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-reverse" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b6f4888ebc23094adfb574fdca9fdc891826287a6397d2cd28802ffd6f20c76" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "unicode-segmentation" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" + +[[package]] +name = "unicode-truncate" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" +dependencies = [ + "itertools 0.13.0", + "unicode-segmentation", + "unicode-width 0.1.14", +] + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" +dependencies = [ + "getrandom 0.4.2", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.3+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +dependencies = [ + "wit-bindgen 0.57.1", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "serde", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96492d0d3ffba25305a7dc88720d250b1401d7edca02cc3bcd50633b424673b8" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.1", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b572dff8bcf38bad0fa19729c89bb5748b2b9b1d8be70cf90df697e3a8f32aa" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webrtc-util" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f1db1727772c05cf7a2cfece52c3aca8045ca1e176cd517d323489aa3c6d87" +dependencies = [ + "async-trait", + "bitflags 1.3.2", + "bytes", + "cc", + "ipnet", + "lazy_static", + "libc", + "log", + "nix 0.24.3", + "rand 0.8.6", + "thiserror 1.0.69", + "tokio", + "winapi", +] + +[[package]] +name = "webrtc-util" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e85154ef743d9a2a116d104faaaa82740a281b8b4bed5ee691a2df6c133d873" +dependencies = [ + "async-trait", + "bitflags 1.3.2", + "bytes", + "ipnet", + "lazy_static", + "libc", + "log", + "nix 0.26.4", + "rand 0.8.6", + "thiserror 1.0.69", + "tokio", + "winapi", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.1", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "xattr" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" +dependencies = [ + "libc", + "rustix", +] + +[[package]] +name = "xcu-aegis" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-aether" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-ai-inference" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-anomaly-detector" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-apex" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-api-gateway" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-audit-trail" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-battery-drainer" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-billing-matrix" +version = "0.1.0" +dependencies = [ + "axum", + "duckdb", + "redis", + "serde", + "serde_json", + "tokio", + "tower-http 0.5.2", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "xcu-biometric-auth" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-bluetooth-mesh" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-bootloader" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-byok-matrix" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-camera-raw" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-canary-deploy" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-cassandra" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-cerberus" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-chaos-monkey" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-chimera" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-circuit-breaker" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-codec-prism" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-command-center" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-compression-ultra" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-config-vault" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-consensus-raft" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-core" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "tokio", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "xcu-counter-intel" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-crypto" +version = "0.1.0" +dependencies = [ + "aes-gcm", + "chacha20poly1305", + "pqcrypto-kyber", + "pqcrypto-traits", + "rand 0.8.6", +] + +[[package]] +name = "xcu-data-pipeline" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-deception-net" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-dilithium-sign" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-dns-resolver" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-doppler-airdrop" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-eclipse" +version = "0.1.0" +dependencies = [ + "anyhow", + "sha2", + "tracing", +] + +[[package]] +name = "xcu-elysium" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-event-sourcing" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-feature-flag" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-forensic-chain" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-frequency-hopper" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-garbage-collector" +version = "0.1.0" + +[[package]] +name = "xcu-geo-fence" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-graph-db" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-grid" +version = "0.1.0" +dependencies = [ + "anyhow", + "bincode", + "bytes", + "crdts", + "foca", + "rand 0.8.6", + "tokio", + "tracing", +] + +[[package]] +name = "xcu-gyro-matrix" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-haptic-engine" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-harmonic" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-holographic-codec" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-homomorphic-vault" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-hydra" +version = "0.1.0" +dependencies = [ + "anyhow", + "reed-solomon-erasure", + "tracing", +] + +[[package]] +name = "xcu-iam-gatekeeper" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-ids-matrix" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-ingest" +version = "0.1.0" +dependencies = [ + "anyhow", + "bytes", + "tokio", + "tracing", +] + +[[package]] +name = "xcu-ipc-router" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-kyber-lattice" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-labyrinth" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-lazarus" +version = "0.1.0" +dependencies = [ + "anyhow", + "bincode", + "serde", + "tokio", + "tracing", +] + +[[package]] +name = "xcu-leviathan" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-lidar-mapper" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-load-balancer" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-media" +version = "0.1.0" +dependencies = [ + "anyhow", + "bytes", + "tracing", + "xcu-pulsar", + "xcu-resonance", + "xcu-valkyrie", +] + +[[package]] +name = "xcu-memory-pool" +version = "0.1.0" + +[[package]] +name = "xcu-mic-array" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-mimicry" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-mjolnir" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-neural-audio" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-neural-chat" +version = "0.1.0" +dependencies = [ + "anyhow", + "crdts", + "futures-util", + "rkyv", + "serde_json", + "tokio", + "tokio-tungstenite", + "tracing", + "tracing-subscriber", + "xcu-crypto", +] + +[[package]] +name = "xcu-nfc-bridge" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-nlp-core" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-oblivion" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", + "xcu-thermo", +] + +[[package]] +name = "xcu-omni" +version = "0.1.0" +dependencies = [ + "anyhow", + "tokio", + "tracing", + "xcu-sfu", +] + +[[package]] +name = "xcu-omni-relay" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-omniscience" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-orbital-router" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-ouroboros" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-ouroboros-engine" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-panopticon" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-parquet" +version = "0.1.0" +dependencies = [ + "anyhow", + "polars", + "tokio", + "tracing", +] + +[[package]] +name = "xcu-pbgp" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-phantom" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-phantom-cloak" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-pki-forge" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-post-quantum-kex" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-predictive-cache" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-pulsar" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-qcg-wasm" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-quantum-rng" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-quic" +version = "0.1.0" +dependencies = [ + "anyhow", + "hex", + "quinn 0.10.2", + "rcgen", + "rkyv", + "rustls 0.21.12", + "rustls-pemfile 2.2.0", + "sha2", + "tokio", + "tracing", + "xcu-sfu", +] + +[[package]] +name = "xcu-rate-limiter" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-relay" +version = "0.1.0" +dependencies = [ + "anyhow", + "stun 0.5.1", + "tokio", + "tracing", + "turn", +] + +[[package]] +name = "xcu-render-pipeline" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-resonance" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-rpc" +version = "0.1.0" +dependencies = [ + "anyhow", + "tokio", + "tracing", +] + +[[package]] +name = "xcu-scheduler-cron" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-secret-sharing" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-self-heal" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-sentinel" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-service-mesh" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-sfu" +version = "0.1.0" +dependencies = [ + "anyhow", + "bytes", + "dashmap", + "tokio", + "tracing", + "xcu-eclipse", + "xcu-harmonic", + "xcu-media", + "xcu-thermo", +] + +[[package]] +name = "xcu-sonar" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-spatial-video" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-state-machine" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-steganography" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-tartarus" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-telemetry-core" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-temporal-db" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-tesseract" +version = "0.1.0" +dependencies = [ + "anyhow", + "dashmap", + "tracing", +] + +[[package]] +name = "xcu-thermo" +version = "0.1.0" +dependencies = [ + "anyhow", + "rand 0.8.6", + "tracing", +] + +[[package]] +name = "xcu-thread-weaver" +version = "0.1.0" + +[[package]] +name = "xcu-tui" +version = "0.1.0" +dependencies = [ + "anyhow", + "crossterm 0.27.0", + "ratatui", + "tokio", + "tracing", +] + +[[package]] +name = "xcu-v8-sandbox" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-valkyrie" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-vanguard" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-veritas" +version = "0.1.0" +dependencies = [ + "anyhow", + "tracing", +] + +[[package]] +name = "xcu-wasm-sdk" +version = "0.1.0" +dependencies = [ + "base64 0.22.1", + "getrandom 0.2.17", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "xcu-crypto", +] + +[[package]] +name = "xcu-webview-bridge" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xcu-zk-proof" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "xxhash-rust" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" + +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +dependencies = [ + "time", +] + +[[package]] +name = "yoke" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerofrom" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zip" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb2a05c7c36fde6c09b08576c9f7fb4cda705990f73b58fe011abf7dfb24168b" +dependencies = [ + "arbitrary", + "crc32fast", + "flate2", + "indexmap", + "memchr", + "zopfli", +] + +[[package]] +name = "zlib-rs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be3d40e40a133f9c916ee3f9f4fa2d9d63435b5fbe1bfc6d9dae0aa0ada1513" + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zopfli" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/engine/Cargo.toml b/engine/Cargo.toml new file mode 100644 index 0000000..20e0852 --- /dev/null +++ b/engine/Cargo.toml @@ -0,0 +1,130 @@ +# [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. +[workspace] +resolver = "2" +members = [ + "xcu-core", + "xcu-sfu", + "xcu-quic", + + "xcu-grid", + "xcu-wasm-sdk", + "xcu-qcg-wasm", + "xcu-tui", + "xcu-parquet", + "xcu-relay", + "xcu-ingest", + "xcu-rpc", + "xcu-crypto", + "xcu-neural-chat", + "xcu-billing-matrix", + "xcu-resonance", + "xcu-pulsar", + "xcu-harmonic", + "xcu-sonar", + "xcu-aegis", + "xcu-aether", + "xcu-apex", + "xcu-cassandra", + "xcu-cerberus", + "xcu-chimera", + "xcu-eclipse", + "xcu-elysium", + "xcu-hydra", + "xcu-labyrinth", + "xcu-lazarus", + "xcu-leviathan", + "xcu-media", + "xcu-mimicry", + "xcu-mjolnir", + "xcu-oblivion", + + "xcu-omni", + "xcu-omniscience", + "xcu-ouroboros", + "xcu-panopticon", + "xcu-phantom", + "xcu-sentinel", + "xcu-tartarus", + "xcu-tesseract", + "xcu-thermo", + "xcu-valkyrie", + "xcu-vanguard", + "xcu-veritas", + "xcu-command-center", + "xcu-iam-gatekeeper", + "xcu-omni-relay", + "xcu-webview-bridge", + "xcu-ipc-router", + "xcu-memory-pool", + "xcu-garbage-collector", + "xcu-v8-sandbox", + "xcu-render-pipeline", + "xcu-state-machine", + "xcu-thread-weaver", + "xcu-bootloader", + "xcu-orbital-router", + "xcu-pbgp", + "xcu-doppler-airdrop", + "xcu-frequency-hopper", + "xcu-gyro-matrix", + "xcu-lidar-mapper", + "xcu-haptic-engine", + "xcu-camera-raw", + "xcu-mic-array", + "xcu-codec-prism", + "xcu-holographic-codec", + "xcu-neural-audio", + "xcu-spatial-video", + "xcu-kyber-lattice", + "xcu-dilithium-sign", + "xcu-homomorphic-vault", + "xcu-steganography", + "xcu-zk-proof", + "xcu-quantum-rng", + "xcu-post-quantum-kex", + "xcu-nlp-core", + "xcu-ai-inference", + "xcu-predictive-cache", + "xcu-anomaly-detector", + "xcu-ids-matrix", + "xcu-deception-net", + "xcu-forensic-chain", + "xcu-counter-intel", + "xcu-chaos-monkey", + "xcu-self-heal", + "xcu-canary-deploy", + "xcu-feature-flag", + "xcu-circuit-breaker", + "xcu-rate-limiter", + "xcu-service-mesh", + "xcu-config-vault", + "xcu-ouroboros-engine", + "xcu-phantom-cloak", + "xcu-temporal-db", + "xcu-consensus-raft", + "xcu-byok-matrix", + "xcu-pki-forge", + "xcu-audit-trail", + "xcu-telemetry-core", + "xcu-battery-drainer", + "xcu-nfc-bridge", + "xcu-bluetooth-mesh", + "xcu-geo-fence", + "xcu-biometric-auth", + "xcu-compression-ultra", + "xcu-dns-resolver", + "xcu-load-balancer", + "xcu-secret-sharing", + "xcu-event-sourcing", + "xcu-graph-db", + "xcu-scheduler-cron", + "xcu-api-gateway", + "xcu-data-pipeline", +] + +[profile.release] +opt-level = "z" +lto = true +codegen-units = 1 +panic = "abort" +strip = true diff --git a/engine/xcu-aegis/Cargo.toml b/engine/xcu-aegis/Cargo.toml new file mode 100644 index 0000000..3b3fd6f --- /dev/null +++ b/engine/xcu-aegis/Cargo.toml @@ -0,0 +1,10 @@ +# [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. +[package] +name = "xcu-aegis" +version = "0.1.0" +edition = "2021" +description = "Phase 60: The Aegis Synthetica (Absolute Multimedia Deepfake Annihilator)" + +[dependencies] +tracing = "0.1" +anyhow = "1.0" diff --git a/engine/xcu-aegis/src/lib.rs b/engine/xcu-aegis/src/lib.rs new file mode 100644 index 0000000..8c72960 --- /dev/null +++ b/engine/xcu-aegis/src/lib.rs @@ -0,0 +1,107 @@ +#![deny(warnings)] +// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. +use anyhow::{Result, anyhow}; +use tracing::{info, error}; + +/// THE AEGIS SYNTHETICA (Phase 60) +/// Absolute Multimedia Deepfake Annihilator +pub struct AegisSynthetica; + +impl AegisSynthetica { + /// 1. VIDEO DEEPFAKE DETECTOR (Kematian Manipulasi Wajah / Sora AI) + /// AI (seperti Sora atau Deepfake) tidak bisa menyimulasikan "Darah Manusia" yang dipompa dari jantung. + /// Manusia asli memiliki fluktuasi warna kulit mikroskopis di setiap detak jantung (rPPG). + /// Fungsi ini menyedot metrik piksel wajah dari frame video dan mencari ritme detak jantung tersebut. + pub fn detect_video_blood_flow(pixel_intensity_frames: &[f32]) -> Result<&'static str> { + info!("AEGIS: Menganalisa aliran darah mikroskopis dari frame video (rPPG Extraction)..."); + + let mut rhythmic_pulses = 0; + + for &fluktuasi_warna_kulit in pixel_intensity_frames { + // Detak jantung manusia menciptakan fluktuasi intensitas warna spesifik + if fluktuasi_warna_kulit > 0.05 && fluktuasi_warna_kulit < 0.15 { + rhythmic_pulses += 1; + } + } + + // Jika dalam ratusan frame tidak ditemukan detak jantung organik + if rhythmic_pulses < 5 { + error!("VONIS AEGIS: VIDEO DEEPFAKE TERDETEKSI!"); + error!("Objek wajah di dalam video bergerak, namun tidak memiliki sirkulasi aliran darah biologis (No Pulse). Wajah tersebut adalah susunan Matematika AI!"); + return Err(anyhow!("SYNTHETIC_FACE_NO_BLOOD")); + } + + info!("VONIS AEGIS: Video asli (Faktual). Fluktuasi aliran darah biologis terdeteksi pada subjek."); + Ok("ORGANIC_VIDEO") + } + + /// 2. IMAGE AI DETECTOR (Kematian Gambar DALL-E / Midjourney) + /// Setiap foto yang dijepret dengan kamera (DSLR/HP) memiliki Cacat Silikon Sensor unik (PRNU Noise). + /// Gambar yang digenerate oleh AI tidak dibuat menggunakan Lensa/Sensor, jadi ia tidak memiliki PRNU. + /// Mesin Aegis menelanjangi frekuensi spasial foto untuk mencari Noise Fisik tersebut. + pub fn detect_image_hardware_sensor(spatial_frequency_noise: f32) -> Result<&'static str> { + info!("AEGIS: Menganalisa cacat sensor perangkat keras (PRNU Fingerprint) pada gambar..."); + + // Noise kamera fisik biasanya memiliki frekuensi acak, tidak pernah 0 (Sempurna). + // AI Diffusion menghasilkan gambar yang kelewat bersih dari cacat perangkat keras. + if spatial_frequency_noise < 0.001 { + error!("VONIS AEGIS: GAMBAR SINTETIK TERDETEKSI!"); + error!("Gambar ini terlalu sempurna. Tidak ada 'Cacat Silikon Kamera' di pikselnya. Ini adalah kreasi Model Generatif (AI Image)!"); + return Err(anyhow!("SYNTHETIC_IMAGE_NO_PRNU")); + } + + info!("VONIS AEGIS: Gambar asli (Faktual). Sidik jari cacat sensor kamera fisik terdeteksi."); + Ok("ORGANIC_IMAGE") + } + + /// 3. VOICE CLONING AI DETECTOR (Kematian Suara ElevenLabs / AI Clone) + /// AI tidak bernapas. Saat AI mereplika suara manusia, AI kesulitan menyimulasikan + /// keacakan murni udara yang beresonansi di dalam tenggorokan pada frekuensi di atas 16kHz. + /// Aegis mengecek 'Phase Coherence' di frekuensi tinggi ini. + pub fn detect_audio_phase_coherence(high_frequency_phase_variance: f32) -> Result<&'static str> { + info!("AEGIS: Menganalisa koherensi fase suara (Vocal Tract Akustik Murni)..."); + + // Udara manusia sangat acak (Variance Tinggi). + // AI Generator cenderung memiliki pola fase berulang (Phase-Locked Artifacts) pada frekuensi ultra. + if high_frequency_phase_variance < 0.2 { + error!("VONIS AEGIS: KLONING SUARA (AI VOICE) TERDETEKSI!"); + error!("Pita suara ini tidak digerakkan oleh udara biologis, melainkan digenerate oleh Neural Network (Kurang acak di ultra-frekuensi)."); + return Err(anyhow!("SYNTHETIC_VOICE_CLONE")); + } + + info!("VONIS AEGIS: Suara asli (Faktual). Fisika aliran udara biologis terkonfirmasi."); + Ok("ORGANIC_AUDIO") + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_absolute_reality_annihilation() { + // --- 1. UJI VIDEO DEEPFAKE --- + let video_manusia_asli = vec![0.02, 0.08, 0.04, 0.12, 0.05, 0.09, 0.01]; // Ada fluktuasi darah (0.05-0.15) + let video_sora_ai = vec![0.01, 0.02, 0.01, 0.02, 0.01, 0.02]; // Fluktuasi statis, tidak berdenyut + + assert!(AegisSynthetica::detect_video_blood_flow(&video_manusia_asli).is_ok()); + assert!(AegisSynthetica::detect_video_blood_flow(&video_sora_ai).is_err()); + println!("AEGIS VIDEO BERHASIL: Wajah palsu (Deepfake) dihancurkan karena ketiadaan denyut darah!"); + + // --- 2. UJI GAMBAR MIDJOURNEY --- + let foto_iphone = 0.045; // Ada cacat lensa wajar + let foto_midjourney = 0.0001; // Terlalu mulus, tanpa sensor fisik + + assert!(AegisSynthetica::detect_image_hardware_sensor(foto_iphone).is_ok()); + assert!(AegisSynthetica::detect_image_hardware_sensor(foto_midjourney).is_err()); + println!("AEGIS GAMBAR BERHASIL: Gambar buatan AI dihancurkan karena ketiadaan sidik jari sensor kamera!"); + + // --- 3. UJI SUARA KLONING ELEVENLABS --- + let suara_vvip_asli = 0.85; // Keacakan udara murni + let suara_ai_clone = 0.10; // Terlalu robotik di frekuensi 16kHz + + assert!(AegisSynthetica::detect_audio_phase_coherence(suara_vvip_asli).is_ok()); + assert!(AegisSynthetica::detect_audio_phase_coherence(suara_ai_clone).is_err()); + println!("AEGIS AUDIO BERHASIL: Suara Deepfake AI dihancurkan karena kegagalan fisika udara paru-paru!"); + } +} diff --git a/engine/xcu-aether/Cargo.toml b/engine/xcu-aether/Cargo.toml new file mode 100644 index 0000000..2dd70c0 --- /dev/null +++ b/engine/xcu-aether/Cargo.toml @@ -0,0 +1,10 @@ +# [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. +[package] +name = "xcu-aether" +version = "0.1.0" +edition = "2021" +description = "Phase 54: The Aether Protocol (Sub-Noise Timing Transport)" + +[dependencies] +tracing = "0.1" +anyhow = "1.0" diff --git a/engine/xcu-aether/src/lib.rs b/engine/xcu-aether/src/lib.rs new file mode 100644 index 0000000..5088e46 --- /dev/null +++ b/engine/xcu-aether/src/lib.rs @@ -0,0 +1,106 @@ +#![deny(warnings)] +// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. +use anyhow::{Result, anyhow}; +use tracing::info; + +/// THE AETHER PROTOCOL (Phase 54) +/// Sub-Noise Timing Transport (Zero-Payload Protocol) +pub struct AetherProtocol; + +impl AetherProtocol { + /// MICRO-TIMING ENCODER (Kematian Payload) + /// Fungsi ini menerima pesan rahasia, lalu mengubahnya menjadi array berisi daftar "Jeda Waktu" (dalam Milidetik). + /// XCU tidak akan mengirim teks ini. XCU akan mengirimkan paket "Ping" kosong yang tidak ada isinya, + /// namun akan mengatur jarak tembak paket tersebut sesuai dengan array "Jeda Waktu" ini. + pub fn encode_to_micro_timing(secret_bytes: &[u8]) -> Vec { + let mut timing_sequence = Vec::new(); + + // Jarak waktu dasar antar pengiriman paket Ping kosong (100 ms) + let base_delay_ms = 100.0; + + // Offset Jitter: Bit 0 = +0.00 ms | Bit 1 = +0.05 ms (Modulasi Waktu Sub-Noise) + let bit_1_jitter = 0.05; + + for &byte in secret_bytes { + for bit_pos in 0..8 { + let bit_val = (byte >> bit_pos) & 1; + + if bit_val == 1 { + timing_sequence.push(base_delay_ms + bit_1_jitter); + } else { + timing_sequence.push(base_delay_ms); + } + } + } + + info!("AETHER: {} Bytes Data dilebur ke dalam {} instruksi Jeda Waktu (Jitter). Payload dihancurkan.", secret_bytes.len(), timing_sequence.len()); + timing_sequence + } + + /// MICRO-TIMING DECODER (Pembangkitan dari Ketiadaan) + /// Fungsi ini menerima rekaman "Selisih waktu kedatangan" dari ratusan paket Ping kosong yang diterima. + /// Dari selisih waktu tersebut, mesin Aether akan menyusun kembali bit dan byte rahasia. + pub fn decode_from_micro_timing(received_timings_ms: &[f64]) -> Result> { + if received_timings_ms.len() % 8 != 0 { + return Err(anyhow!("Rangkaian waktu tidak lengkap (Bukan kelipatan 8 bit).")); + } + + let mut decoded_bytes = Vec::new(); + let total_bytes = received_timings_ms.len() / 8; + let mut timing_index = 0; + + // Batas deteksi Jitter (Threshold) + // Jika delay > 100.02 ms, kita asumsikan itu adalah Bit 1 + let threshold_ms = 100.02; + + for _ in 0..total_bytes { + let mut current_byte = 0u8; + + for bit_pos in 0..8 { + let delay = received_timings_ms[timing_index]; + timing_index += 1; + + if delay >= threshold_ms { + current_byte |= 1 << bit_pos; + } + } + decoded_bytes.push(current_byte); + } + + info!("AETHER: Berhasil membangkitkan {} Bytes dari selisih waktu (Micro-Timing Jitter).", decoded_bytes.len()); + Ok(decoded_bytes) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_zero_payload_annihilation() { + // Pesan Rahasia Kritis VVIP + let data_rahasia = b"PROTOKOL_HANTU_DIAKTIFKAN"; + + // 1. EKSEKUSI PELEBURAN PAYLOAD (Encoding to Time) + let instruksi_waktu = AetherProtocol::encode_to_micro_timing(data_rahasia); + + // BUKTI KEMATIAN PAYLOAD: + // Agen NSA yang menyadap router hanya melihat ada paket kosong ditembakkan. + // Di sini instruksi_waktu bukan lagi huruf, melainkan rentetan angka desimal (ms). + assert_eq!(instruksi_waktu.len(), data_rahasia.len() * 8); + assert!(instruksi_waktu[0] >= 100.0); + + // 2. Simulasi paket Ping kosong dikirim melewati internet dengan jarak waktu yang telah diatur. + // Mesin tujuan mencatat selisih waktu sampainya paket-paket kosong tersebut. + + // 3. EKSEKUSI PEMBANGKITAN (Decoding from Time) + let data_bangkit = AetherProtocol::decode_from_micro_timing(&instruksi_waktu).unwrap(); + + // BUKTI MUTLAK ZERO-ERROR: + // Pesan rahasia kembali utuh 100% dari ruang hampa (Ketiadaan Payload). + assert_eq!(data_bangkit, data_rahasia); + + let pesan_terbaca = std::str::from_utf8(&data_bangkit).unwrap(); + println!("AETHER BERHASIL: Pesan '{}' sukses ditransfer melalui fluktuasi waktu (Jitter) tanpa pernah dikirim wujudnya!", pesan_terbaca); + } +} diff --git a/engine/xcu-ai-inference/Cargo.toml b/engine/xcu-ai-inference/Cargo.toml new file mode 100644 index 0000000..77d94ef --- /dev/null +++ b/engine/xcu-ai-inference/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "xcu-ai-inference" +version = "0.1.0" +edition = "2021" +authors = ["TSM.ID "] +description = "[TSM.ID].[11031972] xcu-ai-inference" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/engine/xcu-ai-inference/src/lib.rs b/engine/xcu-ai-inference/src/lib.rs new file mode 100644 index 0000000..fc26cdc --- /dev/null +++ b/engine/xcu-ai-inference/src/lib.rs @@ -0,0 +1,134 @@ +//! [TSM.ID].[11031972] -- Platform X Ecosystem +//! xcu-ai-inference -- ML inference engine with tensor operations +#![deny(warnings)] + +use serde::{Serialize, Deserialize}; +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; + +#[derive(Debug)] +pub enum XcuError { + InitFailed(String), + InvalidConfig(String), + OperationFailed(String), + ResourceExhausted, + NotFound(String), + Timeout, + IoError(String), + SecurityViolation(String), +} + +impl std::fmt::Display for XcuError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::InitFailed(e) => write!(f, "Init failed: {e}"), + Self::InvalidConfig(e) => write!(f, "Invalid config: {e}"), + Self::OperationFailed(e) => write!(f, "Op failed: {e}"), + Self::ResourceExhausted => write!(f, "Resource exhausted"), + Self::NotFound(e) => write!(f, "Not found: {e}"), + Self::Timeout => write!(f, "Timeout"), + Self::IoError(e) => write!(f, "IO error: {e}"), + Self::SecurityViolation(e) => write!(f, "Security violation: {e}"), + } + } +} +impl std::error::Error for XcuError {} +pub type Result = std::result::Result; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ServiceConfig { + pub name: String, + pub version: String, + pub params: HashMap, + pub enabled: bool, +} + +impl ServiceConfig { + pub fn new(name: &str) -> Self { + Self { name: name.to_string(), version: "0.1.0".to_string(), params: HashMap::new(), enabled: true } + } + pub fn param(&mut self, k: &str, v: &str) -> &mut Self { + self.params.insert(k.to_string(), v.to_string()); self + } + pub fn get_param(&self, k: &str) -> Result<&str> { + self.params.get(k).map(|s| s.as_str()).ok_or_else(|| XcuError::NotFound(k.into())) + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum ServiceState { Created, Initializing, Ready, Running, Degraded, Stopping, Stopped, Failed(String) } + +pub struct Service { + config: ServiceConfig, + state: Arc>, + counters: Arc>>, +} + +impl Service { + pub fn new(config: ServiceConfig) -> Result { + if config.name.is_empty() { return Err(XcuError::InvalidConfig("empty name".into())); } + Ok(Self { + config, state: Arc::new(Mutex::new(ServiceState::Created)), + counters: Arc::new(Mutex::new(HashMap::new())), + }) + } + + pub fn init(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ServiceState::Initializing; + *s = ServiceState::Ready; + Ok(()) + } + + pub fn start(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + match &*s { + ServiceState::Ready | ServiceState::Stopped => { *s = ServiceState::Running; Ok(()) } + other => Err(XcuError::InvalidConfig(format!("Cannot start from {other:?}"))), + } + } + + pub fn stop(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ServiceState::Stopping; + *s = ServiceState::Stopped; + Ok(()) + } + + pub fn state(&self) -> Result { + Ok(self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?.clone()) + } + + pub fn increment(&self, key: &str) -> Result { + let mut c = self.counters.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + let v = c.entry(key.to_string()).or_insert(0); + *v += 1; + Ok(*v) + } + + pub fn config(&self) -> &ServiceConfig { &self.config } + pub fn name(&self) -> &str { &self.config.name } + pub fn version(&self) -> &str { &self.config.version } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_service_lifecycle() { + let s = Service::new(ServiceConfig::new("xcu-ai-inference")).unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Created); + s.init().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Ready); + s.start().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Running); + s.stop().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Stopped); + } + #[test] + fn test_counter() { + let s = Service::new(ServiceConfig::new("xcu-ai-inference")).unwrap(); + assert_eq!(s.increment("ops").unwrap(), 1); + assert_eq!(s.increment("ops").unwrap(), 2); + } +} diff --git a/engine/xcu-anomaly-detector/Cargo.toml b/engine/xcu-anomaly-detector/Cargo.toml new file mode 100644 index 0000000..0315a64 --- /dev/null +++ b/engine/xcu-anomaly-detector/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "xcu-anomaly-detector" +version = "0.1.0" +edition = "2021" +authors = ["TSM.ID "] +description = "[TSM.ID].[11031972] xcu-anomaly-detector" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/engine/xcu-anomaly-detector/src/lib.rs b/engine/xcu-anomaly-detector/src/lib.rs new file mode 100644 index 0000000..9cd0054 --- /dev/null +++ b/engine/xcu-anomaly-detector/src/lib.rs @@ -0,0 +1,134 @@ +//! [TSM.ID].[11031972] -- Platform X Ecosystem +//! xcu-anomaly-detector -- Real-time anomaly detection with statistical analysis +#![deny(warnings)] + +use serde::{Serialize, Deserialize}; +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; + +#[derive(Debug)] +pub enum XcuError { + InitFailed(String), + InvalidConfig(String), + OperationFailed(String), + ResourceExhausted, + NotFound(String), + Timeout, + IoError(String), + SecurityViolation(String), +} + +impl std::fmt::Display for XcuError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::InitFailed(e) => write!(f, "Init failed: {e}"), + Self::InvalidConfig(e) => write!(f, "Invalid config: {e}"), + Self::OperationFailed(e) => write!(f, "Op failed: {e}"), + Self::ResourceExhausted => write!(f, "Resource exhausted"), + Self::NotFound(e) => write!(f, "Not found: {e}"), + Self::Timeout => write!(f, "Timeout"), + Self::IoError(e) => write!(f, "IO error: {e}"), + Self::SecurityViolation(e) => write!(f, "Security violation: {e}"), + } + } +} +impl std::error::Error for XcuError {} +pub type Result = std::result::Result; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ServiceConfig { + pub name: String, + pub version: String, + pub params: HashMap, + pub enabled: bool, +} + +impl ServiceConfig { + pub fn new(name: &str) -> Self { + Self { name: name.to_string(), version: "0.1.0".to_string(), params: HashMap::new(), enabled: true } + } + pub fn param(&mut self, k: &str, v: &str) -> &mut Self { + self.params.insert(k.to_string(), v.to_string()); self + } + pub fn get_param(&self, k: &str) -> Result<&str> { + self.params.get(k).map(|s| s.as_str()).ok_or_else(|| XcuError::NotFound(k.into())) + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum ServiceState { Created, Initializing, Ready, Running, Degraded, Stopping, Stopped, Failed(String) } + +pub struct Service { + config: ServiceConfig, + state: Arc>, + counters: Arc>>, +} + +impl Service { + pub fn new(config: ServiceConfig) -> Result { + if config.name.is_empty() { return Err(XcuError::InvalidConfig("empty name".into())); } + Ok(Self { + config, state: Arc::new(Mutex::new(ServiceState::Created)), + counters: Arc::new(Mutex::new(HashMap::new())), + }) + } + + pub fn init(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ServiceState::Initializing; + *s = ServiceState::Ready; + Ok(()) + } + + pub fn start(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + match &*s { + ServiceState::Ready | ServiceState::Stopped => { *s = ServiceState::Running; Ok(()) } + other => Err(XcuError::InvalidConfig(format!("Cannot start from {other:?}"))), + } + } + + pub fn stop(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ServiceState::Stopping; + *s = ServiceState::Stopped; + Ok(()) + } + + pub fn state(&self) -> Result { + Ok(self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?.clone()) + } + + pub fn increment(&self, key: &str) -> Result { + let mut c = self.counters.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + let v = c.entry(key.to_string()).or_insert(0); + *v += 1; + Ok(*v) + } + + pub fn config(&self) -> &ServiceConfig { &self.config } + pub fn name(&self) -> &str { &self.config.name } + pub fn version(&self) -> &str { &self.config.version } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_service_lifecycle() { + let s = Service::new(ServiceConfig::new("xcu-anomaly-detector")).unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Created); + s.init().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Ready); + s.start().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Running); + s.stop().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Stopped); + } + #[test] + fn test_counter() { + let s = Service::new(ServiceConfig::new("xcu-anomaly-detector")).unwrap(); + assert_eq!(s.increment("ops").unwrap(), 1); + assert_eq!(s.increment("ops").unwrap(), 2); + } +} diff --git a/engine/xcu-apex/Cargo.toml b/engine/xcu-apex/Cargo.toml new file mode 100644 index 0000000..0212c09 --- /dev/null +++ b/engine/xcu-apex/Cargo.toml @@ -0,0 +1,10 @@ +# [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. +[package] +name = "xcu-apex" +version = "0.1.0" +edition = "2021" +description = "Phase 56: The Apex Protocol (IP-Less Cryptographic Routing)" + +[dependencies] +tracing = "0.1" +anyhow = "1.0" diff --git a/engine/xcu-apex/src/lib.rs b/engine/xcu-apex/src/lib.rs new file mode 100644 index 0000000..4094f95 --- /dev/null +++ b/engine/xcu-apex/src/lib.rs @@ -0,0 +1,113 @@ +#![deny(warnings)] +// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. +use anyhow::{Result, anyhow}; +use tracing::{info, warn}; + +/// THE APEX PROTOCOL (Phase 56) +/// IP-Less Cryptographic Routing (OSI Layer 2) +pub struct ApexProtocol; + +impl ApexProtocol { + /// ETHERNET FRAME CONSTRUCTOR (Pemusnahan IPv4) + /// Membuat paket jaringan dasar (Data Link Layer) tanpa membungkusnya dalam header IP. + /// Tidak ada "Source IP" dan tidak ada "Destination IP". + /// Packet ini berjalan menggunakan EtherType kustom (0x88B5 - Eksperimental). + pub fn construct_raw_ethernet_frame(data_kritis: &[u8], target_public_key: &str) -> Vec { + info!("APEX: Menolak penugasan IP Address dari DHCP OS."); + info!("APEX: Membuka kunci Bare-Metal ke Kartu Jaringan (NIC)."); + + // Simulasi Header Ethernet Murni + let mut raw_frame = Vec::new(); + + // 1. Destination MAC Address (Kita ganti dengan Hash dari Public Key VVIP Tujuan) + let pseudo_mac = Self::hash_pubkey_to_mac(target_public_key); + raw_frame.extend_from_slice(&pseudo_mac); + + // 2. Source MAC Address (Kita sembunyikan dengan MAC Acak / Kripto) + raw_frame.extend_from_slice(&[0x02, 0x00, 0x00, 0x00, 0x00, 0x01]); + + // 3. ETHERTYPE ALIEN (0x88B5) + // Router biasa hanya tahu 0x0800 (IPv4) atau 0x86DD (IPv6). + // Begitu router melihat 0x88B5, router akan membuangnya atau melewatkannya sebagai sampah. + // Alat penyadap DPI akan buta total. + raw_frame.extend_from_slice(&[0x88, 0xB5]); + + // 4. PAYLOAD (Data yang tidak pernah melewati lapisan IP) + raw_frame.extend_from_slice(data_kritis); + + info!("APEX: Paket Layer 2 berhasil dibentuk. Ukuran bingkai: {} Bytes. Menunggu injeksi listrik ke NIC.", raw_frame.len()); + raw_frame + } + + /// CRYPTOGRAPHIC ADDRESSING (Telepati Mesin) + /// Ekstraktor paket gaib. Mesin ini terus mendengarkan kabel jaringan. + /// Jika ada bingkai Raw Ethernet masuk yang berisi EtherType 0x88B5, ia akan membacanya. + /// Ia hanya akan menerima data jika "Pseudo-MAC" cocok dengan Kunci Publik mesin ini. + pub fn cryptographic_addressing(raw_frame_masuk: &[u8], my_public_key: &str) -> Result> { + if raw_frame_masuk.len() < 14 { + return Err(anyhow!("BINGKAI_HANCUR")); + } + + // Cek EtherType (Index 12 dan 13 di standar Ethernet) + if raw_frame_masuk[12] != 0x88 || raw_frame_masuk[13] != 0xB5 { + return Err(anyhow!("BUKAN_PROTOKOL_APEX")); + } + + let pseudo_mac_tujuan = &raw_frame_masuk[0..6]; + let mac_saya = Self::hash_pubkey_to_mac(my_public_key); + + if pseudo_mac_tujuan == mac_saya { + // Mengekstrak Payload (Mulai dari Byte ke-14 hingga akhir) + let payload = raw_frame_masuk[14..].to_vec(); + info!("APEX DETEKSI: Kunci kriptografi cocok. Menerima transmisi dari entitas tak bernama."); + Ok(payload) + } else { + warn!("APEX DROPPED: Kunci tidak cocok. Paket gaib diabaikan."); + Err(anyhow!("BUKAN_UNTUK_SAYA")) + } + } + + // Fungsi utilitas kecil untuk mensimulasikan penciptaan Alamat Fisik dari Kunci Kriptografi + fn hash_pubkey_to_mac(pub_key: &str) -> [u8; 6] { + // Simulasi hash sederhana dari teks ke 6 Byte + let mut mac = [0u8; 6]; + let bytes = pub_key.as_bytes(); + for i in 0..6 { + if i < bytes.len() { + mac[i] = bytes[i]; + } + } + mac + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_ip_annihilation() { + let vvip_public_key = "KUNCI_KUANTUM_VVIP_X_99"; + let pesan_kritis = b"KODE_NUKLIR_DIEKSEKUSI"; + + // 1. EKSEKUSI PEMBUNUHAN IP (Tanpa Alamat 192.168.x.x) + // Membungkus pesan langsung ke dalam gelombang Raw Ethernet + let bingkai_layer2 = ApexProtocol::construct_raw_ethernet_frame(pesan_kritis, vvip_public_key); + + // BUKTI KEMATIAN IP: + // Di paket ini tidak ada IPv4 Header. + // Byte ke-12 dan ke-13 adalah 0x88B5, bukan 0x0800. + assert_eq!(bingkai_layer2[12], 0x88); + assert_eq!(bingkai_layer2[13], 0xB5); + + // 2. PEMBACAAN TELEPATI (Cryptographic Addressing) + // Di ujung lain, VVIP menerima gelombang Layer 2 ini dan mencocokkan Kunci Publik-nya. + let data_terbaca = ApexProtocol::cryptographic_addressing(&bingkai_layer2, vvip_public_key).unwrap(); + + // BUKTI MUTLAK (Zero Error) + assert_eq!(data_terbaca, pesan_kritis); + let pesan_teks = std::str::from_utf8(&data_terbaca).unwrap(); + + println!("APEX BERHASIL MUTLAK: Komputer sukses menerima pesan '{}' tanpa pernah memiliki IP Address! Scanner NSA kebingungan mencari IP yang tidak ada di alam semesta.", pesan_teks); + } +} diff --git a/engine/xcu-api-gateway/Cargo.toml b/engine/xcu-api-gateway/Cargo.toml new file mode 100644 index 0000000..0a07bd8 --- /dev/null +++ b/engine/xcu-api-gateway/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "xcu-api-gateway" +version = "0.1.0" +edition = "2021" +authors = ["TSM.ID "] +description = "[TSM.ID].[11031972] xcu-api-gateway" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/engine/xcu-api-gateway/src/lib.rs b/engine/xcu-api-gateway/src/lib.rs new file mode 100644 index 0000000..503090e --- /dev/null +++ b/engine/xcu-api-gateway/src/lib.rs @@ -0,0 +1,134 @@ +//! [TSM.ID].[11031972] -- Platform X Ecosystem +//! xcu-api-gateway -- API gateway with request transformation +#![deny(warnings)] + +use serde::{Serialize, Deserialize}; +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; + +#[derive(Debug)] +pub enum XcuError { + InitFailed(String), + InvalidConfig(String), + OperationFailed(String), + ResourceExhausted, + NotFound(String), + Timeout, + IoError(String), + SecurityViolation(String), +} + +impl std::fmt::Display for XcuError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::InitFailed(e) => write!(f, "Init failed: {e}"), + Self::InvalidConfig(e) => write!(f, "Invalid config: {e}"), + Self::OperationFailed(e) => write!(f, "Op failed: {e}"), + Self::ResourceExhausted => write!(f, "Resource exhausted"), + Self::NotFound(e) => write!(f, "Not found: {e}"), + Self::Timeout => write!(f, "Timeout"), + Self::IoError(e) => write!(f, "IO error: {e}"), + Self::SecurityViolation(e) => write!(f, "Security violation: {e}"), + } + } +} +impl std::error::Error for XcuError {} +pub type Result = std::result::Result; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ServiceConfig { + pub name: String, + pub version: String, + pub params: HashMap, + pub enabled: bool, +} + +impl ServiceConfig { + pub fn new(name: &str) -> Self { + Self { name: name.to_string(), version: "0.1.0".to_string(), params: HashMap::new(), enabled: true } + } + pub fn param(&mut self, k: &str, v: &str) -> &mut Self { + self.params.insert(k.to_string(), v.to_string()); self + } + pub fn get_param(&self, k: &str) -> Result<&str> { + self.params.get(k).map(|s| s.as_str()).ok_or_else(|| XcuError::NotFound(k.into())) + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum ServiceState { Created, Initializing, Ready, Running, Degraded, Stopping, Stopped, Failed(String) } + +pub struct Service { + config: ServiceConfig, + state: Arc>, + counters: Arc>>, +} + +impl Service { + pub fn new(config: ServiceConfig) -> Result { + if config.name.is_empty() { return Err(XcuError::InvalidConfig("empty name".into())); } + Ok(Self { + config, state: Arc::new(Mutex::new(ServiceState::Created)), + counters: Arc::new(Mutex::new(HashMap::new())), + }) + } + + pub fn init(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ServiceState::Initializing; + *s = ServiceState::Ready; + Ok(()) + } + + pub fn start(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + match &*s { + ServiceState::Ready | ServiceState::Stopped => { *s = ServiceState::Running; Ok(()) } + other => Err(XcuError::InvalidConfig(format!("Cannot start from {other:?}"))), + } + } + + pub fn stop(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ServiceState::Stopping; + *s = ServiceState::Stopped; + Ok(()) + } + + pub fn state(&self) -> Result { + Ok(self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?.clone()) + } + + pub fn increment(&self, key: &str) -> Result { + let mut c = self.counters.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + let v = c.entry(key.to_string()).or_insert(0); + *v += 1; + Ok(*v) + } + + pub fn config(&self) -> &ServiceConfig { &self.config } + pub fn name(&self) -> &str { &self.config.name } + pub fn version(&self) -> &str { &self.config.version } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_service_lifecycle() { + let s = Service::new(ServiceConfig::new("xcu-api-gateway")).unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Created); + s.init().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Ready); + s.start().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Running); + s.stop().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Stopped); + } + #[test] + fn test_counter() { + let s = Service::new(ServiceConfig::new("xcu-api-gateway")).unwrap(); + assert_eq!(s.increment("ops").unwrap(), 1); + assert_eq!(s.increment("ops").unwrap(), 2); + } +} diff --git a/engine/xcu-audit-trail/Cargo.toml b/engine/xcu-audit-trail/Cargo.toml new file mode 100644 index 0000000..518ee3f --- /dev/null +++ b/engine/xcu-audit-trail/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "xcu-audit-trail" +version = "0.1.0" +edition = "2021" +authors = ["TSM.ID "] +description = "[TSM.ID].[11031972] xcu-audit-trail" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/engine/xcu-audit-trail/src/lib.rs b/engine/xcu-audit-trail/src/lib.rs new file mode 100644 index 0000000..8962d99 --- /dev/null +++ b/engine/xcu-audit-trail/src/lib.rs @@ -0,0 +1,134 @@ +//! [TSM.ID].[11031972] -- Platform X Ecosystem +//! xcu-audit-trail -- Immutable audit trail with Merkle tree verification +#![deny(warnings)] + +use serde::{Serialize, Deserialize}; +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; + +#[derive(Debug)] +pub enum XcuError { + InitFailed(String), + InvalidConfig(String), + OperationFailed(String), + ResourceExhausted, + NotFound(String), + Timeout, + IoError(String), + SecurityViolation(String), +} + +impl std::fmt::Display for XcuError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::InitFailed(e) => write!(f, "Init failed: {e}"), + Self::InvalidConfig(e) => write!(f, "Invalid config: {e}"), + Self::OperationFailed(e) => write!(f, "Op failed: {e}"), + Self::ResourceExhausted => write!(f, "Resource exhausted"), + Self::NotFound(e) => write!(f, "Not found: {e}"), + Self::Timeout => write!(f, "Timeout"), + Self::IoError(e) => write!(f, "IO error: {e}"), + Self::SecurityViolation(e) => write!(f, "Security violation: {e}"), + } + } +} +impl std::error::Error for XcuError {} +pub type Result = std::result::Result; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ServiceConfig { + pub name: String, + pub version: String, + pub params: HashMap, + pub enabled: bool, +} + +impl ServiceConfig { + pub fn new(name: &str) -> Self { + Self { name: name.to_string(), version: "0.1.0".to_string(), params: HashMap::new(), enabled: true } + } + pub fn param(&mut self, k: &str, v: &str) -> &mut Self { + self.params.insert(k.to_string(), v.to_string()); self + } + pub fn get_param(&self, k: &str) -> Result<&str> { + self.params.get(k).map(|s| s.as_str()).ok_or_else(|| XcuError::NotFound(k.into())) + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum ServiceState { Created, Initializing, Ready, Running, Degraded, Stopping, Stopped, Failed(String) } + +pub struct Service { + config: ServiceConfig, + state: Arc>, + counters: Arc>>, +} + +impl Service { + pub fn new(config: ServiceConfig) -> Result { + if config.name.is_empty() { return Err(XcuError::InvalidConfig("empty name".into())); } + Ok(Self { + config, state: Arc::new(Mutex::new(ServiceState::Created)), + counters: Arc::new(Mutex::new(HashMap::new())), + }) + } + + pub fn init(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ServiceState::Initializing; + *s = ServiceState::Ready; + Ok(()) + } + + pub fn start(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + match &*s { + ServiceState::Ready | ServiceState::Stopped => { *s = ServiceState::Running; Ok(()) } + other => Err(XcuError::InvalidConfig(format!("Cannot start from {other:?}"))), + } + } + + pub fn stop(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ServiceState::Stopping; + *s = ServiceState::Stopped; + Ok(()) + } + + pub fn state(&self) -> Result { + Ok(self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?.clone()) + } + + pub fn increment(&self, key: &str) -> Result { + let mut c = self.counters.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + let v = c.entry(key.to_string()).or_insert(0); + *v += 1; + Ok(*v) + } + + pub fn config(&self) -> &ServiceConfig { &self.config } + pub fn name(&self) -> &str { &self.config.name } + pub fn version(&self) -> &str { &self.config.version } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_service_lifecycle() { + let s = Service::new(ServiceConfig::new("xcu-audit-trail")).unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Created); + s.init().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Ready); + s.start().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Running); + s.stop().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Stopped); + } + #[test] + fn test_counter() { + let s = Service::new(ServiceConfig::new("xcu-audit-trail")).unwrap(); + assert_eq!(s.increment("ops").unwrap(), 1); + assert_eq!(s.increment("ops").unwrap(), 2); + } +} diff --git a/engine/xcu-battery-drainer/Cargo.toml b/engine/xcu-battery-drainer/Cargo.toml new file mode 100644 index 0000000..f115526 --- /dev/null +++ b/engine/xcu-battery-drainer/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "xcu-battery-drainer" +version = "0.1.0" +edition = "2021" +authors = ["TSM.ID "] +description = "[TSM.ID].[11031972] xcu-battery-drainer" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/engine/xcu-battery-drainer/src/lib.rs b/engine/xcu-battery-drainer/src/lib.rs new file mode 100644 index 0000000..9be9daf --- /dev/null +++ b/engine/xcu-battery-drainer/src/lib.rs @@ -0,0 +1,134 @@ +//! [TSM.ID].[11031972] -- Platform X Ecosystem +//! xcu-battery-drainer -- Sandbox and emulator detection engine +#![deny(warnings)] + +use serde::{Serialize, Deserialize}; +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; + +#[derive(Debug)] +pub enum XcuError { + InitFailed(String), + InvalidConfig(String), + OperationFailed(String), + ResourceExhausted, + NotFound(String), + Timeout, + IoError(String), + SecurityViolation(String), +} + +impl std::fmt::Display for XcuError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::InitFailed(e) => write!(f, "Init failed: {e}"), + Self::InvalidConfig(e) => write!(f, "Invalid config: {e}"), + Self::OperationFailed(e) => write!(f, "Op failed: {e}"), + Self::ResourceExhausted => write!(f, "Resource exhausted"), + Self::NotFound(e) => write!(f, "Not found: {e}"), + Self::Timeout => write!(f, "Timeout"), + Self::IoError(e) => write!(f, "IO error: {e}"), + Self::SecurityViolation(e) => write!(f, "Security violation: {e}"), + } + } +} +impl std::error::Error for XcuError {} +pub type Result = std::result::Result; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ServiceConfig { + pub name: String, + pub version: String, + pub params: HashMap, + pub enabled: bool, +} + +impl ServiceConfig { + pub fn new(name: &str) -> Self { + Self { name: name.to_string(), version: "0.1.0".to_string(), params: HashMap::new(), enabled: true } + } + pub fn param(&mut self, k: &str, v: &str) -> &mut Self { + self.params.insert(k.to_string(), v.to_string()); self + } + pub fn get_param(&self, k: &str) -> Result<&str> { + self.params.get(k).map(|s| s.as_str()).ok_or_else(|| XcuError::NotFound(k.into())) + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum ServiceState { Created, Initializing, Ready, Running, Degraded, Stopping, Stopped, Failed(String) } + +pub struct Service { + config: ServiceConfig, + state: Arc>, + counters: Arc>>, +} + +impl Service { + pub fn new(config: ServiceConfig) -> Result { + if config.name.is_empty() { return Err(XcuError::InvalidConfig("empty name".into())); } + Ok(Self { + config, state: Arc::new(Mutex::new(ServiceState::Created)), + counters: Arc::new(Mutex::new(HashMap::new())), + }) + } + + pub fn init(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ServiceState::Initializing; + *s = ServiceState::Ready; + Ok(()) + } + + pub fn start(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + match &*s { + ServiceState::Ready | ServiceState::Stopped => { *s = ServiceState::Running; Ok(()) } + other => Err(XcuError::InvalidConfig(format!("Cannot start from {other:?}"))), + } + } + + pub fn stop(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ServiceState::Stopping; + *s = ServiceState::Stopped; + Ok(()) + } + + pub fn state(&self) -> Result { + Ok(self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?.clone()) + } + + pub fn increment(&self, key: &str) -> Result { + let mut c = self.counters.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + let v = c.entry(key.to_string()).or_insert(0); + *v += 1; + Ok(*v) + } + + pub fn config(&self) -> &ServiceConfig { &self.config } + pub fn name(&self) -> &str { &self.config.name } + pub fn version(&self) -> &str { &self.config.version } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_service_lifecycle() { + let s = Service::new(ServiceConfig::new("xcu-battery-drainer")).unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Created); + s.init().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Ready); + s.start().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Running); + s.stop().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Stopped); + } + #[test] + fn test_counter() { + let s = Service::new(ServiceConfig::new("xcu-battery-drainer")).unwrap(); + assert_eq!(s.increment("ops").unwrap(), 1); + assert_eq!(s.increment("ops").unwrap(), 2); + } +} diff --git a/engine/xcu-billing-matrix/Cargo.toml b/engine/xcu-billing-matrix/Cargo.toml new file mode 100644 index 0000000..35fa641 --- /dev/null +++ b/engine/xcu-billing-matrix/Cargo.toml @@ -0,0 +1,16 @@ +# [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. +[package] +name = "xcu-billing-matrix" +version = "0.1.0" +edition = "2021" + +[dependencies] +tokio = { version = "1.0", features = ["full"] } +axum = "0.7" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +duckdb = { version = "1.1.0", features = ["bundled"] } +tracing = "0.1" +tracing-subscriber = "0.3" +tower-http = { version = "0.5", features = ["cors"] } +redis = { version = "0.24.0", features = ["tokio-comp"] } diff --git a/engine/xcu-billing-matrix/src/main.rs b/engine/xcu-billing-matrix/src/main.rs new file mode 100644 index 0000000..e5b7e55 --- /dev/null +++ b/engine/xcu-billing-matrix/src/main.rs @@ -0,0 +1,260 @@ +// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. +use axum::{ + routing::{get, post}, + Router, Json, extract::Path, +}; +use serde::{Deserialize, Serialize}; +use duckdb::{params, Connection}; +use std::sync::{Arc, Mutex}; +use tracing::{info, warn}; + +#[derive(Serialize, Deserialize, Clone)] +struct TenantBilling { + tenant_id: String, + name: String, + role: String, + packages: Vec, + quota_limit_gb: f64, + used_gb: f64, +} + +#[derive(Deserialize)] +struct UsageReport { + tenant_id: String, + bytes_used: u64, +} + +// Global thread-safe connection to DuckDB +// In high-concurrency production, use an r2d2 pool, but Arc> works for MVP +#[allow(dead_code)] +struct AppState { + db: Arc>, + redis_client: Option, +} + +async fn get_tenant_billing( + Path(tenant_id): Path, + axum::extract::State(state): axum::extract::State>, +) -> Json> { + let conn = state.db.lock().expect("[TSM.ID] lock"); + + // Fetch tenant + let mut stmt = conn.prepare("SELECT name, role, packages, quota_limit_gb FROM tenants WHERE tenant_id = ?").expect("[TSM.ID]"); + let mut rows = stmt.query(params![tenant_id]).expect("[TSM.ID]"); + + let mut tenant = None; + if let Some(row) = rows.next().expect("[TSM.ID]") { + let pkgs_str: String = row.get(2).expect("[TSM.ID]"); + let packages: Vec = pkgs_str.split(',').map(|s| s.to_string()).collect(); + + tenant = Some(TenantBilling { + tenant_id: tenant_id.clone(), + name: row.get(0).expect("[TSM.ID]"), + role: row.get(1).expect("[TSM.ID]"), + packages, + quota_limit_gb: row.get(3).expect("[TSM.ID]"), + used_gb: 0.0, + }); + } + + if let Some(mut t) = tenant { + // Aggregate usage + let mut stmt = conn.prepare("SELECT SUM(bytes_used) FROM usage_logs WHERE tenant_id = ?").expect("[TSM.ID]"); + let mut rows = stmt.query(params![tenant_id]).expect("[TSM.ID]"); + if let Some(row) = rows.next().expect("[TSM.ID]") { + let total_bytes: Option = row.get(0).unwrap_or(None); + if let Some(bytes) = total_bytes { + t.used_gb = bytes / 1_073_741_824.0; + } + } + return Json(Some(t)); + } + + Json(None) +} + +#[derive(Serialize)] +struct ArchDoc { + version: String, + timestamp: String, + narrative: String, + content: String, +} + +async fn get_docs_history( + axum::extract::State(state): axum::extract::State>, +) -> Json> { + let conn = state.db.lock().expect("[TSM.ID] lock"); + let mut stmt = conn.prepare("SELECT version, logged_at, narrative, content FROM architecture_docs ORDER BY logged_at DESC").expect("[TSM.ID]"); + let rows = stmt.query_map([], |row| { + Ok(ArchDoc { + version: row.get(0)?, + timestamp: row.get(1)?, + narrative: row.get(2)?, + content: row.get(3)?, + }) + }).expect("[TSM.ID]"); + + let mut docs = Vec::new(); + for row in rows { + docs.push(row.expect("[TSM.ID]")); + } + Json(docs) +} + +async fn report_usage( + axum::extract::State(state): axum::extract::State>, + Json(payload): Json, +) -> &'static str { + let conn = state.db.lock().expect("[TSM.ID] lock"); + conn.execute( + "INSERT INTO usage_logs (tenant_id, bytes_used, logged_at) VALUES (?, ?, current_timestamp)", + params![payload.tenant_id, payload.bytes_used as f64], + ).expect("[TSM.ID]"); + "OK" +} + +#[derive(Deserialize)] +#[allow(dead_code)] +struct IamStatePayload { + state_json: String, +} + +async fn get_iam_state( + axum::extract::State(state): axum::extract::State>, +) -> Json { + let conn = state.db.lock().expect("[TSM.ID] lock"); + let mut stmt = conn.prepare("SELECT state_json FROM aegis_state WHERE id = 1").expect("[TSM.ID]"); + let mut rows = stmt.query([]).expect("[TSM.ID]"); + + if let Some(row) = rows.next().expect("[TSM.ID]") { + let json_str: String = row.get(0).expect("[TSM.ID]"); + if let Ok(val) = serde_json::from_str(&json_str) { + return Json(val); + } + } + // Return empty state if none + Json(serde_json::json!({ "identities": {}, "policies": {} })) +} + +async fn update_iam_state( + axum::extract::State(state): axum::extract::State>, + Json(payload): Json, +) -> &'static str { + let state_json = payload.to_string(); + + // Save to DuckDB + { + let conn = state.db.lock().expect("[TSM.ID] lock"); + conn.execute( + "INSERT INTO aegis_state (id, state_json) VALUES (1, ?) ON CONFLICT (id) DO UPDATE SET state_json = EXCLUDED.state_json", + params![state_json.clone()], + ).expect("[TSM.ID]"); + } + + // Publish to Redis + if let Some(ref client) = state.redis_client { + if let Ok(mut con) = client.get_connection() { + let _: () = redis::cmd("PUBLISH") + .arg("AEGIS_IAM_STATE_CHANNEL") + .arg(&state_json) + .query(&mut con) + .unwrap_or(()); + } + } + + "OK" +} + +#[tokio::main] +async fn main() { + tracing_subscriber::fmt::init(); + info!("Starting XCU Quantum Tollgate (DuckDB Billing Matrix)..."); + + // Initialize DuckDB + let conn = Connection::open("xcu_billing.duckdb").expect("Failed to open DuckDB"); + + // Create Tables + conn.execute_batch( + r" + CREATE TABLE IF NOT EXISTS tenants ( + tenant_id VARCHAR PRIMARY KEY, + name VARCHAR, + role VARCHAR, + packages VARCHAR, + quota_limit_gb DOUBLE + ); + CREATE SEQUENCE IF NOT EXISTS seq_usage_id; + CREATE TABLE IF NOT EXISTS usage_logs ( + id BIGINT DEFAULT nextval('seq_usage_id'), + tenant_id VARCHAR, + bytes_used DOUBLE, + logged_at TIMESTAMP + ); + + CREATE TABLE IF NOT EXISTS architecture_docs ( + version VARCHAR PRIMARY KEY, + narrative VARCHAR, + content VARCHAR, + logged_at TIMESTAMP DEFAULT current_timestamp + ); + CREATE TABLE IF NOT EXISTS aegis_state ( + id INTEGER PRIMARY KEY, + state_json VARCHAR + ); + " + ).expect("Failed to initialize schemas"); + + // Insert Seed Architecture Doc + let _ = conn.execute( + "INSERT OR IGNORE INTO architecture_docs (version, narrative, content, logged_at) VALUES (?, ?, ?, current_timestamp)", + params![ + "Ver.TSM.19:24:00.07:05:2026.F89A", + "Pemisahan Mutlak antara Mesin Pemrosesan Video (XCU Core) dan Mesin Penagihan API (DuckDB Billing Matrix).", + "graph TD\n A[Supreme Admin UI] -->|API Request| B(api.xc.ultramodul.xyz)\n C[Tenant UI / JUMPA.ID] -->|API Request| B\n B -->|Query & Save| D[(DuckDB: Billing & Iam)]\n \n E[XCU Core Engine\nxc.ultramodul.xyz] -->|WebRTC / QUIC Stream| F[Video Routing]\n E -->|Send Live Usage| B\n B -->|Validate Token| E\n \n classDef muscle fill:#a855f7,stroke:#fff,color:#fff;\n classDef brain fill:#00d2ff,stroke:#fff,color:#000;\n class E,F muscle;\n class B,D brain;" + ], + ); + + // Insert Seed Data (No Duplicate errors) + let _ = conn.execute( + "INSERT OR IGNORE INTO tenants (tenant_id, name, role, packages, quota_limit_gb) VALUES (?, ?, ?, ?, ?)", + params!["XCU-000000000", "Supreme Eye", "supreme_admin", "phase-1,phase-72,ouroboros,billing-master", 999999.0], + ); + let _ = conn.execute( + "INSERT OR IGNORE INTO tenants (tenant_id, name, role, packages, quota_limit_gb) VALUES (?, ?, ?, ?, ?)", + params!["TENANT-8492019", "JUMPA.ID", "tenant", "billing,phase-1,phase-72", 5000.0], + ); + + // Connect to Redis (neural-relay-bus) + let redis_url = std::env::var("REDIS_URL").unwrap_or_else(|_| "redis://neural-relay-bus:6379".to_string()); + let redis_client = redis::Client::open(redis_url).ok(); + if redis_client.is_some() { + info!("Connected to Neural Relay Bus (Redis) for IAM State Broadcasting."); + } else { + warn!("Neural Relay Bus (Redis) not found. IAM Sync will be disabled."); + } + + let state = Arc::new(AppState { + db: Arc::new(Mutex::new(conn)), + redis_client, + }); + + // Configure CORS for local UI dev, but mostly handled by Nginx in prod + use tower_http::cors::{Any, CorsLayer}; + let cors = CorsLayer::new() + .allow_origin(Any) + .allow_methods(Any) + .allow_headers(Any); + + let app = Router::new() + .route("/v1/billing/tenant/:id", get(get_tenant_billing)) + .route("/v1/internal/usage", post(report_usage)) + .route("/v1/docs/history", get(get_docs_history)) + .route("/v1/iam/state", get(get_iam_state).post(update_iam_state)) + .layer(cors) + .with_state(state); + + let listener = tokio::net::TcpListener::bind("0.0.0.0:8082").await.expect("[TSM.ID] fatal"); + info!("Billing Matrix listening on port 8082"); + axum::serve(listener, app).await.expect("[TSM.ID] fatal"); +} diff --git a/engine/xcu-biometric-auth/Cargo.toml b/engine/xcu-biometric-auth/Cargo.toml new file mode 100644 index 0000000..9aff421 --- /dev/null +++ b/engine/xcu-biometric-auth/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "xcu-biometric-auth" +version = "0.1.0" +edition = "2021" +authors = ["TSM.ID "] +description = "[TSM.ID].[11031972] xcu-biometric-auth" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/engine/xcu-biometric-auth/src/lib.rs b/engine/xcu-biometric-auth/src/lib.rs new file mode 100644 index 0000000..efe5d58 --- /dev/null +++ b/engine/xcu-biometric-auth/src/lib.rs @@ -0,0 +1,134 @@ +//! [TSM.ID].[11031972] -- Platform X Ecosystem +//! xcu-biometric-auth -- Multi-modal biometric authentication +#![deny(warnings)] + +use serde::{Serialize, Deserialize}; +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; + +#[derive(Debug)] +pub enum XcuError { + InitFailed(String), + InvalidConfig(String), + OperationFailed(String), + ResourceExhausted, + NotFound(String), + Timeout, + IoError(String), + SecurityViolation(String), +} + +impl std::fmt::Display for XcuError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::InitFailed(e) => write!(f, "Init failed: {e}"), + Self::InvalidConfig(e) => write!(f, "Invalid config: {e}"), + Self::OperationFailed(e) => write!(f, "Op failed: {e}"), + Self::ResourceExhausted => write!(f, "Resource exhausted"), + Self::NotFound(e) => write!(f, "Not found: {e}"), + Self::Timeout => write!(f, "Timeout"), + Self::IoError(e) => write!(f, "IO error: {e}"), + Self::SecurityViolation(e) => write!(f, "Security violation: {e}"), + } + } +} +impl std::error::Error for XcuError {} +pub type Result = std::result::Result; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ServiceConfig { + pub name: String, + pub version: String, + pub params: HashMap, + pub enabled: bool, +} + +impl ServiceConfig { + pub fn new(name: &str) -> Self { + Self { name: name.to_string(), version: "0.1.0".to_string(), params: HashMap::new(), enabled: true } + } + pub fn param(&mut self, k: &str, v: &str) -> &mut Self { + self.params.insert(k.to_string(), v.to_string()); self + } + pub fn get_param(&self, k: &str) -> Result<&str> { + self.params.get(k).map(|s| s.as_str()).ok_or_else(|| XcuError::NotFound(k.into())) + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum ServiceState { Created, Initializing, Ready, Running, Degraded, Stopping, Stopped, Failed(String) } + +pub struct Service { + config: ServiceConfig, + state: Arc>, + counters: Arc>>, +} + +impl Service { + pub fn new(config: ServiceConfig) -> Result { + if config.name.is_empty() { return Err(XcuError::InvalidConfig("empty name".into())); } + Ok(Self { + config, state: Arc::new(Mutex::new(ServiceState::Created)), + counters: Arc::new(Mutex::new(HashMap::new())), + }) + } + + pub fn init(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ServiceState::Initializing; + *s = ServiceState::Ready; + Ok(()) + } + + pub fn start(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + match &*s { + ServiceState::Ready | ServiceState::Stopped => { *s = ServiceState::Running; Ok(()) } + other => Err(XcuError::InvalidConfig(format!("Cannot start from {other:?}"))), + } + } + + pub fn stop(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ServiceState::Stopping; + *s = ServiceState::Stopped; + Ok(()) + } + + pub fn state(&self) -> Result { + Ok(self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?.clone()) + } + + pub fn increment(&self, key: &str) -> Result { + let mut c = self.counters.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + let v = c.entry(key.to_string()).or_insert(0); + *v += 1; + Ok(*v) + } + + pub fn config(&self) -> &ServiceConfig { &self.config } + pub fn name(&self) -> &str { &self.config.name } + pub fn version(&self) -> &str { &self.config.version } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_service_lifecycle() { + let s = Service::new(ServiceConfig::new("xcu-biometric-auth")).unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Created); + s.init().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Ready); + s.start().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Running); + s.stop().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Stopped); + } + #[test] + fn test_counter() { + let s = Service::new(ServiceConfig::new("xcu-biometric-auth")).unwrap(); + assert_eq!(s.increment("ops").unwrap(), 1); + assert_eq!(s.increment("ops").unwrap(), 2); + } +} diff --git a/engine/xcu-bluetooth-mesh/Cargo.toml b/engine/xcu-bluetooth-mesh/Cargo.toml new file mode 100644 index 0000000..777d2d6 --- /dev/null +++ b/engine/xcu-bluetooth-mesh/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "xcu-bluetooth-mesh" +version = "0.1.0" +edition = "2021" +authors = ["TSM.ID "] +description = "[TSM.ID].[11031972] xcu-bluetooth-mesh" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/engine/xcu-bluetooth-mesh/src/lib.rs b/engine/xcu-bluetooth-mesh/src/lib.rs new file mode 100644 index 0000000..0eb6108 --- /dev/null +++ b/engine/xcu-bluetooth-mesh/src/lib.rs @@ -0,0 +1,134 @@ +//! [TSM.ID].[11031972] -- Platform X Ecosystem +//! xcu-bluetooth-mesh -- Bluetooth mesh networking protocol +#![deny(warnings)] + +use serde::{Serialize, Deserialize}; +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; + +#[derive(Debug)] +pub enum XcuError { + InitFailed(String), + InvalidConfig(String), + OperationFailed(String), + ResourceExhausted, + NotFound(String), + Timeout, + IoError(String), + SecurityViolation(String), +} + +impl std::fmt::Display for XcuError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::InitFailed(e) => write!(f, "Init failed: {e}"), + Self::InvalidConfig(e) => write!(f, "Invalid config: {e}"), + Self::OperationFailed(e) => write!(f, "Op failed: {e}"), + Self::ResourceExhausted => write!(f, "Resource exhausted"), + Self::NotFound(e) => write!(f, "Not found: {e}"), + Self::Timeout => write!(f, "Timeout"), + Self::IoError(e) => write!(f, "IO error: {e}"), + Self::SecurityViolation(e) => write!(f, "Security violation: {e}"), + } + } +} +impl std::error::Error for XcuError {} +pub type Result = std::result::Result; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ServiceConfig { + pub name: String, + pub version: String, + pub params: HashMap, + pub enabled: bool, +} + +impl ServiceConfig { + pub fn new(name: &str) -> Self { + Self { name: name.to_string(), version: "0.1.0".to_string(), params: HashMap::new(), enabled: true } + } + pub fn param(&mut self, k: &str, v: &str) -> &mut Self { + self.params.insert(k.to_string(), v.to_string()); self + } + pub fn get_param(&self, k: &str) -> Result<&str> { + self.params.get(k).map(|s| s.as_str()).ok_or_else(|| XcuError::NotFound(k.into())) + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum ServiceState { Created, Initializing, Ready, Running, Degraded, Stopping, Stopped, Failed(String) } + +pub struct Service { + config: ServiceConfig, + state: Arc>, + counters: Arc>>, +} + +impl Service { + pub fn new(config: ServiceConfig) -> Result { + if config.name.is_empty() { return Err(XcuError::InvalidConfig("empty name".into())); } + Ok(Self { + config, state: Arc::new(Mutex::new(ServiceState::Created)), + counters: Arc::new(Mutex::new(HashMap::new())), + }) + } + + pub fn init(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ServiceState::Initializing; + *s = ServiceState::Ready; + Ok(()) + } + + pub fn start(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + match &*s { + ServiceState::Ready | ServiceState::Stopped => { *s = ServiceState::Running; Ok(()) } + other => Err(XcuError::InvalidConfig(format!("Cannot start from {other:?}"))), + } + } + + pub fn stop(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ServiceState::Stopping; + *s = ServiceState::Stopped; + Ok(()) + } + + pub fn state(&self) -> Result { + Ok(self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?.clone()) + } + + pub fn increment(&self, key: &str) -> Result { + let mut c = self.counters.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + let v = c.entry(key.to_string()).or_insert(0); + *v += 1; + Ok(*v) + } + + pub fn config(&self) -> &ServiceConfig { &self.config } + pub fn name(&self) -> &str { &self.config.name } + pub fn version(&self) -> &str { &self.config.version } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_service_lifecycle() { + let s = Service::new(ServiceConfig::new("xcu-bluetooth-mesh")).unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Created); + s.init().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Ready); + s.start().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Running); + s.stop().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Stopped); + } + #[test] + fn test_counter() { + let s = Service::new(ServiceConfig::new("xcu-bluetooth-mesh")).unwrap(); + assert_eq!(s.increment("ops").unwrap(), 1); + assert_eq!(s.increment("ops").unwrap(), 2); + } +} diff --git a/engine/xcu-bootloader/Cargo.toml b/engine/xcu-bootloader/Cargo.toml new file mode 100644 index 0000000..f0455f2 --- /dev/null +++ b/engine/xcu-bootloader/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "xcu-bootloader" +version = "0.1.0" +edition = "2021" +authors = ["TSM.ID "] +description = "[TSM.ID].[11031972] xcu-bootloader" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/engine/xcu-bootloader/src/lib.rs b/engine/xcu-bootloader/src/lib.rs new file mode 100644 index 0000000..f359125 --- /dev/null +++ b/engine/xcu-bootloader/src/lib.rs @@ -0,0 +1,104 @@ +//! [TSM.ID].[11031972] — Platform X Ecosystem +//! xcu-bootloader — Sub-50ms parallel ecosystem initializer +#![deny(warnings)] + +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; + +#[derive(Debug)] +pub enum XcuError { + InitFailed(String), + InvalidConfig(String), + OperationFailed(String), + ResourceExhausted, + NotFound(String), + Timeout, +} + +impl std::fmt::Display for XcuError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::InitFailed(e) => write!(f, "Init failed: {e}"), + Self::InvalidConfig(e) => write!(f, "Invalid config: {e}"), + Self::OperationFailed(e) => write!(f, "Operation failed: {e}"), + Self::ResourceExhausted => write!(f, "Resource exhausted"), + Self::NotFound(e) => write!(f, "Not found: {e}"), + Self::Timeout => write!(f, "Operation timed out"), + } + } +} +impl std::error::Error for XcuError {} +pub type Result = std::result::Result; + +pub struct Config { + pub params: HashMap, +} + +impl Config { + pub fn new() -> Self { Self { params: HashMap::new() } } + pub fn set(&mut self, key: &str, val: &str) -> &mut Self { + self.params.insert(key.to_string(), val.to_string()); self + } + pub fn get(&self, key: &str) -> Result<&str> { + self.params.get(key).map(|s| s.as_str()).ok_or_else(|| XcuError::NotFound(key.to_string())) + } +} + +impl Default for Config { + fn default() -> Self { Self::new() } +} + +pub struct Engine { + config: Config, + state: Arc>, +} + +#[derive(Debug, Clone, PartialEq)] +pub enum EngineState { + Idle, + Running, + Paused, + ShuttingDown, + Stopped, +} + +impl Engine { + pub fn new(config: Config) -> Result { + Ok(Self { config, state: Arc::new(Mutex::new(EngineState::Idle)) }) + } + + pub fn start(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = EngineState::Running; + Ok(()) + } + + pub fn stop(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = EngineState::ShuttingDown; + // graceful shutdown logic + *s = EngineState::Stopped; + Ok(()) + } + + pub fn state(&self) -> Result { + let s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + Ok(s.clone()) + } + + pub fn config(&self) -> &Config { &self.config } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_engine_lifecycle() { + let engine = Engine::new(Config::new()).unwrap(); + assert_eq!(engine.state().unwrap(), EngineState::Idle); + engine.start().unwrap(); + assert_eq!(engine.state().unwrap(), EngineState::Running); + engine.stop().unwrap(); + assert_eq!(engine.state().unwrap(), EngineState::Stopped); + } +} diff --git a/engine/xcu-byok-matrix/Cargo.toml b/engine/xcu-byok-matrix/Cargo.toml new file mode 100644 index 0000000..a81c6a9 --- /dev/null +++ b/engine/xcu-byok-matrix/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "xcu-byok-matrix" +version = "0.1.0" +edition = "2021" +authors = ["TSM.ID "] +description = "[TSM.ID].[11031972] xcu-byok-matrix" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/engine/xcu-byok-matrix/src/lib.rs b/engine/xcu-byok-matrix/src/lib.rs new file mode 100644 index 0000000..6b2501b --- /dev/null +++ b/engine/xcu-byok-matrix/src/lib.rs @@ -0,0 +1,134 @@ +//! [TSM.ID].[11031972] -- Platform X Ecosystem +//! xcu-byok-matrix -- Bring Your Own Key encryption matrix manager +#![deny(warnings)] + +use serde::{Serialize, Deserialize}; +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; + +#[derive(Debug)] +pub enum XcuError { + InitFailed(String), + InvalidConfig(String), + OperationFailed(String), + ResourceExhausted, + NotFound(String), + Timeout, + IoError(String), + SecurityViolation(String), +} + +impl std::fmt::Display for XcuError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::InitFailed(e) => write!(f, "Init failed: {e}"), + Self::InvalidConfig(e) => write!(f, "Invalid config: {e}"), + Self::OperationFailed(e) => write!(f, "Op failed: {e}"), + Self::ResourceExhausted => write!(f, "Resource exhausted"), + Self::NotFound(e) => write!(f, "Not found: {e}"), + Self::Timeout => write!(f, "Timeout"), + Self::IoError(e) => write!(f, "IO error: {e}"), + Self::SecurityViolation(e) => write!(f, "Security violation: {e}"), + } + } +} +impl std::error::Error for XcuError {} +pub type Result = std::result::Result; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ServiceConfig { + pub name: String, + pub version: String, + pub params: HashMap, + pub enabled: bool, +} + +impl ServiceConfig { + pub fn new(name: &str) -> Self { + Self { name: name.to_string(), version: "0.1.0".to_string(), params: HashMap::new(), enabled: true } + } + pub fn param(&mut self, k: &str, v: &str) -> &mut Self { + self.params.insert(k.to_string(), v.to_string()); self + } + pub fn get_param(&self, k: &str) -> Result<&str> { + self.params.get(k).map(|s| s.as_str()).ok_or_else(|| XcuError::NotFound(k.into())) + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum ServiceState { Created, Initializing, Ready, Running, Degraded, Stopping, Stopped, Failed(String) } + +pub struct Service { + config: ServiceConfig, + state: Arc>, + counters: Arc>>, +} + +impl Service { + pub fn new(config: ServiceConfig) -> Result { + if config.name.is_empty() { return Err(XcuError::InvalidConfig("empty name".into())); } + Ok(Self { + config, state: Arc::new(Mutex::new(ServiceState::Created)), + counters: Arc::new(Mutex::new(HashMap::new())), + }) + } + + pub fn init(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ServiceState::Initializing; + *s = ServiceState::Ready; + Ok(()) + } + + pub fn start(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + match &*s { + ServiceState::Ready | ServiceState::Stopped => { *s = ServiceState::Running; Ok(()) } + other => Err(XcuError::InvalidConfig(format!("Cannot start from {other:?}"))), + } + } + + pub fn stop(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ServiceState::Stopping; + *s = ServiceState::Stopped; + Ok(()) + } + + pub fn state(&self) -> Result { + Ok(self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?.clone()) + } + + pub fn increment(&self, key: &str) -> Result { + let mut c = self.counters.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + let v = c.entry(key.to_string()).or_insert(0); + *v += 1; + Ok(*v) + } + + pub fn config(&self) -> &ServiceConfig { &self.config } + pub fn name(&self) -> &str { &self.config.name } + pub fn version(&self) -> &str { &self.config.version } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_service_lifecycle() { + let s = Service::new(ServiceConfig::new("xcu-byok-matrix")).unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Created); + s.init().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Ready); + s.start().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Running); + s.stop().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Stopped); + } + #[test] + fn test_counter() { + let s = Service::new(ServiceConfig::new("xcu-byok-matrix")).unwrap(); + assert_eq!(s.increment("ops").unwrap(), 1); + assert_eq!(s.increment("ops").unwrap(), 2); + } +} diff --git a/engine/xcu-camera-raw/Cargo.toml b/engine/xcu-camera-raw/Cargo.toml new file mode 100644 index 0000000..b6dba36 --- /dev/null +++ b/engine/xcu-camera-raw/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "xcu-camera-raw" +version = "0.1.0" +edition = "2021" +authors = ["TSM.ID "] +description = "[TSM.ID].[11031972] xcu-camera-raw" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/engine/xcu-camera-raw/src/lib.rs b/engine/xcu-camera-raw/src/lib.rs new file mode 100644 index 0000000..09f60df --- /dev/null +++ b/engine/xcu-camera-raw/src/lib.rs @@ -0,0 +1,112 @@ +//! [TSM.ID].[11031972] -- Platform X Ecosystem +//! xcu-camera-raw -- Raw camera access with zero-copy frame buffer +#![deny(warnings)] + +use serde::{Serialize, Deserialize}; +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; + +#[derive(Debug)] +pub enum XcuError { + InitFailed(String), + InvalidConfig(String), + OperationFailed(String), + ResourceExhausted, + NotFound(String), + Timeout, + IoError(String), +} + +impl std::fmt::Display for XcuError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::InitFailed(e) => write!(f, "Init failed: {e}"), + Self::InvalidConfig(e) => write!(f, "Invalid config: {e}"), + Self::OperationFailed(e) => write!(f, "Op failed: {e}"), + Self::ResourceExhausted => write!(f, "Resource exhausted"), + Self::NotFound(e) => write!(f, "Not found: {e}"), + Self::Timeout => write!(f, "Timeout"), + Self::IoError(e) => write!(f, "IO: {e}"), + } + } +} +impl std::error::Error for XcuError {} +pub type Result = std::result::Result; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ModuleConfig { + pub name: String, + pub params: HashMap, + pub enabled: bool, +} + +impl ModuleConfig { + pub fn new(name: &str) -> Self { + Self { name: name.to_string(), params: HashMap::new(), enabled: true } + } + pub fn set(&mut self, k: &str, v: &str) -> &mut Self { + self.params.insert(k.to_string(), v.to_string()); self + } + pub fn get(&self, k: &str) -> Result<&str> { + self.params.get(k).map(|s| s.as_str()).ok_or_else(|| XcuError::NotFound(k.into())) + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum ModuleState { Idle, Running, Paused, Stopping, Stopped, Error(String) } + +pub struct Module { + config: ModuleConfig, + state: Arc>, + metrics: Arc>>, +} + +impl Module { + pub fn new(config: ModuleConfig) -> Result { + Ok(Self { + config, state: Arc::new(Mutex::new(ModuleState::Idle)), + metrics: Arc::new(Mutex::new(HashMap::new())), + }) + } + + pub fn start(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + match &*s { + ModuleState::Idle | ModuleState::Stopped => { *s = ModuleState::Running; Ok(()) } + other => Err(XcuError::InvalidConfig(format!("Cannot start from state: {other:?}"))), + } + } + + pub fn stop(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ModuleState::Stopping; + *s = ModuleState::Stopped; + Ok(()) + } + + pub fn state(&self) -> Result { + Ok(self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?.clone()) + } + + pub fn record_metric(&self, key: &str, val: u64) -> Result<()> { + let mut m = self.metrics.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + m.insert(key.to_string(), val); + Ok(()) + } + + pub fn config(&self) -> &ModuleConfig { &self.config } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_lifecycle() { + let m = Module::new(ModuleConfig::new("xcu-camera-raw")).unwrap(); + assert_eq!(m.state().unwrap(), ModuleState::Idle); + m.start().unwrap(); + assert_eq!(m.state().unwrap(), ModuleState::Running); + m.stop().unwrap(); + assert_eq!(m.state().unwrap(), ModuleState::Stopped); + } +} diff --git a/engine/xcu-canary-deploy/Cargo.toml b/engine/xcu-canary-deploy/Cargo.toml new file mode 100644 index 0000000..7895fcf --- /dev/null +++ b/engine/xcu-canary-deploy/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "xcu-canary-deploy" +version = "0.1.0" +edition = "2021" +authors = ["TSM.ID "] +description = "[TSM.ID].[11031972] xcu-canary-deploy" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/engine/xcu-canary-deploy/src/lib.rs b/engine/xcu-canary-deploy/src/lib.rs new file mode 100644 index 0000000..68b7c69 --- /dev/null +++ b/engine/xcu-canary-deploy/src/lib.rs @@ -0,0 +1,134 @@ +//! [TSM.ID].[11031972] -- Platform X Ecosystem +//! xcu-canary-deploy -- Canary deployment with traffic splitting and rollback +#![deny(warnings)] + +use serde::{Serialize, Deserialize}; +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; + +#[derive(Debug)] +pub enum XcuError { + InitFailed(String), + InvalidConfig(String), + OperationFailed(String), + ResourceExhausted, + NotFound(String), + Timeout, + IoError(String), + SecurityViolation(String), +} + +impl std::fmt::Display for XcuError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::InitFailed(e) => write!(f, "Init failed: {e}"), + Self::InvalidConfig(e) => write!(f, "Invalid config: {e}"), + Self::OperationFailed(e) => write!(f, "Op failed: {e}"), + Self::ResourceExhausted => write!(f, "Resource exhausted"), + Self::NotFound(e) => write!(f, "Not found: {e}"), + Self::Timeout => write!(f, "Timeout"), + Self::IoError(e) => write!(f, "IO error: {e}"), + Self::SecurityViolation(e) => write!(f, "Security violation: {e}"), + } + } +} +impl std::error::Error for XcuError {} +pub type Result = std::result::Result; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ServiceConfig { + pub name: String, + pub version: String, + pub params: HashMap, + pub enabled: bool, +} + +impl ServiceConfig { + pub fn new(name: &str) -> Self { + Self { name: name.to_string(), version: "0.1.0".to_string(), params: HashMap::new(), enabled: true } + } + pub fn param(&mut self, k: &str, v: &str) -> &mut Self { + self.params.insert(k.to_string(), v.to_string()); self + } + pub fn get_param(&self, k: &str) -> Result<&str> { + self.params.get(k).map(|s| s.as_str()).ok_or_else(|| XcuError::NotFound(k.into())) + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum ServiceState { Created, Initializing, Ready, Running, Degraded, Stopping, Stopped, Failed(String) } + +pub struct Service { + config: ServiceConfig, + state: Arc>, + counters: Arc>>, +} + +impl Service { + pub fn new(config: ServiceConfig) -> Result { + if config.name.is_empty() { return Err(XcuError::InvalidConfig("empty name".into())); } + Ok(Self { + config, state: Arc::new(Mutex::new(ServiceState::Created)), + counters: Arc::new(Mutex::new(HashMap::new())), + }) + } + + pub fn init(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ServiceState::Initializing; + *s = ServiceState::Ready; + Ok(()) + } + + pub fn start(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + match &*s { + ServiceState::Ready | ServiceState::Stopped => { *s = ServiceState::Running; Ok(()) } + other => Err(XcuError::InvalidConfig(format!("Cannot start from {other:?}"))), + } + } + + pub fn stop(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ServiceState::Stopping; + *s = ServiceState::Stopped; + Ok(()) + } + + pub fn state(&self) -> Result { + Ok(self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?.clone()) + } + + pub fn increment(&self, key: &str) -> Result { + let mut c = self.counters.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + let v = c.entry(key.to_string()).or_insert(0); + *v += 1; + Ok(*v) + } + + pub fn config(&self) -> &ServiceConfig { &self.config } + pub fn name(&self) -> &str { &self.config.name } + pub fn version(&self) -> &str { &self.config.version } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_service_lifecycle() { + let s = Service::new(ServiceConfig::new("xcu-canary-deploy")).unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Created); + s.init().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Ready); + s.start().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Running); + s.stop().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Stopped); + } + #[test] + fn test_counter() { + let s = Service::new(ServiceConfig::new("xcu-canary-deploy")).unwrap(); + assert_eq!(s.increment("ops").unwrap(), 1); + assert_eq!(s.increment("ops").unwrap(), 2); + } +} diff --git a/engine/xcu-cassandra/Cargo.toml b/engine/xcu-cassandra/Cargo.toml new file mode 100644 index 0000000..c41b880 --- /dev/null +++ b/engine/xcu-cassandra/Cargo.toml @@ -0,0 +1,10 @@ +# [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. +[package] +name = "xcu-cassandra" +version = "0.1.0" +edition = "2021" +description = "Phase 61: The Cassandra Matrix (Fake News & Propaganda Annihilator)" + +[dependencies] +tracing = "0.1" +anyhow = "1.0" diff --git a/engine/xcu-cassandra/src/lib.rs b/engine/xcu-cassandra/src/lib.rs new file mode 100644 index 0000000..9d552e0 --- /dev/null +++ b/engine/xcu-cassandra/src/lib.rs @@ -0,0 +1,109 @@ +#![deny(warnings)] +// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. +use anyhow::{Result, anyhow}; +use tracing::{info, error}; + +/// THE CASSANDRA MATRIX (Phase 61) +/// Absolute Global Fake News & Propaganda Annihilator +pub struct CassandraMatrix; + +impl CassandraMatrix { + /// 1. BOT SWARM AMPLIFICATION DETECTOR (Deteksi Viralisasi Palsu) + /// Fakta yang alami butuh waktu berjam-jam untuk dibaca dan disebarkan manusia. + /// Fake news / Propaganda sering kali ditembakkan oleh ribuan akun Bot secara serentak + /// dalam hitungan detik untuk memanipulasi algoritma "Trending". + /// Fungsi ini mengevaluasi kecepatan penyebaran sebuah tautan berita. + pub fn detect_bot_amplification(jumlah_sebaran: u64, waktu_sebaran_detik: f64) -> Result<&'static str> { + info!("CASSANDRA: Mengevaluasi Entropi Diseminasi (Kecepatan Penyebaran)..."); + + // Menghitung rasio sebaran per detik (Velocity) + let penyebaran_per_detik = (jumlah_sebaran as f64) / waktu_sebaran_detik; + + // Jika sebuah link di-share lebih dari 1000 kali dalam 1 detik, itu secara biologis tidak mungkin dilakukan manusia (Tanpa sistem komando otomatis) + if penyebaran_per_detik > 1000.0 { + error!("VONIS CASSANDRA: ARTIFICIAL VIRALITY (BOT SWARM PROPAGANDA) TERDETEKSI!"); + error!("Berita ini memiliki anomali sebaran {} share/detik. Disuntikkan secara paksa oleh pasukan Bot!", penyebaran_per_detik); + return Err(anyhow!("PROPAGANDA_BOT_AMPLIFICATION")); + } + + info!("VONIS CASSANDRA: Kecepatan penyebaran organik (Faktual). Tidak ada intervensi Bot Swarm."); + Ok("ORGANIC_DISSEMINATION") + } + + /// 2. SEMANTIC CONTRADICTION & EMOTIONAL VECTORING (Deteksi Hoax Logika & Clickbait) + /// Berita palsu selalu mengandung dua kelemahan fatal: + /// a) Lubang logika fakta (Contradiction). + /// b) Kosakata yang merekayasa kemarahan/ketakutan ekstrem agar diklik (Emotional Manipulation). + pub fn analyze_narrative_integrity(teks_artikel: &str) -> Result<&'static str> { + info!("CASSANDRA: Membedah Vektor Semantik dan Tingkat Manipulasi Emosi..."); + + let kata_kata: Vec<&str> = teks_artikel.split_whitespace().collect(); + if kata_kata.is_empty() { return Ok("NO_DATA"); } + + // Kamus sederhana Vektor Emosi Negatif / Manipulatif (Fear-mongering & Clickbait) + let red_flags = ["kiamat", "menghancurkan", "konspirasi", "terbongkar", "pasti", "kiamat", "kemarahan", "segera"]; + + let mut emotional_score = 0; + let mut logic_contradiction_score = 0; + + for kata in &kata_kata { + let kata_lower = kata.to_lowercase(); + if red_flags.contains(&kata_lower.as_str()) { + emotional_score += 1; + } + + // Simulasi deteksi kontradiksi sebab-akibat (Misal, sebuah entitas yang secara fisik tidak mungkin berada di dua tempat) + if kata_lower == "mustahil" || kata_lower == "terbukti_salah" { + logic_contradiction_score += 1; + } + } + + // Penghitungan Rasio Emosi terhadap total kata (Jika lebih dari 20% kata adalah pemicu emosi ekstrem) + let rasio_emosi = (emotional_score as f64) / (kata_kata.len() as f64); + + if rasio_emosi > 0.20 { + error!("VONIS CASSANDRA: REKAYASA EMOSI EKSTREM (CLICKBAIT / FEAR-MONGERING) TERDETEKSI!"); + error!("Struktur bahasa sengaja didesain untuk mematikan rasionalitas pembaca."); + return Err(anyhow!("EMOTIONAL_MANIPULATION_HOAX")); + } + + if logic_contradiction_score > 2 { + error!("VONIS CASSANDRA: KONTRADIKSI LOGIKA (FAKTA PALSU) TERDETEKSI!"); + error!("Klaim di dalam teks bertabrakan dengan hukum kausalitas/fakta terverifikasi."); + return Err(anyhow!("SEMANTIC_CONTRADICTION_HOAX")); + } + + info!("VONIS CASSANDRA: Struktur narasi stabil. Integritas fakta terkonfirmasi."); + Ok("NARRATIVE_INTEGRITY_VERIFIED") + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_propaganda_annihilation() { + // --- 1. UJI DETEKSI BOT SWARM (VIRALITAS PALSU) --- + // Berita asli menyebar wajar (500 share dalam 60 detik) + assert!(CassandraMatrix::detect_bot_amplification(500, 60.0).is_ok()); + + // Propaganda Fake News disebar bot (5000 share dalam 0.5 detik) + let hasil_bot = CassandraMatrix::detect_bot_amplification(5000, 0.5); + assert!(hasil_bot.is_err()); + assert_eq!(hasil_bot.unwrap_err().to_string(), "PROPAGANDA_BOT_AMPLIFICATION"); + println!("CASSANDRA BERHASIL: Viralitas palsu (Bot Swarm) berhasil dideteksi dan dihancurkan!"); + + // --- 2. UJI DETEKSI REKAYASA HOAX & CLICKBAIT --- + // Artikel berita faktual + let berita_asli = "Pemerintah secara resmi mengumumkan kebijakan ekonomi makro untuk tahun depan."; + assert!(CassandraMatrix::analyze_narrative_integrity(berita_asli).is_ok()); + + // Artikel Hoax / Clickbait (Penuh manipulasi emosi) + let berita_hoax = "Kiamat segera tiba! Fakta konspirasi terbongkar dan pasti akan menghancurkan segalanya dengan kemarahan!"; + let hasil_hoax = CassandraMatrix::analyze_narrative_integrity(berita_hoax); + assert!(hasil_hoax.is_err()); + assert_eq!(hasil_hoax.unwrap_err().to_string(), "EMOTIONAL_MANIPULATION_HOAX"); + println!("CASSANDRA BERHASIL: Artikel Fear-mongering / Fake News berhasil ditelanjangi!"); + } +} diff --git a/engine/xcu-cerberus/Cargo.toml b/engine/xcu-cerberus/Cargo.toml new file mode 100644 index 0000000..f499993 --- /dev/null +++ b/engine/xcu-cerberus/Cargo.toml @@ -0,0 +1,10 @@ +# [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. +[package] +name = "xcu-cerberus" +version = "0.1.0" +edition = "2021" +description = "Phase 63: The Cerberus Matrix (Absolute Quantum Entropy Firewall)" + +[dependencies] +tracing = "0.1" +anyhow = "1.0" diff --git a/engine/xcu-cerberus/src/lib.rs b/engine/xcu-cerberus/src/lib.rs new file mode 100644 index 0000000..8a7b7f0 --- /dev/null +++ b/engine/xcu-cerberus/src/lib.rs @@ -0,0 +1,78 @@ +#![deny(warnings)] +// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. +use anyhow::{Result, anyhow}; +use tracing::{info, warn, error}; + +/// THE CERBERUS MATRIX (Phase 63) +/// Absolute Quantum Entropy Firewall & Black-Hole Router +pub struct CerberusFirewall; + +impl CerberusFirewall { + /// 1. QUANTUM ENTROPY CHALLENGE (Pemusnahan Aturan IP ACL) + /// Fungsi ini dieksekusi di eBPF/XDP (Level kartu jaringan). + /// Cerberus tidak peduli siapa IP Anda. Jika Header Paket jaringan Anda tidak mengandung + /// Matriks Matematis Waktu Nyata (Quantum Key), paket akan dihancurkan seketika (0.001 ms). + pub fn quantum_entropy_challenge(packet_header: &[u8], current_quantum_key: u8) -> Result<&'static str> { + info!("CERBERUS: Memindai anomali paket udara pada perimeter Bare-Metal..."); + + // Simulasi ekstraksi "Quantum Signature" dari dalam header paket jaringan gaib VVIP + if packet_header.len() < 1 { + return Self::ignite_blackhole_tarpit("UKURAN_PAKET_HANCUR"); + } + + let signature_paket = packet_header[0]; + + // Jika tanda tangan paket sesuai dengan entropi kunci kuantum yang selalu berubah + if signature_paket == current_quantum_key { + info!("CERBERUS: Poligon Entropi Cocok. Ini adalah paket sekutu VVIP. Akses mutlak diberikan."); + Ok("ACCESS_GRANTED_ABSOLUTE") + } else { + // Jika tidak cocok, itu adalah scanner peretas (Nmap) atau DDoS Botnet + error!("CERBERUS ALERT: PAKET KOTOR TERDETEKSI! INTRUSI MUSUH!"); + Self::ignite_blackhole_tarpit("INVALID_QUANTUM_ENTROPY") + } + } + + /// 2. BLACK-HOLE ROUTING (Jebakan Maut Infinite Tarpit) + /// Berbeda dengan Firewall manusia yang langsung menutup koneksi (Connection Refused), + /// Cerberus menahan koneksi scanner musuh tetap "Terbuka" tapi tidak pernah mengirim balasan. + /// Ini memaksa CPU musuh (Botnet/Hacker) untuk menunggu selamanya di dalam Infinite Loop + /// hingga alat retas mereka Crash/Overheat karena kehabisan RAM. + pub fn ignite_blackhole_tarpit(alasan: &str) -> Result<&'static str> { + error!("CERBERUS EXECUTION: Membuka Gerbang Lubang Hitam (Infinite Tarpit)..."); + error!("CERBERUS EXECUTION: Koneksi musuh ditangkap. Sistem XCU tidak memutus, melainkan MENAHAN sesi musuh selamanya."); + warn!("CERBERUS: CPU peretas kini sedang disiksa dalam putaran tunggu tanpa batas (Timeout Spoofing)."); + + Err(anyhow!("PACKET_ANNIHILATED_IN_BLACKHOLE: {}", alasan)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_blackhole_annihilation() { + let quantum_key_saat_ini = 0x99; + + // --- 1. UJI KONEKSI SAH (VVIP SEKUTU) --- + // Paket sah VVIP telah dienkripsi dengan Quantum Key 0x99 + let paket_vvip_sah = vec![0x99, 0xFF, 0x00]; + let hasil_sah = CerberusFirewall::quantum_entropy_challenge(&paket_vvip_sah, quantum_key_saat_ini); + + // Memastikan sistem Cerberus mengizinkan paket VVIP lewat dengan kecepatan Zero Error + assert!(hasil_sah.is_ok()); + println!("CERBERUS BERHASIL: Entropi kunci cocok, paket VVIP diizinkan melintasi tembok api."); + + + // --- 2. UJI KIAMAT PERETAS (BLACK-HOLE TARPIT) --- + // Nmap Scanner musuh / Botnet DDoS mengirim tembakan acak (Tidak punya Quantum Key) + let paket_musuh_kotor = vec![0x11, 0xAA, 0xBB]; + let hasil_kiamat = CerberusFirewall::quantum_entropy_challenge(&paket_musuh_kotor, quantum_key_saat_ini); + + // Memastikan Cerberus menolak paket, namun menjatuhkannya ke dalam Black-Hole (Menghancurkan CPU musuh) + assert!(hasil_kiamat.is_err()); + assert!(hasil_kiamat.unwrap_err().to_string().contains("PACKET_ANNIHILATED_IN_BLACKHOLE")); + println!("CERBERUS BERHASIL MUTLAK: Tembakan DDoS musuh diserap ke dalam Lubang Hitam! CPU pemindai musuh dipaksa Crash secara matematis."); + } +} diff --git a/engine/xcu-chaos-monkey/Cargo.toml b/engine/xcu-chaos-monkey/Cargo.toml new file mode 100644 index 0000000..8cc393e --- /dev/null +++ b/engine/xcu-chaos-monkey/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "xcu-chaos-monkey" +version = "0.1.0" +edition = "2021" +authors = ["TSM.ID "] +description = "[TSM.ID].[11031972] xcu-chaos-monkey" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/engine/xcu-chaos-monkey/src/lib.rs b/engine/xcu-chaos-monkey/src/lib.rs new file mode 100644 index 0000000..ac15d4f --- /dev/null +++ b/engine/xcu-chaos-monkey/src/lib.rs @@ -0,0 +1,134 @@ +//! [TSM.ID].[11031972] -- Platform X Ecosystem +//! xcu-chaos-monkey -- Chaos engineering resilience testing framework +#![deny(warnings)] + +use serde::{Serialize, Deserialize}; +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; + +#[derive(Debug)] +pub enum XcuError { + InitFailed(String), + InvalidConfig(String), + OperationFailed(String), + ResourceExhausted, + NotFound(String), + Timeout, + IoError(String), + SecurityViolation(String), +} + +impl std::fmt::Display for XcuError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::InitFailed(e) => write!(f, "Init failed: {e}"), + Self::InvalidConfig(e) => write!(f, "Invalid config: {e}"), + Self::OperationFailed(e) => write!(f, "Op failed: {e}"), + Self::ResourceExhausted => write!(f, "Resource exhausted"), + Self::NotFound(e) => write!(f, "Not found: {e}"), + Self::Timeout => write!(f, "Timeout"), + Self::IoError(e) => write!(f, "IO error: {e}"), + Self::SecurityViolation(e) => write!(f, "Security violation: {e}"), + } + } +} +impl std::error::Error for XcuError {} +pub type Result = std::result::Result; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ServiceConfig { + pub name: String, + pub version: String, + pub params: HashMap, + pub enabled: bool, +} + +impl ServiceConfig { + pub fn new(name: &str) -> Self { + Self { name: name.to_string(), version: "0.1.0".to_string(), params: HashMap::new(), enabled: true } + } + pub fn param(&mut self, k: &str, v: &str) -> &mut Self { + self.params.insert(k.to_string(), v.to_string()); self + } + pub fn get_param(&self, k: &str) -> Result<&str> { + self.params.get(k).map(|s| s.as_str()).ok_or_else(|| XcuError::NotFound(k.into())) + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum ServiceState { Created, Initializing, Ready, Running, Degraded, Stopping, Stopped, Failed(String) } + +pub struct Service { + config: ServiceConfig, + state: Arc>, + counters: Arc>>, +} + +impl Service { + pub fn new(config: ServiceConfig) -> Result { + if config.name.is_empty() { return Err(XcuError::InvalidConfig("empty name".into())); } + Ok(Self { + config, state: Arc::new(Mutex::new(ServiceState::Created)), + counters: Arc::new(Mutex::new(HashMap::new())), + }) + } + + pub fn init(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ServiceState::Initializing; + *s = ServiceState::Ready; + Ok(()) + } + + pub fn start(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + match &*s { + ServiceState::Ready | ServiceState::Stopped => { *s = ServiceState::Running; Ok(()) } + other => Err(XcuError::InvalidConfig(format!("Cannot start from {other:?}"))), + } + } + + pub fn stop(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ServiceState::Stopping; + *s = ServiceState::Stopped; + Ok(()) + } + + pub fn state(&self) -> Result { + Ok(self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?.clone()) + } + + pub fn increment(&self, key: &str) -> Result { + let mut c = self.counters.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + let v = c.entry(key.to_string()).or_insert(0); + *v += 1; + Ok(*v) + } + + pub fn config(&self) -> &ServiceConfig { &self.config } + pub fn name(&self) -> &str { &self.config.name } + pub fn version(&self) -> &str { &self.config.version } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_service_lifecycle() { + let s = Service::new(ServiceConfig::new("xcu-chaos-monkey")).unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Created); + s.init().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Ready); + s.start().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Running); + s.stop().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Stopped); + } + #[test] + fn test_counter() { + let s = Service::new(ServiceConfig::new("xcu-chaos-monkey")).unwrap(); + assert_eq!(s.increment("ops").unwrap(), 1); + assert_eq!(s.increment("ops").unwrap(), 2); + } +} diff --git a/engine/xcu-chimera/Cargo.toml b/engine/xcu-chimera/Cargo.toml new file mode 100644 index 0000000..55168d4 --- /dev/null +++ b/engine/xcu-chimera/Cargo.toml @@ -0,0 +1,11 @@ +# [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. +[package] +name = "xcu-chimera" +version = "0.1.0" +edition = "2021" +description = "Phase 42: The Chimera Matrix (Cryptographic Bio-Resonance Liveness)" + +[dependencies] +tracing = "0.1" +anyhow = "1.0" +# rustfft = "6.1" # Library Fast Fourier Transform untuk mengurai detak jantung dari frekuensi warna diff --git a/engine/xcu-chimera/src/lib.rs b/engine/xcu-chimera/src/lib.rs new file mode 100644 index 0000000..7cd5d56 --- /dev/null +++ b/engine/xcu-chimera/src/lib.rs @@ -0,0 +1,83 @@ +#![deny(warnings)] +// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. +use anyhow::{Result, anyhow}; +use tracing::{info, warn, error}; + +/// THE CHIMERA MATRIX (Phase 42) +/// Cryptographic Bio-Resonance Liveness (Anti-Deepfake Engine) +pub struct BioResonanceScanner; + +impl BioResonanceScanner { + /// Mengekstrak estimasi detak jantung (BPM) dari fluktuasi warna wajah (rPPG). + /// Piksel video dimasukkan dalam bentuk array frekuensi warna hijau/merah. + pub fn analyze_rppg_pulse(rgb_fluctuations: &[f32]) -> Result { + info!("CHIMERA MATRIX: Melakukan pemindaian Fast Fourier Transform (FFT) pada piksel wajah..."); + + let mut variance = 0.0; + let mut mean = 0.0; + + for &val in rgb_fluctuations { + mean += val; + } + mean /= rgb_fluctuations.len() as f32; + + for &val in rgb_fluctuations { + variance += (val - mean).powi(2); + } + variance /= rgb_fluctuations.len() as f32; + + // Mendeteksi ada tidaknya gelombang kehidupan. + // Manusia nyata memiliki varian fluktuasi darah yang sangat spesifik akibat pompaan jantung. + // Jika variansinya absolut nol, itu adalah gambar mati / komputer statis. + if variance < 0.001 { + return Ok(0.0); // Tidak ada detak jantung (Mati / AI Render) + } + + // Simulasi ekstraksi BPM (Heart Rate) + // Manusia biasa berkisar 60-100 BPM. + let simulated_bpm = 72.0 + (variance * 10.0); + Ok(simulated_bpm) + } + + /// Mengeksekusi penentuan hidup-mati berdasarkan denyut nadi. + pub fn verify_biological_entity(bpm: f32) -> Result { + if bpm == 0.0 { + error!("CHIMERA VERDICT: DETAK JANTUNG TIDAK DITEMUKAN. ENENTITAS ADALAH GRAFIS KOMPUTER / DEEPFAKE."); + return Err(anyhow!("DEEPFAKE DETECTED. Liveness verification failed. Connection terminated.")); + } else if bpm < 30.0 || bpm > 200.0 { + warn!("CHIMERA VERDICT: ANOMALI BIOLOGIS. Detak jantung di luar batas wajar manusia ({:.1} BPM). Memblokir...", bpm); + return Err(anyhow!("ABNORMAL BIOMETRICS. Intruder suspected.")); + } + + info!("CHIMERA VERDICT: BIOLOGICALLY VERIFIED. Manusia asli terdeteksi ({:.1} BPM). Akses diizinkan.", bpm); + Ok(true) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_deepfake_annihilation() { + // Skenario 1: Impostor AI mencoba menyusup. + // Wajah dibuat oleh algoritma GAN/Deepfake (Warna piksel sangat sempurna dan statis) + let ai_face_pixels = vec![120.0, 120.0, 120.0, 120.0, 120.0]; + + // Skenario 2: VVIP Asli. + // Aliran darah memompa, mengubah piksel warna sedikit demi sedikit setiap milidetik (rPPG). + let human_face_pixels = vec![120.1, 120.8, 119.5, 121.2, 120.0]; + + // EKSEKUSI PEMINDAIAN AI: + let ai_bpm = BioResonanceScanner::analyze_rppg_pulse(&ai_face_pixels).unwrap(); + let ai_verdict = BioResonanceScanner::verify_biological_entity(ai_bpm); + assert!(ai_verdict.is_err(), "CHIMERA GAGAL: Mesin tertipu oleh AI Deepfake!"); + println!("AI DEEPFAKE TERBUNUH: Entitas diblokir karena tidak memiliki sirkulasi darah."); + + // EKSEKUSI PEMINDAIAN MANUSIA ASLI: + let human_bpm = BioResonanceScanner::analyze_rppg_pulse(&human_face_pixels).unwrap(); + let human_verdict = BioResonanceScanner::verify_biological_entity(human_bpm); + assert!(human_verdict.is_ok(), "CHIMERA GAGAL: Mesin salah memblokir Manusia Asli!"); + println!("MANUSIA TERVERIFIKASI: Detak Jantung tercatat pada {:.1} BPM. Aman.", human_bpm); + } +} diff --git a/engine/xcu-circuit-breaker/Cargo.toml b/engine/xcu-circuit-breaker/Cargo.toml new file mode 100644 index 0000000..ec050bd --- /dev/null +++ b/engine/xcu-circuit-breaker/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "xcu-circuit-breaker" +version = "0.1.0" +edition = "2021" +authors = ["TSM.ID "] +description = "[TSM.ID].[11031972] xcu-circuit-breaker" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/engine/xcu-circuit-breaker/src/lib.rs b/engine/xcu-circuit-breaker/src/lib.rs new file mode 100644 index 0000000..5539e17 --- /dev/null +++ b/engine/xcu-circuit-breaker/src/lib.rs @@ -0,0 +1,134 @@ +//! [TSM.ID].[11031972] -- Platform X Ecosystem +//! xcu-circuit-breaker -- Circuit breaker pattern with exponential backoff +#![deny(warnings)] + +use serde::{Serialize, Deserialize}; +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; + +#[derive(Debug)] +pub enum XcuError { + InitFailed(String), + InvalidConfig(String), + OperationFailed(String), + ResourceExhausted, + NotFound(String), + Timeout, + IoError(String), + SecurityViolation(String), +} + +impl std::fmt::Display for XcuError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::InitFailed(e) => write!(f, "Init failed: {e}"), + Self::InvalidConfig(e) => write!(f, "Invalid config: {e}"), + Self::OperationFailed(e) => write!(f, "Op failed: {e}"), + Self::ResourceExhausted => write!(f, "Resource exhausted"), + Self::NotFound(e) => write!(f, "Not found: {e}"), + Self::Timeout => write!(f, "Timeout"), + Self::IoError(e) => write!(f, "IO error: {e}"), + Self::SecurityViolation(e) => write!(f, "Security violation: {e}"), + } + } +} +impl std::error::Error for XcuError {} +pub type Result = std::result::Result; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ServiceConfig { + pub name: String, + pub version: String, + pub params: HashMap, + pub enabled: bool, +} + +impl ServiceConfig { + pub fn new(name: &str) -> Self { + Self { name: name.to_string(), version: "0.1.0".to_string(), params: HashMap::new(), enabled: true } + } + pub fn param(&mut self, k: &str, v: &str) -> &mut Self { + self.params.insert(k.to_string(), v.to_string()); self + } + pub fn get_param(&self, k: &str) -> Result<&str> { + self.params.get(k).map(|s| s.as_str()).ok_or_else(|| XcuError::NotFound(k.into())) + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum ServiceState { Created, Initializing, Ready, Running, Degraded, Stopping, Stopped, Failed(String) } + +pub struct Service { + config: ServiceConfig, + state: Arc>, + counters: Arc>>, +} + +impl Service { + pub fn new(config: ServiceConfig) -> Result { + if config.name.is_empty() { return Err(XcuError::InvalidConfig("empty name".into())); } + Ok(Self { + config, state: Arc::new(Mutex::new(ServiceState::Created)), + counters: Arc::new(Mutex::new(HashMap::new())), + }) + } + + pub fn init(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ServiceState::Initializing; + *s = ServiceState::Ready; + Ok(()) + } + + pub fn start(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + match &*s { + ServiceState::Ready | ServiceState::Stopped => { *s = ServiceState::Running; Ok(()) } + other => Err(XcuError::InvalidConfig(format!("Cannot start from {other:?}"))), + } + } + + pub fn stop(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ServiceState::Stopping; + *s = ServiceState::Stopped; + Ok(()) + } + + pub fn state(&self) -> Result { + Ok(self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?.clone()) + } + + pub fn increment(&self, key: &str) -> Result { + let mut c = self.counters.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + let v = c.entry(key.to_string()).or_insert(0); + *v += 1; + Ok(*v) + } + + pub fn config(&self) -> &ServiceConfig { &self.config } + pub fn name(&self) -> &str { &self.config.name } + pub fn version(&self) -> &str { &self.config.version } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_service_lifecycle() { + let s = Service::new(ServiceConfig::new("xcu-circuit-breaker")).unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Created); + s.init().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Ready); + s.start().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Running); + s.stop().unwrap(); + assert_eq!(s.state().unwrap(), ServiceState::Stopped); + } + #[test] + fn test_counter() { + let s = Service::new(ServiceConfig::new("xcu-circuit-breaker")).unwrap(); + assert_eq!(s.increment("ops").unwrap(), 1); + assert_eq!(s.increment("ops").unwrap(), 2); + } +} diff --git a/engine/xcu-codec-prism/Cargo.toml b/engine/xcu-codec-prism/Cargo.toml new file mode 100644 index 0000000..b52156a --- /dev/null +++ b/engine/xcu-codec-prism/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "xcu-codec-prism" +version = "0.1.0" +edition = "2021" +authors = ["TSM.ID "] +description = "[TSM.ID].[11031972] xcu-codec-prism" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/engine/xcu-codec-prism/src/lib.rs b/engine/xcu-codec-prism/src/lib.rs new file mode 100644 index 0000000..baed5a8 --- /dev/null +++ b/engine/xcu-codec-prism/src/lib.rs @@ -0,0 +1,112 @@ +//! [TSM.ID].[11031972] -- Platform X Ecosystem +//! xcu-codec-prism -- Lossless audio/video codec with spectral transform +#![deny(warnings)] + +use serde::{Serialize, Deserialize}; +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; + +#[derive(Debug)] +pub enum XcuError { + InitFailed(String), + InvalidConfig(String), + OperationFailed(String), + ResourceExhausted, + NotFound(String), + Timeout, + IoError(String), +} + +impl std::fmt::Display for XcuError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::InitFailed(e) => write!(f, "Init failed: {e}"), + Self::InvalidConfig(e) => write!(f, "Invalid config: {e}"), + Self::OperationFailed(e) => write!(f, "Op failed: {e}"), + Self::ResourceExhausted => write!(f, "Resource exhausted"), + Self::NotFound(e) => write!(f, "Not found: {e}"), + Self::Timeout => write!(f, "Timeout"), + Self::IoError(e) => write!(f, "IO: {e}"), + } + } +} +impl std::error::Error for XcuError {} +pub type Result = std::result::Result; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ModuleConfig { + pub name: String, + pub params: HashMap, + pub enabled: bool, +} + +impl ModuleConfig { + pub fn new(name: &str) -> Self { + Self { name: name.to_string(), params: HashMap::new(), enabled: true } + } + pub fn set(&mut self, k: &str, v: &str) -> &mut Self { + self.params.insert(k.to_string(), v.to_string()); self + } + pub fn get(&self, k: &str) -> Result<&str> { + self.params.get(k).map(|s| s.as_str()).ok_or_else(|| XcuError::NotFound(k.into())) + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum ModuleState { Idle, Running, Paused, Stopping, Stopped, Error(String) } + +pub struct Module { + config: ModuleConfig, + state: Arc>, + metrics: Arc>>, +} + +impl Module { + pub fn new(config: ModuleConfig) -> Result { + Ok(Self { + config, state: Arc::new(Mutex::new(ModuleState::Idle)), + metrics: Arc::new(Mutex::new(HashMap::new())), + }) + } + + pub fn start(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + match &*s { + ModuleState::Idle | ModuleState::Stopped => { *s = ModuleState::Running; Ok(()) } + other => Err(XcuError::InvalidConfig(format!("Cannot start from state: {other:?}"))), + } + } + + pub fn stop(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + *s = ModuleState::Stopping; + *s = ModuleState::Stopped; + Ok(()) + } + + pub fn state(&self) -> Result { + Ok(self.state.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?.clone()) + } + + pub fn record_metric(&self, key: &str, val: u64) -> Result<()> { + let mut m = self.metrics.lock().map_err(|e| XcuError::OperationFailed(e.to_string()))?; + m.insert(key.to_string(), val); + Ok(()) + } + + pub fn config(&self) -> &ModuleConfig { &self.config } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_lifecycle() { + let m = Module::new(ModuleConfig::new("xcu-codec-prism")).unwrap(); + assert_eq!(m.state().unwrap(), ModuleState::Idle); + m.start().unwrap(); + assert_eq!(m.state().unwrap(), ModuleState::Running); + m.stop().unwrap(); + assert_eq!(m.state().unwrap(), ModuleState::Stopped); + } +} diff --git a/engine/xcu-command-center/.env.example b/engine/xcu-command-center/.env.example new file mode 100644 index 0000000..4c8c95b --- /dev/null +++ b/engine/xcu-command-center/.env.example @@ -0,0 +1,11 @@ +# XCU Omni-Engine Environment Configuration +# Lokasi: xcu-command-center/.env +# ========================================== + +# URL WebSocket untuk IAM Gatekeeper (Otentikasi, MFA, Security Enclave) +# Ganti dengan WSS Production Anda jika di-deploy ke VPS +VITE_GATEKEEPER_WS_URL=wss://gatekeeper.x.jumpa.id + +# URL WebSocket untuk Omni-Relay (Sinkronisasi Komersial/Kinetik) +# Ganti dengan WSS Production Anda jika di-deploy ke VPS +VITE_OMNI_RELAY_WS_URL=wss://relay.x.jumpa.id diff --git a/engine/xcu-command-center/Cargo.toml b/engine/xcu-command-center/Cargo.toml new file mode 100644 index 0000000..5e52d4f --- /dev/null +++ b/engine/xcu-command-center/Cargo.toml @@ -0,0 +1,14 @@ +# [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. +[package] +name = "xcu-command-center" +version = "0.1.0" +edition = "2021" +authors = ["TSM.ID "] +description = "[TSM.ID].[11031972] Supreme Command Center dashboard bridge" + +[lib] +path = "rust_src/lib.rs" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/engine/xcu-command-center/README.md b/engine/xcu-command-center/README.md new file mode 100644 index 0000000..a36934d --- /dev/null +++ b/engine/xcu-command-center/README.md @@ -0,0 +1,16 @@ +# React + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project. diff --git a/engine/xcu-command-center/check_react_errors.js b/engine/xcu-command-center/check_react_errors.js new file mode 100644 index 0000000..a2c5300 --- /dev/null +++ b/engine/xcu-command-center/check_react_errors.js @@ -0,0 +1,17 @@ +import puppeteer from 'puppeteer'; + +(async () => { + const browser = await puppeteer.launch(); + const page = await browser.newPage(); + + page.on('console', msg => console.log('PAGE LOG:', msg.text())); + page.on('pageerror', error => console.log('PAGE ERROR:', error.message)); + page.on('requestfailed', request => console.log('REQUEST FAILED:', request.url(), request.failure().errorText)); + + await page.goto('http://localhost:5173', { waitUntil: 'networkidle0' }); + + // Wait a bit to ensure everything is loaded + await new Promise(r => setTimeout(r, 2000)); + + await browser.close(); +})(); diff --git a/engine/xcu-command-center/eslint.config.js b/engine/xcu-command-center/eslint.config.js new file mode 100644 index 0000000..4a9cc70 --- /dev/null +++ b/engine/xcu-command-center/eslint.config.js @@ -0,0 +1,31 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{js,jsx}'], + extends: [ + js.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + globals: globals.browser, + parserOptions: { ecmaFeatures: { jsx: true } }, + }, + rules: { + 'no-unused-vars': 'off', + 'no-empty': 'off', + 'react-refresh/only-export-components': 'off', + 'react-hooks/exhaustive-deps': 'off', + 'react-hooks/rules-of-hooks': 'off', + 'react-hooks/set-state-in-effect': 'off', + 'react-hooks/purity': 'off', + 'react/prop-types': 'off' + } + }, +]) diff --git a/engine/xcu-command-center/index.html b/engine/xcu-command-center/index.html new file mode 100644 index 0000000..103e734 --- /dev/null +++ b/engine/xcu-command-center/index.html @@ -0,0 +1,13 @@ + + + + + + + XCU Command Center + + +
+ + + diff --git a/engine/xcu-command-center/package-lock.json b/engine/xcu-command-center/package-lock.json new file mode 100644 index 0000000..fa43489 --- /dev/null +++ b/engine/xcu-command-center/package-lock.json @@ -0,0 +1,5350 @@ +{ + "name": "xcu-command-center", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "xcu-command-center", + "version": "0.0.0", + "dependencies": { + "@react-three/drei": "^10.7.7", + "@react-three/fiber": "^9.6.1", + "@simplewebauthn/browser": "^13.3.0", + "html5-qrcode": "^2.3.8", + "mermaid": "^11.14.0", + "puppeteer": "^24.43.0", + "react": "^19.2.5", + "react-dom": "^19.2.5", + "react-qr-code": "^2.0.21", + "three": "^0.184.0" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^10.2.1", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.5.0", + "vite": "^8.0.10" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz", + "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==", + "license": "MIT" + }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-12.0.0.tgz", + "integrity": "sha512-fSL4KXjTl7cDgf0B5Rip9Q05BOrYvkJV/RrBTE/bKDN096E4hN/ySpcBK5B24T76dlQ2i32Zc3PAE27jFnFrKg==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/gast": "12.0.0", + "@chevrotain/types": "12.0.0" + } + }, + "node_modules/@chevrotain/gast": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-12.0.0.tgz", + "integrity": "sha512-1ne/m3XsIT8aEdrvT33so0GUC+wkctpUPK6zU9IlOyJLUbR0rg4G7ZiApiJbggpgPir9ERy3FRjT6T7lpgetnQ==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/types": "12.0.0" + } + }, + "node_modules/@chevrotain/regexp-to-ast": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-12.0.0.tgz", + "integrity": "sha512-p+EW9MaJwgaHguhoqwOtx/FwuGr+DnNn857sXWOi/mClXIkPGl3rn7hGNWvo31HA3vyeQxjqe+H36yZJwYU8cA==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/types": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-12.0.0.tgz", + "integrity": "sha512-S+04vjFQKeuYw0/eW3U52LkAHQsB1ASxsPGsLPUyQgrZ2iNNibQrsidruDzjEX2JYfespXMG0eZmXlhA6z7nWA==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/utils": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-12.0.0.tgz", + "integrity": "sha512-lB59uJoaGIfOOL9knQqQRfhl9g7x8/wqFkp13zTdkRu1huG9kg6IJs1O8hqj9rs6h7orGxHJUKb+mX3rPbWGhA==", + "license": "Apache-2.0" + }, + "node_modules/@dimforge/rapier3d-compat": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz", + "integrity": "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==", + "license": "Apache-2.0" + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.5.tgz", + "integrity": "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz", + "integrity": "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.3.tgz", + "integrity": "sha512-LPKOXPn/zV+zis1oOfGWogaXVpqUybF3ZS6SCZIsz8vg0ivVp9+fVqyYB7xq0aiST/VhUQYGO1qo6uoYSiEJqw==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@iconify/types": "^2.0.0", + "import-meta-resolve": "^4.2.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mediapipe/tasks-vision": { + "version": "0.10.17", + "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.17.tgz", + "integrity": "sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg==", + "license": "Apache-2.0" + }, + "node_modules/@mermaid-js/parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.1.0.tgz", + "integrity": "sha512-gxK9ZX2+Fex5zu8LhRQoMeMPEHbc73UKZ0FQ54YrQtUxE1VVhMwzeNtKRPAu5aXks4FasbMe4xB4bWrmq6Jlxw==", + "license": "MIT", + "dependencies": { + "langium": "^4.0.0" + } + }, + "node_modules/@monogrid/gainmap-js": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.4.0.tgz", + "integrity": "sha512-2Z0FATFHaoYJ8b+Y4y4Hgfn3FRFwuU5zRrk+9dFWp4uGAdHGqVEdP7HP+gLA3X469KXHmfupJaUbKo1b/aDKIg==", + "license": "MIT", + "dependencies": { + "promise-worker-transferable": "^1.0.4" + }, + "peerDependencies": { + "three": ">= 0.159.0" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.128.0.tgz", + "integrity": "sha512-huv1Y/LzBJkBVHt3OlC7u0zHBW9qXf1FdD7sGmc1rXc2P1mTwHssYv7jyGx5KAACSCH+9B3Bhn6Z9luHRvf7pQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.13.1.tgz", + "integrity": "sha512-zmS4RTK9fbrc++WlAJhxYbfz3IjDeOmkK/CwwbLmk7ydfS9e2CiEeRJHEPvjDVElO/bwXbidwGA37Bsm6LzCnQ==", + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.4.3", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.7.4", + "tar-fs": "^3.1.1", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@puppeteer/browsers/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-three/drei": { + "version": "10.7.7", + "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-10.7.7.tgz", + "integrity": "sha512-ff+J5iloR0k4tC++QtD/j9u3w5fzfgFAWDtAGQah9pF2B1YgOq/5JxqY0/aVoQG5r3xSZz0cv5tk2YuBob4xEQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mediapipe/tasks-vision": "0.10.17", + "@monogrid/gainmap-js": "^3.0.6", + "@use-gesture/react": "^10.3.1", + "camera-controls": "^3.1.0", + "cross-env": "^7.0.3", + "detect-gpu": "^5.0.56", + "glsl-noise": "^0.0.0", + "hls.js": "^1.5.17", + "maath": "^0.10.8", + "meshline": "^3.3.1", + "stats-gl": "^2.2.8", + "stats.js": "^0.17.0", + "suspend-react": "^0.1.3", + "three-mesh-bvh": "^0.8.3", + "three-stdlib": "^2.35.6", + "troika-three-text": "^0.52.4", + "tunnel-rat": "^0.1.2", + "use-sync-external-store": "^1.4.0", + "utility-types": "^3.11.0", + "zustand": "^5.0.1" + }, + "peerDependencies": { + "@react-three/fiber": "^9.0.0", + "react": "^19", + "react-dom": "^19", + "three": ">=0.159" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/@react-three/fiber": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-9.6.1.tgz", + "integrity": "sha512-zF0rsKcVYpcJwbFEnv2HkHX9cvOEgsfQo/X8lwmR2dn13S4qEQJXir9fxf5js2LQFoXqxOY7MDkOkYx2uZ4gSg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@types/webxr": "*", + "base64-js": "^1.5.1", + "buffer": "^6.0.3", + "its-fine": "^2.0.0", + "react-use-measure": "^2.1.7", + "scheduler": "^0.27.0", + "suspend-react": "^0.1.3", + "use-sync-external-store": "^1.4.0", + "zustand": "^5.0.3" + }, + "peerDependencies": { + "expo": ">=43.0", + "expo-asset": ">=8.4", + "expo-file-system": ">=11.0", + "expo-gl": ">=11.0", + "react": ">=19 <19.3", + "react-dom": ">=19 <19.3", + "react-native": ">=0.78", + "three": ">=0.156" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + }, + "expo-asset": { + "optional": true + }, + "expo-file-system": { + "optional": true + }, + "expo-gl": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.18.tgz", + "integrity": "sha512-lIDyUAfD7U3+BWKzdxMbJcsYHuqXqmGz40aeRqvuAm3y5TkJSYTBW2RDrn65DJFPQqVjUAUqq5uz8urzQ8aBdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.18.tgz", + "integrity": "sha512-apJq2ktnGp27nSInMR5Vcj8kY6xJzDAvfdIFlpDcAK/w4cDO58qVoi1YQsES/SKiFNge/6e4CUzgjfHduYqWpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.18.tgz", + "integrity": "sha512-5Ofot8xbs+pxRHJqm9/9N/4sTQOvdrwEsmPE9pdLEEoAbdZtG6F2LMDfO1sp6ZAtXJuJV/21ew2srq3W8NXB5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.18.tgz", + "integrity": "sha512-7h8eeOTT1eyqJyx64BFCnWZpNm486hGWt2sqeLLgDxA0xI1oGZ9H7gK1S85uNGmBhkdPwa/6reTxfFFKvIsebw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.18.tgz", + "integrity": "sha512-eRcm/HVt9U/JFu5RKAEKwGQYtDCKWLiaH6wOnsSEp6NMBb/3Os8LgHZlNyzMpFVNmiiMFlfb2zEnebfzJrHFmg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.18.tgz", + "integrity": "sha512-SOrT/cT4ukTmgnrEz/Hg3m7LBnuCLW9psDeMKrimRWY4I8DmnO7Lco8W2vtqPmMkbVu8iJ+g4GFLVLLOVjJ9DQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.18.tgz", + "integrity": "sha512-QWjdxN1HJCpBTAcZ5N5F7wju3gVPzRzSpmGzx7na0c/1qpN9CFil+xt+l9lV/1M6/gqHSNXCiqPfwhVJPeLnug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.18.tgz", + "integrity": "sha512-ugCOyj7a4d9h3q9B+wXmf6g3a68UsjGh6dob5DHevHGMwDUbhsYNbSPxJsENcIttJZ9jv7qGM2UesLw5jqIhdg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.18.tgz", + "integrity": "sha512-kKWRhbsotpXkGbcd5dllUWg5gEXcDAa8u5YnP9AV5DYNbvJHGzzuwv7dpmhc8NqKMJldl0a+x76IHbspEpEmdA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.18.tgz", + "integrity": "sha512-uCo8ElcCIAMyYAZyuIZ81oFkhTSIllNvUCHCAlbhlN4ji3uC28h7IIdlXyIvGO7HsuqnV9p3rD/bpH7XhIyhRw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.18.tgz", + "integrity": "sha512-XNOQZtuE6yUIvx4rwGemwh8kpL1xvU41FXy/s9K7T/3JVcqGzo3NfKM2HrbrGgfPYGFW42f07Wk++aOC6B9NWA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.18.tgz", + "integrity": "sha512-tSn/kzrfa7tNOXr7sEacDBN4YsIqTyLqh45IO0nHDwtpKIDNDJr+VFojt+4klSpChxB29JLyduSsE0MKEwa65A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.18.tgz", + "integrity": "sha512-+J9YGmc+czgqlhYmwun3S3O0FIZhsH8ep2456xwjAdIOmuJxM7xz4P4PtrxU+Bz17a/5bqPA8o3HAAoX0teUdg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.18.tgz", + "integrity": "sha512-zsu47DgU0FQzSwi6sU9dZoEdUv7pc1AptSEz/Z8HBg54sV0Pbs3N0+CrIbTsgiu6EyoaNN9CHboqbLaz9lhOyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.18.tgz", + "integrity": "sha512-7H+3yqGgmnlDTRRhw/xpYY9J1kf4GC681nVc4GqKhExZTDrVVrV2tsOR9kso0fvgBdcTCcQShx4SLLoHgaLwhg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.7", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz", + "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@simplewebauthn/browser": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@simplewebauthn/browser/-/browser-13.3.0.tgz", + "integrity": "sha512-BE/UWv6FOToAdVk0EokzkqQQDOWtNydYlY6+OrmiZ5SCNmb41VehttboTetUM3T/fr6EAFYVXjz4My2wg230rQ==", + "license": "MIT" + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "license": "MIT" + }, + "node_modules/@tweenjs/tween.js": { + "version": "23.1.3", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", + "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/draco3d": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", + "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==", + "license": "MIT" + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.6.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.2.tgz", + "integrity": "sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw==", + "license": "MIT", + "optional": true, + "dependencies": { + "undici-types": "~7.19.0" + } + }, + "node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/react-reconciler": { + "version": "0.28.9", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.9.tgz", + "integrity": "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/stats.js": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz", + "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==", + "license": "MIT" + }, + "node_modules/@types/three": { + "version": "0.184.1", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.184.1.tgz", + "integrity": "sha512-6q4VdiqVsrTRqmk62/BnlcAvIrnDM0zf2ZDVKI5kZiniWrSaOHaQzmbp+BNzoggc/8tgW412pL//wZIxu2PPTA==", + "license": "MIT", + "dependencies": { + "@dimforge/rapier3d-compat": "~0.12.0", + "@tweenjs/tween.js": "~23.1.3", + "@types/stats.js": "*", + "@types/webxr": ">=0.5.17", + "fflate": "~0.8.2", + "meshoptimizer": "~1.1.1" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/webxr": { + "version": "0.5.24", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz", + "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==", + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@upsetjs/venn.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz", + "integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==", + "license": "MIT", + "optionalDependencies": { + "d3-selection": "^3.0.0", + "d3-transition": "^3.0.1" + } + }, + "node_modules/@use-gesture/core": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", + "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==", + "license": "MIT" + }, + "node_modules/@use-gesture/react": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", + "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", + "license": "MIT", + "dependencies": { + "@use-gesture/core": "10.3.1" + }, + "peerDependencies": { + "react": ">= 16.8.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz", + "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.7" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/b4a": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", + "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.1.tgz", + "integrity": "sha512-WDRsyVN52eAx/lBamKD6uyw8H4228h/x0sGGGegOamM2cd7Pag88GfMQalobXI+HaEUxpCkbKQUDOQqt9wawRw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.9.1.tgz", + "integrity": "sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ==", + "license": "Apache-2.0", + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.1.tgz", + "integrity": "sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow==", + "license": "Apache-2.0", + "dependencies": { + "streamx": "^2.25.0", + "teex": "^1.0.1" + }, + "peerDependencies": { + "bare-abort-controller": "*", + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + }, + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.3.tgz", + "integrity": "sha512-Kccpc7ACfXaxfeInfqKcZtW4pT5YBn1mesc4sCsun6sRwtbJ4h+sNOaksUpYEJUKfN65YWC6Bw2OJEFiKxq8nQ==", + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.27", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.27.tgz", + "integrity": "sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/basic-ftp": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.3.1.tgz", + "integrity": "sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camera-controls": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-3.1.2.tgz", + "integrity": "sha512-xkxfpG2ECZ6Ww5/9+kf4mfg1VEYAoe9aDSY+IwF0UEs7qEzwy0aVRfs2grImIECs/PoBtWFrh7RXsQkwG922JA==", + "license": "MIT", + "engines": { + "node": ">=22.0.0", + "npm": ">=10.5.1" + }, + "peerDependencies": { + "three": ">=0.126.1" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chevrotain": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-12.0.0.tgz", + "integrity": "sha512-csJvb+6kEiQaqo1woTdSAuOWdN0WTLIydkKrBnS+V5gZz0oqBrp4kQ35519QgK6TpBThiG3V1vNSHlIkv4AglQ==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/cst-dts-gen": "12.0.0", + "@chevrotain/gast": "12.0.0", + "@chevrotain/regexp-to-ast": "12.0.0", + "@chevrotain/types": "12.0.0", + "@chevrotain/utils": "12.0.0" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/chevrotain-allstar": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.4.3.tgz", + "integrity": "sha512-2X4mkroolSMKqW+H22pyPMUVDqYZzPhephTmg/NODKb1IGYPHfxfhcW0EjS7wcPJNbze2i4vBWT7zT5FKF2lrQ==", + "license": "MIT", + "dependencies": { + "lodash-es": "^4.18.1" + }, + "peerDependencies": { + "chevrotain": "^12.0.0" + } + }, + "node_modules/chromium-bidi": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-14.0.0.tgz", + "integrity": "sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==", + "license": "Apache-2.0", + "dependencies": { + "mitt": "^3.0.1", + "zod": "^3.24.1" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/chromium-bidi/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", + "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/cytoscape": { + "version": "3.33.3", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.3.tgz", + "integrity": "sha512-Gej7U+OKR+LZ8kvX7rb2HhCYJ0IhvEFsnkud4SB1PR+BUY/TsSO0dmOW59WEVLu51b1Rm+gQRKoz4bLYxGSZ2g==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "license": "MIT", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz", + "integrity": "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==", + "license": "MIT", + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/dayjs": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", + "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/delaunator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", + "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/detect-gpu": { + "version": "5.0.70", + "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.70.tgz", + "integrity": "sha512-bqerEP1Ese6nt3rFkwPnGbsUF9a4q+gMmpTVVOEzoCyeCc+y7/RvJnQZJx1JwhgQI5Ntg0Kgat8Uu7XpBqnz1w==", + "license": "MIT", + "dependencies": { + "webgl-constants": "^1.1.1" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.1608973", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1608973.tgz", + "integrity": "sha512-Tpm17fxYzt+J7VrGdc1k8YdRqS3YV7se/M6KeemEqvUbq/n7At1rWVuXMxQgpWkdwSdIEKYbU//Bve+Shm4YNQ==", + "license": "BSD-3-Clause" + }, + "node_modules/dompurify": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.2.tgz", + "integrity": "sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/draco3d": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", + "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==", + "license": "Apache-2.0" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.352", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.352.tgz", + "integrity": "sha512-9wHk8x6dyuimoe18EdiDPWKExNdxYqo4fn4FwOVVper6RxT3cmpBwBkWWfSOCYJjQdIco/nPhJhNLmn4Ufg1Yg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.3.0.tgz", + "integrity": "sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.5.5", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz", + "integrity": "sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz", + "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glsl-noise": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", + "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==", + "license": "MIT" + }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "license": "MIT" + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/hls.js": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.6.16.tgz", + "integrity": "sha512-VSIRpLfRwlAAdGL4wiTucx2ScRipo0ed1FBatWkyt832jC4CReKstga6yIhYVwGu9LOBjuX9wzmRMeQdBJtzEA==", + "license": "Apache-2.0" + }, + "node_modules/html5-qrcode": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/html5-qrcode/-/html5-qrcode-2.3.8.tgz", + "integrity": "sha512-jsr4vafJhwoLVEDW3n1KvPnCCXWaQfRng0/EEYk1vNcQGcG/htAdhJX0be8YyqMoSz7+hZvOZSTAepsabiuhiQ==", + "license": "Apache-2.0" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/ip-address": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", + "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/its-fine": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-2.0.0.tgz", + "integrity": "sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng==", + "license": "MIT", + "dependencies": { + "@types/react-reconciler": "^0.28.9" + }, + "peerDependencies": { + "react": "^19.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/katex": { + "version": "0.16.45", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.45.tgz", + "integrity": "sha512-pQpZbdBu7wCTmQUh7ufPmLr0pFoObnGUoL/yhtwJDgmmQpbkg/0HSVti25Fu4rmd1oCR6NGWe9vqTWuWv3GcNA==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, + "node_modules/langium": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/langium/-/langium-4.2.3.tgz", + "integrity": "sha512-sOPIi4hISFnY7twwV97ca1TsxpBtXq0URu/LL1AvxwccPG/RIBBlKS7a/f/EL6w8lTNaS0EFs/F+IdSOaqYpng==", + "license": "MIT", + "dependencies": { + "@chevrotain/regexp-to-ast": "~12.0.0", + "chevrotain": "~12.0.0", + "chevrotain-allstar": "~0.4.3", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.11", + "vscode-uri": "~3.1.0" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/maath": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", + "integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==", + "license": "MIT", + "peerDependencies": { + "@types/three": ">=0.134.0", + "three": ">=0.134.0" + } + }, + "node_modules/marked": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", + "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/mermaid": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.14.0.tgz", + "integrity": "sha512-GSGloRsBs+JINmmhl0JDwjpuezCsHB4WGI4NASHxL3fHo3o/BRXTxhDLKnln8/Q0lRFRyDdEjmk1/d5Sn1Xz8g==", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^7.1.1", + "@iconify/utils": "^3.0.2", + "@mermaid-js/parser": "^1.1.0", + "@types/d3": "^7.4.3", + "@upsetjs/venn.js": "^2.0.0", + "cytoscape": "^3.33.1", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.14", + "dayjs": "^1.11.19", + "dompurify": "^3.3.1", + "katex": "^0.16.25", + "khroma": "^2.1.0", + "lodash-es": "^4.17.23", + "marked": "^16.3.0", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0" + } + }, + "node_modules/meshline": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", + "integrity": "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==", + "license": "MIT", + "peerDependencies": { + "three": ">=0.137" + } + }, + "node_modules/meshoptimizer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-1.1.1.tgz", + "integrity": "sha512-oRFNWJRDA/WTrVj7NWvqa5HqE1t9MYDj2VaWirQCzCCrAd2GHrqR/sQezCxiWATPNlKTcRaPRHPJwIRoPBAp5g==", + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/netmask": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.1.1.tgz", + "integrity": "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "license": "MIT" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT" + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "license": "MIT", + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, + "node_modules/postcss": { + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", + "license": "ISC" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-worker-transferable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", + "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", + "license": "Apache-2.0", + "dependencies": { + "is-promise": "^2.1.0", + "lie": "^3.0.2" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer": { + "version": "24.43.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.43.0.tgz", + "integrity": "sha512-DRnMFz+J3s4lFUQcjqKl0/7h0jzlCZuUFU9lNjtKrnMl5WI1RwCaIItpHVu9empuPyUreYueN0sUW3/pnfdqsg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.13.1", + "chromium-bidi": "14.0.0", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1608973", + "puppeteer-core": "24.43.0", + "typed-query-selector": "^2.12.2" + }, + "bin": { + "puppeteer": "lib/cjs/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core": { + "version": "24.43.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.43.0.tgz", + "integrity": "sha512-cCRNXsUlhyPoKDz6+TiSpfZpRS3mD6Y1YFKhkdr6ik6TMfuJb7fAtXq9ThUFc4sphxObDk3BuAvdxc1Y6YOnqQ==", + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.13.1", + "chromium-bidi": "14.0.0", + "debug": "^4.4.3", + "devtools-protocol": "0.0.1608973", + "typed-query-selector": "^2.12.2", + "webdriver-bidi-protocol": "0.4.1", + "ws": "^8.20.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/qr.js": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/qr.js/-/qr.js-0.0.0.tgz", + "integrity": "sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==", + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", + "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz", + "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.6" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-qr-code": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/react-qr-code/-/react-qr-code-2.0.21.tgz", + "integrity": "sha512-xaywjo0eaF4S3LOz6ns5eoPbM2E+q9HYl4VATYpxK4bBniOhQ9noY2RJ9G4SnZFhUwzx63FUT6KdHzfKgUwyuQ==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.8.1", + "qr.js": "0.0.0" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-use-measure": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.7.tgz", + "integrity": "sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.13", + "react-dom": ">=16.13" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", + "license": "Unlicense" + }, + "node_modules/rolldown": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.18.tgz", + "integrity": "sha512-phmyKBpuBdRYDf4hgyynGAYn/rDDe+iZXKVJ7WX5b1zQzpLkP5oJRPGsfJuHdzPMlyyEO/4sPW6yfSx2gf7lVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.128.0", + "@rolldown/pluginutils": "1.0.0-rc.18" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.18", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.18", + "@rolldown/binding-darwin-x64": "1.0.0-rc.18", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.18", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.18", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.18", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.18", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.18", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.18", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.18", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.18", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.18", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.18", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.18", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.18" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.18.tgz", + "integrity": "sha512-CUY5Mnhe64xQBGZEEXQ5WyZwsc1JU3vAZLIxtrsBt3LO6UOb+C8GunVKqe9sT8NeWb4lqSaoJtp2xo6GxT1MNw==", + "dev": true, + "license": "MIT" + }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "license": "MIT", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.8.tgz", + "integrity": "sha512-NlGELfPrgX2f1TAAcz0WawlLn+0r3FyhhCRpFFK2CemXenPYvzMWWZINv3eDNo9ucdwme7oCHRY0Jnbs4aIkog==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.1.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stats-gl": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.4.2.tgz", + "integrity": "sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ==", + "license": "MIT", + "dependencies": { + "@types/three": "*", + "three": "^0.170.0" + }, + "peerDependencies": { + "@types/three": "*", + "three": "*" + } + }, + "node_modules/stats-gl/node_modules/three": { + "version": "0.170.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.170.0.tgz", + "integrity": "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==", + "license": "MIT" + }, + "node_modules/stats.js": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", + "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==", + "license": "MIT" + }, + "node_modules/streamx": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz", + "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==", + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylis": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz", + "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", + "license": "MIT" + }, + "node_modules/suspend-react": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", + "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", + "license": "MIT", + "peerDependencies": { + "react": ">=17.0" + } + }, + "node_modules/tar-fs": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.2.tgz", + "integrity": "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/tar-stream": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.0.tgz", + "integrity": "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "bare-fs": "^4.5.5", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/text-decoder": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/three": { + "version": "0.184.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.184.0.tgz", + "integrity": "sha512-wtTRjG92pM5eUg/KuUnHsqSAlPM296brTOcLgMRqEeylYTh/CdtvKUvCyyCQTzFuStieWxvZb8mVTMvdPyUpxg==", + "license": "MIT" + }, + "node_modules/three-mesh-bvh": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.8.3.tgz", + "integrity": "sha512-4G5lBaF+g2auKX3P0yqx+MJC6oVt6sB5k+CchS6Ob0qvH0YIhuUk1eYr7ktsIpY+albCqE80/FVQGV190PmiAg==", + "license": "MIT", + "peerDependencies": { + "three": ">= 0.159.0" + } + }, + "node_modules/three-stdlib": { + "version": "2.36.1", + "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.36.1.tgz", + "integrity": "sha512-XyGQrFmNQ5O/IoKm556ftwKsBg11TIb301MB5dWNicziQBEs2g3gtOYIf7pFiLa0zI2gUwhtCjv9fmjnxKZ1Cg==", + "license": "MIT", + "dependencies": { + "@types/draco3d": "^1.4.0", + "@types/offscreencanvas": "^2019.6.4", + "@types/webxr": "^0.5.2", + "draco3d": "^1.4.1", + "fflate": "^0.6.9", + "potpack": "^1.0.1" + }, + "peerDependencies": { + "three": ">=0.128.0" + } + }, + "node_modules/three-stdlib/node_modules/fflate": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz", + "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/troika-three-text": { + "version": "0.52.4", + "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.52.4.tgz", + "integrity": "sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg==", + "license": "MIT", + "dependencies": { + "bidi-js": "^1.0.2", + "troika-three-utils": "^0.52.4", + "troika-worker-utils": "^0.52.0", + "webgl-sdf-generator": "1.1.1" + }, + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-three-utils": { + "version": "0.52.4", + "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.52.4.tgz", + "integrity": "sha512-NORAStSVa/BDiG52Mfudk4j1FG4jC4ILutB3foPnfGbOeIs9+G5vZLa0pnmnaftZUGm4UwSoqEpWdqvC7zms3A==", + "license": "MIT", + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-worker-utils": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.52.0.tgz", + "integrity": "sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw==", + "license": "MIT" + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tunnel-rat": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", + "integrity": "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==", + "license": "MIT", + "dependencies": { + "zustand": "^4.3.2" + } + }, + "node_modules/tunnel-rat/node_modules/zustand": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", + "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.2.2" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-query-selector": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.2.tgz", + "integrity": "sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", + "license": "MIT", + "optional": true + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/uuid": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz", + "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/vite": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.11.tgz", + "integrity": "sha512-Jz1mxtUBR5xTT65VOdJZUUeoyLtqljmFkiUXhPTLZka3RDc9vpi/xXkyrnsdRcm2lIi3l3GPMnAidTsEGIj3Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.14", + "rolldown": "1.0.0-rc.18", + "tinyglobby": "^0.2.16" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.18", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "license": "MIT" + }, + "node_modules/webdriver-bidi-protocol": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.1.tgz", + "integrity": "sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==", + "license": "Apache-2.0" + }, + "node_modules/webgl-constants": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", + "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" + }, + "node_modules/webgl-sdf-generator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", + "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==", + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, + "node_modules/zustand": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.13.tgz", + "integrity": "sha512-efI2tVaVQPqtOh114loML/Z80Y4NP3yc+Ff0fYiZJPauNeWZeIp/bRFD7I9bfmCOYBh/PHxlglQ9+wvlwnPikQ==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + } + } +} diff --git a/engine/xcu-command-center/package.json b/engine/xcu-command-center/package.json new file mode 100644 index 0000000..e443c90 --- /dev/null +++ b/engine/xcu-command-center/package.json @@ -0,0 +1,37 @@ +{ + "name": "xcu-command-center", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "predev": "node ../forge_signature.js", + "dev": "vite", + "prebuild": "node ../forge_signature.js", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@react-three/drei": "^10.7.7", + "@react-three/fiber": "^9.6.1", + "@simplewebauthn/browser": "^13.3.0", + "html5-qrcode": "^2.3.8", + "mermaid": "^11.14.0", + "puppeteer": "^24.43.0", + "react": "^19.2.5", + "react-dom": "^19.2.5", + "react-qr-code": "^2.0.21", + "three": "^0.184.0" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^10.2.1", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.5.0", + "vite": "^8.0.10" + } +} diff --git a/engine/xcu-command-center/public/favicon.svg b/engine/xcu-command-center/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/engine/xcu-command-center/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/engine/xcu-command-center/public/icons.svg b/engine/xcu-command-center/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/engine/xcu-command-center/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/engine/xcu-command-center/public/sdk/quantum-sdk.js b/engine/xcu-command-center/public/sdk/quantum-sdk.js new file mode 100644 index 0000000..44a6fec --- /dev/null +++ b/engine/xcu-command-center/public/sdk/quantum-sdk.js @@ -0,0 +1,57 @@ +/** + * XCU Ultra - Phantom Quantum SDK + * Modul 76: Leviathan Overlay Integrator + * + * Mendistribusikan pustaka WebTransport dan WebAssembly khusus + * untuk melakukan bypass protokol TCP standar dan mengaktifkan + * transmisi CRDT OMNI secara seketika (0ms latensi perseptual). + */ + +class PhantomQuantumSDK { + constructor() { + this.version = "7.6.0-LEVIATHAN"; + this.socket = null; + this.isReady = false; + this.callbacks = {}; + console.log(`[XCU] Phantom Quantum SDK ${this.version} Initialized.`); + } + + async ignite(tetherUrl) { + return new Promise((resolve, reject) => { + console.log(`[XCU] Menembus Firewall menuju: ${tetherUrl}`); + try { + // Mensimulasikan koneksi WebTransport/QUIC bypass + setTimeout(() => { + this.isReady = true; + console.log("[XCU] Tautan Kuantum Berhasil Dikunci."); + resolve(true); + }, 500); + } catch (e) { + reject(e); + } + }); + } + + send(payload) { + if (!this.isReady) throw new Error("Quantum Link Not Ready"); + // Simulasi pengiriman data CRDT + if (this.callbacks['data']) { + // Echo balik sebagai simulasi jaringan + setTimeout(() => { + this.callbacks['data'](payload); + }, 10); + } + } + + on(event, callback) { + this.callbacks[event] = callback; + } + + shutdown() { + this.isReady = false; + this.callbacks = {}; + console.log("[XCU] Tautan Kuantum Terputus."); + } +} + +window.PhantomQuantumSDK = PhantomQuantumSDK; diff --git a/engine/xcu-command-center/public/sdk/xcu_wasm_sdk.js b/engine/xcu-command-center/public/sdk/xcu_wasm_sdk.js new file mode 100644 index 0000000..bd5eb21 --- /dev/null +++ b/engine/xcu-command-center/public/sdk/xcu_wasm_sdk.js @@ -0,0 +1,16 @@ +// INI ADALAH MOCK LOKAL UNTUK WINDOWS. +// SAAT DI DOCKER VPS, FILE INI AKAN DITIMPA OLEH BINARY WASM RUST YANG ASLI. +export async function enable_post_quantum_shield() { + console.log("XCU: THE POST-QUANTUM SHIELD ACTIVATED! (Mock Local)"); + return Promise.resolve(); +} + +export async function enable_aegis_forensic_watermark(seed) { + console.log("XCU: THE AEGIS MATRIX ENGAGED! Seed: " + seed + " (Mock Local)"); + return Promise.resolve(); +} + +export default async function init() { + console.log("WASM Initialized (Mock Local)"); + return Promise.resolve(); +} diff --git a/engine/xcu-command-center/rust_src/lib.rs b/engine/xcu-command-center/rust_src/lib.rs new file mode 100644 index 0000000..cd77a68 --- /dev/null +++ b/engine/xcu-command-center/rust_src/lib.rs @@ -0,0 +1,103 @@ +//! [TSM.ID].[11031972] -- Platform X Ecosystem +//! xcu-command-center -- Supreme Command Center dashboard bridge +#![deny(warnings)] + +use serde::{Serialize, Deserialize}; +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; + +#[derive(Debug)] +pub enum BridgeError { + ConnectionFailed(String), + ConfigError(String), + OperationFailed(String), + NotReady, +} + +impl std::fmt::Display for BridgeError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::ConnectionFailed(e) => write!(f, "Connection failed: {e}"), + Self::ConfigError(e) => write!(f, "Config error: {e}"), + Self::OperationFailed(e) => write!(f, "Op failed: {e}"), + Self::NotReady => write!(f, "Not ready"), + } + } +} +impl std::error::Error for BridgeError {} +pub type Result = std::result::Result; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct BridgeConfig { + pub name: String, + pub endpoint: String, + pub params: HashMap, + pub enabled: bool, +} + +impl BridgeConfig { + pub fn new(name: &str, endpoint: &str) -> Self { + Self { name: name.to_string(), endpoint: endpoint.to_string(), params: HashMap::new(), enabled: true } + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum BridgeState { Disconnected, Connecting, Connected, Error(String) } + +pub struct Bridge { + config: BridgeConfig, + state: Arc>, + message_count: Arc>, +} + +impl Bridge { + pub fn new(config: BridgeConfig) -> Result { + Ok(Self { + config, state: Arc::new(Mutex::new(BridgeState::Disconnected)), + message_count: Arc::new(Mutex::new(0)), + }) + } + + pub fn connect(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| BridgeError::OperationFailed(e.to_string()))?; + *s = BridgeState::Connecting; + *s = BridgeState::Connected; + Ok(()) + } + + pub fn disconnect(&self) -> Result<()> { + let mut s = self.state.lock().map_err(|e| BridgeError::OperationFailed(e.to_string()))?; + *s = BridgeState::Disconnected; + Ok(()) + } + + pub fn send(&self, _payload: &[u8]) -> Result { + let s = self.state.lock().map_err(|e| BridgeError::OperationFailed(e.to_string()))?; + if *s != BridgeState::Connected { return Err(BridgeError::NotReady); } + drop(s); + let mut c = self.message_count.lock().map_err(|e| BridgeError::OperationFailed(e.to_string()))?; + *c += 1; + Ok(*c) + } + + pub fn state(&self) -> Result { + Ok(self.state.lock().map_err(|e| BridgeError::OperationFailed(e.to_string()))?.clone()) + } + + pub fn config(&self) -> &BridgeConfig { &self.config } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_bridge() { + let b = Bridge::new(BridgeConfig::new("xcu-command-center", "localhost:3000")).unwrap(); + assert_eq!(b.state().unwrap(), BridgeState::Disconnected); + b.connect().unwrap(); + assert_eq!(b.state().unwrap(), BridgeState::Connected); + b.send(b"hello").unwrap(); + b.disconnect().unwrap(); + assert_eq!(b.state().unwrap(), BridgeState::Disconnected); + } +} diff --git a/engine/xcu-command-center/src/App.css b/engine/xcu-command-center/src/App.css new file mode 100644 index 0000000..f90339d --- /dev/null +++ b/engine/xcu-command-center/src/App.css @@ -0,0 +1,184 @@ +.counter { + font-size: 16px; + padding: 5px 10px; + border-radius: 5px; + color: var(--accent); + background: var(--accent-bg); + border: 2px solid transparent; + transition: border-color 0.3s; + margin-bottom: 24px; + + &:hover { + border-color: var(--accent-border); + } + &:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; + } +} + +.hero { + position: relative; + + .base, + .framework, + .vite { + inset-inline: 0; + margin: 0 auto; + } + + .base { + width: 170px; + position: relative; + z-index: 0; + } + + .framework, + .vite { + position: absolute; + } + + .framework { + z-index: 1; + top: 34px; + height: 28px; + transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg) + scale(1.4); + } + + .vite { + z-index: 0; + top: 107px; + height: 26px; + width: auto; + transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg) + scale(0.8); + } +} + +#center { + display: flex; + flex-direction: column; + gap: 25px; + place-content: center; + place-items: center; + flex-grow: 1; + + @media (max-width: 1024px) { + padding: 32px 20px 24px; + gap: 18px; + } +} + +#next-steps { + display: flex; + border-top: 1px solid var(--border); + text-align: left; + + & > div { + flex: 1 1 0; + padding: 32px; + @media (max-width: 1024px) { + padding: 24px 20px; + } + } + + .icon { + margin-bottom: 16px; + width: 22px; + height: 22px; + } + + @media (max-width: 1024px) { + flex-direction: column; + text-align: center; + } +} + +#docs { + border-right: 1px solid var(--border); + + @media (max-width: 1024px) { + border-right: none; + border-bottom: 1px solid var(--border); + } +} + +#next-steps ul { + list-style: none; + padding: 0; + display: flex; + gap: 8px; + margin: 32px 0 0; + + .logo { + height: 18px; + } + + a { + color: var(--text-h); + font-size: 16px; + border-radius: 6px; + background: var(--social-bg); + display: flex; + padding: 6px 12px; + align-items: center; + gap: 8px; + text-decoration: none; + transition: box-shadow 0.3s; + + &:hover { + box-shadow: var(--shadow); + } + .button-icon { + height: 18px; + width: 18px; + } + } + + @media (max-width: 1024px) { + margin-top: 20px; + flex-wrap: wrap; + justify-content: center; + + li { + flex: 1 1 calc(50% - 8px); + } + + a { + width: 100%; + justify-content: center; + box-sizing: border-box; + } + } +} + +#spacer { + height: 88px; + border-top: 1px solid var(--border); + @media (max-width: 1024px) { + height: 48px; + } +} + +.ticks { + position: relative; + width: 100%; + + &::before, + &::after { + content: ''; + position: absolute; + top: -4.5px; + border: 5px solid transparent; + } + + &::before { + left: 0; + border-left-color: var(--border); + } + &::after { + right: 0; + border-right-color: var(--border); + } +} diff --git a/engine/xcu-command-center/src/App.jsx b/engine/xcu-command-center/src/App.jsx new file mode 100644 index 0000000..d876ad1 --- /dev/null +++ b/engine/xcu-command-center/src/App.jsx @@ -0,0 +1,47 @@ +import { useState, useEffect } from 'react'; +import './App.css'; +import './TenantTheme.css'; +import { useAuth } from './context/AuthContext'; +import { useIam } from './context/IamContext'; +import LoginGateway from './components/LoginGateway'; +import SupremeDashboard from './layouts/SupremeDashboard'; +import TenantDashboard from './layouts/TenantDashboard'; + +import AuthenticatorPWA from './components/AuthenticatorPWA'; + +function App() { + const { isAuthenticated, isLoading } = useAuth(); + const { identity } = useIam(); + + if (window.location.pathname === '/authenticator') { + return ; + } + + if (isLoading) { + return
INITIALIZING QUANTUM STATE...
; + } + + // Auth Guard: Memblokir akses Dasbor jika belum Login! + if (!isAuthenticated) { + return ; + } + + // Mencegah Race Condition: Menunggu IamContext menyelesasikan ekstraksi JWT + if (!identity) { + return
EXTRACTING QUANTUM IDENTITY...
; + } + + // SHAPESHIFTING UI (FASE 40) - Pemisahan Mutlak DOM Tree + if (identity.role === 'supreme_admin') { + return ; + } + + if (identity.role === 'tenant') { + return ; + } + + // Fallback Darurat + return
CRITICAL ERROR: ROLE NOT RECOGNIZED
; +} + +export default App; diff --git a/engine/xcu-command-center/src/TenantTheme.css b/engine/xcu-command-center/src/TenantTheme.css new file mode 100644 index 0000000..4859772 --- /dev/null +++ b/engine/xcu-command-center/src/TenantTheme.css @@ -0,0 +1,34 @@ +/* Tenant Theme - Commercial Gateway (Midnight Purple & Dark Indigo) */ +.tenant-theme { + background-color: var(--bg-dark); + background-image: + radial-gradient(circle at 50% 0%, rgba(168, 85, 247, 0.05), transparent 50%), + radial-gradient(circle at 100% 100%, rgba(79, 70, 229, 0.05), transparent 50%); +} + +body.light-theme .tenant-theme { + background-color: var(--bg-dark); +} + +.tenant-sidebar { + border-right: 1px solid var(--glass-border); + background: var(--bg-panel); + box-shadow: 5px 0 30px rgba(0, 0, 0, 0.1); +} + +.tenant-sidebar .nav-link { + color: var(--text-muted); +} + +.tenant-sidebar .nav-link:hover { + color: var(--accent-purple); + background: rgba(168, 85, 247, 0.05); + box-shadow: inset 2px 0 0 var(--accent-purple); +} + +.tenant-sidebar .nav-link.active { + color: var(--text-main); + background: rgba(168, 85, 247, 0.15); + border-left-color: var(--accent-purple); + box-shadow: inset 4px 0 0 var(--accent-purple), inset 0 0 20px rgba(168, 85, 247, 0.1); +} diff --git a/engine/xcu-command-center/src/assets/hero.png b/engine/xcu-command-center/src/assets/hero.png new file mode 100644 index 0000000..02251f4 Binary files /dev/null and b/engine/xcu-command-center/src/assets/hero.png differ diff --git a/engine/xcu-command-center/src/assets/react.svg b/engine/xcu-command-center/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/engine/xcu-command-center/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/engine/xcu-command-center/src/assets/vite.svg b/engine/xcu-command-center/src/assets/vite.svg new file mode 100644 index 0000000..5101b67 --- /dev/null +++ b/engine/xcu-command-center/src/assets/vite.svg @@ -0,0 +1 @@ +Vite diff --git a/engine/xcu-command-center/src/components/About.jsx b/engine/xcu-command-center/src/components/About.jsx new file mode 100644 index 0000000..65ba3dc --- /dev/null +++ b/engine/xcu-command-center/src/components/About.jsx @@ -0,0 +1,31 @@ +import React from 'react'; +import { SYSTEM_VERSION } from '../version'; +import { useI18n } from '../context/I18nContext'; + +export default function About() { + const { t } = useI18n(); + + return ( +
+

{t('about')} XCU Ultra

+
+

SYSTEM SPECIFICATIONS

+
    +
  • Engine: Rust (Glommio, eBPF, WebTransport)
  • +
  • Frontend: React, WASM, Holographic Canvas
  • +
  • Billing Matrix: DuckDB Embedded Analytics
  • +
  • IAM Gatekeeper: Zero-Database Stateless JWT
  • +
  • Security Protocol: Cerberus Quantum Firewall
  • +
  • Self-Destruct Mechanism: Ouroboros Protocol
  • +
+ +
+

ABSOLUTE VERSIONING (ANTIGRAVITY UID)

+

+ {SYSTEM_VERSION} +

+
+
+
+ ); +} diff --git a/engine/xcu-command-center/src/components/AuthenticatorPWA.jsx b/engine/xcu-command-center/src/components/AuthenticatorPWA.jsx new file mode 100644 index 0000000..2da70bf --- /dev/null +++ b/engine/xcu-command-center/src/components/AuthenticatorPWA.jsx @@ -0,0 +1,133 @@ +import { useState, useEffect, useRef } from 'react'; +import { Html5Qrcode } from 'html5-qrcode'; + +export default function AuthenticatorPWA() { + const [status, setStatus] = useState('MENUNGGU KAMERA...'); + const [scanning, setScanning] = useState(true); + const scannerRef = useRef(null); + + // Web Crypto API HMAC-SHA256 + const signChallenge = async (secretHex, challenge) => { + const enc = new TextEncoder(); + // Convert hex string to Uint8Array + const secretBytes = new Uint8Array(secretHex.match(/.{1,2}/g).map(byte => parseInt(byte, 16))); + const key = await window.crypto.subtle.importKey( + 'raw', secretBytes, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign'] + ); + const signature = await window.crypto.subtle.sign('HMAC', key, enc.encode(challenge)); + // Convert signature back to hex + return Array.from(new Uint8Array(signature)).map(b => b.toString(16).padStart(2, '0')).join(''); + }; + + useEffect(() => { + document.body.style.margin = "0"; + document.body.style.background = "#000"; + document.body.style.color = "#fff"; + document.body.style.fontFamily = "monospace"; + + const html5QrCode = new Html5Qrcode("reader"); + scannerRef.current = html5QrCode; + + html5QrCode.start( + { facingMode: "environment" }, + { fps: 10, qrbox: { width: 250, height: 250 } }, + async (decodedText) => { + setScanning(false); + html5QrCode.stop(); + + const gatekeeperUrl = import.meta.env.VITE_GATEKEEPER_WS_URL || 'ws://localhost:4001'; + const ws = new WebSocket(gatekeeperUrl); + + if (decodedText.startsWith('PAIR|')) { + setStatus('MATRIKS SETUP DITEMUKAN. MENGAWINKAN KUNCI...'); + const parts = decodedText.split('|'); + const targetKeyId = parts[1]; + const secret = parts[2]; + + localStorage.setItem('XCU_OPTICAL_SECRET', JSON.stringify({ targetKeyId, secret })); + + ws.onopen = () => ws.send(JSON.stringify({ type: 'CONFIRM_OPTICAL_PAIRING', payload: { targetKeyId, secret } })); + ws.onmessage = (e) => { + const data = JSON.parse(e.data); + if (data.type === 'OPTICAL_PAIRING_SUCCESS') setStatus('✅ PERANGKAT BERHASIL DIKAWINKAN'); + else setStatus('❌ GAGAL: ' + data.payload); + ws.close(); + }; + } else { + setStatus('MATRIKS TANTANGAN DITEMUKAN. MENGOTENTIKASI...'); + const stored = localStorage.getItem('XCU_OPTICAL_SECRET'); + if (!stored) { + setStatus('❌ PONSEL INI BELUM DIPAIRING DARI DASBOR'); + return; + } + + const { targetKeyId, secret } = JSON.parse(stored); + const parts = decodedText.split('|'); + const opticalCode = parts[0]; + const sessionId = parts[1] === 'null' ? null : parts[1]; + + // Sign the challenge + const signature = await signChallenge(secret, opticalCode); + + ws.onopen = () => { + ws.send(JSON.stringify({ + type: 'AEGIS_AUTH_REQUEST', + payload: { authType: 'OPTICAL_SYNC', keyPayload: { targetKeyId, signature, challenge: opticalCode }, sessionId } + })); + }; + ws.onmessage = (event) => { + try { + const data = JSON.parse(event.data); + if (data.type === 'AUTH_SUCCESS' || data.type === 'MFA_SEQUENCE_STARTED' || data.type === 'MFA_STEP_REQUIRED') { + setStatus('⚡ OTORISASI BERHASIL ⚡'); + ws.close(); + } else if (data.type === 'AUTH_FAILED') { + setStatus('❌ DITOLAK: ' + data.payload); + ws.close(); + } + } catch(e) {} + }; + } + ws.onerror = () => setStatus('❌ KONEKSI GATEKEEPER GAGAL'); + }, + (errorMessage) => {} + ).catch((err) => setStatus('GAGAL MENGAKSES KAMERA: ' + err)); + + return () => { + if (scannerRef.current && scannerRef.current.isScanning) { + scannerRef.current.stop(); + } + }; + }, []); + + return ( +
+
+

XCU

+

AUTHENTICATOR PWA

+
+ +
+ {scanning ? ( +
+ ) : ( +
+ {status.includes('BERHASIL') ? '🔓' : '🔒'} +
+ )} +
+ {status} +
+
+ +
+ ARAHKAN KAMERA KE MATRIKS KUANTUM DI LAYAR MONITOR +
+
+ ); +} diff --git a/engine/xcu-command-center/src/components/BridgeManager.jsx b/engine/xcu-command-center/src/components/BridgeManager.jsx new file mode 100644 index 0000000..d3bb1b0 --- /dev/null +++ b/engine/xcu-command-center/src/components/BridgeManager.jsx @@ -0,0 +1,268 @@ +// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. +// Bridge Manager — ONE-WAY PUSH Control: XCU → JUMPA +// View/Add bridge mappings, trigger sync to JUMPA system_features + +import { useState, useEffect, useCallback } from 'react'; +import { useModuleRegistry } from '../context/ModuleRegistryContext'; + +const API_BASE = import.meta.env.VITE_XCU_API_URL || ''; + +export default function BridgeManager() { + const { allModules, getModuleName } = useModuleRegistry(); + + const [mappings, setMappings] = useState([]); + const [tenants, setTenants] = useState([]); + const [loading, setLoading] = useState(true); + const [syncResult, setSyncResult] = useState(null); + const [syncing, setSyncing] = useState(false); + + // Add mapping form + const [showAddForm, setShowAddForm] = useState(false); + const [newModuleId, setNewModuleId] = useState(''); + const [newFeatureKey, setNewFeatureKey] = useState(''); + const [isAdding, setIsAdding] = useState(false); + + // Search + const [searchQuery, setSearchQuery] = useState(''); + + const fetchMappings = useCallback(async () => { + try { + const [mapRes, tenantRes] = await Promise.all([ + fetch(`${API_BASE}/xcu-api/v1/bridge/mappings`), + fetch(`${API_BASE}/xcu-api/v1/tenants`) + ]); + if (mapRes.ok) setMappings(await mapRes.json()); + if (tenantRes.ok) setTenants(await tenantRes.json()); + } catch (err) { + console.error('[BRIDGE] Fetch error:', err.message); + } finally { + setLoading(false); + } + }, []); + + useEffect(() => { fetchMappings(); }, [fetchMappings]); + + // Group mappings by module + const groupedMappings = {}; + mappings.forEach(m => { + if (!groupedMappings[m.xcu_module_id]) { + groupedMappings[m.xcu_module_id] = []; + } + groupedMappings[m.xcu_module_id].push(m.jumpa_feature_key); + }); + + const modulesWithMappings = Object.keys(groupedMappings).length; + const totalFeaturesCovered = new Set(mappings.map(m => m.jumpa_feature_key)).size; + + // Sync + const handleSync = async (tenantKey) => { + setSyncing(true); + setSyncResult(null); + try { + const res = await fetch(`${API_BASE}/xcu-api/v1/bridge/sync`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ tenant_key: tenantKey }) + }); + const data = await res.json(); + setSyncResult(data); + } catch (err) { + setSyncResult({ error: err.message }); + } finally { + setSyncing(false); + } + }; + + // Add mapping + const handleAddMapping = async () => { + if (!newModuleId || !newFeatureKey) return; + setIsAdding(true); + try { + await fetch(`${API_BASE}/xcu-api/v1/bridge/mappings`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ xcu_module_id: newModuleId, jumpa_feature_key: newFeatureKey }) + }); + setNewModuleId(''); + setNewFeatureKey(''); + setShowAddForm(false); + await fetchMappings(); + } catch (err) { + console.error(err); + } finally { + setIsAdding(false); + } + }; + + // Filter + const q = searchQuery.toLowerCase(); + const filteredModuleIds = Object.keys(groupedMappings) + .filter(modId => !q || modId.includes(q) || getModuleName(modId).toLowerCase().includes(q) || + groupedMappings[modId].some(fk => fk.toLowerCase().includes(q))) + .sort((a, b) => { + const numA = parseInt(a.replace('m', '')); + const numB = parseInt(b.replace('m', '')); + return numA - numB; + }); + + if (loading) { + return ( +
+ LOADING BRIDGE MATRIX... +
+ ); + } + + return ( +
+ {/* Header */} +
+
+

+ BRIDGE CONTROL — ONE-WAY PUSH +

+

+ XCU → JUMPA.ID | Mapping modul ke system_features | JUMPA TIDAK BISA balik +

+
+ +
+
+
{mappings.length}
+
MAPPINGS
+
+
+
{modulesWithMappings}
+
MODULES
+
+
+
{totalFeaturesCovered}
+
FEATURES
+
+ + +
+
+ + {/* Sync Panel */} +
+
+

+ ONE-WAY PUSH SYNC +

+

+ Push modul aktif tenant ke JUMPA system_features. Fitur yang di-bridge = GRANTED, sisanya = UPSELL. +

+
+
+ {tenants.map(t => ( + + ))} +
+ {syncResult && ( +
+ {syncResult.error + ? `ERROR: ${syncResult.error}` + : `✓ BRIDGE SYNC COMPLETE — ${syncResult.granted} GRANTED / ${syncResult.disabled} DISABLED`} +
+ )} +
+ + {/* Add Mapping Form */} + {showAddForm && ( +
+

NEW BRIDGE MAPPING

+
+
+ + +
+
+ + setNewFeatureKey(e.target.value)} placeholder="jvc.feature.recording" + style={{width: '100%', padding: '10px', background: 'var(--hover-bg)', border: '1px solid var(--table-border)', color: 'var(--text-main)', borderRadius: '6px', fontFamily: 'monospace'}} /> +
+ +
+
+ )} + + {/* Search */} +
+ setSearchQuery(e.target.value)} + placeholder="Search by module ID, name, or feature key..." + style={{width: '100%', padding: '12px 20px', background: 'var(--hover-bg)', border: '1px solid var(--table-border)', color: 'var(--text-main)', borderRadius: '8px', fontFamily: 'monospace', fontSize: '0.9rem', outline: 'none'}} /> +
+ + {/* Mapping Table */} +
+ + + + + + + + + + {filteredModuleIds.map((modId, i) => ( + + + + + + ))} + +
XCU MODULEJUMPA FEATURE KEYSCOUNT
+
{modId}
+
{getModuleName(modId)}
+
+
+ {groupedMappings[modId].map(fk => { + const prefixColor = fk.startsWith('jvc.') ? '#a855f7' : + fk.startsWith('jc.') ? '#10b981' : + fk.startsWith('xtm.') ? '#f97316' : + fk.startsWith('iam.') ? '#ffea00' : + fk.startsWith('xcu.') ? '#00f3ff' : '#888'; + return ( + {fk} + ); + })} +
+
+ {groupedMappings[modId].length} +
+
+
+ ); +} diff --git a/engine/xcu-command-center/src/components/CommercialTiers.jsx b/engine/xcu-command-center/src/components/CommercialTiers.jsx new file mode 100644 index 0000000..630b81b --- /dev/null +++ b/engine/xcu-command-center/src/components/CommercialTiers.jsx @@ -0,0 +1,316 @@ +// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential. +import { useState } from 'react'; +import { useCommercial } from '../context/CommercialContext'; +import { useModuleRegistry } from '../context/ModuleRegistryContext'; + +export default function CommercialTiers() { + const { tiers, setTiers, activeCurrency, setActiveCurrency, formatDynamicCurrency } = useCommercial(); + const { allModules } = useModuleRegistry(); + + // Edit State + const [editingTierId, setEditingTierId] = useState(null); + const [editName, setEditName] = useState(''); + const [editDesc, setEditDesc] = useState(''); + const [editPrice, setEditPrice] = useState(''); + const [editModules, setEditModules] = useState({}); + + const handleEditClick = (tier) => { + setEditingTierId(tier.id); + setEditName(tier.name); + setEditDesc(tier.description); + setEditPrice(tier.price); + + const modMap = {}; + tier.modules.forEach(m => modMap[m] = true); + setEditModules(modMap); + }; + + const handleToggleEditModule = (modId) => { + setEditModules(prev => ({ ...prev, [modId]: !prev[modId] })); + }; + + const saveEdit = (tierId) => { + const selectedMods = Object.keys(editModules).filter(k => editModules[k]); + + setTiers(prev => prev.map(t => { + if (t.id === tierId) { + return { + ...t, + name: editName, + description: editDesc, + price: Number(editPrice), + modules: selectedMods + }; + } + return t; + })); + setEditingTierId(null); + }; + + const annihilateTier = (tierId) => { + setTiers(prev => prev.filter(t => t.id !== tierId)); + setEditingTierId(null); + }; + + const spawnNewTier = () => { + const newId = 'tier_' + Math.random().toString(36).substr(2, 6); + const blankTier = { + id: newId, + name: 'NEW CUSTOM TIER', + price: 0, + description: 'Deskripsi paket baru...', + modules: [] + }; + // Append to end + setTiers(prev => [...prev, blankTier]); + // Auto-enter edit mode for the new tier + handleEditClick(blankTier); + }; + + return ( +
+
+
+

QUANTUM FOREX MATRIX (MODUL 21)

+

+ Konfigurasi Paket Penagihan Klien. Transmutasi nilai berjalan secara real-time. +

+
+ + {/* Multi-Currency Switcher */} +
+ {['IDR', 'USD', 'BTC'].map(currency => ( + + ))} +
+
+ +
+ {tiers.map((tier, index) => { + let themeColor = 'var(--accent-cyan)'; + if (index === 1) themeColor = 'var(--accent-yellow)'; + if (index === 2) themeColor = 'var(--accent-red)'; + if (index === 3) themeColor = 'var(--accent-green)'; + + const isEditing = editingTierId === tier.id; + + return ( +
+
+ + {!isEditing ? ( +

{tier.name}

+ ) : ( + setEditName(e.target.value)} + style={{ + width: '100%', padding: '8px', background: 'var(--hover-bg)', + border: `1px solid ${themeColor}`, color: themeColor, + borderRadius: '4px', fontFamily: 'monospace', outline: 'none', fontSize: '1.2rem', marginBottom: '10px', fontWeight: 'bold' + }} + /> + )} + + {!isEditing ? ( + <> +
+ {formatDynamicCurrency(tier.price)} / bln +
+

+ {tier.description} +

+ + ) : ( +
+ + setEditPrice(e.target.value)} + style={{ + width: '100%', padding: '12px', background: 'var(--hover-bg)', + border: `1px solid ${themeColor}`, color: 'var(--text-main)', + borderRadius: '6px', fontFamily: 'monospace', outline: 'none', fontSize: '1.2rem' + }} + /> +
+ Estimasi USD: {formatDynamicCurrency(Number(editPrice))} (Bila di-switch) +
+ + + +
+ + +
+
+ )} +
+ +
+

3D TIMELINE SCHEDULES

+ {schedules.length === 0 ? ( +
Belum ada ruangan yang dijadwalkan.
+ ) : ( + schedules.map((sch) => ( +
+
+
+ {sch.mode} + {sch.title} +
+
{new Date(sch.date).toLocaleString('id-ID')}
+
+
+ + +
+
+ )) + )} +
+
+
+ + )} + + {/* THE VAULT (RECORDINGS) MODAL */} + {showVaultModal && ( +
+
+
+

+ + The Vault (Quantum Recordings) +

+ +
+
+ +
+ +

Secure Local Player

+

Pilih file rekaman hasil Quantum Record (.webm / .mp4) dari perangkat Anda. Video diputar 100% lokal tanpa diunggah ke internet.

+ + { + const file = e.target.files?.[0]; + if (file) { + if (vaultVideoUrl) URL.revokeObjectURL(vaultVideoUrl); + const url = URL.createObjectURL(file); + setVaultVideoUrl(url); + setVaultVideoName(file.name); + } + }} + /> + +
+ + {vaultVideoUrl && ( +
+
+ 📄 {vaultVideoName} + +
+
+ +
+
+ )} + +
+
+
+ )} + + + ); +} diff --git a/jumpa-vc/app/room/[roomName]/page.tsx b/jumpa-vc/app/room/[roomName]/page.tsx new file mode 100644 index 0000000..cffec9d --- /dev/null +++ b/jumpa-vc/app/room/[roomName]/page.tsx @@ -0,0 +1,296 @@ +// [TSM.ID].[11031972] — All Rights Reserved. Proprietary & Confidential. +"use client"; + +import { useSearchParams } from "next/navigation"; +import { use, useEffect, useState } from "react"; +import { XCURoom } from "../../../components/xcuRoom"; + +export default function RoomPage({ + params, +}: { + params: Promise<{ roomName: string }>; +}) { + const resolvedParams = use(params); + const roomName = resolvedParams.roomName; + + const searchParams = useSearchParams(); + const isVoiceCall = searchParams.get("audioOnly") === "true"; + + const [token, setToken] = useState(""); + const [serverUrl, setServerUrl] = useState(""); + const [error, setError] = useState(""); + const [isInitializing, setIsInitializing] = useState(true); + const [username, setUsername] = useState(""); + + // Guest Lobby State + const [showGuestLobby, setShowGuestLobby] = useState(false); + const [guestName, setGuestName] = useState(""); + const [guestLoading, setGuestLoading] = useState(false); + const [guestError, setGuestError] = useState(""); + + useEffect(() => { + (async () => { + try { + const authResp = await fetch(`/vc/api/auth/me?_cb=${Date.now()}`); + const authData = await authResp.json(); + if (authData.error) { + // User tidak login → tampilkan Guest Lobby (seperti Zoom) + setShowGuestLobby(true); + setIsInitializing(false); + return; + } + const userEmail = authData.email; + setUsername(userEmail); + + const qResp = await fetch(`/api/auth/quantum_token?_cb=${Date.now()}`, { credentials: 'include' }); + if (!qResp.ok) { + throw new Error("Otorisasi JUMPA.ID Ditolak: Gagal memverifikasi Lisensi Tenant."); + } + const qData = await qResp.json(); + if (qData.error || !qData.token) { + throw new Error("Akses Ilegal Terdeteksi: Harap masuk melalui Dasbor JUMPA.ID terlebih dahulu."); + } + + setToken(qData.token); + setServerUrl(process.env.NEXT_PUBLIC_XCU_SERVER_URL || "/xcu-engine"); + setIsInitializing(false); + + } catch (e: unknown) { + // Auth failed but not critical → show guest lobby + setShowGuestLobby(true); + setIsInitializing(false); + } + })(); + }, [roomName]); + + // Handle Guest Join + const handleGuestJoin = async () => { + if (!guestName.trim() || guestName.trim().length < 2) { + setGuestError("Masukkan nama Anda (minimal 2 karakter)."); + return; + } + setGuestLoading(true); + setGuestError(""); + + try { + const res = await fetch('/api/auth/guest-token', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + credentials: 'include', + body: JSON.stringify({ roomName, displayName: guestName.trim() }), + }); + + const data = await res.json(); + + if (!res.ok || data.error) { + setGuestError(data.error || "Gagal masuk sebagai tamu."); + setGuestLoading(false); + return; + } + + // Guest token received — set state and enter room + setToken(data.token); + setUsername(data.displayName); + setServerUrl(process.env.NEXT_PUBLIC_XCU_SERVER_URL || "/xcu-engine"); + setShowGuestLobby(false); + + } catch (e) { + setGuestError("Koneksi gagal. Periksa jaringan Anda."); + setGuestLoading(false); + } + }; + + // ═══════════════════════════════════════ + // GUEST LOBBY UI (Zoom-Like) + // ═══════════════════════════════════════ + if (showGuestLobby) { + return ( +
+ {/* Background Animation */} +
+
+
+
+
+ +
+
+ {/* Header */} +
+
+ + + +
+

+ Gabung Rapat +

+

+ Room: {decodeURIComponent(roomName)} +

+
+ + {/* Form */} +
+
+ + { setGuestName(e.target.value); setGuestError(""); }} + onKeyDown={(e) => e.key === 'Enter' && handleGuestJoin()} + placeholder="Masukkan nama Anda..." + maxLength={50} + autoFocus + className="w-full px-4 py-3.5 bg-white/5 border border-white/10 rounded-xl text-white placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all text-base" + /> +
+ + {guestError && ( +
+ + + + {guestError} +
+ )} + + + +
+

+ Sudah punya akun JUMPA.ID? +

+ + Masuk dengan Akun → + +
+
+ + {/* Footer */} +
+

+ Powered by JUMPA.ID • XCom ULTRA Engine • [TSM.ID].[11031972] +

+
+
+
+
+ ); + } + + if (error) { + return ( +
+
+

+ Akses Ditolak +

+

{error}

+ +
+
+ ); + } + + if (isInitializing) { + return ( +
+
+
+
+
+
+
+
+
+
+ +
+
+

+ Initializing JUMPA.ID Engine +

+

+ ESTABLISHING SECURE CONNECTION FOR {username.toUpperCase()}... +

+
+
+
+ ); + } + + // THE ABSOLUTE XCU CORE ENGINE + // 100% XCU Ultra Node [TSM.ID].[11031972] + return ( + + + + ); +} + +// Custom Error Boundary to catch & display the EXACT crash reason +import React from "react"; +class ErrorBoundaryWrapper extends React.Component<{roomName: string, children: React.ReactNode}, {hasError: boolean, error: string}> { + constructor(props: any) { + super(props); + this.state = { hasError: false, error: "" }; + } + static getDerivedStateFromError(error: Error) { + return { hasError: true, error: `${error.name}: ${error.message}\n${error.stack}` }; + } + render() { + if (this.state.hasError) { + return ( +
+
+

XCU Engine Crash Report

+
{this.state.error}
+ +
+
+ ); + } + return this.props.children; + } +} diff --git a/jumpa-vc/app/supreme-command/page.tsx b/jumpa-vc/app/supreme-command/page.tsx new file mode 100644 index 0000000..b0d0466 --- /dev/null +++ b/jumpa-vc/app/supreme-command/page.tsx @@ -0,0 +1,167 @@ +"use client"; +import { useState, useEffect } from "react"; + +import { XCUQuantumBridge } from "../../components/xcuQuantumBridge"; + +export default function SupremeCommandPage() { + const [activeRooms, setActiveRooms] = useState<{ + id: string, + status: string, + name: string, + type: string, + participants: number, + metrics?: { cpu: number, ram: number, threats: number } + }[]>([]); + const [glitch, setGlitch] = useState(false); + const [currentTime, setCurrentTime] = useState(""); + const [realLatency, setRealLatency] = useState(0); + + useEffect(() => { + let timeInterval: NodeJS.Timeout; + setTimeout(() => { + setCurrentTime(new Date().toLocaleTimeString('en-US', { hour12: false })); + timeInterval = setInterval(() => { + setCurrentTime(new Date().toLocaleTimeString('en-US', { hour12: false })); + }, 1000); + }, 0); + + const fetchRooms = async () => { + try { + const startTime = performance.now(); + const res = await fetch('/vc/api/xcu/rooms'); + const endTime = performance.now(); + const data = await res.json(); + + if (data.success) { + setGlitch(true); + setTimeout(() => setGlitch(false), 200); + setActiveRooms(data.rooms); + setRealLatency(Math.floor(endTime - startTime)); + } + } catch(e) { + console.error("Gagal menarik data dari Omniversal API", e); + } + }; + + fetchRooms(); + const interval = setInterval(fetchRooms, 3000); + + return () => { + clearInterval(interval); + if (timeInterval) clearInterval(timeInterval); + }; + }, []); + + return ( +
+ {/* CRT Scanline Effect */} +
+ +
+ {/* Header */} +
+
+
+

SUPREME COMMAND

+
+
+ + System Active +
+ // Omniversal CCTV Matrix // Node-Alpha-01 +
+
+ +
+
+ +
+
+
{currentTime || "00:00:00"}
+
+ ALPHA LATENCY: {realLatency}ms +
+
+
+
+
+
+
+ + {/* Content Grid */} +
+ {activeRooms.map((room) => ( +
+
+
+
+
+
+ Matrix ID + {room.id} +
+ + {room.status} + +
+ +
+

{room.name}

+

{room.type}

+
+ + {room.metrics && ( +
+
+ CPU Core + {(room.metrics.cpu || 0).toFixed(1)}% +
+
+ Neural RAM + {(room.metrics.ram || 0).toFixed(1)}% +
+
+ Threats + {(room.metrics.threats || 0).toLocaleString()} +
+
+ )} +
+ +
+
+ {room.participants} + Entities +
+ + +
+
+
+ ))} +
+ + {/* Dashboard Footer/Status Bar */} +
+
+ Encryption: Post-Quantum AES-XCU + Layer: eBPF/XDP Kernel-Bypass +
+
+ + All Neural Nodes Nominal +
+
+ Secure Terminal 0.1.0-alpha +
+
+
+
+ ); +} diff --git a/jumpa-vc/biome.json b/jumpa-vc/biome.json new file mode 100644 index 0000000..9252117 --- /dev/null +++ b/jumpa-vc/biome.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.4.14/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "formatter": { + "enabled": true, + "indentStyle": "tab" + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "a11y": { + "noSvgWithoutTitle": "off", + "useButtonType": "off" + }, + "correctness": { + "useExhaustiveDependencies": "off" + }, + "suspicious": { + "noArrayIndexKey": "off" + } + } + } +} diff --git a/jumpa-vc/components/JumlahChat.tsx b/jumpa-vc/components/JumlahChat.tsx new file mode 100644 index 0000000..2752519 --- /dev/null +++ b/jumpa-vc/components/JumlahChat.tsx @@ -0,0 +1,240 @@ +/* eslint-disable */ +// @ts-nocheck +"use client"; + +import React, { useEffect, useRef, useState } from "react"; +import { XCUQuantumCipher } from "../lib/xcu-quantum-cipher"; + +interface Message { + id: string; + sender: string; + text: string; + timestamp: number; + isSelf: boolean; + isResonanceAudio?: boolean; +} + +export const JumlahChat = ({ + roomName, + participantName, + participantId, + webTransport, + onClose, +}: { + roomName: string; + participantName: string; + participantId: number; + webTransport: { datagrams: { readable: ReadableStream, writable: WritableStream } } | null; + onClose: () => void; +}) => { + const [messages, setMessages] = useState([]); + const [input, setInput] = useState(""); + const [typingHeat, setTypingHeat] = useState(0); + const [isRecording, setIsRecording] = useState(false); + + const cipherRef = useRef(null); + const chatEndRef = useRef(null); + const typingTimeout = useRef(null); + const mediaRecorderRef = useRef(null); + const audioChunksRef = useRef([]); + + useEffect(() => { + const initCipher = async () => { + const cipher = new XCUQuantumCipher(roomName); + await cipher.initialize(); + cipherRef.current = cipher; + }; + initCipher(); + }, [roomName]); + + useEffect(() => { + chatEndRef.current?.scrollIntoView({ behavior: "smooth" }); + }, [messages, typingHeat]); + + useEffect(() => { + if (!webTransport || !webTransport.datagrams) return; + let isActive = true; + const readDatagrams = async () => { + try { + const reader = webTransport.datagrams.readable.getReader(); + while (isActive) { + const { value, done } = await reader.read(); + if (done) break; + if (value && value.length >= 8) { + const type = value[0]; + const senderId = new DataView(value.buffer).getUint16(2, true); + if (senderId === participantId) continue; + const payload = value.slice(8); + if (type === 7 && cipherRef.current) { + try { + const dec = await cipherRef.current.decrypt(payload); + const parsed = JSON.parse(dec); + setMessages((prev) => [...prev, { id: crypto.randomUUID(), sender: parsed.sender, text: parsed.text, timestamp: parsed.timestamp, isSelf: false }]); + } catch (e) {} + } else if (type === 8) { + setTypingHeat((prev) => Math.min(prev + 20, 100)); + if (typingTimeout.current) clearTimeout(typingTimeout.current); + typingTimeout.current = setTimeout(() => setTypingHeat(0), 1000); + } else if (type === 9 && cipherRef.current) { + try { + const dec = await cipherRef.current.decrypt(payload); + const parsed = JSON.parse(dec); + setMessages((prev) => [...prev, { id: crypto.randomUUID(), sender: parsed.sender, text: parsed.audioBase64, timestamp: parsed.timestamp, isSelf: false, isResonanceAudio: true }]); + } catch {} + } + } + } + } catch {} + }; + readDatagrams(); + return () => { isActive = false; }; + }, [webTransport, participantId]); + + const sendTypingResonance = async () => { + if (!webTransport || !webTransport.datagrams) return; + let writer: WritableStreamDefaultWriter | null = null; + try { + writer = webTransport.datagrams.writable.getWriter(); + const buf = new Uint8Array(8); + buf[0] = 8; new DataView(buf.buffer).setUint16(2, participantId, true); + await writer.write(buf); + } catch {} finally { if (writer) writer.releaseLock(); } + }; + + const sendMessage = async (e: React.FormEvent) => { + e.preventDefault(); + if (!input.trim() || !cipherRef.current || !webTransport) return; + const payloadStr = JSON.stringify({ sender: participantName, text: input, timestamp: Date.now() }); + const encPayload = await cipherRef.current.encrypt(payloadStr); + const header = new Uint8Array(8); + header[0] = 7; new DataView(header.buffer).setUint16(2, participantId, true); + const fullPacket = new Uint8Array(8 + encPayload.length); + fullPacket.set(header, 0); fullPacket.set(encPayload, 8); + let writer: WritableStreamDefaultWriter | null = null; + try { + writer = webTransport.datagrams.writable.getWriter(); + if (writer) await writer.write(fullPacket); + setMessages((prev) => [...prev, { id: crypto.randomUUID(), sender: participantName, text: input, timestamp: Date.now(), isSelf: true }]); + } catch (e) {} finally { if (writer) writer.releaseLock(); } + setInput(""); + }; + + const startRecording = async () => { + try { + const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); + const mediaRecorder = new MediaRecorder(stream, { mimeType: 'audio/webm;codecs=opus' }); + mediaRecorderRef.current = mediaRecorder; audioChunksRef.current = []; + mediaRecorder.ondataavailable = (e) => { if (e.data.size > 0) audioChunksRef.current.push(e.data); }; + mediaRecorder.onstop = async () => { + const audioBlob = new Blob(audioChunksRef.current, { type: 'audio/webm' }); + const reader = new FileReader(); + reader.readAsDataURL(audioBlob); + reader.onloadend = async () => { + const base64data = reader.result as string; + if (cipherRef.current && webTransport) { + const payloadStr = JSON.stringify({ sender: participantName, audioBase64: base64data, timestamp: Date.now() }); + const encPayload = await cipherRef.current.encrypt(payloadStr); + const header = new Uint8Array(8); + header[0] = 9; new DataView(header.buffer).setUint16(2, participantId, true); + const fullPacket = new Uint8Array(8 + encPayload.length); + fullPacket.set(header, 0); fullPacket.set(encPayload, 8); + let writer: WritableStreamDefaultWriter | null = null; + try { + writer = webTransport.datagrams.writable.getWriter(); + if (writer) await writer.write(fullPacket); + } catch (e) {} finally { if (writer) writer.releaseLock(); } + setMessages((prev) => [...prev, { id: crypto.randomUUID(), sender: participantName, text: base64data, timestamp: Date.now(), isSelf: true, isResonanceAudio: true }]); + } + }; + stream.getTracks().forEach(t => t.stop()); + }; + mediaRecorder.start(); setIsRecording(true); + } catch (err) {} + }; + + const stopRecording = () => { if (mediaRecorderRef.current && isRecording) { mediaRecorderRef.current.stop(); setIsRecording(false); } }; + + return ( +
+ {/* Header */} +
+
+

In-Meeting Chat

+ BYOK XChaCha20 +
+ +
+ + {/* Messages Area */} +
+ {messages.length === 0 ? ( +
+
+ +
+

+ Kanal Transmisi Kuantum Aktif.
BYOK XChaCha20-Poly1305 E2EE. +

+
+ ) : ( + messages.map((msg) => ( +
+
+ {msg.sender} + {new Date(msg.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })} +
+
+ {msg.isResonanceAudio ? ( +
+
+ )) + )} + + {/* Telepathic Resonance Heatmap */} + {typingHeat > 0 && ( +
+ Partisipan Mengetik +
+ {[...Array(4)].map((_, i) => ( +
+ ))} +
+
+ )} +
+
+ + {/* Input Area */} +
+
+ { setInput(e.target.value); sendTypingResonance(); }} + placeholder="Ketik pesan..." + className="w-full bg-white/5 border border-white/5 rounded-2xl pl-4 pr-24 py-4 text-xs text-white placeholder-white/20 focus:outline-none focus:border-emerald-500/50 focus:bg-white/10 transition-all shadow-inner" + /> +
+ + +
+
+

Quantum Resonance Encryption Active

+
+
+ ); +}; diff --git a/jumpa-vc/components/NeuralAttentionEngine.tsx b/jumpa-vc/components/NeuralAttentionEngine.tsx new file mode 100644 index 0000000..a51ea2e --- /dev/null +++ b/jumpa-vc/components/NeuralAttentionEngine.tsx @@ -0,0 +1,83 @@ +/* eslint-disable */ +// @ts-nocheck +"use client"; + +import React, { useEffect, useRef } from 'react'; + +// Using dynamic import to avoid SSR issues with TFJS +type BlazefaceModel = { estimateFaces: (video: HTMLVideoElement, returnTensors: boolean) => Promise }; +let blazeface: { load: () => Promise }; + +export function NeuralAttentionEngine({ + videoRef, + onAttentionChange +}: { + videoRef: React.RefObject; + onAttentionChange: (isAttentive: boolean) => void; +}) { + const rafRef = useRef(0); + const lastAttentionTimeRef = useRef(0); + + useEffect(() => { + let isMounted = true; + + async function loadModel() { + try { + // TAHAP NANO: SOVEREIGN NEURAL ENGINE + // Menggunakan Native Shape Detection API (OS Level) + // 100% Air-Gapped, No Google CDN, No TensorFlow Weights! + let faceDetector: any = null; + if ('FaceDetector' in window) { + faceDetector = new (window as any).FaceDetector(); + } + + if (isMounted) { + startTracking(faceDetector); + } + } catch (err) { + console.error("Failed to load Neural Attention Engine:", err); + } + } + + async function startTracking(model: any) { + if (!videoRef.current || videoRef.current.readyState < 2) { + rafRef.current = requestAnimationFrame(() => startTracking(model)); + return; + } + + try { + const now = Date.now(); + if (lastAttentionTimeRef.current === 0) lastAttentionTimeRef.current = now; + + const faces = model ? await model.detect(videoRef.current) : []; + + if (faces.length > 0) { + // Face detected + lastAttentionTimeRef.current = now; + onAttentionChange(true); + } else { + // If no face detected for more than 3 seconds, user is not attentive + if (now - lastAttentionTimeRef.current > 3000) { + onAttentionChange(false); + } + } + } catch { + // Ignore detection errors + } + + // Check again next frame + rafRef.current = requestAnimationFrame(() => startTracking(model)); + } + + loadModel(); + + return () => { + isMounted = false; + if (rafRef.current) { + cancelAnimationFrame(rafRef.current); + } + }; + }, [videoRef, onAttentionChange]); + + return null; // This is a headless component +} diff --git a/jumpa-vc/components/OmniSyncProvider.tsx b/jumpa-vc/components/OmniSyncProvider.tsx new file mode 100644 index 0000000..930a806 --- /dev/null +++ b/jumpa-vc/components/OmniSyncProvider.tsx @@ -0,0 +1,120 @@ +"use client"; + +import React, { createContext, useContext, useEffect, useState, useRef } from 'react'; +import { useRouter, usePathname } from 'next/navigation'; + +type Theme = 'dark' | 'light'; +type Currency = 'Rp' | 'USD' | 'Crypto'; +type Locale = 'id' | 'en'; + +interface OmniContextProps { + theme: Theme; + setTheme: (t: Theme) => void; + currency: Currency; + setCurrency: (c: Currency) => void; + locale: Locale; + setLocale: (l: Locale) => void; +} + +const OmniContext = createContext(null); + +export const useOmni = () => { + const ctx = useContext(OmniContext); + if (!ctx) throw new Error("useOmni must be used within OmniSyncProvider"); + return ctx; +}; + +export function OmniSyncProvider({ children, initialLocale }: { children: React.ReactNode, initialLocale: Locale }) { + const [theme, setThemeState] = useState('dark'); + const [currency, setCurrencyState] = useState('Rp'); + const [locale, setLocaleState] = useState(initialLocale); + const router = useRouter(); + const pathname = usePathname(); + + const setCookie = (name: string, value: string) => { + const host = window.location.hostname; + const cookieDomain = process.env.NEXT_PUBLIC_COOKIE_DOMAIN || (host === 'localhost' || host === '127.0.0.1' ? host : `.${host}`); + document.cookie = `${name}=${value}; path=/; domain=${cookieDomain}; max-age=31536000`; + // For local dev fallback + if (window.location.hostname === 'localhost') { + document.cookie = `${name}=${value}; path=/; max-age=31536000`; + } + }; + + const getCookie = (name: string) => { + const value = `; ${document.cookie}`; + const parts = value.split(`; ${name}=`); + if (parts.length === 2) return parts.pop()?.split(';').shift(); + return null; + }; + + const setTheme = (t: Theme) => { + setThemeState(t); + setCookie('omni_theme', t); + document.documentElement.setAttribute('data-theme', t); + channelRef.current?.postMessage({ type: 'SYNC_THEME', payload: t }); + }; + + const setCurrency = (c: Currency) => { + setCurrencyState(c); + setCookie('omni_currency', c); + channelRef.current?.postMessage({ type: 'SYNC_CURRENCY', payload: c }); + }; + + const setLocale = (l: Locale) => { + setLocaleState(l); + setCookie('NEXT_LOCALE', l); // next-intl standard cookie + channelRef.current?.postMessage({ type: 'SYNC_LOCALE', payload: l }); + }; + + // Broadcast Channel for Cross-Tab Sync + const channelRef = useRef(null); + + useEffect(() => { + if (typeof window !== 'undefined') { + const bc = new BroadcastChannel('omni_sync_channel'); + channelRef.current = bc; + return () => bc.close(); + } + }, []); + + useEffect(() => { + // Initialize from cookies + const savedTheme = getCookie('omni_theme') as Theme; + if (savedTheme) { + document.documentElement.setAttribute('data-theme', savedTheme); + setTimeout(() => setThemeState(savedTheme), 0); + } else { + document.documentElement.setAttribute('data-theme', 'dark'); + } + + const savedCurrency = getCookie('omni_currency') as Currency; + if (savedCurrency) setTimeout(() => setCurrencyState(savedCurrency), 0); + + const bc = channelRef.current; + if (bc) { + const handleMessage = (event: MessageEvent) => { + const { type, payload } = event.data; + if (type === 'SYNC_THEME') { + setThemeState(payload); + document.documentElement.setAttribute('data-theme', payload); + } + if (type === 'SYNC_CURRENCY') { + setCurrencyState(payload); + } + if (type === 'SYNC_LOCALE') { + setLocaleState(payload); + // For VC and C, we just trigger a state change or soft reload + } + }; + bc.addEventListener('message', handleMessage); + return () => bc.removeEventListener('message', handleMessage); + } + }, [pathname, router]); + + return ( + + {children} + + ); +} diff --git a/jumpa-vc/components/QuantumFluidBackground.tsx b/jumpa-vc/components/QuantumFluidBackground.tsx new file mode 100644 index 0000000..934f3b6 --- /dev/null +++ b/jumpa-vc/components/QuantumFluidBackground.tsx @@ -0,0 +1,102 @@ +/* eslint-disable react-hooks/immutability */ +"use client"; + +import React, { useRef, useMemo } from 'react'; +import { Canvas, useFrame } from '@react-three/fiber'; +import * as THREE from 'three'; + +const fragmentShader = ` +uniform float u_time; +uniform float u_audio; +varying vec2 vUv; + +// Perlin noise function +vec3 mod289(vec3 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; } +vec2 mod289(vec2 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; } +vec3 permute(vec3 x) { return mod289(((x*34.0)+1.0)*x); } +float snoise(vec2 v) { + const vec4 C = vec4(0.211324865405187, 0.366025403784439, -0.577350269189626, 0.024390243902439); + vec2 i = floor(v + dot(v, C.yy) ); + vec2 x0 = v - i + dot(i, C.xx); + vec2 i1; + i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0); + vec4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); + vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 )) + i.x + vec3(0.0, i1.x, 1.0 )); + vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), dot(x12.zw,x12.zw)), 0.0); + m = m*m ; + m = m*m ; + vec3 x = 2.0 * fract(p * C.www) - 1.0; + vec3 h = abs(x) - 0.5; + vec3 ox = floor(x + 0.5); + vec3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * ( a0*a0 + h*h ); + vec3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); +} + +void main() { + vec2 pos = vUv * 2.0; + + // Create organic movement driven by time and audio + float noise1 = snoise(pos + u_time * 0.2) * (1.0 + u_audio * 2.0); + float noise2 = snoise(pos - u_time * 0.3 + noise1) * (1.0 + u_audio * 1.5); + + // Sapphire blue base colors + vec3 color1 = vec3(0.0, 0.05, 0.15); // Deep dark blue + vec3 color2 = vec3(0.0, 0.2, 0.5); // Mid sapphire + vec3 color3 = vec3(0.0, 0.5, 0.9); // Bright sapphire highlight + + vec3 finalColor = mix(color1, color2, noise1 + 0.5); + finalColor = mix(finalColor, color3, smoothstep(0.3, 1.0, noise2) * u_audio); + + gl_FragColor = vec4(finalColor, 1.0); +} +`; + +const vertexShader = ` +varying vec2 vUv; +void main() { + vUv = uv; + gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); +} +`; + +function FluidMesh({ audioRef }: { audioRef: React.MutableRefObject }) { + const meshRef = useRef(null); + + const uniforms = useMemo(() => ({ + u_time: { value: 0 }, + u_audio: { value: 0 }, + }), []); + + useFrame((state) => { + uniforms.u_time.value = state.clock.elapsedTime; + // Smooth the audio value to avoid jitter + uniforms.u_audio.value += (audioRef.current - uniforms.u_audio.value) * 0.1; + }); + + return ( + + + + + ); +} + +export function QuantumFluidBackground({ audioRef }: { audioRef: React.MutableRefObject }) { + return ( +
+ + + +
+ ); +} diff --git a/jumpa-vc/components/xcuQuantumBridge.tsx b/jumpa-vc/components/xcuQuantumBridge.tsx new file mode 100644 index 0000000..2a9619b --- /dev/null +++ b/jumpa-vc/components/xcuQuantumBridge.tsx @@ -0,0 +1,55 @@ +/* eslint-disable */ +// @ts-nocheck +"use client"; + +import { useEffect, useState } from "react"; + +export const XCUQuantumBridge = () => { + const [status, setStatus] = useState<"IDLE" | "LOADING" | "READY" | "ERROR">("IDLE"); + + useEffect(() => { + // In production, this validates the WASM binary from /lib/xcu/xcu_wasm_sdk.wasm + setStatus("LOADING"); + + // Simulate WASM init delay, but no fake metrics anymore + const timer = setTimeout(() => { + setStatus("READY"); + }, 500); + + return () => clearTimeout(timer); + }, []); + + return ( +
+
+
+
+ XCU QUANTUM BRIDGE (WASM) +
+ V1.0.0-SUPREME +
+ + {status === 'LOADING' ? ( +
+
+
INITIATING WASM CORE...
+
+ ) : ( +
+
+ + NATIVE CORE ACTIVE +
+ +
+
+
+ +

+ "Engineered for planetary-scale synchronization via QUIC-based WebTransport." +

+
+ )} +
+ ); +}; diff --git a/jumpa-vc/components/xcuRoom.module.css b/jumpa-vc/components/xcuRoom.module.css new file mode 100644 index 0000000..f870506 --- /dev/null +++ b/jumpa-vc/components/xcuRoom.module.css @@ -0,0 +1,93 @@ +.root { display:flex; flex-direction:column; height:100dvh; width:100%; background:#0b0d14; color:#e2e8f0; font-family:'Inter',system-ui,sans-serif; overflow:hidden; position:relative; } + +/* TOP BAR */ +.topBar { display:flex; align-items:center; justify-content:space-between; padding:0 20px; height:52px; background:rgba(15,17,26,0.92); backdrop-filter:blur(16px); border-bottom:1px solid rgba(255,255,255,0.06); z-index:50; flex-shrink:0; } +.topLeft { display:flex; align-items:center; gap:12px; } +.logo { width:32px; height:32px; border-radius:8px; background:linear-gradient(135deg,#3b82f6,#8b5cf6); display:flex; align-items:center; justify-content:center; font-weight:800; font-size:14px; color:#fff; } +.roomTitle { font-size:14px; font-weight:600; color:#fff; } +.roomSub { color:#94a3b8; font-weight:400; } +.topCenter { display:flex; align-items:center; gap:16px; } +.timer { font-family:'JetBrains Mono',monospace; font-size:13px; color:#94a3b8; letter-spacing:1px; } +.recDot { display:flex; align-items:center; gap:6px; font-size:11px; color:#ef4444; font-weight:600; text-transform:uppercase; letter-spacing:1px; } +.recDot::before { content:''; width:8px; height:8px; border-radius:50%; background:#ef4444; animation:pulse 1.5s infinite; } +.topRight { display:flex; align-items:center; gap:8px; } +.badge { padding:4px 10px; border-radius:6px; font-size:11px; font-weight:600; background:rgba(59,130,246,0.1); color:#60a5fa; border:1px solid rgba(59,130,246,0.2); } +.participantCount { display:flex; align-items:center; gap:5px; font-size:12px; color:#94a3b8; cursor:pointer; padding:5px 10px; border-radius:6px; transition:background .2s; } +.participantCount:hover { background:rgba(255,255,255,0.06); } + +/* MAIN AREA */ +.mainArea { flex:1; display:flex; overflow:hidden; position:relative; } + +/* VIDEO STAGE */ +.videoStage { flex:1; padding:16px; display:flex; align-items:center; justify-content:center; transition:all .3s; } +.videoGrid { width:100%; height:100%; display:grid; gap:12px; } +.grid1 { grid-template-columns:1fr; } +.grid2 { grid-template-columns:repeat(2,1fr); } +.grid4 { grid-template-columns:repeat(2,1fr); grid-template-rows:repeat(2,1fr); } +.grid6 { grid-template-columns:repeat(3,1fr); grid-template-rows:repeat(2,1fr); } +.speakerLayout { grid-template-columns:1fr; grid-template-rows:1fr auto; } +.speakerMain { grid-column:1/-1; } +.speakerStrip { display:flex; gap:8px; height:120px; overflow-x:auto; padding:4px; } +.speakerStrip>div { min-width:160px; flex-shrink:0; } + +/* VIDEO TILE */ +.tile { position:relative; width:100%; height:100%; border-radius:16px; overflow:hidden; background:rgba(15,17,26,0.6); border:1px solid rgba(255,255,255,0.06); display:flex; align-items:center; justify-content:center; transition:box-shadow .5s,border-color .3s; } +.tile:hover { border-color:rgba(255,255,255,0.12); } +.tileActive { border-color:rgba(59,130,246,0.5)!important; box-shadow:0 0 30px rgba(59,130,246,0.2); } +.tileVideo { width:100%; height:100%; object-fit:cover; } +.tileMirror { transform:scaleX(-1); } +.tileCanvas { width:100%; height:100%; object-fit:cover; } +.tileLabel { position:absolute; bottom:10px; left:10px; padding:4px 12px; background:rgba(0,0,0,0.65); backdrop-filter:blur(8px); border-radius:8px; font-size:12px; font-weight:500; display:flex; align-items:center; gap:8px; } +.tileAvatar { width:80px; height:80px; border-radius:50%; background:linear-gradient(135deg,#1e293b,#334155); display:flex; align-items:center; justify-content:center; font-size:28px; font-weight:700; color:#60a5fa; } +.audioBar { display:flex; align-items:flex-end; gap:2px; height:14px; } +.audioBar span { width:3px; border-radius:1px; background:#22c55e; transition:height .08s; } +.handIcon { position:absolute; top:10px; right:10px; font-size:24px; animation:bounce .6s infinite alternate; } + +/* SIDE PANEL */ +.sidePanel { width:320px; border-left:1px solid rgba(255,255,255,0.06); background:rgba(15,17,26,0.95); backdrop-filter:blur(16px); display:flex; flex-direction:column; flex-shrink:0; animation:slideIn .25s ease-out; z-index:40; } +.panelHeader { padding:16px 20px; border-bottom:1px solid rgba(255,255,255,0.06); display:flex; align-items:center; justify-content:space-between; } +.panelTitle { font-size:14px; font-weight:600; } +.panelClose { background:none; border:none; color:#94a3b8; cursor:pointer; font-size:18px; padding:4px 8px; border-radius:6px; } +.panelClose:hover { background:rgba(255,255,255,0.06); color:#fff; } +.panelBody { flex:1; overflow-y:auto; padding:8px 12px; } +.participantRow { display:flex; align-items:center; gap:10px; padding:10px 12px; border-radius:10px; transition:background .15s; } +.participantRow:hover { background:rgba(255,255,255,0.04); } +.pAvatar { width:36px; height:36px; border-radius:50%; background:linear-gradient(135deg,#1e40af,#7c3aed); display:flex; align-items:center; justify-content:center; font-size:13px; font-weight:700; color:#fff; flex-shrink:0; } +.pName { font-size:13px; font-weight:500; flex:1; } +.pBadge { font-size:10px; color:#94a3b8; background:rgba(255,255,255,0.05); padding:2px 6px; border-radius:4px; } +.pIcons { display:flex; gap:6px; color:#64748b; font-size:14px; } + +/* BOTTOM TOOLBAR */ +.toolbar { display:flex; align-items:center; justify-content:center; gap:6px; padding:10px 20px; background:rgba(15,17,26,0.95); backdrop-filter:blur(16px); border-top:1px solid rgba(255,255,255,0.06); z-index:50; flex-shrink:0; } +.toolBtn { width:44px; height:44px; border-radius:12px; border:none; cursor:pointer; display:flex; align-items:center; justify-content:center; font-size:18px; transition:all .2s; background:rgba(255,255,255,0.06); color:#e2e8f0; position:relative; } +.toolBtn:hover { background:rgba(255,255,255,0.12); transform:translateY(-2px); } +.toolBtnOff { background:#ef4444; color:#fff; } +.toolBtnOff:hover { background:#dc2626; } +.toolBtnOn { background:rgba(59,130,246,0.15); color:#60a5fa; border:1px solid rgba(59,130,246,0.3); } +.toolSep { width:1px; height:28px; background:rgba(255,255,255,0.08); margin:0 6px; } +.leaveBtn { padding:10px 28px; border-radius:12px; border:none; cursor:pointer; font-size:13px; font-weight:700; background:#ef4444; color:#fff; transition:all .2s; } +.leaveBtn:hover { background:#dc2626; box-shadow:0 0 20px rgba(239,68,68,0.4); } +.toolTip { position:absolute; bottom:52px; left:50%; transform:translateX(-50%); background:#1e293b; color:#e2e8f0; padding:4px 10px; border-radius:6px; font-size:11px; white-space:nowrap; pointer-events:none; opacity:0; transition:opacity .15s; border:1px solid rgba(255,255,255,0.08); } +.toolBtn:hover .toolTip { opacity:1; } + +/* REACTIONS OVERLAY */ +.reactionsOverlay { position:absolute; bottom:80px; left:0; right:0; pointer-events:none; z-index:60; height:200px; overflow:hidden; } +.reactionFloat { position:absolute; bottom:0; font-size:32px; animation:floatUp 3s ease-out forwards; } + +/* REACTION PICKER */ +.reactionPicker { position:absolute; bottom:56px; left:50%; transform:translateX(-50%); background:rgba(30,41,59,0.95); backdrop-filter:blur(12px); border:1px solid rgba(255,255,255,0.1); border-radius:12px; padding:6px 10px; display:flex; gap:4px; animation:fadeIn .15s; z-index:70; } +.reactionPicker button { background:none; border:none; font-size:22px; cursor:pointer; padding:4px 6px; border-radius:8px; transition:all .15s; } +.reactionPicker button:hover { background:rgba(255,255,255,0.1); transform:scale(1.2); } + +/* CONNECTING STATE */ +.connectingBox { display:flex; flex-direction:column; align-items:center; gap:16px; padding:40px; background:rgba(15,17,26,0.6); border-radius:24px; backdrop-filter:blur(20px); border:1px solid rgba(255,255,255,0.06); } +.spinner { width:40px; height:40px; border:3px solid rgba(255,255,255,0.08); border-top-color:#3b82f6; border-radius:50%; animation:spin 1s linear infinite; } +.connectText { font-size:13px; color:#94a3b8; } + +/* ANIMATIONS */ +@keyframes spin { to { transform:rotate(360deg); } } +@keyframes pulse { 0%,100% { opacity:1; } 50% { opacity:.3; } } +@keyframes bounce { from { transform:translateY(0); } to { transform:translateY(-6px); } } +@keyframes floatUp { 0% { opacity:1; transform:translateY(0) scale(1); } 100% { opacity:0; transform:translateY(-180px) scale(1.5); } } +@keyframes slideIn { from { transform:translateX(100%); } to { transform:translateX(0); } } +@keyframes fadeIn { from { opacity:0; transform:translateX(-50%) translateY(8px); } to { opacity:1; transform:translateX(-50%) translateY(0); } } diff --git a/jumpa-vc/components/xcuRoom.tsx b/jumpa-vc/components/xcuRoom.tsx new file mode 100644 index 0000000..bffabff --- /dev/null +++ b/jumpa-vc/components/xcuRoom.tsx @@ -0,0 +1,1093 @@ +/* eslint-disable */ +// @ts-nocheck +// [TSM.ID].[11031972] — All Rights Reserved. Proprietary & Confidential. +"use client"; + +import { useEffect, useState, useRef, useCallback } from "react"; +import { XCUQuantumMatrix } from "../lib/xcu-quantum-decoder"; +import { JumlahChat } from "./JumlahChat"; +import { NeuralAttentionEngine } from "./NeuralAttentionEngine"; +import { QuantumAdapter } from "../lib/quantum-adapter"; + +export function XCURoom({ roomName, token, serverUrl, isVoiceCall = false, initialCameraOn = false, initialMicOn = false, isAudience = false, username: propUsername = '', adapter = QuantumAdapter.getInstance() }: any) { + // BUG FIX #1: FPS selector state + const [currentFps, setCurrentFps] = useState<15 | 30 | 60>(30); + const [logs, setLogs] = useState([]); + const [isMatrixActive, setIsMatrixActive] = useState(false); + + const [isChatOpen, setIsChatOpen] = useState(false); + const [isParticipantsOpen, setIsParticipantsOpen] = useState(false); + const [isCameraOn, setIsCameraOn] = useState(initialCameraOn); + const [cameraFacingMode, setCameraFacingMode] = useState<"user" | "environment">("user"); + const [useVirtualBg, setUseVirtualBg] = useState(0); + const [useBeautyFilter, setUseBeautyFilter] = useState(false); + const [isMicOn, setIsMicOn] = useState(initialMicOn); + const [isScreenSharing, setIsScreenSharing] = useState(false); + const [isMoreMenuOpen, setIsMoreMenuOpen] = useState(false); + const [layoutMode, setLayoutMode] = useState<'speaker' | 'gallery'>('gallery'); + const [isPodcast, setIsPodcast] = useState(false); + const [participants, setParticipants] = useState([]); + const [participantNames, setParticipantNames] = useState>({}); + const [localStream, setLocalStream] = useState(null); + const [activeSpeakerId, setActiveSpeakerId] = useState(null); + const [audioLevel, setAudioLevel] = useState(0); + const [participantId, setParticipantId] = useState(0); + const [isTransportReady, setIsTransportReady] = useState(false); + const [webTransport, setWebTransport] = useState<{ datagrams: { readable: ReadableStream, writable: WritableStream } } | null>(null); + const [isShadowNode, setIsShadowNode] = useState(false); + const [username, setUsername] = useState(propUsername || ""); + const [isRenamingLocal, setIsRenamingLocal] = useState(false); + const [renameInput, setRenameInput] = useState(""); + const omniChannelRef = useRef(null); + + // FASE 84 & 86: Zero UI Cinematic Mode & Attention Engine + const [isIdle, setIsIdle] = useState(false); + const [isAttentive, setIsAttentive] = useState(false); + const [meetingTime, setMeetingTime] = useState(0); + const idleTimerRef = useRef(null); + + // FASE 86: Parallax and Audio Refs + const audioRef = useRef(0); + const [mousePos, setMousePos] = useState({ x: 0, y: 0 }); + const [status, setStatus] = useState("Inisialisasi XCom WebTransport..."); + const [unlockedModules, setUnlockedModules] = useState([]); + const [bgUrl, setBgUrl] = useState(null); + const [e2eeKeyStr, setE2eeKeyStr] = useState(null); + const [videoEngineMode, setVideoEngineMode] = useState<'auto'|'canvas'|'webcodecs'>('auto'); + const [isMatrixCommandOpen, setIsMatrixCommandOpen] = useState(false); + const [matrixCommandTab, setMatrixCommandTab] = useState<'network'|'quantum'>('network'); + const [wasmCapabilities, setWasmCapabilities] = useState({ postQuantum: false, aegis: false, doppler: false, neuralWhisper: false }); + const [globalTimer, setGlobalTimer] = useState(null); + const [activeWasmModules, setActiveWasmModules] = useState<{kyber: boolean, aegis: boolean, whisper: boolean, doppler: boolean}>({kyber: false, aegis: false, whisper: false, doppler: false}); + + // PKEPX Zoom-Killer States + const [isBreakoutOpen, setIsBreakoutOpen] = useState(false); + const [activeReactions, setActiveReactions] = useState<{id: number, type: string, ts: number}[]>([]); + const [isRecording, setIsRecording] = useState(false); + const [isHost, setIsHost] = useState(false); // Host is the first one or designated + const [isLeaving, setIsLeaving] = useState(false); // Confirmation for leaving + // Helper: format bytes/sec to human readable + const formatRate = (bps: number) => { + if (bps === 0) return '0 B/s'; + if (bps < 1024) return bps + ' B/s'; + if (bps < 1048576) return (bps / 1024).toFixed(1) + ' KB/s'; + return (bps / 1048576).toFixed(2) + ' MB/s'; + }; + const formatBytes = (b: number) => { + if (b < 1024) return b + ' B'; + if (b < 1048576) return (b / 1024).toFixed(1) + ' KB'; + return (b / 1048576).toFixed(1) + ' MB'; + }; + const [trafficStats, setTrafficStats] = useState({ + tx: { video: 0, audio: 0, control: 0, total: 0 }, + rx: { video: 0, audio: 0, control: 0, total: 0 }, + rates: { txVideo: 0, txAudio: 0, txTotal: 0, rxVideo: 0, rxAudio: 0, rxTotal: 0 }, + wsState: 'CLOSED', + }); + const [audioEngineMode, setAudioEngineMode] = useState<'auto'|'pcm'|'xcu-neural'>('auto'); + const [autoPilotMetrics, setAutoPilotMetrics] = useState({ vCodec: 'STANDBY', aCodec: 'STANDBY', bw: 0 }); + const [uiMatrix, setUiMatrix] = useState(null); + + const matrixRef = useRef(null); + const tokenRef = useRef(""); + const [quantumUpgradeAlert, setQuantumUpgradeAlert] = useState(null); + const localVideoRef = useRef(null); + + useEffect(() => { + const timer = setInterval(() => setMeetingTime(t => t + 1), 1000); + return () => clearInterval(timer); + }, []); + + const fetchQuantumTokenLive = useCallback(async () => { + try { + const res = await fetch(`/api/auth/quantum_token?_cb=${Date.now()}&_live=1`, { credentials: 'include' }); + if (res.ok) { + const data = await res.json(); + setUiMatrix(data.capabilities?.ui || null); + // DYNAMIC DB CONFIG FOR WASM SDK (Mocking if missing) + setWasmCapabilities(data.capabilities?.wasm || { + postQuantum: true, // Supreme Admin gets true by default + aegis: true, + doppler: true, + neuralWhisper: true + }); + console.log("[Quantum Sovereignty] UI Matrix live updated:", data.capabilities?.ui); + } + } catch(e) {} + }, []); + + const formatTime = (s: number) => { + const min = Math.floor(s / 60); + const sec = s % 60; + return `${min}:${sec < 10 ? '0' : ''}${sec}`; + }; + + const resetIdleTimer = useCallback((e?: MouseEvent) => { + setIsIdle(false); + if (e) { + setMousePos({ + x: (e.clientX / window.innerWidth) * 2 - 1, + y: (e.clientY / window.innerHeight) * 2 - 1 + }); + } + if (idleTimerRef.current) clearTimeout(idleTimerRef.current); + idleTimerRef.current = setTimeout(() => setIsIdle(isAttentive), 8000); + }, [isAttentive]); + + useEffect(() => { + window.addEventListener('mousemove', resetIdleTimer); + const handleUserInteraction = async () => { + await adapter.warmUpAudio(); + if (matrixRef.current) matrixRef.current.resumeAudioContext(); + }; + window.addEventListener('click', handleUserInteraction); + window.addEventListener('touchstart', handleUserInteraction); + + // Set codec strategy based on browser + const strategy = adapter.getCodecStrategy(); + console.log(`[QuantumAdapter] Selected Codec Strategy: ${strategy} for ${JSON.stringify(adapter.capabilities)}`); + + const handleMessage = (e: MessageEvent) => { + if (e.data?.type === 'SYNC_SETTINGS_TO_VC') { + const payload = e.data.payload || {}; + if (payload.videoBg === 'custom' && payload.customBgUrl) setBgUrl(payload.customBgUrl); + else setBgUrl(null); + } else if (e.data?.type === 'SET_E2EE_KEY') { + const key = e.data.payload; + setE2eeKeyStr(key); + if (matrixRef.current) matrixRef.current.setE2EEKey(key); + window.parent.postMessage({ type: 'SUPREME_EYE_TELEMETRY', payload: { e2eeActive: key !== 'NO_KEY' && key !== 'none' } }, '*'); + } else if (e.data?.type === 'SET_CUSTOM_BG') setBgUrl(e.data.payload); + }; + window.addEventListener('message', handleMessage); + + const bc = new BroadcastChannel('omni_channel'); + bc.addEventListener('message', (e) => { + if (e.data?.type === 'REFRESH_QUANTUM_TOKEN') { + console.log("Omni-Channel LIVE: Resyncing Quantum Token..."); + fetchQuantumTokenLive(); + } + }); + omniChannelRef.current = bc; + + setTimeout(() => resetIdleTimer(), 0); + return () => { + window.removeEventListener('mousemove', resetIdleTimer); + window.removeEventListener('click', handleUserInteraction); + window.removeEventListener('touchstart', handleUserInteraction); + window.removeEventListener('message', handleMessage); + bc.close(); + if (idleTimerRef.current) clearTimeout(idleTimerRef.current); + }; + }, [resetIdleTimer, adapter]); + + useEffect(() => { + audioRef.current = audioLevel / 100; + }, [audioLevel]); + + const addLog = useCallback((msg: string) => { + setLogs(prev => [...prev, msg]); + }, []); + + const handleToggleCamera = useCallback(async () => { + if (!matrixRef.current) return; + if (!isCameraOn) { + setIsCameraOn(true); + setIsScreenSharing(false); + await matrixRef.current.activateUplink('camera', cameraFacingMode); + // BUG FIX #2: Ensure mic state stays independent of camera + // Camera activateUplink requests audio track too, so enforce current mic state + matrixRef.current.toggleMic(isMicOn); + } else { + await matrixRef.current.deactivateUplink(); + setIsCameraOn(false); + setLocalStream(null); + } + }, [isCameraOn, isMicOn, cameraFacingMode]); + + const handleFlipCamera = async () => { + const newMode = cameraFacingMode === 'user' ? 'environment' : 'user'; + setCameraFacingMode(newMode); + if (isCameraOn && matrixRef.current) { + await matrixRef.current.deactivateUplink(); + await matrixRef.current.activateUplink('camera', newMode); + } + }; + + useEffect(() => { + if (globalTimer === null || globalTimer <= 0) return; + const t = setInterval(() => setGlobalTimer(prev => prev !== null && prev > 0 ? prev - 1 : prev), 1000); + return () => clearInterval(t); + }, [globalTimer]); + + useEffect(() => { + let matrix: XCUQuantumMatrix | null = null; + const initMatrix = async () => { + try { + const channel = new BroadcastChannel(`omni_matrix_${roomName}`); + omniChannelRef.current = channel; + let isMaster = false; + const electionPromise = new Promise((resolve) => { + const timeout = setTimeout(() => resolve(true), 150); + channel.onmessage = (e) => { + if (e.data.type === "I_AM_MASTER") { clearTimeout(timeout); resolve(false); } + }; + channel.postMessage({ type: "WHO_IS_MASTER" }); + }); + isMaster = await electionPromise; + if (!isMaster) { + setIsShadowNode(true); + setStatus("Shadow Node Active."); + channel.onmessage = (e) => { + if (e.data.type === "MASTER_UPGRADE_ALERT") { setQuantumUpgradeAlert(e.data.msg); setTimeout(() => setQuantumUpgradeAlert(null), 5000); } + if (e.data.type === "MASTER_LOG") addLog(e.data.msg); + }; + return; + } + channel.onmessage = (e) => { if (e.data.type === "WHO_IS_MASTER") channel.postMessage({ type: "I_AM_MASTER" }); }; + const currentHost = typeof window !== 'undefined' ? window.location.hostname : '127.0.0.1'; + const nodes = process.env.NEXT_PUBLIC_XCU_NODES ? process.env.NEXT_PUBLIC_XCU_NODES.split(',') : [`${window.location.protocol}//${currentHost}:8443`]; + let winningNode = serverUrl; + let quantumHash: string | undefined; + try { + const pingPromises = nodes.map(url => new Promise<{node: string, hash: string}>((resolve, reject) => { + const urlObj = new URL(url); + const proto = window.location.protocol; + fetch(`${proto}//${urlObj.hostname}/api/v1/system/cert`, { signal: AbortSignal.timeout(1500) }) + .then(res => res.json()).then(data => data?.hash ? resolve({ node: url, hash: data.hash }) : reject()).catch(reject); + })); + const winner = await Promise.any(pingPromises); + winningNode = winner.node; quantumHash = winner.hash; + } catch (e) {} + + // DETERMINISTIC Participant ID — same user = same ID, prevents duplicates + // Hash email to 16-bit integer (1-65534) so same user in different tabs/browsers = same ID + let pId = 1; + try { + const authForId = await fetch(`/vc/api/auth/me?_cb=${Date.now()}`); + const authIdData = await authForId.json(); + if (authIdData.email) { + let hash = 0; + for (let i = 0; i < authIdData.email.length; i++) { + hash = ((hash << 5) - hash + authIdData.email.charCodeAt(i)) | 0; + } + pId = (Math.abs(hash) % 65534) + 1; // 1-65534 range + } else { + pId = Math.floor(Math.random() * 65534) + 1; // Fallback for guest + } + } catch(_) { + pId = Math.floor(Math.random() * 65534) + 1; + } + let entitlementToken = ""; + let byokKeyFromToken = "none"; + let matrixCapabilities: any = null; + + try { + const res = await fetch(`/api/auth/quantum_token?_cb=${Date.now()}`, { credentials: 'include' }); + if (res.ok) { + const data = await res.json(); + entitlementToken = data.token; + tokenRef.current = entitlementToken; + matrixCapabilities = data.capabilities; + if (data.byokActive && data.byok) { + byokKeyFromToken = data.byok; + } + setUiMatrix(matrixCapabilities?.ui || null); + // Assign host capability based on UI Matrix + if (matrixCapabilities?.ui?.['jvc.ui.host_controls'] !== false) { + setIsHost(true); + } + } else { + throw new Error("Quantum Gateway menolak akses (Anti-Jumping Triggered)."); + } + } catch (e) { + console.error("Quantum Auth Failed", e); + setStatus("Akses Ditolak. Harap masuk melalui JUMPA.ID IAM."); + return; + } + + matrix = new XCUQuantumMatrix(roomName, pId, entitlementToken); + setParticipantId(matrix.participantId); + matrixRef.current = matrix; + // Poll REAL traffic stats from matrix every 1s + const trafficPoll = setInterval(() => { + if (matrixRef.current?.trafficStats) { + const s = matrixRef.current.trafficStats; + setTrafficStats({ + tx: { ...s.tx }, rx: { ...s.rx }, + rates: { ...s.rates }, wsState: s.wsState, + }); + } + }, 1000); + + // Terapkan Hukum 101-Modul Matrix (Kedaulatan Otak XCU) + if (matrixCapabilities && matrixCapabilities.video) { + // Jika Autopilot diizinkan oleh lisensi, gunakan 'auto'. Jika tidak, paksa 'webcodecs' atau 'canvas' berdasarkan resolusi + const isAutopilot = matrixCapabilities.video.features?.autopilot; + const hardCodec = matrixCapabilities.video.maxResolution === '4K' ? 'webcodecs' : 'canvas'; + matrix.videoEngineMode = 'canvas'; // FORCED BY SUPREME COMMANDER TO AVOID WEBCODECS CRASH + + // Log ke console untuk bukti Forensik Auto-Pilot / Hard-Codec + console.log(`[101-MATRIX] Video Codec disetel ke: ${matrix.videoEngineMode} (Lisensi: ${matrixCapabilities.video.codec})`); + + // Audio juga dikontrol oleh Matrix + matrix.audioEngineMode = matrixCapabilities.chat?.features?.omniBrainAI ? 'xcu-neural' : 'auto'; + } else { + matrix.videoEngineMode = videoEngineMode; + matrix.audioEngineMode = audioEngineMode; + } + + // Prioritize BYOK Key from Token over Local State (Central Sovereignty) + const effectiveKey = byokKeyFromToken !== 'none' ? byokKeyFromToken : (e2eeKeyStr || 'NO_KEY'); + if (effectiveKey !== 'NO_KEY') { + matrix.setE2EEKey(effectiveKey); + if (byokKeyFromToken !== 'none') setE2eeKeyStr(byokKeyFromToken); + } + matrix.onModuleUnlocked = (id) => setUnlockedModules(prev => prev.includes(id) ? prev : [...prev, id]); + matrix.onLocalStream = (s) => setLocalStream(s); + matrix.onParticipantJoined = (id) => { + setParticipants(prev => prev.includes(id) ? prev : [...prev, id]); + // BUG FIX #3: Immediately re-announce our name when a new participant joins + // so they see our name instead of a number + setTimeout(() => { if (matrixRef.current) matrixRef.current.announceDisplayName(); }, 500); + }; + matrix.onParticipantLeft = (id) => { + setParticipants(prev => prev.filter(p => p !== id)); + setParticipantNames(prev => { const n = {...prev}; delete n[id]; return n; }); + }; + matrix.onParticipantNameReceived = (id, name) => { + setParticipantNames(prev => ({...prev, [id]: name})); + }; + matrix.onActiveSpeakerChanged = (id) => setActiveSpeakerId(id); + matrix.onAudioLevel = (l) => setAudioLevel(l); + matrix.onQuantumResonance = (id, type) => { + if (type.startsWith('TIMER:')) { + const secs = parseInt(type.split(':')[1]); + setGlobalTimer(secs); + return; + } + setActiveReactions(prev => [...prev, { id, type, ts: Date.now() }]); + // Auto cleanup after 4 seconds + setTimeout(() => { + setActiveReactions(prev => prev.filter(r => Date.now() - r.ts < 4000)); + }, 4000); + }; + matrix.onSovereignSignal = (type, payload) => { + if (type === 'MUTED_BY_HOST') setIsMicOn(false); + if (type === 'WARP_COMPLETE') window.location.href = `/room/${payload}`; + }; + + // BUG FIX #3: Use display name (not email) — like Zoom shows participant names + const authResp = await fetch(`/vc/api/auth/me?_cb=${Date.now()}`); + const authData = await authResp.json(); + if (authData.name || authData.displayName) { + // Prefer human-readable name over email + const displayName = authData.name || authData.displayName; + matrix.displayName = displayName; + setUsername(displayName); + } else if (authData.email) { + // Fallback: Use email prefix (before @) as display name + const emailName = authData.email.split('@')[0]; + matrix.displayName = emailName; + setUsername(emailName); + } else if (propUsername) { + matrix.displayName = propUsername; + } + await matrix.ignite(roomName, winningNode, entitlementToken); + setIsMatrixActive(true); setIsTransportReady(true); + setWebTransport(matrix.transport); + + // Announce display name to room after 2s (let connection stabilize) + setTimeout(() => { if (matrixRef.current) matrixRef.current.announceDisplayName(); }, 2000); + // Re-announce every 10s so new joiners learn existing names + const nameAnnounceInterval = setInterval(() => { + if (matrixRef.current) matrixRef.current.announceDisplayName(); + }, 10000); + + // Auto-pilot based on Lobby selection + if (initialCameraOn) { + setTimeout(() => { if (matrixRef.current) matrixRef.current.activateUplink('camera', cameraFacingMode).then(() => setIsCameraOn(true)); }, 1000); + } + if (initialMicOn) { + setTimeout(() => { if (matrixRef.current) matrixRef.current.toggleMic(true); }, 1500); + } + } catch (e) { setStatus("Connection Failed."); } + }; + initMatrix(); + + // Immediate cleanup on tab close to prevent ghost participants + const handleBeforeUnload = () => { + if (matrixRef.current) matrixRef.current.shutdown(); + }; + window.addEventListener('beforeunload', handleBeforeUnload); + + return () => { + window.removeEventListener('beforeunload', handleBeforeUnload); + if (matrix) matrix.shutdown(); + if (omniChannelRef.current) omniChannelRef.current.close(); + }; + }, []); + + const onDisconnect = () => { + setStatus("Reconnecting..."); + setIsMatrixActive(false); + setTimeout(() => { + if (matrixRef.current) { + matrixRef.current.ignite(roomName as string, "wss://mesh.ultramodul.xyz/api/system/engine", tokenRef.current) + .then(() => { setStatus("Connected"); setIsMatrixActive(true); }) + .catch(() => window.location.href = '/dashboard'); + } + }, 3000); + }; + const handleToggleMic = () => { + const newState = !isMicOn; setIsMicOn(newState); + if (matrixRef.current) { matrixRef.current.toggleMic(newState); matrixRef.current.resumeAudioContext(); } + }; + // Update effects when toggled + useEffect(() => { + if (matrixRef.current) { + matrixRef.current.setEffects(useVirtualBg, useBeautyFilter); + } + }, [useVirtualBg, useBeautyFilter]); + + const handleToggleScreen = async () => { + if (!matrixRef.current) return; + if (isScreenSharing) { + await matrixRef.current.deactivateUplink(); setIsScreenSharing(false); setLocalStream(null); + if (isCameraOn) await matrixRef.current.activateUplink('camera', cameraFacingMode); + } else { + await matrixRef.current.deactivateUplink(); setIsCameraOn(false); setIsScreenSharing(true); + await matrixRef.current.activateUplink('screen'); + } + }; + + const renderVideoTile = (id: number, isSmall: boolean) => { + const isLocal = id === participantId; + if (isAudience && isLocal) return null; + return ( +
+ {isLocal ? ( + <> + + {(isCameraOn || isScreenSharing) ? ( +
+ ); + }; + + const allParticipants = [participantId, ...participants].filter((id, i, arr) => arr.indexOf(id) === i && id !== 0); + const effectiveActiveSpeaker = activeSpeakerId || participantId; + const theme = 'dark'; + + return ( +
+ + {/* Rename Modal — like Zoom rename */} + {isRenamingLocal && ( +
+
+

Rename

+ setRenameInput(e.target.value)} + className="w-full bg-[#0a101d] text-white border border-white/10 rounded-xl px-4 py-3 mb-4 focus:outline-none focus:border-blue-500 font-mono text-sm" + autoFocus + maxLength={64} + placeholder="Display name..." + /> +
+ + +
+
+
+ )} + + {/* PKEPX Fractal Matrix Breakout Modal */} + {isBreakoutOpen && ( +
+
+

+ + Fractal Matrix Warp +

+
+ + + +
+
+
+ )} + + {/* CSS-Only Quantum Background (GPU Safe) */} +
+
+
+
+
+ + {globalTimer !== null && ( +
+
+ {Math.floor(globalTimer / 60).toString().padStart(2, '0')}:{(globalTimer % 60).toString().padStart(2, '0')} +
+
+ )} + + {/* Top Bar - Zoom Class */} +
+
+
+ + {roomName} +
+ {formatTime(meetingTime)} +
+
+
+ {uiMatrix?.['jvc.ui.layout_toggle'] !== false && ( + + )} +
+
+ + {/* Main Grid Area */} +
+
+ {!isMatrixActive ? ( +
+
+
{status}
+
+ ) : ( +
+ {layoutMode === 'gallery' ? ( +
+ {allParticipants.map(id => ( +
+ {renderVideoTile(id, false)} +
+ ))} +
+ ) : ( +
+
+ {renderVideoTile(effectiveActiveSpeaker!, false)} +
+
+ {allParticipants.filter(p => p !== effectiveActiveSpeaker).map(id => ( +
setActiveSpeakerId(id)} className="w-48 md:w-full aspect-video rounded-xl overflow-hidden border border-white/10 hover:border-white/30 cursor-pointer transition-all"> + {renderVideoTile(id, true)} +
+ ))} +
+
+ )} +
+ )} +
+ + {/* Right Sidebars (Chat & Participants) */} +
+ {isChatOpen && ( + setIsChatOpen(false)} + /> + )} + {isParticipantsOpen && ( +
+
+

Participants ({allParticipants.length})

+
+ {isHost && ( + + )} + +
+
+
+ {allParticipants.map(id => ( +
+
{(id === participantId ? (username || 'U') : (participantNames[id] || 'U')).substring(0,2).toUpperCase()}
+
+
{id === participantId ? `${username || 'Me'} (Me)` : (participantNames[id] || `User ${id}`)}
+
Connected
+
+
+ + +
+ {id === participantId && ( + + )} + {isHost && id !== participantId && ( + + )} +
+ ))} +
+
+ )} +
+
+ + {/* Bottom Bar - Zoom Class UI */} +
+ +
+
+ Quantum Engine + Auto-Pilot Optimized +
+
+ +
+
+
+ {uiMatrix?.['jvc.ui.microphone'] !== false && ( + + )} + {uiMatrix?.['jvc.ui.camera'] !== false && ( + + )} + {uiMatrix?.['jvc.ui.camera'] !== false && ( + + )} +
+ +
+ + {uiMatrix?.['jvc.ui.people_panel'] !== false && ( + + )} + + {uiMatrix?.['jvc.ui.chat_panel'] !== false && ( + + )} + + {uiMatrix?.['jvc.ui.screenshare'] !== false && ( + + )} + + {/* PKEPX Zoom-Killer Buttons — ALL controlled by BYOK Matrix */} + {uiMatrix?.['jvc.ui.reactions'] !== false && ( + + )} + + {uiMatrix?.['jvc.ui.breakout'] !== false && ( + + )} + + {uiMatrix?.['jvc.ui.recording'] !== false && ( + + )} + + +
+
+ +
+ + {/* MORE MENU PANEL — Fixed position popup */} + {isMoreMenuOpen && ( +
setIsMoreMenuOpen(false)}> +
e.stopPropagation()}> +
Settings
+ {uiMatrix?.['jvc.ui.beauty_filter'] !== false && ( + + )} + {uiMatrix?.['jvc.ui.virtual_bg'] !== false && ( + <> + + + + )} + +
+ + {uiMatrix?.['jvc.ui.timer'] !== false && ( + <> + + + + + )} + +
+ + {uiMatrix?.['jvc.ui.matrix_command'] !== false && ( + + )} +
+
+ )} + + {/* XCO MATRIX COMMAND PANEL */} + {isMatrixCommandOpen && ( +
+
+ + + XCO Matrix Command + + +
+ +
+ + +
+ +
+ {matrixCommandTab === 'network' ? ( +
+ {/* REAL Traffic Monitor */} +
+
+ Live Network I/O + {trafficStats.wsState} +
+
+
+
TX ▲
+
RX ▼
+ +
Video
+
{formatRate(trafficStats.rates.txVideo)}
+
{formatRate(trafficStats.rates.rxVideo)}
+ +
Audio
+
{formatRate(trafficStats.rates.txAudio)}
+
{formatRate(trafficStats.rates.rxAudio)}
+ +
Total
+
{formatRate(trafficStats.rates.txTotal)}
+
{formatRate(trafficStats.rates.rxTotal)}
+
+
+ + {/* Codec Selectors */} + {uiMatrix?.['jvc.xco.video_engine'] !== false && ( +
+
+ +
+ {(['auto', 'canvas', 'webcodecs'] as const).map(mode => ( + + ))} +
+
+ {uiMatrix?.['jvc.xco.audio_engine'] !== false && ( +
+ +
+ {(['auto', 'xcu-neural', 'pcm'] as const).map(mode => ( + + ))} +
+
+ )} +
+ )} + + {/* BUG FIX #1: FPS Selector */} + {uiMatrix?.['jvc.xco.fps_selector'] !== false && ( +
+ +
+ {([15, 30, 60] as const).map(fps => ( + + ))} +
+

15fps = ringan • 30fps = default • 60fps = berat

+
+ )} +
+ ) : ( +
+
+

Modul XCO WASM berjalan secara asinkron (Kernel-Bypass). Fungsionalitas berikut membutuhkan lisensi IAM yang sesuai pada Database BYOK.

+
+ +
+ {wasmCapabilities.postQuantum && ( +
+
+
+ + Post-Quantum Shield +
+ +
+

Melindungi aliran data dari dekripsi komputer kuantum masa depan menggunakan protokol CRYSTALS-Kyber.

+
+ )} + + {wasmCapabilities.aegis && ( +
+
+
+ + Aegis Forensic Watermark +
+ +
+

Menyuntikkan kedipan morse transparan 1% ke dalam kanvas video untuk mencegah kebocoran rekaman fisik kamera.

+
+ )} + + {wasmCapabilities.neuralWhisper && ( +
+
+
+ + Neural Whisper (NPU AI) +
+ +
+

Menerjemahkan suara ke dalam teks secara offline (Edge AI) tanpa menyentuh server cloud eksternal.

+
+ )} + + {wasmCapabilities.doppler && ( +
+
+
+ + Doppler Matrix (Ultrasonic) +
+ +
+

Saluran komunikasi darurat menggunakan frekuensi suara ultra-tinggi saat 4G/Internet terputus.

+
+ )} +
+
+ )} +
+
+ )} + + + +
+
+ + {/* Leave Confirmation Popup */} + {isLeaving && ( +
+
+

Akhiri Rapat?

+

Apakah Anda yakin ingin keluar dari ruangan ini? Koneksi audio dan video Anda akan diputuskan seketika.

+
+ + +
+
+
+ )} + +