From 1274670795c017e1f3c1b9d4649488c48f0f8b02 Mon Sep 17 00:00:00 2001 From: Tony Giorgio Date: Fri, 6 Mar 2026 20:12:29 -0600 Subject: [PATCH 01/31] Add Maple 3.0 native app (Rust/SwiftUI/Compose/iced) Introduces native/ directory alongside existing frontend/ (2.0 Tauri). All bundle IDs aligned to cloud.opensecret.maple for App Store continuity. SDK dependency switched from submodule to crates.io opensecret 3.0.0-alpha.0. Version set to 3.0.0 across all platforms. Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> --- .gitignore | 8 + justfile | 50 + native/.env.example | 3 + native/.gitignore | 21 + native/Cargo.lock | 6193 +++++++++++++++++ native/Cargo.toml | 7 + native/README.md | 15 + native/android/app/build.gradle.kts | 94 + .../android/app/src/main/AndroidManifest.xml | 26 + .../java/cloud/opensecret/maple/AppManager.kt | 116 + .../cloud/opensecret/maple/MainActivity.kt | 21 + .../cloud/opensecret/maple/rust/maple_core.kt | 2405 +++++++ .../java/cloud/opensecret/maple/ui/MainApp.kt | 679 ++ .../cloud/opensecret/maple/ui/theme/Color.kt | 70 + .../cloud/opensecret/maple/ui/theme/Theme.kt | 122 + .../src/main/res/drawable/maple_wordmark.xml | 21 + .../app/src/main/res/font/array_bold.ttf | Bin 0 -> 609948 bytes .../app/src/main/res/font/manrope_bold.ttf | Bin 0 -> 96800 bytes .../app/src/main/res/font/manrope_medium.ttf | Bin 0 -> 96904 bytes .../app/src/main/res/font/manrope_regular.ttf | Bin 0 -> 96832 bytes .../src/main/res/font/manrope_semibold.ttf | Bin 0 -> 96936 bytes .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3624 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 3624 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2411 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2411 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4701 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 4701 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7039 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 7039 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9555 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 9555 bytes .../app/src/main/res/values/strings.xml | 3 + .../app/src/main/res/values/themes.xml | 3 + native/android/build.gradle.kts | 4 + native/android/gradle.properties | 3 + native/android/settings.gradle.kts | 16 + native/desktop/iced/Array-Bold.ttf | Bin 0 -> 609948 bytes native/desktop/iced/Cargo.toml | 13 + native/desktop/iced/src/main.rs | 1008 +++ native/desktop/iced/src/theme.rs | 214 + native/flake.nix | 137 + native/ios/Info.plist | 36 + native/ios/Sources/App.swift | 12 + native/ios/Sources/AppManager.swift | 114 + .../AppIcon.appiconset/Contents.json | 14 + .../AppIcon.appiconset/icon_1024.png | Bin 0 -> 73223 bytes .../AppIcon.appiconset/icon_120.png | Bin 0 -> 5734 bytes .../AppIcon.appiconset/icon_152.png | Bin 0 -> 7461 bytes .../AppIcon.appiconset/icon_167.png | Bin 0 -> 8131 bytes .../AppIcon.appiconset/icon_180.png | Bin 0 -> 8814 bytes .../AppIcon.appiconset/icon_20.png | Bin 0 -> 900 bytes .../AppIcon.appiconset/icon_29.png | Bin 0 -> 1430 bytes .../AppIcon.appiconset/icon_40.png | Bin 0 -> 1969 bytes .../AppIcon.appiconset/icon_58.png | Bin 0 -> 2822 bytes .../AppIcon.appiconset/icon_60.png | Bin 0 -> 2919 bytes .../AppIcon.appiconset/icon_76.png | Bin 0 -> 3694 bytes .../AppIcon.appiconset/icon_80.png | Bin 0 -> 3923 bytes .../AppIcon.appiconset/icon_87.png | Bin 0 -> 4190 bytes .../ios/Sources/Assets.xcassets/Contents.json | 1 + native/ios/Sources/ContentView.swift | 534 ++ native/ios/Sources/Fonts/Array-Bold.ttf | Bin 0 -> 609948 bytes native/ios/Sources/Fonts/Manrope-Bold.ttf | Bin 0 -> 96800 bytes native/ios/Sources/Fonts/Manrope-Medium.ttf | Bin 0 -> 96904 bytes native/ios/Sources/Fonts/Manrope-Regular.ttf | Bin 0 -> 96832 bytes native/ios/Sources/Fonts/Manrope-SemiBold.ttf | Bin 0 -> 96936 bytes native/ios/Sources/MapleTheme.swift | 215 + native/ios/Sources/MapleWordmark.swift | 110 + native/ios/Sources/maple-wordmark.svg | 7 + native/ios/project.yml | 41 + native/justfile | 71 + native/rmp.toml | 19 + native/rust/Cargo.toml | 16 + native/rust/build.rs | 1 + native/rust/src/lib.rs | 904 +++ native/rust/uniffi.toml | 3 + native/uniffi-bindgen/Cargo.toml | 8 + native/uniffi-bindgen/src/main.rs | 3 + 77 files changed, 13361 insertions(+) create mode 100644 native/.env.example create mode 100644 native/.gitignore create mode 100644 native/Cargo.lock create mode 100644 native/Cargo.toml create mode 100644 native/README.md create mode 100644 native/android/app/build.gradle.kts create mode 100644 native/android/app/src/main/AndroidManifest.xml create mode 100644 native/android/app/src/main/java/cloud/opensecret/maple/AppManager.kt create mode 100644 native/android/app/src/main/java/cloud/opensecret/maple/MainActivity.kt create mode 100644 native/android/app/src/main/java/cloud/opensecret/maple/rust/maple_core.kt create mode 100644 native/android/app/src/main/java/cloud/opensecret/maple/ui/MainApp.kt create mode 100644 native/android/app/src/main/java/cloud/opensecret/maple/ui/theme/Color.kt create mode 100644 native/android/app/src/main/java/cloud/opensecret/maple/ui/theme/Theme.kt create mode 100644 native/android/app/src/main/res/drawable/maple_wordmark.xml create mode 100644 native/android/app/src/main/res/font/array_bold.ttf create mode 100644 native/android/app/src/main/res/font/manrope_bold.ttf create mode 100644 native/android/app/src/main/res/font/manrope_medium.ttf create mode 100644 native/android/app/src/main/res/font/manrope_regular.ttf create mode 100644 native/android/app/src/main/res/font/manrope_semibold.ttf create mode 100644 native/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 native/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 native/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 native/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 native/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 native/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 native/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 native/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 native/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 native/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 native/android/app/src/main/res/values/strings.xml create mode 100644 native/android/app/src/main/res/values/themes.xml create mode 100644 native/android/build.gradle.kts create mode 100644 native/android/gradle.properties create mode 100644 native/android/settings.gradle.kts create mode 100644 native/desktop/iced/Array-Bold.ttf create mode 100644 native/desktop/iced/Cargo.toml create mode 100644 native/desktop/iced/src/main.rs create mode 100644 native/desktop/iced/src/theme.rs create mode 100644 native/flake.nix create mode 100644 native/ios/Info.plist create mode 100644 native/ios/Sources/App.swift create mode 100644 native/ios/Sources/AppManager.swift create mode 100644 native/ios/Sources/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 native/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon_1024.png create mode 100644 native/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon_120.png create mode 100644 native/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon_152.png create mode 100644 native/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon_167.png create mode 100644 native/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon_180.png create mode 100644 native/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon_20.png create mode 100644 native/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon_29.png create mode 100644 native/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon_40.png create mode 100644 native/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon_58.png create mode 100644 native/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon_60.png create mode 100644 native/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon_76.png create mode 100644 native/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon_80.png create mode 100644 native/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon_87.png create mode 100644 native/ios/Sources/Assets.xcassets/Contents.json create mode 100644 native/ios/Sources/ContentView.swift create mode 100644 native/ios/Sources/Fonts/Array-Bold.ttf create mode 100644 native/ios/Sources/Fonts/Manrope-Bold.ttf create mode 100644 native/ios/Sources/Fonts/Manrope-Medium.ttf create mode 100644 native/ios/Sources/Fonts/Manrope-Regular.ttf create mode 100644 native/ios/Sources/Fonts/Manrope-SemiBold.ttf create mode 100644 native/ios/Sources/MapleTheme.swift create mode 100644 native/ios/Sources/MapleWordmark.swift create mode 100644 native/ios/Sources/maple-wordmark.svg create mode 100644 native/ios/project.yml create mode 100644 native/justfile create mode 100644 native/rmp.toml create mode 100644 native/rust/Cargo.toml create mode 100644 native/rust/build.rs create mode 100644 native/rust/src/lib.rs create mode 100644 native/rust/uniffi.toml create mode 100644 native/uniffi-bindgen/Cargo.toml create mode 100644 native/uniffi-bindgen/src/main.rs diff --git a/.gitignore b/.gitignore index 04321fd8..23278b02 100644 --- a/.gitignore +++ b/.gitignore @@ -84,3 +84,11 @@ frontend/*.local # iOS build backups frontend/src-tauri/gen/apple/maple.xcodeproj/project.pbxproj.backup + +# Native (3.0) build artifacts +native/target/ +native/android/app/build/ +native/android/.gradle/ +native/ios/App.xcodeproj/ +native/ios/Frameworks/ +native/ios/Bindings/ diff --git a/justfile b/justfile index de9e4810..72cb095c 100644 --- a/justfile +++ b/justfile @@ -207,3 +207,53 @@ release version: git commit -m "chore: bump version to {{version}}" git tag -a "v{{version}}" -m "Release v{{version}}" echo "Release v{{version}} created! Don't forget to push tags: git push && git push --tags" + +# ┌─────────────────────────────────────────────────────────────────────┐ +# │ Maple 3.0 (native/) - Native Rust/SwiftUI/Compose/iced │ +# └─────────────────────────────────────────────────────────────────────┘ + +native_nix := "cd native && nix develop --command bash -c" +native_ossl := 'PKG_CONFIG_PATH="$(brew --prefix openssl@3)/lib/pkgconfig" OPENSSL_DIR="$(brew --prefix openssl@3)"' + +# Run native rmp doctor +native-doctor: + {{native_nix}} "rmp doctor" + +# Regenerate native FFI bindings (Swift + Kotlin) +native-bindings: + {{native_nix}} "unset CC CXX AR RANLIB && rmp bindings all" + +# Regenerate native Swift FFI bindings +native-bindings-swift: + {{native_nix}} "unset CC CXX AR RANLIB && rmp bindings swift" + +# Regenerate native Kotlin FFI bindings +native-bindings-kotlin: + {{native_nix}} "unset CC CXX AR RANLIB && rmp bindings kotlin" + +# Build native desktop (iced) +native-build-desktop: + cd native && {{native_ossl}} cargo build -p maple_desktop_iced + +# Run native desktop (iced) +native-run-desktop: + cd native && {{native_ossl}} cargo run -p maple_desktop_iced + +# Run native iOS on simulator +native-run-ios: + {{native_nix}} "unset CC CXX AR RANLIB && rmp run ios" + +# Run native Android on emulator +native-run-android serial="emulator-5554": + {{native_nix}} "unset CC CXX AR RANLIB && export PATH=\$HOME/.cargo/bin:\$PATH && rmp run android --serial {{serial}}" + +# Build native Android APK +native-build-android: + cd native/android && ./gradlew assembleDebug + +# Build all native platforms +native-build-all: native-build-desktop native-build-android + @echo "Native desktop and Android built. iOS is build+run only via rmp." + +# Run all native platforms +native-run-all: native-bindings native-run-ios native-run-android native-run-desktop diff --git a/native/.env.example b/native/.env.example new file mode 100644 index 00000000..d949397c --- /dev/null +++ b/native/.env.example @@ -0,0 +1,3 @@ +MAPLE_BILLING_API_URL=http://0.0.0.0:3001 +OPEN_SECRET_API_URL=http://0.0.0.0:3000 +CLIENT_ID=ba5a14b5-d915-47b1-b7b1-afda52bc5fc6 diff --git a/native/.gitignore b/native/.gitignore new file mode 100644 index 00000000..231fc8d6 --- /dev/null +++ b/native/.gitignore @@ -0,0 +1,21 @@ +/target +.env +.direnv/ +.DS_Store +*.swp +*.swo +flake.lock +staging/ +ios/Bindings/ +ios/Frameworks/ +ios/.build/ +ios/*.xcodeproj +android/app/src/main/jniLibs/ +android/.gradle/ +android/gradle/ +android/gradlew +android/gradlew.bat +android/build/ +android/app/build/ +android/local.properties +emulator.log diff --git a/native/Cargo.lock b/native/Cargo.lock new file mode 100644 index 00000000..760289f5 --- /dev/null +++ b/native/Cargo.lock @@ -0,0 +1,6193 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ab_glyph" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" + +[[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 = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "android-activity" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" +dependencies = [ + "android-properties", + "bitflags 2.11.0", + "cc", + "cesu8", + "jni", + "jni-sys", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "num_enum", + "thiserror 1.0.69", +] + +[[package]] +name = "android-build" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cac4c64175d504608cf239756339c07f6384a476f97f20a7043f92920b0b8fd" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[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 = "anstyle" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading", +] + +[[package]] +name = "askama" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75363874b771be265f4ffe307ca705ef6f3baa19011c149da8674a87f1b75c4" +dependencies = [ + "askama_derive", + "itoa", + "percent-encoding", + "serde", + "serde_json", +] + +[[package]] +name = "askama_derive" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "129397200fe83088e8a68407a8e2b1f826cf0086b21ccdb866a722c8bcd3a94f" +dependencies = [ + "askama_parser", + "basic-toml", + "memchr", + "proc-macro2", + "quote", + "rustc-hash 2.1.1", + "serde", + "serde_derive", + "syn", +] + +[[package]] +name = "askama_parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6ab5630b3d5eaf232620167977f95eb51f3432fc76852328774afbd242d4358" +dependencies = [ + "memchr", + "serde", + "serde_derive", + "winnow", +] + +[[package]] +name = "asn1-rs" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5493c3bedbacf7fd7382c6346bbd66687d12bbaad3a89a2d2c303ee6cf20b048" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror 1.0.69", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix 1.1.4", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix 1.1.4", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-signal" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 1.1.4", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[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", +] + +[[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 = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "basic-toml" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" +dependencies = [ + "serde", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[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 = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2 0.5.2", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2 0.6.4", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[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", +] + +[[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 = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.11.0", + "log", + "polling", + "rustix 0.38.44", + "slab", + "thiserror 1.0.69", +] + +[[package]] +name = "calloop" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" +dependencies = [ + "bitflags 2.11.0", + "polling", + "rustix 1.1.4", + "slab", + "tracing", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" +dependencies = [ + "calloop 0.13.0", + "rustix 0.38.44", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa" +dependencies = [ + "calloop 0.14.4", + "rustix 1.1.4", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "cc" +version = "1.2.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[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", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + +[[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 = "clap" +version = "4.5.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876" +dependencies = [ + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" + +[[package]] +name = "clipboard-win" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" +dependencies = [ + "error-code", +] + +[[package]] +name = "clipboard_macos" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b7f4aaa047ba3c3630b080bb9860894732ff23e2aee290a418909aa6d5df38f" +dependencies = [ + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "clipboard_wayland" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "003f886bc4e2987729d10c1db3424e7f80809f3fc22dbc16c685738887cb37b8" +dependencies = [ + "smithay-clipboard", +] + +[[package]] +name = "clipboard_x11" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd63e33452ffdafd39924c4f05a5dd1e94db646c779c6bd59148a3d95fff5ad4" +dependencies = [ + "thiserror 2.0.18", + "x11rb", +] + +[[package]] +name = "codespan-reporting" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" +dependencies = [ + "serde", + "termcolor", + "unicode-width", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[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" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +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 = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.11.0", + "core-foundation 0.10.1", + "libc", +] + +[[package]] +name = "core_maths" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" +dependencies = [ + "libm", +] + +[[package]] +name = "cosmic-text" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173852283a9a57a3cbe365d86e74dc428a09c50421477d5ad6fe9d9509e37737" +dependencies = [ + "bitflags 2.11.0", + "fontdb", + "harfrust", + "linebender_resource_handle", + "log", + "rangemap", + "rustc-hash 1.1.0", + "self_cell", + "skrifa", + "smol_str", + "swash", + "sys-locale", + "unicode-bidi", + "unicode-linebreak", + "unicode-script", + "unicode-segmentation", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "cryoglyph" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc795bdbccdbd461736fb163930a009da6597b226d6f6fce33e7a8eb6ec519" +dependencies = [ + "cosmic-text", + "etagere", + "lru", + "rustc-hash 2.1.1", + "wgpu", +] + +[[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 = "ctor-lite" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e162d0c2e2068eb736b71e5597eff0b9944e6b973cd9f37b6a288ab9bf20e300" + +[[package]] +name = "cursor-icon" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "data-encoding" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" + +[[package]] +name = "der-parser" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "powerfmt", +] + +[[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 = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.11.0", + "objc2 0.6.4", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dlib" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" +dependencies = [ + "libloading", +] + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[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 = "error-code" +version = "3.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" + +[[package]] +name = "etagere" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc89bf99e5dc15954a60f707c1e09d7540e5cd9af85fa75caa0b510bc08c5342" +dependencies = [ + "euclid", + "svg_fmt", +] + +[[package]] +name = "euclid" +version = "0.22.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df61bf483e837f88d5c2291dcf55c67be7e676b3a51acc48db3a7b163b91ed63" +dependencies = [ + "num-traits", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "eventsource-stream" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74fef4569247a5f429d9156b9d0a2599914385dd189c539334c625d8099d90ab" +dependencies = [ + "futures-core", + "nom", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "float_next_after" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf7cc16383c4b8d58b9905a8509f02926ce3058053c056376248d958c9df1e8" + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "spin", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "font-types" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39a654f404bbcbd48ea58c617c2993ee91d1cb63727a37bf2323a4edeed1b8c5" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "fontconfig-parser" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646" +dependencies = [ + "roxmltree", +] + +[[package]] +name = "fontdb" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905" +dependencies = [ + "fontconfig-parser", + "log", + "memmap2", + "slotmap", + "tinyvec", + "ttf-parser", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[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 = "fs-err" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" +dependencies = [ + "autocfg", +] + +[[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-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[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", +] + +[[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 = "gethostname" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +dependencies = [ + "rustix 1.1.4", + "windows-link", +] + +[[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", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", + "wasip3", +] + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glam" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3" + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "glow" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "goblin" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b363a30c165f666402fe6a3024d3bec7ebc898f96a4a23bd1c99f8dbf3f4f47" +dependencies = [ + "log", + "plain", + "scroll", +] + +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.11.0", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "gpu-allocator" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" +dependencies = [ + "log", + "presser", + "thiserror 1.0.69", + "windows 0.58.0", +] + +[[package]] +name = "gpu-descriptor" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" +dependencies = [ + "bitflags 2.11.0", + "gpu-descriptor-types", + "hashbrown 0.15.5", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "guillotiere" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782" +dependencies = [ + "euclid", + "svg_fmt", +] + +[[package]] +name = "h2" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" + +[[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 = "harfrust" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92c020db12c71d8a12a3fe7607873cade3a01a6287e29d540c8723276221b9d8" +dependencies = [ + "bitflags 2.11.0", + "bytemuck", + "core_maths", + "read-fonts", + "smallvec", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "foldhash 0.2.0", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[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 = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "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", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[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 = "iced" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000e01026c93ba643f8357a3db3ada0e6555265a377f6f9291c472f6dd701fb3" +dependencies = [ + "iced_core", + "iced_debug", + "iced_futures", + "iced_renderer", + "iced_runtime", + "iced_widget", + "iced_winit", + "thiserror 2.0.18", +] + +[[package]] +name = "iced_core" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ab1937d699403e7e69252ae743a902bcee9f4ab2052cc4c9a46fcf34729d85" +dependencies = [ + "bitflags 2.11.0", + "bytes", + "glam", + "lilt", + "log", + "num-traits", + "rustc-hash 2.1.1", + "smol_str", + "thiserror 2.0.18", + "web-time", +] + +[[package]] +name = "iced_debug" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25035ab0215a620e53f4103e36fc4e59a1fb2817e4bfc38a30ad27b4202ea0be" +dependencies = [ + "iced_core", + "iced_futures", + "log", +] + +[[package]] +name = "iced_futures" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c0c85ccad42dfbec7293c36c018af0ea0dbcc52d137a4a9a0b0f6822a3fdf0a" +dependencies = [ + "futures", + "iced_core", + "log", + "rustc-hash 2.1.1", + "tokio", + "wasm-bindgen-futures", + "wasmtimer", +] + +[[package]] +name = "iced_graphics" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234ca1c2cec4155055f68fa5fad1b5242c496ac8238d80a259bca382fb44a102" +dependencies = [ + "bitflags 2.11.0", + "bytemuck", + "cosmic-text", + "half 2.7.1", + "iced_core", + "iced_futures", + "log", + "lyon_path", + "raw-window-handle", + "rustc-hash 2.1.1", + "thiserror 2.0.18", + "unicode-segmentation", +] + +[[package]] +name = "iced_program" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dfafec2947cda688d8eb00dac337ba11aa60f9ef6335aed343e189d26e4a673" +dependencies = [ + "iced_graphics", + "iced_runtime", +] + +[[package]] +name = "iced_renderer" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250cc0802408e8c077986ec56c7d07c65f423ee658a4b9fd795a1f2aae5dac05" +dependencies = [ + "iced_graphics", + "iced_tiny_skia", + "iced_wgpu", + "log", + "thiserror 2.0.18", +] + +[[package]] +name = "iced_runtime" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1889b819ce4c06674183242e336c8d49465665441396914dc07cc86f44fa8d4" +dependencies = [ + "bytes", + "iced_core", + "iced_futures", + "raw-window-handle", + "thiserror 2.0.18", +] + +[[package]] +name = "iced_tiny_skia" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe0acf8b75a3bc914aff5f2329fdffc1b36eeaea29dda0e4bd232f1c62e9cc3d" +dependencies = [ + "bytemuck", + "cosmic-text", + "iced_debug", + "iced_graphics", + "kurbo", + "log", + "rustc-hash 2.1.1", + "softbuffer", + "tiny-skia", +] + +[[package]] +name = "iced_wgpu" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff144a999b0ca0f8a10257934500060240825c42e950ec0ebee9c8ae30561c13" +dependencies = [ + "bitflags 2.11.0", + "bytemuck", + "cryoglyph", + "futures", + "glam", + "guillotiere", + "iced_debug", + "iced_graphics", + "log", + "lyon", + "rustc-hash 2.1.1", + "thiserror 2.0.18", + "wgpu", +] + +[[package]] +name = "iced_widget" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1596afa0d3109c2618e8bc12bae6c11d3064df8f95c42dfce570397dbe957ab" +dependencies = [ + "iced_renderer", + "log", + "num-traits", + "rustc-hash 2.1.1", + "thiserror 2.0.18", + "unicode-segmentation", +] + +[[package]] +name = "iced_winit" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b7dbedc47562d1de3b9707d939f678b88c382004b7ab5a18f7a7dd723162d75" +dependencies = [ + "iced_debug", + "iced_program", + "log", + "mundy", + "rustc-hash 2.1.1", + "thiserror 2.0.18", + "tracing", + "wasm-bindgen-futures", + "web-sys", + "window_clipboard", + "winit", +] + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown 0.16.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 = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "itoa" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[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.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14dc6f6450b3f6d4ed5b16327f38fed626d375a886159ca555bd7822c0c3a5a6" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "keyring" +version = "3.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eebcc3aff044e5944a8fbaf69eb277d11986064cba30c468730e8b9909fb551c" +dependencies = [ + "byteorder", + "linux-keyutils", + "log", + "security-framework 2.11.1", + "security-framework 3.7.0", + "windows-sys 0.60.2", + "zeroize", +] + +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading", + "pkg-config", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "kurbo" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1618d4ebd923e97d67e7cd363d80aef35fe961005cbbbb3d2dad8bdd1bc63440" +dependencies = [ + "arrayvec", + "smallvec", +] + +[[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 = "libc" +version = "0.2.182" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +dependencies = [ + "bitflags 2.11.0", + "libc", + "redox_syscall 0.7.2", +] + +[[package]] +name = "lilt" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f67562e5eff6b20553fa9be1c503356768420994e28f67e3eafe6f41910e57ad" +dependencies = [ + "web-time", +] + +[[package]] +name = "linebender_resource_handle" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4" + +[[package]] +name = "linux-keyutils" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "761e49ec5fd8a5a463f9b84e877c373d888935b71c6be78f3767fe2ae6bed18e" +dependencies = [ + "bitflags 2.11.0", + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[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.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "lyon" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbcb7d54d54c8937364c9d41902d066656817dce1e03a44e5533afebd1ef4352" +dependencies = [ + "lyon_algorithms", + "lyon_tessellation", +] + +[[package]] +name = "lyon_algorithms" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c0829e28c4f336396f250d850c3987e16ce6db057ffe047ce0dd54aab6b647" +dependencies = [ + "lyon_path", + "num-traits", +] + +[[package]] +name = "lyon_geom" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e260b6de923e6e47adfedf6243013a7a874684165a6a277594ee3906021b2343" +dependencies = [ + "arrayvec", + "euclid", + "num-traits", +] + +[[package]] +name = "lyon_path" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aeca86bcfd632a15984ba029b539ffb811e0a70bf55e814ef8b0f54f506fdeb" +dependencies = [ + "lyon_geom", + "num-traits", +] + +[[package]] +name = "lyon_tessellation" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3f586142e1280335b1bc89539f7c97dd80f08fc43e9ab1b74ef0a42b04aa353" +dependencies = [ + "float_next_after", + "lyon_path", + "num-traits", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "maple_core" +version = "0.1.0" +dependencies = [ + "chrono", + "flume", + "futures", + "opensecret", + "tokio", + "uniffi", + "uuid", +] + +[[package]] +name = "maple_desktop_iced" +version = "0.1.0" +dependencies = [ + "dirs-next", + "dotenvy", + "flume", + "iced", + "keyring", + "maple_core", +] + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memmap2" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "metal" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" +dependencies = [ + "bitflags 2.11.0", + "block", + "core-graphics-types 0.2.0", + "foreign-types", + "log", + "objc", + "paste", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "mio" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "mundy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "523813c9e194ec43693805214eb112551f99382115b67f38600d724a692e7e8b" +dependencies = [ + "android-build", + "async-io", + "cfg-if", + "dispatch", + "futures-channel", + "futures-lite", + "jni", + "ndk-context", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", + "pin-project-lite", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.62.2", + "zbus", +] + +[[package]] +name = "naga" +version = "27.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8" +dependencies = [ + "arrayvec", + "bit-set", + "bitflags 2.11.0", + "cfg-if", + "cfg_aliases", + "codespan-reporting", + "half 2.7.1", + "hashbrown 0.16.1", + "hexf-parse", + "indexmap", + "libm", + "log", + "num-traits", + "once_cell", + "rustc-hash 1.1.0", + "spirv", + "thiserror 2.0.18", + "unicode-ident", +] + +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.11.0", + "jni-sys", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[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", +] + +[[package]] +name = "num-conv" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" + +[[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-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_enum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.11.0", + "block2 0.5.1", + "libc", + "objc2 0.5.2", + "objc2-core-data 0.2.2", + "objc2-core-image 0.2.2", + "objc2-foundation 0.2.2", + "objc2-quartz-core 0.2.2", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.11.0", + "block2 0.6.2", + "libc", + "objc2 0.6.4", + "objc2-cloud-kit 0.3.2", + "objc2-core-data 0.3.2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image 0.3.2", + "objc2-core-text", + "objc2-core-video", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.11.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.11.0", + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.11.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "bitflags 2.11.0", + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.11.0", + "dispatch2", + "objc2 0.6.4", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.11.0", + "dispatch2", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-contacts", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.11.0", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-core-video" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" +dependencies = [ + "bitflags 2.11.0", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-io-surface", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.11.0", + "block2 0.5.1", + "dispatch", + "libc", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.11.0", + "block2 0.6.2", + "libc", + "objc2 0.6.4", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.11.0", + "objc2 0.6.4", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.11.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.11.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.11.0", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.11.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-cloud-kit 0.2.2", + "objc2-core-data 0.2.2", + "objc2-core-image 0.2.2", + "objc2-core-location", + "objc2-foundation 0.2.2", + "objc2-link-presentation", + "objc2-quartz-core 0.2.2", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.11.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "oid-registry" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d8034d9489cdaf79228eb9f6a3b8d7bb32ba00d6645ebd48eef4077ceb5bd9" +dependencies = [ + "asn1-rs", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "opensecret" +version = "0.2.9" +dependencies = [ + "anyhow", + "async-trait", + "base64", + "bytes", + "chacha20poly1305", + "chrono", + "eventsource-stream", + "futures", + "getrandom 0.2.17", + "hex", + "percent-encoding", + "pin-project", + "rand 0.8.5", + "reqwest", + "ring", + "serde", + "serde_cbor", + "serde_json", + "sha2", + "thiserror 2.0.18", + "tokio", + "tracing", + "uuid", + "x25519-dalek", + "x509-parser", + "yasna", +] + +[[package]] +name = "orbclient" +version = "0.3.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ad2c6bae700b7aa5d1cc30c59bdd3a1c180b09dbaea51e2ae2b8e1cf211fdd" +dependencies = [ + "libc", + "libredox", +] + +[[package]] +name = "ordered-float" +version = "5.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4779c6901a562440c3786d08192c6fbda7c1c2060edd10006b05ee35d10f2d" +dependencies = [ + "num-traits", +] + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[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", +] + +[[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 = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + +[[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 = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "portable-atomic-util" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +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 = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro-crate" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +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 = "profiling" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" + +[[package]] +name = "quick-xml" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +dependencies = [ + "memchr", +] + +[[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", + "quinn-udp", + "rustc-hash 2.1.1", + "rustls", + "socket2", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash 2.1.1", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[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", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "quote" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +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 = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[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 = "range-alloc" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" + +[[package]] +name = "rangemap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "973443cf09a9c8656b574a866ab68dfa19f0867d0340648c7d2f6a71b8a8ea68" + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "read-fonts" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6717cf23b488adf64b9d711329542ba34de147df262370221940dfabc2c91358" +dependencies = [ + "bytemuck", + "core_maths", + "font-types", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +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.0", +] + +[[package]] +name = "redox_syscall" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d94dd2f7cd932d4dc02cc8b2b50dfd38bd079a4e5d79198b99743d7fcf9a4b4" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "renderdoc-sys" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "mime", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots", +] + +[[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", + "windows-sys 0.52.0", +] + +[[package]] +name = "roxmltree" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.11.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.11.0", + "errno", + "libc", + "linux-raw-sys 0.12.1", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[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 = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scroll" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1783eabc414609e28a5ba76aee5ddd52199f7107a0b24c2e9746a1ecc34a683d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sctk-adwaita" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" +dependencies = [ + "ab_glyph", + "log", + "memmap2", + "smithay-client-toolkit 0.19.2", + "tiny-skia", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.11.0", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags 2.11.0", + "core-foundation 0.10.1", + "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 = "self_cell" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] + +[[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_cbor" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" +dependencies = [ + "half 1.8.3", + "serde", +] + +[[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", +] + +[[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_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_spanned" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +dependencies = [ + "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 = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[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 = "siphasher" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" + +[[package]] +name = "skrifa" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c31071dedf532758ecf3fed987cdb4bd9509f900e026ab684b4ecb81ea49841" +dependencies = [ + "bytemuck", + "read-fonts", +] + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "slotmap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "smawk" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" + +[[package]] +name = "smithay-client-toolkit" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" +dependencies = [ + "bitflags 2.11.0", + "calloop 0.13.0", + "calloop-wayland-source 0.3.0", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix 0.38.44", + "thiserror 1.0.69", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smithay-client-toolkit" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" +dependencies = [ + "bitflags 2.11.0", + "calloop 0.14.4", + "calloop-wayland-source 0.4.1", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix 1.1.4", + "thiserror 2.0.18", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-experimental", + "wayland-protocols-misc", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smithay-clipboard" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71704c03f739f7745053bde45fa203a46c58d25bc5c4efba1d9a60e9dba81226" +dependencies = [ + "libc", + "smithay-client-toolkit 0.20.0", + "wayland-backend", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "as-raw-xcb-connection", + "bytemuck", + "fastrand", + "js-sys", + "memmap2", + "ndk", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", + "raw-window-handle", + "redox_syscall 0.5.18", + "rustix 1.1.4", + "tiny-xlib", + "tracing", + "wasm-bindgen", + "wayland-backend", + "wayland-client", + "wayland-sys", + "web-sys", + "windows-sys 0.61.2", + "x11rb", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spirv" +version = "0.3.0+sdk-1.3.268.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" +dependencies = [ + "bitflags 2.11.0", +] + +[[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 = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "svg_fmt" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb" + +[[package]] +name = "swash" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47846491253e976bdd07d0f9cc24b7daf24720d11309302ccbbc6e6b6e53550a" +dependencies = [ + "skrifa", + "yazi", + "zeno", +] + +[[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", +] + +[[package]] +name = "sys-locale" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" +dependencies = [ + "libc", +] + +[[package]] +name = "system-configuration" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" +dependencies = [ + "bitflags 2.11.0", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tempfile" +version = "3.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82a72c767771b47409d2345987fda8628641887d5466101319899796367354a0" +dependencies = [ + "fastrand", + "getrandom 0.4.1", + "once_cell", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "smawk", +] + +[[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", +] + +[[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", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tiny-xlib" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0324504befd01cab6e0c994f34b2ffa257849ee019d3fb3b64fb2c858887d89e" +dependencies = [ + "as-raw-xcb-connection", + "ctor-lite", + "libloading", + "pkg-config", + "tracing", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +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.49.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[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" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned", + "toml_datetime", + "toml_parser", + "toml_writer", + "winnow", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.23.10+spec-1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.9+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +dependencies = [ + "winnow", +] + +[[package]] +name = "toml_writer" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" + +[[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", +] + +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags 2.11.0", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[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", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "ttf-parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" +dependencies = [ + "core_maths", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset", + "tempfile", + "winapi", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + +[[package]] +name = "unicode-script" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[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 = "uniffi" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8c6dec3fc6645f71a16a3fa9ff57991028153bd194ca97f4b55e610c73ce66a" +dependencies = [ + "anyhow", + "camino", + "cargo_metadata", + "clap", + "uniffi_bindgen", + "uniffi_core", + "uniffi_macros", + "uniffi_pipeline", +] + +[[package]] +name = "uniffi-bindgen" +version = "0.1.0" +dependencies = [ + "uniffi", +] + +[[package]] +name = "uniffi_bindgen" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ed0150801958d4825da56a41c71f000a457ac3a4613fa9647df78ac4b6b6881" +dependencies = [ + "anyhow", + "askama", + "camino", + "cargo_metadata", + "fs-err", + "glob", + "goblin", + "heck", + "indexmap", + "once_cell", + "serde", + "tempfile", + "textwrap", + "toml", + "uniffi_internal_macros", + "uniffi_meta", + "uniffi_pipeline", + "uniffi_udl", +] + +[[package]] +name = "uniffi_core" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0ef62e69762fbb9386dcb6c87cd3dd05d525fa8a3a579a290892e60ddbda47e" +dependencies = [ + "anyhow", + "bytes", + "once_cell", + "static_assertions", +] + +[[package]] +name = "uniffi_internal_macros" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98f51ebca0d9a4b2aa6c644d5ede45c56f73906b96403c08a1985e75ccb64a01" +dependencies = [ + "anyhow", + "indexmap", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "uniffi_macros" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db9d12529f1223d014fd501e5f29ca0884d15d6ed5ddddd9f506e55350327dc3" +dependencies = [ + "camino", + "fs-err", + "once_cell", + "proc-macro2", + "quote", + "serde", + "syn", + "toml", + "uniffi_meta", +] + +[[package]] +name = "uniffi_meta" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df6d413db2827c68588f8149d30d49b71d540d46539e435b23a7f7dbd4d4f86" +dependencies = [ + "anyhow", + "siphasher", + "uniffi_internal_macros", + "uniffi_pipeline", +] + +[[package]] +name = "uniffi_pipeline" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a806dddc8208f22efd7e95a5cdf88ed43d0f3271e8f63b47e757a8bbdb43b63a" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "tempfile", + "uniffi_internal_macros", +] + +[[package]] +name = "uniffi_udl" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d1a7339539bf6f6fa3e9b534dece13f778bda2d54b1a6d4e40b4d6090ac26e7" +dependencies = [ + "anyhow", + "textwrap", + "uniffi_meta", + "weedle2", +] + +[[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.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 = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" +dependencies = [ + "getrandom 0.4.1", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[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.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[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", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.113" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60722a937f594b7fde9adb894d7c092fc1bb6612897c46368d18e7a20208eff2" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a89f4650b770e4521aa6573724e2aed4704372151bd0de9d16a3bbabb87441a" +dependencies = [ + "cfg-if", + "futures-util", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.113" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fac8c6395094b6b91c4af293f4c79371c163f9a6f56184d2c9a85f5a95f3950" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.113" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3fabce6159dc20728033842636887e4877688ae94382766e00b180abac9d60" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.113" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de0e091bdb824da87dc01d967388880d017a0a9bc4f3bdc0d86ee9f9336e3bb5" +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 = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.0", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + +[[package]] +name = "wasmtimer" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + +[[package]] +name = "wayland-backend" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fee64194ccd96bf648f42a65a7e589547096dfa702f7cadef84347b66ad164f9" +dependencies = [ + "cc", + "downcast-rs", + "rustix 1.1.4", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e6faa537fbb6c186cb9f1d41f2f811a4120d1b57ec61f50da451a0c5122bec" +dependencies = [ + "bitflags 2.11.0", + "rustix 1.1.4", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-csd-frame" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" +dependencies = [ + "bitflags 2.11.0", + "cursor-icon", + "wayland-backend", +] + +[[package]] +name = "wayland-cursor" +version = "0.31.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5864c4b5b6064b06b1e8b74ead4a98a6c45a285fe7a0e784d24735f011fdb078" +dependencies = [ + "rustix 1.1.4", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baeda9ffbcfc8cd6ddaade385eaf2393bd2115a69523c735f12242353c3df4f3" +dependencies = [ + "bitflags 2.11.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-experimental" +version = "20250721.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" +dependencies = [ + "bitflags 2.11.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-misc" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791c58fdeec5406aa37169dd815327d1e47f334219b523444bc26d70ceb4c34e" +dependencies = [ + "bitflags 2.11.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa98634619300a535a9a97f338aed9a5ff1e01a461943e8346ff4ae26007306b" +dependencies = [ + "bitflags 2.11.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9597cdf02cf0c34cd5823786dce6b5ae8598f05c2daf5621b6e178d4f7345f3" +dependencies = [ + "bitflags 2.11.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5423e94b6a63e68e439803a3e153a9252d5ead12fd853334e2ad33997e3889e3" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6dbfc3ac5ef974c92a2235805cc0114033018ae1290a72e474aa8b28cbbdfd" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "705eceb4ce901230f8625bd1d665128056ccbe4b7408faa625eec1ba80f59a97" +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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "weedle2" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "998d2c24ec099a87daf9467808859f9d82b61f1d9c9701251aea037f514eae0e" +dependencies = [ + "nom", +] + +[[package]] +name = "wgpu" +version = "27.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe68bac7cde125de7a731c3400723cadaaf1703795ad3f4805f187459cd7a77" +dependencies = [ + "arrayvec", + "bitflags 2.11.0", + "cfg-if", + "cfg_aliases", + "document-features", + "hashbrown 0.16.1", + "js-sys", + "log", + "naga", + "parking_lot", + "portable-atomic", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "27.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27a75de515543b1897b26119f93731b385a19aea165a1ec5f0e3acecc229cae7" +dependencies = [ + "arrayvec", + "bit-set", + "bit-vec", + "bitflags 2.11.0", + "bytemuck", + "cfg_aliases", + "document-features", + "hashbrown 0.16.1", + "indexmap", + "log", + "naga", + "once_cell", + "parking_lot", + "portable-atomic", + "profiling", + "raw-window-handle", + "rustc-hash 1.1.0", + "smallvec", + "thiserror 2.0.18", + "wgpu-core-deps-apple", + "wgpu-core-deps-emscripten", + "wgpu-core-deps-windows-linux-android", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core-deps-apple" +version = "27.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0772ae958e9be0c729561d5e3fd9a19679bcdfb945b8b1a1969d9bfe8056d233" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-emscripten" +version = "27.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06ac3444a95b0813ecfd81ddb2774b66220b264b3e2031152a4a29fda4da6b5" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-windows-linux-android" +version = "27.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71197027d61a71748e4120f05a9242b2ad142e3c01f8c1b47707945a879a03c3" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-hal" +version = "27.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b21cb61c57ee198bc4aff71aeadff4cbb80b927beb912506af9c780d64313ce" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set", + "bitflags 2.11.0", + "block", + "bytemuck", + "cfg-if", + "cfg_aliases", + "core-graphics-types 0.2.0", + "glow", + "glutin_wgl_sys", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "hashbrown 0.16.1", + "js-sys", + "khronos-egl", + "libc", + "libloading", + "log", + "metal", + "naga", + "ndk-sys", + "objc", + "once_cell", + "ordered-float", + "parking_lot", + "portable-atomic", + "portable-atomic-util", + "profiling", + "range-alloc", + "raw-window-handle", + "renderdoc-sys", + "smallvec", + "thiserror 2.0.18", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "windows 0.58.0", + "windows-core 0.58.0", +] + +[[package]] +name = "wgpu-types" +version = "27.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb" +dependencies = [ + "bitflags 2.11.0", + "bytemuck", + "js-sys", + "log", + "thiserror 2.0.18", + "web-sys", +] + +[[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-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[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 = "window_clipboard" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5654226305eaf2dde8853fb482861d28e5dcecbbd40cb88e8393d94bb80d733" +dependencies = [ + "clipboard-win", + "clipboard_macos", + "clipboard_wayland", + "clipboard_x11", + "raw-window-handle", + "thiserror 2.0.18", +] + +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections", + "windows-core 0.62.2", + "windows-future", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core 0.62.2", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings 0.1.0", + "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 0.60.2", + "windows-interface 0.59.3", + "windows-link", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core 0.62.2", + "windows-link", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[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", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[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", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core 0.62.2", + "windows-link", +] + +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result 0.2.0", + "windows-targets 0.52.6", +] + +[[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.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[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.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[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-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[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 = "winit" +version = "0.30.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66d4b9ed69c4009f6321f762d6e61ad8a2389cd431b97cb1e146812e9e6c732" +dependencies = [ + "ahash", + "android-activity", + "atomic-waker", + "bitflags 2.11.0", + "block2 0.5.1", + "bytemuck", + "calloop 0.13.0", + "cfg_aliases", + "concurrent-queue", + "core-foundation 0.9.4", + "core-graphics", + "cursor-icon", + "dpi", + "js-sys", + "libc", + "memmap2", + "ndk", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", + "objc2-ui-kit", + "orbclient", + "percent-encoding", + "pin-project", + "raw-window-handle", + "redox_syscall 0.4.1", + "rustix 0.38.44", + "sctk-adwaita", + "smithay-client-toolkit 0.19.2", + "smol_str", + "tracing", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.52.0", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + +[[package]] +name = "winnow" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +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-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "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", + "indexmap", + "prettyplease", + "syn", + "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", + "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.0", + "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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading", + "once_cell", + "rustix 1.1.4", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" + +[[package]] +name = "x25519-dalek" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" +dependencies = [ + "curve25519-dalek", + "rand_core 0.6.4", + "serde", + "zeroize", +] + +[[package]] +name = "x509-parser" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69" +dependencies = [ + "asn1-rs", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "rusticata-macros", + "thiserror 1.0.69", + "time", +] + +[[package]] +name = "xcursor" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.11.0", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "xml-rs" +version = "0.8.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" + +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" + +[[package]] +name = "yazi" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca82f95dbd3943a40a53cfded6c2d0a2ca26192011846a1810c4256ef92c60bc" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix 1.1.4", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897e79616e84aac4b2c46e9132a4f63b93105d54fe8c0e8f6bffc21fa8d49222" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" +dependencies = [ + "serde", + "winnow", + "zvariant", +] + +[[package]] +name = "zeno" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" + +[[package]] +name = "zerocopy" +version = "0.8.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a789c6e490b576db9f7e6b6d661bcc9799f7c0ac8352f56ea20193b2681532e5" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f65c489a7071a749c849713807783f70672b28094011623e200cb86dcb835953" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zvariant" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5708299b21903bbe348e94729f22c49c55d04720a004aa350f1f9c122fd2540b" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b59b012ebe9c46656f9cc08d8da8b4c726510aef12559da3e5f1bf72780752c" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn", + "winnow", +] diff --git a/native/Cargo.toml b/native/Cargo.toml new file mode 100644 index 00000000..76960118 --- /dev/null +++ b/native/Cargo.toml @@ -0,0 +1,7 @@ +[workspace] +resolver = "2" +members = [ + "rust", + "uniffi-bindgen", + "desktop/iced", +] diff --git a/native/README.md b/native/README.md new file mode 100644 index 00000000..8294b09d --- /dev/null +++ b/native/README.md @@ -0,0 +1,15 @@ +# Hello Chat + +A cross-platform app built with [RMP](https://github.com/nickthecook/rmp) (Rust Multiplatform). + +## Quick Start + +```bash +nix develop -c just doctor +nix develop -c just bindings +nix develop -c just run-ios +nix develop -c just run-android +nix develop -c just run-iced +``` + +Optional: enable direnv (`.envrc` is included and uses `use flake`). diff --git a/native/android/app/build.gradle.kts b/native/android/app/build.gradle.kts new file mode 100644 index 00000000..9415ad24 --- /dev/null +++ b/native/android/app/build.gradle.kts @@ -0,0 +1,94 @@ +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") +} + +android { + namespace = "cloud.opensecret.maple" + compileSdk = 35 + ndkVersion = "28.2.13676358" + + defaultConfig { + applicationId = "cloud.opensecret.maple" + minSdk = 26 + targetSdk = 35 + versionCode = 3000000000 + versionName = "3.0.0" + } + + buildTypes { + debug { + applicationIdSuffix = ".dev" + versionNameSuffix = "-dev" + } + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + ) + } + } + + buildFeatures { + compose = true + } + + composeOptions { + kotlinCompilerExtensionVersion = "1.5.14" + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = "17" + } + + packaging { + resources.excludes.addAll( + listOf("/META-INF/{AL2.0,LGPL2.1}", "META-INF/DEPENDENCIES"), + ) + } + + sourceSets { + getByName("main") { + jniLibs.srcDirs("src/main/jniLibs") + } + } +} + +tasks.register("ensureUniffiGenerated") { + doLast { + val out = file("src/main/java/cloud/opensecret/maple/rust/maple_core.kt") + if (!out.exists()) { + throw GradleException("Missing UniFFI Kotlin bindings. Run `rmp bindings kotlin` first.") + } + } +} + +tasks.named("preBuild") { + dependsOn("ensureUniffiGenerated") +} + +dependencies { + val composeBom = platform("androidx.compose:compose-bom:2024.06.00") + implementation(composeBom) + + implementation("androidx.core:core-ktx:1.13.1") + implementation("androidx.activity:activity-compose:1.9.0") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.3") + + implementation("androidx.compose.ui:ui") + implementation("androidx.compose.ui:ui-tooling-preview") + implementation("androidx.compose.material3:material3") + + debugImplementation("androidx.compose.ui:ui-tooling") + + // UniFFI JNA + implementation("net.java.dev.jna:jna:5.14.0@aar") + + // Secure credential storage + implementation("androidx.security:security-crypto:1.1.0-alpha06") +} diff --git a/native/android/app/src/main/AndroidManifest.xml b/native/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..360936d0 --- /dev/null +++ b/native/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/native/android/app/src/main/java/cloud/opensecret/maple/AppManager.kt b/native/android/app/src/main/java/cloud/opensecret/maple/AppManager.kt new file mode 100644 index 00000000..4c63b605 --- /dev/null +++ b/native/android/app/src/main/java/cloud/opensecret/maple/AppManager.kt @@ -0,0 +1,116 @@ +package cloud.opensecret.maple + +import android.content.Context +import android.os.Handler +import android.os.Looper +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.security.crypto.EncryptedSharedPreferences +import androidx.security.crypto.MasterKey +import cloud.opensecret.maple.rust.AppAction +import cloud.opensecret.maple.rust.AppReconciler +import cloud.opensecret.maple.rust.AppState +import cloud.opensecret.maple.rust.AppUpdate +import cloud.opensecret.maple.rust.AuthState +import cloud.opensecret.maple.rust.FfiApp +import cloud.opensecret.maple.rust.Router +import cloud.opensecret.maple.rust.Screen + +class AppManager private constructor(context: Context) : AppReconciler { + private val mainHandler = Handler(Looper.getMainLooper()) + private val rust: FfiApp + private var lastRevApplied: ULong = 0UL + + private val securePrefs = EncryptedSharedPreferences.create( + context.applicationContext, + "maple_secure_prefs", + MasterKey.Builder(context.applicationContext) + .setKeyScheme(MasterKey.KeyScheme.AES256_GCM) + .build(), + EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, + EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM, + ) + + var state: AppState by mutableStateOf( + AppState( + rev = 0UL, + auth = AuthState.Initializing, + pendingAuthUrl = null, + router = Router( + defaultScreen = Screen.LOADING, + screenStack = emptyList(), + ), + messages = emptyList(), + isAgentTyping = false, + isLoadingHistory = false, + hasOlderMessages = false, + composeText = "", + toast = null, + showSettings = false, + confirmDeleteAgent = false, + isDeletingAgent = false, + ), + ) + private set + + init { + val dataDir = context.filesDir.absolutePath + + val apiUrl = "http://10.0.2.2:3000" + val clientId = "ba5a14b5-d915-47b1-b7b1-afda52bc5fc6" + + rust = FfiApp(apiUrl = apiUrl, clientId = clientId, dataDir = dataDir) + val initial = rust.state() + state = initial + lastRevApplied = initial.rev + rust.listenForUpdates(this) + + // Attempt session restore from EncryptedSharedPreferences + val access = securePrefs.getString("access_token", null) + val refresh = securePrefs.getString("refresh_token", null) + if (access != null && refresh != null) { + rust.dispatch(AppAction.RestoreSession(accessToken = access, refreshToken = refresh)) + } + } + + fun dispatch(action: AppAction) { + rust.dispatch(action) + } + + override fun reconcile(update: AppUpdate) { + mainHandler.post { + when (update) { + is AppUpdate.SessionTokens -> { + // Persist side-effect BEFORE rev guard (per bible 6.6) + if (update.accessToken.isEmpty()) { + securePrefs.edit().remove("access_token").remove("refresh_token").apply() + } else { + securePrefs.edit() + .putString("access_token", update.accessToken) + .putString("refresh_token", update.refreshToken) + .apply() + } + if (update.rev > lastRevApplied) { + lastRevApplied = update.rev + } + } + is AppUpdate.FullState -> { + if (update.v1.rev <= lastRevApplied) return@post + lastRevApplied = update.v1.rev + state = update.v1 + } + } + } + } + + companion object { + @Volatile + private var instance: AppManager? = null + + fun getInstance(context: Context): AppManager = + instance ?: synchronized(this) { + instance ?: AppManager(context.applicationContext).also { instance = it } + } + } +} diff --git a/native/android/app/src/main/java/cloud/opensecret/maple/MainActivity.kt b/native/android/app/src/main/java/cloud/opensecret/maple/MainActivity.kt new file mode 100644 index 00000000..780323ac --- /dev/null +++ b/native/android/app/src/main/java/cloud/opensecret/maple/MainActivity.kt @@ -0,0 +1,21 @@ +package cloud.opensecret.maple + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import cloud.opensecret.maple.ui.MainApp +import cloud.opensecret.maple.ui.theme.AppTheme + +class MainActivity : ComponentActivity() { + private lateinit var manager: AppManager + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + manager = AppManager.getInstance(applicationContext) + setContent { + AppTheme { + MainApp(manager = manager) + } + } + } +} diff --git a/native/android/app/src/main/java/cloud/opensecret/maple/rust/maple_core.kt b/native/android/app/src/main/java/cloud/opensecret/maple/rust/maple_core.kt new file mode 100644 index 00000000..80da8b51 --- /dev/null +++ b/native/android/app/src/main/java/cloud/opensecret/maple/rust/maple_core.kt @@ -0,0 +1,2405 @@ +// This file was autogenerated by some hot garbage in the `uniffi` crate. +// Trust me, you don't want to mess with it! + +@file:Suppress("NAME_SHADOWING") + +package cloud.opensecret.maple.rust + +// Common helper code. +// +// Ideally this would live in a separate .kt file where it can be unittested etc +// in isolation, and perhaps even published as a re-useable package. +// +// However, it's important that the details of how this helper code works (e.g. the +// way that different builtin types are passed across the FFI) exactly match what's +// expected by the Rust code on the other side of the interface. In practice right +// now that means coming from the exact some version of `uniffi` that was used to +// compile the Rust component. The easiest way to ensure this is to bundle the Kotlin +// helpers directly inline like we're doing here. + +import com.sun.jna.Library +import com.sun.jna.IntegerType +import com.sun.jna.Native +import com.sun.jna.Pointer +import com.sun.jna.Structure +import com.sun.jna.Callback +import com.sun.jna.ptr.* +import java.nio.ByteBuffer +import java.nio.ByteOrder +import java.nio.CharBuffer +import java.nio.charset.CodingErrorAction +import java.util.concurrent.atomic.AtomicLong +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.atomic.AtomicBoolean + +// This is a helper for safely working with byte buffers returned from the Rust code. +// A rust-owned buffer is represented by its capacity, its current length, and a +// pointer to the underlying data. + +/** + * @suppress + */ +@Structure.FieldOrder("capacity", "len", "data") +open class RustBuffer : Structure() { + // Note: `capacity` and `len` are actually `ULong` values, but JVM only supports signed values. + // When dealing with these fields, make sure to call `toULong()`. + @JvmField var capacity: Long = 0 + @JvmField var len: Long = 0 + @JvmField var data: Pointer? = null + + class ByValue: RustBuffer(), Structure.ByValue + class ByReference: RustBuffer(), Structure.ByReference + + internal fun setValue(other: RustBuffer) { + capacity = other.capacity + len = other.len + data = other.data + } + + companion object { + internal fun alloc(size: ULong = 0UL) = uniffiRustCall() { status -> + // Note: need to convert the size to a `Long` value to make this work with JVM. + UniffiLib.ffi_maple_core_rustbuffer_alloc(size.toLong(), status) + }.also { + if(it.data == null) { + throw RuntimeException("RustBuffer.alloc() returned null data pointer (size=${size})") + } + } + + internal fun create(capacity: ULong, len: ULong, data: Pointer?): RustBuffer.ByValue { + var buf = RustBuffer.ByValue() + buf.capacity = capacity.toLong() + buf.len = len.toLong() + buf.data = data + return buf + } + + internal fun free(buf: RustBuffer.ByValue) = uniffiRustCall() { status -> + UniffiLib.ffi_maple_core_rustbuffer_free(buf, status) + } + } + + @Suppress("TooGenericExceptionThrown") + fun asByteBuffer() = + this.data?.getByteBuffer(0, this.len)?.also { + it.order(ByteOrder.BIG_ENDIAN) + } +} + +// This is a helper for safely passing byte references into the rust code. +// It's not actually used at the moment, because there aren't many things that you +// can take a direct pointer to in the JVM, and if we're going to copy something +// then we might as well copy it into a `RustBuffer`. But it's here for API +// completeness. + +@Structure.FieldOrder("len", "data") +internal open class ForeignBytes : Structure() { + @JvmField var len: Int = 0 + @JvmField var data: Pointer? = null + + class ByValue : ForeignBytes(), Structure.ByValue +} +/** + * The FfiConverter interface handles converter types to and from the FFI + * + * All implementing objects should be public to support external types. When a + * type is external we need to import it's FfiConverter. + * + * @suppress + */ +public interface FfiConverter { + // Convert an FFI type to a Kotlin type + fun lift(value: FfiType): KotlinType + + // Convert an Kotlin type to an FFI type + fun lower(value: KotlinType): FfiType + + // Read a Kotlin type from a `ByteBuffer` + fun read(buf: ByteBuffer): KotlinType + + // Calculate bytes to allocate when creating a `RustBuffer` + // + // This must return at least as many bytes as the write() function will + // write. It can return more bytes than needed, for example when writing + // Strings we can't know the exact bytes needed until we the UTF-8 + // encoding, so we pessimistically allocate the largest size possible (3 + // bytes per codepoint). Allocating extra bytes is not really a big deal + // because the `RustBuffer` is short-lived. + fun allocationSize(value: KotlinType): ULong + + // Write a Kotlin type to a `ByteBuffer` + fun write(value: KotlinType, buf: ByteBuffer) + + // Lower a value into a `RustBuffer` + // + // This method lowers a value into a `RustBuffer` rather than the normal + // FfiType. It's used by the callback interface code. Callback interface + // returns are always serialized into a `RustBuffer` regardless of their + // normal FFI type. + fun lowerIntoRustBuffer(value: KotlinType): RustBuffer.ByValue { + val rbuf = RustBuffer.alloc(allocationSize(value)) + try { + val bbuf = rbuf.data!!.getByteBuffer(0, rbuf.capacity).also { + it.order(ByteOrder.BIG_ENDIAN) + } + write(value, bbuf) + rbuf.writeField("len", bbuf.position().toLong()) + return rbuf + } catch (e: Throwable) { + RustBuffer.free(rbuf) + throw e + } + } + + // Lift a value from a `RustBuffer`. + // + // This here mostly because of the symmetry with `lowerIntoRustBuffer()`. + // It's currently only used by the `FfiConverterRustBuffer` class below. + fun liftFromRustBuffer(rbuf: RustBuffer.ByValue): KotlinType { + val byteBuf = rbuf.asByteBuffer()!! + try { + val item = read(byteBuf) + if (byteBuf.hasRemaining()) { + throw RuntimeException("junk remaining in buffer after lifting, something is very wrong!!") + } + return item + } finally { + RustBuffer.free(rbuf) + } + } +} + +/** + * FfiConverter that uses `RustBuffer` as the FfiType + * + * @suppress + */ +public interface FfiConverterRustBuffer: FfiConverter { + override fun lift(value: RustBuffer.ByValue) = liftFromRustBuffer(value) + override fun lower(value: KotlinType) = lowerIntoRustBuffer(value) +} +// A handful of classes and functions to support the generated data structures. +// This would be a good candidate for isolating in its own ffi-support lib. + +internal const val UNIFFI_CALL_SUCCESS = 0.toByte() +internal const val UNIFFI_CALL_ERROR = 1.toByte() +internal const val UNIFFI_CALL_UNEXPECTED_ERROR = 2.toByte() + +@Structure.FieldOrder("code", "error_buf") +internal open class UniffiRustCallStatus : Structure() { + @JvmField var code: Byte = 0 + @JvmField var error_buf: RustBuffer.ByValue = RustBuffer.ByValue() + + class ByValue: UniffiRustCallStatus(), Structure.ByValue + + fun isSuccess(): Boolean { + return code == UNIFFI_CALL_SUCCESS + } + + fun isError(): Boolean { + return code == UNIFFI_CALL_ERROR + } + + fun isPanic(): Boolean { + return code == UNIFFI_CALL_UNEXPECTED_ERROR + } + + companion object { + fun create(code: Byte, errorBuf: RustBuffer.ByValue): UniffiRustCallStatus.ByValue { + val callStatus = UniffiRustCallStatus.ByValue() + callStatus.code = code + callStatus.error_buf = errorBuf + return callStatus + } + } +} + +class InternalException(message: String) : kotlin.Exception(message) + +/** + * Each top-level error class has a companion object that can lift the error from the call status's rust buffer + * + * @suppress + */ +interface UniffiRustCallStatusErrorHandler { + fun lift(error_buf: RustBuffer.ByValue): E; +} + +// Helpers for calling Rust +// In practice we usually need to be synchronized to call this safely, so it doesn't +// synchronize itself + +// Call a rust function that returns a Result<>. Pass in the Error class companion that corresponds to the Err +private inline fun uniffiRustCallWithError(errorHandler: UniffiRustCallStatusErrorHandler, callback: (UniffiRustCallStatus) -> U): U { + var status = UniffiRustCallStatus() + val return_value = callback(status) + uniffiCheckCallStatus(errorHandler, status) + return return_value +} + +// Check UniffiRustCallStatus and throw an error if the call wasn't successful +private fun uniffiCheckCallStatus(errorHandler: UniffiRustCallStatusErrorHandler, status: UniffiRustCallStatus) { + if (status.isSuccess()) { + return + } else if (status.isError()) { + throw errorHandler.lift(status.error_buf) + } else if (status.isPanic()) { + // when the rust code sees a panic, it tries to construct a rustbuffer + // with the message. but if that code panics, then it just sends back + // an empty buffer. + if (status.error_buf.len > 0) { + throw InternalException(FfiConverterString.lift(status.error_buf)) + } else { + throw InternalException("Rust panic") + } + } else { + throw InternalException("Unknown rust call status: $status.code") + } +} + +/** + * UniffiRustCallStatusErrorHandler implementation for times when we don't expect a CALL_ERROR + * + * @suppress + */ +object UniffiNullRustCallStatusErrorHandler: UniffiRustCallStatusErrorHandler { + override fun lift(error_buf: RustBuffer.ByValue): InternalException { + RustBuffer.free(error_buf) + return InternalException("Unexpected CALL_ERROR") + } +} + +// Call a rust function that returns a plain value +private inline fun uniffiRustCall(callback: (UniffiRustCallStatus) -> U): U { + return uniffiRustCallWithError(UniffiNullRustCallStatusErrorHandler, callback) +} + +internal inline fun uniffiTraitInterfaceCall( + callStatus: UniffiRustCallStatus, + makeCall: () -> T, + writeReturn: (T) -> Unit, +) { + try { + writeReturn(makeCall()) + } catch(e: kotlin.Exception) { + val err = try { e.stackTraceToString() } catch(_: Throwable) { "" } + callStatus.code = UNIFFI_CALL_UNEXPECTED_ERROR + callStatus.error_buf = FfiConverterString.lower(err) + } +} + +internal inline fun uniffiTraitInterfaceCallWithError( + callStatus: UniffiRustCallStatus, + makeCall: () -> T, + writeReturn: (T) -> Unit, + lowerError: (E) -> RustBuffer.ByValue +) { + try { + writeReturn(makeCall()) + } catch(e: kotlin.Exception) { + if (e is E) { + callStatus.code = UNIFFI_CALL_ERROR + callStatus.error_buf = lowerError(e) + } else { + val err = try { e.stackTraceToString() } catch(_: Throwable) { "" } + callStatus.code = UNIFFI_CALL_UNEXPECTED_ERROR + callStatus.error_buf = FfiConverterString.lower(err) + } + } +} +// Initial value and increment amount for handles. +// These ensure that Kotlin-generated handles always have the lowest bit set +private const val UNIFFI_HANDLEMAP_INITIAL = 1.toLong() +private const val UNIFFI_HANDLEMAP_DELTA = 2.toLong() + +// Map handles to objects +// +// This is used pass an opaque 64-bit handle representing a foreign object to the Rust code. +internal class UniffiHandleMap { + private val map = ConcurrentHashMap() + // Start + private val counter = java.util.concurrent.atomic.AtomicLong(UNIFFI_HANDLEMAP_INITIAL) + + val size: Int + get() = map.size + + // Insert a new object into the handle map and get a handle for it + fun insert(obj: T): Long { + val handle = counter.getAndAdd(UNIFFI_HANDLEMAP_DELTA) + map.put(handle, obj) + return handle + } + + // Clone a handle, creating a new one + fun clone(handle: Long): Long { + val obj = map.get(handle) ?: throw InternalException("UniffiHandleMap.clone: Invalid handle") + return insert(obj) + } + + // Get an object from the handle map + fun get(handle: Long): T { + return map.get(handle) ?: throw InternalException("UniffiHandleMap.get: Invalid handle") + } + + // Remove an entry from the handlemap and get the Kotlin object back + fun remove(handle: Long): T { + return map.remove(handle) ?: throw InternalException("UniffiHandleMap: Invalid handle") + } +} + +// Contains loading, initialization code, +// and the FFI Function declarations in a com.sun.jna.Library. +@Synchronized +private fun findLibraryName(componentName: String): String { + val libOverride = System.getProperty("uniffi.component.$componentName.libraryOverride") + if (libOverride != null) { + return libOverride + } + return "maple_core" +} + +// Define FFI callback types +internal interface UniffiRustFutureContinuationCallback : com.sun.jna.Callback { + fun callback(`data`: Long,`pollResult`: Byte,) +} +internal interface UniffiForeignFutureDroppedCallback : com.sun.jna.Callback { + fun callback(`handle`: Long,) +} +internal interface UniffiCallbackInterfaceFree : com.sun.jna.Callback { + fun callback(`handle`: Long,) +} +internal interface UniffiCallbackInterfaceClone : com.sun.jna.Callback { + fun callback(`handle`: Long,) + : Long +} +@Structure.FieldOrder("handle", "free") +internal open class UniffiForeignFutureDroppedCallbackStruct( + @JvmField internal var `handle`: Long = 0.toLong(), + @JvmField internal var `free`: UniffiForeignFutureDroppedCallback? = null, +) : Structure() { + class UniffiByValue( + `handle`: Long = 0.toLong(), + `free`: UniffiForeignFutureDroppedCallback? = null, + ): UniffiForeignFutureDroppedCallbackStruct(`handle`,`free`,), Structure.ByValue + + internal fun uniffiSetValue(other: UniffiForeignFutureDroppedCallbackStruct) { + `handle` = other.`handle` + `free` = other.`free` + } + +} +@Structure.FieldOrder("returnValue", "callStatus") +internal open class UniffiForeignFutureResultU8( + @JvmField internal var `returnValue`: Byte = 0.toByte(), + @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), +) : Structure() { + class UniffiByValue( + `returnValue`: Byte = 0.toByte(), + `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), + ): UniffiForeignFutureResultU8(`returnValue`,`callStatus`,), Structure.ByValue + + internal fun uniffiSetValue(other: UniffiForeignFutureResultU8) { + `returnValue` = other.`returnValue` + `callStatus` = other.`callStatus` + } + +} +internal interface UniffiForeignFutureCompleteU8 : com.sun.jna.Callback { + fun callback(`callbackData`: Long,`result`: UniffiForeignFutureResultU8.UniffiByValue,) +} +@Structure.FieldOrder("returnValue", "callStatus") +internal open class UniffiForeignFutureResultI8( + @JvmField internal var `returnValue`: Byte = 0.toByte(), + @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), +) : Structure() { + class UniffiByValue( + `returnValue`: Byte = 0.toByte(), + `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), + ): UniffiForeignFutureResultI8(`returnValue`,`callStatus`,), Structure.ByValue + + internal fun uniffiSetValue(other: UniffiForeignFutureResultI8) { + `returnValue` = other.`returnValue` + `callStatus` = other.`callStatus` + } + +} +internal interface UniffiForeignFutureCompleteI8 : com.sun.jna.Callback { + fun callback(`callbackData`: Long,`result`: UniffiForeignFutureResultI8.UniffiByValue,) +} +@Structure.FieldOrder("returnValue", "callStatus") +internal open class UniffiForeignFutureResultU16( + @JvmField internal var `returnValue`: Short = 0.toShort(), + @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), +) : Structure() { + class UniffiByValue( + `returnValue`: Short = 0.toShort(), + `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), + ): UniffiForeignFutureResultU16(`returnValue`,`callStatus`,), Structure.ByValue + + internal fun uniffiSetValue(other: UniffiForeignFutureResultU16) { + `returnValue` = other.`returnValue` + `callStatus` = other.`callStatus` + } + +} +internal interface UniffiForeignFutureCompleteU16 : com.sun.jna.Callback { + fun callback(`callbackData`: Long,`result`: UniffiForeignFutureResultU16.UniffiByValue,) +} +@Structure.FieldOrder("returnValue", "callStatus") +internal open class UniffiForeignFutureResultI16( + @JvmField internal var `returnValue`: Short = 0.toShort(), + @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), +) : Structure() { + class UniffiByValue( + `returnValue`: Short = 0.toShort(), + `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), + ): UniffiForeignFutureResultI16(`returnValue`,`callStatus`,), Structure.ByValue + + internal fun uniffiSetValue(other: UniffiForeignFutureResultI16) { + `returnValue` = other.`returnValue` + `callStatus` = other.`callStatus` + } + +} +internal interface UniffiForeignFutureCompleteI16 : com.sun.jna.Callback { + fun callback(`callbackData`: Long,`result`: UniffiForeignFutureResultI16.UniffiByValue,) +} +@Structure.FieldOrder("returnValue", "callStatus") +internal open class UniffiForeignFutureResultU32( + @JvmField internal var `returnValue`: Int = 0, + @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), +) : Structure() { + class UniffiByValue( + `returnValue`: Int = 0, + `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), + ): UniffiForeignFutureResultU32(`returnValue`,`callStatus`,), Structure.ByValue + + internal fun uniffiSetValue(other: UniffiForeignFutureResultU32) { + `returnValue` = other.`returnValue` + `callStatus` = other.`callStatus` + } + +} +internal interface UniffiForeignFutureCompleteU32 : com.sun.jna.Callback { + fun callback(`callbackData`: Long,`result`: UniffiForeignFutureResultU32.UniffiByValue,) +} +@Structure.FieldOrder("returnValue", "callStatus") +internal open class UniffiForeignFutureResultI32( + @JvmField internal var `returnValue`: Int = 0, + @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), +) : Structure() { + class UniffiByValue( + `returnValue`: Int = 0, + `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), + ): UniffiForeignFutureResultI32(`returnValue`,`callStatus`,), Structure.ByValue + + internal fun uniffiSetValue(other: UniffiForeignFutureResultI32) { + `returnValue` = other.`returnValue` + `callStatus` = other.`callStatus` + } + +} +internal interface UniffiForeignFutureCompleteI32 : com.sun.jna.Callback { + fun callback(`callbackData`: Long,`result`: UniffiForeignFutureResultI32.UniffiByValue,) +} +@Structure.FieldOrder("returnValue", "callStatus") +internal open class UniffiForeignFutureResultU64( + @JvmField internal var `returnValue`: Long = 0.toLong(), + @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), +) : Structure() { + class UniffiByValue( + `returnValue`: Long = 0.toLong(), + `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), + ): UniffiForeignFutureResultU64(`returnValue`,`callStatus`,), Structure.ByValue + + internal fun uniffiSetValue(other: UniffiForeignFutureResultU64) { + `returnValue` = other.`returnValue` + `callStatus` = other.`callStatus` + } + +} +internal interface UniffiForeignFutureCompleteU64 : com.sun.jna.Callback { + fun callback(`callbackData`: Long,`result`: UniffiForeignFutureResultU64.UniffiByValue,) +} +@Structure.FieldOrder("returnValue", "callStatus") +internal open class UniffiForeignFutureResultI64( + @JvmField internal var `returnValue`: Long = 0.toLong(), + @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), +) : Structure() { + class UniffiByValue( + `returnValue`: Long = 0.toLong(), + `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), + ): UniffiForeignFutureResultI64(`returnValue`,`callStatus`,), Structure.ByValue + + internal fun uniffiSetValue(other: UniffiForeignFutureResultI64) { + `returnValue` = other.`returnValue` + `callStatus` = other.`callStatus` + } + +} +internal interface UniffiForeignFutureCompleteI64 : com.sun.jna.Callback { + fun callback(`callbackData`: Long,`result`: UniffiForeignFutureResultI64.UniffiByValue,) +} +@Structure.FieldOrder("returnValue", "callStatus") +internal open class UniffiForeignFutureResultF32( + @JvmField internal var `returnValue`: Float = 0.0f, + @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), +) : Structure() { + class UniffiByValue( + `returnValue`: Float = 0.0f, + `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), + ): UniffiForeignFutureResultF32(`returnValue`,`callStatus`,), Structure.ByValue + + internal fun uniffiSetValue(other: UniffiForeignFutureResultF32) { + `returnValue` = other.`returnValue` + `callStatus` = other.`callStatus` + } + +} +internal interface UniffiForeignFutureCompleteF32 : com.sun.jna.Callback { + fun callback(`callbackData`: Long,`result`: UniffiForeignFutureResultF32.UniffiByValue,) +} +@Structure.FieldOrder("returnValue", "callStatus") +internal open class UniffiForeignFutureResultF64( + @JvmField internal var `returnValue`: Double = 0.0, + @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), +) : Structure() { + class UniffiByValue( + `returnValue`: Double = 0.0, + `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), + ): UniffiForeignFutureResultF64(`returnValue`,`callStatus`,), Structure.ByValue + + internal fun uniffiSetValue(other: UniffiForeignFutureResultF64) { + `returnValue` = other.`returnValue` + `callStatus` = other.`callStatus` + } + +} +internal interface UniffiForeignFutureCompleteF64 : com.sun.jna.Callback { + fun callback(`callbackData`: Long,`result`: UniffiForeignFutureResultF64.UniffiByValue,) +} +@Structure.FieldOrder("returnValue", "callStatus") +internal open class UniffiForeignFutureResultRustBuffer( + @JvmField internal var `returnValue`: RustBuffer.ByValue = RustBuffer.ByValue(), + @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), +) : Structure() { + class UniffiByValue( + `returnValue`: RustBuffer.ByValue = RustBuffer.ByValue(), + `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), + ): UniffiForeignFutureResultRustBuffer(`returnValue`,`callStatus`,), Structure.ByValue + + internal fun uniffiSetValue(other: UniffiForeignFutureResultRustBuffer) { + `returnValue` = other.`returnValue` + `callStatus` = other.`callStatus` + } + +} +internal interface UniffiForeignFutureCompleteRustBuffer : com.sun.jna.Callback { + fun callback(`callbackData`: Long,`result`: UniffiForeignFutureResultRustBuffer.UniffiByValue,) +} +@Structure.FieldOrder("callStatus") +internal open class UniffiForeignFutureResultVoid( + @JvmField internal var `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), +) : Structure() { + class UniffiByValue( + `callStatus`: UniffiRustCallStatus.ByValue = UniffiRustCallStatus.ByValue(), + ): UniffiForeignFutureResultVoid(`callStatus`,), Structure.ByValue + + internal fun uniffiSetValue(other: UniffiForeignFutureResultVoid) { + `callStatus` = other.`callStatus` + } + +} +internal interface UniffiForeignFutureCompleteVoid : com.sun.jna.Callback { + fun callback(`callbackData`: Long,`result`: UniffiForeignFutureResultVoid.UniffiByValue,) +} +internal interface UniffiCallbackInterfaceAppReconcilerMethod0 : com.sun.jna.Callback { + fun callback(`uniffiHandle`: Long,`update`: RustBuffer.ByValue,`uniffiOutReturn`: Pointer,uniffiCallStatus: UniffiRustCallStatus,) +} +@Structure.FieldOrder("uniffiFree", "uniffiClone", "reconcile") +internal open class UniffiVTableCallbackInterfaceAppReconciler( + @JvmField internal var `uniffiFree`: UniffiCallbackInterfaceFree? = null, + @JvmField internal var `uniffiClone`: UniffiCallbackInterfaceClone? = null, + @JvmField internal var `reconcile`: UniffiCallbackInterfaceAppReconcilerMethod0? = null, +) : Structure() { + class UniffiByValue( + `uniffiFree`: UniffiCallbackInterfaceFree? = null, + `uniffiClone`: UniffiCallbackInterfaceClone? = null, + `reconcile`: UniffiCallbackInterfaceAppReconcilerMethod0? = null, + ): UniffiVTableCallbackInterfaceAppReconciler(`uniffiFree`,`uniffiClone`,`reconcile`,), Structure.ByValue + + internal fun uniffiSetValue(other: UniffiVTableCallbackInterfaceAppReconciler) { + `uniffiFree` = other.`uniffiFree` + `uniffiClone` = other.`uniffiClone` + `reconcile` = other.`reconcile` + } + +} + +// A JNA Library to expose the extern-C FFI definitions. +// This is an implementation detail which will be called internally by the public API. + +// For large crates we prevent `MethodTooLargeException` (see #2340) +// N.B. the name of the extension is very misleading, since it is +// rather `InterfaceTooLargeException`, caused by too many methods +// in the interface for large crates. +// +// By splitting the otherwise huge interface into two parts +// * UniffiLib (this) +// * IntegrityCheckingUniffiLib +// And all checksum methods are put into `IntegrityCheckingUniffiLib` +// we allow for ~2x as many methods in the UniffiLib interface. +// +// Note: above all written when we used JNA's `loadIndirect` etc. +// We now use JNA's "direct mapping" - unclear if same considerations apply exactly. +internal object IntegrityCheckingUniffiLib { + init { + Native.register(IntegrityCheckingUniffiLib::class.java, findLibraryName(componentName = "maple_core")) + uniffiCheckContractApiVersion(this) + uniffiCheckApiChecksums(this) + } + external fun uniffi_maple_core_checksum_method_ffiapp_dispatch( + ): Short + external fun uniffi_maple_core_checksum_method_ffiapp_listen_for_updates( + ): Short + external fun uniffi_maple_core_checksum_method_ffiapp_state( + ): Short + external fun uniffi_maple_core_checksum_constructor_ffiapp_new( + ): Short + external fun uniffi_maple_core_checksum_method_appreconciler_reconcile( + ): Short + external fun ffi_maple_core_uniffi_contract_version( + ): Int + + +} + +internal object UniffiLib { + + // The Cleaner for the whole library + internal val CLEANER: UniffiCleaner by lazy { + UniffiCleaner.create() + } + + + init { + Native.register(UniffiLib::class.java, findLibraryName(componentName = "maple_core")) + uniffiCallbackInterfaceAppReconciler.register(this) + + } + external fun uniffi_maple_core_fn_clone_ffiapp(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, + ): Long + external fun uniffi_maple_core_fn_free_ffiapp(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, + ): Unit + external fun uniffi_maple_core_fn_constructor_ffiapp_new(`apiUrl`: RustBuffer.ByValue,`clientId`: RustBuffer.ByValue,`dataDir`: RustBuffer.ByValue,uniffi_out_err: UniffiRustCallStatus, + ): Long + external fun uniffi_maple_core_fn_method_ffiapp_dispatch(`ptr`: Long,`action`: RustBuffer.ByValue,uniffi_out_err: UniffiRustCallStatus, + ): Unit + external fun uniffi_maple_core_fn_method_ffiapp_listen_for_updates(`ptr`: Long,`reconciler`: Long,uniffi_out_err: UniffiRustCallStatus, + ): Unit + external fun uniffi_maple_core_fn_method_ffiapp_state(`ptr`: Long,uniffi_out_err: UniffiRustCallStatus, + ): RustBuffer.ByValue + external fun uniffi_maple_core_fn_init_callback_vtable_appreconciler(`vtable`: UniffiVTableCallbackInterfaceAppReconciler, + ): Unit + external fun ffi_maple_core_rustbuffer_alloc(`size`: Long,uniffi_out_err: UniffiRustCallStatus, + ): RustBuffer.ByValue + external fun ffi_maple_core_rustbuffer_from_bytes(`bytes`: ForeignBytes.ByValue,uniffi_out_err: UniffiRustCallStatus, + ): RustBuffer.ByValue + external fun ffi_maple_core_rustbuffer_free(`buf`: RustBuffer.ByValue,uniffi_out_err: UniffiRustCallStatus, + ): Unit + external fun ffi_maple_core_rustbuffer_reserve(`buf`: RustBuffer.ByValue,`additional`: Long,uniffi_out_err: UniffiRustCallStatus, + ): RustBuffer.ByValue + external fun ffi_maple_core_rust_future_poll_u8(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long, + ): Unit + external fun ffi_maple_core_rust_future_cancel_u8(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_free_u8(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_complete_u8(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, + ): Byte + external fun ffi_maple_core_rust_future_poll_i8(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long, + ): Unit + external fun ffi_maple_core_rust_future_cancel_i8(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_free_i8(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_complete_i8(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, + ): Byte + external fun ffi_maple_core_rust_future_poll_u16(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long, + ): Unit + external fun ffi_maple_core_rust_future_cancel_u16(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_free_u16(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_complete_u16(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, + ): Short + external fun ffi_maple_core_rust_future_poll_i16(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long, + ): Unit + external fun ffi_maple_core_rust_future_cancel_i16(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_free_i16(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_complete_i16(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, + ): Short + external fun ffi_maple_core_rust_future_poll_u32(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long, + ): Unit + external fun ffi_maple_core_rust_future_cancel_u32(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_free_u32(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_complete_u32(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, + ): Int + external fun ffi_maple_core_rust_future_poll_i32(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long, + ): Unit + external fun ffi_maple_core_rust_future_cancel_i32(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_free_i32(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_complete_i32(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, + ): Int + external fun ffi_maple_core_rust_future_poll_u64(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long, + ): Unit + external fun ffi_maple_core_rust_future_cancel_u64(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_free_u64(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_complete_u64(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, + ): Long + external fun ffi_maple_core_rust_future_poll_i64(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long, + ): Unit + external fun ffi_maple_core_rust_future_cancel_i64(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_free_i64(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_complete_i64(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, + ): Long + external fun ffi_maple_core_rust_future_poll_f32(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long, + ): Unit + external fun ffi_maple_core_rust_future_cancel_f32(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_free_f32(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_complete_f32(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, + ): Float + external fun ffi_maple_core_rust_future_poll_f64(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long, + ): Unit + external fun ffi_maple_core_rust_future_cancel_f64(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_free_f64(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_complete_f64(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, + ): Double + external fun ffi_maple_core_rust_future_poll_rust_buffer(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long, + ): Unit + external fun ffi_maple_core_rust_future_cancel_rust_buffer(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_free_rust_buffer(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_complete_rust_buffer(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, + ): RustBuffer.ByValue + external fun ffi_maple_core_rust_future_poll_void(`handle`: Long,`callback`: UniffiRustFutureContinuationCallback,`callbackData`: Long, + ): Unit + external fun ffi_maple_core_rust_future_cancel_void(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_free_void(`handle`: Long, + ): Unit + external fun ffi_maple_core_rust_future_complete_void(`handle`: Long,uniffi_out_err: UniffiRustCallStatus, + ): Unit + + +} + +private fun uniffiCheckContractApiVersion(lib: IntegrityCheckingUniffiLib) { + // Get the bindings contract version from our ComponentInterface + val bindings_contract_version = 30 + // Get the scaffolding contract version by calling the into the dylib + val scaffolding_contract_version = lib.ffi_maple_core_uniffi_contract_version() + if (bindings_contract_version != scaffolding_contract_version) { + throw RuntimeException("UniFFI contract version mismatch: try cleaning and rebuilding your project") + } +} +@Suppress("UNUSED_PARAMETER") +private fun uniffiCheckApiChecksums(lib: IntegrityCheckingUniffiLib) { + if (lib.uniffi_maple_core_checksum_method_ffiapp_dispatch() != 27078.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_maple_core_checksum_method_ffiapp_listen_for_updates() != 63526.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_maple_core_checksum_method_ffiapp_state() != 13593.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_maple_core_checksum_constructor_ffiapp_new() != 52040.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_maple_core_checksum_method_appreconciler_reconcile() != 25035.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } +} + +/** + * @suppress + */ +public fun uniffiEnsureInitialized() { + IntegrityCheckingUniffiLib + // UniffiLib() initialized as objects are used, but we still need to explicitly + // reference it so initialization across crates works as expected. + UniffiLib +} + +// Async support + +// Public interface members begin here. + + +// Interface implemented by anything that can contain an object reference. +// +// Such types expose a `destroy()` method that must be called to cleanly +// dispose of the contained objects. Failure to call this method may result +// in memory leaks. +// +// The easiest way to ensure this method is called is to use the `.use` +// helper method to execute a block and destroy the object at the end. +interface Disposable { + fun destroy() + companion object { + fun destroy(vararg args: Any?) { + for (arg in args) { + when (arg) { + is Disposable -> arg.destroy() + is ArrayList<*> -> { + for (idx in arg.indices) { + val element = arg[idx] + if (element is Disposable) { + element.destroy() + } + } + } + is Map<*, *> -> { + for (element in arg.values) { + if (element is Disposable) { + element.destroy() + } + } + } + is Iterable<*> -> { + for (element in arg) { + if (element is Disposable) { + element.destroy() + } + } + } + } + } + } + } +} + +/** + * @suppress + */ +inline fun T.use(block: (T) -> R) = + try { + block(this) + } finally { + try { + // N.B. our implementation is on the nullable type `Disposable?`. + this?.destroy() + } catch (e: Throwable) { + // swallow + } + } + +/** + * Placeholder object used to signal that we're constructing an interface with a FFI handle. + * + * This is the first argument for interface constructors that input a raw handle. It exists is that + * so we can avoid signature conflicts when an interface has a regular constructor than inputs a + * Long. + * + * @suppress + * */ +object UniffiWithHandle + +/** + * Used to instantiate an interface without an actual pointer, for fakes in tests, mostly. + * + * @suppress + * */ +object NoHandle// Magic number for the Rust proxy to call using the same mechanism as every other method, +// to free the callback once it's dropped by Rust. +internal const val IDX_CALLBACK_FREE = 0 +// Callback return codes +internal const val UNIFFI_CALLBACK_SUCCESS = 0 +internal const val UNIFFI_CALLBACK_ERROR = 1 +internal const val UNIFFI_CALLBACK_UNEXPECTED_ERROR = 2 + +/** + * @suppress + */ +public abstract class FfiConverterCallbackInterface: FfiConverter { + internal val handleMap = UniffiHandleMap() + + internal fun drop(handle: Long) { + handleMap.remove(handle) + } + + override fun lift(value: Long): CallbackInterface { + return handleMap.get(value) + } + + override fun read(buf: ByteBuffer) = lift(buf.getLong()) + + override fun lower(value: CallbackInterface) = handleMap.insert(value) + + override fun allocationSize(value: CallbackInterface) = 8UL + + override fun write(value: CallbackInterface, buf: ByteBuffer) { + buf.putLong(lower(value)) + } +} +/** + * The cleaner interface for Object finalization code to run. + * This is the entry point to any implementation that we're using. + * + * The cleaner registers objects and returns cleanables, so now we are + * defining a `UniffiCleaner` with a `UniffiClenaer.Cleanable` to abstract the + * different implmentations available at compile time. + * + * @suppress + */ +interface UniffiCleaner { + interface Cleanable { + fun clean() + } + + fun register(value: Any, cleanUpTask: Runnable): UniffiCleaner.Cleanable + + companion object +} + +// The fallback Jna cleaner, which is available for both Android, and the JVM. +private class UniffiJnaCleaner : UniffiCleaner { + private val cleaner = com.sun.jna.internal.Cleaner.getCleaner() + + override fun register(value: Any, cleanUpTask: Runnable): UniffiCleaner.Cleanable = + UniffiJnaCleanable(cleaner.register(value, cleanUpTask)) +} + +private class UniffiJnaCleanable( + private val cleanable: com.sun.jna.internal.Cleaner.Cleanable, +) : UniffiCleaner.Cleanable { + override fun clean() = cleanable.clean() +} + + +// We decide at uniffi binding generation time whether we were +// using Android or not. +// There are further runtime checks to chose the correct implementation +// of the cleaner. +private fun UniffiCleaner.Companion.create(): UniffiCleaner = + try { + // For safety's sake: if the library hasn't been run in android_cleaner = true + // mode, but is being run on Android, then we still need to think about + // Android API versions. + // So we check if java.lang.ref.Cleaner is there, and use that… + java.lang.Class.forName("java.lang.ref.Cleaner") + JavaLangRefCleaner() + } catch (e: ClassNotFoundException) { + // … otherwise, fallback to the JNA cleaner. + UniffiJnaCleaner() + } + +private class JavaLangRefCleaner : UniffiCleaner { + val cleaner = java.lang.ref.Cleaner.create() + + override fun register(value: Any, cleanUpTask: Runnable): UniffiCleaner.Cleanable = + JavaLangRefCleanable(cleaner.register(value, cleanUpTask)) +} + +private class JavaLangRefCleanable( + val cleanable: java.lang.ref.Cleaner.Cleanable +) : UniffiCleaner.Cleanable { + override fun clean() = cleanable.clean() +} + +/** + * @suppress + */ +public object FfiConverterULong: FfiConverter { + override fun lift(value: Long): ULong { + return value.toULong() + } + + override fun read(buf: ByteBuffer): ULong { + return lift(buf.getLong()) + } + + override fun lower(value: ULong): Long { + return value.toLong() + } + + override fun allocationSize(value: ULong) = 8UL + + override fun write(value: ULong, buf: ByteBuffer) { + buf.putLong(value.toLong()) + } +} + +/** + * @suppress + */ +public object FfiConverterLong: FfiConverter { + override fun lift(value: Long): Long { + return value + } + + override fun read(buf: ByteBuffer): Long { + return buf.getLong() + } + + override fun lower(value: Long): Long { + return value + } + + override fun allocationSize(value: Long) = 8UL + + override fun write(value: Long, buf: ByteBuffer) { + buf.putLong(value) + } +} + +/** + * @suppress + */ +public object FfiConverterBoolean: FfiConverter { + override fun lift(value: Byte): Boolean { + return value.toInt() != 0 + } + + override fun read(buf: ByteBuffer): Boolean { + return lift(buf.get()) + } + + override fun lower(value: Boolean): Byte { + return if (value) 1.toByte() else 0.toByte() + } + + override fun allocationSize(value: Boolean) = 1UL + + override fun write(value: Boolean, buf: ByteBuffer) { + buf.put(lower(value)) + } +} + +/** + * @suppress + */ +public object FfiConverterString: FfiConverter { + // Note: we don't inherit from FfiConverterRustBuffer, because we use a + // special encoding when lowering/lifting. We can use `RustBuffer.len` to + // store our length and avoid writing it out to the buffer. + override fun lift(value: RustBuffer.ByValue): String { + try { + val byteArr = ByteArray(value.len.toInt()) + value.asByteBuffer()!!.get(byteArr) + return byteArr.toString(Charsets.UTF_8) + } finally { + RustBuffer.free(value) + } + } + + override fun read(buf: ByteBuffer): String { + val len = buf.getInt() + val byteArr = ByteArray(len) + buf.get(byteArr) + return byteArr.toString(Charsets.UTF_8) + } + + fun toUtf8(value: String): ByteBuffer { + // Make sure we don't have invalid UTF-16, check for lone surrogates. + return Charsets.UTF_8.newEncoder().run { + onMalformedInput(CodingErrorAction.REPORT) + encode(CharBuffer.wrap(value)) + } + } + + override fun lower(value: String): RustBuffer.ByValue { + val byteBuf = toUtf8(value) + // Ideally we'd pass these bytes to `ffi_bytebuffer_from_bytes`, but doing so would require us + // to copy them into a JNA `Memory`. So we might as well directly copy them into a `RustBuffer`. + val rbuf = RustBuffer.alloc(byteBuf.limit().toULong()) + rbuf.asByteBuffer()!!.put(byteBuf) + return rbuf + } + + // We aren't sure exactly how many bytes our string will be once it's UTF-8 + // encoded. Allocate 3 bytes per UTF-16 code unit which will always be + // enough. + override fun allocationSize(value: String): ULong { + val sizeForLength = 4UL + val sizeForString = value.length.toULong() * 3UL + return sizeForLength + sizeForString + } + + override fun write(value: String, buf: ByteBuffer) { + val byteBuf = toUtf8(value) + buf.putInt(byteBuf.limit()) + buf.put(byteBuf) + } +} + + +// This template implements a class for working with a Rust struct via a handle +// to the live Rust struct on the other side of the FFI. +// +// There's some subtlety here, because we have to be careful not to operate on a Rust +// struct after it has been dropped, and because we must expose a public API for freeing +// theq Kotlin wrapper object in lieu of reliable finalizers. The core requirements are: +// +// * Each instance holds an opaque handle to the underlying Rust struct. +// Method calls need to read this handle from the object's state and pass it in to +// the Rust FFI. +// +// * When an instance is no longer needed, its handle should be passed to a +// special destructor function provided by the Rust FFI, which will drop the +// underlying Rust struct. +// +// * Given an instance, calling code is expected to call the special +// `destroy` method in order to free it after use, either by calling it explicitly +// or by using a higher-level helper like the `use` method. Failing to do so risks +// leaking the underlying Rust struct. +// +// * We can't assume that calling code will do the right thing, and must be prepared +// to handle Kotlin method calls executing concurrently with or even after a call to +// `destroy`, and to handle multiple (possibly concurrent!) calls to `destroy`. +// +// * We must never allow Rust code to operate on the underlying Rust struct after +// the destructor has been called, and must never call the destructor more than once. +// Doing so may trigger memory unsafety. +// +// * To mitigate many of the risks of leaking memory and use-after-free unsafety, a `Cleaner` +// is implemented to call the destructor when the Kotlin object becomes unreachable. +// This is done in a background thread. This is not a panacea, and client code should be aware that +// 1. the thread may starve if some there are objects that have poorly performing +// `drop` methods or do significant work in their `drop` methods. +// 2. the thread is shared across the whole library. This can be tuned by using `android_cleaner = true`, +// or `android = true` in the [`kotlin` section of the `uniffi.toml` file](https://mozilla.github.io/uniffi-rs/kotlin/configuration.html). +// +// If we try to implement this with mutual exclusion on access to the handle, there is the +// possibility of a race between a method call and a concurrent call to `destroy`: +// +// * Thread A starts a method call, reads the value of the handle, but is interrupted +// before it can pass the handle over the FFI to Rust. +// * Thread B calls `destroy` and frees the underlying Rust struct. +// * Thread A resumes, passing the already-read handle value to Rust and triggering +// a use-after-free. +// +// One possible solution would be to use a `ReadWriteLock`, with each method call taking +// a read lock (and thus allowed to run concurrently) and the special `destroy` method +// taking a write lock (and thus blocking on live method calls). However, we aim not to +// generate methods with any hidden blocking semantics, and a `destroy` method that might +// block if called incorrectly seems to meet that bar. +// +// So, we achieve our goals by giving each instance an associated `AtomicLong` counter to track +// the number of in-flight method calls, and an `AtomicBoolean` flag to indicate whether `destroy` +// has been called. These are updated according to the following rules: +// +// * The initial value of the counter is 1, indicating a live object with no in-flight calls. +// The initial value for the flag is false. +// +// * At the start of each method call, we atomically check the counter. +// If it is 0 then the underlying Rust struct has already been destroyed and the call is aborted. +// If it is nonzero them we atomically increment it by 1 and proceed with the method call. +// +// * At the end of each method call, we atomically decrement and check the counter. +// If it has reached zero then we destroy the underlying Rust struct. +// +// * When `destroy` is called, we atomically flip the flag from false to true. +// If the flag was already true we silently fail. +// Otherwise we atomically decrement and check the counter. +// If it has reached zero then we destroy the underlying Rust struct. +// +// Astute readers may observe that this all sounds very similar to the way that Rust's `Arc` works, +// and indeed it is, with the addition of a flag to guard against multiple calls to `destroy`. +// +// The overall effect is that the underlying Rust struct is destroyed only when `destroy` has been +// called *and* all in-flight method calls have completed, avoiding violating any of the expectations +// of the underlying Rust code. +// +// This makes a cleaner a better alternative to _not_ calling `destroy()` as +// and when the object is finished with, but the abstraction is not perfect: if the Rust object's `drop` +// method is slow, and/or there are many objects to cleanup, and it's on a low end Android device, then the cleaner +// thread may be starved, and the app will leak memory. +// +// In this case, `destroy`ing manually may be a better solution. +// +// The cleaner can live side by side with the manual calling of `destroy`. In the order of responsiveness, uniffi objects +// with Rust peers are reclaimed: +// +// 1. By calling the `destroy` method of the object, which calls `rustObject.free()`. If that doesn't happen: +// 2. When the object becomes unreachable, AND the Cleaner thread gets to call `rustObject.free()`. If the thread is starved then: +// 3. The memory is reclaimed when the process terminates. +// +// [1] https://stackoverflow.com/questions/24376768/can-java-finalize-an-object-when-it-is-still-in-scope/24380219 +// + + +public interface FfiAppInterface { + + fun `dispatch`(`action`: AppAction) + + fun `listenForUpdates`(`reconciler`: AppReconciler) + + fun `state`(): AppState + + companion object +} + +open class FfiApp: Disposable, AutoCloseable, FfiAppInterface +{ + + @Suppress("UNUSED_PARAMETER") + /** + * @suppress + */ + constructor(withHandle: UniffiWithHandle, handle: Long) { + this.handle = handle + this.cleanable = UniffiLib.CLEANER.register(this, UniffiCleanAction(handle)) + } + + /** + * @suppress + * + * This constructor can be used to instantiate a fake object. Only used for tests. Any + * attempt to actually use an object constructed this way will fail as there is no + * connected Rust object. + */ + @Suppress("UNUSED_PARAMETER") + constructor(noHandle: NoHandle) { + this.handle = 0 + this.cleanable = null + } + constructor(`apiUrl`: kotlin.String, `clientId`: kotlin.String, `dataDir`: kotlin.String) : + this(UniffiWithHandle, + uniffiRustCall() { _status -> + UniffiLib.uniffi_maple_core_fn_constructor_ffiapp_new( + + FfiConverterString.lower(`apiUrl`),FfiConverterString.lower(`clientId`),FfiConverterString.lower(`dataDir`),_status) +} + ) + + protected val handle: Long + protected val cleanable: UniffiCleaner.Cleanable? + + private val wasDestroyed = AtomicBoolean(false) + private val callCounter = AtomicLong(1) + + override fun destroy() { + // Only allow a single call to this method. + // TODO: maybe we should log a warning if called more than once? + if (this.wasDestroyed.compareAndSet(false, true)) { + // This decrement always matches the initial count of 1 given at creation time. + if (this.callCounter.decrementAndGet() == 0L) { + cleanable?.clean() + } + } + } + + @Synchronized + override fun close() { + this.destroy() + } + + internal inline fun callWithHandle(block: (handle: Long) -> R): R { + // Check and increment the call counter, to keep the object alive. + // This needs a compare-and-set retry loop in case of concurrent updates. + do { + val c = this.callCounter.get() + if (c == 0L) { + throw IllegalStateException("${this.javaClass.simpleName} object has already been destroyed") + } + if (c == Long.MAX_VALUE) { + throw IllegalStateException("${this.javaClass.simpleName} call counter would overflow") + } + } while (! this.callCounter.compareAndSet(c, c + 1L)) + // Now we can safely do the method call without the handle being freed concurrently. + try { + return block(this.uniffiCloneHandle()) + } finally { + // This decrement always matches the increment we performed above. + if (this.callCounter.decrementAndGet() == 0L) { + cleanable?.clean() + } + } + } + + // Use a static inner class instead of a closure so as not to accidentally + // capture `this` as part of the cleanable's action. + private class UniffiCleanAction(private val handle: Long) : Runnable { + override fun run() { + if (handle == 0.toLong()) { + // Fake object created with `NoHandle`, don't try to free. + return; + } + uniffiRustCall { status -> + UniffiLib.uniffi_maple_core_fn_free_ffiapp(handle, status) + } + } + } + + /** + * @suppress + */ + fun uniffiCloneHandle(): Long { + if (handle == 0.toLong()) { + throw InternalException("uniffiCloneHandle() called on NoHandle object"); + } + return uniffiRustCall() { status -> + UniffiLib.uniffi_maple_core_fn_clone_ffiapp(handle, status) + } + } + + override fun `dispatch`(`action`: AppAction) + = + callWithHandle { + uniffiRustCall() { _status -> + UniffiLib.uniffi_maple_core_fn_method_ffiapp_dispatch( + it, + FfiConverterTypeAppAction.lower(`action`),_status) +} + } + + + + override fun `listenForUpdates`(`reconciler`: AppReconciler) + = + callWithHandle { + uniffiRustCall() { _status -> + UniffiLib.uniffi_maple_core_fn_method_ffiapp_listen_for_updates( + it, + FfiConverterTypeAppReconciler.lower(`reconciler`),_status) +} + } + + + + override fun `state`(): AppState { + return FfiConverterTypeAppState.lift( + callWithHandle { + uniffiRustCall() { _status -> + UniffiLib.uniffi_maple_core_fn_method_ffiapp_state( + it, + _status) +} + } + ) + } + + + + + + + + + + /** + * @suppress + */ + companion object + +} + + +/** + * @suppress + */ +public object FfiConverterTypeFfiApp: FfiConverter { + override fun lower(value: FfiApp): Long { + return value.uniffiCloneHandle() + } + + override fun lift(value: Long): FfiApp { + return FfiApp(UniffiWithHandle, value) + } + + override fun read(buf: ByteBuffer): FfiApp { + return lift(buf.getLong()) + } + + override fun allocationSize(value: FfiApp) = 8UL + + override fun write(value: FfiApp, buf: ByteBuffer) { + buf.putLong(lower(value)) + } +} + + + +data class AppState ( + var `rev`: kotlin.ULong + , + var `auth`: AuthState + , + var `pendingAuthUrl`: kotlin.String? + , + var `router`: Router + , + var `messages`: List + , + var `isAgentTyping`: kotlin.Boolean + , + var `isLoadingHistory`: kotlin.Boolean + , + var `hasOlderMessages`: kotlin.Boolean + , + var `composeText`: kotlin.String + , + var `toast`: kotlin.String? + , + var `showSettings`: kotlin.Boolean + , + var `confirmDeleteAgent`: kotlin.Boolean + , + var `isDeletingAgent`: kotlin.Boolean + +){ + + + + + + companion object +} + +/** + * @suppress + */ +public object FfiConverterTypeAppState: FfiConverterRustBuffer { + override fun read(buf: ByteBuffer): AppState { + return AppState( + FfiConverterULong.read(buf), + FfiConverterTypeAuthState.read(buf), + FfiConverterOptionalString.read(buf), + FfiConverterTypeRouter.read(buf), + FfiConverterSequenceTypeChatMessage.read(buf), + FfiConverterBoolean.read(buf), + FfiConverterBoolean.read(buf), + FfiConverterBoolean.read(buf), + FfiConverterString.read(buf), + FfiConverterOptionalString.read(buf), + FfiConverterBoolean.read(buf), + FfiConverterBoolean.read(buf), + FfiConverterBoolean.read(buf), + ) + } + + override fun allocationSize(value: AppState) = ( + FfiConverterULong.allocationSize(value.`rev`) + + FfiConverterTypeAuthState.allocationSize(value.`auth`) + + FfiConverterOptionalString.allocationSize(value.`pendingAuthUrl`) + + FfiConverterTypeRouter.allocationSize(value.`router`) + + FfiConverterSequenceTypeChatMessage.allocationSize(value.`messages`) + + FfiConverterBoolean.allocationSize(value.`isAgentTyping`) + + FfiConverterBoolean.allocationSize(value.`isLoadingHistory`) + + FfiConverterBoolean.allocationSize(value.`hasOlderMessages`) + + FfiConverterString.allocationSize(value.`composeText`) + + FfiConverterOptionalString.allocationSize(value.`toast`) + + FfiConverterBoolean.allocationSize(value.`showSettings`) + + FfiConverterBoolean.allocationSize(value.`confirmDeleteAgent`) + + FfiConverterBoolean.allocationSize(value.`isDeletingAgent`) + ) + + override fun write(value: AppState, buf: ByteBuffer) { + FfiConverterULong.write(value.`rev`, buf) + FfiConverterTypeAuthState.write(value.`auth`, buf) + FfiConverterOptionalString.write(value.`pendingAuthUrl`, buf) + FfiConverterTypeRouter.write(value.`router`, buf) + FfiConverterSequenceTypeChatMessage.write(value.`messages`, buf) + FfiConverterBoolean.write(value.`isAgentTyping`, buf) + FfiConverterBoolean.write(value.`isLoadingHistory`, buf) + FfiConverterBoolean.write(value.`hasOlderMessages`, buf) + FfiConverterString.write(value.`composeText`, buf) + FfiConverterOptionalString.write(value.`toast`, buf) + FfiConverterBoolean.write(value.`showSettings`, buf) + FfiConverterBoolean.write(value.`confirmDeleteAgent`, buf) + FfiConverterBoolean.write(value.`isDeletingAgent`, buf) + } +} + + + +data class ChatMessage ( + var `id`: kotlin.String + , + var `content`: kotlin.String + , + var `isUser`: kotlin.Boolean + , + var `isStreaming`: kotlin.Boolean + , + var `timestamp`: kotlin.Long + , + var `timestampDisplay`: kotlin.String + , + var `showSender`: kotlin.Boolean + , + var `showTimestamp`: kotlin.Boolean + +){ + + + + + + companion object +} + +/** + * @suppress + */ +public object FfiConverterTypeChatMessage: FfiConverterRustBuffer { + override fun read(buf: ByteBuffer): ChatMessage { + return ChatMessage( + FfiConverterString.read(buf), + FfiConverterString.read(buf), + FfiConverterBoolean.read(buf), + FfiConverterBoolean.read(buf), + FfiConverterLong.read(buf), + FfiConverterString.read(buf), + FfiConverterBoolean.read(buf), + FfiConverterBoolean.read(buf), + ) + } + + override fun allocationSize(value: ChatMessage) = ( + FfiConverterString.allocationSize(value.`id`) + + FfiConverterString.allocationSize(value.`content`) + + FfiConverterBoolean.allocationSize(value.`isUser`) + + FfiConverterBoolean.allocationSize(value.`isStreaming`) + + FfiConverterLong.allocationSize(value.`timestamp`) + + FfiConverterString.allocationSize(value.`timestampDisplay`) + + FfiConverterBoolean.allocationSize(value.`showSender`) + + FfiConverterBoolean.allocationSize(value.`showTimestamp`) + ) + + override fun write(value: ChatMessage, buf: ByteBuffer) { + FfiConverterString.write(value.`id`, buf) + FfiConverterString.write(value.`content`, buf) + FfiConverterBoolean.write(value.`isUser`, buf) + FfiConverterBoolean.write(value.`isStreaming`, buf) + FfiConverterLong.write(value.`timestamp`, buf) + FfiConverterString.write(value.`timestampDisplay`, buf) + FfiConverterBoolean.write(value.`showSender`, buf) + FfiConverterBoolean.write(value.`showTimestamp`, buf) + } +} + + + +data class Router ( + var `defaultScreen`: Screen + , + var `screenStack`: List + +){ + + + + + + companion object +} + +/** + * @suppress + */ +public object FfiConverterTypeRouter: FfiConverterRustBuffer { + override fun read(buf: ByteBuffer): Router { + return Router( + FfiConverterTypeScreen.read(buf), + FfiConverterSequenceTypeScreen.read(buf), + ) + } + + override fun allocationSize(value: Router) = ( + FfiConverterTypeScreen.allocationSize(value.`defaultScreen`) + + FfiConverterSequenceTypeScreen.allocationSize(value.`screenStack`) + ) + + override fun write(value: Router, buf: ByteBuffer) { + FfiConverterTypeScreen.write(value.`defaultScreen`, buf) + FfiConverterSequenceTypeScreen.write(value.`screenStack`, buf) + } +} + + + +sealed class AppAction { + + data class LoginWithEmail( + val `email`: kotlin.String, + val `password`: kotlin.String) : AppAction() + + { + + + companion object + } + + data class SignUpWithEmail( + val `email`: kotlin.String, + val `password`: kotlin.String, + val `name`: kotlin.String) : AppAction() + + { + + + companion object + } + + data class InitiateOAuth( + val `provider`: cloud.opensecret.maple.rust.OAuthProvider, + val `inviteCode`: kotlin.String?) : AppAction() + + { + + + companion object + } + + data class HandleOAuthCallback( + val `provider`: cloud.opensecret.maple.rust.OAuthProvider, + val `code`: kotlin.String, + val `state`: kotlin.String, + val `inviteCode`: kotlin.String) : AppAction() + + { + + + companion object + } + + data class RestoreSession( + val `accessToken`: kotlin.String, + val `refreshToken`: kotlin.String) : AppAction() + + { + + + companion object + } + + object ClearPendingAuthUrl : AppAction() + + + object Logout : AppAction() + + + data class SendMessage( + val `content`: kotlin.String) : AppAction() + + { + + + companion object + } + + object LoadOlderMessages : AppAction() + + + object RefreshTimestamps : AppAction() + + + object ClearToast : AppAction() + + + object ToggleSettings : AppAction() + + + object RequestDeleteAgent : AppAction() + + + object ConfirmDeleteAgent : AppAction() + + + object CancelDeleteAgent : AppAction() + + + + + + + + + + companion object +} + +/** + * @suppress + */ +public object FfiConverterTypeAppAction : FfiConverterRustBuffer{ + override fun read(buf: ByteBuffer): AppAction { + return when(buf.getInt()) { + 1 -> AppAction.LoginWithEmail( + FfiConverterString.read(buf), + FfiConverterString.read(buf), + ) + 2 -> AppAction.SignUpWithEmail( + FfiConverterString.read(buf), + FfiConverterString.read(buf), + FfiConverterString.read(buf), + ) + 3 -> AppAction.InitiateOAuth( + FfiConverterTypeOAuthProvider.read(buf), + FfiConverterOptionalString.read(buf), + ) + 4 -> AppAction.HandleOAuthCallback( + FfiConverterTypeOAuthProvider.read(buf), + FfiConverterString.read(buf), + FfiConverterString.read(buf), + FfiConverterString.read(buf), + ) + 5 -> AppAction.RestoreSession( + FfiConverterString.read(buf), + FfiConverterString.read(buf), + ) + 6 -> AppAction.ClearPendingAuthUrl + 7 -> AppAction.Logout + 8 -> AppAction.SendMessage( + FfiConverterString.read(buf), + ) + 9 -> AppAction.LoadOlderMessages + 10 -> AppAction.RefreshTimestamps + 11 -> AppAction.ClearToast + 12 -> AppAction.ToggleSettings + 13 -> AppAction.RequestDeleteAgent + 14 -> AppAction.ConfirmDeleteAgent + 15 -> AppAction.CancelDeleteAgent + else -> throw RuntimeException("invalid enum value, something is very wrong!!") + } + } + + override fun allocationSize(value: AppAction) = when(value) { + is AppAction.LoginWithEmail -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + + FfiConverterString.allocationSize(value.`email`) + + FfiConverterString.allocationSize(value.`password`) + ) + } + is AppAction.SignUpWithEmail -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + + FfiConverterString.allocationSize(value.`email`) + + FfiConverterString.allocationSize(value.`password`) + + FfiConverterString.allocationSize(value.`name`) + ) + } + is AppAction.InitiateOAuth -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + + FfiConverterTypeOAuthProvider.allocationSize(value.`provider`) + + FfiConverterOptionalString.allocationSize(value.`inviteCode`) + ) + } + is AppAction.HandleOAuthCallback -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + + FfiConverterTypeOAuthProvider.allocationSize(value.`provider`) + + FfiConverterString.allocationSize(value.`code`) + + FfiConverterString.allocationSize(value.`state`) + + FfiConverterString.allocationSize(value.`inviteCode`) + ) + } + is AppAction.RestoreSession -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + + FfiConverterString.allocationSize(value.`accessToken`) + + FfiConverterString.allocationSize(value.`refreshToken`) + ) + } + is AppAction.ClearPendingAuthUrl -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + ) + } + is AppAction.Logout -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + ) + } + is AppAction.SendMessage -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + + FfiConverterString.allocationSize(value.`content`) + ) + } + is AppAction.LoadOlderMessages -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + ) + } + is AppAction.RefreshTimestamps -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + ) + } + is AppAction.ClearToast -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + ) + } + is AppAction.ToggleSettings -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + ) + } + is AppAction.RequestDeleteAgent -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + ) + } + is AppAction.ConfirmDeleteAgent -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + ) + } + is AppAction.CancelDeleteAgent -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + ) + } + } + + override fun write(value: AppAction, buf: ByteBuffer) { + when(value) { + is AppAction.LoginWithEmail -> { + buf.putInt(1) + FfiConverterString.write(value.`email`, buf) + FfiConverterString.write(value.`password`, buf) + Unit + } + is AppAction.SignUpWithEmail -> { + buf.putInt(2) + FfiConverterString.write(value.`email`, buf) + FfiConverterString.write(value.`password`, buf) + FfiConverterString.write(value.`name`, buf) + Unit + } + is AppAction.InitiateOAuth -> { + buf.putInt(3) + FfiConverterTypeOAuthProvider.write(value.`provider`, buf) + FfiConverterOptionalString.write(value.`inviteCode`, buf) + Unit + } + is AppAction.HandleOAuthCallback -> { + buf.putInt(4) + FfiConverterTypeOAuthProvider.write(value.`provider`, buf) + FfiConverterString.write(value.`code`, buf) + FfiConverterString.write(value.`state`, buf) + FfiConverterString.write(value.`inviteCode`, buf) + Unit + } + is AppAction.RestoreSession -> { + buf.putInt(5) + FfiConverterString.write(value.`accessToken`, buf) + FfiConverterString.write(value.`refreshToken`, buf) + Unit + } + is AppAction.ClearPendingAuthUrl -> { + buf.putInt(6) + Unit + } + is AppAction.Logout -> { + buf.putInt(7) + Unit + } + is AppAction.SendMessage -> { + buf.putInt(8) + FfiConverterString.write(value.`content`, buf) + Unit + } + is AppAction.LoadOlderMessages -> { + buf.putInt(9) + Unit + } + is AppAction.RefreshTimestamps -> { + buf.putInt(10) + Unit + } + is AppAction.ClearToast -> { + buf.putInt(11) + Unit + } + is AppAction.ToggleSettings -> { + buf.putInt(12) + Unit + } + is AppAction.RequestDeleteAgent -> { + buf.putInt(13) + Unit + } + is AppAction.ConfirmDeleteAgent -> { + buf.putInt(14) + Unit + } + is AppAction.CancelDeleteAgent -> { + buf.putInt(15) + Unit + } + }.let { /* this makes the `when` an expression, which ensures it is exhaustive */ } + } +} + + + + + +sealed class AppUpdate { + + data class FullState( + val v1: cloud.opensecret.maple.rust.AppState) : AppUpdate() + + { + + + companion object + } + + data class SessionTokens( + val `rev`: kotlin.ULong, + val `accessToken`: kotlin.String, + val `refreshToken`: kotlin.String) : AppUpdate() + + { + + + companion object + } + + + + + + + + + companion object +} + +/** + * @suppress + */ +public object FfiConverterTypeAppUpdate : FfiConverterRustBuffer{ + override fun read(buf: ByteBuffer): AppUpdate { + return when(buf.getInt()) { + 1 -> AppUpdate.FullState( + FfiConverterTypeAppState.read(buf), + ) + 2 -> AppUpdate.SessionTokens( + FfiConverterULong.read(buf), + FfiConverterString.read(buf), + FfiConverterString.read(buf), + ) + else -> throw RuntimeException("invalid enum value, something is very wrong!!") + } + } + + override fun allocationSize(value: AppUpdate) = when(value) { + is AppUpdate.FullState -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + + FfiConverterTypeAppState.allocationSize(value.v1) + ) + } + is AppUpdate.SessionTokens -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + + FfiConverterULong.allocationSize(value.`rev`) + + FfiConverterString.allocationSize(value.`accessToken`) + + FfiConverterString.allocationSize(value.`refreshToken`) + ) + } + } + + override fun write(value: AppUpdate, buf: ByteBuffer) { + when(value) { + is AppUpdate.FullState -> { + buf.putInt(1) + FfiConverterTypeAppState.write(value.v1, buf) + Unit + } + is AppUpdate.SessionTokens -> { + buf.putInt(2) + FfiConverterULong.write(value.`rev`, buf) + FfiConverterString.write(value.`accessToken`, buf) + FfiConverterString.write(value.`refreshToken`, buf) + Unit + } + }.let { /* this makes the `when` an expression, which ensures it is exhaustive */ } + } +} + + + + + +sealed class AuthState { + + object Initializing : AuthState() + + + object Ready : AuthState() + + + object LoggingIn : AuthState() + + + object SigningUp : AuthState() + + + data class LoggedIn( + val `userId`: kotlin.String, + val `email`: kotlin.String?, + val `name`: kotlin.String?) : AuthState() + + { + + + companion object + } + + + + + + + + + companion object +} + +/** + * @suppress + */ +public object FfiConverterTypeAuthState : FfiConverterRustBuffer{ + override fun read(buf: ByteBuffer): AuthState { + return when(buf.getInt()) { + 1 -> AuthState.Initializing + 2 -> AuthState.Ready + 3 -> AuthState.LoggingIn + 4 -> AuthState.SigningUp + 5 -> AuthState.LoggedIn( + FfiConverterString.read(buf), + FfiConverterOptionalString.read(buf), + FfiConverterOptionalString.read(buf), + ) + else -> throw RuntimeException("invalid enum value, something is very wrong!!") + } + } + + override fun allocationSize(value: AuthState) = when(value) { + is AuthState.Initializing -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + ) + } + is AuthState.Ready -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + ) + } + is AuthState.LoggingIn -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + ) + } + is AuthState.SigningUp -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + ) + } + is AuthState.LoggedIn -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + + FfiConverterString.allocationSize(value.`userId`) + + FfiConverterOptionalString.allocationSize(value.`email`) + + FfiConverterOptionalString.allocationSize(value.`name`) + ) + } + } + + override fun write(value: AuthState, buf: ByteBuffer) { + when(value) { + is AuthState.Initializing -> { + buf.putInt(1) + Unit + } + is AuthState.Ready -> { + buf.putInt(2) + Unit + } + is AuthState.LoggingIn -> { + buf.putInt(3) + Unit + } + is AuthState.SigningUp -> { + buf.putInt(4) + Unit + } + is AuthState.LoggedIn -> { + buf.putInt(5) + FfiConverterString.write(value.`userId`, buf) + FfiConverterOptionalString.write(value.`email`, buf) + FfiConverterOptionalString.write(value.`name`, buf) + Unit + } + }.let { /* this makes the `when` an expression, which ensures it is exhaustive */ } + } +} + + + + + + +enum class OAuthProvider { + + GITHUB, + GOOGLE, + APPLE; + + + + + companion object +} + + +/** + * @suppress + */ +public object FfiConverterTypeOAuthProvider: FfiConverterRustBuffer { + override fun read(buf: ByteBuffer) = try { + OAuthProvider.values()[buf.getInt() - 1] + } catch (e: IndexOutOfBoundsException) { + throw RuntimeException("invalid enum value, something is very wrong!!", e) + } + + override fun allocationSize(value: OAuthProvider) = 4UL + + override fun write(value: OAuthProvider, buf: ByteBuffer) { + buf.putInt(value.ordinal + 1) + } +} + + + + + + +enum class Screen { + + LOADING, + LOGIN, + CHAT; + + + + + companion object +} + + +/** + * @suppress + */ +public object FfiConverterTypeScreen: FfiConverterRustBuffer { + override fun read(buf: ByteBuffer) = try { + Screen.values()[buf.getInt() - 1] + } catch (e: IndexOutOfBoundsException) { + throw RuntimeException("invalid enum value, something is very wrong!!", e) + } + + override fun allocationSize(value: Screen) = 4UL + + override fun write(value: Screen, buf: ByteBuffer) { + buf.putInt(value.ordinal + 1) + } +} + + + + + + + +public interface AppReconciler { + + fun `reconcile`(`update`: AppUpdate) + + companion object +} + + + +// Put the implementation in an object so we don't pollute the top-level namespace +internal object uniffiCallbackInterfaceAppReconciler { + internal object `reconcile`: UniffiCallbackInterfaceAppReconcilerMethod0 { + override fun callback(`uniffiHandle`: Long,`update`: RustBuffer.ByValue,`uniffiOutReturn`: Pointer,uniffiCallStatus: UniffiRustCallStatus,) { + val uniffiObj = FfiConverterTypeAppReconciler.handleMap.get(uniffiHandle) + val makeCall = { -> + uniffiObj.`reconcile`( + FfiConverterTypeAppUpdate.lift(`update`), + ) + } + val writeReturn = { _: Unit -> Unit } + uniffiTraitInterfaceCall(uniffiCallStatus, makeCall, writeReturn) + } + } + + internal object uniffiFree: UniffiCallbackInterfaceFree { + override fun callback(handle: Long) { + FfiConverterTypeAppReconciler.handleMap.remove(handle) + } + } + + internal object uniffiClone: UniffiCallbackInterfaceClone { + override fun callback(handle: Long): Long { + return FfiConverterTypeAppReconciler.handleMap.clone(handle) + } + } + + internal var vtable = UniffiVTableCallbackInterfaceAppReconciler.UniffiByValue( + uniffiFree, + uniffiClone, + `reconcile`, + ) + + // Registers the foreign callback with the Rust side. + // This method is generated for each callback interface. + internal fun register(lib: UniffiLib) { + lib.uniffi_maple_core_fn_init_callback_vtable_appreconciler(vtable) + } +} + +/** + * The ffiConverter which transforms the Callbacks in to handles to pass to Rust. + * + * @suppress + */ +public object FfiConverterTypeAppReconciler: FfiConverterCallbackInterface() + + + + +/** + * @suppress + */ +public object FfiConverterOptionalString: FfiConverterRustBuffer { + override fun read(buf: ByteBuffer): kotlin.String? { + if (buf.get().toInt() == 0) { + return null + } + return FfiConverterString.read(buf) + } + + override fun allocationSize(value: kotlin.String?): ULong { + if (value == null) { + return 1UL + } else { + return 1UL + FfiConverterString.allocationSize(value) + } + } + + override fun write(value: kotlin.String?, buf: ByteBuffer) { + if (value == null) { + buf.put(0) + } else { + buf.put(1) + FfiConverterString.write(value, buf) + } + } +} + + + + +/** + * @suppress + */ +public object FfiConverterSequenceTypeChatMessage: FfiConverterRustBuffer> { + override fun read(buf: ByteBuffer): List { + val len = buf.getInt() + return List(len) { + FfiConverterTypeChatMessage.read(buf) + } + } + + override fun allocationSize(value: List): ULong { + val sizeForLength = 4UL + val sizeForItems = value.map { FfiConverterTypeChatMessage.allocationSize(it) }.sum() + return sizeForLength + sizeForItems + } + + override fun write(value: List, buf: ByteBuffer) { + buf.putInt(value.size) + value.iterator().forEach { + FfiConverterTypeChatMessage.write(it, buf) + } + } +} + + + + +/** + * @suppress + */ +public object FfiConverterSequenceTypeScreen: FfiConverterRustBuffer> { + override fun read(buf: ByteBuffer): List { + val len = buf.getInt() + return List(len) { + FfiConverterTypeScreen.read(buf) + } + } + + override fun allocationSize(value: List): ULong { + val sizeForLength = 4UL + val sizeForItems = value.map { FfiConverterTypeScreen.allocationSize(it) }.sum() + return sizeForLength + sizeForItems + } + + override fun write(value: List, buf: ByteBuffer) { + buf.putInt(value.size) + value.iterator().forEach { + FfiConverterTypeScreen.write(it, buf) + } + } +} + diff --git a/native/android/app/src/main/java/cloud/opensecret/maple/ui/MainApp.kt b/native/android/app/src/main/java/cloud/opensecret/maple/ui/MainApp.kt new file mode 100644 index 00000000..6a55ae03 --- /dev/null +++ b/native/android/app/src/main/java/cloud/opensecret/maple/ui/MainApp.kt @@ -0,0 +1,679 @@ +package cloud.opensecret.maple.ui + +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.core.tween +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsPressedAsState +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.Send +import androidx.compose.material.icons.automirrored.filled.ExitToApp +import androidx.compose.material.icons.filled.Delete +import androidx.compose.material.icons.filled.Settings +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.scale +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import cloud.opensecret.maple.AppManager +import cloud.opensecret.maple.rust.AppAction +import cloud.opensecret.maple.rust.AuthState +import cloud.opensecret.maple.rust.ChatMessage +import cloud.opensecret.maple.rust.OAuthProvider +import cloud.opensecret.maple.rust.Screen +import cloud.opensecret.maple.ui.theme.* + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun MainApp(manager: AppManager) { + val state = manager.state + var showSplash by remember { mutableStateOf(true) } + var minTimePassed by remember { mutableStateOf(false) } + val currentScreen = state.router.defaultScreen + + LaunchedEffect(Unit) { + kotlinx.coroutines.delay(1000) + minTimePassed = true + } + + LaunchedEffect(minTimePassed, currentScreen) { + if (minTimePassed && currentScreen != Screen.LOADING) { + showSplash = false + } + } + + Box(modifier = Modifier.fillMaxSize()) { + when (state.router.defaultScreen) { + Screen.LOADING -> SplashScreen() + Screen.LOGIN -> LoginScreen(manager) + Screen.CHAT -> AgentChatScreen(manager) + } + + androidx.compose.animation.AnimatedVisibility( + visible = showSplash, + exit = androidx.compose.animation.fadeOut( + animationSpec = androidx.compose.animation.core.tween(400), + ), + ) { + SplashScreen() + } + } +} + +// -- Splash -- + +@Composable +fun SplashScreen() { + BoxWithConstraints( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center, + ) { + val w = constraints.maxWidth.toFloat() + val h = constraints.maxHeight.toFloat() + Box( + modifier = Modifier + .fillMaxSize() + .background( + brush = Brush.radialGradient( + colors = listOf( + androidx.compose.ui.graphics.Color(0xFFFF9771), + androidx.compose.ui.graphics.Color(0xFFCE9A8E), + androidx.compose.ui.graphics.Color(0xFF9C9DAB), + ), + center = androidx.compose.ui.geometry.Offset(w / 2f, h), + radius = h, + ), + ), + ) + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Icon( + painter = androidx.compose.ui.res.painterResource(id = cloud.opensecret.maple.R.drawable.maple_wordmark), + contentDescription = "Maple", + modifier = Modifier.height(40.dp), + tint = Pebble50, + ) + Spacer(modifier = Modifier.height(20.dp)) + Text( + "Privacy-first intelligence", + style = MaterialTheme.typography.bodyMedium.copy( + fontFamily = cloud.opensecret.maple.ui.theme.ArrayFamily, + ), + color = Pebble100.copy(alpha = 0.8f), + ) + } + } +} + +// -- Login -- + +@Composable +fun LoginScreen(manager: AppManager) { + val state = manager.state + var email by remember { mutableStateOf("") } + var password by remember { mutableStateOf("") } + var name by remember { mutableStateOf("") } + var isSignUp by remember { mutableStateOf(false) } + + val isLoading = state.auth is AuthState.LoggingIn || state.auth is AuthState.SigningUp + + val nameFocus = remember { FocusRequester() } + val emailFocus = remember { FocusRequester() } + val passwordFocus = remember { FocusRequester() } + + fun submitForm() { + if (isSignUp) { + manager.dispatch(AppAction.SignUpWithEmail(email = email, password = password, name = name)) + } else { + manager.dispatch(AppAction.LoginWithEmail(email = email, password = password)) + } + } + + BoxWithConstraints( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center, + ) { + val w = constraints.maxWidth.toFloat() + val h = constraints.maxHeight.toFloat() + Box( + modifier = Modifier + .fillMaxSize() + .background( + brush = Brush.radialGradient( + colors = listOf( + Maple500.copy(alpha = 0.08f), + Bark300.copy(alpha = 0.06f), + Pebble400.copy(alpha = 0.04f), + Neutral50, + ), + center = androidx.compose.ui.geometry.Offset(w / 2f, h * 0.6f), + radius = h * 0.8f, + ), + ), + ) + Column( + modifier = Modifier + .widthIn(max = 360.dp) + .padding(horizontal = 32.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(16.dp), + ) { + Icon( + painter = androidx.compose.ui.res.painterResource(id = cloud.opensecret.maple.R.drawable.maple_wordmark), + contentDescription = "Maple", + modifier = Modifier.height(28.dp), + tint = Neutral900, + ) + + if (isSignUp) { + OutlinedTextField( + value = name, + onValueChange = { name = it }, + label = { Text("Name") }, + modifier = Modifier.fillMaxWidth().focusRequester(nameFocus), + singleLine = true, + shape = RoundedCornerShape(12.dp), + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next), + keyboardActions = KeyboardActions(onNext = { emailFocus.requestFocus() }), + ) + } + + OutlinedTextField( + value = email, + onValueChange = { email = it }, + label = { Text("Email") }, + modifier = Modifier.fillMaxWidth().focusRequester(emailFocus), + singleLine = true, + shape = RoundedCornerShape(12.dp), + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next), + keyboardActions = KeyboardActions(onNext = { passwordFocus.requestFocus() }), + ) + + OutlinedTextField( + value = password, + onValueChange = { password = it }, + label = { Text("Password") }, + modifier = Modifier.fillMaxWidth().focusRequester(passwordFocus), + singleLine = true, + shape = RoundedCornerShape(12.dp), + visualTransformation = PasswordVisualTransformation(), + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Go), + keyboardActions = KeyboardActions(onGo = { submitForm() }), + ) + + val primaryInteractionSource = remember { MutableInteractionSource() } + val primaryPressed by primaryInteractionSource.collectIsPressedAsState() + val primaryScale by animateFloatAsState( + targetValue = if (primaryPressed) 0.95f else 1f, + animationSpec = tween(durationMillis = 200), + ) + + Button( + onClick = { submitForm() }, + modifier = Modifier.fillMaxWidth().height(48.dp).scale(primaryScale), + enabled = email.isNotEmpty() && password.isNotEmpty() && !isLoading, + interactionSource = primaryInteractionSource, + shape = RoundedCornerShape(999.dp), + colors = ButtonDefaults.buttonColors( + containerColor = Maple500, + contentColor = androidx.compose.ui.graphics.Color.White, + disabledContainerColor = Maple200, + disabledContentColor = androidx.compose.ui.graphics.Color.White, + ), + ) { + if (isLoading) { + CircularProgressIndicator( + modifier = Modifier.size(20.dp), + strokeWidth = 2.dp, + color = androidx.compose.ui.graphics.Color.White, + ) + } else { + Text( + if (isSignUp) "Sign Up" else "Sign In", + fontWeight = FontWeight.SemiBold, + ) + } + } + + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp), + ) { + HorizontalDivider(modifier = Modifier.weight(1f), color = Neutral200) + Text("or", style = MaterialTheme.typography.labelSmall, color = Pebble400) + HorizontalDivider(modifier = Modifier.weight(1f), color = Neutral200) + } + + Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { + GlassyOutlinedButton( + text = "Continue with GitHub", + onClick = { manager.dispatch(AppAction.InitiateOAuth(provider = OAuthProvider.GITHUB, inviteCode = null)) }, + enabled = !isLoading, + ) + GlassyOutlinedButton( + text = "Continue with Google", + onClick = { manager.dispatch(AppAction.InitiateOAuth(provider = OAuthProvider.GOOGLE, inviteCode = null)) }, + enabled = !isLoading, + ) + GlassyOutlinedButton( + text = "Continue with Apple", + onClick = { manager.dispatch(AppAction.InitiateOAuth(provider = OAuthProvider.APPLE, inviteCode = null)) }, + enabled = !isLoading, + ) + } + + TextButton(onClick = { isSignUp = !isSignUp }) { + Text( + if (isSignUp) "Already have an account? Sign In" else "Don't have an account? Sign Up", + color = Pebble500, + ) + } + + state.toast?.let { toast -> + Text(toast, color = MapleError, style = MaterialTheme.typography.bodySmall) + } + } + } +} + +@Composable +private fun GlassyOutlinedButton( + text: String, + onClick: () -> Unit, + enabled: Boolean = true, +) { + val interactionSource = remember { MutableInteractionSource() } + val isPressed by interactionSource.collectIsPressedAsState() + val scale by animateFloatAsState( + targetValue = if (isPressed) 0.95f else 1f, + animationSpec = tween(durationMillis = 200), + ) + + Button( + onClick = onClick, + modifier = Modifier.fillMaxWidth().height(44.dp).scale(scale), + enabled = enabled, + interactionSource = interactionSource, + shape = RoundedCornerShape(999.dp), + colors = ButtonDefaults.buttonColors( + containerColor = Pebble100.copy(alpha = 0.4f), + contentColor = Pebble700, + disabledContainerColor = Pebble100.copy(alpha = 0.2f), + disabledContentColor = Pebble400, + ), + elevation = ButtonDefaults.buttonElevation( + defaultElevation = 0.dp, + pressedElevation = 0.dp, + ), + ) { Text(text) } +} + +// -- Agent Chat -- + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun AgentChatScreen(manager: AppManager) { + val state = manager.state + var composeText by remember { mutableStateOf("") } + val listState = rememberLazyListState() + + // Refresh relative timestamps every 30s + LaunchedEffect(Unit) { + while (true) { + kotlinx.coroutines.delay(30_000) + manager.dispatch(AppAction.RefreshTimestamps) + } + } + + // Prefetch older messages when scrolled near top + val firstVisibleIndex by remember { derivedStateOf { listState.firstVisibleItemIndex } } + LaunchedEffect(firstVisibleIndex) { + // Account for load-more item at index 0; messages start at index 1 when it's visible + if (firstVisibleIndex <= 3 && state.hasOlderMessages && !state.isLoadingHistory) { + manager.dispatch(AppAction.LoadOlderMessages) + } + } + + // Auto-scroll to bottom (including typing indicator) when new content arrives + var prevMessageCount by remember { mutableIntStateOf(state.messages.size) } + LaunchedEffect(state.messages.size, state.messages.lastOrNull()?.content, state.isAgentTyping) { + val totalItems = listState.layoutInfo.totalItemsCount + if (totalItems > 0 && state.messages.size >= prevMessageCount) { + listState.animateScrollToItem(totalItems - 1) + } + prevMessageCount = state.messages.size + } + + BoxWithConstraints(modifier = Modifier.fillMaxSize()) { + val w = constraints.maxWidth.toFloat() + val h = constraints.maxHeight.toFloat() + + // Background mesh gradient + Box( + modifier = Modifier + .fillMaxSize() + .background( + brush = Brush.radialGradient( + colors = listOf( + Pebble100, + Maple50, + Bark50, + Neutral0, + ), + center = androidx.compose.ui.geometry.Offset(w * 0.3f, h * 0.4f), + radius = h * 0.9f, + ), + ), + ) + + // Messages list (full size, scrolls behind header and compose bar) + LazyColumn( + modifier = Modifier.fillMaxSize(), + state = listState, + contentPadding = PaddingValues( + start = 16.dp, end = 16.dp, + top = 64.dp, bottom = 104.dp, + ), + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + if (state.isLoadingHistory) { + item(key = "loading-history") { + Box(modifier = Modifier.fillMaxWidth().padding(vertical = 8.dp), contentAlignment = Alignment.Center) { + CircularProgressIndicator(modifier = Modifier.size(20.dp), strokeWidth = 2.dp) + } + } + } else if (state.hasOlderMessages) { + item(key = "load-more") { + Box(modifier = Modifier.fillMaxWidth().padding(vertical = 8.dp), contentAlignment = Alignment.Center) { + TextButton(onClick = { manager.dispatch(AppAction.LoadOlderMessages) }) { + Text("Load older messages", color = Maple500, style = MaterialTheme.typography.bodySmall) + } + } + } + } + + items(state.messages, key = { it.id }) { message -> + MessageBubble(message) + } + + if (state.isAgentTyping) { + item { + Text( + "Maple is typing...", + style = MaterialTheme.typography.bodySmall, + color = Pebble400, + modifier = Modifier.padding(start = 8.dp), + ) + } + } + } + + // Toast (above compose bar) + state.toast?.let { toast -> + Text( + toast, + color = MapleError, + style = MaterialTheme.typography.bodySmall, + modifier = Modifier + .align(Alignment.BottomCenter) + .padding(bottom = 80.dp, start = 16.dp, end = 16.dp), + ) + } + + // Floating header islands + Box( + modifier = Modifier + .fillMaxWidth() + .statusBarsPadding() + .padding(horizontal = 16.dp, vertical = 8.dp) + .align(Alignment.TopCenter), + ) { + // Wordmark pill (centered) + Box( + modifier = Modifier + .align(Alignment.Center) + .shadow(2.dp, RoundedCornerShape(999.dp)) + .background(Neutral0.copy(alpha = 0.7f), RoundedCornerShape(999.dp)) + .border(0.5.dp, Pebble200.copy(alpha = 0.3f), RoundedCornerShape(999.dp)) + .padding(horizontal = 20.dp, vertical = 10.dp), + ) { + Icon( + painter = androidx.compose.ui.res.painterResource(id = cloud.opensecret.maple.R.drawable.maple_wordmark), + contentDescription = "Maple", + modifier = Modifier.height(20.dp), + tint = Pebble700, + ) + } + + // Gear pill (end aligned) + Box( + modifier = Modifier + .align(Alignment.CenterEnd) + .size(40.dp) + .shadow(2.dp, RoundedCornerShape(999.dp)) + .background(Neutral0.copy(alpha = 0.7f), RoundedCornerShape(999.dp)) + .border(0.5.dp, Pebble200.copy(alpha = 0.3f), RoundedCornerShape(999.dp)), + contentAlignment = Alignment.Center, + ) { + IconButton( + onClick = { manager.dispatch(AppAction.ToggleSettings) }, + modifier = Modifier.size(40.dp), + ) { + Icon( + imageVector = Icons.Filled.Settings, + contentDescription = "Settings", + tint = Pebble500, + ) + } + } + } + + // Floating compose bar + Row( + modifier = Modifier + .align(Alignment.BottomCenter) + .fillMaxWidth() + .navigationBarsPadding() + .padding(horizontal = 16.dp, vertical = 8.dp) + .shadow(2.dp, RoundedCornerShape(999.dp)) + .background(Neutral0.copy(alpha = 0.7f), RoundedCornerShape(999.dp)) + .border(0.5.dp, Pebble200.copy(alpha = 0.3f), RoundedCornerShape(999.dp)) + .padding(horizontal = 12.dp, vertical = 6.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp), + ) { + val composeFocus = remember { FocusRequester() } + + OutlinedTextField( + value = composeText, + onValueChange = { composeText = it }, + placeholder = { Text("Message Maple...", color = Pebble400) }, + modifier = Modifier.weight(1f).focusRequester(composeFocus), + singleLine = true, + shape = RoundedCornerShape(999.dp), + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Send), + keyboardActions = KeyboardActions(onSend = { + val text = composeText.trim() + if (text.isNotEmpty() && !state.isAgentTyping) { + manager.dispatch(AppAction.SendMessage(content = text)) + composeText = "" + } + }), + ) + + IconButton( + onClick = { + val text = composeText.trim() + if (text.isNotEmpty()) { + manager.dispatch(AppAction.SendMessage(content = text)) + composeText = "" + } + }, + enabled = composeText.trim().isNotEmpty() && !state.isAgentTyping, + colors = IconButtonDefaults.iconButtonColors( + contentColor = Maple500, + disabledContentColor = Neutral300, + ), + ) { + Icon(Icons.AutoMirrored.Filled.Send, contentDescription = "Send") + } + } + } + + if (state.showSettings) { + SettingsSheet(manager = manager) + } + + if (state.confirmDeleteAgent) { + AlertDialog( + onDismissRequest = { manager.dispatch(AppAction.CancelDeleteAgent) }, + title = { Text("Delete Agent?") }, + text = { Text("This will permanently delete your agent conversation history. This cannot be undone.") }, + confirmButton = { + TextButton(onClick = { manager.dispatch(AppAction.ConfirmDeleteAgent) }) { + Text("Delete", color = MapleError) + } + }, + dismissButton = { + TextButton(onClick = { manager.dispatch(AppAction.CancelDeleteAgent) }) { + Text("Cancel") + } + }, + ) + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun SettingsSheet(manager: AppManager) { + val sheetState = rememberModalBottomSheetState() + + ModalBottomSheet( + onDismissRequest = { manager.dispatch(AppAction.ToggleSettings) }, + sheetState = sheetState, + ) { + Column(modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp)) { + Text( + "Settings", + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.padding(bottom = 16.dp), + ) + TextButton( + onClick = { manager.dispatch(AppAction.RequestDeleteAgent) }, + enabled = !manager.state.isDeletingAgent, + shape = RoundedCornerShape(999.dp), + ) { + Icon( + imageVector = Icons.Filled.Delete, + contentDescription = null, + tint = MapleError, + modifier = Modifier.padding(end = 8.dp), + ) + Text("Delete Agent", color = MapleError) + } + HorizontalDivider(modifier = Modifier.padding(vertical = 8.dp)) + TextButton( + onClick = { + manager.dispatch(AppAction.ToggleSettings) + manager.dispatch(AppAction.Logout) + }, + shape = RoundedCornerShape(999.dp), + ) { + Icon( + imageVector = Icons.AutoMirrored.Filled.ExitToApp, + contentDescription = null, + tint = Pebble500, + modifier = Modifier.padding(end = 8.dp), + ) + Text("Sign Out", color = Neutral800) + } + Spacer(modifier = Modifier.height(32.dp)) + } + } +} + +@Composable +fun MessageBubble(message: ChatMessage) { + val isUser = message.isUser + val alignment = if (isUser) Alignment.End else Alignment.Start + + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = alignment, + ) { + if (!isUser && message.showSender) { + Text( + "Maple", + style = MaterialTheme.typography.labelSmall, + color = Pebble400, + modifier = Modifier.padding(start = 8.dp, bottom = 2.dp), + ) + } + Box( + modifier = Modifier + .widthIn(max = 300.dp) + .then( + if (isUser) { + Modifier.background( + brush = Brush.verticalGradient( + colors = listOf(Maple400, Maple600), + ), + shape = RoundedCornerShape( + topStart = 16.dp, + topEnd = 16.dp, + bottomStart = 16.dp, + bottomEnd = 4.dp, + ), + ) + } else { + Modifier.background( + Pebble50, + RoundedCornerShape( + topStart = 16.dp, + topEnd = 16.dp, + bottomStart = 4.dp, + bottomEnd = 16.dp, + ), + ) + } + ) + .padding(horizontal = 12.dp, vertical = 8.dp), + ) { + Text( + text = message.content, + color = if (isUser) androidx.compose.ui.graphics.Color.White else Neutral800, + style = MaterialTheme.typography.bodyMedium, + ) + } + if (message.showTimestamp) { + Text( + text = message.timestampDisplay, + style = MaterialTheme.typography.labelSmall.copy(fontSize = 10.sp), + color = Pebble400, + modifier = Modifier.padding(start = 8.dp, end = 8.dp).padding(top = 2.dp), + ) + } + } +} diff --git a/native/android/app/src/main/java/cloud/opensecret/maple/ui/theme/Color.kt b/native/android/app/src/main/java/cloud/opensecret/maple/ui/theme/Color.kt new file mode 100644 index 00000000..51462f1f --- /dev/null +++ b/native/android/app/src/main/java/cloud/opensecret/maple/ui/theme/Color.kt @@ -0,0 +1,70 @@ +package cloud.opensecret.maple.ui.theme + +import androidx.compose.ui.graphics.Color + +// Maple (Primary) - "Primary brand energy" +val Maple50 = Color(0xFFFFF4F0) +val Maple100 = Color(0xFFFFE8E0) +val Maple200 = Color(0xFFFFD1C1) +val Maple300 = Color(0xFFFFBAA2) +val Maple400 = Color(0xFFFFA88A) +val Maple500 = Color(0xFFFF9771) +val Maple600 = Color(0xFFF67D57) +val Maple700 = Color(0xFFE8633D) +val Maple800 = Color(0xFFD04926) +val Maple900 = Color(0xFFA83515) + +// Pebble (Secondary) - "Ethereal balance" +val Pebble50 = Color(0xFFF7F7F9) +val Pebble100 = Color(0xFFE8E8ED) +val Pebble200 = Color(0xFFD1D2DC) +val Pebble300 = Color(0xFFBABCCB) +val Pebble400 = Color(0xFF9C9DAB) +val Pebble500 = Color(0xFF8A8B9A) +val Pebble600 = Color(0xFF757689) +val Pebble700 = Color(0xFF5E5F6E) +val Pebble800 = Color(0xFF474854) +val Pebble900 = Color(0xFF30313A) + +// Bark (Tertiary) - "Grounded structure" +val Bark50 = Color(0xFFF8F5F4) +val Bark100 = Color(0xFFEADED9) +val Bark200 = Color(0xFFD4BCAF) +val Bark300 = Color(0xFFC29A8D) +val Bark400 = Color(0xFFB0877C) +val Bark500 = Color(0xFF9E7469) +val Bark600 = Color(0xFF8A6055) +val Bark700 = Color(0xFF704D43) +val Bark800 = Color(0xFF583A32) +val Bark900 = Color(0xFF3D2821) + +// Grove (Tertiary) - "Organic calming" +val Grove50 = Color(0xFFF7F6F0) +val Grove100 = Color(0xFFE8E4D4) +val Grove200 = Color(0xFFD3CCB0) +val Grove300 = Color(0xFFBEB48C) +val Grove400 = Color(0xFFAEA375) +val Grove500 = Color(0xFF9E925E) +val Grove600 = Color(0xFF8A7F4C) +val Grove700 = Color(0xFF726B3C) +val Grove800 = Color(0xFF5A542D) +val Grove900 = Color(0xFF3F3B1F) + +// Neutral - "Focus and clarity" +val Neutral0 = Color(0xFFFAFAFA) +val Neutral50 = Color(0xFFF5F5F5) +val Neutral100 = Color(0xFFE5E5E5) +val Neutral200 = Color(0xFFD4D4D4) +val Neutral300 = Color(0xFFA3A3A3) +val Neutral400 = Color(0xFF737373) +val Neutral500 = Color(0xFF525252) +val Neutral600 = Color(0xFF404040) +val Neutral700 = Color(0xFF262626) +val Neutral800 = Color(0xFF171717) +val Neutral900 = Color(0xFF0A0A0A) + +// Semantic States +val MapleSuccess = Color(0xFF7B8F4A) +val MapleWarning = Color(0xFFD4A35A) +val MapleError = Color(0xFFD05E41) +val MapleInfo = Color(0xFF7E8DA1) diff --git a/native/android/app/src/main/java/cloud/opensecret/maple/ui/theme/Theme.kt b/native/android/app/src/main/java/cloud/opensecret/maple/ui/theme/Theme.kt new file mode 100644 index 00000000..0778080c --- /dev/null +++ b/native/android/app/src/main/java/cloud/opensecret/maple/ui/theme/Theme.kt @@ -0,0 +1,122 @@ +package cloud.opensecret.maple.ui.theme + +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Shapes +import androidx.compose.material3.Typography +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.Font +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import cloud.opensecret.maple.R + +private val MapleColorScheme = lightColorScheme( + primary = Maple500, + onPrimary = Color.White, + primaryContainer = Maple100, + onPrimaryContainer = Maple900, + secondary = Pebble500, + onSecondary = Color.White, + secondaryContainer = Pebble100, + onSecondaryContainer = Pebble900, + tertiary = Bark500, + onTertiary = Color.White, + tertiaryContainer = Bark100, + onTertiaryContainer = Bark900, + background = Neutral50, + onBackground = Neutral900, + surface = Neutral0, + onSurface = Neutral900, + surfaceVariant = Neutral100, + onSurfaceVariant = Neutral600, + outline = Neutral300, + outlineVariant = Neutral200, + error = MapleError, + onError = Color.White, + errorContainer = Maple50, + onErrorContainer = Maple900, +) + +private val MapleShapes = Shapes( + small = RoundedCornerShape(8.dp), + medium = RoundedCornerShape(12.dp), + large = RoundedCornerShape(16.dp), + extraLarge = RoundedCornerShape(24.dp), +) + +val ManropeFamily = FontFamily( + Font(R.font.manrope_regular, FontWeight.Normal), + Font(R.font.manrope_medium, FontWeight.Medium), + Font(R.font.manrope_semibold, FontWeight.SemiBold), + Font(R.font.manrope_bold, FontWeight.Bold), +) + +val ArrayFamily = FontFamily( + Font(R.font.array_bold, FontWeight.Bold), +) + +private val MapleTypography = Typography( + headlineLarge = TextStyle( + fontFamily = ManropeFamily, + fontWeight = FontWeight.SemiBold, + fontSize = 24.sp, + lineHeight = 32.sp, + ), + headlineMedium = TextStyle( + fontFamily = ManropeFamily, + fontWeight = FontWeight.Medium, + fontSize = 20.sp, + lineHeight = 28.sp, + ), + titleLarge = TextStyle( + fontFamily = ManropeFamily, + fontWeight = FontWeight.SemiBold, + fontSize = 20.sp, + lineHeight = 28.sp, + ), + titleMedium = TextStyle( + fontFamily = ManropeFamily, + fontWeight = FontWeight.Medium, + fontSize = 16.sp, + lineHeight = 24.sp, + ), + bodyLarge = TextStyle( + fontFamily = ManropeFamily, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + ), + bodyMedium = TextStyle( + fontFamily = ManropeFamily, + fontWeight = FontWeight.Normal, + fontSize = 14.sp, + lineHeight = 20.sp, + ), + labelLarge = TextStyle( + fontFamily = ManropeFamily, + fontWeight = FontWeight.Medium, + fontSize = 14.sp, + lineHeight = 20.sp, + ), + labelMedium = TextStyle( + fontFamily = ManropeFamily, + fontWeight = FontWeight.Medium, + fontSize = 12.sp, + lineHeight = 16.sp, + ), +) + +@Composable +fun AppTheme(content: @Composable () -> Unit) { + MaterialTheme( + colorScheme = MapleColorScheme, + shapes = MapleShapes, + typography = MapleTypography, + content = content, + ) +} diff --git a/native/android/app/src/main/res/drawable/maple_wordmark.xml b/native/android/app/src/main/res/drawable/maple_wordmark.xml new file mode 100644 index 00000000..5a1658be --- /dev/null +++ b/native/android/app/src/main/res/drawable/maple_wordmark.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/native/android/app/src/main/res/font/array_bold.ttf b/native/android/app/src/main/res/font/array_bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..85af9a9d416ea4c6eef8250aad040485e7fa3811 GIT binary patch literal 609948 zcmeFa4Y+M*Rp0y0we~)HN74o`8nj>zh@4!EBuX?<(L@Cj^+=+LCYDG-4W1}qqNGi% zXo5zAglni@p*97oxq^i&sMMo27_3xMp$*T|*m!U8CT-y%y_XtpjW^0i&Yf%h$M5Vh z#+>h-bMBAxA<2`o{&S4+ALD)JT=N~{ec!p(+NCL_oK$Wq^K$JAUwFy4{qpM`d$^qN zqMKUnQ_p|?3tsqyul<}il@reV>sEfl`4?Sy@jrag|G1}|@Rg^P@&(^@{>9(#aP0-+`CD>e@qx z+Llf@^AoLo{lF`JX*Irs#CB0Z@<{uKHdKNs;gVY-?{$@ zuWaL;)ymJj`jyw+@B{zmM}Dc5|E!cfZ+XQv-}}U0%xP{9IX_d;9N; z|HregzT%|k{Z)Cwp7UBw`S3aCeSz@B|MSyNdF;L?{O;-vEpNTdmL5x=)f*nWue|=m zr^;^nh12rC=4}g2^S1dX%8xGJsiXOzpyQ0t*u+^R=@CD^n20g1uptv z{l98~_<-}hhwh+Hw7-xS$9wKn++`oEkB6^;^HckZvuJ<8Y1_Vv^XHl@+fm<_eOYkm z+oFxb*HixL>;8>6ygw`Zo6~)t+Zgw7&I|qGeO*7R{rBmOnD9OBIZx+DKf&gaL+5ZU z+T-Q>vAhQD`>=Qq{J(|IQnu^Ewc=W@p4?s+oip#lVO+ewzCRo<+6?Wtu@^RCdtA0} zcKpEwkK<(@+87;N=qmpXx3f6sHrAr81$PK(cMzB7zc|;Sf4U!+_f~soWdkxELo3yTeZVwSJj? zF}{{#Y;hkg-YaWw(RTi~e1Cm^+IAP$tJN>Yn*D3XkB;vFOZoIu+J6tW|6U#cedhU5 zUfNsUQV;*ZMZXsJI(^O9wsW}ed)jeFPT+mxJeItcyQl|iuP9fY_*CVw#rU3G)*VYN z=Wtwnm$BOSr+v@vncv);z8GhVoUphKi}%t0qutbnsztt=%@>9!7^QIQRv7Fb|$65LD=IrKz=Es|# zoBh4n*|Yc0{(QbNKXLx#`DycCpTGBue(H<CbrjbDpv1 z8DI2_FMY-Z&v@CF{K=q+p*0O%QxpAq#$+WL&e!`A^ zvT0jh{MX#lyta8=b8Fc%`<$iRs+NY0m!^HU^dGoki%0UDmzDM%-c#1vxz!2fbIKFS ziRJHw zJIeoF-dTR5ysP|X`R($r%Dc<&l;14}%U$JPm-m!EXkJ-7#(@>2fZd)pcI4W)d^wWU1! zwWXYKM=4+4=7i_|btzx@XQiCo^3M54DPQ-&QoiZKrCiYZeB0|wd+|%TthK-79i_bN znWcPx%lVXvh3TOD5WU@13WR?2HHYL_Tim-0(@mGY*ym2&54rM&$U zrTpeEl=3?_m-3!_O8K`RFXi90{rLB-{ZHRm%KzE6{gDrr@;_SNN7{aV>Y1gPUsswZ zTwR(c{X%Iz{~e`y+Ivg$#cwIimp!jthU_iPSD##(um4bKp5Jo5d4FkM^pSR8K3JOX zXy^PFx7_c(xil|*N@>3DiS6KP?6}9d%dg-@L^WPAs#N+O^7)&nvU1e6Y-(dQq8u@tI}z%>89{+9%5F z^n1$e%U8p=W%kOyF0+5s`rLF`ncdvRzV#ht_VXu}*)QKwX20^h zGW+$G_nWQl_uF><@XRuM|3}K~KfJNb{wYv@WC?s=qt+XzqhgeVsDxKf7iD8 z|Fvb_&RpkDYLCD0DP{hQKP&Suy{OEe)8bdP`g5OJ=I1}J%rCsF%rAYg%)jR&Wq#HB z%KQ~AzUtj&{*P}i^Vhts%wOAbZ~I`G-`?`ybZ430c~hCc{pvFRtv1&0U0LSu-QO-p z&nxqL&MNZ{wA_1J`~8=d`Ty1WeDuLG|M(+i{z%LFbX#EOPbn*_&nqh@w#T2lx2$~O zd1dA4ZzwCLy}PWO(c;-3DJx(9zOwSdOUlZ(y}GP?=UHXt^4FG?@4c_A{J_m+<%ibG z%JnCfl^^?fS-JW7W#x6(m6bQNac(bV<)2?xR(|cKvho{kjDxM;-RG2*KR&Ol{QHZ_ z%6+ddEC2a}W#zxN+=tq@51(9C{_4T9^68J1)plLEdg2?}Nyq!j>eKEht6%czvifC@ zl+~}iuB?9D^UCTAo?lj9bWd6Rt`C>hD^D(~2VP%RUvWWMz4oHAdfkKVr2Ve4`eUyy ztFL)&S^epD^76VH%IeR)qpbduo671xZF&DIcp&tM|74e|lb7{XafbRv&ERfAsRQ`hS1CtUlbv|LYI88GXI%IpM6b=ZPnlJzwxh z+4J;E%ARMp6Ur~YuI%}m{bkQLe7x-WmRA2AZzy{%zp3oG>Jw$pD_h+U-&gkh=nZAh zO|9S0Tvhh8<7Ce-{%+ax&)!}3{OSc|&#%9_?0MJCWzX+iR`$H-p|av+v4Yau&jO2tIOK6+7$Ji zca^oTy1cA?{ncgd1=p3ei*71w?buzr;=!`^eIIWpV4o;!uWC6za%Wk)vDN+5C1vgP z*Os-PYh&Hs9>3|#vi7U*C~LodLs|QcHs)_VrL6t->&x1^KV8;-=Z>;=u#Nq@?eXum z|Niw`%G!I*D{FsnSy{Wgjq%>!Eo=X#<^R!DW$k?*E^Gg`)%|hn+oq_sf7f#VRW{gk(q z^{3rg)}MJ(S>M;{zVx)R{$=ZB{W%Yn^)v5j7lp0`IW27`kj}z|K3;D-~PO^{;%4YzrVk%zvr~F{)g*j{e5k$dp=m!?``#e z*2)jI^2gp=*8iX9m-WABeLitkS^t0ER@VRL)n)xJ+t`n^`oH?!vi|64W&N*PzfZoR zUC2JMtbgXUW&N=W%KD-8_TLBFxx(wq3C&&QgxSZ-3G+wF3GMhiVb9IwgtfPn6V|UR zC!Dai-A{VOVo#~fix)k1-|R!}`exqFGs@>a>FH1UlBYlE=@-pz`pk!#2Orz}*nNBM z{F}=!+OtwhJELg-Yu?b#q1W0u$SLhSV_!R$IJ=!MoZrp~E^X`nfpSf`zTDW>{oBgz z<;`uSe`j0I?=J5z_m=z11Lb4o;qquX)T}ipwYyr+c-C28^%b9g^5<7@#q{8w#6t!% z4?S43*Yx<&zag18HGa0k1J8f<)1LP1r*&T+JGeA7CoSQlj`f=5v0lwAp^el2FKY1X z;d&1>F2A?C;5xRBR1Mv(&u>;wIhL*4O;egZO0`J(%0idi>!b!voR7 zLqCMNMQ2~Tytn=RYWMbI7k4bWd;G9#?q8C6hSz6qU0TABQ!BwoDvhI0|B-8P_U5HP zXEg9bJI$+>3=LXE@LjY1_l#6?G=g;}O4ZS-vDtmCjn*zxn&XAvmbvFGYTf*y-5cxe zPQ*3M_05g#3ih_<_U6saTbp+_2b;T__c!-8_csr;%~$Fl_jtbdYjW1(pOG1*5 za*anE5FTv`=W`8qr5ufD%S;k%bOwtCyIyUS+sHQf z%s!V-Y?%9OVNOaxCio0uE*8duiePC?uAg~$*^aWK(JZJ=$b6Kqj7@$MLv$rEy;}ZM zQ1#kE%WnNOi%-MmX$@F&ToQHFu5GWan)+%ftER7|zO5y|&An=UsOgV|zAe(~i%L0k z&itWve|-nm5qm6WqBiK+|63vDQ#>>(Ei zl`_9Vh5{lXM6~m%=XXUmyJd2dVwMl@VcBI^+3!}UK6(4&BbmH?TVwh#hO>Do^DT~Nj%jxcXKSr@`{~&HtL z#cutqqql|_Q|D&a&u*OEGP`Yd`|QoLx6a-G#>PSzu5dzRsi#qIjj zPAyJN&-K6#5-%fms~{_9ENjE3KD7i}tcBH;)yYrYzGPS#GNQRD!5dM6tyJRHONeVN z`(hfFg48|LD{~D_pT0s}5<`LLtGF;%6Ru5IcyTet_t~%pcNY&+)Ph z58P@y*>AVo$?XBv_HLva13RR)>MDkXDh@ zqS@tX7KLVMtQDzTjm@;dugev|I-&?_!Ah0I7R{=mEuqa-D_ojAxU7Z>6wb&3+1#o( ztmZ6Q3RAuHa4Zzw@W70^u6C`(&@*eX?@HL)Ai7RFl=IL_os(WIrh!fMLKsze#k5|H zs_;`Q#u)yQNmWYv>iCga4xzAz8YjD6eM6x)A&76h>K7X9w&7!h6YyQoanHocldPX=LZM_1 zTlC|L!EPjxF|8kK?W)hUUbSiIXy?V+XHgl4Amf#Bi5|obq6g7~=)qdtY==i25FT>I zA-}Eq)6P(Qc(hYP;(+*pH9dBpB)aKA){vAm%th@Ee`&gb!aA%ck@O@kWfk8)9UFD? z9(cE&*cPewG*V{YO&wd#)Vi=IY>!Hz9?y!)}7EwTI-#T2B*p`*z=+F&bZn{qY!I zaoTTdmi8A6_O{rL3F4f|(dFGR9w{ZoT?O?+v%>(8UhK zgnO@gxA885yxYjUn^{H=V$X;@Bkg2;wJhuHvBK}OgFp7Sg&cgD^j01B+<49D?nbD+ zIaBri&D`9#%_~oC_m@teUDp0q!kFB0cwZ@B$t-ild55x$zJ@toP4-v0Iy7zGa{saj z>piNy`gq;r=8?+VwfSZCRvp*gBF`-CxA)usMvcAB`@(hQx^exHGj7+eYo&KU*H*_p z_q?dn4ZAW{!UaF)Xno$eeVZ$vA?AJL{Xx#i`w0&@W6fUE*V-X2_U-x;Cu4308O(fS z>>&LE;eqgwGhzp`-JUP$-d4WRFz8u4ZgqTwA>)UdFG^lN*+JROcVFS8(Xl^8&-WR? z8tyrFvAWr}8(W;oE5}-9eO#|pwaOxRlRYwG&xk*m{gAUC zdNBLL#}3wb@WIT>GQ1oYeT`q!$E4#^MaTeEL&z~2|32IK>|g=4RogRBl%MzT@ytOg zh0?KRq&;RI$r7!au+q>C6;39&C{|A+Tg-A}#&V5wwDdl=_~TlCJjWj|QqR{eUUu{M zQa1mdZ`*if_Q|-);|V$2(Pw15f%t*wLG(EedU#v469*&?@=$zu_<{IgugUN;!Ut<{ z(Blt3%Qi#u3Br%_FuPGU=%zMlY$|1QK%dksGg#{ErY&Wp(3CJnUeNhaQ9v(yxr!j(-jD z#}BOWvmSq&DcPu3I`B!sYb+fq+xS#wvnnMhTYy?b)|dK1q0dd0fk;jws5w8cvjAN~ z$l>znW=r2-*XmEsGgH^JHWtB5{_K5}a3$p7&0ROUOvhP<_4#W|zN>L+dd1(|>igi2 z$9uKEa^3#7vj5ol{@nE3%NS;ClLOFa86KGJS%xAo|S5jvj=MJ$%9k(g8{Tnpxf5*yPJ^pTF+p+ZQi_AbKKpw)(C!=IPc-TRBH5tE*@Imav zt08=_=9l%z8EJ=jAiSC#9`?*fKNWM_A(?hT+QV;1ALpSVzmkCM0}iSk@#721u0{+M z#OA?DnLf>iy>F`lJ~R3xEkDH#O=Jqm^6N3E37^k>3h&1AIa0@VN|PtxQyl;u zI*NbGB7ZKp@AuaI@6fjWwb?XdkTJ%X&4@i?_QziH&-@xM$3f0WJTTjbWc)z*Lo)q_ zkDUFmqt95gqt8e?S)b*xJpAYv@>GBPh=V_fJtKAydzgY+0{0nD$&n1L3A<%AWlWoh znojiKB$`zdS=4~FX0fHSIcePMRs?0^xNl;O+euiYP(b8mVXZ5EXWYo@SC|nigVSEO zYRPWXYhR7*QuLjkv3aOqllNQQZ_ODaPVeo+%%+Azv5j7K8gVHT-ZcL#^7L*vBI6)cDyxB#(`g zdBo+svWya%6Ior__4;dc%nwib6@$A-7Ipn3!*Em*Dzm@i#Laf2q%8DHmrQ|otk#1^0(8Ld}}S% z^qYJ6{&bHwk12k6%3{6O{ya?b?$SW+yw={$n*Onaoe-PfOtnCzJWap< zHH1a2p9OS1{O#whWAxRZ!}4{ldnaryrEMopd++US|J~DmS9W^M+{lN^zir>fNuLDZ zy&j9)Yg767&C=c}_t+5P4=>B;YY0Eijr~odWaTwFwv8Qc=u$2DS#%XbfA8v8^IxyG zn_Uh)cYfEy23a+O`rFqZ*KR@2@yFG2?n(Z5Y6I=PxC1#g|28h~f9?JpvS&Z|;E;VR zFUR5j%>Mqi8_J0)T3-`}xf#m{TXZu1e_ zl`!3{Zu?#;_D1Y+iNL3I(foL_YT)yIbtuW(zjkBm9DE2J_tXtJPuSj{n!T0z$9Qed zsad`LqdT>*eDPvkxq9-k@qMcJ8O@Eq?d_j6$G>^noxKf>jUhW@4IXkHW61Do2oJ3B zYI@qQ*=u^*1BZCnYy7OwGX7ibFa9;GwU_y|_Om}c^k9xRq{mLYj5!{5{4&C~zidU0 ztv;C5_oQkGHEfspL~Pmcz%r@x7*?@N5<_{$w$v@F+8({t7fb13r#tStTOF}KJ-YJq z%QmfNzTsWyG1h}|IW!@uWHQtVP`0v_pnauS;?pZ=u3@X(2P0W+;?+p zH~v)q_#*7vn%c@#zHe)44{L4J^xd|+W{lTjDR9B!~}eeGu7klf`UQYc9>SQYWj>DUZ%6xZrcw+kVNTDNK;K@qK67rRwk;D&4IvfXtLNR1|$TsSLv9~2W$40Gq(5NRBj-5C_#wjwYkKS;JPSn_5a`??^FimNYkR=T{iRTvg$-4(9Lp@MmTTeBWmmLQAbD_khHR+hZK zj&(6~3RcR)D%3u(78hT(@b%HcD%4-|7)^hH+B*_i>o#NCwNbai2CYK(oUR$PxK#rd zrEiD0?}UA??NW?dM*52j1SdU3%J9btHlsT(a$tO{IqqR`CVb9fZ=!!R+fjz`4 zmPIer94iUl$zp18sEcJKA+#21qm?78*OVjw(9fU8lrnK-5>%~~-PZebs^eOVU1nD^ z#&@yIx@_^X@~-3WxnA4t^m#1CHdq_`s<004VwYZs|<6sA~J$_A-M`7JmZyDFuD$A-C zLAlrhsJi$ROZDAgFvs(_fUr@FdVN4nFz5Q(C`*Yvg6_!^yZ&AmO+}{Lh-rT&kd1rI5 zxx0CPb8mD1#_wWw>oR#SBYBbh3Zl=L?Z_Evr=}mW=XR0t18aKP%{=&E=4C!I2p>cb zW_^}v7sL-4K619BhnEpMA4yQX@rliHm<&pPdZkz>)!7O{rk)MNZW8qxpNGAkHdIK$ z-k$np&H4_j3)0vkhnk?Sil8QYqSX50_1$CZn>A=*A6_olbV6Z2kL|zi#6e^WGkGI! zr&4h(PEFrUiCasIwfIx@JJp|3+P_zPbaM2@GbzR>$QaLvJ&$pC*fVB+ma{)HIKB~l7EE4cGf=a`se|@a+h9} zDttDxnWj%|o~mZIl2gf}w=Vmlm?6pc^rc!#x*s1<$Cx`SDJr5YI`*d}&ExrT`F=d@ z*;DgljbF-lEb`s)vbWTBb(_xs7^@i>^NeZa%tOWwW<7DT9vM4GoEqYn5k7k4v6%hn zPYrWic<6}-q6cew?8M7F^dS5iW?q)FAMJtJp8erj()Ot;CO4ZcYi4L{;9Eb zetlr+DNElDm-e8-u9#0zggZzWc6y~gsWH$Pm*QH83O zlxve&ub=8$-amY@d z%sAwS9jvvBJ;#TSKJ&2G5PrrS4?A(TYR`UIrk#wmoAp`FyqcW#ISz8}AATUbv4|gt zUzW2Tdq#NlGoz*Sp3p6 zVnwuu%_O>N6HkiNL2t3D70PuepahkxRbuOeilK#wHP+@BR*`+XJ(tfKn?Ih~uJ`rF zM=Q?Mc6Xb!(AcxitZ?xD%Q3zvT5rdexFYEEfRZT2;1G-o&GcJ~c)ZbZ&G5qT(g zW`AT5e~`G?!K_EF`C-Su#>1ZZ$k`7)s4;EJf$sSCLte+0Ub+T3ORv-?4XY=umz2_c zLtdlfko`oJL0PKD>`DH(+SzLQstt$ZU0=>TbjP7{c4G`S=QkHNmo`^42byb|>zf-l z#w7O`_h?4!8Hes!;$$9ruof3Tcp0;uIPj1`^w|$Rh#kZ~W47ZDFWb?>(_r!AO5@Sb zxBU36j*{wl>qfE|)kI{;W#_Q`4Az*X?-yU6pPw zVyu9SB@jKxn8FTXuVIZ>(-Q}KM(kj=(@zk4mhlH`JoK4|oDn|lf#@?o%kVPR;$%HC znB&l1wjGY^8Dhpdt56VU8dJO?sa@! zjdq!S_F}Dmr2pn%bFgjHo^F#NGm;_EBZKJ4oLP@NWUukigF|t$9T_AJSnEG_5PuNA zjM%~Kk6c6ihOqivSD8r3M>$lQ>Z-z0cz2_~=QK-{UZvw;P#Zk~EhX9$RNt+hYUCTS zI#E4aYksIqg^;%{E2Fts>POPHaWz}lGV8IX_xZ1TTbmNUN=7r)HUGCXj| z4i8j4;9;D;^lTeowmvY)=Kt}LpRF)#*=CZ8nk@><+tv%Jaq*F(Ia^_jtywV&pH5nN z)UD^NSH7xQw|!}~CZsaE#k6{A%20!iVTIMsAk^Pb#ckZ7g6E?%Cg(WUdRyg~ObY1U5>>@u3GW+QfT-Q}ox8reQkrjD3Nf}NA1@xe1aFt&Fu z^uaDjxGSs;F1~usJEFTU+>tsPE}wlOZQt^I#S1HO>(i&6yCj4Yu@LdPSaR3kV7D)XB z(St+&nOBPguV$wmcp0&0fAsLP9sN`!E;tky9_=9Ghm0LPaz^+d_AC#@!EY?)c)7iy zIPi&sj2|)x4?Bn*tm(7e&t&{Dwf>}KY4fuH*6sSvlJ~Ll#zwhj6MllxJMB~KSiBY0 zCR=fbz{j&r2DZY*`GL))tbeh($4)DhZzIl9!q&4jA|K6CtSg$Ns4H;>8+^pJ7SyPn zl3Z=t5-$K#ynV}e#^S{(P1r5BAZp7dM_dVQy2OYgssrj%=ySL>p$~G@t4-a!O2^jG z$#b8r)vK*}?bIx3JFV~Rykk2(*_!WEuc`cU$zl$2JUypxyPJL=iChknn~}-kAa*e8 zkuwqx#Gd2S>@{BI6E|b#A%mHZT(jr?z|Z=cKm3}VI8*KT5g*KPGB3;cWj%4wXUz5- zC-bp`RtG`}(js2D+ZOa%L|fI8MMc31t5jArj20@AYKzq%b5$i$3r1EPz1p%{cKO?K z+rrpf!IWZ{lLXagE5>v>N>RYR2J zTiq1QE{%LbXf_=5?ucL)MXgHZU%lSuUuxNth^vXh-ktjAu%%+GT6%XVZCKK(%+vcns~92XfJ>p#TD4iXoc z^T~47;|F5TXo*(oFjPOO^lI7GSlZP#&rld7_*Y}8EXY7^-?z-|7TS_~*kZQsC?k`L zmE*1G$P{>L!?M2>KJ8`85(=YvnlAPMN!2-AAYY2D|1pwH0D3N=S*+xUpm0`${gv{^ z>V2SE)3W&236*MV)y8Mjq8~!yWF(FiGt&COWlggztvYF0TBXW_khw##@G0L|W>)}J3@e7791D=`b^4-V zB~f9#A*|fILDkdR^0iFIwx0Bb$JaCSvy))^TdU5vFRXUt%Om|yEiWWBc;8YA7s6_G zoJ{z>gvG3`ls^Y)tPb17lg=FNda(h0tGe*!B`8pwlK6A?SJCRa?^^e`+dp%gP|9n? z#TU5EkEcd>oWJ??>{`cPu`$dVr!B+wcgv2$-_oDGe|GQ2Jc7JSzD2GfJn}j+xK%&m zfjJI(+NoiUhn~3jXSt?_2f_o<(+>KK@X*)fAw71Gcr~P7nUB7PIUYRp$Y9nZ4XVK(4vPpwXP&gREcBOGgde|A&*Cf{SQl^!Q~NJy^37Z-|E-Bp&|A*^WLVJTTjd ziyaxv{4B!*i8I854-Y>u>$7aNQl&;&P{$zwD|2h@=teXmknbWXTan)Vk#=Ms0ct+<%0zYNytla{O6 zo@=6L;iPmTvG4MiWkQYGy_`BG@)*w4+&?DfPH}uqo7&G(zUFAwif&EFIe;88ggK|= zILJ9p_CwByUoFm%ermj-_J~Kj$oL^=J9>B^dJsLB^~gDXToLSZyJSAyD4lqX5)hx1 zIpF*(g?Sgtp?*yum7<6mKFuLj$hyYTPOaR1{B-Gavhq z-;li)H^(31VFz=&=yTkfjJ}4%9~&1wnB$@cu@ip?;e$QXLS?h?NkpmiTAg9qblr1x ztb`fA;OaB2ZI6g-yDXNet$-+k>B6(F-bu0|8PEC~>c=KtYRZ-`eZETSDmUR;*!k6Pys0vNHO&33@v?rXAMl9} zW<7F7;)B?89PAm#@|5{3U4CGhCoM_$C2l3MFq`k$aIyft)EFyMvN; zJfUKY$xlZ?XOtm_dRzW8~J@Vek-Xxy~_8`$VnhM2$>uNW;?tZ;#adz z)z{*U?N`me){n7q;pO<~iH{x3dStN18>^@N%qKnwuO`?0vp&nj1G60>t|!od^2d z4l?$kb~6u|;;6?Gss&aQ!;)n6#mfrmR}&)J56M{Jv)XC(EPQm)J|XzYdzXQ%C|aqB z@HfA@q|i0hX0>e1gw>-(wBJ0kHBP9&w#jJ~*g9utWMx$K&#EMAH|;eVL#M0S8!DuA z#$Ot1LS(xNb~@69@8sL5>0yiyV;9NSW;-u7UO%wBQej~l-a|z*cIaq$Z{pi#7rEY3 zeRRbl*pl0>yIm}skHq&?Jqwr9pPHSmy4*L%va4F(vYs$M@$0J1>#S$`icPQvqXM98*2bRKHU4q8{&MFjPg|<3xmY#R0$48zv z%b8r3r>5Iuhd;h2aez9iK0b z7IRFyHO@}yOZkRn&b#?o*mK>;f{Z>!S4~ErF^|$L6L&1)4?nk;^~m^v_#xLY`yDJeJ#hQ?Xx4#in z%XDLAkw@Nl^A`Qp@W)&8D&@SzZ*|NrTY1+`|Bd6Re_N!Rxf$6t%p;!6fWC%9@v!4x zi<^1K8Sx*|(;mF+m+kPf9yw#?6F>86di*oOujz@89e&m;9c})qBt!nu4uF!KPd_^D zM)H%)kRp}zyXJ0)ki(TUdvbA)!3X!rR!!7;FMUY;q2u09QGJ)g7LN=T%J(Ludj(n9 zuPd_Y>zI^N<9xR1r>5$~KEk1M<_{hDyu6Wz^El1p6+7b^JBS`c58{suWNy1&^jgh{pKZBpr_T3So_pr8#+b{<7#-rn1BsLU zkTb8wM-So$q6g7$wVfgVA$#rzeDolC5Pj}9_KZ{cexQe~N}rQ_2C9;LBstiWOR2FZ z`-TMO+taZEc9W?zQ{q)UdJO8VKV#p6nm%ml`YYj`2T0XCJ9Q4VQ+eumk2CeUmCrAw zd1StK;(qSo&!sXJ8G~7741?Ig><15o2WCC~S)XMa!n#fUSPR3}23U6#>Xzmqh<{uy zZrEp3$hZ%=Z~25qD<_px%Bf{vIivmS+UJ(@%Z26A zaz!~%t|`}-8_O-_wsL!E|5j^$AGrQCs895TY9a%P5$k!9hVc!Rr8x?cWttMEKj!2kq=$p{Qe*h`DuXEu2uJqs4=Srp>~04 z`o;aNXH^f)_l~~5-&)>T4wk#i`^&xM{_;TiSb4ZSS`Ia9%}LEE&8f}4=8Wd-=G>|K zowK#>N}D@BW9>?3UY2>MY6zeB@Q^|D@M|*qj5WWS9)Ilg1FYHMPsOoubGx;6;1RdR z!>*B%KHe0bxcjkTg=gQge2}*STh*pJ!b1HSn8V52Ji4KzvEpdl@Vk2oZ=dj%U=u%| z7i0*Pn9o*)Xm*+wAwG7~wdsizKGJ19u?W`jp50JWnQ!=f`0TEUdAyd0YFXRsYrZwT z_w~n9`CIcnGOeg@*^RSXX1D3@mbM+XYD;d&NRG(* zEZ2DGYe=ricJv_aW!`Sfv_I5Nt$+9r*@+JiKlE8fU&E<<+8v6QOOfbp#aAZ> zqq`jKd0(yPIzjc4(EI%4LMC;{8n8FhPI~@Or7+gY!c@I4O5NjHv@Wxz*-nJ1zPruW zIZkb*du7H)Sd`=C=bqc|_8jqbRkyN|;mC{`v6K0*BWHV-GatVp9P+~s(k@7RWO(R7 z?8x9)KD-*{c)30NvK~JWUQe=AN>XOit8!3Sj#%=MCG56Y9#<4gX(aHFNvTOncWQ|u zpcHC3QYN1%l@3GJ7l~~CsbvZkjiuegOP#f&qGt(JJWJC4^!>3_ANgAcE?$OI{?(CX{y$Tn!ekU&EwbjUO%R-c1N`R@Az7a%-%UWSkIby)FNkO z6lXo78iWUCefF>M&}YPdNMCC=`(-)D&v7yzd&U|MJ?)J3gNHwIM(iMV+Cx8tnNJ)r z`@_%ntj9hU!}lbW11;?xTxLQE{x#GIc_Vb=jn4cl&Ce zTCl1U0)?_ZzaZ-6yb`9pjRt-7S3G#ACUC5rH^bbA6WKE zf_Je#h4?xjJ8iqBaW!TquG0#>YQfkRLh%Or?mH!_fBh_7os218Q_J0U_&epRI8)C~ zUghxb{~hslO7s5a-sb-1f#ze)!_A}3q1oE(q>U;}RwRpN89hk0LVBJ%ehu_e5SMrtctW+QS*wb*SNs&7Aqohp{Qvg#IF@7XwPnxIf_Y@()!gXn8G6es%;H~S&i`1oanj~*E$E(i}9tm%mZ!p~UqhgY)` zH=`vF8{~f6>sZ-AgWo2v)$}D+H%-}cz-N#!5AJ$|rz$byhUeNnk^L!zX|xO>!TFO@ zuJqnL4&GdiK|Ui+{BA?dR~??*<)>z4pF2Z2kH7MrLGW){qg) z$VARK)gL}_h@bV?LG19+4`Gdup14DCYW7+j;$qMKH9LIlV9mc~&vEdFpAkMh5dB!h zkNEi6JkX~qe;l$mn;4oeTWa;`Se_xxhNK#@u^i2AQ{KQfvS#tMKSq9Fxm6SY#zg44IvD2ZifVf`p(?2l;d1#aW86>$>}u)JxxEj*u7pL3 z4<-^{s{mz2qk_=PmSLwj-1GK=?I;hd+pZEY|#J7dx2a*7TW2yo{MQRwmBa z_A@WbW7~z7{pk<(EThkU=)syDJs6U*PoX|**7V|#m{njr*B|$+q0G@r0g@iBM@hZ3 z5LVZG=}Z9!QCo~5XOTA{T_Rwl#4^@Ga_o4oXiv~Z== zGpo`(2$6GCnq=KkjL>)Mg-*eGW>v4Rk?=t?i)vR>biG!WWwm5HRqxA7_qZ0V%dBa( z7GbK_@y=hA%hMJw%^P;UW^PnCGEGJ@TMfx%H9PuR+?syKZ>Q}!9_N+&m-T)``eUUW zpIXE4?;7Nw?4dwDb$X3_yUgwAy>H0OAthRFoBCnVkLuhyueG6htm(^_AG+hvIlD3b zy5Bk5{)ps`<&Nf#MF!!4S&y9kGanxMjQD3g@{pbQAbw!YAAZe_KfH{7H2dS)$QDNf z$%?!LjpOck^<&x`Jk>k<_H`TvsW(>*imj+}=o#BGh*XUvvwxjD7dhTjLM=sUu2Zuv z%J?OVm*eU4hQk?Y>K4?iPz5Ib?eY=;MCJANQ`pZ@&uKmrrhr^WbZe`HsZRI;;`p3i(b zw&j^EeM7sp(DXiPvTvO%mYVEo%&LShCC0MlWN6v<-@C-UYjs9kKAWOdu5@~}z}Dwb zt!%05^bkqe_wI>b0mI4VDY`3+1<1E&+eVwKYL*IvDw43M`wrTYx9%lr_4{C?;AhU zW>jqz8Fd*MeOXUC=(CJIBfO08a(nQwXBmAB;e$Coe%Na=`Wj|`c(wMhgJXHMc8CLx z<-rH1_9M50f7TNpJ-n<(&WInF?Mk}cSDV0htA-MHS1*k{aN@76`suGdjIlrTsxYPt z#lTwTgByB0)@{!wv#JF4M_v`j{&Z_-!9MsAKj9LJjLM6`S;@3t98lX9Rf1V8fKB%8 zZ{6CQS@EowcAmP-HjTIQv?~@KRdETPyL`ZAlDX-$Vw0

$5K6i(%cc6Suz6=B-P< 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 literal 0 HcmV?d00001 diff --git a/native/android/app/src/main/res/font/manrope_bold.ttf b/native/android/app/src/main/res/font/manrope_bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..62a618393905652a9696e015386f431b21a1a50b GIT binary patch literal 96800 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�Sq=K;W>my*Ny_rw9I(*8$zllSC8jm)m^F|t&Xjx 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

4Cz**@6c)hqyhN69DH65 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 M*<$A3PvX)24TIUt#{d8T literal 0 HcmV?d00001 diff --git a/native/android/app/src/main/res/font/manrope_medium.ttf b/native/android/app/src/main/res/font/manrope_medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c6d28def6d565eaa53a76eb39d3fa9d9e908709a GIT binary patch literal 96904 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 So@LBn6aeac|8FK#Cj$T&UW(lS literal 0 HcmV?d00001 diff --git a/native/android/app/src/main/res/font/manrope_regular.ttf b/native/android/app/src/main/res/font/manrope_regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9a108f1cee9d7b9f52e9427d4a9105db838566ac GIT binary patch literal 96832 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 QI<01StVU#a{}Zq6A7-l(L;wH) literal 0 HcmV?d00001 diff --git a/native/android/app/src/main/res/font/manrope_semibold.ttf b/native/android/app/src/main/res/font/manrope_semibold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..46a13d61989936eaba29502ec364048f246ec2e1 GIT binary patch literal 96936 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 z z?1W*dCW@v(x)X=#ROi;%AU*Kw)RxpcrkP6h9AzD?{QItIe5W>01I^HGpeuE7d^PWr zdpNi|JGCI{l@B`iNZktRk(f2ubv5mv6gm6IdfB;`I@HC#J+v?eX&_P$r2%@jK^nBT zs-*$_h~1d=%|8Oi4)qc<2`1Vz5D3f zYHpCu`_VM;uKHM?^o};v4$((iVVTvBRN^GB+=0XBHJG!VP(N$l1sXuqO_s$n|864< zjBeA7;`vzc#Raark%@Q(_!aJp&+}zk&ws-~)*-9`&y_5s( z+|+o@WF9hWpa{bY)=bFD(%~?#?F((&1Jc|Wjz`F#;hH=lTT*-od zqih!(N||tIq3uXZ>A13-#Kauwu(D?1D94*tzCL&E>y@TF*Ua<%HYX-+>L=p>1Bepv z#~B9TX96tnyR%F>LmlDQ!dW80vIgS9f2Cy+xVndnO1yWY;CxF z0cMHANninx@o82|Z?&jgWDPfkLO8?(`W)HbS5_lC1lhZgi=So&=Y2p2&4XmXQ%=Bd z7D_W0Rv|WWTz0U1k6vbddUAVaU2Dr)L(i)IRv7m&G3h_-K6!C`byLQ&-w3TItuDg& z`*4M~BC{`Foj-ebsnk#C7f>2<%hcZ$2jDwcwy-{mJrk=b6mV?+1E zJUo(ddVO+gbYAI}R=de{Nee@YA|mHTr=+`Zl)Frbe0D)W*^Kxt`D=Xgch8vdjIYbV zCF`%wR&&b(=qqqT4)hM|7Z5-G0UR%nhp6Acv*q#Bblywi?FWibcy<7C13rlqfe2qG zAC>xidQ#Zok*XFO5f7`EYn_v#o-=sTLQk-MwA+Q%O4F7b*o&RoV6~{#eDEXVi*djQ z;tc!|S~E5>m0Dv}#i4H&ezh$$o$#t^dQ$jPwTx5%(?czjY}%m0Av>c=Lgt4Nb8r7n z))T0L{S2@|el`cerG(xpVQ--+=k6EjrR-~EX9=_MY>Voi%(UMiD|7$J8()xFjw;Wp zAV#X63ZS#Mk}lu~9Q3>?i)MU=e`96cF&!seb#23Ux5 z4}qK2@)a$r!LkNyyVXUS1yG+F-kGCm1N`dn9dL*Hz{~8!A2~bmhtMYM=m+<-nufD6VTD`7DC~^$Hzz=j@j3{T!n6%U?l+}wu%pA(6h7Kf7Z?LPI8H(5 z&Ux?Pv}p(5oAWVz$jHDCQ&&&&@R+okcuZZD=INQXYU)*s;hXQ(@BU_Mh{f#L79m@| z*B#F@rV9 z2|Eug&)mwehQUYf6SuH;7rt^U=SKfAD`zY|?P`CW){gQCuKW8C*(IDz*|{JxacDXH z4M+)N+3qPj3+;hkJT^cHZ{v@j8UID=$rk!;%l?};fxB(_tF1u-3?v(S`5WT%IMdW` z)V7c>TFB?u;9(c!0R9%V4m{uPsh9>&%TQ*G4FIWYhLwKQZ^<{*l8gu5(z`crUKHja zxQ-SOzrM1JuJ}Qnj9S5{g&Wo)7~Q`wzVR^oK61te;0&aXbRs9f>U1V2Tjf|J2ZJb1 z$_*{J#@Un~N=`adVI!__7Cu%H@lHA*a$VTFn*UfuiC%s z5dqiT$YQP@?#RiEpQKf&$1uQB0lRoSMft3q)eyt<0?eiJ7eNv%1pJ6m4AgMJh#Rb)a5@)?G-p3wBPlj6 zR{)l*stnsR4QDWZdsDcvpU?*4(b7s10 z3)k(YzrWMJ?paFXlSgk)Y_55KKBdp?u=|N{uL;k6aZNZ0yUC0ip!0Lt%nrkm6L*&> z1_52d*+?2e^xm7@j{!PS_z^jqLwz|J^cNS*xnNEc5W#HEhFpOWCAwXB&wbRp3tqkr z5@76#nTt=l*7W|A6)+CyY-2Q^>;UK68~<>teZBBcx7zN z%&ME_MZBiLI;q+XN5T^zZ^X-{QOSwm6V-V7c98CW8%ae_;+Ut zXiiDc<8^?ZbmA-M0ZN#(toT24TuGdWwTqb&BC;rq8I$<&>#hkiQqP=8YCtBXQEe~% zN`_x2(}eBX%t~d(_76_te3o$!vuRb}3fi}0TFZFg4ET?~2e6gWoCaDTv5jEcm>d)% zO{Nms1ZKN;1I^!ve7EXv(yR3Q7w4`YHDO17b>pDkJ(29fXYu2OABFqRv~9SNexRsw z=a{0bp(VaT50vi+=P(=PeejXVSG9bP&@;Xy>ygm~%IX9l9yam-AHImUL4KIW9= zpZT7uUk#qy%MSlr^4Md0aX)^FtQP2~K&>YYBtL52pt6GR#VJ-6d8KU}i6TSDjeiQo zLg_zGfn#jrsZ(-T=J^j={eV7_&I>g^a@njvZTd$>FVw0!oxBqvwo2}jq2$J=(B51S z%VI-FX~>3;Bd%?L(U?8| ztT2{=)ix+UG<@H)&!zMW+Hr7m!1%--Bj239xuvxFr!AYe)o-ZVvD2QcdT=K7qqibr zDh3bnv9;`bp?BYY&PuN{(=$`n{;<8_*VR{^-(G+Ebp4)_I0tdz@?oNH3&0U;>qG#r~W(^bGBkq=gmP6e_ zz502Z319y(DAdZ$)x%@Zc;hel;U>n`>*hsFaWJ)#%li!~NiW%EW76Yj4~6MCkKnP! z3fiRT*(ch=E5_6q);z|g+$z9S#;}CBQA__;ffJ;;tqxax=*%kS<>=YTmUBQ4$6fZM z=%{4RORdRz1CL;zC0ov|1seog4w{5EL)-iE2LWPV)cwGg!_+lUd^MIF>c4V%=#+SC zQwviCC!cv)<&jU?gf)Cm6Vsl(l=n&fqD^W4_-1`usZazqTs{46bnW_Oeu*@;~~+I`Bh=%63sk*;8oSVXRgvgxP6!Ysxsq;s~qST$OY_qmW43jQN16l+=(sF z*_vV!3DqP+-JDjQL8Z=?HJ&-J@U&W+2sR#ZRJX#s%nhC2mv;F=PmEz~I(F!G+2soz z`MdKjU+8~0g9_3y0=*s`@6t$geZ1OvXRqiK?9vX}h5zDh0J;@G53pi#%)G-ar0$`k z>`lxD^y|U(xF)QT_c8Bh(l5UDtjVB+k?G%)zB?f1FhB9^>H5Ip)5x=%Nct^@3hIhdJk=lTIlrT@< zWNkoBA@>bnfL5gXY}-a*6ZZoAR9?K;whG>neEHDESa?VBA?xF*4zDzg(C}1zwNTgD zJFUf84~n(i#wgX3gpsmJ*;XSj^z@ z@c{Uq>ILDz#pLQ~zJ6INiE+ZpEI;3A)ycw0^4x%h#Q4e;(re)W5-q$sV4?8ml`F!3 z77h@SX)*oU)HQ2Ye*VrZm)^adGj|mf?#go3*p(0u0V<4PlmlIhy9<AfG%eew0**{t9CtlkQ;nYi+M%kD+XUD<+e^c>O7{5GZ%z`sqRzL-0Uf) zC}A$0C;zj^51njF+qO9^Wl{(DRO?Mk(kg65yoBfP-xm>U zeMe(cngAp-7(u2PgVJp+dcuHGZe3R2Yd5`SxTYSQt416b|i3LvY?AyUDCiyk@ve zUOsj!fbzQi-9P{}ethu2-~r!(b6h_xrfJA9f{8tHete$@j>5H#UNc?NszhKr4gs)X z&@TXXh~9U zykcDaBEQ*=!X6^LsFr73(jnV0Tl?Y8al;3NS{wrL7C(xKH(?#uv(JRug00W?H|9Ge z-6dYpb4ZMD>?9ljwzkNXfFIi-p!RKa#m%e>Uf@5dz19_@GMd>56C@5<)CmhZK=m&e ze+_&l%UH%Z%t(82MuHB4wRWNA2CUD_2t#ZXtgNeO79)+o2Sled{!qF6`@`q3YVoGb z6`T5!Ey5i0tt+I$#js`L*l|L!aB)W7;bl#$4v2+|iBSZ=aMZv+^B0>0+gAi4F8<8w zqXSO=8F)jvEPv%zGhq(d(s$#^%#98oySKe?_=jbcKiHi(;G33lU{%wy!+9B@yU%PD zgyYAA_N~yb1`zI0(FJ7mH_$ImT}6fIQZNJ6{&1|4LT00`#I^A1z%WRDu#Bbp9nivW zOzMN|$2vIh{cC6uMy~xUxfk@p3TF=UWIKT>0D^!Ore)}BEAYJSnwC}O*IQbynXkFN z=Fm^DZT-mpJ$v`=+OyZLv}Lmp591ZT?c>>7h4!N-1Yt|_$H$(%di9xS-)GVse*Fqu zf)&4D=H!@x15PwbK?C z4-guKH+I8FxdF9cRf%BsGn1QGkBXTpKqS=JiidAcKKAaQo(ghh5xC)Q!Fa~Qo z))kwH?&*`<>;)re3szL%TCIJ(qD8BjA)Ut?BX$?KiNXY3yPL>WNN66Qe@BzZTPz>k z4r_m+o{a8Rh!--}!Z3&;2EZ`+Ea)2c4d%g*D& zO4Ix*zuG#nD(1qT(Ro2tnIlSU%oOsT{rA}I*gh`=V_!`Ozk%U2Fvn3Y@E>yuvPZ&faTt!QlHhUH7#OLL01^!vo-!JwBK zQWm5-Ie7UxkBsK|sR?e`n-Y??<|fWbad!0b8yuCCGf{cqG}Fk$T6Qou?=UH532XX! z*&{J4&?aHvEx~44_%E^uY?g0Dn`N2WX8E04*tVXUvWhsSs^8($?%y19moT+JpZ0D0P8YCG`#p{Q>Ii9t(*=TAx0PT^7CmO+FSd`mf?vp5CF^d|3eYe`0n z&_`ECFABR(8BTe}vHeCq1)xc_e;@Q4K&M=Ekc z^FvwfpVOC!?2GgLg>j@jFTXs$;5klmA9ZqQ~igw z0C@llPkAfrGv@V!??~)5={7d913-mVhsUCX(U9(;C5bJsMhHW`p?7UWU)p2VN5Dh!ssSEb7{?$dsu*X2l?V61H`I|8Aboen`y?Ik z7PVk_9`Hs>y2DraI^-j4>u~HfH>+KH+HD{Y!uNcD@eG4`L<3V3&xDqxcqV*e9?=Md z@)(aO`5baGTMfHJmmWK&DtN3*6!2?c8WHL*%=6D^@*~4{9MIrNe40SbMCfHEKc4-e?x&j)I)Q0pD&%3>e_R ze;vMX#6yh50^IowEzyVRDhmU+E-(kp(1F{rD~cJ{%qa?bAS}|5=V3-G%Py@Q zWZI*dHyN~ZMoY<_{yn*7MIXC$Z_X!C{J3qU-ctwBT-7zJ#36GFD7UL^1}!ZeJl=wO zsSY@%44b!YoJ=^6J zaHmA}8blv|HTqn-vs0jItzS9;9yn2#*58ry@-Q2C7yjc9OK$*X9dC%)0cPDjg&eiT zB+!bOzTU}_0#CE%yy#9F&%<`#SycYT-c@gUE6<--dS9NNzXA`-$gPPAUk%%>DIAnR zcPuIPYXkGdzob$+DkJOU{28YTQD=la%Y29|*c!noq;%F6MP(6<2K9b-Hys+|hMp!i zi;rYfU7kB8Iv^uv@RG0hCa?1+{Zm%NT-eL>#o*aCeS4t3C^*RbJ485&y5i(5o_!;7 zmdAst=;{c`KQ;RGMc@}npNIK%35bn)_1FA-z`HMC4)F)Hq)>^p4q#=JJ4ZpFYOp2{ zXNfU5%#8z9rx^`DtyuOm6hB&7egD9gt=l(k*}9Y1$Gvc9x<`JR?eM`QRrt)o-^#@& zykx`pLCfyd@Azikz?juP?%wm$>gE@=?>v2G$L>>fua$4Y((Hhe3B6_XBqui>;yO5F z*f3k1eHh326vh*@J2i$u3K7!|`xvx-u?#cn|B|Xp9xk|4<}o2uHZFG7*`lgDlNN^@ zoH%ZFRc==HIB;d>XYUztEc&5c(w>r0b0=Cv2dzmi+8CRWvdKSs^!WIoCi9T6`1DB$ zB@5SxSoGx;vIeXmHX(}N&-q~^C-A5>XA5SOzzQ&NbkzBVKWwt zR(-&g*$0oFymWHm0-x0S0-MM&gT`jLnBSk0=h@R`@{ZC82VN;3R#+N#@t|E$#KeUY za_d)&N}p=W8~3!Dd7=!)uamaM#_ucs0mvl|vSK{dk-o>rZy#_u!uZDqZz)^ex)-{I zQ99KA3w;5!B=AU&?Yv~Z=wAx!(9evdbk$k_B06|6R|FvZc;6Y zoaW@Dqc4a*U; zCI#okd0sychI3rS5S(=#J2NSy`>#$+88TS)9j>2}_6_q2s)kZmLsFG>k?q&uv2`TW7I5<{`cn<44C!i@+B|01~e2+-p16@E`&j(T{Etzg@raI3*fBu?K zDEiaUA1g_`I<<`Lka)}#*Oqna@^)4mIEBT^o12c_Te#@)?;=Yx8oKj3E6-m1p-)ndTak|;aMD-qv&ADTazY60*~_}*L@D$ZDfJvs#!~HX(vpPWLX*4!=;IL2 zF{3#Rzf|YFxWsow61ghe4oJ*j{p*3}J)3AFn@wV@Ff)v4m){m9RByvY1f^Hz_d7OEE`x2`P- z4=-7Z{yr(*!OO|B8m&z`(ohcZkih`c4Shn|S{sZNOgfgNE7s=~wYK8<|5z_-Z5F8u zBCkf3r}mZfwztb5{;@?CyKU~UbXz)C^|ocwkhsjDgge$YmH6hzxyPB)Fx4hyig)R@ zIGGq@fb*+lcYtTWZWC7zbM&CX)WcOmtN|*0#6!)jfP+OD;0N>K_x0y94;`poTI!n@ zn;32Jwna?B_&o2qOKKYqWS_4oI_2oBJZ-<}_wAQSXy%EuE1PrnP0c@ExPANd<9QkT zGIumjJdrKD_4cm&b+f9fW&s~D8Ofr5Ft!m8{p0jV%1np^#yuh}SuF699+3&_dHXGt z!BW&3yvS+|%0dqm=6n?%1tU6Rjr9ORc?TRC1krLgN{m*4>`>6J+Ed`KxC1_d_0V4I zAx09kB&@_`bSs8B({%9~cCz(lz5E7i9phoCm!JWwd#MK!+mkJ<&x&+mG*`n%IQ};US+Zq^92ZH{bpRo`t2w6Tg(&aHm`A^kSig$cZ1;=7d+c-t`ohd zNes9CxKbhCL8f#^d_k{P{2~mJ@W6m-%uqS`c>S1Za0~+<5k4nrn%&dms2?EmPIq)U z5uwK`bTERbUrb^dA8l*|YeB}B!4IdrOHLJ$-YR~M@SQEWw5Zu@G* zim$ebzmuvH5~`EfZ#%e1?u(a&zVP>*`08ZZ3%rf-)k&&9ldI#IB!=k%wwsY0ZCP1> z3j{-IAV$#VCV&3u_lLnC0%@IZM0j7o3Fh*mAi@%U*n(>9q(%)eQxG?$Wj>+v^TygiSItsNLlakwk6#f#d9mY5L%5!*+*GH*!3Pr7TwlEYo?ZH(8G+%M zesNXtiB;pHyu#_fn-f)61A;>ZX8Esp}JkzrB((mwvLQ=GKa6I(3ZcI*o#fJd*41$^q(vA<%TePMei)OfK>n}h@SQ#zY37_I;I;HN@C1vyZX?gRm zu3Y)fyv!VK-onbyYRfinTCiZ#=CZscOY-t6EA8gKySnnjkeJ|SXD&IHn|p4_%x6YK z4gaWe^}BPgEML5M#frs?m(z=R1?;~(r0HCsX`-5@5$b7%x+8EPTbec5?r4&Vij{Z+ zXiKv_KO-uO(fU&D%oqRzuO@M9{8CNHGIx#k?@9;!z78->V&5IvzK*5v zJze%11c;q}!~1W*^Gdj{pw7~+jP>wDJcHn3j-#*?^ucuKv$!+viASNhd!z6=u(lAO z#oBBXbg(wyT-*LV*PGiZSI`h6Bh@{)QVx^DSm!=_AdSty`ORP3rSd$nz}x@CO3L)Uf$TT*fpbCD&u;~ zo`>}cH7#6EyRKKbT;U{!#fp58y(KAWOLo@gG;#C8=)Oq_v5TV|;~wnvoW2TS+no$2vu44ju0~ zW%aoDnzT`A1i;5=w~EA>q#N8`ILL?e5jIP_^gRUsvzOm5KJCZ^K(o9T+kZisVtH!tUYU7jtA&4$Y;`4lN|Pkq9! zGzSAjRZ#adQ$izbmU1J=YA>hBQ9k26>6S#CZ%Iy(FyG9{wTJ5v3Jj4rjaB!wr{9`b zt?8$QiCo1nu|&U_S{ihoA{x+qkx-0tZn@>ZALK%T6X{|UF49* z%yJ!YA2ad!OWG(!Fq90)0@Z`ASQ4W%!18sFq_Rem_{O2@(6!s|o0bhzFCYxpZhci?*LeIp}y4{%`jIZyaYjo>1=Bx?Yy6e3=j zS9KrGo`O0`kemaVlkf~A>RbX340|R8HEr;9;xmxO_uhW2TtYF1%H0BeY$!YFoh7_< zY%yT&erqR|XN+!FHe1nK1D+HPXhG_&9c*ILyxncgEgf0aQ?V6g{n?PssxEj_7f~Y}_Po zH(Q38&m>z1ZOn#x17?vS=C(a<-==5Pm`w?AjTj(dmT}Z?s25!1LazjW`vALOdR2#kU)Nm3m!3k{D|NsQh5XP=LFVe%h;OnxEa{A?Wiaw8(Y0`J2v8;YJ8UdS|17Kldv$rFiCbmtdDTiIzTCUnKfVa~)B-+3q-T`OJ*K2XgzS6wAboA(MTPf8 zu-+_%D=>1O!bnat3T1t`0@VK$N3t8#zoMV|&~|^JlCx1bL))3)u|xV)(lmuLj>dmO zpUTJ5M}$pZVX(6q>{@_51Yje*y3(Q&X#x0^Qz!Z{eGgYg%*`yPlc^IFpJn{c?m$n9 zjBupkN$yRpC%G8*q-Y$mHE=ILi^oB(jWcrRUld`%Ut+X{ zJ4NPz%)+%qj(IJXPI4^vJEwTw-7>z9_Ym$4^YVp6_M7JzH=eb0iY#TeJ+|~5!9eKqXhY6y8(NrI1I;_>dn?Vu9Mov7j%NgCazVSbk{( z>CgSiuLIu#tY1dw5PP_ConI%?AjKf|q`w;J4)huJe*pHU81^Xj%Z&bj7EkHI{*O-B zi?apZn~7K>73A+guX_NG1So-u1hDDP*9l(~k~@M^A#sE`LmY|(C&8(RIO0qYH5Bk5 zO<kV4l11yQ{-bAU>88v zBwT!TcSe+(edgX*&&Lak15S|D!5demjtE_twyG`=zWRpEr}+K#(7hFw}8@`~B+Kk9e?vCHiI1*@i25RuMlDn9-pY~fhjXbJgf za#(N5`JZL(kPBhW^g3oW6+mT9F~2~pS|S5Ik%J!sKQ0~n*IDQjuhAXFuWz0(Ve{+7 zC9iLpFk#E`+CZ>;;F_IrBf``YhSOS$NcwTYeZy=gk7W@6&f*uvSQ z=SzpHf0D-SVPWx=waThpD+^+#+81RIlV#@%Y5v7kuJH>;6B>{eI(nKiKJcYotD5J) z90co=e^vGwtlUcAc2A5HM`&m%BEh0RS}uLuD+|fP4VyV-$_%ezGbT@& zIqV=^O2@X26uxV0r{%H)3q-z?THhm{{|Wq?`-wK7Dm0x~J=;H(*BDm5lt z^-ba9BSh9nyl&*Znm8wDW#pds3MegnzrJ?f?4iw$O`CzE97o^8Koi>)iz=v?0XU|Sj~<{ zxFlMVjGhoyQ;y`i7{Q9JMldWCxe2=i)3Qbk=X#owx5M(&h75Lfbo9t|A5-WKF^o@S zo(`iwRF#4){w{^|?s?AX(_+l}^|7-Vl%xaum3?_iKP2uS zW_&>0KL9%W0KXBO5m&`p`U08>A^;G{+gOU2dF6Mcu- zOiP7=Km+`H3*}^UuP~R2LrE{4a|!FEO5{RRlUt}Y;9!|Wz#cyAHhQRVh)n5J zrs((=bc66u)mz*RRViH$+O5oD`5R>?es(vOU*=_flV(D}qNF}@UgZ(0dV^ch*hnfH z8*xs9RwFk9oGdY8P^>rs>jlU&HBro9L4`>IiwV#|s|)Q}`yA`{eTs9vVABKTGpBn6ZS1oF^W)yn}h6Z^_}{uYxiz%xT(ZnAoi;89~{ zpBQqNmQ6U^nF-if|FG1VFU~2bFL8ZcnU|1KK*@u)5_-3JN(lYe>{EGD8;eI4m(5CT z+t^I!UAY1ykD23*&`b1qfxo3d!{I=4$fP1hB4Z1of|B1PC{KM%+&|91Uv0<4q_;-$Q(4Mek?Q&DoM>K_t zS2fa%wii@rp&RzD5EICx+`()K+!YT4$$I^Ru#wDbB6EdJ!~{Q-3b1Q zWELFQWlK@=0vs}to6E;xTd`DBwZRCW4+Z!i%n_k&5x8n(i-cApCliTWc(@2Y$QBB1 zgkLDM3J;kUP7ZT#@_CR$(*PtuA7(hW27NjtoE!#9-zUxdPuwj=7X}|E!F{f+jpy1p zKOn$X#DxQ2=Y9Ss{tSB#@Bz)=T0LFJH#Kzs>b6qxrTh8Zv^?Qk^_$(a7eoyk?F^=w zGdqX=TW}(GRtg75?rw4iKOGg0BKLyd6>ymZ+L$rY%moD~()vEVrt%W8APLWY`suU6 z8*5Z^o4URcfkIa%L-hHdu%9X~dJX@Q1QM}^M8KPZLR|aGjbM*F_&?bx>k;7k1~c3e z##7WiWWsz>*F-i53smoMZ<1GjZu;@Zrk{oD>|N4}B=d!E_Vz&3oKdS0g9hyEbX>~8 zbqaf_V3XV5jNqi1I%yVyI*dLOkIRuVh9G%Lx;Q)zz0VrWTRms@kPlAY`vWhQu! zsz$^Gd&YWBtxJXv*`rc7rV11BQp^zX($Lt!sdbZpziyI~`~fbUMHNIetev`|w?AT0 zNsfoN(&Ej5E{h7n%V%eM4t2J8bAVGhIXOILczWpcru^Zt!>5K%KT#m^>|%a6XNIH5 z=w-%jhT0WxlEuF^2{QoZbuNpqmA#4gQwUKIa-G~3hxQov6}c-op)I)&Ic|*6DOmXx506B;B{*sD;H2QF1%ZJJP8GjA zclOJ3HaE;#Gb-Ap{r-lULE@8^pcXo;n^XfS;4_sp&{AB3rkASRvK&M$Y(+Y za?A;bH4m(9YpDI+$uj7w&F)L%-bz#bQS|bLgoF(*7tMHiLt^5FmuKWP=H@o$-V*z#$ z(8*7MMBqT%GNn#S&6dSZkT2&=-Q0akb8Oa{EsL3;(0mn2PsT>_FS$(1boX)LPR5LB z9mhU9<9=vZySQ&aek$0?g**Su%DIvjA%HD1f4BC)XWAEXpU60r`e~@s1b}}#2>yaL zS5D8XqPR?=%C@5GRST`?q4lrR;4B*S`h{Vt|75HFGwcF#Pk)%%Z^ z8~W1o{Z4&JG0OWN_2>Unf8{S~Q|Ny}h_+GsY1D0>68Mlh`J&i5c0zWBal0A%lN7{^ zRtR^e!)kYXy6`!uM|UOfl0)l!m>*B-g@PG%zdavn-1TFAD=?cue+VM9qKPP{3(kVm zbmA!M*E*j#6yj1_DBSG=Lx~a^V%qX|TIUi+>7g(9I_f0cEy6XqNccj+O9sXtuE)$% z$o~A8${vx83LLM13aYPD#(6I4KjQXFhlwtYsIB zMj9n!U(rl+6N|O8-hnZWYcKPwp#|p%{fBM?wjnQnZ9{a&d*_C#La*0X~xgM^qIpJeF4W{ItGPipH-^FKe7M`{GF6V}gH3)$~Qj z(iWb}o_?;P_a`P{ll{DtyyMqRp5K_3^PKSc*llIXkx6b2k$&F82iw?>FG9 zm>B9i+_k^MxU%fh-HFsCSuu2+pHC1xF>c<}Ih)6h+gRW>GS1m9*xhfqOMkeSk-r8r z8$!W@T_L*zUXC$XwYtkZ!8)cqcpZUh0)Qv9*a$D7cA{n^KVM`TAPZbkVBu3%XchPN z*->ulQQ_{b%F0{B@#t})#81NKyK^=V_xB`2eS)?Z4$t%ni0|8I>}=CNOzD?mXJ<9Q z#&%-hIIsS8y^dK#dJdgAsq)jK85u`Etz7yU{{1Yc@-{Sfj3{qcE``R9A%LZ1VfdKQ zI}%g2heeLIvbWD4J#>)2rKR~`SJy(nz@ehnCal<;Q{J zd!fA^p{_i~IdM|iP$x5P_fld^jF)bGXX+KzIDzgE==1a!A(=dp{{d zA3O+*K)SaGqK8Uhp)jL6>cIjD3KAhAPS<|l%$lC*{h5K8?}nY*Z)d)5zCXX99nvY; zl*kV!kF#rjSFf7?URt1%EHaQ`UxW~|%_lV2GU3}ej1eobOLn7&VdNckQZ+tU%Sa)qCJn6BU-EI7WdKe3N5fvmhJrO?t3eDWty*Hvr){K zV$;9KnDH*ZfsHQSQZ2u~;l9m^v-*i3@*5hPLaE`slp9LLh?5KW{2`~1lewLatS*ZR1$k<6_vtjnG9g7&5p4#|2=LqX0cP>FZ0;T z6&WY6WEVmO{UQ7>-{7g{xO(e_V*wpO$ zdC82cdxR4lzCrYpEd%ogCaeX$ke+j_!f`ok3b>0aYzcNXfPSqzec;&5J%_EXHIQC0 z&QE|YUD48VhYbD&B=4ob>p;9=&(}aRtATpla_`#SbnUqd_0jsOO_%mHlU4btVe=Wq zn_85z7HCt(NBxtGRFe5KmUwY1aYjRa{!e}m>|y+PgV$!_B3&Ey=PJ&NC*Y?or12f+ zmE{te+`#xMp$(rn=Sa$Igh1ScyQ2% l-=63BsE3AFm|Zqv{$sq4W(%xlnR-Ny@LE!M|Njz??q75Lhui=F literal 0 HcmV?d00001 diff --git a/native/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/native/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..f85d61255baa3df18b80140d9e4b16fdedeaa23c GIT binary patch literal 3624 zcmV+@4%hLCP)2CX+A(tleXWY%O^?N{M$C^zQs#y zFd?yxVHSY^BN+`#pmAaxJM8ktCd4Al?%l!0Hej3-lDFsH(bc?nosocZo^x!?ozc8M zJG zXWN}Wjyrb@Fr7bl6Mm2D`TLav$duH0K;dgu3Xsg=CNkZQ~Yv>&SU;K~H$`CfB#*K1|LX>82=!b|uol>)(oB$c`V&1H(5qq>$3S~#vMfGMx-P-F&Yc9;nkDsN9JWzy(+Fc-8=VNgsU(vr?oU5F{R zUc8P8oDP=QTPje51@{QxdF`L7z%<8(qJtq1+s>&qrowa7@MLJ@p5nujL3v)Ls|Y9c zM#9VNM}avnKv6kF4I&saW00?r=^POr4^4KM3YG~JWzv*+os{#tDlj^?q&O&QATod! zNgZWMbqzH%9vE|&2~?{FR5Foy$4VyJ(@7VZEksVSy{^?Gpq{{Q3#Jdi5>5+}VYhkzoV|Ly=uE zH#9)cA?H5Zcml&MN$4kF+p?e2a9Pai#o^?V-2db&$s@q5e+^ux~f zOX=JP%d2oD*`x-gD09(GRtScNgX8pt>q2f|P?+gKGZRDBO}I}*m>NQFhfJpC*cmzq!TuBLJ!Nc>NAs_4ICHkSrA({0wuoSiXgk;X?#81UH;d zVA^jz@U^aab&#(B5K%Uh=ANZgkSrY>yk+;h^{{Y=fL60ZaMSttz<{=%JcaAdX~_3> zRCNBW?oLHF@sKPT4iBckxHBClptbA}+;TpK8NcN~*SR+}L7h0;>sJV6X_mgFVd5{~2e49%Fk5kn`;Q)Zhj3!8y8cyJvVfQSBGwPm!r4jkNSf#p~9e|v3 z3JQLcaoyI&2CNVE!Af5b6grZS^J-zrsi7i(C!LQds6uahMfWk;?b8_pNOej`Rvb84 z=L{?kUOhYq4fesba|&i#>x}C*3NtY6RMWLgxsn16*MC5f*{;WO=cy`*?JFfzC!| zG(ocBz`5?6rrYUUuMhVo#^C<+Bs`d&;Ph~Myrf48JtoJ-vapbLVAiP$(N*>SQ4MB+N&MtSPNmzzRVHu$ZG* zPq8v*_f2LXvyhp{Yf{DPFc?ZOAV2&GD8v+5%Rwt%55vNa z!qH=p0#M~cvhY?O7tW*r#|TCNWTB)FOS&xxA7kr9V9Z@6P~wgkA5u^`6p*fSZffAD zTtn=R!LU!8ha!Vmq&lvV4jhIRx+(;vbCU_uX$cYq#G;jTJ_gHzRs@O1$vGmh5S9Q6 zK@#1hhZIyw;G)wd7g?&_F~w?H6)EHz>=+)52;(T#YJ}Lj6$LB|3OkCqNf$X?+*EyJ znW8lj0f%ncsDMK-0UR=f2n7$nW*>^dIQ;H} zU4tEi!K@)D>qvL(50t`dLSQl|>?jcuA2}Y9_?#p{B5W*kv}%xhc<1na!^6>mQ31Id zAr&w^C>c`NOQDm z?{4bS7F}drmv*fnT9v~&Du4+bBSN`P^>3;N8nNT|6|h7{F*j8TNse0JB8$047p=Ua zcjCecW5h$j5FR%C%P1LG2nt6p9wfPsbWvk2vPAc&cCFb8;gC-{bc_t;QAz)#dR!Fy zKRYhMBG(EXRXHTpt|q$3x@p($-%_|o6|Dk#0E`QVeBu}k8=Ao&`nsfl6czj*ufecF zP~}1jszDVsxr?Za_N<%s$IsO62`s2`4|(Pg3t0_Ec1#E*fUyxFwhn{Bj$&?7L&C*v za#6L?MK_(=P3x9jn~!qOywW}K;fP?^@J|~4UeZ%R_!x#If{Fu)+^guK`FJjxvc{a+ zGy@dXJ-0Q{iUWs52!jb={0%lWBF8YS&{6Rq>7o|ZMX0RXh=YDBex=}cE?ahwE?T&A zL^uJM01g?NL3l>>SB)?%28y{!1u5txUDWhlB<^UXuOM$*KDtsM-!j95G!jAv}B-uq`7xB+UrI_vAI9v5P{k_$3 zr>0x|mEt6Qz%si>9W50c5ex&er4c(WgOVYsqDJn`H?wPO=`SzLojLy6v|YU{?p_Oqc;TH(bdMY@>>LIsfU!&UzMv2khQ#6~MoryC z!H#B*8NZw5?CQlCx8?`Rzu%E}Yv0T})z2BA0_q?A*3QREbPtY}8qWLhim0CGy`qBG z$T2;nAZntEbTJdRd~P=@0-Cm~x2C*m^PkDd+f~1wv8%S`jQw*&*xKcIiSA*YBf+VE zAHJ!7555&dUL(h3NI@rwF4DyeZ~3|&BD2moCtu9kRlhXCDaFk>^^-aKL_zh{Lf1d) zc**V|y&}W;Bm7Sgc}<2Sy9jp?j#+dMVL&IAW}Oq|{kbmEN%QuHUZLUmzN(VK{sBe}Mg>$iF#A#ZJO5!d-;7d~y$_9ul61_U0QtbhMol=jV3)vA1qF z9P3(aIJUo11|U9OAt3A?5+w}hyZYZ#@sM~Ig)!sHIxe8#yV>!*Mf-T?f_vgk>#%;- z?4v(kX*l}MihZPQ%|0@<-tfWGJN5_PVL-T`b^Q|p3c7|sU~s-Kia`niy{7=g_mHZn uiyibGxmR+}2CX+A(tleXWY%O^?N{M$C^zQs#y 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 literal 0 HcmV?d00001 diff --git a/native/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/native/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..4a3759f3715b3e4b3e52688fea8dcfb7ec57e0a8 GIT binary patch literal 2411 zcmV-x36%DUP)uViA~I+$^8~5(1Xx1|1;Tl-|_aJ?~6+PtWdRs-CLZ>7MD|^S)2_ zs%m8z5r0-)@?+agmO5@~$Z?Zd+ew``ZVK|r^_7eeA20MCo2`}1vbCMmdDp%5Q50tw z+-m);<0RV(gC?O?QJtG8O6qg2XRd&$+qJbfKg~&wQ(0EGWGuOT6Ra4whU`CCX>!$t~ijD20 z4yoE=rTI%m-~ghDsRf#x7HB@D@R=rjR%42r;fCbS_(l%Q`qmGE=(wr71TMxyg(hHv zXmOf-wMuG=P%uY)wwX)`hGa8x%(#){EiXE$-|MR_Kr6rmc|%ZwsZmnWlX^d)JlpD- z6AkeW1!mN)xK83dJDprNSz4zB4@0Z41ejvFF6pKsbvzX^*d!QI%(yKfBdi-v@|;oU z-WZAkm!U;q8S<9XAnA65)Oj}*bD|;DjNV9Mz-Vw=b5Y<}6%kqm=3w=3M^RgZ)Ooj= z^o9a6(MB5F)^(%NX+DVp7b~p;Zgc9G?h3lcR2w0AZks2aA+<9)Bgk$0>aX}Hd%Qk)emnmLA!Tc`ITwsXI6k~*U!=S3` zz|)B&O!xLey0ujcjX)3WIE>zFgUsVJr0Z;WWXGV}HDU5W2h66sB~5mAz~Id!JaSC- z+(XaQ!&(Q%yE7y$61-S(8+JFh;rRF+ygGaZqd$BvL8H2z zI4q5husNuu(P2p2*WlU2gnv(`!`(fY>Usd(c8nQbnVk*I8M=E{>IxY_#-JPZVBm#c zbs^*U@SE31{tJ(e-a@9ghgaB+K~Jp-YjYWCQT+Va{tk9lSMwSmO?BL7hIcn|p|MO~ zpA<3QgzfmvOZvXMbC?f!%DD8Q#lnhQ{Xl zdRe!*2{Y6UGGU035i^bt>kP1NygAn1&t_(!-?{?3t1pT&aD4O@esZtDUM}2${mpI2 zEkA?o;u1`BKG1i=alya~vFbPx^Nmr7G7zPW%nS@#my0)W{0;^q45$U`X{Zl%1KACN zr(=-dF`K`}z_4`*_KGxcxUlL;e$_f8fMzQ_LV)CO{yX&AL? ziZ<}P|1mRMjDf*KGh?HpmrNK0Pp1pQzdf~q&CE26S=F##$iUHCSf3b$G5ZoT zT#SL?L=$79qnAt=B7Bbk|C4?7R~eYJs$hS0B{X)BU4!iS2(0vU!fdMp<5m@nTh+|) zK@kQ<5{-UUo+hsj4o+ntJ2ni{Rt4-Vguj?p9<{TvDXWrclBo(NtSZ=9 zTFm=iEaYIl#n@C6Mil&@bp;l>+F@&P5w@3?U`NsJ@}i`znF*M?eide|i?Gmi4K^o+ zVP}4ZX}!N2GEOBMn_;T(%v3NlnHCE+CZE98{4CSve1<7EpJ4|>=KdYVglwt_Bdx#> zF!;+bWL<_4i)ZwSRn6Ls)xyf*q6mN>2!vo6tDI@h%rBZ3HdD#ojcedqxF)WR49J2^ z1BwY`H^j{I%3p?I0Uk4oc_nxPpCxb)Y~H-UwBV~u5x-CKm>H8BnH7u#CaT!lstM`@ zG9$Yo!(WjqPw;Zp!{7+^)GTBAAJaDx;&V_78Y45-MX4Kl6IUb?2DYQ$x>^)GMI`_y zXb!k&egjKpX`Wp zBSAO#CRa@$oh7BrD@M_fwT!emZmcU8@;T+Y>qNW>xiJ%j-v5}SbgCR!e ziB;pDHezf08dp{ z!Pm^QOzY+ut!P|tq%>rL;v}9!Xhx)(2<3EJ4|evrCg z)|?o_)}<`ZzCJqQh85w(sv}SU{BPLyv=jdq6Me=pG8C9N!`>yD5I43iO1ukfFRU4( zX3bD^^?7t?!#I^0jY*I)Q7@#-=Dmbz#J;88Al8 z>Jr@D_%B0#=7*~3u#il^-IKh2osCqaD5l(f(RLZC&`oT>Qemn*YFnoPDbPp-_1QMd)|2 z&*A6TXH0mF_i&6lfzRvB&W->8002ovPDHLkV1l@YjdK71 literal 0 HcmV?d00001 diff --git a/native/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/native/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8bfe2d8672247ccc3ba4fb0b24fa1a5728db1578 GIT binary patch literal 4701 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 literal 0 HcmV?d00001 diff --git a/native/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/native/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..8bfe2d8672247ccc3ba4fb0b24fa1a5728db1578 GIT binary patch literal 4701 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 literal 0 HcmV?d00001 diff --git a/native/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/native/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..223e00da938cc8becd7fc4e8bb7bda97777a6ed8 GIT binary patch literal 7039 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 literal 0 HcmV?d00001 diff --git a/native/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/native/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..223e00da938cc8becd7fc4e8bb7bda97777a6ed8 GIT binary patch literal 7039 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 literal 0 HcmV?d00001 diff --git a/native/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/native/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..5184cb11edfcfe2327bd0bb9c91a97b1adf9bd6c GIT binary patch literal 9555 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 Ji=KD#{{WmjK9c|d literal 0 HcmV?d00001 diff --git a/native/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/native/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..5184cb11edfcfe2327bd0bb9c91a97b1adf9bd6c GIT binary patch literal 9555 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 Ji=KD#{{WmjK9c|d literal 0 HcmV?d00001 diff --git a/native/android/app/src/main/res/values/strings.xml b/native/android/app/src/main/res/values/strings.xml new file mode 100644 index 00000000..aee402c0 --- /dev/null +++ b/native/android/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Hello Chat + diff --git a/native/android/app/src/main/res/values/themes.xml b/native/android/app/src/main/res/values/themes.xml new file mode 100644 index 00000000..b72bfb9a --- /dev/null +++ b/native/android/app/src/main/res/values/themes.xml @@ -0,0 +1,3 @@ + +