From 238327f8bb755bbcfa7dae5ce0d78eeca96bd0a2 Mon Sep 17 00:00:00 2001 From: TRIP <192432815+appergb@users.noreply.github.com> Date: Thu, 22 Oct 2026 04:03:11 -0700 Subject: [PATCH 1/5] =?UTF-8?q?fix(ios):=20=E8=A1=A5=E9=BD=90=20Core=20?= =?UTF-8?q?=E9=9B=86=E6=88=90=E5=B9=B6=E7=BB=9F=E4=B8=80=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E4=B8=8E=E8=BE=93=E5=85=A5=E6=B3=95=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Restore the native input contracts required by the iOS host, reconcile startup with the current Core write gate, and deliver version 0.1.0 (16) from shared bundle settings. Add verified IPA packaging and iOS source CI, refresh dependency attribution, and replace obsolete reports with maintained project entry points. Co-Authored-By: Codex --- .github/workflows/check-ios.yml | 33 + README.md | 2 + README.zh.md | 2 + docs/structure.md | 2 + openless-all/README.md | 4 + .../app/crates/openless-core/src/api.rs | 514 ++++- .../app/crates/openless-core/src/auxiliary.rs | 199 ++ .../openless-core/src/cloud_providers.rs | 82 + .../src/cloud_sync_e2ee_documents/registry.rs | 7 + .../src/cloud_sync_e2ee_documents/tests.rs | 9 + .../openless-core/src/dictation_context.rs | 65 +- .../openless-core/src/dictation_engine.rs | 48 + .../openless-core/src/language_catalog.rs | 24 + .../app/crates/openless-core/src/ports.rs | 9 + .../crates/openless-core/src/preferences.rs | 2 + .../openless-core/src/provider_registry.rs | 11 + .../app/crates/openless-core/src/settings.rs | 230 +++ .../crates/openless-core/src/shared_types.rs | 28 +- openless-all/ios/.gitattributes | 2 + openless-all/ios/.gitignore | 5 + openless-all/ios/App/AppDesign.swift | 2 +- .../ios/App/ExperimentalPiPKeepAlive.swift | 6 +- openless-all/ios/App/HostApplicationReturn.m | 10 +- .../ios/App/PiPCoexistenceAdapter.swift | 3 +- .../ios/AppTests/SpeakButtonVisualTests.swift | 9 +- .../TranslationArcGeometryTests.swift | 2 +- openless-all/ios/Config/App-Info.plist | 4 +- openless-all/ios/Config/Base.xcconfig | 3 +- openless-all/ios/Config/Keyboard-Info.plist | 4 +- .../ios/Config/RecordingWidget-Info.plist | 4 +- openless-all/ios/Config/Version.xcconfig | 3 + openless-all/ios/CoreHost/Cargo.lock | 1276 +++++++++---- .../ios/CoreHost/src/account_sync_tests.rs | 6 +- openless-all/ios/CoreHost/src/lib.rs | 4 + .../ios/Keyboard/KeyboardHostApplication.m | 12 +- openless-all/ios/README.md | 163 +- .../Licenses/GlobalRefresh-PiP-NOTICE.txt | 4 +- .../Rust/adler2-2.0.1-LICENSE-0BSD.txt | 12 - ...ACHE.txt => aead-0.6.1-LICENSE-APACHE.txt} | 0 ...NSE-MIT.txt => aead-0.6.1-LICENSE-MIT.txt} | 2 +- ...PACHE.txt => aes-0.9.3-LICENSE-APACHE.txt} | 0 ...ENSE-MIT.txt => aes-0.9.3-LICENSE-MIT.txt} | 1 + .../Licenses/Rust/anymap3-1.1.0-COPYING.txt | 17 + ...HE.txt => argon2-0.6.0-LICENSE-APACHE.txt} | 0 ...E-MIT.txt => argon2-0.6.0-LICENSE-MIT.txt} | 2 +- .../Rust/array-init-2.1.0-LICENSE-APACHE.txt | 201 ++ .../Rust/array-init-2.1.0-LICENSE-MIT.txt | 25 + ....txt => base16ct-0.2.0-LICENSE-APACHE.txt} | 0 .../Rust/base16ct-0.2.0-LICENSE-MIT.txt | 26 + ...E.txt => base64-0.23.1-LICENSE-APACHE.txt} | 0 .../Rust/base64-0.23.1-LICENSE-MIT.txt | 21 + ...E.txt => blake2-0.11.0-LICENSE-APACHE.txt} | 0 ...-MIT.txt => blake2-0.11.0-LICENSE-MIT.txt} | 3 +- ...=> block-buffer-0.12.1-LICENSE-APACHE.txt} | 0 ...xt => block-buffer-0.12.1-LICENSE-MIT.txt} | 2 +- .../Licenses/Rust/byteorder-1.5.0-COPYING.txt | 3 - .../Rust/byteorder-1.5.0-UNLICENSE.txt | 24 - ...CHE.txt => bzip2-0.6.1-LICENSE-APACHE.txt} | 0 ...SE-MIT.txt => bzip2-0.6.1-LICENSE-MIT.txt} | 0 ...APACHE.txt => cc-1.9.0-LICENSE-APACHE.txt} | 0 ...CENSE-MIT.txt => cc-1.9.0-LICENSE-MIT.txt} | 0 ...HE.txt => cfg-if-1.0.5-LICENSE-APACHE.txt} | 0 ...E-MIT.txt => cfg-if-1.0.5-LICENSE-MIT.txt} | 0 ...hacha20poly1305-0.11.0-LICENSE-APACHE.txt} | 0 ...> chacha20poly1305-0.11.0-LICENSE-MIT.txt} | 2 +- ...HE.txt => cipher-0.5.2-LICENSE-APACHE.txt} | 0 ...E-MIT.txt => cipher-0.5.2-LICENSE-MIT.txt} | 2 +- ...ACHE.txt => cmov-0.5.4-LICENSE-APACHE.txt} | 0 .../Licenses/Rust/cmov-0.5.4-LICENSE-MIT.txt | 25 + ...xt => const-oid-0.10.2-LICENSE-APACHE.txt} | 0 .../Rust/const-oid-0.10.2-LICENSE-MIT.txt | 25 + ...txt => const-oid-0.9.6-LICENSE-APACHE.txt} | 0 .../Rust/const-oid-0.9.6-LICENSE-MIT.txt | 25 + ...constant_time_eq-0.6.1-LICENSE-APACHE.txt} | 0 ...=> constant_time_eq-0.6.1-LICENSE-CC0.txt} | 0 ...> constant_time_eq-0.6.1-LICENSE-MIT0.txt} | 0 ...E.txt => cpubits-0.1.1-LICENSE-APACHE.txt} | 0 .../Rust/cpubits-0.1.1-LICENSE-MIT.txt | 25 + ...t => cpufeatures-0.3.1-LICENSE-APACHE.txt} | 0 .../Rust/cpufeatures-0.3.1-LICENSE-MIT.txt | 25 + ...txt => crc32fast-1.5.2-LICENSE-APACHE.txt} | 0 ...IT.txt => crc32fast-1.5.2-LICENSE-MIT.txt} | 0 ...=> crypto-bigint-0.5.5-LICENSE-APACHE.txt} | 0 ...xt => crypto-bigint-0.5.5-LICENSE-MIT.txt} | 2 +- ...=> crypto-common-0.2.2-LICENSE-APACHE.txt} | 0 ...xt => crypto-common-0.2.2-LICENSE-MIT.txt} | 2 +- ...d.txt => ctutils-0.4.3-LICENSE-APACHE.txt} | 0 .../Rust/ctutils-0.4.3-LICENSE-MIT.txt | 25 + .../Rust/curve25519-dalek-4.1.3-LICENSE.txt | 65 + ...ACHE.txt => der-0.7.10-LICENSE-APACHE.txt} | 0 .../Licenses/Rust/der-0.7.10-LICENSE-MIT.txt | 25 + ....txt => deranged-0.5.9-LICENSE-Apache.txt} | 0 ...MIT.txt => deranged-0.5.9-LICENSE-MIT.txt} | 0 ...E.txt => digest-0.11.3-LICENSE-APACHE.txt} | 4 +- .../Rust/digest-0.11.3-LICENSE-MIT.txt | 26 + .../Rust/easyfft-0.4.2-LICENSE-APACHE.txt | 202 ++ .../Rust/easyfft-0.4.2-LICENSE-MIT.txt | 19 + .../Rust/ecdsa-0.16.9-LICENSE-APACHE.txt | 201 ++ .../Rust/ecdsa-0.16.9-LICENSE-MIT.txt | 25 + .../Rust/ed25519-2.2.3-LICENSE-APACHE.txt | 201 ++ .../Rust/ed25519-2.2.3-LICENSE-MIT.txt | 25 + .../Rust/ed25519-dalek-2.2.0-LICENSE.txt | 28 + .../elliptic-curve-0.13.8-LICENSE-APACHE.txt | 201 ++ .../elliptic-curve-0.13.8-LICENSE-MIT.txt | 25 + ...xt => equivalent-1.0.3-LICENSE-APACHE.txt} | 0 ...T.txt => equivalent-1.0.3-LICENSE-MIT.txt} | 0 .../ferrous-opencc-0.4.0-UPSTREAM-NOTICE.txt | 82 + ...-opencc-compiler-0.4.0-UPSTREAM-NOTICE.txt | 82 + ...PACHE.txt => ff-0.13.1-LICENSE-APACHE.txt} | 5 +- ...ENSE-MIT.txt => ff-0.13.1-LICENSE-MIT.txt} | 2 +- ...find-msvc-tools-0.1.15-LICENSE-APACHE.txt} | 0 ...=> find-msvc-tools-0.1.15-LICENSE-MIT.txt} | 0 ...generic_singleton-0.5.3-LICENSE-APACHE.txt | 202 ++ .../generic_singleton-0.5.3-LICENSE-MIT.txt | 19 + .../Rust/getrandom-0.3.4-LICENSE-MIT.txt | 26 - ...HE.txt => group-0.13.0-LICENSE-APACHE.txt} | 0 ...E-MIT.txt => group-0.13.0-LICENSE-MIT.txt} | 0 .../Rust/hex-0.4.3-LICENSE-APACHE.txt | 202 ++ ...E-MIT.md.txt => hex-0.4.3-LICENSE-MIT.txt} | 8 +- .../Rust/hkdf-0.12.4-LICENSE-APACHE.txt | 201 ++ .../Licenses/Rust/hkdf-0.12.4-LICENSE-MIT.txt | 26 + .../Rust/hmac-0.13.0-LICENSE-APACHE.txt | 201 ++ ...SE-MIT.txt => hmac-0.13.0-LICENSE-MIT.txt} | 2 +- .../hybrid-array-0.4.15-LICENSE-APACHE.txt | 201 ++ .../Rust/hybrid-array-0.4.15-LICENSE-MIT.txt | 25 + ...1-LICENSE.txt => hyper-1.12.0-LICENSE.txt} | 0 ...> hyper-rustls-0.27.10-LICENSE-APACHE.txt} | 0 ...t => hyper-rustls-0.27.10-LICENSE-ISC.txt} | 0 ...t => hyper-rustls-0.27.10-LICENSE-MIT.txt} | 0 ...ENSE.txt => hyper-util-0.1.21-LICENSE.txt} | 0 .../Rust/inout-0.2.5-LICENSE-APACHE.txt | 201 ++ ...SE-MIT.txt => inout-0.2.5-LICENSE-MIT.txt} | 2 +- ...SE.txt => jsonwebtoken-11.1.0-LICENSE.txt} | 4 +- ...t => lazy_static-1.5.1-LICENSE-APACHE.txt} | 0 ....txt => lazy_static-1.5.1-LICENSE-MIT.txt} | 0 .../Rust/libbz2-rs-sys-0.2.5-LICENSE.txt | 48 + ...HE.txt => libc-0.2.191-LICENSE-APACHE.txt} | 0 ...E-MIT.txt => libc-0.2.191-LICENSE-MIT.txt} | 0 .../Licenses/Rust/libm-0.2.16-LICENSE.txt.txt | 258 +++ ....txt => lru-slab-0.1.3-LICENSE-APACHE.txt} | 0 ...MIT.txt => lru-slab-0.1.3-LICENSE-MIT.txt} | 0 ...IB.txt => lru-slab-0.1.3-LICENSE-ZLIB.txt} | 0 ...E.md.txt => lzma-rust2-0.22.0-LICENSE.txt} | 26 +- .../ios/Resources/Licenses/Rust/manifest.json | 1688 ++++++++++++----- .../Rust/md-5-0.11.0-LICENSE-APACHE.txt | 201 ++ ...SE-MIT.txt => md-5-0.11.0-LICENSE-MIT.txt} | 5 +- ... => micyou-dsp-0.1.0-LICENSE-AEC7.txt.txt} | 2 +- ... micyou-dsp-0.1.0-LICENSE-PureVox.txt.txt} | 2 +- .../micyou-dsp-0.1.0-LICENSE-RNNoise.txt.txt | 32 + .../Rust/micyou-dsp-0.1.0-LICENSE.txt | 725 +++++++ .../Rust/micyou-infer-0.1.0-LICENSE.txt | 725 +++++++ .../miniz_oxide-0.9.1-LICENSE-ZLIB.md.txt | 14 - .../Rust/miniz_oxide-0.9.1-LICENSE.txt | 25 - ....2.3-LICENSE.txt => mio-1.2.4-LICENSE.txt} | 0 .../Rust/nnnoiseless-0.5.2-COPYING.txt | 32 + ...> num-bigint-dig-0.8.6-LICENSE-APACHE.txt} | 0 .../Rust/num-bigint-dig-0.8.6-LICENSE-MIT.txt | 25 + ...t => num-complex-0.4.6-LICENSE-APACHE.txt} | 0 .../Rust/num-complex-0.4.6-LICENSE-MIT.txt | 25 + ... => num-integer-0.1.47-LICENSE-APACHE.txt} | 0 .../Rust/num-integer-0.1.47-LICENSE-MIT.txt | 25 + ...txt => num-iter-0.1.46-LICENSE-APACHE.txt} | 0 .../Rust/num-iter-0.1.46-LICENSE-MIT.txt | 25 + .../Rust/p256-0.13.2-LICENSE-APACHE.txt | 201 ++ ...SE-MIT.txt => p256-0.13.2-LICENSE-MIT.txt} | 0 .../Rust/p384-0.13.1-LICENSE-APACHE.txt | 201 ++ .../Licenses/Rust/p384-0.13.1-LICENSE-MIT.txt | 25 + .../password-hash-0.6.1-LICENSE-APACHE.txt | 201 ++ .../Rust/password-hash-0.6.1-LICENSE-MIT.txt | 25 + .../Rust/pbkdf2-0.13.0-LICENSE-APACHE.txt | 201 ++ ...-MIT.txt => pbkdf2-0.13.0-LICENSE-MIT.txt} | 0 .../Rust/pem-rfc7468-0.7.0-LICENSE-APACHE.txt | 201 ++ .../Rust/pem-rfc7468-0.7.0-LICENSE-MIT.txt | 25 + .../Rust/phc-0.6.1-LICENSE-APACHE.txt | 201 ++ .../Licenses/Rust/phc-0.6.1-LICENSE-MIT.txt | 25 + .../Rust/pkcs1-0.7.5-LICENSE-APACHE.txt | 201 ++ .../Licenses/Rust/pkcs1-0.7.5-LICENSE-MIT.txt | 25 + .../Rust/pkcs8-0.10.2-LICENSE-APACHE.txt | 201 ++ .../Rust/pkcs8-0.10.2-LICENSE-MIT.txt | 25 + .../Rust/poly1305-0.8.0-LICENSE-MIT.txt | 25 - .../Rust/poly1305-0.9.1-LICENSE-APACHE.txt | 201 ++ .../Rust/poly1305-0.9.1-LICENSE-MIT.txt | 25 + ....txt => powerfmt-0.2.1-LICENSE-Apache.txt} | 0 ...MIT.txt => powerfmt-0.2.1-LICENSE-MIT.txt} | 0 .../Rust/ppmd-rust-1.5.1-LICENSE-CC0.md.txt | 119 ++ .../Rust/ppmd-rust-1.5.1-LICENSE-MIT-0.md.txt | 16 + ... => primal-check-0.3.4-LICENSE-APACHE.txt} | 0 ...txt => primal-check-0.3.4-LICENSE-MIT.txt} | 4 +- .../Rust/primeorder-0.13.6-LICENSE-APACHE.txt | 201 ++ .../Rust/primeorder-0.13.6-LICENSE-MIT.txt | 25 + ...E.txt => quinn-0.11.12-LICENSE-APACHE.txt} | 0 ...-MIT.txt => quinn-0.11.12-LICENSE-MIT.txt} | 0 ...=> quinn-proto-0.11.19-LICENSE-APACHE.txt} | 0 ...xt => quinn-proto-0.11.19-LICENSE-MIT.txt} | 0 ...xt => quinn-udp-0.5.16-LICENSE-APACHE.txt} | 0 ...T.txt => quinn-udp-0.5.16-LICENSE-MIT.txt} | 0 ...CHE.txt => rand-0.10.3-LICENSE-APACHE.txt} | 0 ...SE-MIT.txt => rand-0.10.3-LICENSE-MIT.txt} | 0 .../Rust/realfft-3.5.0-UPSTREAM-NOTICE.txt | 27 + .../Rust/rfc6979-0.4.0-LICENSE-APACHE.txt | 201 ++ .../Rust/rfc6979-0.4.0-LICENSE-MIT.txt | 25 + .../Rust/rsa-0.9.10-LICENSE-APACHE.txt | 201 ++ .../Licenses/Rust/rsa-0.9.10-LICENSE-MIT.txt | 23 + ...=> rustc_version-0.4.1-LICENSE-APACHE.txt} | 0 .../Rust/rustc_version-0.4.1-LICENSE-MIT.txt | 25 + .../Rust/rustfft-6.4.1-LICENSE-APACHE.txt | 202 ++ .../Rust/rustfft-6.4.1-LICENSE-MIT.txt | 19 + ...HE.txt => rustix-1.1.5-LICENSE-APACHE.txt} | 0 ...ICENSE-Apache-2.0_WITH_LLVM-exception.txt} | 0 ...E-MIT.txt => rustix-1.1.5-LICENSE-MIT.txt} | 0 ....txt => rustls-0.23.46-LICENSE-APACHE.txt} | 0 ...ISC.txt => rustls-0.23.46-LICENSE-ISC.txt} | 0 ...MIT.txt => rustls-0.23.46-LICENSE-MIT.txt} | 0 ... => rustversion-1.0.23-LICENSE-APACHE.txt} | 0 ...txt => rustversion-1.0.23-LICENSE-MIT.txt} | 0 .../Rust/sec1-0.7.3-LICENSE-APACHE.txt | 201 ++ .../Licenses/Rust/sec1-0.7.3-LICENSE-MIT.txt | 25 + ...E.txt => semver-1.0.28-LICENSE-APACHE.txt} | 0 ...-MIT.txt => semver-1.0.28-LICENSE-MIT.txt} | 0 ... => serde_json-1.0.154-LICENSE-APACHE.txt} | 0 ...txt => serde_json-1.0.154-LICENSE-MIT.txt} | 0 .../Rust/sha1-0.11.0-LICENSE-APACHE.txt | 201 ++ ...SE-MIT.txt => sha1-0.11.0-LICENSE-MIT.txt} | 5 +- .../Rust/sha2-0.11.1-LICENSE-APACHE.txt | 201 ++ .../Licenses/Rust/sha2-0.11.1-LICENSE-MIT.txt | 28 + .../Rust/signature-2.2.0-LICENSE-APACHE.txt | 201 ++ .../Rust/signature-2.2.0-LICENSE-MIT.txt | 25 + ...OPYING.txt => siphasher-1.0.4-COPYING.txt} | 0 ...txt => siphasher-1.0.4-LICENSE-APACHE.txt} | 4 +- .../Rust/siphasher-1.0.4-LICENSE-MIT.txt | 17 + ...txt => smallvec-1.16.3-LICENSE-APACHE.txt} | 2 +- ...IT.txt => smallvec-1.16.3-LICENSE-MIT.txt} | 0 .../Licenses/Rust/spin-0.9.9-LICENSE.txt | 21 + .../Rust/spki-0.7.3-LICENSE-APACHE.txt | 201 ++ .../Licenses/Rust/spki-0.7.3-LICENSE-MIT.txt | 25 + .../strength_reduce-0.2.4-LICENSE-APACHE.txt | 202 ++ .../strength_reduce-0.2.4-LICENSE-MIT.txt | 19 + ...PACHE.txt => syn-3.0.9-LICENSE-APACHE.txt} | 0 ...ENSE-MIT.txt => syn-3.0.9-LICENSE-MIT.txt} | 0 ...SE.txt => synstructure-0.14.0-LICENSE.txt} | 0 ...xt => thiserror-2.0.21-LICENSE-APACHE.txt} | 0 ...T.txt => thiserror-2.0.21-LICENSE-MIT.txt} | 0 ... thiserror-impl-2.0.21-LICENSE-APACHE.txt} | 0 ... => thiserror-impl-2.0.21-LICENSE-MIT.txt} | 0 .../Rust/tinyvec-1.13.3-LICENSE-APACHE.md.txt | 202 ++ ....txt => tinyvec-1.13.3-LICENSE-MIT.md.txt} | 0 ...txt => tinyvec-1.13.3-LICENSE-ZLIB.md.txt} | 0 ...1-LICENSE.txt => tokio-1.53.3-LICENSE.txt} | 0 ...=> tokio-rustls-0.26.6-LICENSE-APACHE.txt} | 0 ...xt => tokio-rustls-0.26.6-LICENSE-MIT.txt} | 0 ...t => tokio-tungstenite-0.30.0-LICENSE.txt} | 0 ...ENSE.txt => tokio-util-0.7.20-LICENSE.txt} | 0 .../Rust/transpose-0.2.3-LICENSE-APACHE.txt | 201 ++ .../Rust/transpose-0.2.3-LICENSE-MIT.txt | 25 + .../tungstenite-0.30.0-LICENSE-APACHE.txt | 201 ++ ...txt => tungstenite-0.30.0-LICENSE-MIT.txt} | 0 ...t => typed-path-0.12.3-LICENSE-APACHE.txt} | 0 ....txt => typed-path-0.12.3-LICENSE-MIT.txt} | 0 .../Rust/unicase-2.10.0-LICENSE-APACHE.txt | 201 ++ ...MIT.txt => unicase-2.10.0-LICENSE-MIT.txt} | 0 ...> unicode-ident-1.0.27-LICENSE-APACHE.txt} | 0 ...t => unicode-ident-1.0.27-LICENSE-MIT.txt} | 2 - ... unicode-ident-1.0.27-LICENSE-UNICODE.txt} | 0 ...de-normalization-0.1.26-LICENSE-APACHE.txt | 201 ++ ...code-normalization-0.1.26-LICENSE-MIT.txt} | 0 ...e-normalization-0.1.26-LICENSE-UNICODE.txt | 39 + .../Rust/universal-hash-0.5.1-LICENSE-MIT.txt | 25 - .../universal-hash-0.6.1-LICENSE-APACHE.txt | 201 ++ .../Rust/universal-hash-0.6.1-LICENSE-MIT.txt | 25 + .../Rust/uuid-1.28.0-LICENSE-APACHE.txt | 201 ++ ...SE-MIT.txt => uuid-1.28.0-LICENSE-MIT.txt} | 0 ...3.1-LICENSE.txt => want-0.3.2-LICENSE.txt} | 0 ...ENSE.txt => yoke-derive-0.8.4-LICENSE.txt} | 0 ...txt => zerocopy-0.8.63-LICENSE-APACHE.txt} | 0 ...SD.txt => zerocopy-0.8.63-LICENSE-BSD.txt} | 0 ...IT.txt => zerocopy-0.8.63-LICENSE-MIT.txt} | 0 ....txt => zerofrom-derive-0.1.8-LICENSE.txt} | 0 .../Rust/zeroize-1.9.1-LICENSE-APACHE.txt | 202 ++ ...-MIT.txt => zeroize-1.9.1-LICENSE-MIT.txt} | 0 ....4.2-LICENSE.txt => zip-9.0.5-LICENSE.txt} | 3 - ...-ZLIB.md.txt => zlib-rs-0.6.8-LICENSE.txt} | 9 +- ...3-COPYING.txt => zopfli-0.8.4-COPYING.txt} | 0 .../Licenses/Rust/zstd-0.13.3-LICENSE.txt | 8 - ....0-LICENSE.txt => zstd-0.14.3-LICENSE.txt} | 0 ...ICENSE.txt => zstd-safe-8.2.0-LICENSE.txt} | 0 ...2.1.2+zstd.1.5.7-LICENSE.BSD-3-Clause.txt} | 0 .../zstd-sys-2.1.2+zstd.1.5.7-LICENSE.txt | 28 + .../Resources/Licenses/SPDX-Apache-2.0.txt | 73 + .../ios/Resources/Licenses/SPDX-MIT.txt | 18 + .../ios/Resources/LocalizationSources.json | 36 +- openless-all/ios/docs/TODO-20261020.md | 59 - .../ios/docs/architecture-and-processing.md | 63 - openless-all/ios/docs/asr.md | 48 - .../ios/docs/continuation-checkpoint.md | 111 -- openless-all/ios/docs/execution-plan.md | 118 -- .../ios/docs/input-predictions-selfcheck.md | 39 - openless-all/ios/docs/input-predictions.md | 50 - openless-all/ios/docs/ios-a1-diagnosis.md | 49 - openless-all/ios/docs/ios-build10-goals.md | 43 - openless-all/ios/docs/ios-build10-release.md | 37 - openless-all/ios/docs/ios-build11-goals.md | 32 - openless-all/ios/docs/ios-build11-release.md | 40 - openless-all/ios/docs/ios-no-jump-plan.md | 25 - .../ios/docs/ios-nojump-root-cause.md | 68 - openless-all/ios/docs/ios-ui-spec.md | 155 -- openless-all/ios/docs/keepalive.md | 85 - .../ios/docs/keyboard-environment-check.md | 42 - openless-all/ios/docs/keyboard-raw-input.md | 27 - .../ios/docs/keyboard-video-reference.md | 41 - .../ios/docs/local-speech-provenance.md | 34 - .../ios/docs/pip-hidden-coexistence.md | 33 - openless-all/ios/docs/platform-support.md | 34 - openless-all/ios/docs/product-library.md | 58 - .../ios/docs/requirements-and-todo.md | 282 --- openless-all/ios/docs/verification.md | 169 -- openless-all/ios/docs/voice-handoff-fix.md | 31 - openless-all/ios/project.yml | 12 +- openless-all/ios/scripts/bootstrap.sh | 4 +- openless-all/ios/scripts/build-core.sh | 11 +- .../ios/scripts/collect-rust-licenses.py | 25 +- openless-all/ios/scripts/package-ipa.py | 78 + .../ios/scripts/test-interface-resources.py | 3 +- openless-all/ios/scripts/test.sh | 6 +- openless-all/ios/scripts/validate-product.py | 7 + openless-all/ios/scripts/validate-project.py | 10 +- 325 files changed, 14949 insertions(+), 3067 deletions(-) create mode 100644 .github/workflows/check-ios.yml create mode 100644 openless-all/ios/.gitattributes create mode 100644 openless-all/ios/Config/Version.xcconfig delete mode 100644 openless-all/ios/Resources/Licenses/Rust/adler2-2.0.1-LICENSE-0BSD.txt rename openless-all/ios/Resources/Licenses/Rust/{aead-0.5.2-LICENSE-APACHE.txt => aead-0.6.1-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{aead-0.5.2-LICENSE-MIT.txt => aead-0.6.1-LICENSE-MIT.txt} (94%) rename openless-all/ios/Resources/Licenses/Rust/{aes-0.8.4-LICENSE-APACHE.txt => aes-0.9.3-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{opaque-debug-0.3.1-LICENSE-MIT.txt => aes-0.9.3-LICENSE-MIT.txt} (97%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/anymap3-1.1.0-COPYING.txt rename openless-all/ios/Resources/Licenses/Rust/{argon2-0.5.3-LICENSE-APACHE.txt => argon2-0.6.0-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{bzip2-sys-0.1.13+1.0.8-LICENSE-MIT.txt => argon2-0.6.0-LICENSE-MIT.txt} (94%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/array-init-2.1.0-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/array-init-2.1.0-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{blake2-0.10.6-LICENSE-APACHE.txt => base16ct-0.2.0-LICENSE-APACHE.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/base16ct-0.2.0-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{bzip2-0.4.4-LICENSE-APACHE.txt => base64-0.23.1-LICENSE-APACHE.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/base64-0.23.1-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{chacha20-0.9.1-LICENSE-APACHE.txt => blake2-0.11.0-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{blake2-0.10.6-LICENSE-MIT.txt => blake2-0.11.0-LICENSE-MIT.txt} (95%) rename openless-all/ios/Resources/Licenses/Rust/{chacha20poly1305-0.10.1-LICENSE-APACHE.txt => block-buffer-0.12.1-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{argon2-0.5.3-LICENSE-MIT.txt => block-buffer-0.12.1-LICENSE-MIT.txt} (94%) delete mode 100644 openless-all/ios/Resources/Licenses/Rust/byteorder-1.5.0-COPYING.txt delete mode 100644 openless-all/ios/Resources/Licenses/Rust/byteorder-1.5.0-UNLICENSE.txt rename openless-all/ios/Resources/Licenses/Rust/{bzip2-0.5.2-LICENSE-APACHE.txt => bzip2-0.6.1-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{bzip2-0.5.2-LICENSE-MIT.txt => bzip2-0.6.1-LICENSE-MIT.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{bzip2-sys-0.1.13+1.0.8-LICENSE-APACHE.txt => cc-1.9.0-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{bzip2-0.4.4-LICENSE-MIT.txt => cc-1.9.0-LICENSE-MIT.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{cc-1.4.5-LICENSE-APACHE.txt => cfg-if-1.0.5-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{cc-1.4.5-LICENSE-MIT.txt => cfg-if-1.0.5-LICENSE-MIT.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{cipher-0.4.4-LICENSE-APACHE.txt => chacha20poly1305-0.11.0-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{chacha20-0.9.1-LICENSE-MIT.txt => chacha20poly1305-0.11.0-LICENSE-MIT.txt} (94%) rename openless-all/ios/Resources/Licenses/Rust/{inout-0.1.4-LICENSE-APACHE.txt => cipher-0.5.2-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{cipher-0.4.4-LICENSE-MIT.txt => cipher-0.5.2-LICENSE-MIT.txt} (95%) rename openless-all/ios/Resources/Licenses/Rust/{lru-slab-0.1.2-LICENSE-APACHE.txt => cmov-0.5.4-LICENSE-APACHE.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/cmov-0.5.4-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{md-5-0.10.6-LICENSE-APACHE.txt => const-oid-0.10.2-LICENSE-APACHE.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/const-oid-0.10.2-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{opaque-debug-0.3.1-LICENSE-APACHE.txt => const-oid-0.9.6-LICENSE-APACHE.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/const-oid-0.9.6-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{constant_time_eq-0.3.1-LICENSE-APACHE.txt => constant_time_eq-0.6.1-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{constant_time_eq-0.3.1-LICENSE-CC0.txt => constant_time_eq-0.6.1-LICENSE-CC0.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{constant_time_eq-0.3.1-LICENSE-MIT0.txt => constant_time_eq-0.6.1-LICENSE-MIT0.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{password-hash-0.5.0-LICENSE-APACHE.txt => cpubits-0.1.1-LICENSE-APACHE.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/cpubits-0.1.1-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{pbkdf2-0.12.2-LICENSE-APACHE.txt => cpufeatures-0.3.1-LICENSE-APACHE.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/cpufeatures-0.3.1-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{crc32fast-1.5.1-LICENSE-APACHE.txt => crc32fast-1.5.2-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{crc32fast-1.5.1-LICENSE-MIT.txt => crc32fast-1.5.2-LICENSE-MIT.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{poly1305-0.8.0-LICENSE-APACHE.txt => crypto-bigint-0.5.5-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{chacha20poly1305-0.10.1-LICENSE-MIT.txt => crypto-bigint-0.5.5-LICENSE-MIT.txt} (95%) rename openless-all/ios/Resources/Licenses/Rust/{sha1-0.10.7-LICENSE-APACHE.txt => crypto-common-0.2.2-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{aes-0.8.4-LICENSE-MIT.txt => crypto-common-0.2.2-LICENSE-MIT.txt} (95%) rename openless-all/ios/Resources/Licenses/Rust/{tinyvec-1.13.2-LICENSE-APACHE.md.txt => ctutils-0.4.3-LICENSE-APACHE.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/ctutils-0.4.3-LICENSE-MIT.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/curve25519-dalek-4.1.3-LICENSE.txt rename openless-all/ios/Resources/Licenses/Rust/{universal-hash-0.5.1-LICENSE-APACHE.txt => der-0.7.10-LICENSE-APACHE.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/der-0.7.10-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{deranged-0.5.8-LICENSE-Apache.txt => deranged-0.5.9-LICENSE-Apache.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{deranged-0.5.8-LICENSE-MIT.txt => deranged-0.5.9-LICENSE-MIT.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{getrandom-0.3.4-LICENSE-APACHE.txt => digest-0.11.3-LICENSE-APACHE.txt} (99%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/digest-0.11.3-LICENSE-MIT.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/easyfft-0.4.2-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/easyfft-0.4.2-LICENSE-MIT.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/ecdsa-0.16.9-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/ecdsa-0.16.9-LICENSE-MIT.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/ed25519-2.2.3-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/ed25519-2.2.3-LICENSE-MIT.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/ed25519-dalek-2.2.0-LICENSE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/elliptic-curve-0.13.8-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/elliptic-curve-0.13.8-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{cfg-if-1.0.4-LICENSE-APACHE.txt => equivalent-1.0.3-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{equivalent-1.0.2-LICENSE-MIT.txt => equivalent-1.0.3-LICENSE-MIT.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/ferrous-opencc-0.4.0-UPSTREAM-NOTICE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/ferrous-opencc-compiler-0.4.0-UPSTREAM-NOTICE.txt rename openless-all/ios/Resources/Licenses/Rust/{adler2-2.0.1-LICENSE-APACHE.txt => ff-0.13.1-LICENSE-APACHE.txt} (98%) rename openless-all/ios/Resources/Licenses/Rust/{byteorder-1.5.0-LICENSE-MIT.txt => ff-0.13.1-LICENSE-MIT.txt} (96%) rename openless-all/ios/Resources/Licenses/Rust/{equivalent-1.0.2-LICENSE-APACHE.txt => find-msvc-tools-0.1.15-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{cfg-if-1.0.4-LICENSE-MIT.txt => find-msvc-tools-0.1.15-LICENSE-MIT.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/generic_singleton-0.5.3-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/generic_singleton-0.5.3-LICENSE-MIT.txt delete mode 100644 openless-all/ios/Resources/Licenses/Rust/getrandom-0.3.4-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{find-msvc-tools-0.1.12-LICENSE-APACHE.txt => group-0.13.0-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{adler2-2.0.1-LICENSE-MIT.txt => group-0.13.0-LICENSE-MIT.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/hex-0.4.3-LICENSE-APACHE.txt rename openless-all/ios/Resources/Licenses/Rust/{miniz_oxide-0.9.1-LICENSE-MIT.md.txt => hex-0.4.3-LICENSE-MIT.txt} (84%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/hkdf-0.12.4-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/hkdf-0.12.4-LICENSE-MIT.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/hmac-0.13.0-LICENSE-APACHE.txt rename openless-all/ios/Resources/Licenses/Rust/{lzma-sys-0.1.20-LICENSE-MIT.txt => hmac-0.13.0-LICENSE-MIT.txt} (96%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/hybrid-array-0.4.15-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/hybrid-array-0.4.15-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{hyper-1.11.1-LICENSE.txt => hyper-1.12.0-LICENSE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{hyper-rustls-0.27.9-LICENSE-APACHE.txt => hyper-rustls-0.27.10-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{hyper-rustls-0.27.9-LICENSE-ISC.txt => hyper-rustls-0.27.10-LICENSE-ISC.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{hyper-rustls-0.27.9-LICENSE-MIT.txt => hyper-rustls-0.27.10-LICENSE-MIT.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{hyper-util-0.1.20-LICENSE.txt => hyper-util-0.1.21-LICENSE.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/inout-0.2.5-LICENSE-APACHE.txt rename openless-all/ios/Resources/Licenses/Rust/{inout-0.1.4-LICENSE-MIT.txt => inout-0.2.5-LICENSE-MIT.txt} (94%) rename openless-all/ios/Resources/Licenses/Rust/{lzma-rs-0.3.0-LICENSE.txt => jsonwebtoken-11.1.0-LICENSE.txt} (94%) rename openless-all/ios/Resources/Licenses/Rust/{lzma-sys-0.1.20-LICENSE-APACHE.txt => lazy_static-1.5.1-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{rustix-1.1.4-LICENSE-MIT.txt => lazy_static-1.5.1-LICENSE-MIT.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/libbz2-rs-sys-0.2.5-LICENSE.txt rename openless-all/ios/Resources/Licenses/Rust/{libc-0.2.189-LICENSE-APACHE.txt => libc-0.2.191-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{libc-0.2.189-LICENSE-MIT.txt => libc-0.2.191-LICENSE-MIT.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/libm-0.2.16-LICENSE.txt.txt rename openless-all/ios/Resources/Licenses/Rust/{zeroize-1.9.0-LICENSE-APACHE.txt => lru-slab-0.1.3-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{lru-slab-0.1.2-LICENSE-MIT.txt => lru-slab-0.1.3-LICENSE-MIT.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{lru-slab-0.1.2-LICENSE-ZLIB.txt => lru-slab-0.1.3-LICENSE-ZLIB.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{miniz_oxide-0.9.1-LICENSE-APACHE.md.txt => lzma-rust2-0.22.0-LICENSE.txt} (89%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/md-5-0.11.0-LICENSE-APACHE.txt rename openless-all/ios/Resources/Licenses/Rust/{md-5-0.10.6-LICENSE-MIT.txt => md-5-0.11.0-LICENSE-MIT.txt} (95%) rename openless-all/ios/Resources/Licenses/Rust/{tinyvec_macros-0.1.1-LICENSE-MIT.md.txt => micyou-dsp-0.1.0-LICENSE-AEC7.txt.txt} (97%) rename openless-all/ios/Resources/Licenses/Rust/{crc-3.4.0-LICENSE-MIT.txt => micyou-dsp-0.1.0-LICENSE-PureVox.txt.txt} (96%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/micyou-dsp-0.1.0-LICENSE-RNNoise.txt.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/micyou-dsp-0.1.0-LICENSE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/micyou-infer-0.1.0-LICENSE.txt delete mode 100644 openless-all/ios/Resources/Licenses/Rust/miniz_oxide-0.9.1-LICENSE-ZLIB.md.txt delete mode 100644 openless-all/ios/Resources/Licenses/Rust/miniz_oxide-0.9.1-LICENSE.txt rename openless-all/ios/Resources/Licenses/Rust/{mio-1.2.3-LICENSE.txt => mio-1.2.4-LICENSE.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/nnnoiseless-0.5.2-COPYING.txt rename openless-all/ios/Resources/Licenses/Rust/{rustix-1.1.4-LICENSE-APACHE.txt => num-bigint-dig-0.8.6-LICENSE-APACHE.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/num-bigint-dig-0.8.6-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{rustls-0.23.44-LICENSE-APACHE.txt => num-complex-0.4.6-LICENSE-APACHE.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/num-complex-0.4.6-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{smallvec-1.16.0-LICENSE-APACHE.txt => num-integer-0.1.47-LICENSE-APACHE.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/num-integer-0.1.47-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{tungstenite-0.24.0-LICENSE-APACHE.txt => num-iter-0.1.46-LICENSE-APACHE.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/num-iter-0.1.46-LICENSE-MIT.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/p256-0.13.2-LICENSE-APACHE.txt rename openless-all/ios/Resources/Licenses/Rust/{password-hash-0.5.0-LICENSE-MIT.txt => p256-0.13.2-LICENSE-MIT.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/p384-0.13.1-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/p384-0.13.1-LICENSE-MIT.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/password-hash-0.6.1-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/password-hash-0.6.1-LICENSE-MIT.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/pbkdf2-0.13.0-LICENSE-APACHE.txt rename openless-all/ios/Resources/Licenses/Rust/{pbkdf2-0.12.2-LICENSE-MIT.txt => pbkdf2-0.13.0-LICENSE-MIT.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/pem-rfc7468-0.7.0-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/pem-rfc7468-0.7.0-LICENSE-MIT.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/phc-0.6.1-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/phc-0.6.1-LICENSE-MIT.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/pkcs1-0.7.5-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/pkcs1-0.7.5-LICENSE-MIT.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/pkcs8-0.10.2-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/pkcs8-0.10.2-LICENSE-MIT.txt delete mode 100644 openless-all/ios/Resources/Licenses/Rust/poly1305-0.8.0-LICENSE-MIT.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/poly1305-0.9.1-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/poly1305-0.9.1-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{powerfmt-0.2.0-LICENSE-Apache.txt => powerfmt-0.2.1-LICENSE-Apache.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{powerfmt-0.2.0-LICENSE-MIT.txt => powerfmt-0.2.1-LICENSE-MIT.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/ppmd-rust-1.5.1-LICENSE-CC0.md.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/ppmd-rust-1.5.1-LICENSE-MIT-0.md.txt rename openless-all/ios/Resources/Licenses/Rust/{unicase-2.9.0-LICENSE-APACHE.txt => primal-check-0.3.4-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{xz2-0.1.7-LICENSE-MIT.txt => primal-check-0.3.4-LICENSE-MIT.txt} (94%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/primeorder-0.13.6-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/primeorder-0.13.6-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{quinn-0.11.11-LICENSE-APACHE.txt => quinn-0.11.12-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{quinn-0.11.11-LICENSE-MIT.txt => quinn-0.11.12-LICENSE-MIT.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{quinn-proto-0.11.17-LICENSE-APACHE.txt => quinn-proto-0.11.19-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{quinn-proto-0.11.17-LICENSE-MIT.txt => quinn-proto-0.11.19-LICENSE-MIT.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{quinn-udp-0.5.15-LICENSE-APACHE.txt => quinn-udp-0.5.16-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{quinn-udp-0.5.15-LICENSE-MIT.txt => quinn-udp-0.5.16-LICENSE-MIT.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{rand-0.10.2-LICENSE-APACHE.txt => rand-0.10.3-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{rand-0.10.2-LICENSE-MIT.txt => rand-0.10.3-LICENSE-MIT.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/realfft-3.5.0-UPSTREAM-NOTICE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/rfc6979-0.4.0-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/rfc6979-0.4.0-LICENSE-MIT.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/rsa-0.9.10-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/rsa-0.9.10-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{unicode-normalization-0.1.25-LICENSE-APACHE.txt => rustc_version-0.4.1-LICENSE-APACHE.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/rustc_version-0.4.1-LICENSE-MIT.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/rustfft-6.4.1-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/rustfft-6.4.1-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{uuid-1.26.1-LICENSE-APACHE.txt => rustix-1.1.5-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{rustix-1.1.4-LICENSE-Apache-2.0_WITH_LLVM-exception.txt => rustix-1.1.5-LICENSE-Apache-2.0_WITH_LLVM-exception.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{serde_json-1.0.151-LICENSE-MIT.txt => rustix-1.1.5-LICENSE-MIT.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{xz2-0.1.7-LICENSE-APACHE.txt => rustls-0.23.46-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{rustls-0.23.44-LICENSE-ISC.txt => rustls-0.23.46-LICENSE-ISC.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{rustls-0.23.44-LICENSE-MIT.txt => rustls-0.23.46-LICENSE-MIT.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{serde_json-1.0.151-LICENSE-APACHE.txt => rustversion-1.0.23-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{syn-3.0.5-LICENSE-MIT.txt => rustversion-1.0.23-LICENSE-MIT.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/sec1-0.7.3-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/sec1-0.7.3-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{syn-3.0.5-LICENSE-APACHE.txt => semver-1.0.28-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{thiserror-1.0.69-LICENSE-MIT.txt => semver-1.0.28-LICENSE-MIT.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{thiserror-1.0.69-LICENSE-APACHE.txt => serde_json-1.0.154-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{thiserror-2.0.20-LICENSE-MIT.txt => serde_json-1.0.154-LICENSE-MIT.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/sha1-0.11.0-LICENSE-APACHE.txt rename openless-all/ios/Resources/Licenses/Rust/{sha1-0.10.7-LICENSE-MIT.txt => sha1-0.11.0-LICENSE-MIT.txt} (95%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/sha2-0.11.1-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/sha2-0.11.1-LICENSE-MIT.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/signature-2.2.0-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/signature-2.2.0-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{siphasher-1.0.3-COPYING.txt => siphasher-1.0.4-COPYING.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{tinyvec_macros-0.1.1-LICENSE-APACHE.md.txt => siphasher-1.0.4-LICENSE-APACHE.txt} (99%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/siphasher-1.0.4-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{crc-3.4.0-LICENSE-APACHE.txt => smallvec-1.16.3-LICENSE-APACHE.txt} (99%) rename openless-all/ios/Resources/Licenses/Rust/{smallvec-1.16.0-LICENSE-MIT.txt => smallvec-1.16.3-LICENSE-MIT.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/spin-0.9.9-LICENSE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/spki-0.7.3-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/spki-0.7.3-LICENSE-MIT.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/strength_reduce-0.2.4-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/strength_reduce-0.2.4-LICENSE-MIT.txt rename openless-all/ios/Resources/Licenses/Rust/{thiserror-2.0.20-LICENSE-APACHE.txt => syn-3.0.9-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{thiserror-impl-1.0.69-LICENSE-MIT.txt => syn-3.0.9-LICENSE-MIT.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{synstructure-0.13.2-LICENSE.txt => synstructure-0.14.0-LICENSE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{thiserror-impl-1.0.69-LICENSE-APACHE.txt => thiserror-2.0.21-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{thiserror-impl-2.0.20-LICENSE-MIT.txt => thiserror-2.0.21-LICENSE-MIT.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{thiserror-impl-2.0.20-LICENSE-APACHE.txt => thiserror-impl-2.0.21-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{unicode-ident-1.0.24-LICENSE-MIT.txt => thiserror-impl-2.0.21-LICENSE-MIT.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/tinyvec-1.13.3-LICENSE-APACHE.md.txt rename openless-all/ios/Resources/Licenses/Rust/{tinyvec-1.13.2-LICENSE-MIT.md.txt => tinyvec-1.13.3-LICENSE-MIT.md.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{tinyvec-1.13.2-LICENSE-ZLIB.md.txt => tinyvec-1.13.3-LICENSE-ZLIB.md.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{tokio-1.53.1-LICENSE.txt => tokio-1.53.3-LICENSE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{tokio-rustls-0.26.5-LICENSE-APACHE.txt => tokio-rustls-0.26.6-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{tokio-rustls-0.26.5-LICENSE-MIT.txt => tokio-rustls-0.26.6-LICENSE-MIT.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{tokio-tungstenite-0.24.0-LICENSE.txt => tokio-tungstenite-0.30.0-LICENSE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{tokio-util-0.7.19-LICENSE.txt => tokio-util-0.7.20-LICENSE.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/transpose-0.2.3-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/transpose-0.2.3-LICENSE-MIT.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/tungstenite-0.30.0-LICENSE-APACHE.txt rename openless-all/ios/Resources/Licenses/Rust/{tungstenite-0.24.0-LICENSE-MIT.txt => tungstenite-0.30.0-LICENSE-MIT.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{unicode-ident-1.0.24-LICENSE-APACHE.txt => typed-path-0.12.3-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{utf-8-0.7.6-LICENSE-MIT.txt => typed-path-0.12.3-LICENSE-MIT.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/unicase-2.10.0-LICENSE-APACHE.txt rename openless-all/ios/Resources/Licenses/Rust/{unicase-2.9.0-LICENSE-MIT.txt => unicase-2.10.0-LICENSE-MIT.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{utf-8-0.7.6-LICENSE-APACHE.txt => unicode-ident-1.0.27-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{find-msvc-tools-0.1.12-LICENSE-MIT.txt => unicode-ident-1.0.27-LICENSE-MIT.txt} (96%) rename openless-all/ios/Resources/Licenses/Rust/{unicode-ident-1.0.24-LICENSE-UNICODE.txt => unicode-ident-1.0.27-LICENSE-UNICODE.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/unicode-normalization-0.1.26-LICENSE-APACHE.txt rename openless-all/ios/Resources/Licenses/Rust/{unicode-normalization-0.1.25-LICENSE-MIT.txt => unicode-normalization-0.1.26-LICENSE-MIT.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/unicode-normalization-0.1.26-LICENSE-UNICODE.txt delete mode 100644 openless-all/ios/Resources/Licenses/Rust/universal-hash-0.5.1-LICENSE-MIT.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/universal-hash-0.6.1-LICENSE-APACHE.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/universal-hash-0.6.1-LICENSE-MIT.txt create mode 100644 openless-all/ios/Resources/Licenses/Rust/uuid-1.28.0-LICENSE-APACHE.txt rename openless-all/ios/Resources/Licenses/Rust/{uuid-1.26.1-LICENSE-MIT.txt => uuid-1.28.0-LICENSE-MIT.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{want-0.3.1-LICENSE.txt => want-0.3.2-LICENSE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{yoke-derive-0.8.2-LICENSE.txt => yoke-derive-0.8.4-LICENSE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{zerocopy-0.8.57-LICENSE-APACHE.txt => zerocopy-0.8.63-LICENSE-APACHE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{zerocopy-0.8.57-LICENSE-BSD.txt => zerocopy-0.8.63-LICENSE-BSD.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{zerocopy-0.8.57-LICENSE-MIT.txt => zerocopy-0.8.63-LICENSE-MIT.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{zerofrom-derive-0.1.7-LICENSE.txt => zerofrom-derive-0.1.8-LICENSE.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/zeroize-1.9.1-LICENSE-APACHE.txt rename openless-all/ios/Resources/Licenses/Rust/{zeroize-1.9.0-LICENSE-MIT.txt => zeroize-1.9.1-LICENSE-MIT.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{zip-2.4.2-LICENSE.txt => zip-9.0.5-LICENSE.txt} (89%) rename openless-all/ios/Resources/Licenses/Rust/{tinyvec_macros-0.1.1-LICENSE-ZLIB.md.txt => zlib-rs-0.6.8-LICENSE.txt} (86%) rename openless-all/ios/Resources/Licenses/Rust/{zopfli-0.8.3-COPYING.txt => zopfli-0.8.4-COPYING.txt} (100%) delete mode 100644 openless-all/ios/Resources/Licenses/Rust/zstd-0.13.3-LICENSE.txt rename openless-all/ios/Resources/Licenses/Rust/{zstd-safe-7.3.0-LICENSE.txt => zstd-0.14.3-LICENSE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{zstd-sys-2.1.0+zstd.1.5.7-LICENSE.txt => zstd-safe-8.2.0-LICENSE.txt} (100%) rename openless-all/ios/Resources/Licenses/Rust/{zstd-sys-2.1.0+zstd.1.5.7-LICENSE.BSD-3-Clause.txt => zstd-sys-2.1.2+zstd.1.5.7-LICENSE.BSD-3-Clause.txt} (100%) create mode 100644 openless-all/ios/Resources/Licenses/Rust/zstd-sys-2.1.2+zstd.1.5.7-LICENSE.txt create mode 100644 openless-all/ios/Resources/Licenses/SPDX-Apache-2.0.txt create mode 100644 openless-all/ios/Resources/Licenses/SPDX-MIT.txt delete mode 100644 openless-all/ios/docs/TODO-20261020.md delete mode 100644 openless-all/ios/docs/architecture-and-processing.md delete mode 100644 openless-all/ios/docs/asr.md delete mode 100644 openless-all/ios/docs/continuation-checkpoint.md delete mode 100644 openless-all/ios/docs/execution-plan.md delete mode 100644 openless-all/ios/docs/input-predictions-selfcheck.md delete mode 100644 openless-all/ios/docs/input-predictions.md delete mode 100644 openless-all/ios/docs/ios-a1-diagnosis.md delete mode 100644 openless-all/ios/docs/ios-build10-goals.md delete mode 100644 openless-all/ios/docs/ios-build10-release.md delete mode 100644 openless-all/ios/docs/ios-build11-goals.md delete mode 100644 openless-all/ios/docs/ios-build11-release.md delete mode 100644 openless-all/ios/docs/ios-no-jump-plan.md delete mode 100644 openless-all/ios/docs/ios-nojump-root-cause.md delete mode 100644 openless-all/ios/docs/ios-ui-spec.md delete mode 100644 openless-all/ios/docs/keepalive.md delete mode 100644 openless-all/ios/docs/keyboard-environment-check.md delete mode 100644 openless-all/ios/docs/keyboard-raw-input.md delete mode 100644 openless-all/ios/docs/keyboard-video-reference.md delete mode 100644 openless-all/ios/docs/local-speech-provenance.md delete mode 100644 openless-all/ios/docs/pip-hidden-coexistence.md delete mode 100644 openless-all/ios/docs/platform-support.md delete mode 100644 openless-all/ios/docs/product-library.md delete mode 100644 openless-all/ios/docs/requirements-and-todo.md delete mode 100644 openless-all/ios/docs/verification.md delete mode 100644 openless-all/ios/docs/voice-handoff-fix.md create mode 100644 openless-all/ios/scripts/package-ipa.py diff --git a/.github/workflows/check-ios.yml b/.github/workflows/check-ios.yml new file mode 100644 index 000000000..4446eb563 --- /dev/null +++ b/.github/workflows/check-ios.yml @@ -0,0 +1,33 @@ +name: iOS source checks + +on: + pull_request: + paths: + - 'openless-all/ios/**' + - 'openless-all/app/crates/openless-core/**' + - '.github/workflows/check-ios.yml' + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: ios-checks-${{ github.ref }} + cancel-in-progress: true + +jobs: + test: + runs-on: macos-latest + timeout-minutes: 30 + env: + CARGO_PROFILE_DEV_DEBUG: 0 + CARGO_PROFILE_TEST_DEBUG: 0 + steps: + - uses: actions/checkout@v6 + - uses: dtolnay/rust-toolchain@1.99.0 + - name: Test shared keyboard contracts + run: swift test --package-path openless-all/ios/Packages/OpenLessShared + - name: Test the iOS Core host + run: cargo test --manifest-path openless-all/ios/CoreHost/Cargo.toml --locked + - name: Validate interface resources + run: python3 openless-all/ios/scripts/test-interface-resources.py diff --git a/README.md b/README.md index 5cbd52f3f..a80e238a1 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,8 @@ OpenLess is a cross-platform (macOS and Windows) voice-input application — a fully open-source alternative to commercial tools such as [Typeless](https://www.typeless.com/), [Wispr Flow](https://wisprflow.ai), [Lazy](https://heylazy.com), and Superwhisper. Official site: [openless.top](https://openless.top). +The native [iOS app and keyboard](openless-all/ios/README.md) are maintained in `openless-all/ios/`, with Chinese/English typing, voice-focused and hold-space input modes, and speech translation. See the iOS guide for source builds and personal signing. + Place your cursor in any text field — ChatGPT, Claude, Cursor, Notion, an email draft, a chat box — press a single global hotkey, and speak. OpenLess records the audio, transcribes it, polishes the text in the mode you selected, and inserts the result at the cursor. If insertion is blocked, the text is copied to the clipboard instead, so nothing you said is lost. Unlike dictation tools that simply emit a word-for-word transcript, OpenLess's headline capability is its **AI-prompt mode**: you speak freely, and it adds structure, captures your constraints, and produces a context-rich prompt that you can paste directly into ChatGPT, Claude, or Cursor. diff --git a/README.zh.md b/README.zh.md index 2bc8e2245..10215d759 100644 --- a/README.zh.md +++ b/README.zh.md @@ -111,6 +111,8 @@ OpenLess 是一款跨平台(macOS 与 Windows)语音输入应用,是 [Typeless](https://www.typeless.com/)、[Wispr Flow](https://wisprflow.ai)、[Lazy](https://heylazy.com)、Superwhisper 等商业工具的完全开源替代品。官网:[openless.top](https://openless.top)。 +原生 [iOS 应用与输入法](openless-all/ios/README.md) 位于 `openless-all/ios/`,支持中英文打字、语音优先与长按空格输入两种模式,以及语音翻译。源码构建和个人签名方式见 iOS 工程说明。 + 把光标放在任意文本框中——ChatGPT、Claude、Cursor、Notion、邮件草稿、聊天框——按下一个全局快捷键,然后开口说话。OpenLess 会录音、转写,按你选定的模式润色文本,并将结果插入到光标处。如果插入被阻止,文本会改为复制到剪贴板,你说过的话不会丢失。 与只产出逐字转写稿的听写工具不同,OpenLess 的核心能力是 **AI Prompt 模式**:你自由地说,它来补充结构、整理你的约束条件,生成一段包含上下文的提示词,可直接粘贴进 ChatGPT、Claude 或 Cursor。 diff --git a/docs/structure.md b/docs/structure.md index 653f820fd..9c7c7c504 100644 --- a/docs/structure.md +++ b/docs/structure.md @@ -15,6 +15,7 @@ openless-src/ Git 仓库、分支与发布边界 ├── scripts/ 仓库级辅助脚本(版本号同步等) └── openless-all/ ├── README.md 全平台总览 + ├── ios/ 原生 iPhone App、键盘扩展与录音组件 └── app/ npm 与 Core/Linux Cargo 工作目录 ├── src/ React / TypeScript 界面 ├── crates/openless-core/ 共享业务 Rust crate @@ -48,6 +49,7 @@ openless-src/ Git 仓库、分支与发布边界 | Tauri 组装与系统能力 | `src-tauri/src/coordinator.rs`、`core_adapters.rs`、`tauri_coordinator_host.rs` | 窗口、热键、权限、平台输入与生命周期 | | Linux 原生接入 | `linux-egui/src/main.rs`、`lib.rs`、`backend.rs` | `audio/credentials/fcitx5/hotkeys/settings` 等 Host 模块;见 [交接](linux-egui-handoff/README.md) | | Android 集成 | `android/`、`src-tauri/src/android/` | `@android` 别名与 `merge-android-*.mjs` 生成链 | +| iOS 应用与输入法 | `../ios/App/`、`../ios/Keyboard/`、`../ios/RecordingWidget/` | SwiftUI/UIKit 界面、独立 Rust Host、共享版本配置;见 [iOS 工程](../openless-all/ios/README.md) | | Windows 输入法 | `windows-ime/`、`src-tauri/src/windows_ime_*.rs` | 原生工程、IPC 协议、目标应用和安装检查 | Core 其余模块按领域列于 [架构模块地图](architecture.md)。平台缺口、事件签名与验收项由专项文档维护,本文件只提供定位。 diff --git a/openless-all/README.md b/openless-all/README.md index 893675bd0..5a52567b5 100644 --- a/openless-all/README.md +++ b/openless-all/README.md @@ -2,6 +2,10 @@ This directory contains the cross-platform OpenLess application. Start with the repository [documentation index](../docs/index.md), [architecture](../docs/architecture.md), and [source structure](../docs/structure.md). +## Native iOS app and keyboard + +[`ios/`](ios/README.md) contains the native iPhone app, Chinese/English keyboard extension, and recording widget. Settings offer a voice-focused layout or a single keyboard with hold-space dictation, translation, and send/cancel gestures. The app and keyboard target iOS 16; the recording widget requires iOS 18. The iOS guide covers the shared version configuration, input engines, source build, signing, and unsigned IPA packaging. + ## App Directory The runnable sources live in `app/`: diff --git a/openless-all/app/crates/openless-core/src/api.rs b/openless-all/app/crates/openless-core/src/api.rs index ab3a2a084..ffe54b989 100644 --- a/openless-all/app/crates/openless-core/src/api.rs +++ b/openless-all/app/crates/openless-core/src/api.rs @@ -6589,6 +6589,146 @@ impl OpenLessBackend { self.preferences.get() } + /// Replace the ordered target choices. Removing the selection chooses the first + /// remaining target; an empty list clears/disables the legacy selected target. + pub fn set_translation_targets( + &self, + targets: Vec, + ) -> Result { + self.update_translation_targets(|preferences| { + preferences.translation_target_languages = targets; + let targets = crate::settings::ordered_translation_targets( + preferences.translation_target_languages.clone(), + ); + if !targets.contains(&preferences.translation_target_language) { + preferences.translation_target_language = + targets.first().cloned().unwrap_or_default(); + } + Ok(()) + }) + } + + /// Add a catalog target once, at the end. The first addition becomes selected. + pub fn add_translation_target( + &self, + target: String, + ) -> Result { + self.update_translation_targets(|preferences| { + let target = crate::settings::canonical_translation_target(&target); + if target.is_empty() { + return Err(BackendError::new( + BackendErrorCode::InvalidArgument, + "empty translation target", + )); + } + if preferences.translation_target_languages.is_empty() { + preferences.translation_target_language = target.clone(); + } + if !preferences.translation_target_languages.contains(&target) { + preferences.translation_target_languages.push(target); + } + Ok(()) + }) + } + + /// Deletion is idempotent. Deleting the selection chooses the first remaining target. + pub fn delete_translation_target( + &self, + target: String, + ) -> Result { + self.update_translation_targets(|preferences| { + let target = crate::settings::canonical_translation_target(&target); + preferences + .translation_target_languages + .retain(|value| value != &target); + if !target.is_empty() && preferences.translation_target_language == target { + preferences.translation_target_language = preferences + .translation_target_languages + .first() + .cloned() + .unwrap_or_default(); + } + Ok(()) + }) + } + + /// Reorder only: omissions, additions and duplicates are rejected atomically. + pub fn reorder_translation_targets( + &self, + targets: Vec, + ) -> Result { + self.update_translation_targets(|preferences| { + let ordered = crate::settings::ordered_translation_targets(targets.clone()); + if ordered.len() != targets.len() + || ordered.len() != preferences.translation_target_languages.len() + || ordered + .iter() + .any(|target| !preferences.translation_target_languages.contains(target)) + { + return Err(BackendError::new( + BackendErrorCode::InvalidArgument, + "translation target reorder must be an exact permutation", + )); + } + preferences.translation_target_languages = ordered; + Ok(()) + }) + } + + /// Select a configured target, or disable legacy translation without erasing choices. + pub fn select_translation_target( + &self, + target: Option, + ) -> Result { + self.update_translation_targets(|preferences| { + preferences.translation_target_language = match target { + Some(target) => { + crate::settings::validate_session_translation_target(preferences, &target)? + } + None => String::new(), + }; + Ok(()) + }) + } + + fn update_translation_targets( + &self, + update: impl FnOnce(&mut UserPreferences) -> Result<(), BackendError>, + ) -> Result { + self.ensure_runtime_ready()?; + let _write_guard = self + .settings_write_gate + .lock() + .unwrap_or_else(std::sync::PoisonError::into_inner); + let previous = self.preferences.get(); + let mut preferences = previous.clone(); + let (targets, selected) = crate::settings::migrate_translation_targets( + if preferences.translation_target_languages_present { + Some(preferences.translation_target_languages.clone()) + } else { + None + }, + &preferences.translation_target_language, + ); + preferences.translation_target_languages = targets; + preferences.translation_target_language = selected; + preferences.translation_target_languages_present = true; + update(&mut preferences)?; + crate::settings::reconcile_translation_settings(&previous, &mut preferences)?; + // Own only these fields, not a potentially stale whole-document snapshot. + self.preferences.update(|current| { + current.translation_target_languages = preferences.translation_target_languages.clone(); + current.translation_target_language = preferences.translation_target_language.clone(); + current.translation_target_languages_present = true; + })?; + self.publish_preferences_changed(); + Ok(crate::SettingsUpdateOutcome { + preferences: self.preferences.get(), + reconciled_hotkey_count: 0, + effects: crate::SettingsEffectPlan::default(), + }) + } + /// Consumes the "first launch of this major version" splash PV marker: /// returns false when the config's `splash_seen_version` matches the /// given current major (no replay); on mismatch it writes back the major @@ -6716,6 +6856,7 @@ impl OpenLessBackend { }; crate::sync_dictation_hotkey_legacy_fields(&mut previous); crate::sync_dictation_hotkey_legacy_fields(&mut preferences); + crate::settings::reconcile_translation_settings(&previous, &mut preferences)?; // The splash marker may only advance via take_splash_playback: when a // whole-document submit (old frontend, or a request that hasn't read // the marker back) omits the field, serde's default would write the @@ -7700,10 +7841,42 @@ impl OpenLessBackend { self.start_reserved_dictation(reservation, options).await } + /// Capture using one explicitly registered native route and the unmodified + /// built-in Raw prompt. This never selects a cloud fallback or mutates styles. + pub async fn start_local_raw_dictation( + &self, + native_provider: &str, + insert_text: bool, + ) -> Result { + let provider = crate::credentials::ProviderType::new(native_provider.to_string())?; + let options = DictationStartOptions { + insert_text, + ..Default::default() + }; + let reservation = + self.reserve_dictation_session(insert_text, options.output_target, None)?; + self.start_reserved_dictation_with_raw_provider( + reservation, + options, + Some(provider.as_str()), + ) + .await + } + async fn start_reserved_dictation( &self, reservation: DictationReservation, options: DictationStartOptions, + ) -> Result { + self.start_reserved_dictation_with_raw_provider(reservation, options, None) + .await + } + + async fn start_reserved_dictation_with_raw_provider( + &self, + reservation: DictationReservation, + options: DictationStartOptions, + raw_provider: Option<&str>, ) -> Result { let DictationReservation { session_id, @@ -7720,14 +7893,25 @@ impl OpenLessBackend { return Err(error); } } - let context = match self - .capture_dictation_context_with_host( - &options, - DictationContextPurpose::Dictation, - host_context.as_ref(), - ) - .await - { + let captured = match raw_provider { + Some(provider) => async { + let context = self.capture_local_raw_context(&options, provider)?; + // Resolve the explicit adapter before capture; this route has no fallback. + Arc::clone(&self.deps.dictation_engine) + .prepare_transcription(session_id, Arc::new(context.clone())) + .await?; + Ok(context) + }.await, + None => { + self.capture_dictation_context_with_host( + &options, + DictationContextPurpose::Dictation, + host_context.as_ref(), + ) + .await + } + }; + let context = match captured { Ok(context) => Arc::new(context), Err(error) => { self.schedule_pending_audio_capture_discard(pending_capture.take()); @@ -9177,6 +9361,36 @@ impl OpenLessBackend { } } + fn capture_local_raw_context( + &self, + options: &DictationStartOptions, + provider: &str, + ) -> Result { + let preferences = self.get_preferences(); + let hotwords = self + .vocabulary + .list()? + .into_iter() + .filter(|entry| entry.enabled) + .map(|entry| entry.phrase) + .collect(); + let style = crate::style_packs::builtin_style_pack_for_mode(crate::types::PolishMode::Raw); + let mut context = DictationContext::capture( + &preferences, + &style, + DictationProviderInvocations::new( + crate::dictation_context::ProviderInvocation::for_provider(provider), + crate::dictation_context::ProviderInvocation::for_provider("raw-unused-llm"), + crate::dictation_context::ProviderInvocation::for_provider("raw-unused-omni"), + ), + hotwords, + Vec::new(), + options, + ); + context.pipeline_mode = crate::shared_types::PipelineMode::Traditional; + Ok(context) + } + async fn capture_dictation_context( &self, options: &DictationStartOptions, @@ -9198,6 +9412,11 @@ impl OpenLessBackend { ) -> Result { let preferences = self.get_preferences(); let mut captured_options = options.clone(); + if let Some(target) = &options.translation_target_language { + captured_options.translation_target_language = Some( + crate::settings::validate_session_translation_target(&preferences, target)?, + ); + } if !preferences.cursor_context_enabled { // This switch controls document text, including text supplied by // callers. Front-application metadata is still needed for history, @@ -12189,6 +12408,285 @@ mod tests { let _ = std::fs::remove_dir_all(data_dir); } + #[test] + fn translation_targets_business_apis_persist_order_selection_and_events() { + let (backend, _) = backend(); + let mut events = backend.subscribe(); + let original = backend.get_preferences(); + let outcome = backend + .set_translation_targets(vec![ + "ja".into(), + "en".into(), + "EN".into(), + "fr".into(), + "de".into(), + ]) + .unwrap(); + assert_eq!( + outcome.preferences.translation_target_languages, + vec!["日本語", "English", "Français", "Deutsch"] + ); + assert_eq!(outcome.preferences.translation_target_language, "日本語"); + assert!(outcome.effects.is_empty()); + assert_eq!(backend.snapshot().preferences_revision, 1); + assert!(matches!( + events.try_recv().unwrap().kind, + BackendEventKind::PreferencesChanged(PreferencesChange { revision: 1 }) + )); + assert_eq!(events.try_recv(), Err(crate::events::EventRecvError::Empty)); + backend.add_translation_target("en".into()).unwrap(); + backend + .reorder_translation_targets(vec!["de".into(), "en".into(), "fr".into(), "ja".into()]) + .unwrap(); + backend + .select_translation_target(Some("fr".into())) + .unwrap(); + backend.delete_translation_target("fr".into()).unwrap(); + let preferences = backend.get_preferences(); + assert_eq!( + preferences.translation_target_languages, + vec!["Deutsch", "English", "日本語"] + ); + assert_eq!(preferences.translation_target_language, "Deutsch"); + assert_eq!( + preferences.active_llm_provider, + original.active_llm_provider + ); + assert_eq!(preferences.working_languages, original.working_languages); + let reloaded = crate::preferences::PreferencesStore::open( + backend._data_dir.path().join("preferences.json"), + ) + .unwrap() + .get(); + assert_eq!( + reloaded.translation_target_languages, + preferences.translation_target_languages + ); + assert_eq!(reloaded.translation_target_language, "Deutsch"); + backend.select_translation_target(None).unwrap(); + backend.delete_translation_target("".into()).unwrap(); + assert!(backend + .get_preferences() + .translation_target_language + .is_empty()); + assert_eq!( + backend.get_preferences().translation_target_languages.len(), + 3 + ); + backend.set_translation_targets(vec![]).unwrap(); + assert!(backend + .get_preferences() + .translation_target_languages + .is_empty()); + assert!(backend + .get_preferences() + .translation_target_language + .is_empty()); + } + + #[test] + fn translation_targets_invalid_mutations_are_atomic() { + let (backend, _) = backend(); + backend + .set_translation_targets(vec!["en".into(), "ja".into()]) + .unwrap(); + let before = serde_json::to_value(backend.get_preferences()).unwrap(); + let revision = backend.snapshot().preferences_revision; + for result in [ + backend.add_translation_target("Unknown new language".into()), + backend.add_translation_target(" ".into()), + backend.set_translation_targets(vec!["fr".into(), "Unknown new language".into()]), + backend.reorder_translation_targets(vec!["en".into()]), + backend.reorder_translation_targets(vec!["en".into(), "EN".into()]), + backend.select_translation_target(Some("fr".into())), + ] { + assert_eq!(result.unwrap_err().code, BackendErrorCode::InvalidArgument); + assert_eq!( + serde_json::to_value(backend.get_preferences()).unwrap(), + before + ); + assert_eq!(backend.snapshot().preferences_revision, revision); + } + } + + #[test] + fn translation_targets_old_client_whole_settings_saves_preserve_choices() { + let (backend, _) = backend(); + backend + .set_translation_targets(vec!["en".into(), "ja".into()]) + .unwrap(); + for (selected, expected, targets) in [ + ("en", "English", vec!["English", "日本語"]), + ("ja", "日本語", vec!["English", "日本語"]), + ("fr", "Français", vec!["English", "日本語", "Français"]), + ("", "", vec!["English", "日本語", "Français"]), + ] { + let mut value = serde_json::to_value(backend.get_preferences()).unwrap(); + value + .as_object_mut() + .unwrap() + .remove("translationTargetLanguages"); + value["translationTargetLanguage"] = serde_json::json!(selected); + let legacy = serde_json::from_value(value).unwrap(); + let outcome = backend + .update_settings( + legacy, + crate::SettingsUpdateOptions::SETTINGS_DOCUMENT, + &crate::NoopSettingsRuntime, + ) + .unwrap(); + assert_eq!(outcome.preferences.translation_target_language, expected); + assert_eq!(outcome.preferences.translation_target_languages, targets); + } + let mut explicit = serde_json::to_value(backend.get_preferences()).unwrap(); + explicit["translationTargetLanguages"] = serde_json::json!([]); + explicit["translationTargetLanguage"] = serde_json::json!("en"); + let cleared = backend + .update_settings( + serde_json::from_value(explicit).unwrap(), + crate::SettingsUpdateOptions::SETTINGS_DOCUMENT, + &crate::NoopSettingsRuntime, + ) + .unwrap(); + assert!(cleared.preferences.translation_target_languages.is_empty()); + assert!(cleared.preferences.translation_target_language.is_empty()); + } + + #[test] + fn translation_targets_legacy_scalar_edits_survive_roundtripping_the_new_list() { + let (backend, _) = backend(); + backend + .set_translation_targets(vec!["en".into(), "ja".into()]) + .unwrap(); + // Older frontends may spread a preferences object including fields they do not edit. + let mut value = serde_json::to_value(backend.get_preferences()).unwrap(); + value["translationTargetLanguage"] = serde_json::json!("fr"); + let outcome = backend + .update_settings( + serde_json::from_value(value).unwrap(), + crate::SettingsUpdateOptions::SETTINGS_DOCUMENT, + &crate::NoopSettingsRuntime, + ) + .unwrap(); + assert_eq!(outcome.preferences.translation_target_language, "Français"); + assert_eq!( + outcome.preferences.translation_target_languages, + vec!["English", "日本語", "Français"] + ); + } + + #[test] + fn translation_targets_historical_custom_name_can_be_retained_selected_and_removed() { + let data_dir = TestDataDir::new("translation-target-historical"); + std::fs::create_dir_all(data_dir.path()).unwrap(); + // A historical file is migration input, not a new addition via the business API. + std::fs::write( + data_dir.path().join("preferences.json"), + serde_json::to_vec(&serde_json::json!({ + "translationTargetLanguage": "Historical custom language", + })) + .unwrap(), + ) + .unwrap(); + let migrated = backend_with_dictation_engine( + data_dir.path().to_path_buf(), + Arc::new(crate::testing::FixtureDictationEngine::successful( + "raw", "final", + )), + ); + migrated.add_translation_target("en".into()).unwrap(); + migrated + .reorder_translation_targets(vec!["en".into(), "Historical custom language".into()]) + .unwrap(); + migrated + .select_translation_target(Some("Historical custom language".into())) + .unwrap(); + assert_eq!( + migrated.get_preferences().translation_target_language, + "Historical custom language" + ); + migrated + .delete_translation_target("Historical custom language".into()) + .unwrap(); + assert_eq!( + migrated.get_preferences().translation_target_language, + "English" + ); + assert_eq!( + migrated + .add_translation_target("Historical custom language".into()) + .unwrap_err() + .code, + BackendErrorCode::InvalidArgument + ); + } + + #[tokio::test] + async fn translation_target_start_option_is_session_local_and_survives_settings_changes() { + let data_dir = TestDataDir::new("translation-target-session"); + let engine = crate::testing::FixtureDictationEngine::successful("raw", "final"); + let backend = + backend_with_dictation_engine(data_dir.path().to_path_buf(), Arc::new(engine.clone())); + backend.start().await.unwrap(); + backend + .set_translation_targets(vec!["en".into(), "ja".into()]) + .unwrap(); + let mut preferences = backend.get_preferences(); + preferences.working_languages = vec!["简体中文".into()]; + backend.set_preferences(preferences).unwrap(); + let revision = backend.snapshot().preferences_revision; + backend + .start_external_dictation_with_options(DictationStartOptions { + translation_requested: true, + translation_target_language: Some("ja".into()), + ..Default::default() + }) + .await + .unwrap(); + assert_eq!( + backend.get_preferences().translation_target_language, + "English" + ); + assert_eq!(backend.snapshot().preferences_revision, revision); + backend.set_translation_targets(vec!["fr".into()]).unwrap(); + backend.stop_dictation().await.unwrap(); + let contexts = engine.contexts(); + let context = contexts.last().unwrap(); + assert_eq!(context.polish.translation_target_language, "日本語"); + assert!(context.polish.translation_target_explicit); + assert!(context.polish.translation_active); + assert!(context.effective_polish_system_prompt().contains("日本語")); + assert_eq!( + backend.get_preferences().translation_target_language, + "Français" + ); + backend.shutdown().await.unwrap(); + } + + #[tokio::test] + async fn translation_target_start_option_rejects_unconfigured_or_empty_without_starting_engine() + { + let data_dir = TestDataDir::new("translation-target-invalid"); + let engine = crate::testing::FixtureDictationEngine::successful("raw", "final"); + let backend = + backend_with_dictation_engine(data_dir.path().to_path_buf(), Arc::new(engine.clone())); + backend.start().await.unwrap(); + backend.add_translation_target("en".into()).unwrap(); + for target in ["", " ", "ja", "Unknown target"] { + let error = backend + .start_external_dictation_with_options(DictationStartOptions { + translation_requested: true, + translation_target_language: Some(target.into()), + ..Default::default() + }) + .await + .unwrap_err(); + assert_eq!(error.code, BackendErrorCode::InvalidArgument); + assert!(engine.contexts().is_empty()); + } + backend.shutdown().await.unwrap(); + } + #[test] fn focused_microphone_selection_persists_and_publishes_once() { let (backend, _) = backend(); diff --git a/openless-all/app/crates/openless-core/src/auxiliary.rs b/openless-all/app/crates/openless-core/src/auxiliary.rs index 75c9c3c37..55a7de23e 100644 --- a/openless-all/app/crates/openless-core/src/auxiliary.rs +++ b/openless-all/app/crates/openless-core/src/auxiliary.rs @@ -64,7 +64,106 @@ impl RetranscriptionFailure { } } +/// A one-shot compose operation prepared before recording starts. The instruction +/// is supplied only after real ASR completes; no editor selection is accepted. +/// This auxiliary operation does not hold the global voice-session gate. Hosts +/// must retain admission across their capture and this operation, including +/// runtime restore/management probes, until completion or cancellation cleanup. +pub struct PreparedVoiceCompose { + session_id: SessionId, + context: Arc, + polisher: Arc, + task_spawner: Arc, + abort: futures_util::future::AbortHandle, + registration: std::sync::Mutex>, +} + +#[derive(Debug, Clone, serde::Serialize)] +#[serde(rename_all = "camelCase")] +pub struct VoiceComposePreview { + pub text: String, + pub provider_type: String, + pub model: Option, + pub prompt_kind: &'static str, +} + +impl PreparedVoiceCompose { + pub fn cancel(&self) { + self.abort.abort(); + let polisher = self.polisher.clone(); + let session = self.session_id; + self.task_spawner.spawn(Box::pin(async move { + let _ = polisher.cancel(session).await; + })); + } + + pub async fn compose(&self, instruction: String) -> Result { + if self.abort.is_aborted() { + return Err(BackendError::new( + BackendErrorCode::Cancelled, + "compose cancelled", + )); + } + let registration = self.registration.lock().unwrap().take().ok_or_else(|| { + BackendError::new(BackendErrorCode::InvalidState, "compose is one-shot") + })?; + if instruction.trim().is_empty() || instruction.len() > 128 * 1024 { + return Err(BackendError::new( + BackendErrorCode::InvalidArgument, + "invalid spoken instruction", + )); + } + let input = crate::prompts::voice_compose_user_prompt(&instruction, None); + let operation = self.polisher.polish( + self.session_id, + self.context.clone(), + input, + Arc::new(DiscardTextStream), + ); + let output = futures_util::future::Abortable::new(operation, registration) + .await + .map_err(|_| BackendError::new(BackendErrorCode::Cancelled, "compose cancelled"))??; + if self.abort.is_aborted() { + return Err(BackendError::new( + BackendErrorCode::Cancelled, + "compose cancelled", + )); + } + let text = + crate::selection_voice_intent::clean_selection_voice_compose_output(&output.text); + if text.is_empty() || text.len() > 128 * 1024 { + return Err(BackendError::new( + BackendErrorCode::Provider, + "invalid compose output", + )); + } + Ok(VoiceComposePreview { + text, + provider_type: self.context.llm.provider_type.clone(), + model: self.context.llm.model.clone(), + prompt_kind: "voice_compose", + }) + } +} + +impl Drop for PreparedVoiceCompose { + fn drop(&mut self) { + self.cancel(); + } +} + pub trait AuxiliaryApi: Send + Sync { + fn prepare_voice_compose( + &self, + ) -> BoxFuture<'static, Result, BackendError>> { + Box::pin(async { + Err(BackendError::new( + BackendErrorCode::Unsupported, + "voice compose is not configured", + )) + }) + } + fn repolish( &self, request: RepolishRequest, @@ -212,6 +311,62 @@ impl AuxiliaryService { } impl AuxiliaryApi for AuxiliaryService { + fn prepare_voice_compose( + &self, + ) -> BoxFuture<'static, Result, BackendError>> { + let service = self.clone_for_future(); + Box::pin(async move { + let preferences = service.preferences.get(); + let llm = crate::provider_resolution::resolve_session_provider( + &service.credential_store, + ProviderSlot::Llm, + &preferences.active_llm_provider, + ) + .await?; + let style = + crate::style_packs::builtin_style_pack_for_mode(crate::types::PolishMode::Light); + let mut context = DictationContext::capture( + &preferences, + &style, + DictationProviderInvocations::new( + ProviderInvocation::for_provider("compose-unused-asr"), + llm, + ProviderInvocation::for_provider("compose-unused-omni"), + ), + Vec::new(), + Vec::new(), + &DictationStartOptions { + insert_text: false, + ..Default::default() + }, + ); + context.pipeline_mode = crate::shared_types::PipelineMode::Traditional; + context.polish.style_system_prompt = crate::prompts::voice_compose_system_prompt(); + context.polish.translation_active = false; + context.polish.translation_target_language.clear(); + context.polish.hotwords.clear(); + context.polish.cursor_context = None; + context.polish.front_app = None; + context.polish.context_window_minutes = 0; + context.polish.prior_turns.clear(); + let context = Arc::new(context); + let polisher = service + .polisher + .prepare(context.clone()) + .await? + .unwrap_or(service.polisher); + let (abort, registration) = futures_util::future::AbortHandle::new_pair(); + Ok(Arc::new(PreparedVoiceCompose { + session_id: SessionId::new(), + context, + polisher, + task_spawner: service.task_spawner, + abort, + registration: std::sync::Mutex::new(Some(registration)), + })) + }) + } + fn repolish( &self, request: RepolishRequest, @@ -474,6 +629,50 @@ mod tests { } } + #[tokio::test] + async fn voice_compose_is_lazy_one_shot_and_cancellation_prevents_provider_start() { + let polisher = Arc::new(FixtureTextPolisher::successful("draft")); + let (service, path) = service( + polisher.clone(), + Arc::new(FixtureTranscriptionEngine::successful("unused", 0)), + ); + let prepared = service.prepare_voice_compose().await.unwrap(); + assert!(polisher.inputs().is_empty()); + let preview = prepared + .compose("Write an invitation".into()) + .await + .unwrap(); + assert_eq!(preview.text, "draft"); + assert_eq!(preview.prompt_kind, "voice_compose"); + assert_eq!( + polisher.inputs(), + vec![crate::prompts::voice_compose_user_prompt( + "Write an invitation", + None + )] + ); + assert_eq!( + prepared + .compose("second instruction".into()) + .await + .unwrap_err() + .code, + BackendErrorCode::InvalidState + ); + let cancelled = service.prepare_voice_compose().await.unwrap(); + cancelled.cancel(); + assert_eq!( + cancelled + .compose("never sent".into()) + .await + .unwrap_err() + .code, + BackendErrorCode::Cancelled + ); + assert_eq!(polisher.inputs().len(), 1); + let _ = std::fs::remove_file(path); + } + #[tokio::test] async fn untouched_builtin_raw_repolish_is_a_true_passthrough() { let (service, path) = service( diff --git a/openless-all/app/crates/openless-core/src/cloud_providers.rs b/openless-all/app/crates/openless-core/src/cloud_providers.rs index 4c38be0f5..bce7e3933 100644 --- a/openless-all/app/crates/openless-core/src/cloud_providers.rs +++ b/openless-all/app/crates/openless-core/src/cloud_providers.rs @@ -1056,7 +1056,89 @@ enum CloudPolisherProvider { Gemini(crate::llm_gemini::GeminiProvider), } +// Read-only, selected-channel request credentials. SecretValue zeroizes on drop; +// no vault reference, serialization, diagnostics or mutation survives preparation. +struct FrozenPolishCredentials(Vec<(CredentialKey, crate::SecretValue)>); +impl FrozenPolishCredentials { + fn denied() -> BoxFuture<'static, Result> { + Box::pin(async { + Err(BackendError::new( + BackendErrorCode::Unsupported, + "immutable polish credentials", + )) + }) + } +} +impl CredentialStore for FrozenPolishCredentials { + fn status( + &self, + _: crate::UserPreferences, + ) -> BoxFuture<'static, Result> { + Self::denied() + } + fn read( + &self, + key: CredentialKey, + ) -> BoxFuture<'static, Result, BackendError>> { + let value = self + .0 + .iter() + .find(|(stored, _)| stored == &key) + .map(|(_, value)| value.clone()); + Box::pin(async move { Ok(value) }) + } + fn write( + &self, + _: CredentialKey, + _: crate::SecretValue, + ) -> BoxFuture<'static, Result<(), BackendError>> { + Self::denied() + } + fn remove(&self, _: CredentialKey) -> BoxFuture<'static, Result<(), BackendError>> { + Self::denied() + } +} + impl TextPolisher for SharedCloudTextPolisher { + fn prepare( + &self, + context: Arc, + ) -> BoxFuture<'static, Result>, BackendError>> { + let credentials = self.credentials.clone(); + Box::pin(async move { + // OAuth resolves external runtime state and cannot promise an immutable + // delayed invocation through this credential-only seam. + if context.llm.provider_type == crate::polish::CODEX_OAUTH_PROVIDER_ID { + return Err(BackendError::new( + BackendErrorCode::Unsupported, + "OAuth delayed compose is unsupported", + )); + } + let mut values = Vec::new(); + for account in [ + LLM_API_KEY_ACCOUNT, + LLM_ENDPOINT_ACCOUNT, + LLM_EXTRA_HEADERS_ACCOUNT, + LLM_TEMPERATURE_ACCOUNT, + ] + .into_iter() + .chain(crate::llm_protocol::CONFIG_ACCOUNTS) + { + let key = CredentialKey::new( + CredentialNamespace::Llm, + Some(context.llm.provider_id.clone()), + account, + )?; + if let Some(value) = credentials.read(key.clone()).await? { + values.push((key, value)); + } + } + Ok(Some(Arc::new(SharedCloudTextPolisher::new(Arc::new( + FrozenPolishCredentials(values), + ))) as Arc)) + }) + } + fn polish( &self, session_id: SessionId, diff --git a/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/registry.rs b/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/registry.rs index 3b7e806c1..66a16066d 100644 --- a/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/registry.rs +++ b/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/registry.rs @@ -368,6 +368,13 @@ pub const PREFERENCE_FIELDS: &[PreferenceField] = &[ shape: PreferenceShape::TextList, reason: "portable_setting", }, + PreferenceField { + rust_name: "translation_target_languages", + key: "translationTargetLanguages", + class: PreferenceClass::Portable, + shape: PreferenceShape::TextList, + reason: "portable_setting", + }, PreferenceField { rust_name: "translation_target_language", key: "translationTargetLanguage", diff --git a/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/tests.rs b/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/tests.rs index d3d9688c0..c3c0d2ffb 100644 --- a/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/tests.rs +++ b/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/tests.rs @@ -108,6 +108,15 @@ fn all_current_preference_fields_have_an_explicit_registration() { .map(|(name, _)| name) }) .collect(); + // Wire-presence metadata is not persisted or synced. Verify the explicit + // exception against actual serialization rather than exempting new fields. + let metadata = "translation_target_languages_present"; + let mut prefs = crate::shared_types::UserPreferences::default(); + prefs.translation_target_languages_present = true; + let serialized = serde_json::to_value(prefs).unwrap(); + assert!(serialized.get("translationTargetLanguagesPresent").is_none()); + assert!(serialized.get(metadata).is_none()); + let names: std::collections::BTreeSet<_> = names.into_iter().filter(|name| *name != metadata).collect(); let registered: std::collections::BTreeSet<_> = registry::PREFERENCE_FIELDS .iter() .map(|field| field.rust_name) diff --git a/openless-all/app/crates/openless-core/src/dictation_context.rs b/openless-all/app/crates/openless-core/src/dictation_context.rs index b82b76a0e..495952a72 100644 --- a/openless-all/app/crates/openless-core/src/dictation_context.rs +++ b/openless-all/app/crates/openless-core/src/dictation_context.rs @@ -43,6 +43,9 @@ pub enum DictationOutputTarget { #[derive(Debug, Clone, PartialEq, Eq)] pub struct DictationStartOptions { pub translation_requested: bool, + /// Configured target for this session only; None uses the legacy selected target. + /// Selecting a target does not request translation or enable any provider. + pub translation_target_language: Option, pub audio_source: DictationAudioSource, pub insert_text: bool, pub output_target: DictationOutputTarget, @@ -55,6 +58,7 @@ impl Default for DictationStartOptions { fn default() -> Self { Self { translation_requested: false, + translation_target_language: None, audio_source: DictationAudioSource::Microphone, insert_text: true, output_target: DictationOutputTarget::ForegroundApp, @@ -128,6 +132,8 @@ pub struct DictationPolishContext { pub hotwords: Vec, pub working_languages: Vec, pub translation_target_language: String, + /// True when the start options explicitly selected the snapshotted target. + pub translation_target_explicit: bool, pub translation_active: bool, pub edit_plan_input: bool, /// Selected text uses its own prompt envelope, separate from voice transcripts. @@ -252,8 +258,12 @@ impl DictationContext { omni, } = providers; let hotwords = normalize_hotwords(hotwords); - let translation_target_language = - preferences.translation_target_language.trim().to_string(); + let translation_target_language = crate::settings::canonical_translation_target( + options + .translation_target_language + .as_deref() + .unwrap_or(&preferences.translation_target_language), + ); let translation_active = translation_effective( options.translation_requested, &translation_target_language, @@ -357,6 +367,7 @@ impl DictationContext { hotwords, working_languages: preferences.working_languages.clone(), translation_target_language, + translation_target_explicit: options.translation_target_language.is_some(), translation_active, edit_plan_input: false, selection_input: false, @@ -813,6 +824,56 @@ mod tests { assert_eq!(local_asr_fallback(&no_model, &cloud_asr(), true), None); } + #[test] + fn explicit_translation_target_preserves_working_language_suppression_and_raw_mode() { + let preferences = UserPreferences { + default_mode: PolishMode::Raw, + working_languages: vec!["English".into()], + translation_target_language: "日本語".into(), + ..Default::default() + }; + let capture = |requested, target| { + DictationContext::capture( + &preferences, + &builtin_style_pack_for_mode(PolishMode::Raw), + DictationProviderInvocations::new( + ProviderInvocation::for_provider("local-qwen3"), + ProviderInvocation::for_provider("original-llm"), + ProviderInvocation::for_provider("original-omni"), + ), + vec![], + vec![], + &DictationStartOptions { + translation_requested: requested, + translation_target_language: target, + ..Default::default() + }, + ) + }; + let suppressed = capture(true, Some("en".into())); + assert_eq!(suppressed.polish.translation_target_language, "English"); + assert!(suppressed.polish.translation_target_explicit); + assert!(!suppressed.polish.translation_active); + assert!(!suppressed.uses_llm_polisher()); + assert!( + !suppressed + .with_translation_requested(true) + .polish + .translation_active + ); + let selected_only = capture(false, Some("ja".into())); + assert!(!selected_only.uses_llm_polisher()); + let translated = capture(true, Some("ja".into())); + assert!(translated.polish.translation_active); + assert!(translated.uses_llm_polisher()); + assert_eq!(translated.asr.provider_id, "local-qwen3"); + assert_eq!(translated.llm.provider_id, "original-llm"); + let legacy = capture(true, None); + assert!(!legacy.polish.translation_target_explicit); + assert_eq!(legacy.polish.translation_target_language, "日本語"); + assert!(legacy.polish.translation_active); + } + #[test] fn selection_polish_uses_the_selected_text_envelope() { let mut context = DictationContext::default(); diff --git a/openless-all/app/crates/openless-core/src/dictation_engine.rs b/openless-all/app/crates/openless-core/src/dictation_engine.rs index f8d3d58ee..d4f951552 100644 --- a/openless-all/app/crates/openless-core/src/dictation_engine.rs +++ b/openless-all/app/crates/openless-core/src/dictation_engine.rs @@ -1011,6 +1011,13 @@ impl DictationEngine for PipelineDictationEngine { let skips_polish_for_short_text = context.skips_polish_for_short_text(&transcript.text); // Optional polish may be skipped after fallback; an explicit translation is still required. let translation_active = context.polish.translation_active; + // Explicit per-session translation must not succeed with untransformed text. + let require_translation = translation_active && context.polish.translation_target_explicit; + let policy = if require_translation { + PolishFailurePolicy::Fail + } else { + policy + }; let uses_polisher = context.uses_llm_polisher() && !(context.voice_activation.is_some() && transcript.text.trim().is_empty()) && !skips_polish_for_short_text @@ -1063,6 +1070,16 @@ impl DictationEngine for PipelineDictationEngine { ) .await }; + let output = output.and_then(|value| { + if require_translation && value.text.trim().is_empty() { + Err(BackendError::new( + BackendErrorCode::Provider, + "translation returned empty text", + )) + } else { + Ok(value) + } + }); let result = match output { Ok(text) => (text, false), // Offline after local recognition: the raw transcript is the @@ -3810,6 +3827,37 @@ mod tests { assert_eq!(result.polished_text, "raw text"); } + #[tokio::test] + async fn requested_translation_failure_never_becomes_successful_source_text() { + for output in [ + Err(BackendError::new( + BackendErrorCode::Provider, + "fixture HTTP 500", + )), + Ok(crate::ports::PolishOutput::text(" ")), + ] { + let fixture = fixture_engine(false, output, None, None); + let id = SessionId::new(); + let mut context = DictationContext::default(); + context.polish.translation_active = true; + context.polish.translation_target_language = "English".into(); + context.polish.translation_target_explicit = true; + fixture + .engine + .start(id, Arc::new(context), fixture.progress.clone()) + .await + .unwrap(); + let failure = fixture + .engine + .finish(id, fixture.progress.clone()) + .await + .unwrap_err(); + assert_eq!(failure.error.code, BackendErrorCode::Provider); + assert_eq!(failure.raw_text.as_deref(), Some("raw text")); + assert!(fixture.engine.sessions.lock().unwrap().is_empty()); + } + } + #[tokio::test] async fn voice_activation_commands_are_cleaned_before_correction_and_polishing() { use crate::testing::{ diff --git a/openless-all/app/crates/openless-core/src/language_catalog.rs b/openless-all/app/crates/openless-core/src/language_catalog.rs index 6bcfcf273..b8ac2f0c1 100644 --- a/openless-all/app/crates/openless-core/src/language_catalog.rs +++ b/openless-all/app/crates/openless-core/src/language_catalog.rs @@ -43,6 +43,14 @@ pub fn language_code(value: &str) -> Option { language(value).map(|language| language.code.clone()) } +/// Ordered catalog choices; provider support is checked separately. +pub fn translation_language_names() -> Vec { + LANGUAGES + .iter() + .map(|language| language.native_name.clone()) + .collect() +} + pub fn asr_language_code(native_name: &str) -> Option { language(native_name).map(|language| language.asr_code.clone()) } @@ -55,6 +63,22 @@ pub fn apple_speech_locale(native_name: &str) -> Option { mod tests { use super::*; + #[test] + fn translation_names_and_aliases_share_the_existing_catalog() { + let names = translation_language_names(); + assert!(names.len() > 3); + for (index, name) in names.iter().enumerate() { + assert!(!names[..index].contains(name)); + assert_eq!(native_language_name(name).as_ref(), Some(name)); + } + assert_eq!(native_language_name(" EN ").as_deref(), Some("English")); + assert_eq!( + native_language_name("繁體中文").as_deref(), + Some("繁体中文") + ); + assert_eq!(native_language_name("unknown"), None); + } + #[test] fn extended_names_route_to_iso_and_apple_identifiers() { for (name, code, locale) in [ diff --git a/openless-all/app/crates/openless-core/src/ports.rs b/openless-all/app/crates/openless-core/src/ports.rs index 66dfa69f4..e5c8e58ff 100644 --- a/openless-all/app/crates/openless-core/src/ports.rs +++ b/openless-all/app/crates/openless-core/src/ports.rs @@ -780,6 +780,15 @@ impl PreparedTranscription for DeferredDictationPre } pub trait TextPolisher: Send + Sync { + /// Freeze request credentials/options for a delayed operation without provider network I/O. + /// Adapters with no mutable request configuration may keep their runtime. + fn prepare( + &self, + _context: Arc, + ) -> BoxFuture<'static, Result>, BackendError>> { + Box::pin(async { Ok(None) }) + } + fn polish( &self, session_id: SessionId, diff --git a/openless-all/app/crates/openless-core/src/preferences.rs b/openless-all/app/crates/openless-core/src/preferences.rs index 817d7663e..129f2a336 100644 --- a/openless-all/app/crates/openless-core/src/preferences.rs +++ b/openless-all/app/crates/openless-core/src/preferences.rs @@ -266,6 +266,7 @@ impl PreferencesStore { } pub fn set(&self, mut preferences: UserPreferences) -> Result<(), BackendError> { + crate::settings::reconcile_translation_settings(&self.get(), &mut preferences)?; self.update(|current| { // The sync transaction owns this field; stale whole-document saves cannot reroute its token. preferences.sync_custom_server_origin = current.sync_custom_server_origin.clone(); @@ -370,6 +371,7 @@ impl PreferencesStore { &self, mut preferences: UserPreferences, ) -> Result<(), BackendError> { + crate::settings::reconcile_translation_settings(&self.get(), &mut preferences)?; self.update(|current| { preferences.preserve_style_preferences_from(current); preferences.sync_custom_server_origin = current.sync_custom_server_origin.clone(); diff --git a/openless-all/app/crates/openless-core/src/provider_registry.rs b/openless-all/app/crates/openless-core/src/provider_registry.rs index 3f5c973b6..1112e0fe8 100644 --- a/openless-all/app/crates/openless-core/src/provider_registry.rs +++ b/openless-all/app/crates/openless-core/src/provider_registry.rs @@ -136,6 +136,17 @@ impl TextPolisherRouter { } impl TextPolisher for TextPolisherRouter { + fn prepare( + &self, + context: Arc, + ) -> BoxFuture<'static, Result>, BackendError>> { + let provider = match self.resolve(&context.llm.provider_type) { + Ok(provider) => provider, + Err(error) => return Box::pin(async move { Err(error) }), + }; + Box::pin(async move { Ok(Some(provider.prepare(context).await?.unwrap_or(provider))) }) + } + fn polish( &self, session_id: SessionId, diff --git a/openless-all/app/crates/openless-core/src/settings.rs b/openless-all/app/crates/openless-core/src/settings.rs index 51600f8d8..387d97215 100644 --- a/openless-all/app/crates/openless-core/src/settings.rs +++ b/openless-all/app/crates/openless-core/src/settings.rs @@ -19,6 +19,116 @@ pub(crate) fn ensure_testing_features_enabled( } } +/// Preserve historical custom names on load, while canonicalizing catalog aliases. +pub(crate) fn canonical_translation_target(value: &str) -> String { + crate::language_catalog::native_language_name(value).unwrap_or_else(|| value.trim().to_string()) +} + +pub(crate) fn ordered_translation_targets(values: Vec) -> Vec { + let mut targets = Vec::new(); + for value in values { + let value = canonical_translation_target(&value); + if !value.is_empty() && !targets.contains(&value) { + targets.push(value); + } + } + targets +} + +pub(crate) fn migrate_translation_targets( + targets: Option>, + selected: &str, +) -> (Vec, String) { + let selected = canonical_translation_target(selected); + let mut targets = + ordered_translation_targets(targets.unwrap_or_else(|| vec![selected.clone()])); + // A nonempty legacy selection remains authoritative when an older client + // round-trips a newly introduced list it does not know how to update. + if !targets.is_empty() && !selected.is_empty() && !targets.contains(&selected) { + targets.push(selected.clone()); + } + let selected = if targets.is_empty() { + String::new() + } else { + selected + }; + (targets, selected) +} + +/// A missing list is a legacy scalar-only update, not permission to erase targets. +/// Unknown names already stored by an older client remain usable, but cannot be newly added. +pub(crate) fn reconcile_translation_settings( + previous: &UserPreferences, + next: &mut UserPreferences, +) -> Result<(), BackendError> { + let (previous_targets, previous_selected) = migrate_translation_targets( + if previous.translation_target_languages.is_empty() + && !previous.translation_target_languages_present + { + None + } else { + Some(previous.translation_target_languages.clone()) + }, + &previous.translation_target_language, + ); + let selected = canonical_translation_target(&next.translation_target_language); + let mut targets = if next.translation_target_languages_present { + ordered_translation_targets(next.translation_target_languages.clone()) + } else { + previous_targets.clone() + }; + // Scalar-only clients (including existing Rust callers editing a snapshot) select + // a target without replacing the ordered collection. Explicit [] always clears. + if (!next.translation_target_languages_present + || (!targets.is_empty() && targets == previous_targets && selected != previous_selected)) + && !selected.is_empty() + && !targets.contains(&selected) + { + targets.push(selected.clone()); + } + for target in &targets { + if crate::language_catalog::native_language_name(target).is_none() + && !previous_targets.contains(target) + { + return Err(BackendError::new( + crate::errors::BackendErrorCode::InvalidArgument, + format!("unknown translation target: {target}"), + )); + } + } + let selected = if !selected.is_empty() && !targets.contains(&selected) { + targets.first().cloned().unwrap_or_default() + } else { + selected + }; + let (targets, selected) = migrate_translation_targets(Some(targets), &selected); + next.translation_target_languages = targets; + next.translation_target_language = selected; + next.translation_target_languages_present = true; + Ok(()) +} + +pub(crate) fn validate_session_translation_target( + preferences: &UserPreferences, + target: &str, +) -> Result { + let target = canonical_translation_target(target); + let mut targets = ordered_translation_targets(preferences.translation_target_languages.clone()); + if !preferences.translation_target_languages_present { + let legacy = canonical_translation_target(&preferences.translation_target_language); + if !legacy.is_empty() && !targets.contains(&legacy) { + targets.push(legacy); + } + } + if target.is_empty() || !targets.contains(&target) { + return Err(BackendError::new( + crate::errors::BackendErrorCode::InvalidArgument, + "session translation target must be a configured nonempty target", + )); + } + Ok(target) +} + #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum SettingsCollisionPolicy { @@ -292,3 +402,123 @@ mod tests { assert!(!tsf_with_hidden_pref.windows_show_openless_in_keyboard_list); } } + +#[cfg(test)] +mod translation_targets_tests { + use super::*; + use serde_json::json; + + #[test] + fn legacy_selected_target_seeds_list_and_preserves_custom_names() { + for (input, expected) in [ + (" en ", "English"), + (" My historical language ", "My historical language"), + ] { + let preferences: UserPreferences = serde_json::from_value(json!({ + "translationTargetLanguage": input, + })) + .unwrap(); + assert_eq!(preferences.translation_target_languages, vec![expected]); + assert_eq!(preferences.translation_target_language, expected); + assert!(!preferences.translation_target_languages_present); + } + let defaults: UserPreferences = serde_json::from_value(json!({})).unwrap(); + assert!(defaults.translation_target_languages.is_empty()); + assert!(defaults.translation_target_language.is_empty()); + } + + #[test] + fn explicit_targets_canonicalize_dedupe_keep_order_and_validate_selection() { + let preferences: UserPreferences = serde_json::from_value(json!({ + "translationTargetLanguages": ["ja", " en ", "English", "", "繁體中文", "zh-TW"], + "translationTargetLanguage": "en", + })) + .unwrap(); + assert_eq!( + preferences.translation_target_languages, + vec!["日本語", "English", "繁体中文"] + ); + assert_eq!(preferences.translation_target_language, "English"); + assert!(preferences.translation_target_languages_present); + let invalid_selection: UserPreferences = serde_json::from_value(json!({ + "translationTargetLanguages": ["ja", "en"], + "translationTargetLanguage": "fr", + })) + .unwrap(); + assert_eq!(invalid_selection.translation_target_language, "Français"); + assert_eq!( + invalid_selection.translation_target_languages, + vec!["日本語", "English", "Français"] + ); + } + + #[test] + fn explicit_empty_list_clears_selected_target_and_marker_is_not_wire_data() { + let preferences: UserPreferences = serde_json::from_value(json!({ + "translationTargetLanguages": [], + "translationTargetLanguage": "en", + "translationTargetLanguagesPresent": false, + })) + .unwrap(); + assert!(preferences.translation_target_languages_present); + assert!(preferences.translation_target_languages.is_empty()); + assert!(preferences.translation_target_language.is_empty()); + let value = serde_json::to_value(preferences).unwrap(); + assert!(value.get("translationTargetLanguagesPresent").is_none()); + let forged: UserPreferences = serde_json::from_value(json!({ + "translationTargetLanguage": "en", + "translationTargetLanguagesPresent": true, + })) + .unwrap(); + assert!(!forged.translation_target_languages_present); + } + + #[test] + fn unknown_new_additions_fail_but_historical_targets_survive() { + let previous: UserPreferences = serde_json::from_value(json!({ + "translationTargetLanguage": "Historical custom target", + })) + .unwrap(); + let mut next = previous.clone(); + reconcile_translation_settings(&previous, &mut next).unwrap(); + assert_eq!( + next.translation_target_languages, + vec!["Historical custom target"] + ); + assert_eq!( + validate_session_translation_target(&next, "Historical custom target").unwrap(), + "Historical custom target" + ); + next.translation_target_languages + .push("Unknown new target".into()); + assert_eq!( + reconcile_translation_settings(&previous, &mut next) + .unwrap_err() + .code, + crate::errors::BackendErrorCode::InvalidArgument + ); + } + + #[test] + fn old_client_scalar_updates_preserve_order_and_disabled_selection() { + let previous: UserPreferences = serde_json::from_value(json!({ + "translationTargetLanguages": ["en", "ja"], + "translationTargetLanguage": "en", + })) + .unwrap(); + for (scalar, selected, targets) in [ + ("en", "English", vec!["English", "日本語"]), + ("ja", "日本語", vec!["English", "日本語"]), + ("fr", "Français", vec!["English", "日本語", "Français"]), + ("", "", vec!["English", "日本語"]), + ] { + let mut next: UserPreferences = serde_json::from_value(json!({ + "translationTargetLanguage": scalar, + })) + .unwrap(); + reconcile_translation_settings(&previous, &mut next).unwrap(); + assert_eq!(next.translation_target_languages, targets); + assert_eq!(next.translation_target_language, selected); + } + } +} diff --git a/openless-all/app/crates/openless-core/src/shared_types.rs b/openless-all/app/crates/openless-core/src/shared_types.rs index ddb570f96..ad243ea9b 100644 --- a/openless-all/app/crates/openless-core/src/shared_types.rs +++ b/openless-all/app/crates/openless-core/src/shared_types.rs @@ -551,12 +551,17 @@ pub struct UserPreferences { /// model knows which languages the user works in. See issue #4. #[serde(default = "default_working_languages")] pub working_languages: Vec, - /// Translation output target language (single-select, native name). - /// Empty = translation mode off (Shift combos are inert). The frontend - /// picks from the built-in language list; the backend just splices the - /// native name into the prompt. See issue #4. + /// Legacy selected translation target (canonical native name, or a preserved custom name). + /// Empty disables legacy translation gestures without erasing configured choices. #[serde(default)] pub translation_target_language: String, + /// Ordered, duplicate-free translation choices, separate from working/ASR/UI languages. + #[serde(default)] + pub translation_target_languages: Vec, + /// Wire presence distinguishes an old client's whole-document save from explicit deletion. + #[doc(hidden)] + #[serde(skip)] + pub translation_target_languages_present: bool, /// Chinese output script preference (not exposed as a UI switch): /// - Simplified: prefer simplified for Chinese output /// - Traditional: prefer traditional for Chinese output @@ -1093,6 +1098,8 @@ struct UserPreferencesWire { windows_show_openless_in_keyboard_list: bool, working_languages: Vec, translation_target_language: String, + #[serde(default)] + translation_target_languages: Option>, chinese_script_preference: ChineseScriptPreference, #[serde(default)] output_language_preference: OutputLanguagePreference, @@ -1346,6 +1353,7 @@ impl Default for UserPreferencesWire { windows_show_openless_in_keyboard_list: prefs.windows_show_openless_in_keyboard_list, working_languages: prefs.working_languages, translation_target_language: prefs.translation_target_language, + translation_target_languages: None, chinese_script_preference: prefs.chinese_script_preference, output_language_preference: prefs.output_language_preference, qa_hotkey: prefs.qa_hotkey, @@ -1470,6 +1478,12 @@ impl<'de> Deserialize<'de> for UserPreferences { selection_polish_hotkey = None; } } + let translation_target_languages_present = wire.translation_target_languages.is_some(); + let (translation_target_languages, translation_target_language) = + crate::settings::migrate_translation_targets( + wire.translation_target_languages, + &wire.translation_target_language, + ); let streaming_insert_default_migrated = wire.streaming_insert_default_migrated; let streaming_insert = if streaming_insert_default_migrated { wire.streaming_insert @@ -1575,7 +1589,9 @@ impl<'de> Deserialize<'de> for UserPreferences { ), windows_show_openless_in_keyboard_list: wire.windows_show_openless_in_keyboard_list, working_languages: wire.working_languages, - translation_target_language: wire.translation_target_language, + translation_target_language, + translation_target_languages, + translation_target_languages_present, chinese_script_preference: wire.chinese_script_preference, output_language_preference: wire.output_language_preference, qa_hotkey: if cfg!(target_os = "linux") { wire.qa_hotkey } else { None }, // retired desktop follow-up shortcut @@ -1966,6 +1982,8 @@ impl Default for UserPreferences { windows_show_openless_in_keyboard_list: true, working_languages: default_working_languages(), translation_target_language: String::new(), + translation_target_languages: Vec::new(), + translation_target_languages_present: false, chinese_script_preference: ChineseScriptPreference::Auto, output_language_preference: OutputLanguagePreference::Auto, qa_hotkey: default_qa_hotkey(), diff --git a/openless-all/ios/.gitattributes b/openless-all/ios/.gitattributes new file mode 100644 index 000000000..beea03bfa --- /dev/null +++ b/openless-all/ios/.gitattributes @@ -0,0 +1,2 @@ +# Preserve upstream license text, including its original whitespace. +Resources/Licenses/**/*.txt -whitespace diff --git a/openless-all/ios/.gitignore b/openless-all/ios/.gitignore index ab46d4091..b89c23efc 100644 --- a/openless-all/ios/.gitignore +++ b/openless-all/ios/.gitignore @@ -3,6 +3,10 @@ .vendor/ DerivedData*/ Artifacts/ +*.ipa +*.xcarchive/ +*.xcresult/ +*.log __pycache__/ Config/Local.xcconfig *.xcuserstate @@ -17,6 +21,7 @@ Resources/SenseVoice/*.download Resources/Rime/build/ Resources/Rime/user.yaml Resources/Prediction/*.sqlite3 +Resources/Prediction/*.building.sqlite3 !OpenLess.xcodeproj/ !OpenLess.xcodeproj/project.pbxproj !OpenLess.xcodeproj/xcshareddata/ diff --git a/openless-all/ios/App/AppDesign.swift b/openless-all/ios/App/AppDesign.swift index 6aafd6e2d..b5d2c694e 100644 --- a/openless-all/ios/App/AppDesign.swift +++ b/openless-all/ios/App/AppDesign.swift @@ -7,7 +7,7 @@ enum AppTheme: String, CaseIterable { var scheme: ColorScheme? { switch self { case .system: nil; case .light: .light; case .dark: .dark } } } -/// One palette for the product screens; no gray-on-gray diagnostic panels. +/// Shared colors for product screens and controls. enum AppDesign { static let canvas = Color(uiColor: UIColor { traits in traits.userInterfaceStyle == .dark diff --git a/openless-all/ios/App/ExperimentalPiPKeepAlive.swift b/openless-all/ios/App/ExperimentalPiPKeepAlive.swift index 0cfbde4f6..2c7971232 100644 --- a/openless-all/ios/App/ExperimentalPiPKeepAlive.swift +++ b/openless-all/ios/App/ExperimentalPiPKeepAlive.swift @@ -272,8 +272,7 @@ final class ExperimentalPiPKeepAlive: NSObject { onChange?() } - /// A low-frequency content update retains the reference's content-only path - /// without its 60 Hz animation. Device testing must establish long-run retention. + /// Refresh content once per second while PiP is active and unsuspended. private func updateContentRefresh() { let eligible = enabled && isActive && controller?.isPictureInPictureSuspended == false && !protectedDataUnavailable @@ -283,8 +282,7 @@ final class ExperimentalPiPKeepAlive: NSObject { Task { @MainActor [weak self] in guard let self, self.isReady else { return } self.contentPhase.toggle() - // A nearly transparent layer mutation generates content work, without - // a visible video surface or an audio session. Never request 120 Hz. + // A transparent layer update avoids starting an audio or video engine. self.contentController?.view.layer.backgroundColor = UIColor(white: 0, alpha: self.contentPhase ? 0.001 : 0).cgColor self.contentController?.view.setNeedsDisplay() diff --git a/openless-all/ios/App/HostApplicationReturn.m b/openless-all/ios/App/HostApplicationReturn.m index d7cd9a176..7089d2990 100644 --- a/openless-all/ios/App/HostApplicationReturn.m +++ b/openless-all/ios/App/HostApplicationReturn.m @@ -3,14 +3,8 @@ #import #import -// iOS 27.0 (24A434), arm64 Simulator runtime probe, 2026-10-18: -// UIApplication._systemNavigationAction: @16@0:8 -// UISystemNavigationAction.destinations: @16@0:8 -// bundleIdForDestination: @24@0:8Q16; sendResponseForDestination: B24@0:8Q16 -// LSApplicationWorkspace.defaultWorkspace: @16@0:8 -// openApplicationWithBundleID: B24@0:8@16 -// Check the complete ABI again before every call. No installation inventory, -// URL-scheme guessing, process suspension, or private ivar offsets are used. +// Validate each runtime method's complete ABI before invoking it. A return +// destination belongs only to the current activation; never enumerate apps. static BOOL OLMethodMatches(id object, SEL selector, const char *result, const char *argument) { if (!object) return NO; diff --git a/openless-all/ios/App/PiPCoexistenceAdapter.swift b/openless-all/ios/App/PiPCoexistenceAdapter.swift index 37d7126e3..e18050c82 100644 --- a/openless-all/ios/App/PiPCoexistenceAdapter.swift +++ b/openless-all/ios/App/PiPCoexistenceAdapter.swift @@ -1,5 +1,4 @@ -// Adapted from Yoroin/GlobalRefresh-PiP, commit 1b62341c1d62308962fb3656192d6783631aa00c. -// Original PiP demo: CaiWanFeng/PiP. See Resources/Licenses/GlobalRefresh-PiP-NOTICE.txt. +// Third-party source attribution is bundled in Resources/Licenses. import Foundation import ObjectiveC #if os(iOS) diff --git a/openless-all/ios/AppTests/SpeakButtonVisualTests.swift b/openless-all/ios/AppTests/SpeakButtonVisualTests.swift index d7364b40a..fc2517433 100644 --- a/openless-all/ios/AppTests/SpeakButtonVisualTests.swift +++ b/openless-all/ios/AppTests/SpeakButtonVisualTests.swift @@ -29,21 +29,20 @@ nonisolated final class SpeakButtonVisualTests: XCTestCase { controller.view.layoutIfNeeded() button.configure(phase: .recording, level: 0, available: true) try await Task.sleep(for: .milliseconds(300)) - capture(controller.view, name: "build11-recording-silence") - // Synthetic RMS inputs exercise only the presentation. No microphone is - // activated; screenshots/video must not be described as capture evidence. + capture(controller.view, name: "recording-silence") + // Synthetic RMS values exercise presentation without opening the microphone. for _ in 0..<3 { for level: Float in [0, 0.004, 0.01, 0.025, 0.06, 0.1, 0.025, 0.01] { button.configure(phase: .recording, level: level, available: true) try await Task.sleep(for: .milliseconds(160)) } } - capture(controller.view, name: "build11-recording-speech") + capture(controller.view, name: "recording-speech") XCTAssertEqual(button.accessibilityLabel, "结束录音") button.configure(phase: .processing, level: 0, available: false) try await Task.sleep(for: .milliseconds(350)) XCTAssertEqual(button.accessibilityLabel, "thinking") - capture(controller.view, name: "build11-thinking") + capture(controller.view, name: "thinking") } @MainActor private func capture(_ view: UIView, name: String) { diff --git a/openless-all/ios/AppTests/TranslationArcGeometryTests.swift b/openless-all/ios/AppTests/TranslationArcGeometryTests.swift index 6fcb1ace6..7999ae5c6 100644 --- a/openless-all/ios/AppTests/TranslationArcGeometryTests.swift +++ b/openless-all/ios/AppTests/TranslationArcGeometryTests.swift @@ -2,7 +2,7 @@ import XCTest import UIKit import OpenLessShared -/// Call in an iOS test host on MainActor. Uses the actual patched UIView and UILabel sizes. +/// Measures the rendered UIView and UILabel geometry on the main actor. /// Geometry uses the production view; only the irrelevant canvas color is supplied here. @MainActor enum TranslationArcGeometryChecks { diff --git a/openless-all/ios/Config/App-Info.plist b/openless-all/ios/Config/App-Info.plist index adfe18a0c..350d59200 100644 --- a/openless-all/ios/Config/App-Info.plist +++ b/openless-all/ios/Config/App-Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.1.0 + $(MARKETING_VERSION) CFBundleURLTypes @@ -30,7 +30,7 @@ CFBundleVersion - 15 + $(CURRENT_PROJECT_VERSION) NSMicrophoneUsageDescription 仅在你点按或按住录音时采集声音,结束后立即释放麦克风。 NSSpeechRecognitionUsageDescription diff --git a/openless-all/ios/Config/Base.xcconfig b/openless-all/ios/Config/Base.xcconfig index b170d4633..f3f43efcb 100644 --- a/openless-all/ios/Config/Base.xcconfig +++ b/openless-all/ios/Config/Base.xcconfig @@ -1,4 +1,5 @@ -// Local signing is deliberately not committed. +#include "Version.xcconfig" +// Signing overrides stay local to each developer. OL_BUNDLE_ID = app.openless.ios OL_APP_GROUP = group.app.openless.ios #include? "Local.xcconfig" diff --git a/openless-all/ios/Config/Keyboard-Info.plist b/openless-all/ios/Config/Keyboard-Info.plist index b3d8162fa..c6a3acbd8 100644 --- a/openless-all/ios/Config/Keyboard-Info.plist +++ b/openless-all/ios/Config/Keyboard-Info.plist @@ -17,9 +17,9 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 0.1.0 + $(MARKETING_VERSION) CFBundleVersion - 15 + $(CURRENT_PROJECT_VERSION) NSExtension NSExtensionAttributes diff --git a/openless-all/ios/Config/RecordingWidget-Info.plist b/openless-all/ios/Config/RecordingWidget-Info.plist index f40c00f4e..a0ed44094 100644 --- a/openless-all/ios/Config/RecordingWidget-Info.plist +++ b/openless-all/ios/Config/RecordingWidget-Info.plist @@ -17,9 +17,9 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 0.1.0 + $(MARKETING_VERSION) CFBundleVersion - 15 + $(CURRENT_PROJECT_VERSION) NSExtension NSExtensionPointIdentifier diff --git a/openless-all/ios/Config/Version.xcconfig b/openless-all/ios/Config/Version.xcconfig new file mode 100644 index 000000000..ad590883e --- /dev/null +++ b/openless-all/ios/Config/Version.xcconfig @@ -0,0 +1,3 @@ +// Shared by the app, keyboard and recording widget. +MARKETING_VERSION = 0.1.0 +CURRENT_PROJECT_VERSION = 16 diff --git a/openless-all/ios/CoreHost/Cargo.lock b/openless-all/ios/CoreHost/Cargo.lock index bfcaeb6ab..b22e4d8df 100644 --- a/openless-all/ios/CoreHost/Cargo.lock +++ b/openless-all/ios/CoreHost/Cargo.lock @@ -2,31 +2,25 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - [[package]] name = "aead" -version = "0.5.2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +checksum = "1973cfbc1a2daf9cf550e74e1f088c28e7f7d8c1e1418fb6c9dc5184b7e84c99" dependencies = [ - "crypto-common", - "generic-array", + "crypto-common 0.2.2", + "inout", ] [[package]] name = "aes" -version = "0.8.4" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +checksum = "35f0f96ce78e38c3dc6d8948aa8163d06385be74000f3c7a95bf1eef35d3ea32" dependencies = [ - "cfg-if", "cipher", - "cpufeatures 0.2.17", + "cpubits", + "cpufeatures 0.3.1", ] [[package]] @@ -54,27 +48,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] -name = "arbitrary" -version = "1.4.2" +name = "anymap3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" -dependencies = [ - "derive_arbitrary", -] +checksum = "fb5dfbc6d8d2675589ccbe4d0fd61df2419075625f8c1a62325e718e2b0049f9" [[package]] name = "argon2" -version = "0.5.3" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3610892ee6e0cbce8ae2700349fcf8f98adb0dbfbee85aec3c9179d29cc072" +checksum = "134c52ddac6d63c576bef8168db10c83c49c26444ecbc68060fef078925a901c" dependencies = [ "base64ct", "blake2", - "cpufeatures 0.2.17", + "cpufeatures 0.3.1", "password-hash", "zeroize", ] +[[package]] +name = "array-init" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc" + [[package]] name = "atomic-waker" version = "1.1.2" @@ -87,12 +84,24 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base64" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" + [[package]] name = "base64ct" version = "1.8.3" @@ -107,11 +116,11 @@ checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" [[package]] name = "blake2" -version = "0.10.6" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +checksum = "5b5d4d889834ee8ecfc0f8426ad30faf7cdcb10f741a8e6d7224d95325479f6f" dependencies = [ - "digest", + "digest 0.11.3", ] [[package]] @@ -123,6 +132,16 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" +dependencies = [ + "hybrid-array", + "zeroize", +] + [[package]] name = "bumpalo" version = "3.20.3" @@ -149,15 +168,9 @@ checksum = "46d07918caa9eeaaf06b7873925c53a61daac173539b4f7715090745e44e4e69" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.9", ] -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - [[package]] name = "bytes" version = "1.12.1" @@ -166,38 +179,18 @@ checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "bzip2" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" -dependencies = [ - "bzip2-sys", - "libc", -] - -[[package]] -name = "bzip2" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49ecfb22d906f800d4fe833b6282cf4dc1c298f5057ca0b5445e5c209735ca47" -dependencies = [ - "bzip2-sys", -] - -[[package]] -name = "bzip2-sys" -version = "0.1.13+1.0.8" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" +checksum = "f3a53fac24f34a81bc9954b5d6cfce0c21e18ec6959f44f56e8e90e4bb7c346c" dependencies = [ - "cc", - "pkg-config", + "libbz2-rs-sys", ] [[package]] name = "cc" -version = "1.4.5" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "005ec2760ca554fae18df7a11195552ec576cd665632a881bc011d5bb2fd4d80" +checksum = "877bf67ac8e52449eb2f9e98a344ea163beb70dd1f9eebe3cc5357dcfeaee4df" dependencies = [ "find-msvc-tools", "jobserver", @@ -207,9 +200,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" [[package]] name = "cfg_aliases" @@ -217,17 +210,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" -[[package]] -name = "chacha20" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures 0.2.17", -] - [[package]] name = "chacha20" version = "0.10.2" @@ -235,21 +217,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" dependencies = [ "cfg-if", + "cipher", "cpufeatures 0.3.1", "rand_core 0.10.1", ] [[package]] name = "chacha20poly1305" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +checksum = "9b89e1c441e926b9c82a8d023f6e1b7ae0adcfaa7d621814e4d60789bac751cb" dependencies = [ "aead", - "chacha20 0.9.1", + "chacha20", "cipher", "poly1305", - "zeroize", ] [[package]] @@ -265,20 +247,41 @@ dependencies = [ [[package]] name = "cipher" -version = "0.4.4" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +checksum = "e8cf2a2c93cd704877c0858356ed03480ff301ee950b43f1cbe4573b088bfa6c" dependencies = [ - "crypto-common", + "block-buffer 0.12.1", + "crypto-common 0.2.2", "inout", - "zeroize", ] +[[package]] +name = "cmov" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + [[package]] name = "constant_time_eq" -version = "0.3.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +checksum = "9eb6feb175df65d0a3ccd3e73484e940d0ac664e8034f0519fd49a93db3071d9" +dependencies = [ + "rustversion", +] [[package]] name = "core-foundation" @@ -306,6 +309,12 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "cpubits" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15b85f9c39137c3a891689859392b1bd49812121d0d61c9caf00d46ed5ce06ae" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -325,44 +334,81 @@ dependencies = [ ] [[package]] -name = "crc" -version = "3.4.0" +name = "crc32fast" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +checksum = "01a7799fd6b852db0e61728dde9a204c423b44d689dbd432522543614b490e78" dependencies = [ - "crc-catalog", + "cfg-if", ] [[package]] -name = "crc-catalog" -version = "2.5.0" +name = "crypto-bigint" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] [[package]] -name = "crc32fast" -version = "1.5.1" +name = "crypto-common" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8498c871161e1742aaa9d52551b2d6ebdd4c3d45a3be423e3728f33b955be550" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ - "cfg-if", + "generic-array", + "typenum", ] [[package]] -name = "crossbeam-utils" -version = "0.8.21" +name = "crypto-common" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "getrandom 0.4.3", + "hybrid-array", + "rand_core 0.10.1", +] [[package]] -name = "crypto-common" -version = "0.1.7" +name = "ctutils" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +checksum = "03bb0e1cc970d482d121d9a1744999169b69a07470b3d644a7894e53fcaf4574" dependencies = [ - "generic-array", - "rand_core 0.6.4", - "typenum", + "cmov", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "curve25519-dalek-derive", + "digest 0.10.7", + "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 2.0.119", ] [[package]] @@ -378,21 +424,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac6b926516df9c60bfa16e107b21086399f8285a44ca9711344b9e553c5146e2" [[package]] -name = "deranged" -version = "0.5.8" +name = "der" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid 0.9.6", + "pem-rfc7468", + "zeroize", +] [[package]] -name = "derive_arbitrary" -version = "1.4.2" +name = "deranged" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] +checksum = "9e9de72ce2ad1f90dc62fa25f0f430ef85eb4b0d8fa0be4f30373bc40a21d28e" [[package]] name = "digest" @@ -400,11 +446,25 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", - "crypto-common", + "block-buffer 0.10.4", + "const-oid 0.9.6", + "crypto-common 0.1.7", "subtle", ] +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.1", + "const-oid 0.10.2", + "crypto-common 0.2.2", + "ctutils", + "zeroize", +] + [[package]] name = "displaydoc" version = "0.2.7" @@ -413,14 +473,86 @@ checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.9", +] + +[[package]] +name = "easyfft" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "767e39eef2ad8a3b6f1d733be3ec70364d21d437d06d4f18ea76ce08df20b75f" +dependencies = [ + "array-init", + "generic_singleton", + "num-complex", + "realfft", + "rustfft", +] + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "serde", + "sha2 0.10.9", + "subtle", + "zeroize", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "hkdf", + "pem-rfc7468", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", ] [[package]] name = "equivalent" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826" [[package]] name = "errno" @@ -453,7 +585,7 @@ dependencies = [ "serde", "serde_json", "tempfile", - "thiserror 2.0.20", + "thiserror", ] [[package]] @@ -467,6 +599,22 @@ dependencies = [ "rkyv", ] +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + [[package]] name = "filetime" version = "0.2.29" @@ -479,9 +627,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.12" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0f1c7c3a72c66fd80abe965175f7523475c0489a87d3ff9d6e8c87d87a9d2d" +checksum = "1c66915cc5391097de7a2b0b972e8505aa33c0df401fd3a6811dbdb32881ba48" [[package]] name = "flate2" @@ -489,8 +637,7 @@ version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" dependencies = [ - "crc32fast", - "miniz_oxide", + "zlib-rs", ] [[package]] @@ -537,7 +684,7 @@ checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.9", ] [[package]] @@ -576,32 +723,29 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] -name = "getrandom" -version = "0.2.17" +name = "generic_singleton" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +checksum = "ab6e923c8e978e57cf63e2e200ca967d1d20f0ea2662b28f6d4e11c44aa6ab16" dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", + "anymap3", + "parking_lot", ] [[package]] name = "getrandom" -version = "0.3.4" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", "libc", - "r-efi 5.3.0", - "wasip2", + "wasi", "wasm-bindgen", ] @@ -614,24 +758,59 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "r-efi 6.0.0", + "r-efi", "rand_core 0.10.1", "wasm-bindgen", ] +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "hashbrown" version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac 0.12.1", +] + [[package]] name = "hmac" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", +] + +[[package]] +name = "hmac" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" +dependencies = [ + "digest 0.11.3", ] [[package]] @@ -673,15 +852,23 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +[[package]] +name = "hybrid-array" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27f864f10dfb56725ce5ce5472bc52252c8f93a4ab86327122cebf62c5f59a17" +dependencies = [ + "typenum", +] + [[package]] name = "hyper" -version = "1.11.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b501faa50e7a26c3d3560ca625132f4078a17771f4810baf70475ae48cbe43" +checksum = "2c3e324da4c95177d6291d4c8730197c0d1822f8a9766814a4a44fa5ab797c9c" dependencies = [ "atomic-waker", "bytes", - "futures-channel", "futures-core", "http", "http-body", @@ -695,9 +882,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.9" +version = "0.27.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +checksum = "dfa8e654703247911e29c23fbeaa261834bd9bb74efba2f9acddc37bfb127f53" dependencies = [ "http", "hyper", @@ -711,16 +898,17 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +checksum = "ddc03d96684f9226b8a787cdb71488417b53ab5ea8fdb1dac946cb9431cc8bff" dependencies = [ - "base64", + "base64 0.23.1", "bytes", "futures-channel", "futures-util", "http", "http-body", + "httparse", "hyper", "ipnet", "libc", @@ -874,11 +1062,11 @@ dependencies = [ [[package]] name = "inout" -version = "0.1.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +checksum = "3b5cf4372d022092674a83b8febf5865f7a573cc0c5baec5e49c879b6a20978f" dependencies = [ - "generic-array", + "hybrid-array", ] [[package]] @@ -905,20 +1093,63 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.105" +version = "0.3.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce57d20d1ea864ce2ac172ab472d409214f4fd359f0b2a2775abdf522e2af99e" +checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5" dependencies = [ "cfg-if", "futures-util", "wasm-bindgen", ] +[[package]] +name = "jsonwebtoken" +version = "11.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e75fe14a82d81e5f5af639997db37d8b96045938a7ac6ab18cdbe1c7467e05e1" +dependencies = [ + "base64 0.22.1", + "ed25519-dalek", + "getrandom 0.2.17", + "hmac 0.12.1", + "js-sys", + "p256", + "p384", + "rand 0.8.8", + "rsa", + "serde", + "serde_json", + "sha2 0.10.9", + "signature", + "zeroize", +] + +[[package]] +name = "lazy_static" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20870f649af7073d53e38067b2a84312175d56ea15217e1b15bc83506ec50afb" +dependencies = [ + "spin", +] + +[[package]] +name = "libbz2-rs-sys" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b357333733e8260735ba5894eb928c02ecc69c78715f01a8019e7fa7f2db4c" + [[package]] name = "libc" -version = "0.2.189" +version = "0.2.191" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a" + +[[package]] +name = "libm" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "linux-raw-sys" @@ -949,39 +1180,27 @@ checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" [[package]] name = "lru-slab" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" +checksum = "4050469837a6ff301cd14c1f8f24f88549e6d548f24f64e2148eb0f72cebc51f" [[package]] -name = "lzma-rs" -version = "0.3.0" +name = "lzma-rust2" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "297e814c836ae64db86b36cf2a557ba54368d03f6afcd7d947c266692f71115e" +checksum = "7277c9742229dc25243236d578b6471a798c554512c6f6a04365ec2e87c2a3bb" dependencies = [ - "byteorder", - "crc", -] - -[[package]] -name = "lzma-sys" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" -dependencies = [ - "cc", - "libc", - "pkg-config", + "sha2 0.11.1", ] [[package]] name = "md-5" -version = "0.10.6" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98" dependencies = [ "cfg-if", - "digest", + "digest 0.11.3", ] [[package]] @@ -990,6 +1209,21 @@ version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" +[[package]] +name = "micyou-dsp" +version = "0.1.0" +dependencies = [ + "log", + "micyou-infer", + "nnnoiseless", + "rustfft", + "serde", +] + +[[package]] +name = "micyou-infer" +version = "0.1.0" + [[package]] name = "mime" version = "0.3.17" @@ -1007,51 +1241,108 @@ dependencies = [ ] [[package]] -name = "miniz_oxide" -version = "0.9.1" +name = "mio" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "munge" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e17401f259eba956ca16491461b6e8f72913a0a114e39736ce404410f915a0c" +dependencies = [ + "munge_macro", +] + +[[package]] +name = "munge_macro" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4568f25ccbd45ab5d5603dc34318c1ec56b117531781260002151b8530a9f931" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "nix" +version = "0.31.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "nnnoiseless" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" +checksum = "805d5964d1e7a0006a7fdced7dae75084d66d18b35f1dfe81bd76929b1f8da0c" dependencies = [ - "adler2", - "simd-adler32", + "easyfft", + "once_cell", ] [[package]] -name = "mio" -version = "1.2.3" +name = "num-bigint-dig" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" dependencies = [ - "libc", - "wasi", - "windows-sys 0.61.2", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.8", + "smallvec", + "zeroize", ] [[package]] -name = "munge" -version = "0.4.7" +name = "num-complex" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e17401f259eba956ca16491461b6e8f72913a0a114e39736ce404410f915a0c" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ - "munge_macro", + "num-traits", + "serde", ] [[package]] -name = "munge_macro" -version = "0.4.7" +name = "num-conv" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4568f25ccbd45ab5d5603dc34318c1ec56b117531781260002151b8530a9f931" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-integer" +version = "0.1.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", + "num-traits", ] [[package]] -name = "num-conv" -version = "0.2.2" +name = "num-iter" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" +dependencies = [ + "num-integer", + "num-traits", +] [[package]] name = "num-traits" @@ -1060,6 +1351,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -1068,28 +1360,25 @@ version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - [[package]] name = "openless-core" version = "0.1.0" dependencies = [ "anyhow", "argon2", - "base64", - "bzip2 0.4.4", + "base64 0.23.1", + "bzip2", "chacha20poly1305", "chrono", "ferrous-opencc", "futures-util", - "getrandom 0.3.4", - "hmac", + "getrandom 0.4.3", + "hex", + "hmac 0.13.0", + "jsonwebtoken", "log", "md-5", + "micyou-dsp", "once_cell", "parking_lot", "regex", @@ -1097,9 +1386,9 @@ dependencies = [ "serde", "serde_json", "sha1", - "sha2", + "sha2 0.11.1", "tar", - "thiserror 1.0.69", + "thiserror", "tokio", "tokio-tungstenite", "unicode-normalization", @@ -1118,13 +1407,37 @@ dependencies = [ "security-framework", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "tempfile", "tokio", "uuid", "zeroize", ] +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.9", +] + +[[package]] +name = "p384" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.9", +] + [[package]] name = "parking_lot" version = "0.12.5" @@ -1150,23 +1463,31 @@ dependencies = [ [[package]] name = "password-hash" -version = "0.5.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" +checksum = "aab41826031698d6ffcd9cff78ef56ef998e39dc7e5067cdfebe373842d4723b" dependencies = [ - "base64ct", - "rand_core 0.6.4", - "subtle", + "getrandom 0.4.3", + "phc", ] [[package]] name = "pbkdf2" -version = "0.12.2" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112d82ceb8c5bf524d9af484d4e4970c9fd5a0cc15ba14ad93dccd28873b0629" +dependencies = [ + "digest 0.11.3", + "hmac 0.13.0", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" dependencies = [ - "digest", - "hmac", + "base64ct", ] [[package]] @@ -1175,6 +1496,17 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]] +name = "phc" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44dc769b75f93afdddd8c7fa12d685292ddeff1e66f7f0f3a234cf1818afe892" +dependencies = [ + "base64ct", + "ctutils", + "getrandom 0.4.3", +] + [[package]] name = "phf" version = "0.13.1" @@ -1234,6 +1566,27 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.34" @@ -1242,12 +1595,11 @@ checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" [[package]] name = "poly1305" -version = "0.8.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +checksum = "6e2d0073b297041425c7c3df6eb4792d598a15323fe63346852b092eca02904c" dependencies = [ - "cpufeatures 0.2.17", - "opaque-debug", + "cpufeatures 0.3.1", "universal-hash", ] @@ -1262,9 +1614,15 @@ dependencies = [ [[package]] name = "powerfmt" -version = "0.2.0" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a6394b9e965e73d0a289ee54f589087e2c676aedf60885baf52c76b771e4958" + +[[package]] +name = "ppmd-rust" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +checksum = "494b4379484fc92217cc7d9e3a532375b1d01a61889ec8333025dc3b0377af56" [[package]] name = "ppv-lite86" @@ -1275,6 +1633,24 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "primal-check" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc0d895b311e3af9902528fbb8f928688abbd95872819320517cc24ca6b2bd08" +dependencies = [ + "num-integer", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro2" version = "1.0.107" @@ -1301,14 +1677,14 @@ checksum = "1c8d9ca532f185d5d4db7a7c9d51420b452168ea1c2b913953281bd6fe1fcbd0" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.9", ] [[package]] name = "quinn" -version = "0.11.11" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" +checksum = "4051e23e9185c255a7e33ef59cdbca87a22d359052eecd22fc6b901fb37d9d11" dependencies = [ "bytes", "cfg_aliases", @@ -1318,7 +1694,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2", - "thiserror 2.0.20", + "thiserror", "tokio", "tracing", "web-time", @@ -1326,21 +1702,21 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.17" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04759210543be93709136e28212294a659ef5001836ff4eab4d663e4529bba83" +checksum = "0e750cca55fe4f0439a15d0bb529da9651e79993e8e72c61a899a36d462befbe" dependencies = [ "bytes", "getrandom 0.4.3", "lru-slab", - "rand 0.10.2", + "rand 0.10.3", "rand_pcg", "ring", "rustc-hash", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.20", + "thiserror", "tinyvec", "tracing", "web-time", @@ -1348,9 +1724,9 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.15" +version = "0.5.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" +checksum = "af66907df18639dcf4db56ca65490cabc4b27a97dbadd96f2926cca73298f016" dependencies = [ "cfg_aliases", "libc", @@ -1369,12 +1745,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - [[package]] name = "r-efi" version = "6.0.0" @@ -1403,11 +1773,11 @@ dependencies = [ [[package]] name = "rand" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +checksum = "65c9fb96cbc91e3478eaae79a69fcd3f1ae4ad052e471fe6732fff548984b4af" dependencies = [ - "chacha20 0.10.2", + "chacha20", "getrandom 0.4.3", "rand_core 0.10.1", ] @@ -1446,6 +1816,15 @@ dependencies = [ "rand_core 0.10.1", ] +[[package]] +name = "realfft" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f821338fddb99d089116342c46e9f1fbf3828dba077674613e734e01d6ea8677" +dependencies = [ + "rustfft", +] + [[package]] name = "redox_syscall" version = "0.5.18" @@ -1499,7 +1878,7 @@ version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "futures-core", "futures-util", @@ -1535,6 +1914,16 @@ dependencies = [ "webpki-roots 1.0.9", ] +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac 0.12.1", + "subtle", +] + [[package]] name = "ring" version = "0.17.14" @@ -1576,7 +1965,27 @@ checksum = "1c25ef604ac7dd839d44d64648952ea23c97866f124ff671b0ed2cf3ad9bb06e" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.9", +] + +[[package]] +name = "rsa" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" +dependencies = [ + "const-oid 0.9.6", + "digest 0.10.7", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle", + "zeroize", ] [[package]] @@ -1585,11 +1994,34 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustfft" +version = "6.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21db5f9893e91f41798c88680037dba611ca6674703c1a18601b01a72c8adb89" +dependencies = [ + "num-complex", + "num-integer", + "num-traits", + "primal-check", + "strength_reduce", + "transpose", +] + [[package]] name = "rustix" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" dependencies = [ "bitflags", "errno", @@ -1600,9 +2032,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.44" +version = "0.23.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6725596c3f2c3a0aef021139e145d4eafe314a6623e4680ca83852b2c67ab2ba" +checksum = "48e13bd8c0e9365c43cfa5c9e8f9ad49d3c8444926c9aac819e0e4dc503c8fdf" dependencies = [ "once_cell", "ring", @@ -1635,9 +2067,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "ryu" @@ -1651,6 +2083,20 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + [[package]] name = "security-framework" version = "3.7.0" @@ -1674,6 +2120,12 @@ dependencies = [ "libc", ] +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + [[package]] name = "serde" version = "1.0.229" @@ -1701,14 +2153,14 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.9", ] [[package]] name = "serde_json" -version = "1.0.151" +version = "1.0.154" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6" dependencies = [ "itoa", "memchr", @@ -1731,13 +2183,13 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.7" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" +checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" dependencies = [ "cfg-if", - "cpufeatures 0.2.17", - "digest", + "cpufeatures 0.3.1", + "digest 0.11.3", ] [[package]] @@ -1748,7 +2200,18 @@ checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures 0.2.17", - "digest", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d7069beb7d6ac7b9acd1039986e73443f24234f41074da099d6f994ac9ad19" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.1", + "digest 0.11.3", ] [[package]] @@ -1757,6 +2220,16 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + [[package]] name = "simd-adler32" version = "0.3.10" @@ -1771,9 +2244,9 @@ checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "siphasher" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" [[package]] name = "slab" @@ -1783,9 +2256,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.16.0" +version = "1.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9be42f50aa861c555654aa3a37f52f4b1074bacf4e48fe0ef7fa584e80f1f0f" +checksum = "5b3dc8af474f516a851ff4bd12db780f948b9250ad37211e4eec0bccea54e01b" [[package]] name = "socket2" @@ -1797,12 +2270,34 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "spin" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "stable_deref_trait" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +[[package]] +name = "strength_reduce" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82" + [[package]] name = "subtle" version = "2.6.1" @@ -1822,9 +2317,9 @@ dependencies = [ [[package]] name = "syn" -version = "3.0.5" +version = "3.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12df2e0110f65b775f769bb17ef989067a1d931b2eb822bd4346631eeada89f9" +checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b" dependencies = [ "proc-macro2", "quote", @@ -1842,13 +2337,13 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.2" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.9", ] [[package]] @@ -1898,42 +2393,22 @@ dependencies = [ [[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.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" -dependencies = [ - "thiserror-impl 2.0.20", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", + "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.20" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.9", ] [[package]] @@ -1943,6 +2418,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" dependencies = [ "deranged", + "js-sys", "num-conv", "powerfmt", "serde_core", @@ -1967,24 +2443,15 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cf0ded5c4e56918d8f8a339e1bb67d038d3bc6d144ac407904015ba2e4cde9b" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee" [[package]] name = "tokio" -version = "1.53.1" +version = "1.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" +checksum = "ce3335fa71841cda333a58d7615b03901380ecf09d59b3296d21f8bbac0dde4e" dependencies = [ "bytes", "libc", @@ -2003,14 +2470,14 @@ checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.9", ] [[package]] name = "tokio-rustls" -version = "0.26.5" +version = "0.26.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c85f2c3ef0b1cd58b36682f4b17aaa995f0e5db534d85692b4903abce21f67" +checksum = "c9cc2678c2cdd569ef8215e2afd7954ada2ae20b4fdd2c5fe6139a3b02d105db" dependencies = [ "rustls", "tokio", @@ -2018,9 +2485,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.24.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" +checksum = "17a073bfed563fa236697a068031408a93cd9522e08abf9933ead3e73411bd71" dependencies = [ "futures-util", "log", @@ -2034,9 +2501,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.19" +version = "0.7.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" +checksum = "e464cf451ba96ebfc6f9b6542f17ee8b8956e33f1e40d9690624e59d7a7f8a4b" dependencies = [ "bytes", "futures-core", @@ -2109,6 +2576,16 @@ dependencies = [ "once_cell", ] +[[package]] +name = "transpose" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad61aed86bc3faea4300c7aee358b4c6d0c8d6ccc36524c96e4c92ccf26e77e" +dependencies = [ + "num-integer", + "strength_reduce", +] + [[package]] name = "try-lock" version = "0.2.5" @@ -2117,24 +2594,28 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tungstenite" -version = "0.24.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" +checksum = "e48ac77174b19c110a50ab2128b24215ac9cb40e0e12e093fb602d175c569d22" dependencies = [ - "byteorder", "bytes", "data-encoding", "http", "httparse", "log", - "rand 0.8.8", + "rand 0.10.3", "rustls", "rustls-pki-types", "sha1", - "thiserror 1.0.69", - "utf-8", + "thiserror", ] +[[package]] +name = "typed-path" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" + [[package]] name = "typenum" version = "1.20.1" @@ -2143,33 +2624,33 @@ checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "unicase" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" +checksum = "357cc3acc6a036009fd6c973ed009037c732d60d0b4f6c673e9041497482a28f" [[package]] name = "unicode-ident" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563" [[package]] name = "unicode-normalization" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +checksum = "75cd3fb03d5288b3ba9a1ee103ac7e9cbb59f0b03d64f8ddfcc04dd42758a85d" dependencies = [ "tinyvec", ] [[package]] name = "universal-hash" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +checksum = "f4987bdc12753382e0bec4a65c50738ffaabc998b9cdd1f952fb5f39b0048a96" dependencies = [ - "crypto-common", - "subtle", + "crypto-common 0.2.2", + "ctutils", ] [[package]] @@ -2191,12 +2672,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -2205,9 +2680,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.26.1" +version = "1.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ef6dac1e96601b4fb3acccccff2139741fcb757cb9a36089bf5be91cfb285ce" +checksum = "7cc1186384beb7dd8eedea376413fd654937285ea6c9cfbb928dc3043ea4b606" dependencies = [ "getrandom 0.4.3", "js-sys", @@ -2223,9 +2698,9 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "want" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +checksum = "ec4cdd0dd910afe868b7ef477227d8d538b46b3075031afee8a9f2acb0a2ed0b" dependencies = [ "try-lock", ] @@ -2236,20 +2711,11 @@ 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.4+wasi-0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" -dependencies = [ - "wit-bindgen", -] - [[package]] name = "wasm-bindgen" -version = "0.2.128" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aecb87a33d3b0c5e3b7aa46336eaf486cffafbd281b195e4c8b80d50df2351bf" +checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409" dependencies = [ "cfg-if", "once_cell", @@ -2260,19 +2726,20 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.78" +version = "0.4.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ef4c5d3d2cdf5c54f4231181768f5510842e350db025faf1f7163b1030ed928" +checksum = "3cbab34de2d982e9b48e18d216d04c4a6f641066ff19ffb699980f591ee3610e" dependencies = [ "js-sys", + "tokio", "wasm-bindgen", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.128" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a690d511e3c1a8b3a55e33511e3c2c00c78415cd23650f32b808627f5696b9ed" +checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2280,22 +2747,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.128" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411e4887f0071ef2d2164a9d5fdf2d20efbef78fccd3a78b0c10a1dc5295e48a" +checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.9", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.128" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81941cd78d0c92026c33e5e01312845a4cb1e9af3407f9134b100dd03144103e" +checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6" dependencies = [ "unicode-ident", ] @@ -2315,9 +2782,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.105" +version = "0.3.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbddc4a036f00ec4f18c83445bd3115cb306a91da554919a099d9222fe4a7f8" +checksum = "88261b9deccee56594c11a3460c462c41f58d148598fe70ad77070126a68aba4" dependencies = [ "js-sys", "wasm-bindgen", @@ -2503,12 +2970,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "wit-bindgen" -version = "0.57.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" - [[package]] name = "writeable" version = "0.6.4" @@ -2525,15 +2986,6 @@ dependencies = [ "rustix", ] -[[package]] -name = "xz2" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" -dependencies = [ - "lzma-sys", -] - [[package]] name = "yoke" version = "0.8.3" @@ -2547,30 +2999,30 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.9", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.57" +version = "0.8.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d35102a9f36d089ccae9e4c6802bc118be4487b80aaffc0ab4e0cf5ce92d2873" +checksum = "e5fe1f8f1b06191a00962174c61aa5005e0bb391a6d80d07e24d115c01a92ed8" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.57" +version = "0.8.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c01f5ab44258da43cf276c74a2763db2ff3969c9c652c3f2de07041d0b2bc" +checksum = "863ad3ac83293fb4d740aedbfdc9240dd8d1a50c1099acd76ce80ce7c7230c7f" dependencies = [ "proc-macro2", "quote", @@ -2588,21 +3040,21 @@ dependencies = [ [[package]] name = "zerofrom-derive" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.9", "synstructure", ] [[package]] name = "zeroize" -version = "1.9.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +checksum = "e13084392c5e4bc371903e2935a5eaeed24905a7511356b883835e18a78f6879" dependencies = [ "zeroize_derive", ] @@ -2648,39 +3100,43 @@ checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.9", ] [[package]] name = "zip" -version = "2.4.2" +version = "9.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabe6324e908f85a1c52063ce7aa26b68dcb7eb6dbc83a2d148403c9bc3eba50" +checksum = "6e04976da629d3b04204ba8105b396a193af8ad2583b2c79bfb3ab8af580a11e" dependencies = [ "aes", - "arbitrary", - "bzip2 0.5.2", + "bzip2", "constant_time_eq", "crc32fast", - "crossbeam-utils", "deflate64", - "displaydoc", "flate2", - "getrandom 0.3.4", - "hmac", + "getrandom 0.4.3", + "hmac 0.13.0", "indexmap", - "lzma-rs", + "lzma-rust2", "memchr", + "nix", "pbkdf2", + "ppmd-rust", "sha1", - "thiserror 2.0.20", "time", - "xz2", + "typed-path", "zeroize", "zopfli", "zstd", ] +[[package]] +name = "zlib-rs" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112" + [[package]] name = "zmij" version = "1.0.23" @@ -2689,9 +3145,9 @@ checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" [[package]] name = "zopfli" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +checksum = "aaf7fc5d30c28483d93805c4a5e12b05bbb52407fa67c5f8bd552374cd01fb11" dependencies = [ "bumpalo", "crc32fast", @@ -2701,27 +3157,27 @@ dependencies = [ [[package]] name = "zstd" -version = "0.13.3" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +checksum = "db3ae9bf90af6e40197bef767eeefc46ad6397420fe873830bd85e5fbbfb3c70" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "7.3.0" +version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d80649ab6db9d9f6f9c80a40becd948eda4714a0a5ac8c4d157a32231c7882" +checksum = "ded520f16b29e1a9b771c722221b2b0a0398c2316d9bb3c42b458a5414d7434b" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.1.0+zstd.1.5.7" +version = "2.1.2+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef0a8027ec3ee71300ab3bcbcd0393f434aa72b91ca6d635a39941deae8eea0" +checksum = "481ada9c543b2323cbb7bbdbb5249177fbf0188ed959ed2c15e4b22421c84ed3" dependencies = [ "cc", "pkg-config", diff --git a/openless-all/ios/CoreHost/src/account_sync_tests.rs b/openless-all/ios/CoreHost/src/account_sync_tests.rs index e6ac47646..552c46139 100644 --- a/openless-all/ios/CoreHost/src/account_sync_tests.rs +++ b/openless-all/ios/CoreHost/src/account_sync_tests.rs @@ -219,7 +219,9 @@ fn account_sync_real_core_device_flow_keychain_adapter_reopen_and_signout_preser assert!(credentials.read(provider).await.unwrap().is_some()); assert_eq!(before.0,serde_json::to_value(backend.list_vocabulary().unwrap()).unwrap()); assert_eq!(before.1,serde_json::to_value(backend.list_history().unwrap()).unwrap()); - assert!(!dir.path().join("encrypted-sync").exists()); + // Core's local migration journal shares this root; remote sync stays absent. + assert!(!dir.path().join("encrypted-sync/protected").exists()); + assert!(backend.cloud_sync_e2ee_status().is_err()); assert_eq!(server.count.load(Ordering::Acquire),3); server.assert_complete(); }); } @@ -266,7 +268,7 @@ fn account_sync_all_sync_controls_fail_closed_without_capture_credentials_or_net } assert_eq!(server.count.load(Ordering::Acquire), 0); assert!(backend.cloud_sync_e2ee_status().is_err()); - assert!(!dir.path().join("encrypted-sync").exists()); + assert!(!dir.path().join("encrypted-sync/protected").exists()); }); } diff --git a/openless-all/ios/CoreHost/src/lib.rs b/openless-all/ios/CoreHost/src/lib.rs index 1fb633849..3e6055de6 100644 --- a/openless-all/ios/CoreHost/src/lib.rs +++ b/openless-all/ios/CoreHost/src/lib.rs @@ -530,6 +530,10 @@ fn create_with_marketplace( "absolute data directory required", )); } + // Register the durable write gate before opening stores or applying startup + // preferences. Reopened roots must not be mistaken for an unowned restore. + let _write_gate = openless_core::cloud_sync_e2ee_store::gate::open_for_data_dir(&config.data_dir) + .map_err(|failure| error(BackendErrorCode::InvalidState, &failure.to_string()))?; let runtime = tokio::runtime::Builder::new_multi_thread() .worker_threads(2) .enable_all() diff --git a/openless-all/ios/Keyboard/KeyboardHostApplication.m b/openless-all/ios/Keyboard/KeyboardHostApplication.m index c931d5d8a..b6bbaa993 100644 --- a/openless-all/ios/Keyboard/KeyboardHostApplication.m +++ b/openless-all/ios/Keyboard/KeyboardHostApplication.m @@ -6,11 +6,8 @@ NSString *OLKeyboardHostBundleIdentifier(UIInputViewController *controller) { if (!NSThread.isMainThread || !controller.isViewLoaded || !controller.view.window) return nil; @try { - // This legacy getter is absent on current UIKit's base controllers. Check - // the actual extension parent and its ABI instead of using KVC or a PID/XPC - // heuristic. Modern systems can return nil and use the main app's real - // source navigation action or the separate on-demand arbiter query below. - // Never retain a host ID from an earlier document/keyboard lifecycle. + // Probe the attached extension parent and validate the optional getter's + // ABI. A missing getter falls through to the request-scoped host query. SEL selector = NSSelectorFromString(@"_hostBundleID"); UIViewController *candidate = controller; for (NSUInteger depth = 0; candidate && depth < 4; depth++, candidate = candidate.parentViewController) { @@ -36,9 +33,8 @@ return nil; } -// Selector evidence: KeyboardHostBundleID, commit f1106dd9f1f09e01c9c28e10e2882990bb14acdc. -// This bridge is independently implemented. Runtime signatures are checked -// before hooking/calling; no layout assumptions or historical identity cache. +// Runtime hooks require matching signatures. Query generations prevent a +// delayed callback from resolving a replacement keyboard's destination. static os_unfair_lock OLHostLock = OS_UNFAIR_LOCK_INIT; static uint64_t OLHostGeneration; static uint64_t OLHostActiveQueryID; diff --git a/openless-all/ios/README.md b/openless-all/ios/README.md index 23a8f065f..750f90443 100644 --- a/openless-all/ios/README.md +++ b/openless-all/ios/README.md @@ -1,43 +1,37 @@ -# OpenLess iOS · 原生工程 +# OpenLess iOS +Native iPhone app, keyboard extension, and recording widget. The app uses SwiftUI and UIKit; the keyboard combines UIKit controls with KeyboardKit. The main app owns audio capture, speech recognition, and the shared Rust Core. -> 历史 Build 11:默认尺寸按新参考收小,可自定义高度;保存润色选择,恢复中文候选与两步英文确认,@ 常驻,改善录音波形、翻译提示和 thinking 文案。[目标与实现](docs/ios-build11-goals.md) · [交付与验证](docs/ios-build11-release.md) · [未签名 IPA](Artifacts/release-11/OpenLess-0.1.0-11-unsigned.ipa)。 +## Version and platform support -> 历史 Build 10:隐藏 VideoCall PiP 与共存适配、锁屏/前后台恢复、空闲音频释放、拼音原文提交和按键尺寸已落盘。[目标与实现](docs/ios-build10-goals.md) · [交付与验证](docs/ios-build10-release.md) · [未签名 IPA](Artifacts/release-10/OpenLess-0.1.0-10-unsigned.ipa)。真机隐藏、共存和扬声器效果仍待本包验收。 +`Config/Version.xcconfig` is the single version source for all three bundles. This integration is **0.1.0 (16)** and preserves the Build 15 keyboard behavior. Update `MARKETING_VERSION` and `CURRENT_PROJECT_VERSION` there, then regenerate the project with XcodeGen. Product validation rejects mismatched app/extension versions. -> 历史 Build 7:修复后台音频准入过期误判、中英文切换后未重新准备、旧输入目标交付阻塞新录音;加入离线英文下一词和中文续词,扩大发送按钮、更新按键音与原生触感,消除风格/词典切换的整页淡入闪烁。[下载未签名 IPA](Artifacts/interaction-build7/OpenLess-0.1.0-7-unsigned.ipa);[交付与验证记录](Artifacts/interaction-build7/README.md)。 +| Component | Minimum iOS | Responsibility | +| --- | --- | --- | +| `OpenLess` | 16 | Settings, speech, processing, history, vocabulary, and styles | +| `OpenLessKeyboard` | 16 | Typing, candidates, recording gestures, and insertion | +| `OpenLessRecordingWidget` | 18 | Recording controls and Live Activity integration | -> 最新产品范围以 [完整需求与 To-do](docs/requirements-and-todo.md) 为准;2026-10-17 的实现、安装产物及验证范围见 [验收记录](Artifacts/overnight-usability/acceptance-summary.json)。风格库/市场、翻译/帮写、词典桥接及账户页已接入;远程加密同步和完整真机运行验收仍有缺口;键盘跨应用录音的最新状态见 Build 10 目标与交付记录。 +The iOS version is independent of the desktop release version. Device builds currently target arm64 iPhone; simulator builds target Apple silicon. -原生 iPhone App + Keyboard Extension,最低部署目标 iOS 16;目前主要运行证据来自 iOS 27,旧系统还需实际设备验收。主 App 用 SwiftUI;UIKit 键盘扩展嵌入 KeyboardKit 9.9.0 的原生 SwiftUI 键盘,中文组合使用 Rime。没有 WebView、Hermes、React Native 或 Flutter;Rust Core 和模型只在主 App 中运行。 +## Input modes -> 当前录音实现包括系统控制中心、键盘首次自动唤醒/返回,以及有效会话内的后台重新开麦。具体测试范围见上方 Build 7 记录;旧系统和用户真机仍需验收。 -> Build 10 已移除空闲输出引擎,待机只保留 PiP;系统内部接口不兼容时降级为前台激活。设备验证名单仍为空,详见 [后台会话与 PiP 研究](docs/keepalive.md)。 +Choose **Voice focused** or **Single keyboard** in Settings. The selection, keyboard height, Chinese/English language, and selected processing style persist across keyboard sessions. -## 已写入的功能 +| Mode | Typing and voice behavior | +| --- | --- | +| Voice focused | Dedicated voice panel plus Chinese/English typing; long-press space can move the cursor or start recording | +| Single keyboard | Chinese/English typing with `123`, language switch, wide space, and the host's Return action; hold space to record | + +Both modes retain the voice toolbar, processing styles, translation, and system keyboard switching. Held recording offers cancel, translation, and send actions. Single-keyboard mode uses one configured translation output language; recording freezes that selection for the current request. Basic typing works without Full Access. Shared preferences and cross-process voice control require Full Access and matching App Group entitlements. -- 官方 OpenLess 图标与品牌;统一“语音/EN/拼”模式栏,语音页和错位排布的文字键盘共用输入和会话。 -- 26 键英文、简体全拼、真实 Rime 候选、数字符号、大小写、连续删除、光标操作、Return 类型与系统输入法切换。 -- 中文采用雾凇常用字与 20 万高频基础词,英文采用离线词频/上下文词对 + Apple 拼写纠错;空格或中文上屏后仍可选续词,候选左侧返回工具栏。见[离线候选与续词](docs/input-predictions.md)。 -- 大、小麦克风按钮共用点按/按住手势;空格长按可选移动光标或录音,进入光标模式时显示明确提示。 -- 模式滑块与页面过渡可打断;语音空白区可横滑切页,不抢按住麦克风、空格或候选的手势。Shift/Caps Lock 有可见状态,轻触反馈开关接入实际键位。 -- 普通模式固定 SenseVoice Small int8 本地 ASR,模型随 App 打包,不预设 LLM、不经过 LLM 后处理。Apple Speech 是开发者模式下可选的系统识别器,不作为静默回退。 -- 设置中连点版本号三次,经确认安全关闭任务并重载界面与 Core,进入开发者模式;不是终止/重启 iOS 进程。可配置自己的 ASR/LLM/全模态 API,传统管线和全模态管线复用桌面 Core。 -- 密钥使用主 App 的 Keychain;提供商/模型列表、验证复用 Core,只在用户主动请求时执行。iOS 选区改写 UI 已移除,共享 Core 接口仍保留。 -- 真实 PCM、音量与计时,停止先释放采集再处理结果;30 分钟上限、键盘断联自动停止。 -- Core 的会话、取消、输入结果和历史规则,通过独立 iOS Host 接线。 -- App Group SQLite + Darwin 通知。首次唤醒录音的结果自动写入返回后的当前输入框;重复通知、已尝试的写入与旧消息不会重放。 -- 独立原生试用编辑页,键盘出现时不再与 Tab 栏重叠;浅/深色界面、大字号纵向设置布局;授权被拒绝时提供实际的系统设置入口。 -- 历史详情与原文/结果复制、管理菜单和确认删除;重新润色为 Core 生成预览,不覆盖原记录。失败录音可在真实资产存在时播放/导出,完成转写无录音导出。 -- 真实概览和 7/30 天活动趋势、本地 Core 词典管理;应用主题、帮助与版本说明。已确认并启用的词条可通过 App Group 共享到 Rime;远程加密同步仍未开放。 -- 待确认文字、安装引导、隐私和许可;实验诊断保持二级入口。 -- 修复后台授权回调的 Swift actor 断言、键盘断连时空文档 UUID 强制桥接;新增真实系统回调及反复重开键盘回归。 +Chinese composition uses librime with a bounded rime-ice dictionary. Candidates expand into a grid; users can select Chinese candidates or explicitly confirm the typed Latin letters. English uses an offline frequency/context dictionary, `UITextChecker`, and the supplementary `UILexicon`. These are the input engines used by this extension, rather than the system keyboard's complete prediction model. Supplementary entries stay in memory. Key sounds use `UIDevice.playInputClick()`; haptic and sound preferences remain configurable. -首次授权由主 App 显示系统权限请求。键盘点击语音后先确认后台服务;仅在无法服务时前台唤醒,自动开始并返回原宿主。结果就绪后自动写入当前可用输入框;没有输入框时等待键盘重新连接。控制中心录音入口仍可使用。 +Normal speech recognition uses bundled SenseVoice Small int8. Developer settings can select Apple Speech or configure Core ASR/LLM/Omni providers. Recognition language is separate from typing language. Translation and polishing depend on the configured processing provider. Preparing voice access does not start recording. -## 构建 +## Build from source -环境:Xcode 27、Swift 6、CMake、Rustup、Git。构建辅助工具和开源源码保存在忽略的 `.build-tools/`、`.vendor/`;不修改系统签名配置,不安装竞品。 +Requirements: an Apple silicon Mac, Xcode 27 with its command-line tools selected, Python 3, CMake, Git, and Rustup. Bootstrap installs Rust 1.99.0 and the two iOS targets, and pins native dependencies and XcodeGen. Downloaded speech artifacts and prediction sources are checksum-verified. ```sh cd openless-all/ios @@ -45,94 +39,57 @@ cd openless-all/ios ./scripts/bootstrap-local-speech.sh ./scripts/build-rime.sh ./scripts/build-core.sh -./scripts/build.sh simulator Debug -./scripts/build.sh device Personal +python3 scripts/collect-rust-licenses.py +python3 scripts/validate-project.py +./scripts/build.sh device Release unsigned +python3 scripts/package-ipa.py DerivedData/Build/Products/Release-iphoneos/OpenLess.app \ + "$HOME/Downloads/OpenLess-0.1.0-16-unsigned.ipa" ``` -- Xcode 工程:`OpenLess.xcodeproj`,由 `project.yml` 生成,两个均保留。 -- 普通 Scheme:`OpenLess`;个人诊断 Scheme:`OpenLessPersonal`。 -- 默认设备构建不签名,不能直接安装到 iPhone;默认模拟器构建使用 ad-hoc 签名并检查有效的模拟 App Group 声明。 -- XcodeGen 按 `OPENLESS_XCODEGEN_BIN`、仓库缓存、PATH 中的已安装版本顺序解析。可用 `OPENLESS_DERIVED_DATA` 指定构建缓存目录;不会因缓存被清理而重复下载工具。 -- 无签名设备包使用显式 `validate-product.py --unsigned-device` 检查结构和资源,输出明确不包含签名/安装就绪证明。签名包与模拟器的正常校验仍严格核对实际产品 entitlement。 -- 二进制依赖和编译后拼音资源不入库;新检出必须先运行构建脚本。 -- `swift scripts/sync-brand-assets.swift` 同步仓库 `app/src-tauri/icons/` 的官方素材;只为 iOS App Icon 去除 alpha,不重画 Logo。`Resources/Brand.xcassets` 同时供 App/键盘使用。 - -### 真机签名与安装 +The unsigned IPA is for personal signing. Packaging validates the actual app, keyboard, widget, deployment floors, resource checksums, archive contents, and executable permissions. An existing output is never overwritten. -1. 复制 `Config/Local.xcconfig.example` 为 `Config/Local.xcconfig`。 -2. 填写自己的 Team ID、唯一 Bundle ID 和 App Group;主 App、键盘和录音控制扩展必须使用同一团队和 App Group。 -3. 在 Xcode 账户/开发者后台配置可用的 App Group 签名。免费个人团队若不能配置该能力,不能据此验证跨进程语音。 -4. 解锁并连接 iPhone,启用开发者模式,在 Xcode 选择真机和 `OpenLessPersonal` 运行。也可显式执行 `./scripts/build.sh device Personal signed`,该命令会请求 Xcode 的自动配置服务。 -5. 系统设置 → 通用 → 键盘 → 键盘 → 添加新键盘 → OpenLess;语音控制需要开启“允许完全访问”。基本打字不依赖完整访问。 -6. 在主 App 点击“启用语音”授权并准备本地模型;准备不会录音。普通模式不请求 Apple Speech 权限/下载。再从首页进入“试用键盘”独立编辑页。键盘中的打开 App 请求可能被系统拒绝,会提示手动打开,不调用未验证的打开应用技巧。 -7. 关闭完全访问时,中英文仍可在键盘的模式栏中切换;主 App 的默认面板、空格长按等偏好需要完全访问才能同步。 +For the simulator, use `./scripts/build.sh simulator Debug`. `OPENLESS_DERIVED_DATA` selects a build directory and `OPENLESS_XCODEGEN_BIN` selects an installed XcodeGen. `project.yml` generates the checked-in Xcode project; edit the specification before regenerating it. -尚未配置新的签名身份或安装到手机。已有模拟器录音与服务验证的准确范围见验收记录;这不是对所有系统、服务或真机状态的保证。 +For Xcode device signing, copy `Config/Local.xcconfig.example` to `Config/Local.xcconfig`, set your team, bundle ID, and App Group, then run `./scripts/build.sh device Personal signed`. All three bundles must use the same App Group. Local signing configuration stays outside Git. -## 启动本地预览 +## Enable the keyboard -```sh -IOS_SIMULATOR_ID=<设备标识> ./scripts/preview.sh -``` +1. Install the signed app and open OpenLess to enable voice access. +2. In iOS Settings, choose General → Keyboard → Keyboards → Add New Keyboard → OpenLess. +3. Enable Full Access for shared settings and voice control. +4. Choose the keyboard experience in OpenLess Settings and try it in the app's keyboard editor. -这条命令只构建并安装产品,不运行 XCTest;检查的是构建包与实际安装包中的可执行文件、编译图标、Assets.car 和键盘资源。桌面占位图、旧安装记录不算成功。界面可通过 Orca 的 iOS 预览打开;没有独立 Simulator.app 时也不需要伪造预览页。 +The main app activates voice when needed and returns to the requesting host when the runtime supports it. Active PiP can keep the session available between recordings. The isolated PiP/host-return compatibility adapters use runtime-checked private selectors and fall back when unavailable; this source build is not an App Store approval claim. Idle state does not keep the microphone or an audio render loop running. -UI 测试会临时安装 `OpenLessUITests-Runner`。`test.sh` 在正常结束或失败退出时移除它;`preview.sh` 也会清理残留 Runner,只保留一个 OpenLess 入口,不删除产品数据。 - -## 测试 +## Verification ```sh ./scripts/test.sh unit -# 只跑 App 原生 + UI,或加上上述共享/Rust/Rime/音频检查: -IOS_SIMULATOR_ID=<设备标识> ./scripts/test.sh ui -IOS_SIMULATOR_ID=<设备标识> ./scripts/test.sh all -# 使用专门的 QA 模拟器;测试会切换页面、安装键盘和关闭完全访问。 -# 导出有来源索引的截图: -python3 scripts/export-ui-evidence.py Artifacts/<测试结果>.xcresult --tag light +python3 scripts/test-interface-resources.py +python3 scripts/validate-project.py +IOS_SIMULATOR_ID= ./scripts/test.sh ui ``` -无需麦克风的测试包括:共享协议/SQLite/手势/活跃键盘租约;真实 Core 管线配合明确标识的原生测试适配器;真实 Rime 拼音与候选;AVFoundation 重采样和尾帧排空。Core 测试只使用独立临时目录。 - -UI 测试会在指定模拟器的系统设置里添加 OpenLess 键盘并关闭完全访问,验证“nihao → 你好”、English、符号/换行/删除、横屏、模式切换、编辑页避让、授权拒绝、只读诊断以及文字裁切。空历史测试要求专用 QA 数据。 - -当前完整套件 `keyboardkit-full-current.xcresult`:**12 项 UI + 4 项 App 原生通过,1 项授权回调因未授权跳过,0 失败**。包括真实键盘、默认无 LLM 的开发者重载、实际本地模型公共音频 smoke 与不可用按钮安全。另有 27 项共享 Swift、14 项 Rust Host 通过;最新带模型的无签名设备构建通过。真实授权回调只复用既有决定,不偷偷授权。另有 3 项深色检查和 1 项最大辅助字号首页/设置裁切审计通过。旧的 11 UI/3 原生是历史版本,不混算。证据及准确边界见[验证记录](docs/verification.md)。模拟器使用 ad-hoc 签名,不配置真实开发团队。 - -结果写入忽略的 `Artifacts/`,不会因 Orca 重启丢失;`UI_RESULT_BUNDLE` 可指定结果路径。UI 测试与真机录音、隐藏 PiP、输入目标行为、资源及能耗验收分别记录,不能互相替代。 +Unit checks cover shared contracts, preferences, delivery, Rust Host processing, real Rime composition, predictions, and audio conversion. UI tests exercise the installed extension and host app; use a dedicated simulator because they configure keyboard settings. `test.sh all` combines both suites. The GitHub iOS workflow checks shared Swift contracts, the Rust Host, and localization on iOS/Core changes. Runtime microphone, routing, and PiP behavior still require device testing. -## 结构与数据边界 +## Source layout -| 目录 | 职责 | +| Directory | Contents | | --- | --- | -| `App/` | 主 App、原生 ASR 调度、音频、Core、开发者配置与显式选区预览 | -| `Keyboard/` | 键位、候选、录音控制、输入目标与最终上屏 | -| `PlatformShared/` | 两个目标共用的 UIKit 说话按钮、共享容器和通知 | -| `Packages/OpenLessShared/` | 无 UI 的 v2 协议、持久化、手势策略和测试 | -| `Packages/LocalSpeech/` | 仅主 App 链接的 sherpa-onnx/ONNX Runtime 与 SenseVoice actor | -| `CoreHost/` | 独立 Rust workspace,窄 C ABI,依赖现有 `openless-core` | -| `RimeBridge/` | 基于公开 Rime C API 的 Objective-C++ 桥 | -| `Resources/` | 官方 OpenLess 图标、许可、隐私声明、输入方案与空兼容白名单 | -| `AppTests/`/`UITests/` | 真实授权回调/说话按钮测试;App 与实际扩展的 UI 回归 | - -- Core 与 Rime 的静态库只分别链接主 App/键盘,不把 Core 放进扩展。 -- 主 App 的历史在自己的 Application Support;拼音学习数据在扩展私有容器。 -- App Group 不保存原始音频。提交日志保留至多一天供错误恢复;已提交内容随清空历史清理,待确认项可单独移除。 -- 只有用户点“复制”才写剪贴板。无账户、云同步、广告、埋点或竞品 API。 -- 识别预览跨进程限长,音频使用有界队列,录音之外不维持音频采集。 -- 空闲没有键盘心跳;只有活跃的键盘录音每秒更新租约,超过 4 秒失联则停止。 - -## 依赖与许可 - -全部输入引擎/词库来自合法上游,没有取用竞品包中的二进制、字体、Logo 或商业词典。 - -- KeyboardKit **9.9.0 MIT 源码版**:`a7e33ac2e6f47e16288ce09ec8d765cd329f918c`;不是当前闭源/二进制主版本。 -- SenseVoice Small int8、sherpa-onnx 1.13.8 和 ONNX Runtime 1.28.2:固定上游与 SHA-256,见[模型来源](docs/local-speech-provenance.md)。模型约 228 MiB,不进入键盘扩展。 -- librime 1.13.1:`1c23358157934bd6e6d6981f0c0164f05393b497`,BSD-3-Clause。 -- rime-ice:`da1fbe602e38f26db846fa10120ee64c2b0324c0`,GPL-3.0-only,使用常用字表及 20 万高频基础词。方案 ID 沿用 `pinyin_simp` 以保留用户学习。 -- SymSpell 频率数据:`c239062ae02961df18ab7da1671d01b4388204e0`,MIT,英语单词与上下文词对;其上游数据归属见应用内 `prediction-data` 说明。 -- Boost 1.85.0:源码压缩包校验值固定在 bootstrap 中,BSL-1.0。 -- LevelDB、yaml-cpp、marisa、OpenCC 使用上述 librime 固定的子模块提交;禁用外部插件、glog 和原生依赖测试工具。 -- OpenLess/Core 沿用项目 AGPL-3.0-only。许可证位于 `Resources/Licenses/`;Rust 依赖由独立 `CoreHost/Cargo.lock` 固定。 - -不包含 CarPlay、耳机硬件键、九宫格、其他键盘输入语言或账户/订阅/同步体系。自定义云端服务只在开发者模式下由用户配置;没有预置第三方账号或竞品服务。 - -普通模式原文输出;开发者模式可主动启用 LLM 或全模态模型。分段合并不是改写,提供商接线/假服务测试不等于真实云端兼容性。与豆包/Typeless 的进程分工、后台缺口和处理链路见[架构与后处理对照](docs/architecture-and-processing.md)。 +| `App/` | Native app, settings, speech, audio, and Core integration | +| `Keyboard/` | Typing layout, candidates, voice gestures, and host insertion | +| `RecordingWidget/` | Recording controls and Live Activity views | +| `PlatformShared/` | Shared native controls and container access | +| `Packages/OpenLessShared/` | Versioned mailbox, preferences, gestures, and delivery contracts | +| `Packages/LocalSpeech/` | SenseVoice runtime adapter used by the app | +| `CoreHost/` | Independent Rust workspace and C ABI over `app/crates/openless-core` | +| `RimeBridge/` | Objective-C++ composition and vocabulary bridge | +| `Resources/` | Brand assets, localization, input schemas, privacy manifest, and licenses | +| `AppTests/`, `UITests/`, `Tests/` | Native, extension, and runtime fixtures | +| `scripts/` | Dependency bootstrap, builds, packaging, and validation | + +Credentials stay in the main app's Keychain. The App Group carries bounded commands and results, not raw audio. Typing data and Rime learning stay in the keyboard container; supplementary system words are not persisted. Result insertion validates the current document and records delivery to prevent stale replay. + +Dependency sources are pinned in `bootstrap.sh`, `bootstrap-local-speech.sh`, and `build-predictions.py`. Preserve `Resources/Licenses/` when distributing the app. `collect-rust-licenses.py` refreshes attribution from the locked runtime dependency graph. + +Generated frameworks, models, compiled dictionaries, logs, screenshots, signing configuration, and IPA archives are excluded from Git. Source assets, fixtures, lockfiles, and dependency notices are part of the project. diff --git a/openless-all/ios/Resources/Licenses/GlobalRefresh-PiP-NOTICE.txt b/openless-all/ios/Resources/Licenses/GlobalRefresh-PiP-NOTICE.txt index 6e57b450c..6b911793a 100644 --- a/openless-all/ios/Resources/Licenses/GlobalRefresh-PiP-NOTICE.txt +++ b/openless-all/ios/Resources/Licenses/GlobalRefresh-PiP-NOTICE.txt @@ -12,8 +12,8 @@ When modifying, distributing, or publishing an app based on this project, please retain attribution to both CaiWanFeng and Yoroin, together with the corresponding project links. -OpenLess integration (2026-10-21): +OpenLess integration: The scoped control-style and content-type adapters in App/PiPCoexistenceAdapter.swift are adapted from commit 1b62341c1d62308962fb3656192d6783631aa00c of GlobalRefresh-PiP. The application-specific lifecycle, audio ownership and transparent content are -integrated for OpenLess. No claim is made that competitor application source was recovered. +integrated for OpenLess. diff --git a/openless-all/ios/Resources/Licenses/Rust/adler2-2.0.1-LICENSE-0BSD.txt b/openless-all/ios/Resources/Licenses/Rust/adler2-2.0.1-LICENSE-0BSD.txt deleted file mode 100644 index 89336aaca..000000000 --- a/openless-all/ios/Resources/Licenses/Rust/adler2-2.0.1-LICENSE-0BSD.txt +++ /dev/null @@ -1,12 +0,0 @@ -Copyright (C) Jonas Schievink - -Permission to use, copy, modify, and/or distribute this software for -any purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN -AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/aead-0.5.2-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/aead-0.6.1-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/aead-0.5.2-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/aead-0.6.1-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/aead-0.5.2-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/aead-0.6.1-LICENSE-MIT.txt similarity index 94% rename from openless-all/ios/Resources/Licenses/Rust/aead-0.5.2-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/aead-0.6.1-LICENSE-MIT.txt index 88e64ca7b..4a68199a6 100644 --- a/openless-all/ios/Resources/Licenses/Rust/aead-0.5.2-LICENSE-MIT.txt +++ b/openless-all/ios/Resources/Licenses/Rust/aead-0.6.1-LICENSE-MIT.txt @@ -1,4 +1,4 @@ -Copyright (c) 2019 The RustCrypto Project Developers +Copyright (c) 2019-2026 The RustCrypto Project Developers Copyright (c) 2019 MobileCoin, LLC Permission is hereby granted, free of charge, to any diff --git a/openless-all/ios/Resources/Licenses/Rust/aes-0.8.4-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/aes-0.9.3-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/aes-0.8.4-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/aes-0.9.3-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/opaque-debug-0.3.1-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/aes-0.9.3-LICENSE-MIT.txt similarity index 97% rename from openless-all/ios/Resources/Licenses/Rust/opaque-debug-0.3.1-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/aes-0.9.3-LICENSE-MIT.txt index 1aef8daab..a85fb15a3 100644 --- a/openless-all/ios/Resources/Licenses/Rust/opaque-debug-0.3.1-LICENSE-MIT.txt +++ b/openless-all/ios/Resources/Licenses/Rust/aes-0.9.3-LICENSE-MIT.txt @@ -1,4 +1,5 @@ Copyright (c) 2018-2024 The RustCrypto Project Developers +Copyright (c) 2018 Artyom Pavlov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated diff --git a/openless-all/ios/Resources/Licenses/Rust/anymap3-1.1.0-COPYING.txt b/openless-all/ios/Resources/Licenses/Rust/anymap3-1.1.0-COPYING.txt new file mode 100644 index 000000000..d8060a4e2 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/anymap3-1.1.0-COPYING.txt @@ -0,0 +1,17 @@ +Copyright © 2014–2022 Chris Morgan + +This project is distributed under the terms of three different licenses, +at your choice: + +- Blue Oak Model License 1.0.0: https://blueoakcouncil.org/license/1.0.0 +- MIT License: https://opensource.org/licenses/MIT +- Apache License, Version 2.0: https://www.apache.org/licenses/LICENSE-2.0 + +If you do not have particular cause to select the MIT or the Apache-2.0 +license, Chris Morgan recommends that you select BlueOak-1.0.0, which is +better and simpler than both MIT and Apache-2.0, which are only offered +due to their greater recognition and their conventional use in the Rust +ecosystem. (BlueOak-1.0.0 was only published in March 2019.) + +When using this code, ensure you comply with the terms of at least one of +these licenses. diff --git a/openless-all/ios/Resources/Licenses/Rust/argon2-0.5.3-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/argon2-0.6.0-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/argon2-0.5.3-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/argon2-0.6.0-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/bzip2-sys-0.1.13+1.0.8-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/argon2-0.6.0-LICENSE-MIT.txt similarity index 94% rename from openless-all/ios/Resources/Licenses/Rust/bzip2-sys-0.1.13+1.0.8-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/argon2-0.6.0-LICENSE-MIT.txt index d9c0ff4e7..11d191686 100644 --- a/openless-all/ios/Resources/Licenses/Rust/bzip2-sys-0.1.13+1.0.8-LICENSE-MIT.txt +++ b/openless-all/ios/Resources/Licenses/Rust/argon2-0.6.0-LICENSE-MIT.txt @@ -1,4 +1,4 @@ -Copyright (c) 2014-2025 Alex Crichton and Contributors +Copyright (c) 2021-2026 The RustCrypto Project Developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated diff --git a/openless-all/ios/Resources/Licenses/Rust/array-init-2.1.0-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/array-init-2.1.0-LICENSE-APACHE.txt new file mode 100644 index 000000000..c1179aef4 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/array-init-2.1.0-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2017-2020 The array-init developers + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/array-init-2.1.0-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/array-init-2.1.0-LICENSE-MIT.txt new file mode 100644 index 000000000..6c7d88bab --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/array-init-2.1.0-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2017-2020 The array-init developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/blake2-0.10.6-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/base16ct-0.2.0-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/blake2-0.10.6-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/base16ct-0.2.0-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/base16ct-0.2.0-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/base16ct-0.2.0-LICENSE-MIT.txt new file mode 100644 index 000000000..f151c9982 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/base16ct-0.2.0-LICENSE-MIT.txt @@ -0,0 +1,26 @@ +Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com) +Copyright (c) 2022 The RustCrypto Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/bzip2-0.4.4-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/base64-0.23.1-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/bzip2-0.4.4-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/base64-0.23.1-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/base64-0.23.1-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/base64-0.23.1-LICENSE-MIT.txt new file mode 100644 index 000000000..5864d3814 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/base64-0.23.1-LICENSE-MIT.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2025 Alice Maz, Marshall Pierce + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/chacha20-0.9.1-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/blake2-0.11.0-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/chacha20-0.9.1-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/blake2-0.11.0-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/blake2-0.10.6-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/blake2-0.11.0-LICENSE-MIT.txt similarity index 95% rename from openless-all/ios/Resources/Licenses/Rust/blake2-0.10.6-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/blake2-0.11.0-LICENSE-MIT.txt index 872e206f2..bf966c48c 100644 --- a/openless-all/ios/Resources/Licenses/Rust/blake2-0.10.6-LICENSE-MIT.txt +++ b/openless-all/ios/Resources/Licenses/Rust/blake2-0.11.0-LICENSE-MIT.txt @@ -1,5 +1,6 @@ -Copyright (c) 2015-2016 The blake2-rfc Developers, Cesar Barros +Copyright (c) 2017-2026 The RustCrypto Project Developers Copyright (c) 2017 Artyom Pavlov +Copyright (c) 2015-2016 The blake2-rfc Developers, Cesar Barros Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated diff --git a/openless-all/ios/Resources/Licenses/Rust/chacha20poly1305-0.10.1-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/block-buffer-0.12.1-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/chacha20poly1305-0.10.1-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/block-buffer-0.12.1-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/argon2-0.5.3-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/block-buffer-0.12.1-LICENSE-MIT.txt similarity index 94% rename from openless-all/ios/Resources/Licenses/Rust/argon2-0.5.3-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/block-buffer-0.12.1-LICENSE-MIT.txt index 6f139a79c..ecb2ee5c5 100644 --- a/openless-all/ios/Resources/Licenses/Rust/argon2-0.5.3-LICENSE-MIT.txt +++ b/openless-all/ios/Resources/Licenses/Rust/block-buffer-0.12.1-LICENSE-MIT.txt @@ -1,4 +1,4 @@ -Copyright (c) 2021-2024 The RustCrypto Project Developers +Copyright (c) 2018-2025 The RustCrypto Project Developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated diff --git a/openless-all/ios/Resources/Licenses/Rust/byteorder-1.5.0-COPYING.txt b/openless-all/ios/Resources/Licenses/Rust/byteorder-1.5.0-COPYING.txt deleted file mode 100644 index bb9c20a09..000000000 --- a/openless-all/ios/Resources/Licenses/Rust/byteorder-1.5.0-COPYING.txt +++ /dev/null @@ -1,3 +0,0 @@ -This project is dual-licensed under the Unlicense and MIT licenses. - -You may use this code under the terms of either license. diff --git a/openless-all/ios/Resources/Licenses/Rust/byteorder-1.5.0-UNLICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/byteorder-1.5.0-UNLICENSE.txt deleted file mode 100644 index 68a49daad..000000000 --- a/openless-all/ios/Resources/Licenses/Rust/byteorder-1.5.0-UNLICENSE.txt +++ /dev/null @@ -1,24 +0,0 @@ -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. - -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to diff --git a/openless-all/ios/Resources/Licenses/Rust/bzip2-0.5.2-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/bzip2-0.6.1-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/bzip2-0.5.2-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/bzip2-0.6.1-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/bzip2-0.5.2-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/bzip2-0.6.1-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/bzip2-0.5.2-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/bzip2-0.6.1-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/bzip2-sys-0.1.13+1.0.8-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/cc-1.9.0-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/bzip2-sys-0.1.13+1.0.8-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/cc-1.9.0-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/bzip2-0.4.4-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/cc-1.9.0-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/bzip2-0.4.4-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/cc-1.9.0-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/cc-1.4.5-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/cfg-if-1.0.5-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/cc-1.4.5-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/cfg-if-1.0.5-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/cc-1.4.5-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/cfg-if-1.0.5-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/cc-1.4.5-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/cfg-if-1.0.5-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/cipher-0.4.4-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/chacha20poly1305-0.11.0-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/cipher-0.4.4-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/chacha20poly1305-0.11.0-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/chacha20-0.9.1-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/chacha20poly1305-0.11.0-LICENSE-MIT.txt similarity index 94% rename from openless-all/ios/Resources/Licenses/Rust/chacha20-0.9.1-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/chacha20poly1305-0.11.0-LICENSE-MIT.txt index 2889a9a80..f9d910e2f 100644 --- a/openless-all/ios/Resources/Licenses/Rust/chacha20-0.9.1-LICENSE-MIT.txt +++ b/openless-all/ios/Resources/Licenses/Rust/chacha20poly1305-0.11.0-LICENSE-MIT.txt @@ -1,4 +1,4 @@ -Copyright (c) 2019-2023 The RustCrypto Project Developers +Copyright (c) 2019-2026 The RustCrypto Project Developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated diff --git a/openless-all/ios/Resources/Licenses/Rust/inout-0.1.4-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/cipher-0.5.2-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/inout-0.1.4-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/cipher-0.5.2-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/cipher-0.4.4-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/cipher-0.5.2-LICENSE-MIT.txt similarity index 95% rename from openless-all/ios/Resources/Licenses/Rust/cipher-0.4.4-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/cipher-0.5.2-LICENSE-MIT.txt index f3a832c3b..82812ae61 100644 --- a/openless-all/ios/Resources/Licenses/Rust/cipher-0.4.4-LICENSE-MIT.txt +++ b/openless-all/ios/Resources/Licenses/Rust/cipher-0.5.2-LICENSE-MIT.txt @@ -1,4 +1,4 @@ -Copyright (c) 2016-2020 RustCrypto Developers +Copyright (c) 2016-2025 RustCrypto Developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated diff --git a/openless-all/ios/Resources/Licenses/Rust/lru-slab-0.1.2-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/cmov-0.5.4-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/lru-slab-0.1.2-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/cmov-0.5.4-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/cmov-0.5.4-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/cmov-0.5.4-LICENSE-MIT.txt new file mode 100644 index 000000000..5b37ba5c5 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/cmov-0.5.4-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2022-2026 The RustCrypto Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/md-5-0.10.6-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/const-oid-0.10.2-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/md-5-0.10.6-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/const-oid-0.10.2-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/const-oid-0.10.2-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/const-oid-0.10.2-LICENSE-MIT.txt new file mode 100644 index 000000000..b135e18de --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/const-oid-0.10.2-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2020-2026 The RustCrypto Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/opaque-debug-0.3.1-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/const-oid-0.9.6-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/opaque-debug-0.3.1-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/const-oid-0.9.6-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/const-oid-0.9.6-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/const-oid-0.9.6-LICENSE-MIT.txt new file mode 100644 index 000000000..1b7880915 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/const-oid-0.9.6-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2020-2022 The RustCrypto Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/constant_time_eq-0.3.1-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/constant_time_eq-0.6.1-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/constant_time_eq-0.3.1-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/constant_time_eq-0.6.1-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/constant_time_eq-0.3.1-LICENSE-CC0.txt b/openless-all/ios/Resources/Licenses/Rust/constant_time_eq-0.6.1-LICENSE-CC0.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/constant_time_eq-0.3.1-LICENSE-CC0.txt rename to openless-all/ios/Resources/Licenses/Rust/constant_time_eq-0.6.1-LICENSE-CC0.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/constant_time_eq-0.3.1-LICENSE-MIT0.txt b/openless-all/ios/Resources/Licenses/Rust/constant_time_eq-0.6.1-LICENSE-MIT0.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/constant_time_eq-0.3.1-LICENSE-MIT0.txt rename to openless-all/ios/Resources/Licenses/Rust/constant_time_eq-0.6.1-LICENSE-MIT0.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/password-hash-0.5.0-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/cpubits-0.1.1-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/password-hash-0.5.0-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/cpubits-0.1.1-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/cpubits-0.1.1-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/cpubits-0.1.1-LICENSE-MIT.txt new file mode 100644 index 000000000..d49c41b52 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/cpubits-0.1.1-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2023-2026 The RustCrypto Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/pbkdf2-0.12.2-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/cpufeatures-0.3.1-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/pbkdf2-0.12.2-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/cpufeatures-0.3.1-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/cpufeatures-0.3.1-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/cpufeatures-0.3.1-LICENSE-MIT.txt new file mode 100644 index 000000000..b135e18de --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/cpufeatures-0.3.1-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2020-2026 The RustCrypto Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/crc32fast-1.5.1-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/crc32fast-1.5.2-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/crc32fast-1.5.1-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/crc32fast-1.5.2-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/crc32fast-1.5.1-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/crc32fast-1.5.2-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/crc32fast-1.5.1-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/crc32fast-1.5.2-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/poly1305-0.8.0-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/crypto-bigint-0.5.5-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/poly1305-0.8.0-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/crypto-bigint-0.5.5-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/chacha20poly1305-0.10.1-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/crypto-bigint-0.5.5-LICENSE-MIT.txt similarity index 95% rename from openless-all/ios/Resources/Licenses/Rust/chacha20poly1305-0.10.1-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/crypto-bigint-0.5.5-LICENSE-MIT.txt index b7f571161..c869ada57 100644 --- a/openless-all/ios/Resources/Licenses/Rust/chacha20poly1305-0.10.1-LICENSE-MIT.txt +++ b/openless-all/ios/Resources/Licenses/Rust/crypto-bigint-0.5.5-LICENSE-MIT.txt @@ -1,4 +1,4 @@ -Copyright (c) 2019 The RustCrypto Project Developers +Copyright (c) 2021 The RustCrypto Project Developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated diff --git a/openless-all/ios/Resources/Licenses/Rust/sha1-0.10.7-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/crypto-common-0.2.2-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/sha1-0.10.7-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/crypto-common-0.2.2-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/aes-0.8.4-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/crypto-common-0.2.2-LICENSE-MIT.txt similarity index 95% rename from openless-all/ios/Resources/Licenses/Rust/aes-0.8.4-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/crypto-common-0.2.2-LICENSE-MIT.txt index f5b157a6c..4296756c6 100644 --- a/openless-all/ios/Resources/Licenses/Rust/aes-0.8.4-LICENSE-MIT.txt +++ b/openless-all/ios/Resources/Licenses/Rust/crypto-common-0.2.2-LICENSE-MIT.txt @@ -1,4 +1,4 @@ -Copyright (c) 2018 Artyom Pavlov +Copyright (c) 2021-2026 RustCrypto Developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated diff --git a/openless-all/ios/Resources/Licenses/Rust/tinyvec-1.13.2-LICENSE-APACHE.md.txt b/openless-all/ios/Resources/Licenses/Rust/ctutils-0.4.3-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/tinyvec-1.13.2-LICENSE-APACHE.md.txt rename to openless-all/ios/Resources/Licenses/Rust/ctutils-0.4.3-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/ctutils-0.4.3-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/ctutils-0.4.3-LICENSE-MIT.txt new file mode 100644 index 000000000..232969482 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/ctutils-0.4.3-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2025-2026 The RustCrypto Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/curve25519-dalek-4.1.3-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/curve25519-dalek-4.1.3-LICENSE.txt new file mode 100644 index 000000000..ff3475745 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/curve25519-dalek-4.1.3-LICENSE.txt @@ -0,0 +1,65 @@ +Copyright (c) 2016-2021 isis agora lovecruft. All rights reserved. +Copyright (c) 2016-2021 Henry de Valence. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +======================================================================== + +Portions of curve25519-dalek were originally derived from Adam Langley's +Go ed25519 implementation, found at , +under the following licence: + +======================================================================== + +Copyright (c) 2012 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/openless-all/ios/Resources/Licenses/Rust/universal-hash-0.5.1-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/der-0.7.10-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/universal-hash-0.5.1-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/der-0.7.10-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/der-0.7.10-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/der-0.7.10-LICENSE-MIT.txt new file mode 100644 index 000000000..e0d082780 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/der-0.7.10-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2020-2023 The RustCrypto Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/deranged-0.5.8-LICENSE-Apache.txt b/openless-all/ios/Resources/Licenses/Rust/deranged-0.5.9-LICENSE-Apache.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/deranged-0.5.8-LICENSE-Apache.txt rename to openless-all/ios/Resources/Licenses/Rust/deranged-0.5.9-LICENSE-Apache.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/deranged-0.5.8-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/deranged-0.5.9-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/deranged-0.5.8-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/deranged-0.5.9-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/getrandom-0.3.4-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/digest-0.11.3-LICENSE-APACHE.txt similarity index 99% rename from openless-all/ios/Resources/Licenses/Rust/getrandom-0.3.4-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/digest-0.11.3-LICENSE-APACHE.txt index 17d74680f..78173fa2e 100644 --- a/openless-all/ios/Resources/Licenses/Rust/getrandom-0.3.4-LICENSE-APACHE.txt +++ b/openless-all/ios/Resources/Licenses/Rust/digest-0.11.3-LICENSE-APACHE.txt @@ -1,6 +1,6 @@ Apache License Version 2.0, January 2004 - https://www.apache.org/licenses/ + http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION @@ -192,7 +192,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - https://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/openless-all/ios/Resources/Licenses/Rust/digest-0.11.3-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/digest-0.11.3-LICENSE-MIT.txt new file mode 100644 index 000000000..37f14fe5e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/digest-0.11.3-LICENSE-MIT.txt @@ -0,0 +1,26 @@ +Copyright (c) 2017-2025 RustCrypto Developers +Copyright (c) 2017 Artyom Pavlov + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/easyfft-0.4.2-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/easyfft-0.4.2-LICENSE-APACHE.txt new file mode 100644 index 000000000..8f71f43fe --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/easyfft-0.4.2-LICENSE-APACHE.txt @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/openless-all/ios/Resources/Licenses/Rust/easyfft-0.4.2-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/easyfft-0.4.2-LICENSE-MIT.txt new file mode 100644 index 000000000..75dbd461c --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/easyfft-0.4.2-LICENSE-MIT.txt @@ -0,0 +1,19 @@ +Copyright (c) 2015 The RustFFT Developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/ecdsa-0.16.9-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/ecdsa-0.16.9-LICENSE-APACHE.txt new file mode 100644 index 000000000..c394d8ad9 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/ecdsa-0.16.9-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2018-2022 RustCrypto Developers + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/ecdsa-0.16.9-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/ecdsa-0.16.9-LICENSE-MIT.txt new file mode 100644 index 000000000..81a3d57ac --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/ecdsa-0.16.9-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2018-2022 RustCrypto Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/ed25519-2.2.3-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/ed25519-2.2.3-LICENSE-APACHE.txt new file mode 100644 index 000000000..c394d8ad9 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/ed25519-2.2.3-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2018-2022 RustCrypto Developers + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/ed25519-2.2.3-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/ed25519-2.2.3-LICENSE-MIT.txt new file mode 100644 index 000000000..d8d87fe29 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/ed25519-2.2.3-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2018-2023 RustCrypto Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/ed25519-dalek-2.2.0-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/ed25519-dalek-2.2.0-LICENSE.txt new file mode 100644 index 000000000..acf8498e2 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/ed25519-dalek-2.2.0-LICENSE.txt @@ -0,0 +1,28 @@ +Copyright (c) 2017-2019 isis agora lovecruft. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/openless-all/ios/Resources/Licenses/Rust/elliptic-curve-0.13.8-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/elliptic-curve-0.13.8-LICENSE-APACHE.txt new file mode 100644 index 000000000..78173fa2e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/elliptic-curve-0.13.8-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/elliptic-curve-0.13.8-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/elliptic-curve-0.13.8-LICENSE-MIT.txt new file mode 100644 index 000000000..d4ce06527 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/elliptic-curve-0.13.8-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2020-2022 RustCrypto Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/cfg-if-1.0.4-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/equivalent-1.0.3-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/cfg-if-1.0.4-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/equivalent-1.0.3-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/equivalent-1.0.2-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/equivalent-1.0.3-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/equivalent-1.0.2-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/equivalent-1.0.3-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/ferrous-opencc-0.4.0-UPSTREAM-NOTICE.txt b/openless-all/ios/Resources/Licenses/Rust/ferrous-opencc-0.4.0-UPSTREAM-NOTICE.txt new file mode 100644 index 000000000..9695bfa65 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/ferrous-opencc-0.4.0-UPSTREAM-NOTICE.txt @@ -0,0 +1,82 @@ +Package: ferrous-opencc 0.4.0 +Declared license: Apache-2.0 +Authors: apoint123 +Repository: https://github.com/apoint123/ferrous-opencc +Source revision: bd557afbf2fd07f0bc55371159d7006629dfd935 + +The upstream crate declares this license without bundling a standalone license file. +Standard license text: SPDX license-list-data v3.27.0. + +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/ferrous-opencc-compiler-0.4.0-UPSTREAM-NOTICE.txt b/openless-all/ios/Resources/Licenses/Rust/ferrous-opencc-compiler-0.4.0-UPSTREAM-NOTICE.txt new file mode 100644 index 000000000..faeb3c2ae --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/ferrous-opencc-compiler-0.4.0-UPSTREAM-NOTICE.txt @@ -0,0 +1,82 @@ +Package: ferrous-opencc-compiler 0.4.0 +Declared license: Apache-2.0 +Authors: +Repository: Not supplied by upstream +Source revision: bd557afbf2fd07f0bc55371159d7006629dfd935 + +The upstream crate declares this license without bundling a standalone license file. +Standard license text: SPDX license-list-data v3.27.0. + +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/adler2-2.0.1-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/ff-0.13.1-LICENSE-APACHE.txt similarity index 98% rename from openless-all/ios/Resources/Licenses/Rust/adler2-2.0.1-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/ff-0.13.1-LICENSE-APACHE.txt index c98d27d4f..1e5006dc1 100644 --- a/openless-all/ios/Resources/Licenses/Rust/adler2-2.0.1-LICENSE-APACHE.txt +++ b/openless-all/ios/Resources/Licenses/Rust/ff-0.13.1-LICENSE-APACHE.txt @@ -1,6 +1,6 @@ Apache License Version 2.0, January 2004 - https://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION @@ -192,10 +192,11 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - https://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + diff --git a/openless-all/ios/Resources/Licenses/Rust/byteorder-1.5.0-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/ff-0.13.1-LICENSE-MIT.txt similarity index 96% rename from openless-all/ios/Resources/Licenses/Rust/byteorder-1.5.0-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/ff-0.13.1-LICENSE-MIT.txt index 3b0a5dc09..ed3a13fdd 100644 --- a/openless-all/ios/Resources/Licenses/Rust/byteorder-1.5.0-LICENSE-MIT.txt +++ b/openless-all/ios/Resources/Licenses/Rust/ff-0.13.1-LICENSE-MIT.txt @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2015 Andrew Gallant +Copyright (c) 2017 Sean Bowe Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/openless-all/ios/Resources/Licenses/Rust/equivalent-1.0.2-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/find-msvc-tools-0.1.15-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/equivalent-1.0.2-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/find-msvc-tools-0.1.15-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/cfg-if-1.0.4-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/find-msvc-tools-0.1.15-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/cfg-if-1.0.4-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/find-msvc-tools-0.1.15-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/generic_singleton-0.5.3-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/generic_singleton-0.5.3-LICENSE-APACHE.txt new file mode 100644 index 000000000..8f71f43fe --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/generic_singleton-0.5.3-LICENSE-APACHE.txt @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/openless-all/ios/Resources/Licenses/Rust/generic_singleton-0.5.3-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/generic_singleton-0.5.3-LICENSE-MIT.txt new file mode 100644 index 000000000..75dbd461c --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/generic_singleton-0.5.3-LICENSE-MIT.txt @@ -0,0 +1,19 @@ +Copyright (c) 2015 The RustFFT Developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/getrandom-0.3.4-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/getrandom-0.3.4-LICENSE-MIT.txt deleted file mode 100644 index e54440a9e..000000000 --- a/openless-all/ios/Resources/Licenses/Rust/getrandom-0.3.4-LICENSE-MIT.txt +++ /dev/null @@ -1,26 +0,0 @@ -Copyright (c) 2018-2025 The rust-random Project Developers -Copyright (c) 2014 The Rust Project Developers - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/find-msvc-tools-0.1.12-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/group-0.13.0-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/find-msvc-tools-0.1.12-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/group-0.13.0-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/adler2-2.0.1-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/group-0.13.0-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/adler2-2.0.1-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/group-0.13.0-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/hex-0.4.3-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/hex-0.4.3-LICENSE-APACHE.txt new file mode 100644 index 000000000..8f71f43fe --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/hex-0.4.3-LICENSE-APACHE.txt @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/openless-all/ios/Resources/Licenses/Rust/miniz_oxide-0.9.1-LICENSE-MIT.md.txt b/openless-all/ios/Resources/Licenses/Rust/hex-0.4.3-LICENSE-MIT.txt similarity index 84% rename from openless-all/ios/Resources/Licenses/Rust/miniz_oxide-0.9.1-LICENSE-MIT.md.txt rename to openless-all/ios/Resources/Licenses/Rust/hex-0.4.3-LICENSE-MIT.txt index ec71b31cc..a7b461f97 100644 --- a/openless-all/ios/Resources/Licenses/Rust/miniz_oxide-0.9.1-LICENSE-MIT.md.txt +++ b/openless-all/ios/Resources/Licenses/Rust/hex-0.4.3-LICENSE-MIT.txt @@ -1,9 +1,5 @@ -MIT License - -Copyright 2013-2014 RAD Game Tools and Valve Software -Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC -Copyright (c) 2017 Frommi -Copyright (c) 2017-2024 oyvindln +Copyright (c) 2013-2014 The Rust Project Developers. +Copyright (c) 2015-2020 The rust-hex Developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/openless-all/ios/Resources/Licenses/Rust/hkdf-0.12.4-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/hkdf-0.12.4-LICENSE-APACHE.txt new file mode 100644 index 000000000..53b7ccd84 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/hkdf-0.12.4-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/openless-all/ios/Resources/Licenses/Rust/hkdf-0.12.4-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/hkdf-0.12.4-LICENSE-MIT.txt new file mode 100644 index 000000000..c0d07816b --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/hkdf-0.12.4-LICENSE-MIT.txt @@ -0,0 +1,26 @@ +Copyright (c) 2015-2018 Vlad Filippov +Copyright (c) 2018-2021 RustCrypto Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/hmac-0.13.0-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/hmac-0.13.0-LICENSE-APACHE.txt new file mode 100644 index 000000000..78173fa2e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/hmac-0.13.0-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/lzma-sys-0.1.20-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/hmac-0.13.0-LICENSE-MIT.txt similarity index 96% rename from openless-all/ios/Resources/Licenses/Rust/lzma-sys-0.1.20-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/hmac-0.13.0-LICENSE-MIT.txt index 28e630cf4..8dcb85b30 100644 --- a/openless-all/ios/Resources/Licenses/Rust/lzma-sys-0.1.20-LICENSE-MIT.txt +++ b/openless-all/ios/Resources/Licenses/Rust/hmac-0.13.0-LICENSE-MIT.txt @@ -1,4 +1,4 @@ -Copyright (c) 2016 Alex Crichton +Copyright (c) 2017 Artyom Pavlov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated diff --git a/openless-all/ios/Resources/Licenses/Rust/hybrid-array-0.4.15-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/hybrid-array-0.4.15-LICENSE-APACHE.txt new file mode 100644 index 000000000..78173fa2e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/hybrid-array-0.4.15-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/hybrid-array-0.4.15-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/hybrid-array-0.4.15-LICENSE-MIT.txt new file mode 100644 index 000000000..5b37ba5c5 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/hybrid-array-0.4.15-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2022-2026 The RustCrypto Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/hyper-1.11.1-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/hyper-1.12.0-LICENSE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/hyper-1.11.1-LICENSE.txt rename to openless-all/ios/Resources/Licenses/Rust/hyper-1.12.0-LICENSE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/hyper-rustls-0.27.9-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/hyper-rustls-0.27.10-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/hyper-rustls-0.27.9-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/hyper-rustls-0.27.10-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/hyper-rustls-0.27.9-LICENSE-ISC.txt b/openless-all/ios/Resources/Licenses/Rust/hyper-rustls-0.27.10-LICENSE-ISC.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/hyper-rustls-0.27.9-LICENSE-ISC.txt rename to openless-all/ios/Resources/Licenses/Rust/hyper-rustls-0.27.10-LICENSE-ISC.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/hyper-rustls-0.27.9-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/hyper-rustls-0.27.10-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/hyper-rustls-0.27.9-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/hyper-rustls-0.27.10-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/hyper-util-0.1.20-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/hyper-util-0.1.21-LICENSE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/hyper-util-0.1.20-LICENSE.txt rename to openless-all/ios/Resources/Licenses/Rust/hyper-util-0.1.21-LICENSE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/inout-0.2.5-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/inout-0.2.5-LICENSE-APACHE.txt new file mode 100644 index 000000000..78173fa2e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/inout-0.2.5-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/inout-0.1.4-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/inout-0.2.5-LICENSE-MIT.txt similarity index 94% rename from openless-all/ios/Resources/Licenses/Rust/inout-0.1.4-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/inout-0.2.5-LICENSE-MIT.txt index 26af94064..126fdd7bf 100644 --- a/openless-all/ios/Resources/Licenses/Rust/inout-0.1.4-LICENSE-MIT.txt +++ b/openless-all/ios/Resources/Licenses/Rust/inout-0.2.5-LICENSE-MIT.txt @@ -1,4 +1,4 @@ -Copyright (c) 2022 The RustCrypto Project Developers +Copyright (c) 2022-2025 The RustCrypto Project Developers Copyright (c) 2022 Artyom Pavlov Permission is hereby granted, free of charge, to any diff --git a/openless-all/ios/Resources/Licenses/Rust/lzma-rs-0.3.0-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/jsonwebtoken-11.1.0-LICENSE.txt similarity index 94% rename from openless-all/ios/Resources/Licenses/Rust/lzma-rs-0.3.0-LICENSE.txt rename to openless-all/ios/Resources/Licenses/Rust/jsonwebtoken-11.1.0-LICENSE.txt index ccf054e27..36272c3f2 100644 --- a/openless-all/ios/Resources/Licenses/Rust/lzma-rs-0.3.0-LICENSE.txt +++ b/openless-all/ios/Resources/Licenses/Rust/jsonwebtoken-11.1.0-LICENSE.txt @@ -1,6 +1,6 @@ -MIT License +The MIT License (MIT) -Copyright (c) 2017 - 2018 Guillaume Endignoux +Copyright (c) 2015 Vincent Prouillet Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/openless-all/ios/Resources/Licenses/Rust/lzma-sys-0.1.20-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/lazy_static-1.5.1-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/lzma-sys-0.1.20-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/lazy_static-1.5.1-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/rustix-1.1.4-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/lazy_static-1.5.1-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/rustix-1.1.4-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/lazy_static-1.5.1-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/libbz2-rs-sys-0.2.5-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/libbz2-rs-sys-0.2.5-LICENSE.txt new file mode 100644 index 000000000..f5e2b1d39 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/libbz2-rs-sys-0.2.5-LICENSE.txt @@ -0,0 +1,48 @@ + +-------------------------------------------------------------------------- + +The original program, "bzip2", the associated library "libbzip2", and all +documentation, are + +Copyright (C) 1996-2021 Julian R Seward. +Copyright (C) 2019-2020 Federico Mena Quintero +Copyright (C) 2021 Micah Snyder + +This Rust translation, "libbzip2-rs" is a derived work based on "bzip2" and +"libbzip2", and is Copyright (C) 2024-2025 Trifecta Tech Foundation and contributors + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + +3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + +4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Julian Seward, jseward@acm.org +bzip2/libbzip2 version 1.1.0 of 6 September 2010 + +-------------------------------------------------------------------------- diff --git a/openless-all/ios/Resources/Licenses/Rust/libc-0.2.189-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/libc-0.2.191-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/libc-0.2.189-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/libc-0.2.191-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/libc-0.2.189-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/libc-0.2.191-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/libc-0.2.189-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/libc-0.2.191-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/libm-0.2.16-LICENSE.txt.txt b/openless-all/ios/Resources/Licenses/Rust/libm-0.2.16-LICENSE.txt.txt new file mode 100644 index 000000000..2f8e41f14 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/libm-0.2.16-LICENSE.txt.txt @@ -0,0 +1,258 @@ +rust-lang/libm as a whole is available for use under the MIT license: + +------------------------------------------------------------------------------ +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ + +As a contributor, you agree that your code can be used under either the MIT +license or the Apache-2.0 license: + +------------------------------------------------------------------------------ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +------------------------------------------------------------------------------ + +This Rust library contains the following copyrights: + + Copyright (c) 2018 Jorge Aparicio + +Portions of this software are derived from third-party works licensed under +terms compatible with the above MIT license: + +* musl libc https://www.musl-libc.org/. This library contains the following + copyright: + + Copyright © 2005-2020 Rich Felker, et al. + +* The CORE-MATH project https://core-math.gitlabpages.inria.fr/. CORE-MATH + routines are available under the MIT license on a per-file basis. + +The musl libc COPYRIGHT file also includes the following notice relevant to +math portions of the library: + +------------------------------------------------------------------------------ +Much of the math library code (src/math/* and src/complex/*) is +Copyright © 1993,2004 Sun Microsystems or +Copyright © 2003-2011 David Schultz or +Copyright © 2003-2009 Steven G. Kargl or +Copyright © 2003-2009 Bruce D. Evans or +Copyright © 2008 Stephen L. Moshier or +Copyright © 2017-2018 Arm Limited +and labelled as such in comments in the individual source files. All +have been licensed under extremely permissive terms. +------------------------------------------------------------------------------ + +Copyright notices are retained in src/* files where relevant. diff --git a/openless-all/ios/Resources/Licenses/Rust/zeroize-1.9.0-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/lru-slab-0.1.3-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/zeroize-1.9.0-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/lru-slab-0.1.3-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/lru-slab-0.1.2-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/lru-slab-0.1.3-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/lru-slab-0.1.2-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/lru-slab-0.1.3-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/lru-slab-0.1.2-LICENSE-ZLIB.txt b/openless-all/ios/Resources/Licenses/Rust/lru-slab-0.1.3-LICENSE-ZLIB.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/lru-slab-0.1.2-LICENSE-ZLIB.txt rename to openless-all/ios/Resources/Licenses/Rust/lru-slab-0.1.3-LICENSE-ZLIB.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/miniz_oxide-0.9.1-LICENSE-APACHE.md.txt b/openless-all/ios/Resources/Licenses/Rust/lzma-rust2-0.22.0-LICENSE.txt similarity index 89% rename from openless-all/ios/Resources/Licenses/Rust/miniz_oxide-0.9.1-LICENSE-APACHE.md.txt rename to openless-all/ios/Resources/Licenses/Rust/lzma-rust2-0.22.0-LICENSE.txt index f433b1a53..f49a4e16e 100644 --- a/openless-all/ios/Resources/Licenses/Rust/miniz_oxide-0.9.1-LICENSE-APACHE.md.txt +++ b/openless-all/ios/Resources/Licenses/Rust/lzma-rust2-0.22.0-LICENSE.txt @@ -1,4 +1,3 @@ - Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -175,3 +174,28 @@ of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/openless-all/ios/Resources/Licenses/Rust/manifest.json b/openless-all/ios/Resources/Licenses/Rust/manifest.json index 8fd088875..dd7be3ccf 100644 --- a/openless-all/ios/Resources/Licenses/Rust/manifest.json +++ b/openless-all/ios/Resources/Licenses/Rust/manifest.json @@ -1,53 +1,33 @@ [ - { - "name": "adler2", - "version": "2.0.1", - "license": "0BSD OR MIT OR Apache-2.0", - "repository": "https://github.com/oyvindln/adler2", - "files": [ - { - "file": "adler2-2.0.1-LICENSE-0BSD.txt", - "sha256": "861399f8c21c042b110517e76dc6b63a2b334276c8cf17412fc3c8908ca8dc17" - }, - { - "file": "adler2-2.0.1-LICENSE-APACHE.txt", - "sha256": "8ada45cd9f843acf64e4722ae262c622a2b3b3007c7310ef36ac1061a30f6adb" - }, - { - "file": "adler2-2.0.1-LICENSE-MIT.txt", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, { "name": "aead", - "version": "0.5.2", + "version": "0.6.1", "license": "MIT OR Apache-2.0", "repository": "https://github.com/RustCrypto/traits", "files": [ { - "file": "aead-0.5.2-LICENSE-APACHE.txt", + "file": "aead-0.6.1-LICENSE-APACHE.txt", "sha256": "b1cf9a3333ca78152b859012cd4a804156e5243e9ca20ad1df7327ba5ea7405c" }, { - "file": "aead-0.5.2-LICENSE-MIT.txt", - "sha256": "949ab7b3e7140fee216f06fe3a2bd67d68dd511f8ea73c1e01c98cb348e9c8ae" + "file": "aead-0.6.1-LICENSE-MIT.txt", + "sha256": "33b32a251d445c5c03a634e64c53314c55540fc367fabdd45d9b6c8f260c028c" } ] }, { "name": "aes", - "version": "0.8.4", + "version": "0.9.3", "license": "MIT OR Apache-2.0", "repository": "https://github.com/RustCrypto/block-ciphers", "files": [ { - "file": "aes-0.8.4-LICENSE-APACHE.txt", + "file": "aes-0.9.3-LICENSE-APACHE.txt", "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" }, { - "file": "aes-0.8.4-LICENSE-MIT.txt", - "sha256": "f7e8ab639afef15573680c97f796166835cbeb3865175882fea41c60d106b733" + "file": "aes-0.9.3-LICENSE-MIT.txt", + "sha256": "25f77efa393854f7c15eaf6a2589a2071db2d7337642742763adb12bdecf0445" } ] }, @@ -87,19 +67,47 @@ } ] }, + { + "name": "anymap3", + "version": "1.1.0", + "license": "BlueOak-1.0.0 OR MIT OR Apache-2.0", + "repository": "https://github.com/reivilibre/anymap3", + "files": [ + { + "file": "anymap3-1.1.0-COPYING.txt", + "sha256": "cce3eaac7d45535f0c5421e1a7330933e816265e766f4a94f20442de9da548df" + } + ] + }, { "name": "argon2", - "version": "0.5.3", + "version": "0.6.0", "license": "MIT OR Apache-2.0", - "repository": "https://github.com/RustCrypto/password-hashes/tree/master/argon2", + "repository": "https://github.com/RustCrypto/password-hashes", "files": [ { - "file": "argon2-0.5.3-LICENSE-APACHE.txt", + "file": "argon2-0.6.0-LICENSE-APACHE.txt", "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" }, { - "file": "argon2-0.5.3-LICENSE-MIT.txt", - "sha256": "33f702959c0ea91c08b21b65cf1f08b6c122ec9e6db0b5db784a7b367d942330" + "file": "argon2-0.6.0-LICENSE-MIT.txt", + "sha256": "57a4d75c1d095bb94754a478f3cd15e60ac66a5c5627d844be01a918eea5fe88" + } + ] + }, + { + "name": "array-init", + "version": "2.1.0", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/Manishearth/array-init/", + "files": [ + { + "file": "array-init-2.1.0-LICENSE-APACHE.txt", + "sha256": "c8d9a0d15dd76ca3bf277b6bf6da56799e266eac60bdc321a97ebc6d76d5153c" + }, + { + "file": "array-init-2.1.0-LICENSE-MIT.txt", + "sha256": "e27fb2953c088c71285a4f2f54a0ac53323460ee7c2b1b838d563bd2687a38af" } ] }, @@ -139,6 +147,22 @@ } ] }, + { + "name": "base16ct", + "version": "0.2.0", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/RustCrypto/formats/tree/master/base16ct", + "files": [ + { + "file": "base16ct-0.2.0-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" + }, + { + "file": "base16ct-0.2.0-LICENSE-MIT.txt", + "sha256": "0aa8963e105e8b6e02f634484145d4e5b0f42d0a6dd05c16f8148f033383adef" + } + ] + }, { "name": "base64", "version": "0.22.1", @@ -155,6 +179,22 @@ } ] }, + { + "name": "base64", + "version": "0.23.1", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/marshallpierce/rust-base64", + "files": [ + { + "file": "base64-0.23.1-LICENSE-APACHE.txt", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "file": "base64-0.23.1-LICENSE-MIT.txt", + "sha256": "ab499c75a0f0da8e0fe83bf9ba3a27e5c39705310f07107c6c66b69958d2401c" + } + ] + }, { "name": "base64ct", "version": "1.8.3", @@ -189,17 +229,17 @@ }, { "name": "blake2", - "version": "0.10.6", + "version": "0.11.0", "license": "MIT OR Apache-2.0", "repository": "https://github.com/RustCrypto/hashes", "files": [ { - "file": "blake2-0.10.6-LICENSE-APACHE.txt", + "file": "blake2-0.11.0-LICENSE-APACHE.txt", "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" }, { - "file": "blake2-0.10.6-LICENSE-MIT.txt", - "sha256": "9c768944eb4a0422ca2efc25ea9fb2fb9e7fbd3fdb04e86b87366339cb7466db" + "file": "blake2-0.11.0-LICENSE-MIT.txt", + "sha256": "3721e5764ca384059a3521d84c0fb40373894a099d8246fe76bf0d7418041846" } ] }, @@ -219,6 +259,22 @@ } ] }, + { + "name": "block-buffer", + "version": "0.12.1", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/RustCrypto/utils", + "files": [ + { + "file": "block-buffer-0.12.1-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" + }, + { + "file": "block-buffer-0.12.1-LICENSE-MIT.txt", + "sha256": "98181e7249d0c01737645ec982499ce99a0f07eb8f7d625b8840d799d10dbc01" + } + ] + }, { "name": "bumpalo", "version": "3.20.3", @@ -259,26 +315,6 @@ } ] }, - { - "name": "byteorder", - "version": "1.5.0", - "license": "Unlicense OR MIT", - "repository": "https://github.com/BurntSushi/byteorder", - "files": [ - { - "file": "byteorder-1.5.0-COPYING.txt", - "sha256": "01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f" - }, - { - "file": "byteorder-1.5.0-LICENSE-MIT.txt", - "sha256": "0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f" - }, - { - "file": "byteorder-1.5.0-UNLICENSE.txt", - "sha256": "7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c" - } - ] - }, { "name": "bytes", "version": "1.12.1", @@ -293,80 +329,48 @@ }, { "name": "bzip2", - "version": "0.4.4", - "license": "MIT/Apache-2.0", - "repository": "https://github.com/alexcrichton/bzip2-rs", - "files": [ - { - "file": "bzip2-0.4.4-LICENSE-APACHE.txt", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "file": "bzip2-0.4.4-LICENSE-MIT.txt", - "sha256": "378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397" - } - ] - }, - { - "name": "bzip2", - "version": "0.5.2", + "version": "0.6.1", "license": "MIT OR Apache-2.0", "repository": "https://github.com/trifectatechfoundation/bzip2-rs", "files": [ { - "file": "bzip2-0.5.2-LICENSE-APACHE.txt", + "file": "bzip2-0.6.1-LICENSE-APACHE.txt", "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" }, { - "file": "bzip2-0.5.2-LICENSE-MIT.txt", - "sha256": "c8c6324cf2f0f076e3ed5dea4a21f00bd4dd6fce44f72b110bc52e7fe06f6e1e" - } - ] - }, - { - "name": "bzip2-sys", - "version": "0.1.13+1.0.8", - "license": "MIT/Apache-2.0", - "repository": "https://github.com/alexcrichton/bzip2-rs", - "files": [ - { - "file": "bzip2-sys-0.1.13+1.0.8-LICENSE-APACHE.txt", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "file": "bzip2-sys-0.1.13+1.0.8-LICENSE-MIT.txt", + "file": "bzip2-0.6.1-LICENSE-MIT.txt", "sha256": "c8c6324cf2f0f076e3ed5dea4a21f00bd4dd6fce44f72b110bc52e7fe06f6e1e" } ] }, { "name": "cc", - "version": "1.4.5", + "version": "1.9.0", "license": "MIT OR Apache-2.0", "repository": "https://github.com/rust-lang/cc-rs", "files": [ { - "file": "cc-1.4.5-LICENSE-APACHE.txt", + "file": "cc-1.9.0-LICENSE-APACHE.txt", "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" }, { - "file": "cc-1.4.5-LICENSE-MIT.txt", + "file": "cc-1.9.0-LICENSE-MIT.txt", "sha256": "378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397" } ] }, { "name": "cfg-if", - "version": "1.0.4", + "version": "1.0.5", "license": "MIT OR Apache-2.0", "repository": "https://github.com/rust-lang/cfg-if", "files": [ { - "file": "cfg-if-1.0.4-LICENSE-APACHE.txt", + "file": "cfg-if-1.0.5-LICENSE-APACHE.txt", "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" }, { - "file": "cfg-if-1.0.4-LICENSE-MIT.txt", + "file": "cfg-if-1.0.5-LICENSE-MIT.txt", "sha256": "378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397" } ] @@ -403,35 +407,19 @@ } ] }, - { - "name": "chacha20", - "version": "0.9.1", - "license": "Apache-2.0 OR MIT", - "repository": "https://github.com/RustCrypto/stream-ciphers", - "files": [ - { - "file": "chacha20-0.9.1-LICENSE-APACHE.txt", - "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" - }, - { - "file": "chacha20-0.9.1-LICENSE-MIT.txt", - "sha256": "b6f6f01b03ee7e93c0ae96d62ed39527e98a120fb951afc9de456a741ef3f204" - } - ] - }, { "name": "chacha20poly1305", - "version": "0.10.1", + "version": "0.11.0", "license": "Apache-2.0 OR MIT", - "repository": "https://github.com/RustCrypto/AEADs/tree/master/chacha20poly1305", + "repository": "https://github.com/RustCrypto/AEADs", "files": [ { - "file": "chacha20poly1305-0.10.1-LICENSE-APACHE.txt", + "file": "chacha20poly1305-0.11.0-LICENSE-APACHE.txt", "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" }, { - "file": "chacha20poly1305-0.10.1-LICENSE-MIT.txt", - "sha256": "3c0dfa33fd2e6976038555b52095699452653b1fcabe113074f14e0848a6b11e" + "file": "chacha20poly1305-0.11.0-LICENSE-MIT.txt", + "sha256": "b8c6939380a400f53e11923d50fcc4dd2fa1ba8339fd9d04cda38a0251b6c9b0" } ] }, @@ -449,36 +437,84 @@ }, { "name": "cipher", - "version": "0.4.4", + "version": "0.5.2", "license": "MIT OR Apache-2.0", "repository": "https://github.com/RustCrypto/traits", "files": [ { - "file": "cipher-0.4.4-LICENSE-APACHE.txt", + "file": "cipher-0.5.2-LICENSE-APACHE.txt", "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" }, { - "file": "cipher-0.4.4-LICENSE-MIT.txt", - "sha256": "5c7bd92d1f096f12203dc1b601e3cb17484fa1b023e30b6b8edcc80e416237ec" + "file": "cipher-0.5.2-LICENSE-MIT.txt", + "sha256": "950d712c518a02fcb7cff96950aee304a1cc5283361712c980ea21e8d6d669a5" + } + ] + }, + { + "name": "cmov", + "version": "0.5.4", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/RustCrypto/utils", + "files": [ + { + "file": "cmov-0.5.4-LICENSE-APACHE.txt", + "sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30" + }, + { + "file": "cmov-0.5.4-LICENSE-MIT.txt", + "sha256": "70c9d40f1f9545c3f133b8a67206e89da850f6468eed072281bb3701514114a9" + } + ] + }, + { + "name": "const-oid", + "version": "0.10.2", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/RustCrypto/formats", + "files": [ + { + "file": "const-oid-0.10.2-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" + }, + { + "file": "const-oid-0.10.2-LICENSE-MIT.txt", + "sha256": "73b9dc2e79c7308998dd30296e073aefaefb944a68fb89aa412c23c0edcabcaa" + } + ] + }, + { + "name": "const-oid", + "version": "0.9.6", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/RustCrypto/formats/tree/master/const-oid", + "files": [ + { + "file": "const-oid-0.9.6-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" + }, + { + "file": "const-oid-0.9.6-LICENSE-MIT.txt", + "sha256": "bada9e7ed8dc00d63502053c455d7c8d7575dfb7e8277a2a832531844d900682" } ] }, { "name": "constant_time_eq", - "version": "0.3.1", + "version": "0.6.1", "license": "CC0-1.0 OR MIT-0 OR Apache-2.0", - "repository": "https://github.com/cesarb/constant_time_eq", + "repository": "https://codeberg.org/cesarb/constant_time_eq", "files": [ { - "file": "constant_time_eq-0.3.1-LICENSE-APACHE.txt", + "file": "constant_time_eq-0.6.1-LICENSE-APACHE.txt", "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" }, { - "file": "constant_time_eq-0.3.1-LICENSE-CC0.txt", + "file": "constant_time_eq-0.6.1-LICENSE-CC0.txt", "sha256": "a2010f343487d3f7618affe54f789f5487602331c0a8d03f49e9a7c547cf0499" }, { - "file": "constant_time_eq-0.3.1-LICENSE-MIT0.txt", + "file": "constant_time_eq-0.6.1-LICENSE-MIT0.txt", "sha256": "9a3aeb3f63659c4c6302d315e1d98784d1e8559858a47ff9562e091bb922d28d" } ] @@ -515,6 +551,22 @@ } ] }, + { + "name": "cpubits", + "version": "0.1.1", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/RustCrypto/utils", + "files": [ + { + "file": "cpubits-0.1.1-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" + }, + { + "file": "cpubits-0.1.1-LICENSE-MIT.txt", + "sha256": "003736bc98408b53511b9cc8ff5d1af3bf0a8f17d53841cc39d8ab1b96a195b0" + } + ] + }, { "name": "cpufeatures", "version": "0.2.17", @@ -532,44 +584,53 @@ ] }, { - "name": "crc", - "version": "3.4.0", + "name": "cpufeatures", + "version": "0.3.1", "license": "MIT OR Apache-2.0", - "repository": "https://github.com/mrhooray/crc-rs.git", + "repository": "https://github.com/RustCrypto/utils", "files": [ { - "file": "crc-3.4.0-LICENSE-APACHE.txt", - "sha256": "470355a7eed93fcc4281ec2e0f82ca3b94e7af1e4d83629f91de8cfac34d750e" + "file": "cpufeatures-0.3.1-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" }, { - "file": "crc-3.4.0-LICENSE-MIT.txt", - "sha256": "3488679340a49ecc34d342c4009d2dabf76f4a21f12aec2ca99b15805d656544" + "file": "cpufeatures-0.3.1-LICENSE-MIT.txt", + "sha256": "73b9dc2e79c7308998dd30296e073aefaefb944a68fb89aa412c23c0edcabcaa" } ] }, - { - "name": "crc-catalog", - "version": "2.5.0", - "license": "MIT OR Apache-2.0", - "repository": "https://github.com/akhilles/crc-catalog.git", - "files": [] - }, { "name": "crc32fast", - "version": "1.5.1", + "version": "1.5.2", "license": "MIT OR Apache-2.0", "repository": "https://github.com/srijs/rust-crc32fast", "files": [ { - "file": "crc32fast-1.5.1-LICENSE-APACHE.txt", + "file": "crc32fast-1.5.2-LICENSE-APACHE.txt", "sha256": "c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08" }, { - "file": "crc32fast-1.5.1-LICENSE-MIT.txt", + "file": "crc32fast-1.5.2-LICENSE-MIT.txt", "sha256": "61d383b05b87d78f94d2937e2580cce47226d17823c0430fbcad09596537efcf" } ] }, + { + "name": "crypto-bigint", + "version": "0.5.5", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/RustCrypto/crypto-bigint", + "files": [ + { + "file": "crypto-bigint-0.5.5-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" + }, + { + "file": "crypto-bigint-0.5.5-LICENSE-MIT.txt", + "sha256": "90c503b61dee04e1449c323ec34c229dfb68d7adcb96c7e140ee55f70fce2d8e" + } + ] + }, { "name": "crypto-common", "version": "0.1.7", @@ -586,6 +647,50 @@ } ] }, + { + "name": "crypto-common", + "version": "0.2.2", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/RustCrypto/traits", + "files": [ + { + "file": "crypto-common-0.2.2-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" + }, + { + "file": "crypto-common-0.2.2-LICENSE-MIT.txt", + "sha256": "d2e7ec5355c96eeade56b09187ceb48a6a30299da3ce7531a66d3d11405ab963" + } + ] + }, + { + "name": "ctutils", + "version": "0.4.3", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/RustCrypto/utils", + "files": [ + { + "file": "ctutils-0.4.3-LICENSE-APACHE.txt", + "sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30" + }, + { + "file": "ctutils-0.4.3-LICENSE-MIT.txt", + "sha256": "91585c36e4fb9ab4ca0d3dfac5d66d3c0c62cc51f640a0e1196542daf2267eae" + } + ] + }, + { + "name": "curve25519-dalek", + "version": "4.1.3", + "license": "BSD-3-Clause", + "repository": "https://github.com/dalek-cryptography/curve25519-dalek/tree/main/curve25519-dalek", + "files": [ + { + "file": "curve25519-dalek-4.1.3-LICENSE.txt", + "sha256": "cca0bd3c4fcdba74145ef9d49c62337e2c9fbf9368288f11d0547f1b0273219f" + } + ] + }, { "name": "data-encoding", "version": "2.11.1", @@ -610,18 +715,34 @@ } ] }, + { + "name": "der", + "version": "0.7.10", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/RustCrypto/formats/tree/master/der", + "files": [ + { + "file": "der-0.7.10-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" + }, + { + "file": "der-0.7.10-LICENSE-MIT.txt", + "sha256": "ad64fcb9589f162720f3cc5010ad76ca6ad3764e11861f9192c489df176bb71d" + } + ] + }, { "name": "deranged", - "version": "0.5.8", + "version": "0.5.9", "license": "MIT OR Apache-2.0", "repository": "https://github.com/jhpratt/deranged", "files": [ { - "file": "deranged-0.5.8-LICENSE-Apache.txt", + "file": "deranged-0.5.9-LICENSE-Apache.txt", "sha256": "edd65bdd88957a205c47d53fa499eed8865a70320f0f03f6391668cb304ea376" }, { - "file": "deranged-0.5.8-LICENSE-MIT.txt", + "file": "deranged-0.5.9-LICENSE-MIT.txt", "sha256": "231c837c45eb53f108fb48929e488965bc4fcc14e9ea21d35f50e6b99d98685b" } ] @@ -642,6 +763,22 @@ } ] }, + { + "name": "digest", + "version": "0.11.3", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/RustCrypto/traits", + "files": [ + { + "file": "digest-0.11.3-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" + }, + { + "file": "digest-0.11.3-LICENSE-MIT.txt", + "sha256": "af59cea35d7f5e2777a713b8d155d65efa2c339eb43f3c14e868c6ac8506edad" + } + ] + }, { "name": "displaydoc", "version": "0.2.7", @@ -658,18 +795,94 @@ } ] }, + { + "name": "easyfft", + "version": "0.4.2", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/WalterSmuts/easyfft", + "files": [ + { + "file": "easyfft-0.4.2-LICENSE-APACHE.txt", + "sha256": "c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08" + }, + { + "file": "easyfft-0.4.2-LICENSE-MIT.txt", + "sha256": "cb22dce3ea93e49e43b70059c193184e27612526591db29a4cd95a369a2a5645" + } + ] + }, + { + "name": "ecdsa", + "version": "0.16.9", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/RustCrypto/signatures/tree/master/ecdsa", + "files": [ + { + "file": "ecdsa-0.16.9-LICENSE-APACHE.txt", + "sha256": "78779d420019e6b4630376af8e86b6b335ee8a2f89ede6e0411e0469a326aaa4" + }, + { + "file": "ecdsa-0.16.9-LICENSE-MIT.txt", + "sha256": "bdebaf9156a298f8fdab56dd26cb5144673de522d80f4c0d88e0039145f147f9" + } + ] + }, + { + "name": "ed25519", + "version": "2.2.3", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/RustCrypto/signatures/tree/master/ed25519", + "files": [ + { + "file": "ed25519-2.2.3-LICENSE-APACHE.txt", + "sha256": "78779d420019e6b4630376af8e86b6b335ee8a2f89ede6e0411e0469a326aaa4" + }, + { + "file": "ed25519-2.2.3-LICENSE-MIT.txt", + "sha256": "b3470648aff02beb36d7a53240fc9260ed80ed93bd43bace6b67d7ef7336ee33" + } + ] + }, + { + "name": "ed25519-dalek", + "version": "2.2.0", + "license": "BSD-3-Clause", + "repository": "https://github.com/dalek-cryptography/curve25519-dalek/tree/main/ed25519-dalek", + "files": [ + { + "file": "ed25519-dalek-2.2.0-LICENSE.txt", + "sha256": "7a313964a6e050794d2ad57f4863c11f6bbe055c0ae6ce2cf3b9fc45150bada3" + } + ] + }, + { + "name": "elliptic-curve", + "version": "0.13.8", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/RustCrypto/traits/tree/master/elliptic-curve", + "files": [ + { + "file": "elliptic-curve-0.13.8-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" + }, + { + "file": "elliptic-curve-0.13.8-LICENSE-MIT.txt", + "sha256": "d27687b51f2874822c1530976b7e837eac4f308d94bf3dd42047011b7d437b47" + } + ] + }, { "name": "equivalent", - "version": "1.0.2", + "version": "1.0.3", "license": "Apache-2.0 OR MIT", "repository": "https://github.com/indexmap-rs/equivalent", "files": [ { - "file": "equivalent-1.0.2-LICENSE-APACHE.txt", + "file": "equivalent-1.0.3-LICENSE-APACHE.txt", "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" }, { - "file": "equivalent-1.0.2-LICENSE-MIT.txt", + "file": "equivalent-1.0.3-LICENSE-MIT.txt", "sha256": "7365cc8878a1d7ce155a58c4ca09c3d7a6be413efa5334a80ea842912b669349" } ] @@ -711,14 +924,42 @@ "version": "0.4.0", "license": "Apache-2.0", "repository": "https://github.com/apoint123/ferrous-opencc", - "files": [] + "files": [ + { + "file": "ferrous-opencc-0.4.0-UPSTREAM-NOTICE.txt", + "sha256": "386bac628861c8e4a0d7817fd1bee5573c19035985fb63ae2b833a83191884eb", + "source": "upstream package metadata and SPDX standard text" + } + ] }, { "name": "ferrous-opencc-compiler", "version": "0.4.0", "license": "Apache-2.0", "repository": null, - "files": [] + "files": [ + { + "file": "ferrous-opencc-compiler-0.4.0-UPSTREAM-NOTICE.txt", + "sha256": "e3e98be94e329686a8c2ae05ae49d9eb21f3295d3f85948c73b9152aed72ccdb", + "source": "upstream package metadata and SPDX standard text" + } + ] + }, + { + "name": "ff", + "version": "0.13.1", + "license": "MIT/Apache-2.0", + "repository": "https://github.com/zkcrypto/ff", + "files": [ + { + "file": "ff-0.13.1-LICENSE-APACHE.txt", + "sha256": "3708458dee7f359ac6c9c5558023ed481be87e5372c43ebd7f2ca7ad23c12026" + }, + { + "file": "ff-0.13.1-LICENSE-MIT.txt", + "sha256": "8d0c1d1d4b2bebf5b9211f0e883d5a482b7808f3ed31320da14ddee95811f4ef" + } + ] }, { "name": "filetime", @@ -738,16 +979,16 @@ }, { "name": "find-msvc-tools", - "version": "0.1.12", + "version": "0.1.15", "license": "MIT OR Apache-2.0", "repository": "https://github.com/rust-lang/cc-rs", "files": [ { - "file": "find-msvc-tools-0.1.12-LICENSE-APACHE.txt", + "file": "find-msvc-tools-0.1.15-LICENSE-APACHE.txt", "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" }, { - "file": "find-msvc-tools-0.1.12-LICENSE-MIT.txt", + "file": "find-msvc-tools-0.1.15-LICENSE-MIT.txt", "sha256": "378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397" } ] @@ -929,34 +1170,34 @@ ] }, { - "name": "getrandom", - "version": "0.2.17", + "name": "generic_singleton", + "version": "0.5.3", "license": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-random/getrandom", + "repository": "https://github.com/WalterSmuts/generic_singleton", "files": [ { - "file": "getrandom-0.2.17-LICENSE-APACHE.txt", - "sha256": "aaff376532ea30a0cd5330b9502ad4a4c8bf769c539c87ffe78819d188a18ebf" + "file": "generic_singleton-0.5.3-LICENSE-APACHE.txt", + "sha256": "c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08" }, { - "file": "getrandom-0.2.17-LICENSE-MIT.txt", - "sha256": "42fa16951ce7f24b5a467a40e5b449a1d41e662f97ca779864f053f39e097737" + "file": "generic_singleton-0.5.3-LICENSE-MIT.txt", + "sha256": "cb22dce3ea93e49e43b70059c193184e27612526591db29a4cd95a369a2a5645" } ] }, { "name": "getrandom", - "version": "0.3.4", + "version": "0.2.17", "license": "MIT OR Apache-2.0", "repository": "https://github.com/rust-random/getrandom", "files": [ { - "file": "getrandom-0.3.4-LICENSE-APACHE.txt", + "file": "getrandom-0.2.17-LICENSE-APACHE.txt", "sha256": "aaff376532ea30a0cd5330b9502ad4a4c8bf769c539c87ffe78819d188a18ebf" }, { - "file": "getrandom-0.3.4-LICENSE-MIT.txt", - "sha256": "29e9fe5074bd27e0e5d5d110394fbbcd841baee2651a3c4b4560a632702cede4" + "file": "getrandom-0.2.17-LICENSE-MIT.txt", + "sha256": "42fa16951ce7f24b5a467a40e5b449a1d41e662f97ca779864f053f39e097737" } ] }, @@ -976,6 +1217,22 @@ } ] }, + { + "name": "group", + "version": "0.13.0", + "license": "MIT/Apache-2.0", + "repository": "https://github.com/zkcrypto/group", + "files": [ + { + "file": "group-0.13.0-LICENSE-APACHE.txt", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "file": "group-0.13.0-LICENSE-MIT.txt", + "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" + } + ] + }, { "name": "hashbrown", "version": "0.17.1", @@ -992,6 +1249,38 @@ } ] }, + { + "name": "hex", + "version": "0.4.3", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/KokaKiwi/rust-hex", + "files": [ + { + "file": "hex-0.4.3-LICENSE-APACHE.txt", + "sha256": "c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08" + }, + { + "file": "hex-0.4.3-LICENSE-MIT.txt", + "sha256": "f7bdb3426d045cd50efd4953026e3eb5a83d0199f458a075602611b9344da5b9" + } + ] + }, + { + "name": "hkdf", + "version": "0.12.4", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/RustCrypto/KDFs/", + "files": [ + { + "file": "hkdf-0.12.4-LICENSE-APACHE.txt", + "sha256": "59013a5c8d3a19c26a457579105915a5d51bb0c09d579f8cdedf12e4203c3018" + }, + { + "file": "hkdf-0.12.4-LICENSE-MIT.txt", + "sha256": "d288f9c9b4590446ec18c22ead8f8b5a12a3d4025b68f62dc9015063eb9cca69" + } + ] + }, { "name": "hmac", "version": "0.12.1", @@ -1008,6 +1297,22 @@ } ] }, + { + "name": "hmac", + "version": "0.13.0", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/RustCrypto/MACs", + "files": [ + { + "file": "hmac-0.13.0-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" + }, + { + "file": "hmac-0.13.0-LICENSE-MIT.txt", + "sha256": "9e0dfd2dd4173a530e238cb6adb37aa78c34c6bc7444e0e10c1ab5d8881f63ba" + } + ] + }, { "name": "http", "version": "1.5.0", @@ -1059,51 +1364,67 @@ "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" }, { - "file": "httparse-1.10.1-LICENSE-MIT.txt", - "sha256": "391a5396cec6230bfabd4ef4eb2350eb895bc5efce377a2218f5702ed020d3e3" + "file": "httparse-1.10.1-LICENSE-MIT.txt", + "sha256": "391a5396cec6230bfabd4ef4eb2350eb895bc5efce377a2218f5702ed020d3e3" + } + ] + }, + { + "name": "hybrid-array", + "version": "0.4.15", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/RustCrypto/hybrid-array", + "files": [ + { + "file": "hybrid-array-0.4.15-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" + }, + { + "file": "hybrid-array-0.4.15-LICENSE-MIT.txt", + "sha256": "70c9d40f1f9545c3f133b8a67206e89da850f6468eed072281bb3701514114a9" } ] }, { "name": "hyper", - "version": "1.11.1", + "version": "1.12.0", "license": "MIT", "repository": "https://github.com/hyperium/hyper", "files": [ { - "file": "hyper-1.11.1-LICENSE.txt", + "file": "hyper-1.12.0-LICENSE.txt", "sha256": "2d01890414494742ba4a509fcec8efa40f6d8be22cbd72be7cff08d6fda4ec89" } ] }, { "name": "hyper-rustls", - "version": "0.27.9", + "version": "0.27.10", "license": "Apache-2.0 OR ISC OR MIT", "repository": "https://github.com/rustls/hyper-rustls", "files": [ { - "file": "hyper-rustls-0.27.9-LICENSE-APACHE.txt", + "file": "hyper-rustls-0.27.10-LICENSE-APACHE.txt", "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" }, { - "file": "hyper-rustls-0.27.9-LICENSE-ISC.txt", + "file": "hyper-rustls-0.27.10-LICENSE-ISC.txt", "sha256": "7cfafc877eccc46c0e346ccbaa5c51bb6b894d2b818e617d970211e232785ad4" }, { - "file": "hyper-rustls-0.27.9-LICENSE-MIT.txt", + "file": "hyper-rustls-0.27.10-LICENSE-MIT.txt", "sha256": "709e3175b4212f7b13aa93971c9f62ff8c69ec45ad8c6532a7e0c41d7a7d6f8c" } ] }, { "name": "hyper-util", - "version": "0.1.20", + "version": "0.1.21", "license": "MIT", "repository": "https://github.com/hyperium/hyper-util", "files": [ { - "file": "hyper-util-0.1.20-LICENSE.txt", + "file": "hyper-util-0.1.21-LICENSE.txt", "sha256": "9e0a97848ea543aef745c98e84fde696a9a3e0735538f6daefdd3cb1942effc1" } ] @@ -1258,17 +1579,17 @@ }, { "name": "inout", - "version": "0.1.4", + "version": "0.2.5", "license": "MIT OR Apache-2.0", "repository": "https://github.com/RustCrypto/utils", "files": [ { - "file": "inout-0.1.4-LICENSE-APACHE.txt", + "file": "inout-0.2.5-LICENSE-APACHE.txt", "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" }, { - "file": "inout-0.1.4-LICENSE-MIT.txt", - "sha256": "304b898acad7f02e03d6d8832d682a3b43ee729ab5d3a069af5a36979083b6b4" + "file": "inout-0.2.5-LICENSE-MIT.txt", + "sha256": "a07fcacc3c60de4dc0fab10ac9d6aaba7379974e28451c99da7f7df09c25b28c" } ] }, @@ -1320,22 +1641,74 @@ } ] }, + { + "name": "jsonwebtoken", + "version": "11.1.0", + "license": "MIT", + "repository": "https://github.com/Keats/jsonwebtoken", + "files": [ + { + "file": "jsonwebtoken-11.1.0-LICENSE.txt", + "sha256": "a8012be84ea176195305bfb4e9109ed6f28860a8e697bc50302e75c2040813f3" + } + ] + }, + { + "name": "lazy_static", + "version": "1.5.1", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/rust-lang-nursery/lazy-static.rs", + "files": [ + { + "file": "lazy_static-1.5.1-LICENSE-APACHE.txt", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "file": "lazy_static-1.5.1-LICENSE-MIT.txt", + "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" + } + ] + }, + { + "name": "libbz2-rs-sys", + "version": "0.2.5", + "license": "bzip2-1.0.6", + "repository": "https://github.com/trifectatechfoundation/libbzip2-rs", + "files": [ + { + "file": "libbz2-rs-sys-0.2.5-LICENSE.txt", + "sha256": "54e1fd7bd53273e601c9599eb162a004dacddee031ae297ee7109a7beb93b1c2" + } + ] + }, { "name": "libc", - "version": "0.2.189", + "version": "0.2.191", "license": "MIT OR Apache-2.0", "repository": "https://github.com/rust-lang/libc", "files": [ { - "file": "libc-0.2.189-LICENSE-APACHE.txt", + "file": "libc-0.2.191-LICENSE-APACHE.txt", "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" }, { - "file": "libc-0.2.189-LICENSE-MIT.txt", + "file": "libc-0.2.191-LICENSE-MIT.txt", "sha256": "123a331b5dbf04c30097fa43b8f858bc85df671fe776de498d01f3d6b7c1f69e" } ] }, + { + "name": "libm", + "version": "0.2.16", + "license": "MIT", + "repository": "https://github.com/rust-lang/compiler-builtins", + "files": [ + { + "file": "libm-0.2.16-LICENSE.txt.txt", + "sha256": "3823dda7cf046602f4b4e77ec8e227863dc4736037cc85bb33d9f19febe16bb7" + } + ] + }, { "name": "litemap", "version": "0.8.3", @@ -1382,65 +1755,49 @@ }, { "name": "lru-slab", - "version": "0.1.2", + "version": "0.1.3", "license": "MIT OR Apache-2.0 OR Zlib", "repository": "https://github.com/Ralith/lru-slab", "files": [ { - "file": "lru-slab-0.1.2-LICENSE-APACHE.txt", + "file": "lru-slab-0.1.3-LICENSE-APACHE.txt", "sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30" }, { - "file": "lru-slab-0.1.2-LICENSE-MIT.txt", + "file": "lru-slab-0.1.3-LICENSE-MIT.txt", "sha256": "1466d9b4f3a59bb8997fc8d5fa977ce3f6a24bb2358793c09bfdf007039f6486" }, { - "file": "lru-slab-0.1.2-LICENSE-ZLIB.txt", + "file": "lru-slab-0.1.3-LICENSE-ZLIB.txt", "sha256": "09785877275ffada6c371b652a30e95c26b435126fc0fc62f1bc2d72171f80a4" } ] }, { - "name": "lzma-rs", - "version": "0.3.0", - "license": "MIT", - "repository": "https://github.com/gendx/lzma-rs", - "files": [ - { - "file": "lzma-rs-0.3.0-LICENSE.txt", - "sha256": "ad9f07faa5f6f671df93523293cf8c1ce24f14886fa101013c21536c7890c59b" - } - ] - }, - { - "name": "lzma-sys", - "version": "0.1.20", - "license": "MIT/Apache-2.0", - "repository": "https://github.com/alexcrichton/xz2-rs", + "name": "lzma-rust2", + "version": "0.22.0", + "license": "Apache-2.0", + "repository": "https://github.com/hasenbanck/lzma-rust2/", "files": [ { - "file": "lzma-sys-0.1.20-LICENSE-APACHE.txt", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "file": "lzma-sys-0.1.20-LICENSE-MIT.txt", - "sha256": "69036b033e4bb951821964dbc3d9b1efe6913a6e36d9c1f206de4035a1a85cc4" + "file": "lzma-rust2-0.22.0-LICENSE.txt", + "sha256": "43070e2d4e532684de521b885f385d0841030efa2b1a20bafb76133a5e1379c1" } ] }, { "name": "md-5", - "version": "0.10.6", + "version": "0.11.0", "license": "MIT OR Apache-2.0", "repository": "https://github.com/RustCrypto/hashes", "files": [ { - "file": "md-5-0.10.6-LICENSE-APACHE.txt", + "file": "md-5-0.11.0-LICENSE-APACHE.txt", "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" }, { - "file": "md-5-0.10.6-LICENSE-MIT.txt", - "sha256": "b4eb00df6e2a4d22518fcaa6a2b4646f249b3a3c9814509b22bd2091f1392ff1" + "file": "md-5-0.11.0-LICENSE-MIT.txt", + "sha256": "831e0f43ad0bf014c1c4fec5767aae470434c1d66d6e671be2d823e729063e25" } ] }, @@ -1464,6 +1821,42 @@ } ] }, + { + "name": "micyou-dsp", + "version": "0.1.0", + "license": null, + "repository": null, + "files": [ + { + "file": "micyou-dsp-0.1.0-LICENSE.txt", + "sha256": "9638e134977de4ee0c9745cf94e3a2c64c2252f88057fd5092731b9d74e75816" + }, + { + "file": "micyou-dsp-0.1.0-LICENSE-AEC7.txt.txt", + "sha256": "c41ed2d1fe4ff8660f2b7250343f078316aad743a4871ce205482236ca5f8df6" + }, + { + "file": "micyou-dsp-0.1.0-LICENSE-PureVox.txt.txt", + "sha256": "06c669821b66a2d5cb87a0eb24794e21950534bc2b1fc87f0d4b81d72999a09d" + }, + { + "file": "micyou-dsp-0.1.0-LICENSE-RNNoise.txt.txt", + "sha256": "26e8aae6fb3622e281d8d99aa7ba0df8ef3a83465d8717f2e4cacbcbed8efc92" + } + ] + }, + { + "name": "micyou-infer", + "version": "0.1.0", + "license": null, + "repository": null, + "files": [ + { + "file": "micyou-infer-0.1.0-LICENSE.txt", + "sha256": "9638e134977de4ee0c9745cf94e3a2c64c2252f88057fd5092731b9d74e75816" + } + ] + }, { "name": "mime", "version": "0.3.17", @@ -1492,38 +1885,14 @@ } ] }, - { - "name": "miniz_oxide", - "version": "0.9.1", - "license": "MIT OR Zlib OR Apache-2.0", - "repository": "https://github.com/Frommi/miniz_oxide/tree/master/miniz_oxide", - "files": [ - { - "file": "miniz_oxide-0.9.1-LICENSE.txt", - "sha256": "4108245a1f2df9d4e94df8abed5b4ba0759bb2f9b40a6b939f1be141077ae50b" - }, - { - "file": "miniz_oxide-0.9.1-LICENSE-APACHE.md.txt", - "sha256": "0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594" - }, - { - "file": "miniz_oxide-0.9.1-LICENSE-MIT.md.txt", - "sha256": "799e9ca9d179295ef372f25d3769cdda7d25bb2668add6a6a1e22d1e4c678b8d" - }, - { - "file": "miniz_oxide-0.9.1-LICENSE-ZLIB.md.txt", - "sha256": "0a54e647fe54104658b5e563c04c6f9edf251710e47bce692e0bd990a4ddaa39" - } - ] - }, { "name": "mio", - "version": "1.2.3", + "version": "1.2.4", "license": "MIT", "repository": "https://github.com/tokio-rs/mio", "files": [ { - "file": "mio-1.2.3-LICENSE.txt", + "file": "mio-1.2.4-LICENSE.txt", "sha256": "07919255c7e04793d8ea760d6c2ce32d19f9ff02bdbdde3ce90b1e1880929a9b" } ] @@ -1552,6 +1921,50 @@ } ] }, + { + "name": "nnnoiseless", + "version": "0.5.2", + "license": "BSD-3-Clause", + "repository": "https://github.com/jneem/nnnoiseless", + "files": [ + { + "file": "nnnoiseless-0.5.2-COPYING.txt", + "sha256": "26e8aae6fb3622e281d8d99aa7ba0df8ef3a83465d8717f2e4cacbcbed8efc92" + } + ] + }, + { + "name": "num-bigint-dig", + "version": "0.8.6", + "license": "MIT/Apache-2.0", + "repository": "https://github.com/dignifiedquire/num-bigint", + "files": [ + { + "file": "num-bigint-dig-0.8.6-LICENSE-APACHE.txt", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "file": "num-bigint-dig-0.8.6-LICENSE-MIT.txt", + "sha256": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb" + } + ] + }, + { + "name": "num-complex", + "version": "0.4.6", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/rust-num/num-complex", + "files": [ + { + "file": "num-complex-0.4.6-LICENSE-APACHE.txt", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "file": "num-complex-0.4.6-LICENSE-MIT.txt", + "sha256": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb" + } + ] + }, { "name": "num-conv", "version": "0.2.2", @@ -1568,6 +1981,38 @@ } ] }, + { + "name": "num-integer", + "version": "0.1.47", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/rust-num/num-integer", + "files": [ + { + "file": "num-integer-0.1.47-LICENSE-APACHE.txt", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "file": "num-integer-0.1.47-LICENSE-MIT.txt", + "sha256": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb" + } + ] + }, + { + "name": "num-iter", + "version": "0.1.46", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/rust-num/num-iter", + "files": [ + { + "file": "num-iter-0.1.46-LICENSE-APACHE.txt", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "file": "num-iter-0.1.46-LICENSE-MIT.txt", + "sha256": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb" + } + ] + }, { "name": "num-traits", "version": "0.2.19", @@ -1600,22 +2045,6 @@ } ] }, - { - "name": "opaque-debug", - "version": "0.3.1", - "license": "MIT OR Apache-2.0", - "repository": "https://github.com/RustCrypto/utils", - "files": [ - { - "file": "opaque-debug-0.3.1-LICENSE-APACHE.txt", - "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" - }, - { - "file": "opaque-debug-0.3.1-LICENSE-MIT.txt", - "sha256": "f59f5a78193597e04fd932ee9af86254d14d08be5c9d0e003ab888feccce2161" - } - ] - }, { "name": "openless-core", "version": "0.1.0", @@ -1640,6 +2069,38 @@ } ] }, + { + "name": "p256", + "version": "0.13.2", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/RustCrypto/elliptic-curves/tree/master/p256", + "files": [ + { + "file": "p256-0.13.2-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" + }, + { + "file": "p256-0.13.2-LICENSE-MIT.txt", + "sha256": "233b95ccbf90dc67e32f3e8995c489f6312d9191ebd141a931c3b684f1e3be6d" + } + ] + }, + { + "name": "p384", + "version": "0.13.1", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/RustCrypto/elliptic-curves/tree/master/p384", + "files": [ + { + "file": "p384-0.13.1-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" + }, + { + "file": "p384-0.13.1-LICENSE-MIT.txt", + "sha256": "02168781a5b59970e3da1784d2eb69f432598a3757f283dbffdafd9d483a9113" + } + ] + }, { "name": "parking_lot", "version": "0.12.5", @@ -1674,36 +2135,52 @@ }, { "name": "password-hash", - "version": "0.5.0", + "version": "0.6.1", "license": "MIT OR Apache-2.0", - "repository": "https://github.com/RustCrypto/traits/tree/master/password-hash", + "repository": "https://github.com/RustCrypto/traits", "files": [ { - "file": "password-hash-0.5.0-LICENSE-APACHE.txt", + "file": "password-hash-0.6.1-LICENSE-APACHE.txt", "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" }, { - "file": "password-hash-0.5.0-LICENSE-MIT.txt", - "sha256": "233b95ccbf90dc67e32f3e8995c489f6312d9191ebd141a931c3b684f1e3be6d" + "file": "password-hash-0.6.1-LICENSE-MIT.txt", + "sha256": "d8c4ab431f20da8452c9a217084163822e5fd9d134e1343903c929f2859fc8fd" } ] }, { "name": "pbkdf2", - "version": "0.12.2", + "version": "0.13.0", "license": "MIT OR Apache-2.0", - "repository": "https://github.com/RustCrypto/password-hashes/tree/master/pbkdf2", + "repository": "https://github.com/RustCrypto/password-hashes", "files": [ { - "file": "pbkdf2-0.12.2-LICENSE-APACHE.txt", + "file": "pbkdf2-0.13.0-LICENSE-APACHE.txt", "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" }, { - "file": "pbkdf2-0.12.2-LICENSE-MIT.txt", + "file": "pbkdf2-0.13.0-LICENSE-MIT.txt", "sha256": "8ea5cea8ddecc46a64a004406414d25529fca7eb71cfd8c0cfe49c343bff79c5" } ] }, + { + "name": "pem-rfc7468", + "version": "0.7.0", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/RustCrypto/formats/tree/master/pem-rfc7468", + "files": [ + { + "file": "pem-rfc7468-0.7.0-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" + }, + { + "file": "pem-rfc7468-0.7.0-LICENSE-MIT.txt", + "sha256": "90c503b61dee04e1449c323ec34c229dfb68d7adcb96c7e140ee55f70fce2d8e" + } + ] + }, { "name": "percent-encoding", "version": "2.3.2", @@ -1720,6 +2197,22 @@ } ] }, + { + "name": "phc", + "version": "0.6.1", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/RustCrypto/formats", + "files": [ + { + "file": "phc-0.6.1-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" + }, + { + "file": "phc-0.6.1-LICENSE-MIT.txt", + "sha256": "57a4d75c1d095bb94754a478f3cd15e60ac66a5c5627d844be01a918eea5fe88" + } + ] + }, { "name": "phf", "version": "0.13.1", @@ -1796,6 +2289,38 @@ } ] }, + { + "name": "pkcs1", + "version": "0.7.5", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/RustCrypto/formats/tree/master/pkcs1", + "files": [ + { + "file": "pkcs1-0.7.5-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" + }, + { + "file": "pkcs1-0.7.5-LICENSE-MIT.txt", + "sha256": "c995204cc6bad2ed67dd41f7d89bb9f1a9d48e0edd745732b30640d7912089a4" + } + ] + }, + { + "name": "pkcs8", + "version": "0.10.2", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/RustCrypto/formats/tree/master/pkcs8", + "files": [ + { + "file": "pkcs8-0.10.2-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" + }, + { + "file": "pkcs8-0.10.2-LICENSE-MIT.txt", + "sha256": "ad64fcb9589f162720f3cc5010ad76ca6ad3764e11861f9192c489df176bb71d" + } + ] + }, { "name": "pkg-config", "version": "0.3.34", @@ -1814,17 +2339,17 @@ }, { "name": "poly1305", - "version": "0.8.0", + "version": "0.9.1", "license": "Apache-2.0 OR MIT", "repository": "https://github.com/RustCrypto/universal-hashes", "files": [ { - "file": "poly1305-0.8.0-LICENSE-APACHE.txt", + "file": "poly1305-0.9.1-LICENSE-APACHE.txt", "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" }, { - "file": "poly1305-0.8.0-LICENSE-MIT.txt", - "sha256": "6d99fffea918d1f7dfe567029c7bd21d6fcaf310ad28c44e6511a0e1f68c79ea" + "file": "poly1305-0.9.1-LICENSE-MIT.txt", + "sha256": "b67acfaaf787b346e1d3bf7654b4fabfd20360fdeb4351cc5e9d624147824527" } ] }, @@ -1842,33 +2367,81 @@ }, { "name": "powerfmt", - "version": "0.2.0", + "version": "0.2.1", "license": "MIT OR Apache-2.0", "repository": "https://github.com/jhpratt/powerfmt", "files": [ { - "file": "powerfmt-0.2.0-LICENSE-Apache.txt", + "file": "powerfmt-0.2.1-LICENSE-Apache.txt", "sha256": "155420c6403d4e0fca34105e3c03fdd6939b64c393c7ec6f95f5b72c5474eab0" }, { - "file": "powerfmt-0.2.0-LICENSE-MIT.txt", - "sha256": "070dbc7dda03a29296f2d58bdb9b7331af90f2abc9f31df22875d1eabaf29852" + "file": "powerfmt-0.2.1-LICENSE-MIT.txt", + "sha256": "070dbc7dda03a29296f2d58bdb9b7331af90f2abc9f31df22875d1eabaf29852" + } + ] + }, + { + "name": "ppmd-rust", + "version": "1.5.1", + "license": "CC0-1.0 OR MIT-0", + "repository": "https://github.com/hasenbanck/ppmd-rust", + "files": [ + { + "file": "ppmd-rust-1.5.1-LICENSE-CC0.md.txt", + "sha256": "c2c14e64a5798ecd6e5332ed6139d950522352fb82ddfd1d620524db890712ec" + }, + { + "file": "ppmd-rust-1.5.1-LICENSE-MIT-0.md.txt", + "sha256": "5574529c6fc6bb5f1dba17056a3ae5fb5cac51bc50ae4d7cd146e13b708fe0ff" + } + ] + }, + { + "name": "ppv-lite86", + "version": "0.2.21", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/cryptocorrosion/cryptocorrosion", + "files": [ + { + "file": "ppv-lite86-0.2.21-LICENSE-APACHE.txt", + "sha256": "0218327e7a480793ffdd4eb792379a9709e5c135c7ba267f709d6f6d4d70af0a" + }, + { + "file": "ppv-lite86-0.2.21-LICENSE-MIT.txt", + "sha256": "4cada0bd02ea3692eee6f16400d86c6508bbd3bafb2b65fed0419f36d4f83e8f" + } + ] + }, + { + "name": "primal-check", + "version": "0.3.4", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/huonw/primal", + "files": [ + { + "file": "primal-check-0.3.4-LICENSE-APACHE.txt", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "file": "primal-check-0.3.4-LICENSE-MIT.txt", + "sha256": "6d3a9431e65e69c73a8923e6517b889d17549b23db406b9ec027710d16af701f" } ] }, { - "name": "ppv-lite86", - "version": "0.2.21", - "license": "MIT OR Apache-2.0", - "repository": "https://github.com/cryptocorrosion/cryptocorrosion", + "name": "primeorder", + "version": "0.13.6", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/RustCrypto/elliptic-curves/tree/master/primeorder", "files": [ { - "file": "ppv-lite86-0.2.21-LICENSE-APACHE.txt", - "sha256": "0218327e7a480793ffdd4eb792379a9709e5c135c7ba267f709d6f6d4d70af0a" + "file": "primeorder-0.13.6-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" }, { - "file": "ppv-lite86-0.2.21-LICENSE-MIT.txt", - "sha256": "4cada0bd02ea3692eee6f16400d86c6508bbd3bafb2b65fed0419f36d4f83e8f" + "file": "primeorder-0.13.6-LICENSE-MIT.txt", + "sha256": "233b95ccbf90dc67e32f3e8995c489f6312d9191ebd141a931c3b684f1e3be6d" } ] }, @@ -1914,48 +2487,48 @@ }, { "name": "quinn", - "version": "0.11.11", + "version": "0.11.12", "license": "MIT OR Apache-2.0", "repository": "https://github.com/quinn-rs/quinn", "files": [ { - "file": "quinn-0.11.11-LICENSE-APACHE.txt", + "file": "quinn-0.11.12-LICENSE-APACHE.txt", "sha256": "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4" }, { - "file": "quinn-0.11.11-LICENSE-MIT.txt", + "file": "quinn-0.11.12-LICENSE-MIT.txt", "sha256": "4b2d0aca6789fa39e03d6738e869ea0988cceba210ca34ebb59c15c463e93a04" } ] }, { "name": "quinn-proto", - "version": "0.11.17", + "version": "0.11.19", "license": "MIT OR Apache-2.0", "repository": "https://github.com/quinn-rs/quinn", "files": [ { - "file": "quinn-proto-0.11.17-LICENSE-APACHE.txt", + "file": "quinn-proto-0.11.19-LICENSE-APACHE.txt", "sha256": "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4" }, { - "file": "quinn-proto-0.11.17-LICENSE-MIT.txt", + "file": "quinn-proto-0.11.19-LICENSE-MIT.txt", "sha256": "4b2d0aca6789fa39e03d6738e869ea0988cceba210ca34ebb59c15c463e93a04" } ] }, { "name": "quinn-udp", - "version": "0.5.15", + "version": "0.5.16", "license": "MIT OR Apache-2.0", "repository": "https://github.com/quinn-rs/quinn", "files": [ { - "file": "quinn-udp-0.5.15-LICENSE-APACHE.txt", + "file": "quinn-udp-0.5.16-LICENSE-APACHE.txt", "sha256": "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4" }, { - "file": "quinn-udp-0.5.15-LICENSE-MIT.txt", + "file": "quinn-udp-0.5.16-LICENSE-MIT.txt", "sha256": "4b2d0aca6789fa39e03d6738e869ea0988cceba210ca34ebb59c15c463e93a04" } ] @@ -1990,16 +2563,16 @@ }, { "name": "rand", - "version": "0.10.2", + "version": "0.10.3", "license": "MIT OR Apache-2.0", "repository": "https://github.com/rust-random/rand", "files": [ { - "file": "rand-0.10.2-LICENSE-APACHE.txt", + "file": "rand-0.10.3-LICENSE-APACHE.txt", "sha256": "35242e7a83f69875e6edeff02291e688c97caafe2f8902e4e19b49d3e78b4cab" }, { - "file": "rand-0.10.2-LICENSE-MIT.txt", + "file": "rand-0.10.3-LICENSE-MIT.txt", "sha256": "209fbbe0ad52d9235e37badf9cadfe4dbdc87203179c0899e738b39ade42177b" } ] @@ -2084,6 +2657,19 @@ } ] }, + { + "name": "realfft", + "version": "3.5.0", + "license": "MIT", + "repository": "https://github.com/HEnquist/realfft", + "files": [ + { + "file": "realfft-3.5.0-UPSTREAM-NOTICE.txt", + "sha256": "263f2a0a7792caa1ec7ece419e7bf4e6ac1beaea5a4ab31e9a9fdbae2d00e42b", + "source": "upstream package metadata and SPDX standard text" + } + ] + }, { "name": "regex", "version": "1.13.1", @@ -2160,6 +2746,22 @@ } ] }, + { + "name": "rfc6979", + "version": "0.4.0", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/RustCrypto/signatures/tree/master/rfc6979", + "files": [ + { + "file": "rfc6979-0.4.0-LICENSE-APACHE.txt", + "sha256": "78779d420019e6b4630376af8e86b6b335ee8a2f89ede6e0411e0469a326aaa4" + }, + { + "file": "rfc6979-0.4.0-LICENSE-MIT.txt", + "sha256": "bdebaf9156a298f8fdab56dd26cb5144673de522d80f4c0d88e0039145f147f9" + } + ] + }, { "name": "ring", "version": "0.17.14", @@ -2204,6 +2806,22 @@ } ] }, + { + "name": "rsa", + "version": "0.9.10", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/RustCrypto/RSA", + "files": [ + { + "file": "rsa-0.9.10-LICENSE-APACHE.txt", + "sha256": "769f80b5bcb42ed0af4e4d2fd74e1ac9bf843cb80c5a29219d1ef3544428a6bb" + }, + { + "file": "rsa-0.9.10-LICENSE-MIT.txt", + "sha256": "30fefc3a7d6a0041541858293bcbea2dde4caa4c0a5802f996a7f7e8c0085652" + } + ] + }, { "name": "rustc-hash", "version": "2.1.3", @@ -2220,42 +2838,74 @@ } ] }, + { + "name": "rustc_version", + "version": "0.4.1", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/djc/rustc-version-rs", + "files": [ + { + "file": "rustc_version-0.4.1-LICENSE-APACHE.txt", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "file": "rustc_version-0.4.1-LICENSE-MIT.txt", + "sha256": "c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5" + } + ] + }, + { + "name": "rustfft", + "version": "6.4.1", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/ejmahler/RustFFT", + "files": [ + { + "file": "rustfft-6.4.1-LICENSE-APACHE.txt", + "sha256": "2e54cd84a645bea25943c75dd8ae67cb291e66a47a11578333c9b4b3b6b86c85" + }, + { + "file": "rustfft-6.4.1-LICENSE-MIT.txt", + "sha256": "8f5442dfa8e9169045697e386bc91d19f393c939635741fa2a665ec36ca6f0ad" + } + ] + }, { "name": "rustix", - "version": "1.1.4", + "version": "1.1.5", "license": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", "repository": "https://github.com/bytecodealliance/rustix", "files": [ { - "file": "rustix-1.1.4-LICENSE-APACHE.txt", + "file": "rustix-1.1.5-LICENSE-APACHE.txt", "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" }, { - "file": "rustix-1.1.4-LICENSE-Apache-2.0_WITH_LLVM-exception.txt", + "file": "rustix-1.1.5-LICENSE-Apache-2.0_WITH_LLVM-exception.txt", "sha256": "268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5" }, { - "file": "rustix-1.1.4-LICENSE-MIT.txt", + "file": "rustix-1.1.5-LICENSE-MIT.txt", "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" } ] }, { "name": "rustls", - "version": "0.23.44", + "version": "0.23.46", "license": "Apache-2.0 OR ISC OR MIT", "repository": "https://github.com/rustls/rustls", "files": [ { - "file": "rustls-0.23.44-LICENSE-APACHE.txt", + "file": "rustls-0.23.46-LICENSE-APACHE.txt", "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" }, { - "file": "rustls-0.23.44-LICENSE-ISC.txt", + "file": "rustls-0.23.46-LICENSE-ISC.txt", "sha256": "7cfafc877eccc46c0e346ccbaa5c51bb6b894d2b818e617d970211e232785ad4" }, { - "file": "rustls-0.23.44-LICENSE-MIT.txt", + "file": "rustls-0.23.46-LICENSE-MIT.txt", "sha256": "709e3175b4212f7b13aa93971c9f62ff8c69ec45ad8c6532a7e0c41d7a7d6f8c" } ] @@ -2288,6 +2938,22 @@ } ] }, + { + "name": "rustversion", + "version": "1.0.23", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/dtolnay/rustversion", + "files": [ + { + "file": "rustversion-1.0.23-LICENSE-APACHE.txt", + "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" + }, + { + "file": "rustversion-1.0.23-LICENSE-MIT.txt", + "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" + } + ] + }, { "name": "ryu", "version": "1.0.23", @@ -2320,6 +2986,22 @@ } ] }, + { + "name": "sec1", + "version": "0.7.3", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/RustCrypto/formats/tree/master/sec1", + "files": [ + { + "file": "sec1-0.7.3-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" + }, + { + "file": "sec1-0.7.3-LICENSE-MIT.txt", + "sha256": "4a883ecc3bb1010faed542bf63d53e530fea5e5e12cf676aed588784298ba929" + } + ] + }, { "name": "security-framework", "version": "3.7.0", @@ -2352,6 +3034,22 @@ } ] }, + { + "name": "semver", + "version": "1.0.28", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/dtolnay/semver", + "files": [ + { + "file": "semver-1.0.28-LICENSE-APACHE.txt", + "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" + }, + { + "file": "semver-1.0.28-LICENSE-MIT.txt", + "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" + } + ] + }, { "name": "serde", "version": "1.0.229", @@ -2402,16 +3100,16 @@ }, { "name": "serde_json", - "version": "1.0.151", + "version": "1.0.154", "license": "MIT OR Apache-2.0", "repository": "https://github.com/serde-rs/json", "files": [ { - "file": "serde_json-1.0.151-LICENSE-APACHE.txt", + "file": "serde_json-1.0.154-LICENSE-APACHE.txt", "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" }, { - "file": "serde_json-1.0.151-LICENSE-MIT.txt", + "file": "serde_json-1.0.154-LICENSE-MIT.txt", "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" } ] @@ -2434,17 +3132,17 @@ }, { "name": "sha1", - "version": "0.10.7", + "version": "0.11.0", "license": "MIT OR Apache-2.0", "repository": "https://github.com/RustCrypto/hashes", "files": [ { - "file": "sha1-0.10.7-LICENSE-APACHE.txt", + "file": "sha1-0.11.0-LICENSE-APACHE.txt", "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" }, { - "file": "sha1-0.10.7-LICENSE-MIT.txt", - "sha256": "b4eb00df6e2a4d22518fcaa6a2b4646f249b3a3c9814509b22bd2091f1392ff1" + "file": "sha1-0.11.0-LICENSE-MIT.txt", + "sha256": "831e0f43ad0bf014c1c4fec5767aae470434c1d66d6e671be2d823e729063e25" } ] }, @@ -2464,6 +3162,22 @@ } ] }, + { + "name": "sha2", + "version": "0.11.1", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/RustCrypto/hashes", + "files": [ + { + "file": "sha2-0.11.1-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" + }, + { + "file": "sha2-0.11.1-LICENSE-MIT.txt", + "sha256": "831e0f43ad0bf014c1c4fec5767aae470434c1d66d6e671be2d823e729063e25" + } + ] + }, { "name": "shlex", "version": "2.0.1", @@ -2480,6 +3194,22 @@ } ] }, + { + "name": "signature", + "version": "2.2.0", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/RustCrypto/traits/tree/master/signature", + "files": [ + { + "file": "signature-2.2.0-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" + }, + { + "file": "signature-2.2.0-LICENSE-MIT.txt", + "sha256": "b3470648aff02beb36d7a53240fc9260ed80ed93bd43bace6b67d7ef7336ee33" + } + ] + }, { "name": "simd-adler32", "version": "0.3.10", @@ -2510,13 +3240,21 @@ }, { "name": "siphasher", - "version": "1.0.3", - "license": "MIT/Apache-2.0", + "version": "1.0.4", + "license": "MIT OR Apache-2.0", "repository": "https://github.com/jedisct1/rust-siphash", "files": [ { - "file": "siphasher-1.0.3-COPYING.txt", + "file": "siphasher-1.0.4-COPYING.txt", "sha256": "c962ee4d1d05ddc138b202b2540219ebc57893fcf97b364852094a9a94ce1365" + }, + { + "file": "siphasher-1.0.4-LICENSE-APACHE.txt", + "sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30" + }, + { + "file": "siphasher-1.0.4-LICENSE-MIT.txt", + "sha256": "f9c4c77baa3828004ee54b8a4f2db2e88ed44a6237a493965bf551fac0fcb62d" } ] }, @@ -2534,16 +3272,16 @@ }, { "name": "smallvec", - "version": "1.16.0", + "version": "1.16.3", "license": "MIT OR Apache-2.0", "repository": "https://github.com/servo/rust-smallvec", "files": [ { - "file": "smallvec-1.16.0-LICENSE-APACHE.txt", + "file": "smallvec-1.16.3-LICENSE-APACHE.txt", "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" }, { - "file": "smallvec-1.16.0-LICENSE-MIT.txt", + "file": "smallvec-1.16.3-LICENSE-MIT.txt", "sha256": "0b28172679e0009b655da42797c03fd163a3379d5cfa67ba1f1655e974a2a1a9" } ] @@ -2564,6 +3302,34 @@ } ] }, + { + "name": "spin", + "version": "0.9.9", + "license": "MIT", + "repository": "https://github.com/mvdnes/spin-rs.git", + "files": [ + { + "file": "spin-0.9.9-LICENSE.txt", + "sha256": "6ac8711fb340c62ce0a4ecd463342d3fa0e8e70de697c863a2e1c0c53006003c" + } + ] + }, + { + "name": "spki", + "version": "0.7.3", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/RustCrypto/formats/tree/master/spki", + "files": [ + { + "file": "spki-0.7.3-LICENSE-APACHE.txt", + "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" + }, + { + "file": "spki-0.7.3-LICENSE-MIT.txt", + "sha256": "c995204cc6bad2ed67dd41f7d89bb9f1a9d48e0edd745732b30640d7912089a4" + } + ] + }, { "name": "stable_deref_trait", "version": "1.2.1", @@ -2580,6 +3346,22 @@ } ] }, + { + "name": "strength_reduce", + "version": "0.2.4", + "license": "MIT OR Apache-2.0", + "repository": "http://github.com/ejmahler/strength_reduce", + "files": [ + { + "file": "strength_reduce-0.2.4-LICENSE-APACHE.txt", + "sha256": "2e54cd84a645bea25943c75dd8ae67cb291e66a47a11578333c9b4b3b6b86c85" + }, + { + "file": "strength_reduce-0.2.4-LICENSE-MIT.txt", + "sha256": "8f5442dfa8e9169045697e386bc91d19f393c939635741fa2a665ec36ca6f0ad" + } + ] + }, { "name": "subtle", "version": "2.6.1", @@ -2610,16 +3392,16 @@ }, { "name": "syn", - "version": "3.0.5", + "version": "3.0.9", "license": "MIT OR Apache-2.0", "repository": "https://github.com/dtolnay/syn", "files": [ { - "file": "syn-3.0.5-LICENSE-APACHE.txt", + "file": "syn-3.0.9-LICENSE-APACHE.txt", "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" }, { - "file": "syn-3.0.5-LICENSE-MIT.txt", + "file": "syn-3.0.9-LICENSE-MIT.txt", "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" } ] @@ -2638,12 +3420,12 @@ }, { "name": "synstructure", - "version": "0.13.2", + "version": "0.14.0", "license": "MIT", "repository": "https://github.com/mystor/synstructure", "files": [ { - "file": "synstructure-0.13.2-LICENSE.txt", + "file": "synstructure-0.14.0-LICENSE.txt", "sha256": "219920e865eee70b7dcfc948a86b099e7f4fe2de01bcca2ca9a20c0a033f2b59" } ] @@ -2682,64 +3464,32 @@ }, { "name": "thiserror", - "version": "1.0.69", - "license": "MIT OR Apache-2.0", - "repository": "https://github.com/dtolnay/thiserror", - "files": [ - { - "file": "thiserror-1.0.69-LICENSE-APACHE.txt", - "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" - }, - { - "file": "thiserror-1.0.69-LICENSE-MIT.txt", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "thiserror", - "version": "2.0.20", - "license": "MIT OR Apache-2.0", - "repository": "https://github.com/dtolnay/thiserror", - "files": [ - { - "file": "thiserror-2.0.20-LICENSE-APACHE.txt", - "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" - }, - { - "file": "thiserror-2.0.20-LICENSE-MIT.txt", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "thiserror-impl", - "version": "1.0.69", + "version": "2.0.21", "license": "MIT OR Apache-2.0", "repository": "https://github.com/dtolnay/thiserror", "files": [ { - "file": "thiserror-impl-1.0.69-LICENSE-APACHE.txt", + "file": "thiserror-2.0.21-LICENSE-APACHE.txt", "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" }, { - "file": "thiserror-impl-1.0.69-LICENSE-MIT.txt", + "file": "thiserror-2.0.21-LICENSE-MIT.txt", "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" } ] }, { "name": "thiserror-impl", - "version": "2.0.20", + "version": "2.0.21", "license": "MIT OR Apache-2.0", "repository": "https://github.com/dtolnay/thiserror", "files": [ { - "file": "thiserror-impl-2.0.20-LICENSE-APACHE.txt", + "file": "thiserror-impl-2.0.21-LICENSE-APACHE.txt", "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" }, { - "file": "thiserror-impl-2.0.20-LICENSE-MIT.txt", + "file": "thiserror-impl-2.0.21-LICENSE-MIT.txt", "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" } ] @@ -2790,52 +3540,32 @@ }, { "name": "tinyvec", - "version": "1.13.2", + "version": "1.13.3", "license": "Zlib OR Apache-2.0 OR MIT", "repository": "https://github.com/Lokathor/tinyvec", "files": [ { - "file": "tinyvec-1.13.2-LICENSE-APACHE.md.txt", + "file": "tinyvec-1.13.3-LICENSE-APACHE.md.txt", "sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30" }, { - "file": "tinyvec-1.13.2-LICENSE-MIT.md.txt", + "file": "tinyvec-1.13.3-LICENSE-MIT.md.txt", "sha256": "fd80a26fbb3f644af1fa994134446702932968519797227e07a1368dea80f0bc" }, { - "file": "tinyvec-1.13.2-LICENSE-ZLIB.md.txt", + "file": "tinyvec-1.13.3-LICENSE-ZLIB.md.txt", "sha256": "84b34dd7608f7fb9b17bd588a6bf392bf7de504e2716f024a77d89f1b145a151" } ] }, - { - "name": "tinyvec_macros", - "version": "0.1.1", - "license": "MIT OR Apache-2.0 OR Zlib", - "repository": "https://github.com/Soveu/tinyvec_macros", - "files": [ - { - "file": "tinyvec_macros-0.1.1-LICENSE-APACHE.md.txt", - "sha256": "4f44572785f35152c1fd2eadf565b7e079c0f300b4324f0af653419f9d76b735" - }, - { - "file": "tinyvec_macros-0.1.1-LICENSE-MIT.md.txt", - "sha256": "1dd8eca0f83669e75fa119e34fb9e1be9d16e3e9b6368962b8019db6e8ae5f7b" - }, - { - "file": "tinyvec_macros-0.1.1-LICENSE-ZLIB.md.txt", - "sha256": "41ace205715d9f19a3214218cc1c01d57c533e02cd0fef7c8e51a49a7fce5ac5" - } - ] - }, { "name": "tokio", - "version": "1.53.1", + "version": "1.53.3", "license": "MIT", "repository": "https://github.com/tokio-rs/tokio", "files": [ { - "file": "tokio-1.53.1-LICENSE.txt", + "file": "tokio-1.53.3-LICENSE.txt", "sha256": "253cd04c6714889df2d32f3f64d669179a1c95c76ac43c40882c52eb06bc3552" } ] @@ -2854,40 +3584,40 @@ }, { "name": "tokio-rustls", - "version": "0.26.5", + "version": "0.26.6", "license": "MIT OR Apache-2.0", "repository": "https://github.com/rustls/tokio-rustls", "files": [ { - "file": "tokio-rustls-0.26.5-LICENSE-APACHE.txt", + "file": "tokio-rustls-0.26.6-LICENSE-APACHE.txt", "sha256": "cc117d90b498b32b11a886f279b359da16a73c3b01efbb2f5cc004b20262334e" }, { - "file": "tokio-rustls-0.26.5-LICENSE-MIT.txt", + "file": "tokio-rustls-0.26.6-LICENSE-MIT.txt", "sha256": "e20fa2b8e0a2565f24a792b94b4bf4b6c2b9d36f781d8a9516e218a036e6677a" } ] }, { "name": "tokio-tungstenite", - "version": "0.24.0", + "version": "0.30.0", "license": "MIT", "repository": "https://github.com/snapview/tokio-tungstenite", "files": [ { - "file": "tokio-tungstenite-0.24.0-LICENSE.txt", + "file": "tokio-tungstenite-0.30.0-LICENSE.txt", "sha256": "fdd55e2b2da854b0fbdc1e607df7c2ba1e1ebf91ecb77c515511ebeef972bc8f" } ] }, { "name": "tokio-util", - "version": "0.7.19", + "version": "0.7.20", "license": "MIT", "repository": "https://github.com/tokio-rs/tokio", "files": [ { - "file": "tokio-util-0.7.19-LICENSE.txt", + "file": "tokio-util-0.7.20-LICENSE.txt", "sha256": "253cd04c6714889df2d32f3f64d669179a1c95c76ac43c40882c52eb06bc3552" } ] @@ -2964,6 +3694,22 @@ } ] }, + { + "name": "transpose", + "version": "0.2.3", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/ejmahler/transpose", + "files": [ + { + "file": "transpose-0.2.3-LICENSE-APACHE.txt", + "sha256": "8797ef61538ec5ee9222ebef7ca4e0f3ec5761b145ca9943d358c450efb644dd" + }, + { + "file": "transpose-0.2.3-LICENSE-MIT.txt", + "sha256": "5080149357fd0be590bdc10cf92165412bb4d61ce496284d56f2d12874ae3121" + } + ] + }, { "name": "try-lock", "version": "0.2.5", @@ -2978,20 +3724,36 @@ }, { "name": "tungstenite", - "version": "0.24.0", + "version": "0.30.0", "license": "MIT OR Apache-2.0", "repository": "https://github.com/snapview/tungstenite-rs", "files": [ { - "file": "tungstenite-0.24.0-LICENSE-APACHE.txt", + "file": "tungstenite-0.30.0-LICENSE-APACHE.txt", "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" }, { - "file": "tungstenite-0.24.0-LICENSE-MIT.txt", + "file": "tungstenite-0.30.0-LICENSE-MIT.txt", "sha256": "7fea0ee51a4ca5d5cea7464135fd55e8b09caf3a61da3d451ac8a22af95c033f" } ] }, + { + "name": "typed-path", + "version": "0.12.3", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/chipsenkbeil/typed-path", + "files": [ + { + "file": "typed-path-0.12.3-LICENSE-APACHE.txt", + "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" + }, + { + "file": "typed-path-0.12.3-LICENSE-MIT.txt", + "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" + } + ] + }, { "name": "typenum", "version": "1.20.1", @@ -3014,69 +3776,73 @@ }, { "name": "unicase", - "version": "2.9.0", + "version": "2.10.0", "license": "MIT OR Apache-2.0", "repository": "https://github.com/seanmonstar/unicase", "files": [ { - "file": "unicase-2.9.0-LICENSE-APACHE.txt", + "file": "unicase-2.10.0-LICENSE-APACHE.txt", "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" }, { - "file": "unicase-2.9.0-LICENSE-MIT.txt", + "file": "unicase-2.10.0-LICENSE-MIT.txt", "sha256": "4f6bd11a0f17fe5b085ace1daaedb7b002a08316850dd9577c246c6a68a68e8c" } ] }, { "name": "unicode-ident", - "version": "1.0.24", + "version": "1.0.27", "license": "(MIT OR Apache-2.0) AND Unicode-3.0", "repository": "https://github.com/dtolnay/unicode-ident", "files": [ { - "file": "unicode-ident-1.0.24-LICENSE-APACHE.txt", + "file": "unicode-ident-1.0.27-LICENSE-APACHE.txt", "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" }, { - "file": "unicode-ident-1.0.24-LICENSE-MIT.txt", + "file": "unicode-ident-1.0.27-LICENSE-MIT.txt", "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" }, { - "file": "unicode-ident-1.0.24-LICENSE-UNICODE.txt", + "file": "unicode-ident-1.0.27-LICENSE-UNICODE.txt", "sha256": "f7db81051789b729fea528a63ec4c938fdcb93d9d61d97dc8cc2e9df6d47f2a1" } ] }, { "name": "unicode-normalization", - "version": "0.1.25", - "license": "MIT OR Apache-2.0", + "version": "0.1.26", + "license": "(MIT OR Apache-2.0) AND Unicode-3.0", "repository": "https://github.com/unicode-rs/unicode-normalization", "files": [ { - "file": "unicode-normalization-0.1.25-LICENSE-APACHE.txt", + "file": "unicode-normalization-0.1.26-LICENSE-APACHE.txt", "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" }, { - "file": "unicode-normalization-0.1.25-LICENSE-MIT.txt", + "file": "unicode-normalization-0.1.26-LICENSE-MIT.txt", "sha256": "7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0" + }, + { + "file": "unicode-normalization-0.1.26-LICENSE-UNICODE.txt", + "sha256": "f7db81051789b729fea528a63ec4c938fdcb93d9d61d97dc8cc2e9df6d47f2a1" } ] }, { "name": "universal-hash", - "version": "0.5.1", + "version": "0.6.1", "license": "MIT OR Apache-2.0", "repository": "https://github.com/RustCrypto/traits", "files": [ { - "file": "universal-hash-0.5.1-LICENSE-APACHE.txt", + "file": "universal-hash-0.6.1-LICENSE-APACHE.txt", "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" }, { - "file": "universal-hash-0.5.1-LICENSE-MIT.txt", - "sha256": "6b50510a0400c72172355cc5d2ba0f2c5c2eb33149b8f96539dc345fdc484920" + "file": "universal-hash-0.6.1-LICENSE-MIT.txt", + "sha256": "efa52eb70a774b62c50cf50f5e57e2625c29d375d09b91132f4f020e47b9944e" } ] }, @@ -3108,22 +3874,6 @@ } ] }, - { - "name": "utf-8", - "version": "0.7.6", - "license": "MIT OR Apache-2.0", - "repository": "https://github.com/SimonSapin/rust-utf8", - "files": [ - { - "file": "utf-8-0.7.6-LICENSE-APACHE.txt", - "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" - }, - { - "file": "utf-8-0.7.6-LICENSE-MIT.txt", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, { "name": "utf8_iter", "version": "1.0.4", @@ -3142,16 +3892,16 @@ }, { "name": "uuid", - "version": "1.26.1", + "version": "1.28.0", "license": "Apache-2.0 OR MIT", "repository": "https://github.com/uuid-rs/uuid", "files": [ { - "file": "uuid-1.26.1-LICENSE-APACHE.txt", + "file": "uuid-1.28.0-LICENSE-APACHE.txt", "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" }, { - "file": "uuid-1.26.1-LICENSE-MIT.txt", + "file": "uuid-1.28.0-LICENSE-MIT.txt", "sha256": "436bc5a105d8e57dcd8778730f3754f7bf39c14d2f530e4cde4bd2d17a83ec3d" } ] @@ -3174,12 +3924,12 @@ }, { "name": "want", - "version": "0.3.1", + "version": "0.3.2", "license": "MIT", "repository": "https://github.com/seanmonstar/want", "files": [ { - "file": "want-0.3.1-LICENSE.txt", + "file": "want-0.3.2-LICENSE.txt", "sha256": "a65f5d0a945d267751344c95665945b90c030ea107faf5c85d518929886187da" } ] @@ -3236,22 +3986,6 @@ } ] }, - { - "name": "xz2", - "version": "0.1.7", - "license": "MIT/Apache-2.0", - "repository": "https://github.com/alexcrichton/xz2-rs", - "files": [ - { - "file": "xz2-0.1.7-LICENSE-APACHE.txt", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "file": "xz2-0.1.7-LICENSE-MIT.txt", - "sha256": "69036b033e4bb951821964dbc3d9b1efe6913a6e36d9c1f206de4035a1a85cc4" - } - ] - }, { "name": "yoke", "version": "0.8.3", @@ -3266,32 +4000,32 @@ }, { "name": "yoke-derive", - "version": "0.8.2", + "version": "0.8.4", "license": "Unicode-3.0", "repository": "https://github.com/unicode-org/icu4x", "files": [ { - "file": "yoke-derive-0.8.2-LICENSE.txt", + "file": "yoke-derive-0.8.4-LICENSE.txt", "sha256": "f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2" } ] }, { "name": "zerocopy", - "version": "0.8.57", + "version": "0.8.63", "license": "BSD-2-Clause OR Apache-2.0 OR MIT", "repository": "https://github.com/google/zerocopy", "files": [ { - "file": "zerocopy-0.8.57-LICENSE-APACHE.txt", + "file": "zerocopy-0.8.63-LICENSE-APACHE.txt", "sha256": "9d185ac6703c4b0453974c0d85e9eee43e6941009296bb1f5eb0b54e2329e9f3" }, { - "file": "zerocopy-0.8.57-LICENSE-BSD.txt", + "file": "zerocopy-0.8.63-LICENSE-BSD.txt", "sha256": "83c1763356e822adde0a2cae748d938a73fdc263849ccff6b27776dff213bd32" }, { - "file": "zerocopy-0.8.57-LICENSE-MIT.txt", + "file": "zerocopy-0.8.63-LICENSE-MIT.txt", "sha256": "1a2f5c12ddc934d58956aa5dbdd3255fe55fd957633ab7d0d39e4f0daa73f7df" } ] @@ -3310,28 +4044,28 @@ }, { "name": "zerofrom-derive", - "version": "0.1.7", + "version": "0.1.8", "license": "Unicode-3.0", "repository": "https://github.com/unicode-org/icu4x", "files": [ { - "file": "zerofrom-derive-0.1.7-LICENSE.txt", + "file": "zerofrom-derive-0.1.8-LICENSE.txt", "sha256": "f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2" } ] }, { "name": "zeroize", - "version": "1.9.0", + "version": "1.9.1", "license": "Apache-2.0 OR MIT", "repository": "https://github.com/RustCrypto/utils", "files": [ { - "file": "zeroize-1.9.0-LICENSE-APACHE.txt", + "file": "zeroize-1.9.1-LICENSE-APACHE.txt", "sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30" }, { - "file": "zeroize-1.9.0-LICENSE-MIT.txt", + "file": "zeroize-1.9.1-LICENSE-MIT.txt", "sha256": "8c7516d4b27b1e495be5e38b612298b63de48d05f49cdac94f70f3cd70f8864b" } ] @@ -3390,13 +4124,25 @@ }, { "name": "zip", - "version": "2.4.2", + "version": "9.0.5", "license": "MIT", - "repository": "https://github.com/zip-rs/zip2.git", + "repository": "https://github.com/zip-rs/zip2", + "files": [ + { + "file": "zip-9.0.5-LICENSE.txt", + "sha256": "58545fed1565e42d687aecec6897d35c6d37ccb71479a137c0deb2203e125c79" + } + ] + }, + { + "name": "zlib-rs", + "version": "0.6.8", + "license": "Zlib", + "repository": "https://github.com/trifectatechfoundation/zlib-rs", "files": [ { - "file": "zip-2.4.2-LICENSE.txt", - "sha256": "04dc52136d82400b11df5f474949863a70a5d05d2278dec45b99c479494450a6" + "file": "zlib-rs-0.6.8-LICENSE.txt", + "sha256": "e72111c52b7d96ebe25348dee19f0744f444d3c95ae6b1ecb6ccaecc5bce05ba" } ] }, @@ -3414,52 +4160,52 @@ }, { "name": "zopfli", - "version": "0.8.3", + "version": "0.8.4", "license": "Apache-2.0", "repository": "https://github.com/zopfli-rs/zopfli", "files": [ { - "file": "zopfli-0.8.3-COPYING.txt", + "file": "zopfli-0.8.4-COPYING.txt", "sha256": "018b1cb87efdf7a04c2fcc13d57ed63f62149113fb207b27ea13430d64f13513" } ] }, { "name": "zstd", - "version": "0.13.3", - "license": "MIT", + "version": "0.14.3", + "license": "BSD-3-Clause", "repository": "https://github.com/gyscos/zstd-rs", "files": [ { - "file": "zstd-0.13.3-LICENSE.txt", - "sha256": "129e8edef29e9abcd2ebabe252f4ef1b1289cdca356bf0040284a2fbccfb96c8" + "file": "zstd-0.14.3-LICENSE.txt", + "sha256": "ce4868c8e4ebe47a7d4b3c93dbf6b802033e5ae2fa7638098173f80836daac60" } ] }, { "name": "zstd-safe", - "version": "7.3.0", + "version": "8.2.0", "license": "BSD-3-Clause", "repository": "https://github.com/gyscos/zstd-rs", "files": [ { - "file": "zstd-safe-7.3.0-LICENSE.txt", + "file": "zstd-safe-8.2.0-LICENSE.txt", "sha256": "ce4868c8e4ebe47a7d4b3c93dbf6b802033e5ae2fa7638098173f80836daac60" } ] }, { "name": "zstd-sys", - "version": "2.1.0+zstd.1.5.7", + "version": "2.1.2+zstd.1.5.7", "license": "BSD-3-Clause", "repository": "https://github.com/gyscos/zstd-rs", "files": [ { - "file": "zstd-sys-2.1.0+zstd.1.5.7-LICENSE.txt", + "file": "zstd-sys-2.1.2+zstd.1.5.7-LICENSE.txt", "sha256": "ce4868c8e4ebe47a7d4b3c93dbf6b802033e5ae2fa7638098173f80836daac60" }, { - "file": "zstd-sys-2.1.0+zstd.1.5.7-LICENSE.BSD-3-Clause.txt", + "file": "zstd-sys-2.1.2+zstd.1.5.7-LICENSE.BSD-3-Clause.txt", "sha256": "bf7017a73a95ea63bf3716b13ec2bcd79c92942356e3408c6fb66332bad6d977" } ] diff --git a/openless-all/ios/Resources/Licenses/Rust/md-5-0.11.0-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/md-5-0.11.0-LICENSE-APACHE.txt new file mode 100644 index 000000000..78173fa2e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/md-5-0.11.0-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/md-5-0.10.6-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/md-5-0.11.0-LICENSE-MIT.txt similarity index 95% rename from openless-all/ios/Resources/Licenses/Rust/md-5-0.10.6-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/md-5-0.11.0-LICENSE-MIT.txt index 66cf75563..9ce242cec 100644 --- a/openless-all/ios/Resources/Licenses/Rust/md-5-0.10.6-LICENSE-MIT.txt +++ b/openless-all/ios/Resources/Licenses/Rust/md-5-0.11.0-LICENSE-MIT.txt @@ -1,6 +1,7 @@ -Copyright (c) 2006-2009 Graydon Hoare -Copyright (c) 2009-2013 Mozilla Foundation +Copyright (c) 2016-2026 The RustCrypto Project Developers Copyright (c) 2016 Artyom Pavlov +Copyright (c) 2009-2013 Mozilla Foundation +Copyright (c) 2006-2009 Graydon Hoare Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated diff --git a/openless-all/ios/Resources/Licenses/Rust/tinyvec_macros-0.1.1-LICENSE-MIT.md.txt b/openless-all/ios/Resources/Licenses/Rust/micyou-dsp-0.1.0-LICENSE-AEC7.txt.txt similarity index 97% rename from openless-all/ios/Resources/Licenses/Rust/tinyvec_macros-0.1.1-LICENSE-MIT.md.txt rename to openless-all/ios/Resources/Licenses/Rust/micyou-dsp-0.1.0-LICENSE-AEC7.txt.txt index 4a8554df7..ab6dc217a 100644 --- a/openless-all/ios/Resources/Licenses/Rust/tinyvec_macros-0.1.1-LICENSE-MIT.md.txt +++ b/openless-all/ios/Resources/Licenses/Rust/micyou-dsp-0.1.0-LICENSE-AEC7.txt.txt @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020 Soveu +Copyright (c) 2026 a2heng Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/openless-all/ios/Resources/Licenses/Rust/crc-3.4.0-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/micyou-dsp-0.1.0-LICENSE-PureVox.txt.txt similarity index 96% rename from openless-all/ios/Resources/Licenses/Rust/crc-3.4.0-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/micyou-dsp-0.1.0-LICENSE-PureVox.txt.txt index ea21c2256..bfa7788c0 100644 --- a/openless-all/ios/Resources/Licenses/Rust/crc-3.4.0-LICENSE-MIT.txt +++ b/openless-all/ios/Resources/Licenses/Rust/micyou-dsp-0.1.0-LICENSE-PureVox.txt.txt @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2017 crc-rs Developers +Copyright (c) 2025 a2heng Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/openless-all/ios/Resources/Licenses/Rust/micyou-dsp-0.1.0-LICENSE-RNNoise.txt.txt b/openless-all/ios/Resources/Licenses/Rust/micyou-dsp-0.1.0-LICENSE-RNNoise.txt.txt new file mode 100644 index 000000000..2caa6a9cc --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/micyou-dsp-0.1.0-LICENSE-RNNoise.txt.txt @@ -0,0 +1,32 @@ +Copyright (c) 2020, Joe Neeman +Copyright (c) 2017, Mozilla +Copyright (c) 2007-2017, Jean-Marc Valin +Copyright (c) 2005-2017, Xiph.Org Foundation +Copyright (c) 2003-2004, Mark Borgerding + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +- Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +- Neither the name of the Xiph.Org Foundation nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/openless-all/ios/Resources/Licenses/Rust/micyou-dsp-0.1.0-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/micyou-dsp-0.1.0-LICENSE.txt new file mode 100644 index 000000000..01288814f --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/micyou-dsp-0.1.0-LICENSE.txt @@ -0,0 +1,725 @@ +MicYou is licensed under the GNU General Public License version 3.0 (GPLv3) +with the MicYou Plugin Exception (Version 1.0). + +Copyright (C) 2026 LanRhyme + +============================================================================== + MicYou Plugin Exception (Version 1.0) +============================================================================== + +As a special exception to Sections 5 and 6 of the GNU General Public License +version 3 ("GPLv3"), under Section 7 (Additional Permissions), the copyright +holders of MicYou grant permission to link, load, or combine independently +created software modules ("Plugins") with MicYou through its defined Plugin +Interfaces, and to convey the resulting combined work, provided that all of +the following conditions are met: + +1. Defined Plugin Interfaces: + This exception applies solely to Plugins that interact with MicYou through + its official, public Plugin Application Programming Interfaces (APIs), + including but not limited to the C ABI (mpl_host_api_t / micyou_plugin_abi.h), + WASM guest-host interfaces, and official Plugin SDKs. This exception does + not grant permission to extract, repackage, or link internal components of + MicYou outside the defined Plugin Interfaces into proprietary works. + +2. Non-Commercial Plugins: + Plugins that are developed, distributed, or used solely for non-commercial + purposes are NOT required to be licensed under the GNU GPLv3. Authors of + such non-commercial Plugins may choose any open-source or proprietary + license of their choice. + +3. Commercial Plugins: + Any commercial distribution, sale, paid subscription, or proprietary + commercial monetization of Plugins that link with or run inside MicYou + requires prior written authorization or a separate commercial license from + the copyright holders of MicYou. + +4. Core Program Protection: + Nothing in this exception modifies the license terms of MicYou itself or + works directly based on MicYou (other than the Plugin combination permitted + herein). Any modification to MicYou's core source code remains strictly + subject to the full terms and conditions of the GNU General Public License + version 3. + +5. Marketplace Distribution: + Distribution via the official MicYou Plugin Marketplace is subject to the + MicYou Plugin Marketplace Policy, which may require GPL-3.0-compatible open + source licensing or official review and authorization. + +============================================================================== + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 +============================================================================== + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + diff --git a/openless-all/ios/Resources/Licenses/Rust/micyou-infer-0.1.0-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/micyou-infer-0.1.0-LICENSE.txt new file mode 100644 index 000000000..01288814f --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/micyou-infer-0.1.0-LICENSE.txt @@ -0,0 +1,725 @@ +MicYou is licensed under the GNU General Public License version 3.0 (GPLv3) +with the MicYou Plugin Exception (Version 1.0). + +Copyright (C) 2026 LanRhyme + +============================================================================== + MicYou Plugin Exception (Version 1.0) +============================================================================== + +As a special exception to Sections 5 and 6 of the GNU General Public License +version 3 ("GPLv3"), under Section 7 (Additional Permissions), the copyright +holders of MicYou grant permission to link, load, or combine independently +created software modules ("Plugins") with MicYou through its defined Plugin +Interfaces, and to convey the resulting combined work, provided that all of +the following conditions are met: + +1. Defined Plugin Interfaces: + This exception applies solely to Plugins that interact with MicYou through + its official, public Plugin Application Programming Interfaces (APIs), + including but not limited to the C ABI (mpl_host_api_t / micyou_plugin_abi.h), + WASM guest-host interfaces, and official Plugin SDKs. This exception does + not grant permission to extract, repackage, or link internal components of + MicYou outside the defined Plugin Interfaces into proprietary works. + +2. Non-Commercial Plugins: + Plugins that are developed, distributed, or used solely for non-commercial + purposes are NOT required to be licensed under the GNU GPLv3. Authors of + such non-commercial Plugins may choose any open-source or proprietary + license of their choice. + +3. Commercial Plugins: + Any commercial distribution, sale, paid subscription, or proprietary + commercial monetization of Plugins that link with or run inside MicYou + requires prior written authorization or a separate commercial license from + the copyright holders of MicYou. + +4. Core Program Protection: + Nothing in this exception modifies the license terms of MicYou itself or + works directly based on MicYou (other than the Plugin combination permitted + herein). Any modification to MicYou's core source code remains strictly + subject to the full terms and conditions of the GNU General Public License + version 3. + +5. Marketplace Distribution: + Distribution via the official MicYou Plugin Marketplace is subject to the + MicYou Plugin Marketplace Policy, which may require GPL-3.0-compatible open + source licensing or official review and authorization. + +============================================================================== + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 +============================================================================== + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + diff --git a/openless-all/ios/Resources/Licenses/Rust/miniz_oxide-0.9.1-LICENSE-ZLIB.md.txt b/openless-all/ios/Resources/Licenses/Rust/miniz_oxide-0.9.1-LICENSE-ZLIB.md.txt deleted file mode 100644 index 92871cd24..000000000 --- a/openless-all/ios/Resources/Licenses/Rust/miniz_oxide-0.9.1-LICENSE-ZLIB.md.txt +++ /dev/null @@ -1,14 +0,0 @@ -Copyright 2013-2014 RAD Game Tools and Valve Software -Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC -Copyright (c) 2020 Frommi -Copyright (c) 2017-2024 oyvindln - -This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source distribution. diff --git a/openless-all/ios/Resources/Licenses/Rust/miniz_oxide-0.9.1-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/miniz_oxide-0.9.1-LICENSE.txt deleted file mode 100644 index a1980025c..000000000 --- a/openless-all/ios/Resources/Licenses/Rust/miniz_oxide-0.9.1-LICENSE.txt +++ /dev/null @@ -1,25 +0,0 @@ -MIT License - -Copyright 2013-2014 RAD Game Tools and Valve Software -Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC -Copyright (c) 2017 Frommi -Copyright (c) 2017-2024 oyvindln - - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/mio-1.2.3-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/mio-1.2.4-LICENSE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/mio-1.2.3-LICENSE.txt rename to openless-all/ios/Resources/Licenses/Rust/mio-1.2.4-LICENSE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/nnnoiseless-0.5.2-COPYING.txt b/openless-all/ios/Resources/Licenses/Rust/nnnoiseless-0.5.2-COPYING.txt new file mode 100644 index 000000000..2caa6a9cc --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/nnnoiseless-0.5.2-COPYING.txt @@ -0,0 +1,32 @@ +Copyright (c) 2020, Joe Neeman +Copyright (c) 2017, Mozilla +Copyright (c) 2007-2017, Jean-Marc Valin +Copyright (c) 2005-2017, Xiph.Org Foundation +Copyright (c) 2003-2004, Mark Borgerding + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +- Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +- Neither the name of the Xiph.Org Foundation nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/openless-all/ios/Resources/Licenses/Rust/rustix-1.1.4-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/num-bigint-dig-0.8.6-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/rustix-1.1.4-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/num-bigint-dig-0.8.6-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/num-bigint-dig-0.8.6-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/num-bigint-dig-0.8.6-LICENSE-MIT.txt new file mode 100644 index 000000000..39d4bdb5a --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/num-bigint-dig-0.8.6-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2014 The Rust Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/rustls-0.23.44-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/num-complex-0.4.6-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/rustls-0.23.44-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/num-complex-0.4.6-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/num-complex-0.4.6-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/num-complex-0.4.6-LICENSE-MIT.txt new file mode 100644 index 000000000..39d4bdb5a --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/num-complex-0.4.6-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2014 The Rust Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/smallvec-1.16.0-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/num-integer-0.1.47-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/smallvec-1.16.0-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/num-integer-0.1.47-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/num-integer-0.1.47-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/num-integer-0.1.47-LICENSE-MIT.txt new file mode 100644 index 000000000..39d4bdb5a --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/num-integer-0.1.47-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2014 The Rust Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/tungstenite-0.24.0-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/num-iter-0.1.46-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/tungstenite-0.24.0-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/num-iter-0.1.46-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/num-iter-0.1.46-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/num-iter-0.1.46-LICENSE-MIT.txt new file mode 100644 index 000000000..39d4bdb5a --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/num-iter-0.1.46-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2014 The Rust Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/p256-0.13.2-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/p256-0.13.2-LICENSE-APACHE.txt new file mode 100644 index 000000000..78173fa2e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/p256-0.13.2-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/password-hash-0.5.0-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/p256-0.13.2-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/password-hash-0.5.0-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/p256-0.13.2-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/p384-0.13.1-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/p384-0.13.1-LICENSE-APACHE.txt new file mode 100644 index 000000000..78173fa2e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/p384-0.13.1-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/p384-0.13.1-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/p384-0.13.1-LICENSE-MIT.txt new file mode 100644 index 000000000..c4edc443d --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/p384-0.13.1-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2020-2021 RustCrypto Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/password-hash-0.6.1-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/password-hash-0.6.1-LICENSE-APACHE.txt new file mode 100644 index 000000000..78173fa2e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/password-hash-0.6.1-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/password-hash-0.6.1-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/password-hash-0.6.1-LICENSE-MIT.txt new file mode 100644 index 000000000..ede6f74f2 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/password-hash-0.6.1-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2020-2026 RustCrypto Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/pbkdf2-0.13.0-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/pbkdf2-0.13.0-LICENSE-APACHE.txt new file mode 100644 index 000000000..78173fa2e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/pbkdf2-0.13.0-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/pbkdf2-0.12.2-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/pbkdf2-0.13.0-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/pbkdf2-0.12.2-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/pbkdf2-0.13.0-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/pem-rfc7468-0.7.0-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/pem-rfc7468-0.7.0-LICENSE-APACHE.txt new file mode 100644 index 000000000..78173fa2e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/pem-rfc7468-0.7.0-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/pem-rfc7468-0.7.0-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/pem-rfc7468-0.7.0-LICENSE-MIT.txt new file mode 100644 index 000000000..c869ada57 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/pem-rfc7468-0.7.0-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2021 The RustCrypto Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/phc-0.6.1-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/phc-0.6.1-LICENSE-APACHE.txt new file mode 100644 index 000000000..78173fa2e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/phc-0.6.1-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/phc-0.6.1-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/phc-0.6.1-LICENSE-MIT.txt new file mode 100644 index 000000000..11d191686 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/phc-0.6.1-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2021-2026 The RustCrypto Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/pkcs1-0.7.5-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/pkcs1-0.7.5-LICENSE-APACHE.txt new file mode 100644 index 000000000..78173fa2e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/pkcs1-0.7.5-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/pkcs1-0.7.5-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/pkcs1-0.7.5-LICENSE-MIT.txt new file mode 100644 index 000000000..3294d7434 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/pkcs1-0.7.5-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2021-2023 The RustCrypto Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/pkcs8-0.10.2-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/pkcs8-0.10.2-LICENSE-APACHE.txt new file mode 100644 index 000000000..78173fa2e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/pkcs8-0.10.2-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/pkcs8-0.10.2-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/pkcs8-0.10.2-LICENSE-MIT.txt new file mode 100644 index 000000000..e0d082780 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/pkcs8-0.10.2-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2020-2023 The RustCrypto Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/poly1305-0.8.0-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/poly1305-0.8.0-LICENSE-MIT.txt deleted file mode 100644 index 4596d9fad..000000000 --- a/openless-all/ios/Resources/Licenses/Rust/poly1305-0.8.0-LICENSE-MIT.txt +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2015-2019 RustCrypto Developers - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/poly1305-0.9.1-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/poly1305-0.9.1-LICENSE-APACHE.txt new file mode 100644 index 000000000..78173fa2e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/poly1305-0.9.1-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/poly1305-0.9.1-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/poly1305-0.9.1-LICENSE-MIT.txt new file mode 100644 index 000000000..a9eb4ab7f --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/poly1305-0.9.1-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2015-2026 The RustCrypto Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/powerfmt-0.2.0-LICENSE-Apache.txt b/openless-all/ios/Resources/Licenses/Rust/powerfmt-0.2.1-LICENSE-Apache.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/powerfmt-0.2.0-LICENSE-Apache.txt rename to openless-all/ios/Resources/Licenses/Rust/powerfmt-0.2.1-LICENSE-Apache.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/powerfmt-0.2.0-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/powerfmt-0.2.1-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/powerfmt-0.2.0-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/powerfmt-0.2.1-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/ppmd-rust-1.5.1-LICENSE-CC0.md.txt b/openless-all/ios/Resources/Licenses/Rust/ppmd-rust-1.5.1-LICENSE-CC0.md.txt new file mode 100644 index 000000000..bf30e849b --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/ppmd-rust-1.5.1-LICENSE-CC0.md.txt @@ -0,0 +1,119 @@ +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be + protected by copyright and related or neighboring rights ("Copyright and + Related Rights"). Copyright and Related Rights include, but are not + limited to, the following: + +i. the right to reproduce, adapt, distribute, perform, display, +communicate, and translate a Work; +ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or +likeness depicted in a Work; +iv. rights protecting against unfair competition in regards to a Work, +subject to the limitations in paragraph 4(a), below; +v. rights protecting the extraction, dissemination, use and reuse of data +in a Work; +vi. database rights (such as those arising under Directive 96/9/EC of the +European Parliament and of the Council of 11 March 1996 on the legal +protection of databases, and under any national implementation +thereof, including any amended or successor version of such +directive); and +vii. other similar, equivalent or corresponding rights throughout the +world based on applicable law or treaty, and any national +implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention + of, applicable law, Affirmer hereby overtly, fully, permanently, + irrevocably and unconditionally waives, abandons, and surrenders all of + Affirmer's Copyright and Related Rights and associated claims and causes + of action, whether now known or unknown (including existing as well as + future claims and causes of action), in the Work (i) in all territories + worldwide, (ii) for the maximum duration provided by applicable law or + treaty (including future time extensions), (iii) in any current or future + medium and for any number of copies, and (iv) for any purpose whatsoever, + including without limitation commercial, advertising or promotional + purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each + member of the public at large and to the detriment of Affirmer's heirs and + successors, fully intending that such Waiver shall not be subject to + revocation, rescission, cancellation, termination, or any other legal or + equitable action to disrupt the quiet enjoyment of the Work by the public + as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason + be judged legally invalid or ineffective under applicable law, then the + Waiver shall be preserved to the maximum extent permitted taking into + account Affirmer's express Statement of Purpose. In addition, to the + extent the Waiver is so judged Affirmer hereby grants to each affected + person a royalty-free, non transferable, non sublicensable, non exclusive, + irrevocable and unconditional license to exercise Affirmer's Copyright and + Related Rights in the Work (i) in all territories worldwide, (ii) for the + maximum duration provided by applicable law or treaty (including future + time extensions), (iii) in any current or future medium and for any number + of copies, and (iv) for any purpose whatsoever, including without + limitation commercial, advertising or promotional purposes (the + "License"). The License shall be deemed effective as of the date CC0 was + applied by Affirmer to the Work. Should any part of the License for any + reason be judged legally invalid or ineffective under applicable law, such + partial invalidity or ineffectiveness shall not invalidate the remainder + of the License, and in such case Affirmer hereby affirms that he or she + will not (i) exercise any of his or her remaining Copyright and Related + Rights in the Work or (ii) assert any associated claims and causes of + action with respect to the Work, in either case contrary to Affirmer's + express Statement of Purpose. + +4. Limitations and Disclaimers. + +a. No trademark or patent rights held by Affirmer are waived, abandoned, +surrendered, licensed or otherwise affected by this document. +b. Affirmer offers the Work as-is and makes no representations or +warranties of any kind concerning the Work, express, implied, +statutory or otherwise, including without limitation warranties of +title, merchantability, fitness for a particular purpose, non +infringement, or the absence of latent or other defects, accuracy, or +the present or absence of errors, whether or not discoverable, all to +the greatest extent permissible under applicable law. +c. Affirmer disclaims responsibility for clearing rights of other persons +that may apply to the Work or any use thereof, including without +limitation any person's Copyright and Related Rights in the Work. +Further, Affirmer disclaims responsibility for obtaining any necessary +consents, permissions or other rights required for any use of the +Work. +d. Affirmer understands and acknowledges that Creative Commons is not a +party to this document and has no duty or obligation with respect to +this CC0 or use of the Work. diff --git a/openless-all/ios/Resources/Licenses/Rust/ppmd-rust-1.5.1-LICENSE-MIT-0.md.txt b/openless-all/ios/Resources/Licenses/Rust/ppmd-rust-1.5.1-LICENSE-MIT-0.md.txt new file mode 100644 index 000000000..8782a83bf --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/ppmd-rust-1.5.1-LICENSE-MIT-0.md.txt @@ -0,0 +1,16 @@ +MIT No Attribution + +Copyright 2026 The ppmd-rust authors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/unicase-2.9.0-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/primal-check-0.3.4-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/unicase-2.9.0-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/primal-check-0.3.4-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/xz2-0.1.7-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/primal-check-0.3.4-LICENSE-MIT.txt similarity index 94% rename from openless-all/ios/Resources/Licenses/Rust/xz2-0.1.7-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/primal-check-0.3.4-LICENSE-MIT.txt index 28e630cf4..bf6c304f7 100644 --- a/openless-all/ios/Resources/Licenses/Rust/xz2-0.1.7-LICENSE-MIT.txt +++ b/openless-all/ios/Resources/Licenses/Rust/primal-check-0.3.4-LICENSE-MIT.txt @@ -1,4 +1,4 @@ -Copyright (c) 2016 Alex Crichton +Copyright (c) 2014 Huon Wilson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated @@ -22,4 +22,4 @@ SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. +DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/openless-all/ios/Resources/Licenses/Rust/primeorder-0.13.6-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/primeorder-0.13.6-LICENSE-APACHE.txt new file mode 100644 index 000000000..78173fa2e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/primeorder-0.13.6-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/primeorder-0.13.6-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/primeorder-0.13.6-LICENSE-MIT.txt new file mode 100644 index 000000000..50b1254c1 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/primeorder-0.13.6-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2020-2023 RustCrypto Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/quinn-0.11.11-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/quinn-0.11.12-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/quinn-0.11.11-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/quinn-0.11.12-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/quinn-0.11.11-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/quinn-0.11.12-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/quinn-0.11.11-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/quinn-0.11.12-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/quinn-proto-0.11.17-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/quinn-proto-0.11.19-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/quinn-proto-0.11.17-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/quinn-proto-0.11.19-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/quinn-proto-0.11.17-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/quinn-proto-0.11.19-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/quinn-proto-0.11.17-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/quinn-proto-0.11.19-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/quinn-udp-0.5.15-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/quinn-udp-0.5.16-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/quinn-udp-0.5.15-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/quinn-udp-0.5.16-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/quinn-udp-0.5.15-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/quinn-udp-0.5.16-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/quinn-udp-0.5.15-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/quinn-udp-0.5.16-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/rand-0.10.2-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/rand-0.10.3-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/rand-0.10.2-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/rand-0.10.3-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/rand-0.10.2-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/rand-0.10.3-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/rand-0.10.2-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/rand-0.10.3-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/realfft-3.5.0-UPSTREAM-NOTICE.txt b/openless-all/ios/Resources/Licenses/Rust/realfft-3.5.0-UPSTREAM-NOTICE.txt new file mode 100644 index 000000000..f81098b45 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/realfft-3.5.0-UPSTREAM-NOTICE.txt @@ -0,0 +1,27 @@ +Package: realfft 3.5.0 +Declared license: MIT +Authors: HEnquist +Repository: https://github.com/HEnquist/realfft +Source revision: d0d4eee0525fd27c96c8a046d6d107acd5ed84a6 + +The upstream crate declares this license without bundling a standalone license file. +Standard license text: SPDX license-list-data v3.27.0. + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/rfc6979-0.4.0-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/rfc6979-0.4.0-LICENSE-APACHE.txt new file mode 100644 index 000000000..c394d8ad9 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/rfc6979-0.4.0-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2018-2022 RustCrypto Developers + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/rfc6979-0.4.0-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/rfc6979-0.4.0-LICENSE-MIT.txt new file mode 100644 index 000000000..81a3d57ac --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/rfc6979-0.4.0-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2018-2022 RustCrypto Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/rsa-0.9.10-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/rsa-0.9.10-LICENSE-APACHE.txt new file mode 100644 index 000000000..f8e5e5ea0 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/rsa-0.9.10-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/openless-all/ios/Resources/Licenses/Rust/rsa-0.9.10-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/rsa-0.9.10-LICENSE-MIT.txt new file mode 100644 index 000000000..468cd79a8 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/rsa-0.9.10-LICENSE-MIT.txt @@ -0,0 +1,23 @@ +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/openless-all/ios/Resources/Licenses/Rust/unicode-normalization-0.1.25-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/rustc_version-0.4.1-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/unicode-normalization-0.1.25-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/rustc_version-0.4.1-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/rustc_version-0.4.1-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/rustc_version-0.4.1-LICENSE-MIT.txt new file mode 100644 index 000000000..40b8817a4 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/rustc_version-0.4.1-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2016 The Rust Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/rustfft-6.4.1-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/rustfft-6.4.1-LICENSE-APACHE.txt new file mode 100644 index 000000000..113e84387 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/rustfft-6.4.1-LICENSE-APACHE.txt @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/openless-all/ios/Resources/Licenses/Rust/rustfft-6.4.1-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/rustfft-6.4.1-LICENSE-MIT.txt new file mode 100644 index 000000000..cf5d4ed3f --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/rustfft-6.4.1-LICENSE-MIT.txt @@ -0,0 +1,19 @@ +Copyright (c) 2015 The RustFFT Developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/uuid-1.26.1-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/rustix-1.1.5-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/uuid-1.26.1-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/rustix-1.1.5-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/rustix-1.1.4-LICENSE-Apache-2.0_WITH_LLVM-exception.txt b/openless-all/ios/Resources/Licenses/Rust/rustix-1.1.5-LICENSE-Apache-2.0_WITH_LLVM-exception.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/rustix-1.1.4-LICENSE-Apache-2.0_WITH_LLVM-exception.txt rename to openless-all/ios/Resources/Licenses/Rust/rustix-1.1.5-LICENSE-Apache-2.0_WITH_LLVM-exception.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/serde_json-1.0.151-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/rustix-1.1.5-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/serde_json-1.0.151-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/rustix-1.1.5-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/xz2-0.1.7-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/rustls-0.23.46-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/xz2-0.1.7-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/rustls-0.23.46-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/rustls-0.23.44-LICENSE-ISC.txt b/openless-all/ios/Resources/Licenses/Rust/rustls-0.23.46-LICENSE-ISC.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/rustls-0.23.44-LICENSE-ISC.txt rename to openless-all/ios/Resources/Licenses/Rust/rustls-0.23.46-LICENSE-ISC.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/rustls-0.23.44-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/rustls-0.23.46-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/rustls-0.23.44-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/rustls-0.23.46-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/serde_json-1.0.151-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/rustversion-1.0.23-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/serde_json-1.0.151-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/rustversion-1.0.23-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/syn-3.0.5-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/rustversion-1.0.23-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/syn-3.0.5-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/rustversion-1.0.23-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/sec1-0.7.3-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/sec1-0.7.3-LICENSE-APACHE.txt new file mode 100644 index 000000000..78173fa2e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/sec1-0.7.3-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/sec1-0.7.3-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/sec1-0.7.3-LICENSE-MIT.txt new file mode 100644 index 000000000..68ddaa3c9 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/sec1-0.7.3-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2021-2022 The RustCrypto Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/syn-3.0.5-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/semver-1.0.28-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/syn-3.0.5-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/semver-1.0.28-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/thiserror-1.0.69-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/semver-1.0.28-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/thiserror-1.0.69-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/semver-1.0.28-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/thiserror-1.0.69-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/serde_json-1.0.154-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/thiserror-1.0.69-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/serde_json-1.0.154-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/thiserror-2.0.20-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/serde_json-1.0.154-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/thiserror-2.0.20-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/serde_json-1.0.154-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/sha1-0.11.0-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/sha1-0.11.0-LICENSE-APACHE.txt new file mode 100644 index 000000000..78173fa2e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/sha1-0.11.0-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/sha1-0.10.7-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/sha1-0.11.0-LICENSE-MIT.txt similarity index 95% rename from openless-all/ios/Resources/Licenses/Rust/sha1-0.10.7-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/sha1-0.11.0-LICENSE-MIT.txt index 66cf75563..9ce242cec 100644 --- a/openless-all/ios/Resources/Licenses/Rust/sha1-0.10.7-LICENSE-MIT.txt +++ b/openless-all/ios/Resources/Licenses/Rust/sha1-0.11.0-LICENSE-MIT.txt @@ -1,6 +1,7 @@ -Copyright (c) 2006-2009 Graydon Hoare -Copyright (c) 2009-2013 Mozilla Foundation +Copyright (c) 2016-2026 The RustCrypto Project Developers Copyright (c) 2016 Artyom Pavlov +Copyright (c) 2009-2013 Mozilla Foundation +Copyright (c) 2006-2009 Graydon Hoare Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated diff --git a/openless-all/ios/Resources/Licenses/Rust/sha2-0.11.1-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/sha2-0.11.1-LICENSE-APACHE.txt new file mode 100644 index 000000000..78173fa2e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/sha2-0.11.1-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/sha2-0.11.1-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/sha2-0.11.1-LICENSE-MIT.txt new file mode 100644 index 000000000..9ce242cec --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/sha2-0.11.1-LICENSE-MIT.txt @@ -0,0 +1,28 @@ +Copyright (c) 2016-2026 The RustCrypto Project Developers +Copyright (c) 2016 Artyom Pavlov +Copyright (c) 2009-2013 Mozilla Foundation +Copyright (c) 2006-2009 Graydon Hoare + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/signature-2.2.0-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/signature-2.2.0-LICENSE-APACHE.txt new file mode 100644 index 000000000..78173fa2e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/signature-2.2.0-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/signature-2.2.0-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/signature-2.2.0-LICENSE-MIT.txt new file mode 100644 index 000000000..d8d87fe29 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/signature-2.2.0-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2018-2023 RustCrypto Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/siphasher-1.0.3-COPYING.txt b/openless-all/ios/Resources/Licenses/Rust/siphasher-1.0.4-COPYING.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/siphasher-1.0.3-COPYING.txt rename to openless-all/ios/Resources/Licenses/Rust/siphasher-1.0.4-COPYING.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/tinyvec_macros-0.1.1-LICENSE-APACHE.md.txt b/openless-all/ios/Resources/Licenses/Rust/siphasher-1.0.4-LICENSE-APACHE.txt similarity index 99% rename from openless-all/ios/Resources/Licenses/Rust/tinyvec_macros-0.1.1-LICENSE-APACHE.md.txt rename to openless-all/ios/Resources/Licenses/Rust/siphasher-1.0.4-LICENSE-APACHE.txt index 69a59b412..d64569567 100644 --- a/openless-all/ios/Resources/Licenses/Rust/tinyvec_macros-0.1.1-LICENSE-APACHE.md.txt +++ b/openless-all/ios/Resources/Licenses/Rust/siphasher-1.0.4-LICENSE-APACHE.txt @@ -1,3 +1,4 @@ + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -186,7 +187,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2020 Tomasz "Soveu" Marx + Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -199,4 +200,3 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - diff --git a/openless-all/ios/Resources/Licenses/Rust/siphasher-1.0.4-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/siphasher-1.0.4-LICENSE-MIT.txt new file mode 100644 index 000000000..969d061e8 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/siphasher-1.0.4-LICENSE-MIT.txt @@ -0,0 +1,17 @@ +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/crc-3.4.0-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/smallvec-1.16.3-LICENSE-APACHE.txt similarity index 99% rename from openless-all/ios/Resources/Licenses/Rust/crc-3.4.0-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/smallvec-1.16.3-LICENSE-APACHE.txt index d368c8557..16fe87b06 100644 --- a/openless-all/ios/Resources/Licenses/Rust/crc-3.4.0-LICENSE-APACHE.txt +++ b/openless-all/ios/Resources/Licenses/Rust/smallvec-1.16.3-LICENSE-APACHE.txt @@ -1,5 +1,5 @@ Apache License - Version 2.0 January 2004 + Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION diff --git a/openless-all/ios/Resources/Licenses/Rust/smallvec-1.16.0-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/smallvec-1.16.3-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/smallvec-1.16.0-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/smallvec-1.16.3-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/spin-0.9.9-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/spin-0.9.9-LICENSE.txt new file mode 100644 index 000000000..b2d7f7bbd --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/spin-0.9.9-LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Mathijs van de Nes + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/openless-all/ios/Resources/Licenses/Rust/spki-0.7.3-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/spki-0.7.3-LICENSE-APACHE.txt new file mode 100644 index 000000000..78173fa2e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/spki-0.7.3-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/spki-0.7.3-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/spki-0.7.3-LICENSE-MIT.txt new file mode 100644 index 000000000..3294d7434 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/spki-0.7.3-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2021-2023 The RustCrypto Project Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/strength_reduce-0.2.4-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/strength_reduce-0.2.4-LICENSE-APACHE.txt new file mode 100644 index 000000000..113e84387 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/strength_reduce-0.2.4-LICENSE-APACHE.txt @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/openless-all/ios/Resources/Licenses/Rust/strength_reduce-0.2.4-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/strength_reduce-0.2.4-LICENSE-MIT.txt new file mode 100644 index 000000000..cf5d4ed3f --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/strength_reduce-0.2.4-LICENSE-MIT.txt @@ -0,0 +1,19 @@ +Copyright (c) 2015 The RustFFT Developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/thiserror-2.0.20-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/syn-3.0.9-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/thiserror-2.0.20-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/syn-3.0.9-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/thiserror-impl-1.0.69-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/syn-3.0.9-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/thiserror-impl-1.0.69-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/syn-3.0.9-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/synstructure-0.13.2-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/synstructure-0.14.0-LICENSE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/synstructure-0.13.2-LICENSE.txt rename to openless-all/ios/Resources/Licenses/Rust/synstructure-0.14.0-LICENSE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/thiserror-impl-1.0.69-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/thiserror-2.0.21-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/thiserror-impl-1.0.69-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/thiserror-2.0.21-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/thiserror-impl-2.0.20-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/thiserror-2.0.21-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/thiserror-impl-2.0.20-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/thiserror-2.0.21-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/thiserror-impl-2.0.20-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/thiserror-impl-2.0.21-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/thiserror-impl-2.0.20-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/thiserror-impl-2.0.21-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/unicode-ident-1.0.24-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/thiserror-impl-2.0.21-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/unicode-ident-1.0.24-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/thiserror-impl-2.0.21-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/tinyvec-1.13.3-LICENSE-APACHE.md.txt b/openless-all/ios/Resources/Licenses/Rust/tinyvec-1.13.3-LICENSE-APACHE.md.txt new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/tinyvec-1.13.3-LICENSE-APACHE.md.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/tinyvec-1.13.2-LICENSE-MIT.md.txt b/openless-all/ios/Resources/Licenses/Rust/tinyvec-1.13.3-LICENSE-MIT.md.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/tinyvec-1.13.2-LICENSE-MIT.md.txt rename to openless-all/ios/Resources/Licenses/Rust/tinyvec-1.13.3-LICENSE-MIT.md.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/tinyvec-1.13.2-LICENSE-ZLIB.md.txt b/openless-all/ios/Resources/Licenses/Rust/tinyvec-1.13.3-LICENSE-ZLIB.md.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/tinyvec-1.13.2-LICENSE-ZLIB.md.txt rename to openless-all/ios/Resources/Licenses/Rust/tinyvec-1.13.3-LICENSE-ZLIB.md.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/tokio-1.53.1-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/tokio-1.53.3-LICENSE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/tokio-1.53.1-LICENSE.txt rename to openless-all/ios/Resources/Licenses/Rust/tokio-1.53.3-LICENSE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/tokio-rustls-0.26.5-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/tokio-rustls-0.26.6-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/tokio-rustls-0.26.5-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/tokio-rustls-0.26.6-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/tokio-rustls-0.26.5-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/tokio-rustls-0.26.6-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/tokio-rustls-0.26.5-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/tokio-rustls-0.26.6-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/tokio-tungstenite-0.24.0-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/tokio-tungstenite-0.30.0-LICENSE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/tokio-tungstenite-0.24.0-LICENSE.txt rename to openless-all/ios/Resources/Licenses/Rust/tokio-tungstenite-0.30.0-LICENSE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/tokio-util-0.7.19-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/tokio-util-0.7.20-LICENSE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/tokio-util-0.7.19-LICENSE.txt rename to openless-all/ios/Resources/Licenses/Rust/tokio-util-0.7.20-LICENSE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/transpose-0.2.3-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/transpose-0.2.3-LICENSE-APACHE.txt new file mode 100644 index 000000000..1d06c058e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/transpose-0.2.3-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2022 The transpose developers + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/transpose-0.2.3-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/transpose-0.2.3-LICENSE-MIT.txt new file mode 100644 index 000000000..2f3fc16c1 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/transpose-0.2.3-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2022 The transpose Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/tungstenite-0.30.0-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/tungstenite-0.30.0-LICENSE-APACHE.txt new file mode 100644 index 000000000..16fe87b06 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/tungstenite-0.30.0-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/tungstenite-0.24.0-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/tungstenite-0.30.0-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/tungstenite-0.24.0-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/tungstenite-0.30.0-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/unicode-ident-1.0.24-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/typed-path-0.12.3-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/unicode-ident-1.0.24-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/typed-path-0.12.3-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/utf-8-0.7.6-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/typed-path-0.12.3-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/utf-8-0.7.6-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/typed-path-0.12.3-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/unicase-2.10.0-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/unicase-2.10.0-LICENSE-APACHE.txt new file mode 100644 index 000000000..16fe87b06 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/unicase-2.10.0-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/unicase-2.9.0-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/unicase-2.10.0-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/unicase-2.9.0-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/unicase-2.10.0-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/utf-8-0.7.6-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/unicode-ident-1.0.27-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/utf-8-0.7.6-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/unicode-ident-1.0.27-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/find-msvc-tools-0.1.12-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/unicode-ident-1.0.27-LICENSE-MIT.txt similarity index 96% rename from openless-all/ios/Resources/Licenses/Rust/find-msvc-tools-0.1.12-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/unicode-ident-1.0.27-LICENSE-MIT.txt index 39e0ed660..31aa79387 100644 --- a/openless-all/ios/Resources/Licenses/Rust/find-msvc-tools-0.1.12-LICENSE-MIT.txt +++ b/openless-all/ios/Resources/Licenses/Rust/unicode-ident-1.0.27-LICENSE-MIT.txt @@ -1,5 +1,3 @@ -Copyright (c) 2014 Alex Crichton - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the diff --git a/openless-all/ios/Resources/Licenses/Rust/unicode-ident-1.0.24-LICENSE-UNICODE.txt b/openless-all/ios/Resources/Licenses/Rust/unicode-ident-1.0.27-LICENSE-UNICODE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/unicode-ident-1.0.24-LICENSE-UNICODE.txt rename to openless-all/ios/Resources/Licenses/Rust/unicode-ident-1.0.27-LICENSE-UNICODE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/unicode-normalization-0.1.26-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/unicode-normalization-0.1.26-LICENSE-APACHE.txt new file mode 100644 index 000000000..16fe87b06 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/unicode-normalization-0.1.26-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/unicode-normalization-0.1.25-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/unicode-normalization-0.1.26-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/unicode-normalization-0.1.25-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/unicode-normalization-0.1.26-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/unicode-normalization-0.1.26-LICENSE-UNICODE.txt b/openless-all/ios/Resources/Licenses/Rust/unicode-normalization-0.1.26-LICENSE-UNICODE.txt new file mode 100644 index 000000000..11f2842a3 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/unicode-normalization-0.1.26-LICENSE-UNICODE.txt @@ -0,0 +1,39 @@ +UNICODE LICENSE V3 + +COPYRIGHT AND PERMISSION NOTICE + +Copyright © 1991-2023 Unicode, Inc. + +NOTICE TO USER: Carefully read the following legal agreement. BY +DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR +SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE +TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT +DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of data files and any associated documentation (the "Data Files") or +software and any associated documentation (the "Software") to deal in the +Data Files or Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, and/or sell +copies of the Data Files or Software, and to permit persons to whom the +Data Files or Software are furnished to do so, provided that either (a) +this copyright and permission notice appear with all copies of the Data +Files or Software, or (b) this copyright and permission notice appear in +associated Documentation. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF +THIRD PARTY RIGHTS. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE +BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA +FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall +not be used in advertising or otherwise to promote the sale, use or other +dealings in these Data Files or Software without prior written +authorization of the copyright holder. diff --git a/openless-all/ios/Resources/Licenses/Rust/universal-hash-0.5.1-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/universal-hash-0.5.1-LICENSE-MIT.txt deleted file mode 100644 index 468bccc2d..000000000 --- a/openless-all/ios/Resources/Licenses/Rust/universal-hash-0.5.1-LICENSE-MIT.txt +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2019-2020 RustCrypto Developers - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/universal-hash-0.6.1-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/universal-hash-0.6.1-LICENSE-APACHE.txt new file mode 100644 index 000000000..78173fa2e --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/universal-hash-0.6.1-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/universal-hash-0.6.1-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/universal-hash-0.6.1-LICENSE-MIT.txt new file mode 100644 index 000000000..bb7ff7c2c --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/universal-hash-0.6.1-LICENSE-MIT.txt @@ -0,0 +1,25 @@ +Copyright (c) 2019-2025 RustCrypto Developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/uuid-1.28.0-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/uuid-1.28.0-LICENSE-APACHE.txt new file mode 100644 index 000000000..16fe87b06 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/uuid-1.28.0-LICENSE-APACHE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/uuid-1.26.1-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/uuid-1.28.0-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/uuid-1.26.1-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/uuid-1.28.0-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/want-0.3.1-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/want-0.3.2-LICENSE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/want-0.3.1-LICENSE.txt rename to openless-all/ios/Resources/Licenses/Rust/want-0.3.2-LICENSE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/yoke-derive-0.8.2-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/yoke-derive-0.8.4-LICENSE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/yoke-derive-0.8.2-LICENSE.txt rename to openless-all/ios/Resources/Licenses/Rust/yoke-derive-0.8.4-LICENSE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/zerocopy-0.8.57-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/zerocopy-0.8.63-LICENSE-APACHE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/zerocopy-0.8.57-LICENSE-APACHE.txt rename to openless-all/ios/Resources/Licenses/Rust/zerocopy-0.8.63-LICENSE-APACHE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/zerocopy-0.8.57-LICENSE-BSD.txt b/openless-all/ios/Resources/Licenses/Rust/zerocopy-0.8.63-LICENSE-BSD.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/zerocopy-0.8.57-LICENSE-BSD.txt rename to openless-all/ios/Resources/Licenses/Rust/zerocopy-0.8.63-LICENSE-BSD.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/zerocopy-0.8.57-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/zerocopy-0.8.63-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/zerocopy-0.8.57-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/zerocopy-0.8.63-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/zerofrom-derive-0.1.7-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/zerofrom-derive-0.1.8-LICENSE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/zerofrom-derive-0.1.7-LICENSE.txt rename to openless-all/ios/Resources/Licenses/Rust/zerofrom-derive-0.1.8-LICENSE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/zeroize-1.9.1-LICENSE-APACHE.txt b/openless-all/ios/Resources/Licenses/Rust/zeroize-1.9.1-LICENSE-APACHE.txt new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/zeroize-1.9.1-LICENSE-APACHE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/Rust/zeroize-1.9.0-LICENSE-MIT.txt b/openless-all/ios/Resources/Licenses/Rust/zeroize-1.9.1-LICENSE-MIT.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/zeroize-1.9.0-LICENSE-MIT.txt rename to openless-all/ios/Resources/Licenses/Rust/zeroize-1.9.1-LICENSE-MIT.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/zip-2.4.2-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/zip-9.0.5-LICENSE.txt similarity index 89% rename from openless-all/ios/Resources/Licenses/Rust/zip-2.4.2-LICENSE.txt rename to openless-all/ios/Resources/Licenses/Rust/zip-9.0.5-LICENSE.txt index 4a45976f8..84d5f4d7a 100644 --- a/openless-all/ios/Resources/Licenses/Rust/zip-2.4.2-LICENSE.txt +++ b/openless-all/ios/Resources/Licenses/Rust/zip-9.0.5-LICENSE.txt @@ -19,6 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Some files in the "tests/data" subdirectory of this repository are under other -licences; see files named LICENSE.*.txt for details. \ No newline at end of file diff --git a/openless-all/ios/Resources/Licenses/Rust/tinyvec_macros-0.1.1-LICENSE-ZLIB.md.txt b/openless-all/ios/Resources/Licenses/Rust/zlib-rs-0.6.8-LICENSE.txt similarity index 86% rename from openless-all/ios/Resources/Licenses/Rust/tinyvec_macros-0.1.1-LICENSE-ZLIB.md.txt rename to openless-all/ios/Resources/Licenses/Rust/zlib-rs-0.6.8-LICENSE.txt index f43568b03..f91124fc0 100644 --- a/openless-all/ios/Resources/Licenses/Rust/tinyvec_macros-0.1.1-LICENSE-ZLIB.md.txt +++ b/openless-all/ios/Resources/Licenses/Rust/zlib-rs-0.6.8-LICENSE.txt @@ -1,9 +1,7 @@ -zlib License - -(C) 2020 Tomasz "Soveu" Marx +(C) 2024 Trifecta Tech Foundation This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages +warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, @@ -14,7 +12,8 @@ freely, subject to the following restrictions: claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. +3. This notice may not be removed or altered from any source distribution. diff --git a/openless-all/ios/Resources/Licenses/Rust/zopfli-0.8.3-COPYING.txt b/openless-all/ios/Resources/Licenses/Rust/zopfli-0.8.4-COPYING.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/zopfli-0.8.3-COPYING.txt rename to openless-all/ios/Resources/Licenses/Rust/zopfli-0.8.4-COPYING.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/zstd-0.13.3-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/zstd-0.13.3-LICENSE.txt deleted file mode 100644 index 1190b3c62..000000000 --- a/openless-all/ios/Resources/Licenses/Rust/zstd-0.13.3-LICENSE.txt +++ /dev/null @@ -1,8 +0,0 @@ -The MIT License (MIT) -Copyright (c) 2016 Alexandre Bury - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/Licenses/Rust/zstd-safe-7.3.0-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/zstd-0.14.3-LICENSE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/zstd-safe-7.3.0-LICENSE.txt rename to openless-all/ios/Resources/Licenses/Rust/zstd-0.14.3-LICENSE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/zstd-sys-2.1.0+zstd.1.5.7-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/zstd-safe-8.2.0-LICENSE.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/zstd-sys-2.1.0+zstd.1.5.7-LICENSE.txt rename to openless-all/ios/Resources/Licenses/Rust/zstd-safe-8.2.0-LICENSE.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/zstd-sys-2.1.0+zstd.1.5.7-LICENSE.BSD-3-Clause.txt b/openless-all/ios/Resources/Licenses/Rust/zstd-sys-2.1.2+zstd.1.5.7-LICENSE.BSD-3-Clause.txt similarity index 100% rename from openless-all/ios/Resources/Licenses/Rust/zstd-sys-2.1.0+zstd.1.5.7-LICENSE.BSD-3-Clause.txt rename to openless-all/ios/Resources/Licenses/Rust/zstd-sys-2.1.2+zstd.1.5.7-LICENSE.BSD-3-Clause.txt diff --git a/openless-all/ios/Resources/Licenses/Rust/zstd-sys-2.1.2+zstd.1.5.7-LICENSE.txt b/openless-all/ios/Resources/Licenses/Rust/zstd-sys-2.1.2+zstd.1.5.7-LICENSE.txt new file mode 100644 index 000000000..93223ef4a --- /dev/null +++ b/openless-all/ios/Resources/Licenses/Rust/zstd-sys-2.1.2+zstd.1.5.7-LICENSE.txt @@ -0,0 +1,28 @@ +BSD 3-Clause License + +Copyright (c) 2026, Alexandre Bury + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/openless-all/ios/Resources/Licenses/SPDX-Apache-2.0.txt b/openless-all/ios/Resources/Licenses/SPDX-Apache-2.0.txt new file mode 100644 index 000000000..137069b82 --- /dev/null +++ b/openless-all/ios/Resources/Licenses/SPDX-Apache-2.0.txt @@ -0,0 +1,73 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/openless-all/ios/Resources/Licenses/SPDX-MIT.txt b/openless-all/ios/Resources/Licenses/SPDX-MIT.txt new file mode 100644 index 000000000..d817195da --- /dev/null +++ b/openless-all/ios/Resources/Licenses/SPDX-MIT.txt @@ -0,0 +1,18 @@ +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/openless-all/ios/Resources/LocalizationSources.json b/openless-all/ios/Resources/LocalizationSources.json index c4bcf2509..825542855 100644 --- a/openless-all/ios/Resources/LocalizationSources.json +++ b/openless-all/ios/Resources/LocalizationSources.json @@ -1842,9 +1842,7 @@ "translationSource": "Native iOS translation" }, "模拟器(不是真机验收)": { - "callsites": [ - "App/ExperimentalPiPKeepAlive.swift:39" - ], + "callsites": [], "translationSource": "Native iOS translation" }, "正在保存翻译目标…": { @@ -2049,9 +2047,7 @@ "translationSource": "Native iOS translation" }, "此构建不包含私有接口诊断。请使用 OpenLessPersonal Scheme。": { - "callsites": [ - "App/ExperimentalPiPKeepAlive.swift:72" - ], + "callsites": [], "translationSource": "Native iOS translation" }, "没有匹配的市场风格": { @@ -2315,9 +2311,7 @@ "translationSource": "Native iOS translation" }, "真机": { - "callsites": [ - "App/ExperimentalPiPKeepAlive.swift:43" - ], + "callsites": [], "translationSource": "Native iOS translation" }, "离开页面或进入后台会暂停后续检查,不会中断已发出的 HTTP 请求。取消不会撤销已完成的登录;需要时请明确退出。": { @@ -3217,9 +3211,7 @@ "translationSource": "Native iOS translation" }, "隐藏式免跳转尚未通过真机验证。不会用常驻麦克风、可见小窗或收边拉手替代。": { - "callsites": [ - "App/ExperimentalPiPKeepAlive.swift:16" - ], + "callsites": [], "translationSource": "Native iOS translation" }, "需要下载系统语音资源": { @@ -6430,36 +6422,28 @@ }, "免跳转后台保活已关闭。": { "callsites": [ - "App/ExperimentalPiPKeepAlive.swift:68" + "App/ExperimentalPiPKeepAlive.swift:61" ], "translationSource": "Native iOS translation", "sourceSnapshot": "2026-10-20 public PiP keep-alive" }, "免跳转后台保活已激活;待机时不会采集麦克风。": { - "callsites": [ - "App/ExperimentalPiPKeepAlive.swift:69" - ], + "callsites": [], "translationSource": "Native iOS translation", "sourceSnapshot": "2026-10-20 public PiP keep-alive" }, "首次离开主应用时建立 PiP 保活;待机时不会采集麦克风。": { - "callsites": [ - "App/ExperimentalPiPKeepAlive.swift:71" - ], + "callsites": [], "translationSource": "Native iOS translation", "sourceSnapshot": "2026-10-20 public PiP keep-alive" }, "\nPiP 使用公开 AVSampleBufferDisplayLayer/ContentSource;未调用私有接口。": { - "callsites": [ - "App/ExperimentalPiPKeepAlive.swift:133" - ], + "callsites": [], "translationSource": "Native iOS translation", "sourceSnapshot": "2026-10-20 public PiP keep-alive" }, "系统尚未允许 PiP": { - "callsites": [ - "App/ExperimentalPiPKeepAlive.swift:159" - ], + "callsites": [], "translationSource": "Native iOS translation", "sourceSnapshot": "2026-10-20 public PiP keep-alive" }, @@ -6546,7 +6530,7 @@ }, "画中画已结束;返回主应用可恢复免跳转": { "callsites": [ - "App/ExperimentalPiPKeepAlive.swift:336" + "App/ExperimentalPiPKeepAlive.swift:334" ], "translationSource": "Native iOS translation (Build 11 resource audit)" }, diff --git a/openless-all/ios/docs/TODO-20261020.md b/openless-all/ios/docs/TODO-20261020.md deleted file mode 100644 index 369a87d23..000000000 --- a/openless-all/ios/docs/TODO-20261020.md +++ /dev/null @@ -1,59 +0,0 @@ -# OpenLess iOS 总待办(2026-10-20) - -基线提交:`62112923`(Build 7 工作快照)。分支 `appergb/合并两个分支`,未 push。 -验收原则:以用户真机连续操作 + 录屏为准;动画/闪烁类问题必须用录屏逐帧(或 `simctl recordVideo` 抽帧)证明,不能只凭静态截图宣称修复。模拟器通过 ≠ 真机通过,报告里分开写。 - -## A. 本轮用户反馈(10-20 真机录屏/截图) - -| # | 问题 | 现象 / 线索 | 目标与验收 | 负责通道 | -|---|---|---|---|---| -| A1 | **语音跳转、自动返回、换输入框恢复(最高优先级)** | 录屏 `~/Downloads/ScreenRecording_10-20-2026 16-26-45_1.MP4`:0–5s 微信键盘长时间“准备/连接”;5–9s 跳入 OpenLess 已开始录音却停在主 App,经多任务界面才回微信;16–25s 微信内换一个聊天输入框(不换 App)就再次出现“准备→请求未完成→启用语音→跳入 OpenLess”。 | 一次点击完成录音启动;仅在确需激活时跳转,且自动返回原输入位置,不要求再次点击/重录。换输入框(同 App)不得触发重新激活。需同时排查:会话恢复(后台资格/租约是否随输入目标变化被作废)、输入目标变化处理(997e1faa 冻结目标逻辑是否把“换聊天”误判为需要前台激活)、返回路由(source 解析失败/超时)。 | 逻辑 · Codex | -| A2 | 风格 / 设置 / 词典之间切换仍闪烁 | 左侧词典小岛 ↔ 右侧风格大岛切换时页面明暗变化、背景闪动、选中背景晚出现。上次“闪烁已修复”不成立。 | 检查页面容器、导航栏、安全区、Dock 变化是否造成重复布局或页面重建(视图 identity 变化、条件分支换根视图、背景随 tab 重建等)。录屏逐帧无明暗跳变、选中背景与 dock 同步。 | UI · Claude Sonnet | -| A3 | 选择“原文 / 正式表达”等风格时整页闪动 | 选择风格进入全局忙碌态:其他卡片同时禁用变淡,列表顶部插入进度/提示,完成后一起恢复 → 整页亮度与布局跳变。 | 反馈只集中在被选卡片(局部进度/勾选),其他内容、背景、滚动位置不变;不插入会推动布局的顶部提示。 | UI · Claude Sonnet | -| A4 | 历史页顶部结构错位 | `~/Downloads/IMG_1624.PNG` 初始顶部大片空白、搜索框偏下;`IMG_1623.PNG` 下拉时刷新区、搜索框、大标题“历史”上下错位;`IMG_1625.PNG` 滚动后正常。自动大标题 + 顶部搜索区 + 下拉刷新三者叠加。 | 统一布局关系(如用 `.searchable` + `.refreshable` 原生组合,或去掉自定义顶部搜索区)。验收覆盖:初次打开、上滑、下拉刷新、搜索聚焦、退出搜索。 | UI · Claude Sonnet | -| A5 | 翻译目标交互语义不对 | 设置页有“默认翻译目标”等全局选择文案;主麦克风长按未接入“向上选语言”手势。 | 主 App 只负责“添加目标语言”列表;键盘长按右侧翻译按钮,或长按“点击说话”后上滑选语言,松手确认,**仅本次录音翻译**;普通说话保持听写。明确规则:滑出取消、未选中目标=普通听写、普通按住说话不翻译。核实普通听写请求确实不带翻译参数。 | 文案/设置页 · Claude Sonnet;手势与请求逻辑 · Codex | -| A6 | 音效过响、音色奇怪;普通按钮反馈不合适 | 早先嫌小;改自制音效(KeyboardClickSounds.swift、Resources/KeyboardSounds/)后过响、生硬。部分工具栏按钮和录音起止共用按键音。 | 自然、轻、短;打字音与普通界面操作音明确区分;录音起止用独立的轻提示或仅触感。触感用户认为基本 OK,**音效与触感分别验收**,不要一起大改触感。 | 审美 · Claude Sonnet | -| A7 | 拼音键盘长按连删启动太慢 | 语音面板有自己的删除定时器,拼音/英文沿用 KeyboardKit 默认 repeat 设置,两套计时。 | 统一:首次删除即时响应、进入连删延迟、连删速度、松手立即停止;覆盖拼音组合串(composition)与已上屏文字。 | 逻辑 · Codex | -| A8 | 按钮大小、比例、间距与操作方式 | 早先发送按钮过小;上一轮只放大字号和局部按钮,不算验收。 | 对照之前 Typeless 截图(Artifacts/handoff ZIP 内竞品资料 / keyboardkit-public-capabilities 证据),逐项核对发送、退格、空格、模式切换、语音工具按钮的实际点击区域、视觉尺寸、行高、间距、布局比例;语音/拼音/英文三模式一致。 | 审美 · Claude Sonnet | -| A9 | 中英文联想体验(保留待验收) | 之前联想弱、近乎没有。Build 7 换了中文词库并增加英文下一词、中文续词(KeyboardPredictionEngine.swift、Resources/Prediction/)。 | 用户尚未确认。检查候选相关性、常用词排序、连续输入、候选条操作。先做自查报告,最终由用户真机验收。 | 用户验收(Codex 可做自查) | - -## B. 此前遗留 - -| # | 事项 | 状态 | -|---|---|---| -| B1 | PiP 隐藏式免跳转 | Build 9 已实现公开 PiP 保活;不是隐藏 PiP,后台重新开麦仍待用户真机验收。 | -| B2 | 真机验证:长时间后台、来电/Siri/锁屏/蓝牙中断、取消时换输入框竞态、App 重启 epoch | 未验证(A1 修复后一并录屏)。 | -| B3 | IPA 版本号 | 本轮交付 0.1.0 (9),未签名,见 `ios-build9-release.md`;旧包保留。 | -| B4 | 12 个旧 `ios-*-61` worktree 收敛 | 已完成。续接复核 Orca 中本项目剩 4 个工作区,12 份源码备份保留在 `~/openless-backups/worktrees/`。 | -| B5 | 桌面端 4 个已删除但仍被引用的 Rust 模块(model_store.rs 等) | 未处理,桌面构建不过;不在本轮 iOS 范围。 | -| B6 | UI 测试 3 项失败(“设置”按钮重复匹配等) | 用户要求暂不跑测试;保留记录。 | - -## C. 通道与文件归属(避免并行冲突) - -- **逻辑通道 · Codex(Orca,当前 worktree)**:A1、A7、A5 手势/请求逻辑。文件:KeyboardViewController.swift(非视图逻辑)、KeyboardStartHandshake、KeyboardVoiceLifecycle、NoJumpAudioSession、AppController、HostApplicationReturn.m、KeyboardHostApplication.m、TypingKeyboard.swift 的删除/repeat 设置、SpeakButton.swift 的手势逻辑、OpenLessShared 中协议/可用性代码。 -- **主 App UI 通道 · Claude Sonnet(独立 worktree)**:A2、A3、A4、A5 设置页文案。文件:OpenLessApp.swift、ProductDock.swift、DockSafeAreaBridge.swift、HistoryView.swift、StyleLibraryView.swift、StyleLibrary.swift(忙碌态表现)、StyleTranslationSettingsView.swift、AppDesign.swift。 -- **键盘视觉与音效通道 · Claude Sonnet(独立 worktree)**:A6、A8。文件:KeyboardClickSounds.swift、Resources/KeyboardSounds/、scripts/generate-keyboard-sounds.py、KeyboardStyle.swift、TypingKeyboard.swift 的布局/尺寸、KeyboardViewController.swift 的视图布局部分、SpeakButton.swift 的视觉。与逻辑通道共享文件时只改视图/尺寸代码。 -- 合并:两个 Sonnet worktree 完成后由协调者合回 `appergb/合并两个分支`,再统一出新 IPA(递增 build 号)。 - -## D. 10-20 晚间新增 - -| # | 问题 | 负责 | -|---|---|---| -| D1 | Build 8 真机仍做不到免跳转(录屏 ~/Downloads/ScreenRecording_10-20-2026 22-36-26_1.MP4)。对照 Typeless:靠隐藏 PiP 保活让主 App 后台重新开麦;OpenLess 仅输出会话保活,疑似后台不能新开麦。实现 PiP 保活 + 真机验证。 | Codex(max 推理) | -| D2 | 语音识别不应让用户选“中文全拼/English”,默认中英混合自动识别;preferences.language 只保留为打字布局。 | Codex(D1 之后) | -| D3 | 用户已明确自行签名;只交付未签名 IPA,不再要求登录 Xcode 或提供证书。 | 已确定 | - -### Build 9 续接状态 - -- D1:PiP 已提交,后续补齐可见视频源、时间基准、关闭竞态与后台配置;Release 构建及包结构校验通过。真机免跳转与中断恢复仍待验收,不标记为已解决。 -- D2:已完成,单独提交 `6b5a8d78`;SenseVoice 使用 `auto`,首页移除语言选择,布局不再重置 ASR。 -- D3:按用户选择交付未签名 IPA。没有安装真机,没有运行完整测试或 UI 测试。 -- A2–A9 及其他旧条目的验收状态沿用此前记录,本次未重复实施或验收。 - -## 2026-10-21 Build 10 续接 - -用户确认 Build 9 基础 PiP 免跳转已可用;新增隐藏/共存、锁屏和回主应用生命周期、B 站扬声器、拼音原文提交和按钮尺寸目标。实现与验收矩阵统一见 [Build 10 目标](ios-build10-goals.md)。自动验证与交付见 [Build 10 报告](ios-build10-release.md)。旧条目不代表这些新目标已经真机验收。 - -## 2026-10-21 Build 11 键盘体验 - -后续反馈的九项范围见 [Build 11 目标](ios-build11-goals.md):默认/自定义尺寸、润色选择持久化、中文候选与原始字母两步确认、@ 保留、后端说明、录音波形、翻译提示、thinking 文案及工具布局。交付见 [Build 11 验证](ios-build11-release.md)。 diff --git a/openless-all/ios/docs/architecture-and-processing.md b/openless-all/ios/docs/architecture-and-processing.md deleted file mode 100644 index cfd9a5d33..000000000 --- a/openless-all/ios/docs/architecture-and-processing.md +++ /dev/null @@ -1,63 +0,0 @@ -# iOS 架构与实际处理管线 - -更新:2026-10-16。参考来自用户提供的豆包/Typeless 拆包报告,不是竞品真机实测,也没有恢复其服务端。当前 KeyboardKit 已通过中英文、连续五次重开、系统听写键隐藏、符号/换行、Caps Lock/空格光标/横滑及横屏回归;完整浅色套件为 12 UI、4 原生通过、1 授权回调跳过。模拟器回归与构建成功仍不代表真机语音或完整后台能力。 - -## 进程与依赖 - -主 App 使用 SwiftUI/UIKit、AVFoundation、原生识别器和 Rust Core。键盘是 `UIInputViewController`,嵌入 **KeyboardKit 9.9.0 MIT 源码版**的 `KeyboardView`;它负责普通键位布局与触摸、大小写、符号、删除和光标手势,OpenLess 适配 Rime 组合/候选、英文补全和语音控制。不是仿造开源键盘外观,也没有引入 KeyboardKit 当前的闭源二进制版。 - -保留 UIKit 控制器和 nullable Objective-C 文档标识边界,避免断连时把 nil 强桥接为 UUID。无有效文档就停止目标相关操作,不生成假 UUID。键盘收起走 UIKit 原生生命周期;移除试用页额外的跨进程清焦点通知,避免收起旧会话的通知干扰下一次编辑。没有靠额外点击手势或反复 resign/become 修补。 - -- Rime 与学习数据留在扩展私有容器;基础中文全拼、English QWERTY 不要求完全访问。 -- SenseVoice、sherpa-onnx、ONNX Runtime、Rust Core 只链接主 App。键盘不加载模型、不打开麦克风、不持有提供商密钥。 -- Full Access 只允许共享偏好与控制通信,不代表后台开麦能力已实现。 -- App Group SQLite WAL 是持久命令/结果通道;Darwin 只通知重读。v2 协议明确区分 `.prepare` 和 `.begin`,准备不会录音。 -- 按 Apple 的[公开文档](https://developer.apple.com/documentation/uikit/configuring-a-custom-keyboard-interface),在控制器初始化和重新连接时设置 `hasDictationKey = true`。当前英语/语音完整屏幕截图中系统右下角麦克风已消失,系统地球键保留;没有遮挡层/负 inset 或私有 Hook。iOS 仍可能在 AX 树保留 disabled 的隐藏听写元素,测试检查不可点击并保留截图,而不是把 AX 的元素个数当作视觉隐藏证据。 - -## 普通模式:本地 ASR,不预设 LLM - -```text -用户主动准备 → 麦克风权限与已打包模型就绪(不采集) -用户主动开始 → AVFoundation 采集 → 16 kHz mono PCM → Core 会话 -主动停止 → 先关闭采集、排空尾帧 → 本机 SenseVoice 解码 -→ Core builtin.raw → 应用内结果/带目标身份的插入请求 → 回执与历史 -``` - -普通模式由 Rust Host 强制使用 `ios-sensevoice`、传统管线和 `builtin.raw`。不是仅在 Swift 界面隐藏云端开关;也不会静默回退 Apple Speech 或某个云端服务。 - -`NativeSpeechService` 选择 SenseVoice/Apple 原生适配器;本地模型由 `Packages/LocalSpeech` actor 管理,两个 CPU 线程、20 秒解码分块、最多 30 分钟音频,取消标记可在模型加载/分块之间检查。模型不进入键盘。公开音频夹具的非空中文结果证明运行了打包模型,不是准确率、实时性、真机资源或人声采集验收。 - -Core 保留空文本检查、已配置纠正规则和简繁偏好等本地步骤。iOS 尚无完整的用户纠正规则/简繁设置界面;识别器产生的标点、分段累计和裁剪空白不冒充 LLM 润色。`polishedText`/`finalText` 字段名本身也不证明调用过模型后处理。 - -## 开发者模式:显式配置,共用桌面 Core - -设置中在 1.5 秒连续间隔内点击版本三次,确认后取消并关闭本机任务、关闭旧 Core,切换普通/开发者存储,重建 Core、宿主 epoch 与界面。**这是应用业务状态重载,不是 iOS 进程退出/重启。**首次开发者存储仍是传统/原文模式,没有预配 LLM;随后显式保存的配置可以保留。 - -```text -传统:主 App PCM → Native ASR 或共享 Core ASR provider - → ASR 文本 → 可选、主动启用的共享 Core LLM provider → 最终文本 -全模态:主 App PCM → 共享 Core Omni provider → 识别/处理结果 -选区:冻结选区与原文 → 显式指令 → 共享 Core LLM → 可编辑预览 → 显式替换/复制 -``` - -复用 `TranscriptionRouter`、`SharedCloudTranscriptionEngine`、`TextPolisherRouter`、`SharedCloudTextPolisher`、`DictationEngineRouter` 和 `SharedOmniDictationEngine`,没有另写一套 Swift HTTP 语音管线。Core 的 ASR/LLM 预览阶段分别标记 `asr`/`llm`,后处理预览不会反馈进识别累计器。 - -主 App 提供频道增删、激活、地址/模型/认证编辑、模型列表和显式验证。普通频道用 UUID;Omni 保持 Core 自己的 providerType 标识与命名空间,不伪造 LLM 频道映射。需要桌面 OAuth 会话的 `codex_oauth` 未开放。 - -密钥进入主 App 的 generic-password Keychain:服务 `app.openless.ios.corehost.credentials.v1`,稳定账号 `standard`/`developer`,不依赖每次安装会变化的沙盒路径。快照、App Group、普通日志不返回密钥;提供商错误体不会直通公开失败消息。空密钥编辑表示保留,不会在打开配置页时自动验证/请求服务。真实云端和真机 Keychain 仍需对应环境验证。 - -选区改写目前只接入应用内试用编辑器。预览后仅当全文仍等于冻结原文、UTF-16 范围有效时才能替换。没有声称已接入任意第三方 App 的选区,也没有失败后静默写剪贴板。 - -## 上屏与资源边界 - -停止先释放音频硬件,再做解码/后处理。采集有无帧超时、30 分钟上限、有界 PCM 队列和尾帧排空;音量来自真实 PCM。空闲无键盘心跳,活跃键盘录音每秒续租,4 秒失联停止。 - -上屏绑定 session、epoch、document、revision、deadline 和持久尝试/回执。目标变化或写入不确定时保留待确认文字,不写进新输入框、不重放、不静默复制。`submitted` 只代表发送,不能宣称宿主已验证接受。当前不支持流式上屏。 - -## 与参考输入法相近和不同的部分 - -资料显示豆包/Typeless 都分离主 App、键盘、原生音频和进程通信;Typeless 有 RN/Hermes 前端和识别/refine 协议,豆包含录音保持与 PiP/hide/hook 相关符号。符号不能证明其真实停麦、隐藏方法、能耗或服务端提示词,也不授权复制代码、词库、商业资产或凭据。 - -**历史 PiP 路线状态(当前输出会话方案见 [Build 4](voice-handoff-fix.md))**:`ExperimentalPiPKeepAlive.isImplemented == false`、`isReady == false`,白名单为空。不会用长期静默占麦、可见 PiP/横幅/边缘把手或反复切 App 代替。App 退后台在没有有效保持能力时停止会话;跨 App 后台开始请求拒绝,而不是假装成功。 - -原始证据归档为 `openless/7-research/ios-input-methods/analysis/`;本机只读副本在忽略的 `Artifacts/references/`。蓝图明确是参考规范,不是已实现组件。当前的本机模型、开发者 provider 接线与后台缺口应分别验收。 diff --git a/openless-all/ios/docs/asr.md b/openless-all/ios/docs/asr.md deleted file mode 100644 index ddb9e4648..000000000 --- a/openless-all/ios/docs/asr.md +++ /dev/null @@ -1,48 +0,0 @@ -# ASR 入口与文件导航 - -## 当前怎么用 - -普通模式使用已打包的 **SenseVoice Small int8**,在主 App 本机识别,不预配 LLM,不经过 LLM 后处理。准备只做权限与模型初始化;用户主动开始后才采集声音。 - -### 语言语义 - -`KeyboardPreferences.language` 只表示默认打字布局(中文全拼或 English),不再决定语音识别语言。旧偏好仍按原有 `Codable` 解码规则读取,缺失字段继续使用默认中文布局。 - -- 键盘能力快照的 `sourceLanguage` 固定为 `auto`,普通听写默认支持中英文混合。 -- SenseVoice 的语言参数固定传 `auto`,不会因为用户切换中文全拼/English 而重建识别器。 -- Core 管理的云端 ASR、LLM 和 Omni 管线不接收键盘布局字段;翻译语言仍只由一次录音的上滑选择和已配置目标控制。 -- 开发者模式的 Apple Speech 仍使用系统可用的中文 locale 作为模块选择参数,但它与打字布局解耦;系统 Speech framework 的具体混合语言能力由设备和 provider 决定。 - -开发者模式在设置中连点版本三次后进入,安全重载界面与 Core,而不是退出/重启 iOS 进程。可选择原生 Apple Speech、Core 已支持的云端 ASR、自定义服务、LLM 后处理或全模态管线。云端模型列表/验证只在主动操作时请求,密钥保存在主 App Keychain。 - -2026-10-16 用户反馈应用内语音已经能正常聆听、感知,正在手工测试。这与自动化公共音频 smoke 分开记录;不据此宣称跨 App 后台免跳转完成。 - -## 原生实现统一放在 `App/Speech/` - -| 文件 | 职责 | -| --- | --- | -| `NativeSpeechService.swift` | 原生识别入口;选择 SenseVoice 或 Apple,控制输入、完成、取消和释放 | -| `AudioCapture.swift` | AVAudioSession/AVAudioEngine;按系统版本选择 tap,先停硬件再排空处理 | -| `AudioPCM.swift` | 可发送的音频值快照、16 kHz mono S16LE 重采样、有界尾帧 | -| `MicrophoneAccess.swift` | iOS 16 与 17+ 的权限 API;不从键盘请求麦克风 | -| `AppleSpeechService.swift` | Apple provider 门面与授权桥接;按系统版本选择后端 | -| `ModernAppleSpeechService.swift` | iOS 26+ 的 SpeechAnalyzer/系统转写和资源准备 | -| `LegacyAppleSpeechService.swift` | iOS 16–18 的 SFSpeechRecognizer,本机模式、取消、结束超时和结果回调隔离 | - -其他相关入口: - -- `Packages/LocalSpeech/Sources/LocalSpeech/SenseVoiceRuntime.swift`:离线 C API actor、两个 CPU 线程、20 秒分块、取消与长度上限。模型不进入键盘。 -- `CoreHost/src/lib.rs`、`control.rs`、`credentials.rs`:普通/开发者模式约束、复用桌面 Core provider、控制请求和 Keychain。 -- `App/AppController.swift`:业务状态、音频会话生命周期与 Core 回调;不实现另一套 HTTP ASR。 -- `PlatformShared/SharedContainer.swift` 与 `Packages/OpenLessShared/`:v2 准备/开始命令、输入目标身份和持久上屏回执。 - -桌面的实验性本地 ASR 仍以仓库根目录的 [experimental-local-asr.md](../../../docs/experimental-local-asr.md) 为入口。之前研究的 TextStream/Qwen3-ASR Mac MLX 子进程不是 iOS 实现,不在手机上包装桌面 subprocess。 - -## 资源与验证 - -- [固定模型、运行时和哈希](local-speech-provenance.md) -- [iOS 16 起的版本路径与兼容边界](platform-support.md) -- [完整处理管线、显式选区与后台缺口](architecture-and-processing.md) -- [测试/安装包/截图证据](verification.md) - -不重新下载已校验资源,不删除已有桌面实验 ASR 工作,也不把 ASR 分段累计、识别器标点或 `finalText` 字段冒充 LLM 改写。 diff --git a/openless-all/ios/docs/continuation-checkpoint.md b/openless-all/ios/docs/continuation-checkpoint.md deleted file mode 100644 index 1d96e2cd9..000000000 --- a/openless-all/ios/docs/continuation-checkpoint.md +++ /dev/null @@ -1,111 +0,0 @@ -# 恢复检查点:最终集成/审查/实际产品验收阶段 - -更新:2026-10-16。先读本文件、[requirements-and-todo.md](requirements-and-todo.md)、[execution-plan.md](execution-plan.md);不要重做已完成worker/fixture或将部分功能冒充完整产品通过。 - -## 用户最新要求与资源 - -- 补齐剩余需求,所有子Agent **GPT-6.1-Sol high**,不许更高;实现后Codex独立review,主Agent再验收。 -- 验收使用 **Orca自带唯一模拟器真实操作与截图**,不能只有编译/XCTest。 -- 新词典参考已实现列表/来源筛选/浮动加号/紧凑弹窗。 -- 新56.45秒键盘视频实际路径 `/Users/trip/Library/Application Support/com.netease.uuremote/Download/ScreenRecording_10-16-2026 15-35-41_1.mp4`。已抽帧,SHA `fe35d4f505d27fc98b7f5acc51341b0cf215466ea043d32c309ba85059c411c1`;`docs/keyboard-video-reference.md` 与 `Artifacts/video-keyboard/`。 -- 用户还在 **Codex Test另一个会话**要求蓝色“启用语音”、去除opaque背景以衔接系统Liquid Glass、独立第五个“风格”Tab及我的风格/市场/翻译目标分区、真实raw风格翻译和失败不插原文。其发来的`[Codex coordination]`是协作消息,不是要重复创建worker。 -- 主Agent不要每一步宣称完成;完成可验证工作后统一汇报,外部缺口/未实现项不得藏起来。 - -## 工作区与保护 - -主目录 `/Users/trip/orca/workspaces/openless/合并两个分支`,分支 `appergb/合并两个分支`,HEAD `e4727697ddf559c3f4d21dd1cd4ac94d5ea935ef`。大量原有desktop/Android/ASR dirty改动保留。不得commit/push/reset/批量格式化;iOS仍untracked,git diff不覆盖全部新增源。 - -普通模式bundled SenseVoice/local/raw;不预配云凭据、不静默Apple/cloud回退。Core负责领域/网络/crypto/prompt;键盘不采集、不运行Core/ASR、不存keys。自动测试不授权麦克风、不录制人声、不动真实账户/云服务。用户数据、Full Access、输入法列表和唯一模拟器不清空。 - -唯一VM:`A4B5F07C-C6C9-498F-BEEC-AC7AC98B8A6A`,OpenLess iOS27 QA。当前 **模拟器租约交给Codex Test做误收起恢复/最终表面检查**,是否归还以 `Artifacts/keyboard-codex-coordination.md` 最新节和其 `SIMULATOR_RETURNED=YES` 消息为准。主Agent在归还前不要安装/launch/XCTest/改外观,generic build和Core测试可以。 - -Orca固定CLI `/Applications/Orca.app/Contents/Resources/bin/orca`;实际serve-sim runtime **1.4.227**(旧1.4.224不存在)。已读orca-cli和orca-emulator版本指南。所有normalized tap要先AX/截图并核实效果。扩展AX有时是键盘局部坐标,不直接当全屏坐标。 - -## 已完成并集成的组件(不重跑worker) - -### 第一波 A/B/D - -Workflow `af5b23fc-7fa2-43f5-aa9f-75f105c1e13d`全部完成。 -- A词典UI run `437b8215-7a49-4ae9-8f78-269ad70f0add`,五个Swift文件已基线SHA核验合入;主Host source filter all/learned/manual分页前过滤,保留Core真实分类。 -- B Core风格/marketplace/ZIP staging/capability run `915eb1bf-56d9-4a20-ae1d-c7ef652e4213`,已集成。 -- D真实device-flow账户/禁止错误全量同步 run `5a2ebe6c-f8ef-4a93-8b5c-cf972dc0433d`,已集成。 -报告在 `Artifacts/execution-wave1/*-handoff.md`。 - -### 第二波 B-UI/F/T/E - -原workflow `50c5fb79-bdc8-4479-b2d8-2564e50dd85e` 因extension reload显示stopped,**不能据此重启已完成children**。 -- B-UI `abdb83a7-cd1d-4e08-b53e-d5e1268efa1f` 已完成并合入7新Swift文件,style ZIP bounded copy、no auto-network、同consumer缓存。 -- T `e685c87f-f97e-4c13-bb63-d78380977334` 已完成并合入6Core文件:有序多目标/旧scalar迁移/presence marker/freeze会话目标。主Agent补了sync registry TextList分类和serde-skipped元数据测试,完整Core曾1191通过1忽略。 -- F `f91fdc18...`曾超时,续run **`1db1e696-d75d-481a-9b1c-26ed13101894`已完成**,13文件已合入:有限本地scope/overlay/confirmed-ID/numeric identity facade。**没有remote有限sync,不可用singleton full vault上传**。服务端缺namespace/CAS/receipts/authenticated scope,详根docs/encrypted-cloud-sync-limited-scope.md。 -- E录音维护 `a8f597f1...`等待决策超时,续run **`7d2d0cd4-95b7-42f9-b4cd-dfac286ca259`已完成**:4源文件+lib/control hunks已合入;捕获journal、恢复unfinished、隔离孤儿、retention清扫;clear保留Quick Notes WAV。 -报告在 `Artifacts/execution-wave2/*-handoff.md`。第二波独立Codex run `e4dc00f0-e320-480e-9cc7-ad4bca6d4d65`已完成,无证实P0/P1/P2,报告 `execution-wave2/codex-review.md`;明确不验收远程sync/后续键盘等。 - -### 第三波 C-UI/账户/Core voice/词典桥/本地化 - -全部实施worker已完成并合入,不再启动同任务: -- C-UI `5925582e-307b-4a65-a572-29dcee945cd0`(workflow `49ad043e-edb7-49ae-b67b-bf5b51bcb1aa`),10文件视频键盘/intent/capabilities/generatedPreview/confirm DTO。最终声明WRITER RELEASED,报告 `Artifacts/execution-wave3/keyboard-video-handoff.md`。 -- 账户App `cf177465-899f-4b97-b459-048ba06a483b` 同workflow,4Swift文件已合入,status/deviceflow/poll/cancel/signout真实Core调用;未联网验收,remote sync禁用不算实现。 -- Core voice `3696b18a-292f-4881-ab2c-34835ee5eac3`:voice_intent新模块+api/auxiliary/ports/router/cloud provider最小seam已合入。普通与帮写录音强制unmodified raw/native ios-sensevoice,不改用户style;prepare compose冻结endpoint/key/model/options,SecretValue内存;生成专用Core compose preview,**不会自动insert**。 -- 词典/Rime `06f4ba8f-8b91-4102-a8fa-903252a83d54`(workflow `f8bbe755-2d38-4888-85aa-09ce80f3be8a`),12文件已合入;主Agent接了control metadata invalidation/confirmation、App VocabularyBridge、Shared vocabularyDecision、键盘真实纠正建议menu和Rime快照import。纯BMP中文CFStringTransform pinyin生成独立script_translator,保留原personal userdb/活动composition后更新。**真实ASR自动新词抽取不存在;现有为Core手改纠正建议,不可冒充自动ASR候选**。 -- 本地化 `2dc50399-47b7-4df7-a5cc-eb01de890bbf` 同workflow,11文件已合入;续run **`b4edeee4-9070-4aa6-9584-8307446c24cf`已完成**,68新词+InfoPlist资源已合入,主Agent又加Undo/Space与styleUI31keys。资源现668keys每语言(按audit实际为准)。UI语言system/zh-Hans/en独立ASR/翻译;主题独立mailbox `interface.preferences.v1`,无FullAccess系统fallback。Root modifier保持runtimeID不以language重置录音。App动态文案迁移仍不完全;资源覆盖≠所有runtime String均已本地化。 - -## 主Agent已接的关键公共入口 - -- CoreBridge `onConfigurationMutation` + pending-controls状态,成功管理操作使键盘capabilityRevision失效再刷新;只读nested account status/vocab snapshot/proposals不触发循环。 -- `KeyboardCapabilityProjection.swift` 投影无秘密,**最新 canAttemptTranslation+Core effectiveTargetLanguages**,不再自行用canAttemptPolish推断;capability配置变化和源语言变化均轮换revision。 -- AppController start验证command.intent/capabilityRevision/source/language、Core无待处理controls;ActiveSession保存KeyboardVoiceStart。Core独立验证意图,普通模式不外发。 -- completed outputDisposition preview只接受matching core/client/intent/promptKind,发布有界generatedPreview(180s),保持App ActiveSession直到confirm/cancel/expiry。confirm只传ID/捕获元数据;Shared纯校验通过后一次性storeInsertion,清preview避免双份大文本;generatedInsertionID防重放。 -- 新 `.vocabularyDecision` 独立于start/mic;请求claim-once+epoch/deadline,只有真实proposal ID/generation可accept/reject/dismiss;不会替换当前输入。 -- Mailbox `revokeInsertion` 将pending→targetChanged、attempting→uncertain,submitted不变,不删attempt证据;取消/确认失败调用。 -- 键盘CUI-FIX02 enqueue false立即本地收尾+成功发送后5s专属client回执deadline(全局fresh不能代替确认)。CUI-FIX03 insertText后ack失败也清UI,durable uncertain不重插。 -- 确认storeInsertion失败:明确phase error、清preview/ActiveSession、保留主App结果,不锁死按钮到180s;不靠文案识别协议。 -- 安全撤销:`KeyboardUndoRecord`内存仅本键盘已写入且未替换selection、≤128字、document/revision/before/after完全一致;每delete步骤重核上下文,不符合就停。按钮仅有可撤销record时显示。 -- 新source根Scene语言/theme都已接;旧 `appThemePicker`测试入口换为 `openInterfacePreferences`。键盘UIInputView不替换,仅透明内容以跟随系统材质;确认动作/撤销/风格/翻译用公开API。 - -## Codex Test(外部会话)协作事实 - -同主cwd,但只在tmp产patch,主Agent唯一源集成者。以 `Artifacts/keyboard-codex-coordination.md`为协调入口,精确范围已授权。 - -已读并apply-check后合入: -1. `keyboard-codex-ui-fixes.patch` SHA `a236ba35655bcdc25316f9ef07e68d352c6a3f97c77c6535d9a3eebdc65fee55`:arc最终release(at:)/旋转命中/分页/取消区/辅助字号纵向滚动;真实helpwrite圆触区;processing-only sweep与reduceMotion/window/offpage生命周期。8UIKit fixture测试通过,**不重跑旧fixture**。证据完整保存在 `Artifacts/keyboard-codex-evidence/`(从tmp复制)。 -2. surface patch最终SHA `e3d85f404846c6975d03debae142963e2d18749038eceb6a84c512919e8fd2a9`(最初749c废弃):native背景clear、renderBackground:false、蓝色Enable、透明overlay隐藏背后控件且longpress视图只layer.opacity0保持gesture。 -3. caption patch SHA `031f4091dfce5cd937476b8f9ca57176a9c73a3a878545d43c60506bb84dfd33`:bounded键盘hint字体随DynamicType增至22,防Return重叠。已合入。 -4. key-legends patch SHA `025f56e58670c26d76ae60d85471084ed6c303febb6f18c9f8e83cd96b1fa533`:只在KeyboardKit standardButtonText为空时给Space/123/ABC/#+=fallback,不改action。已合入。 -5. STYLE UI patch SHA `0c995bf1350e886a8dd73b554d8b717a8ca194d1b01c443bb174f2b1c71f501d`:第五风格Tab、MyStyles/Market/Targets、模型设置直接复用DeveloperSettings;selectedTab上移App @State跨runtime reload保留、不改重启默认。Destination自己的SceneStorage待恢复model sheet(等!restarting),配置关闭后refresh原consumer不丢缓存。已合入并更新UITest;**不再使用主Agent曾预留的requestProviderConfiguration,未使用方法/flags已删除**。 -6. `/tmp/openless-translation-swift-tests/style-library-tests.patch` 已从openless-all apply,七新增Swift声明+14旧,共21声明(含参数化)。已存 `Artifacts/execution-wave3/translation-model-tests.patch/report.md`;最终iOS执行仍待跑。 - -外部Codex已正式产品Orca验过blueEnable/native背景/EN/拼,`Artifacts/keyboard-native-surface-qa/README.md`。最大字号当时失败→caption修复,后续新包复查仍待其回报。当前租约延续用于用户误收起keyboard恢复/最终surface复查;不要抢设备。 - -## 最新新增翻译业务修复(已写源码/Host测试通过,尚未重建静态库) - -用户要求raw风格可显式翻译,且翻译失败绝不能插原文假装成功: -- CoreHost capability使用developer+traditional+configured+enabled/supported channel独立计算`providerConfiguredAndEnabled`;`canAttemptTranslation`看任一Core effective target,`canAttemptPolish`仍反映postprocess/style开关。helpWrite保持既有显式开关。 -- voice_intent translation admission读canAttemptTranslation,不借canAttemptPolish;Core仍校验configured exact target。 -- PipelineDictationEngine仅context.translation_active时强制PolishFailurePolicy::Fail并拒绝空结果。普通polish UseRawText保持;raw transcript在failure中保留,绝不调用insert。 -- Host新测试raw+多个目标(默认等working language、备用有效)、合法tagged翻译成功、空/malformed输出失败不插原文,通过。 -- 初版新fixture给plain text而缺Core translation markers导致失败,是fixture错误已改为合法 `[[OPENLESS_POLISHED_SOURCE]]…[[OPENLESS_TRANSLATION]]…`;并保留malformed失败用例。 - -## 当前证据/下一验证 - -- `execution-wave3/translation-integrated-tests.log` **Host70通过**,包含metadata9/voice8+新增raw translation等。 -- `execution-wave3/core-full-final-bounded.log` **Core1193通过、1忽略**,未跳过新增测试;同目录最初 `core-full-final.log`进程SIGTERM,没有测试断言失败,原因未证实;以4线程有界重跑完整通过,保留失败事实。 -- Shared最新曾 **57 Testing通过**(额外XCTest本地化模块结果分开看日志),随后新增Undo测试,仍需最终再跑。首次InsertionRevocation测试`#require`缺内部try已修复,不是产品失败。 -- 当前所有App测试 `build-for-testing` **通过**,`execution-wave3/final-app-test-build.log`;修复两个worker XCTest class继承init actor冲突:改nonisolated class+每test @MainActor,不改变断言。 -- 旧第三波App native:词典6+历史4,style19,account18已实际iOS测试宿主通过;产品导航/词典取消2UI通过,记录在对应日志。**新增多目标21、projection、locale、VocabularyBridge及最终keyboard仍待最终实际执行**。 -- ENV02原键盘popup恢复:Orca softwareKeyboard helper toggle(type12)后globe切系统拼音再回OpenLess,原三轮refocus测试通过 `keyboard-popup-restored.xcresult`。系统输入框也可能选中OpenLess,不用“Settings也失败”排除扩展。恢复具体原因不可过度归因。 -- 已安装产品最近 `caption-legends-product-build.log`(pid72755;后续Codex可能重启了App),包含caption/keylegends/blue/native背景/locale/69Host版本,**尚不含最新Core raw translation修复和第五StyleTab**。源 `final-app-test-build.log`包含新UI,但没有安装。最终必须重建Core双平台后link/install。 -- 当前资源audit5测试通过(`localization-audit.log`);636+31keys按实际文件数为准。infoPlist英文/中文2项随资源包,品牌不变。 - -## 活动review/最后行动顺序 - -仅活动独立final Codex review **`e581dd6e-a1d7-4a0a-a682-8c8254d7ca37`**(profile `.pi/agents/openless-codex-review-61.md`,explicit gpt-6.1-sol high/read-only);收到完成读取 `review/final-ios-integration.md`。它启动后又有第五Tab/raw translation改动,必要时对这部分做有界follow-up review,不能把旧结果覆盖新改动。 - -1. 回答外部Codex协调/等其归还唯一模拟器;不重跑已过8fixture。 -2. 处理final review具体findings,保留未实现项真实状态;查source改动和模型限制。 -3. 更新静态Core双平台(显式Rust1.98、fresh `.build/core-ios16`,不可用旧CoreHost/target iOS27缓存),link最终App/extension。 -4. 实际iOS native tests(新增projection/vocab/locale/style21)、定向keyboard与页面UI、device unsigned build/every Mach-O floor16。 -5. 主Agent Orca最终实际操作/截图:第五Tab、三分区、目标添加/排序/删除可用专有测试目标后恢复;词典专有测试词后只删自己数据;语音/EN/拼/refocus/depth/大字号/dark/locale,防误录/误调用服务;导出真实fixture时标注fixture不能假装用户录音。 -6. 收尾当前README/verification/requirements/execution状态,清Runner/测试条目/无用临时资源(不删除复用模型或任何user数据),保留有价值证据,恢复light/large/用户原locale等。 -7. 不声称全需求已完成:remote limited sync需服务端namespace及Host vault/runtime hooks,hidden no-switch仍false需真机实现/签名,自动ASR新词抽取无真实接口,风格原位更新不支持,真实云/旧系统/真机无新证据。用户要求all不是伪造完成的授权;最终明确这些残余。 - -工具:XcodeGen绝对相对path `ios/.build-tools/XcodeGen/.build/release/xcodegen`;Rust显式RUSTC/RUSTDOC1.98;DerivedData-compatibility产品。codexhost不存在,未创建CodexHost thread;原生Pi和独立Codex CLI profile均已正常运行。所有active worker已交接,只有final review/外部Codex QA在继续。 diff --git a/openless-all/ios/docs/execution-plan.md b/openless-all/ios/docs/execution-plan.md deleted file mode 100644 index 42456e199..000000000 --- a/openless-all/ios/docs/execution-plan.md +++ /dev/null @@ -1,118 +0,0 @@ -# 剩余工作执行清单与分工 - -更新:2026-10-16。主需求见 [requirements-and-todo.md](requirements-and-todo.md)。本清单先于新一轮实现落盘;勾选只表示对应阶段已经实际完成,不代表整个功能验收通过。 - -## 执行合同 - -- 所有子 Agent:`openai-codex/gpt-6.1-sol`,thinking **high**。不使用其他模型,不使用 xhigh/max,不允许子 Agent 再委派。 -- 各组件在当前 `appergb/合并两个分支` 的隔离子工作区运行,复制当前未提交源码快照;不以旧 HEAD 代替 dirty iOS 源码。不 commit/push/reset,不覆盖其他平台工作。 -- 多组件任务:独占实现 → 窄接口交接 → 主 Agent 集成 → Codex 独立审查 → 原作者或主 Agent 修复 → 主 Agent 最终验收。 -- 模拟器由主 Agent 独占;worker 不启动、删除或重置设备,不改权限,不用用户数据做破坏性测试。Core 测试用临时目录/memory vault;语音验证优先公共音频 fixture。 -- 最终使用 Orca 自带模拟器实际操作与截图,AX/截图证明结果;命令返回 ok 不算操作成功。保留唯一设备 `A4B5F07C-C6C9-498F-BEEC-AC7AC98B8A6A`。 -- 发现环境/服务/签名缺口时,继续可独立完成的代码,但缺失验收不得勾选。隐藏免跳转不得用假按钮、空 allowlist、长期静默占麦或可见小窗冒充完成。 - -## 完整执行 To-do - -### 0. 需求、环境与调度 - -- [x] 汇总既有 63 条需求及最新词典截图、键盘退化追问。 -- [x] 新增 DICT-01~04、REF-05、EXEC-01~03 和本执行清单。 -- [x] 核对当前模型注册名:`openai-codex/gpt-6.1-sol`;显式 high。 -- [x] 建立隔离组件工作区、当前 dirty 源码快照与 183 个关键源文件 SHA-256 基线;`Artifacts/execution-wave1/*.json`。不提交工作区。 -- [x] 首波 worker 运行记录:workflow `af5b23fc-7fa2-43f5-aa9f-75f105c1e13d`;A `437b8215-7a49-4ae9-8f78-269ad70f0add`、B `915eb1bf-56d9-4a20-ae1d-c7ef652e4213`、D `5a2ebe6c-f8ef-4a93-8b5c-cf972dc0433d`,全部 `openai-codex/gpt-6.1-sol:high`。报告为 runtime-managed `wave1/{dictionary,style-core,account-sync-core}.md`,当前运行中。 - -### 1. 词典截图实现(A,DICT-01~04/LANG-04) - -- [x] 词典大标题、按需搜索、所有/自动/手动胶囊筛选代码由 A 交接并集成;Orca 当前空态截图已核对(非最终全部状态验收)。 -- [ ] 按真实 Core 来源分页前筛选并接入 UI。主 Host 已支持 source all/learned/manual,遵循 Core exact learned marker 规则,查询与分类在 total/100 条分页之前应用;210 条混合测试通过(`Artifacts/execution-wave1/vocabulary-source-tests.log`),UI 待 A 交接。 -- [ ] 简洁分隔列表、来源图标、必要停用状态;备注与使用次数按需查看。 -- [x] 右下浮动加号/紧凑添加弹窗已集成;Orca 实际打开/取消后回到空词典且不写入,截图 `Artifacts/execution-wave1/dictionary-new-modal.png`。保存/失败运行验收仍在总验收门。 -- [ ] 编辑/启停/删除放入可发现的行菜单;长词、中文、emoji、空态、加载、错误、深色与大字号。 -- [ ] 模型/筛选/输入校验测试;模拟器实际打开、搜索、筛选、添加取消与截图。 - -### 2. 风格、能力与翻译配置(B,STYLE-01~05/SET-04/LANG-01~05) - -- [ ] 复用 Core 市场服务、风格仓库/归档校验,确认本地归档实际格式,不发明 VIP 付费。 -- [ ] 窄 Host API:市场列表/详情/下载,已安装包读取/启停/选择/更新/移除/导入。 -- [ ] 能力快照区分普通原文、LLM 未启用、缺凭据、服务未验证、模型/权限/网络错误;不泄露密钥。 -- [ ] App 只读风格管理与文件导入 UI,无包编辑器。 -- [ ] 翻译语言目录和目标新增/删除/排序/持久化,对齐 Core 契约,不凭参考图硬写不兼容上限。 -- [ ] 统一提供商/模型设置入口,保留初始本地原文和显式启用原则。 -- [ ] 本地校验/假传输契约测试;真实市场/服务结果与网络缺口单独记录。 - -### 3. 键盘意图、词条确认与 Rime(C,KBD-01~08/SYNC-03/05/06) - -- [x] VID-01:找到用户上传的56.45秒视频并实际抽帧,详见 [keyboard-video-reference.md](keyboard-video-reference.md)。 -- [ ] VID-02~06:按视频实现语音/帮写/弧形翻译/处理态的UI和逻辑,保留EN/拼真实打字引擎;视频未展开的26键不臆造。 - -- [ ] 明确点按、按住、选择态、取消、越界、中断、释放的状态表。 -- [ ] 语音会话开始固定源语言/目标/风格/提供商能力,durable IPC 兼容旧状态。 -- [ ] 长按/滑动翻译目标,只在真实能力可用时开放,普通按住说话不改成松手一律取消。 -- [ ] 提示词驱动帮写:描述要写什么 → ASR/LLM → 预览 → 用户受控插入;不读取选区充当帮写。 -- [ ] 键盘内选择实际可用的润色模式/风格。 -- [ ] 词条建议去重、确认/拒绝/关闭;确认前不写词典/不替换原文。 -- [ ] Core 领域词条映射到 Rime 本机词典,不跨进程同步正在写的二进制学习文件。 -- [ ] 保留 KeyboardKit 文字输入、无 Full Access 基础打字、系统地球键/听写键处理、目标变更保护和减少动态效果。 -- [ ] 协议/状态机测试及主 Agent 的真实键盘操作验收。 - -### 4. 账户与加密同步(D,ACCOUNT-01/02/SYNC-01~08) - -- [ ] 核对实际账户认证、回调 URI/移动平台约束、Keychain 与登出契约。 -- [ ] 复用 Core E2EE 注册/初始化、密钥派生、恢复、同步、冲突和错误,不另写 Swift crypto/HTTP。 -- [ ] 同步仅确认词条、模式、风格引用;缺失风格可补下载/提示,不默默改服务商。 -- [ ] 登录/未登录/实际权限、恢复与错误界面;不编造 Free/Pro、升级、支付或订阅。 -- [ ] 本地数据隔离与退出/切账户,不因错误密钥/网络/恢复失败覆盖数据。 -- [ ] 离线/冲突/错密钥/重试/跨端契约测试;真实认证/服务验收单独记录。 - -### 5. P1 余项、兼容、键盘退化与免跳转(E) - -- [ ] HIST-04/05:详情复制/删除/重新润色 UI,真实服务可用时验证;原文不可被预览覆盖。 -- [ ] HIST-06~10:播放/停止/系统导出真实 WAV,完成态禁止导出;崩溃遗留恢复、历史过期资产清扫。 -- [ ] SET-02/03:App/键盘主题一致性,UI 语言独立于识别/翻译;复用已有本地化资源。 -- [ ] BASE-02:README、验证、ASR、许可/模型 notices 与实现一致。 -- [ ] ENV-02:已用 Orca 实际点击对照,系统 Settings 搜索框有光标、能接收 ASCII,但同样无软件键盘;不只发生在 OpenLess。证据见 [keyboard-environment-check.md](keyboard-environment-check.md)。仍需定位具体根因,不能以系统同现象当作修复通过。 -- [ ] VOICE-01:保持本地 SenseVoice、准备不录音、取消/超时/目标保护;不自动录制人声。 -- [ ] VOICE-02:可行的真实隐藏免跳转实现与物理设备验证;没有实现/签名不能勾选。 -- [ ] COMP-03:当前 device/simulator 构建、Mach-O 下限、原生测试;iOS 16/18 真实运行证据另列,不冒充已覆盖。 - -### 6. Codex 审查与主 Agent 验收(R/V) - -- [ ] 完成组件交接、基线校验与集成,逐条回写主需求状态。 -- [ ] Codex(GPT-6.1 high)独立审查集成代码,覆盖数据丢失、秘密泄露、IPC/会话意图、UI/iOS 16 和需求遗漏。 -- [ ] 将 findings 分类为有效/已失效/无效/范围外,修复有效阻断并复审。 -- [ ] 主 Agent 检查修改文件和测试结果,不以 worker 声称通过代替证据。 -- [ ] Orca 自带模拟器实际页面/键盘操作、截图和 AX;深浅色、大字号、取消/离线错误和导航。 -- [ ] 使用安全的专有测试条目验证 CRUD,清理仅本次测试条目;不清用户历史/词典/凭据/Full Access。 -- [ ] 恢复单产品入口、无 Runner/多余探针,无后台录音;唯一模拟器与模型资源保留。 -- [ ] 提交最终逐项结果:完成、未完成、证据、外部依赖,不把总体目标写成已完成。 - -## 拓扑与文件所有权 - -分类:**multi-seam**。词典呈现、Core 风格服务、Core 账户/同步、键盘状态机、App 集成、环境诊断可分别验证。采用分波执行;不是让一个 worker 包办整项产品。 - -| Lane | 决策/独占范围 | 隔离 | 依赖/下一门 | 输出 | -| --- | --- | --- | --- | --- | -| A | 词典呈现:`App/VocabularyView.swift`、词典 DTO/筛选模型、新词典测试;不改 Rust/根入口 | `/Users/trip/orca/workspaces/openless/ios-dict-ui-61` | Core 来源字段契约交给主 Agent;Swift 编译/窄测试 | 修改文件、界面值、校验、剩余缺口 | -| B | 风格服务:新 `CoreHost/src/style_library.rs`、对应 tests;本地可接线编译,但公共 lib/control 交主 Agent 按补丁集成 | `/Users/trip/orca/workspaces/openless/ios-style-core-61` | 先交 Host JSON 契约;后启动独占 App 风格 UI worker | Core 方法与 JSON 合同、测试 | -| D | 账户/E2EE:新 `CoreHost/src/account_sync.rs` 与测试;本地可接线编译,但公共入口交主 Agent 按补丁集成 | `/Users/trip/orca/workspaces/openless/ios-account-sync-61` | 先核对现有服务/密钥契约;后启动账户 UI worker | 可实现合同/实现、外部缺口与测试 | -| B-UI | 风格 App 消费者:新 StyleLibrary.swift/StyleLibraryView.swift,翻译设置消费者;不改 Root/Host | `/Users/trip/orca/workspaces/openless/ios-style-app-61`(创建后执行) | B Host JSON 已明确,31 项集成测试通过;仅实现真实支持能力,后续多目标合同由 T 提供 | 页面与 DTO/导入校验测试 | -| F | 有限范围 E2EE Core 策略:共享 Core cloud_sync_e2ee* 的 opt-in policy/document gate/迁移测试,默认桌面全量不变 | `/Users/trip/orca/workspaces/openless/ios-sync-policy-61`(创建后执行) | D 证实全量协议超范围;不得上传历史/凭据来冒充完成 | Core 范围合同、向后兼容及错密钥/冲突测试 | -| T | 多翻译目标/会话冻结:共享 Core config/settings/DictationContext/start-options,与既有单目标向后兼容 | `/Users/trip/orca/workspaces/openless/ios-translation-domain-61`(创建后执行) | B 证实只有单目标;先补领域合同,C 才能消费 | 目标迁移/排序/会话意图测试 | -| C-UI | 视频键盘呈现/手势:Keyboard/PlatformShared/Shared意图DTO与状态机,不改Host/AppController | `/Users/trip/orca/workspaces/openless/ios-keyboard-video-61` | VID参考、B能力和T会话合同;App/Host主Agent接线 | 状态表、协议、UI及定向测试 | -| D-UI | 账户App消费者:AccountSettings model/view/tests,不改Host/Root | `/Users/trip/orca/workspaces/openless/ios-account-app-61` | D已接通真实device-flow;F未就绪时清楚禁同步 | 账户页面/轮询取消/安全错误 | -| C-Core | 冻结语音意图/Core compose执行:CoreHost新voice_intent模块和最小Core compose facade | `/Users/trip/orca/workspaces/openless/ios-voice-intent-core-61` | T已集成;仅此worker写该契约,App接线主Agent | 取消/无凭据/冻结/preview不自动插入测试 | -| C-Rime | 词条桥接/确认建议独立模块:RimeBridge、新Shared词条DTO、App词条桥;不改C-UI控制器 | `/Users/trip/orca/workspaces/openless/ios-vocabulary-bridge-61` | C-UI挂接点交主Agent;只同步明确确认词条 | 词条映射/无FullAccess/确认测试 | -| E-audio | 历史音频恢复/过期清扫:新 recording_maintenance 模块,窄 recordings/library接线;主入口补丁交主Agent | `/Users/trip/orca/workspaces/openless/ios-history-maintenance-61` | A/B/D已集成;不得丢弃尚可恢复的孤立录音 | 临时目录崩溃/过期/幂等测试 | -| E-UI | UI语言独立设置及本地化资源/主题传递的新模块,不改Root/Settings/KeyboardController公共入口 | `/Users/trip/orca/workspaces/openless/ios-localization-61` | 复用中文/英文已有翻译;公共入口补丁交主Agent | 本地化覆盖/持久化/原生构建 | -| I | 主 Agent 唯一集成者:`lib.rs`/`control.rs`/AppController/Root/project/主需求文档 | 当前工作区 | 所有组件交接后集成;不得并发拷贝覆盖 | 集成记录、冲突处置 | -| R | Codex 独立只读审查 | 集成工作区只读 | 实现与定向测试完成后运行,high | 有证据的 findings/复审 | -| V | 主 Agent 独占 Orca 自带模拟器 | 当前工作区 | review 修复后 | 操作记录、截图、逐项验收 | - -## 调度事实 - -- 当前可用 Pi registry:`openai-codex/gpt-6.1-sol`;worker 显式 `:high`。 -- `codexhost delegate --help` 返回 `/bin/bash: codexhost: command not found`,未启动任何 CodexHost thread。已核对 Codex 本机模型缓存支持 `gpt-6.1-sol`/high;新增项目 profile `.pi/agents/openless-codex-review-61.md`,通过原生 external-cli runner 显式 `codex exec --model gpt-6.1-sol --config model_reasoning_effort="high" --sandbox read-only`。内置 adapter 不支持自定义 args 的预检已纠正;当前 profile 发现有效,尚未启动 review,不用模型默认 low。 -- 首波 A/B/D 已交接。A 五个Swift文件经基线哈希检查集成,B/D 入口手工逐段组合,没有覆盖词典筛选或其他lane修改。主Host全部 **39测试通过**(`execution-wave1/integrated-account-tests.log`);新词典6+历史模型4在实际iOS测试宿主通过(`dictionary-model-current.xcresult`)。尚未Codex最终review。 -- 第二波 `50c5fb79-bdc8-4479-b2d8-2564e50dd85e`:B-UI `abdb83a7-cd1d-4e08-b53e-d5e1268efa1f`,F `f91fdc18-5e25-4a9d-b888-f36cac6a005c`,T `e685c87f-f97e-4c13-bb63-d78380977334`,全部6.1/high,运行中。C/E和账户消费者按合同继续;最终review和验收未提前勾选。 -- D 已证实当前 Core E2EE 使用 `encrypted-full-snapshot-v1`,包括历史/活动/频道/凭据,没有有限文档策略注入。已批准先做真实 device-flow 账户与 fail-closed 同步边界;D 必须交接精确 Core scope-policy/transaction seam,随后另开共享 Core 范围适配任务。**禁用同步只是中间保护,不算 SYNC-01~08 已实现。** -- A 的來源合同已批准:遵循 Core 当前 exact learned marker 分类,不按短语猜来源;unknown/未来 DTO 值仍不强行标自动。A 初次包解析缺失本地 speech Frameworks,已批准仅补只读依赖 symlink 后重跑,不重下/修改二进制。 diff --git a/openless-all/ios/docs/input-predictions-selfcheck.md b/openless-all/ios/docs/input-predictions-selfcheck.md deleted file mode 100644 index fdee6c9d0..000000000 --- a/openless-all/ios/docs/input-predictions-selfcheck.md +++ /dev/null @@ -1,39 +0,0 @@ -# 输入联想自查(2026-10-20) - -结论:本地词库完整,候选链路能连续工作,但相关性仍有明显弱项,不能记为用户体验验收通过。没有大改词库或排序;只修复了中文 `limit <= 0` 仍返回一个候选的明确边界错误。 - -## 方法与资源 - -用 `xcrun swiftc Keyboard/KeyboardPredictionEngine.swift <临时 main.swift>` 直接编译当前 Swift 引擎,连接 `Resources/Prediction/lexicon.sqlite3`,运行 29 组中英文/边界样例;没有用 Python 复刻排序代替真实引擎。另用 SQLite 只读连接执行完整性与条目数检查。 - -- 数据库 `PRAGMA integrity_check = ok`;SHA-256 `bbec6f0934bfd18e25c981fe81246c7d2eb8195151e64b65ddda115afe692e03`,与 manifest 一致。 -- 英文单词 82,833;英文 bigram 115,314;中文续词 178,855,与 manifest 一致。 -- 9 个原生断言通过:零/负上限为空、limit=1、最长中文前缀、标点断句、英文 thank→you 与 want→to、句末清空、全大写保持。 -- 没有运行完整 App/UI 测试套件;UITextChecker 的系统纠错/补全、Rime 组合串排序和真实候选栏触控不在本次命令行样例的覆盖范围。 - -## 实际候选(按引擎顺序) - -| 输入上下文 | 候选摘录 | 判断 | -| --- | --- | --- | -| `th` | `th, That, This, They, Their, There` | 原输入保留首位,常用补全排序合理。 | -| `thank ` | `you, the, all, my, them` | 第一候选有直接相关性。 | -| `I ` → `I want ` → `I want to ` | `have/am/was` → `to/it/a` → `the/be/a/get/do` | 连续输入有候选,只有前一单词参与 bigram,长句语义没有保留。 | -| `good m` | `m, more, my, may, me, most, music, make` | 常见搭配 morning 未进入前八,下一词语境约束较弱。 | -| `HEL` | `HEL, HELP, HELD, HELPFUL, HELLO` | 大小写保持;按频率排序而非固定 hello 优先。 | -| `we're ` | 空 | 带撇号的上下文覆盖不足。 | -| 空输入、`Hello. `、换行 | 空 | 句子边界不乱猜下一词。 | -| `中国` | 人、共产党、企业、国际、人民、经济 | 有相关性,新闻/机构用语偏多。 | -| `中华人民` | 共和国、共和国主席、共和国证券法… | 最长匹配优先,机构法律类偏多。 | -| `今天` | 是、在、晚上、下午、上午、早上 | 常用续词较合理。 | -| `天气` | 预报、变化、情况、炎热、寒冷、状况 | 较合理。 | -| `谢谢` → `谢谢你` | 合作、你、大家、了、您 → 们、了、啊、的爱… | 可连续候选;商务短语的频率压过日常表达。 | -| `你好` | 吗、啊、的、像、了、评度、友、处 | 后部结果由“好”的短前缀回退产生,相关性差。 | -| `今天下午` | 茶、三点、好、五点、四时… | 回退只看“下午”,失去“今天”的语境;下午茶排首不理想。 | -| `早上` | 起来、好、起床、市公司、的、海、述、面 | 三个较合理候选后,单字“上”的回退导致碎片续词。 | -| `好,` | 空 | 中文标点切断续词,符合当前策略。 | - -## 候选条与风险 - -读码确认:中文只插入续词后缀,英文替换当前 prefix 并按后文补空格;候选点击前复核 document + before + after 锚点,换输入框/光标后拒绝旧候选。密码、URL、邮箱、验证码、选中文本与词中插入点限制仍在;Rime 有组合串时优先显示 Rime 候选,提交后再走续词。首位工具栏返回按钮和 44pt 点击高度仍保留,本次未改布局。 - -后续优化应先处理短中文后缀回退的相关性门槛、日常对话词频、英文常用搭配及缩写覆盖。当前缺少真实输入语料评测,不能为几条示例加入硬编码排序;需用户在聊天连续输入、选词、删除、切输入框后验收。 diff --git a/openless-all/ios/docs/input-predictions.md b/openless-all/ios/docs/input-predictions.md deleted file mode 100644 index 01bf46d08..000000000 --- a/openless-all/ios/docs/input-predictions.md +++ /dev/null @@ -1,50 +0,0 @@ -# iOS 离线候选与续词 - -2026-10-20 更新:中文仍使用 librime 1.13.1,输入词库替换为 -[雾凇拼音](https://github.com/iDvel/rime-ice/tree/da1fbe602e38f26db846fa10120ee64c2b0324c0) -的完整常用字表与 20 万条高频基础词,共 208,757 条字音/词音。旧版为 -rime-pinyin-simp 的 65,140 行基础词库。保留 Rime 组句、简拼、补全、 -用户词频学习与已确认个人词典桥接。 - -英文原本只调用 -[UITextChecker.completions](https://developer.apple.com/documentation/uikit/uitextchecker); -这提供单词补全,不等于系统键盘的下一词模型。旧实现遇到空格就清空候选, -中文选词后也不做续词。现在采用 -[SymSpell 的开放频率数据](https://github.com/wolfgarbe/SymSpell/tree/c239062ae02961df18ab7da1671d01b4388204e0) -提供 82,833 个英文词、115,314 个上下文词对,再由 UITextChecker 提供拼写纠错。 -输入 `Thank ` 后提供 `you`,部分单词按前词和词频排序;候选保留原输入, -只有点击候选才替换,不在按空格时静默纠错。 - -中文从同一雾凇词库建立 178,855 条词语后缀关联。上屏 `你好` 后可选 `吗`、 -`啊`,点击只追加未输入的部分。它是词语续词,不是神经网络自由生成, -也不是对完整句子语义的推理。优先匹配最近 4 个汉字,随后回退到更短上下文。 - -候选条在空格/上屏后继续显示,左侧 44 pt 返回按钮可恢复语言、风格与语音工具栏。 -URL、邮箱、密码、验证码、用户名和选中文本不显示统计候选; -英文单词中间及中文后接已有汉字时不补词。选择前会核对文档 ID 和光标两侧文本, -过期候选不会删除或写入其他位置。 - -## 数据与资源 - -- 数据源固定提交和 SHA-256;`scripts/build-predictions.py` 生成词库与只读 SQLite。 - `scripts/build-rime.sh host` 会调用该步骤并重新编译 Rime 数据。 -- SQLite 文件 15,151,104 bytes(约 14.45 MiB),按索引查询,512 KiB 页缓存, - 关闭 mmap,不把整库或大模型载入内存。 -- 无网络请求,不要求完全访问,不存储输入文本或新的英文个人词频。 - 原有 Rime 学习仍在键盘私有目录内。 -- `Resources/Prediction/manifest.json` 记录精确来源、校验值和计数; - 应用内开源许可可查看 rime-ice、SymSpell 和 prediction-data。 -- GPL-3.0-only 的雾凇数据与 MIT 的 SymSpell 数据保留许可和原始来源说明。 - SymSpell 上游说明频率来自 Google Books Ngram 与 SCOWL;数据归属和链接见 - `Resources/Licenses/prediction-data-LICENSE.txt`。 - -## 验证 - -`bash scripts/test-predictions.sh` 覆盖英文上下文续词、纠错候选、大小写、句末、 -中文后缀和缺失资源时的回退。450 次主机采样的英文与中文联合查询: -p50 0.22 ms、p95 0.95 ms;不代表 iPhone 真机延迟。 - -`scripts/test-rime.sh` 使用真实 librime 验证中文组合与提交,加入旧词库没有独立 -条目的 `明天见`、`等一下`、`微信`、`朋友圈`、`语音输入`。 -`testOfflineNextWordAndChineseContinuation` 在实际键盘中验证英文下一词、 -中文续词不重复前缀、返回工具栏,以及关闭完全访问时的可用性。 diff --git a/openless-all/ios/docs/ios-a1-diagnosis.md b/openless-all/ios/docs/ios-a1-diagnosis.md deleted file mode 100644 index 8eb20f6ee..000000000 --- a/openless-all/ios/docs/ios-a1-diagnosis.md +++ /dev/null @@ -1,49 +0,0 @@ -# A1 语音往返诊断(2026-10-20) - -基线 `5780e153`;先记录诊断,再修改代码。本文区分代码可证明的缺口和仍需真机日志确认的原因,不把模拟器构建当作真机验收。 - -## 现象、路径与判断 - -| 现象 | 代码路径 | 根因判断与证据 | -| --- | --- | --- | -| 录屏 0–5 秒准备/连接 | `startVoice → beginVoice → KeyboardStartHandshake.advance`;过期快照连续 3 次 `.probe`,每次 1.2 秒,随后 `.openHost → requestForegroundVoice`;宿主查询最多再等 2 秒 | **确定存在串行等待放大**,两段等待可达约 5.6 秒。快照过期只说明没有新状态;录屏不能区分进程挂起、退出、通知失联或音频会话失效。 | -| 5–9 秒已录音却停在 OpenLess | `receiveHostActivation → scheduleAutomaticHostActivation → startHostActivation → prepareSpeech → begin`;首次真实 `level` 事件才触发 `returnToKeyboardAfterCaptureStarted`;`HostApplicationReturn.m` 使用系统导航 action,失败再用精确 bundle | **录音已经启动,等待首次音频不是持续滞留的充分解释**。键盘私有 arbiter 要求两次新通知,真实系统若只发送一次会丢弃已读到的来源;跨团队 `sourceApplication` 又可能为空。没有本次日志,不能断言是来源为空还是返回 API 被拒绝。导航 action 的“accepted”也不等于真的离开前台。 | -| 微信内换聊天后准备/请求未完成/再激活 | `changedInput → stopForDestinationChange`;新请求创建新的 `KeyboardStartHandshake`,重新使用共享快照 | **未发现换文档直接撤销后台资格**。清空的是旧录音的目标、握手和 `activeHostEpoch`;`NoJumpAudioSession.epoch` 属于主 App,不在此路径清空。旧快照的 `.error` 当前会在 `activeClient == nil` 时进入新输入框的状态,造成无关错误沿用;这与是否有真实后台资格是两件事。 | -| 返回宿主后下次还要激活 | `NoJumpAudioSession.activate/checkHealth/releaseCapture` 与通知观察者 | `prepareSpeech` 已尝试激活输出会话,`foregroundChanged(false)` 也不会主动关闭它;不存在“接管漏调用 activate”的证据。**确定缺口**:中断 began/部分路由变化立即 deactivate;interruption ended 被忽略;音频引擎配置变化无恢复处理。发生一次中断后,本次输出资格永久丢失,必须再次前台激活。低音量循环输出能否在用户真机长期维持后台执行仍未验证。 | - -用 ffmpeg 每 3 秒抽帧核对了原录屏:约 6 秒主 App 两处都显示录音,约 9 秒多任务卡片已回微信,约 21 秒第二个聊天显示请求失败。录屏显示的是可见行为,不能替代 Console 的分支证据。 - -## 修复边界 - -保留真实音频渲染时间、权限、锁屏与 session generation 的准入校验;绝不把已停引擎标记为可录音。缩短失联握手的串行等待,仍必须先探测;处理可恢复的输出配置变化及系统明确允许的中断结束,只恢复输出,绝不自动恢复麦克风。输入框改变必须继续终止旧请求与旧目标交付,但不能污染下一次请求的状态。 - -自动返回仍须保留本次输入目标/来源,重试只使用当前请求的精确 bundle 或唯一系统导航目标;不猜微信 URL scheme、不用上一次宿主缓存。返回在真实 PCM 已到达后执行,以免切后台过早让采集无法启动。 - -## 真机与日志 - -`xcrun devicectl list devices` 发现 iPhone 18 Pro(`00008160-00065DA114800036`);`device info details` 确认有线连接、Developer Mode 开启、iOS 27.0.1(24A446)。另一台 iPhone 16 Pro 不可用。本记录尚未宣称新包安装或真机验收通过。 - -Mac 打开 Console.app(控制台),左栏选连接的 iPhone,开始流式记录,启用 Info/Debug 消息,搜索 `OPENLESS_`。保留 OpenLess 主进程与键盘扩展两者;不要只按进程过滤主 App。先清空显示,再按以下顺序复现并保存 `.logarchive` 或导出的日志: - -1. 前台打开 OpenLess 并启用键盘语音,返回微信原聊天;点击一次说话、停止,确认只上屏一次。 -2. 同一微信 App 内切到另一聊天,再点一次;分别等待 5 秒、30 秒、5 分钟后重复;记录是否跳转及原光标位置。 -3. 主 App 确实不响应时点一次,确认激活后自动开始和返回,无需第二次点击;记录 `source`、`target`、`accepted` 和应用前后台变化。 -4. 接入/断开蓝牙、Siri/来电中断结束、锁屏解锁后重复;中断时应停止当前录音,不自动重开麦克风。检查恢复输出是否真正渲染、空闲 `outputInputIO=0`。 -5. 启动准备中切输入框/取消,确认旧回调不会再跳转或向新输入框投递旧会话。 - -需要关联的日志:`OPENLESS_START_*`(请求/探针/原因)、`OPENLESS_AUDIO_*`(真实引擎/渲染/中断/恢复)、`OPENLESS_HOST_*`(宿主查询)、`OPENLESS_VOICE_HANDOFF`(来源/返回)、`OPENLESS_DESTINATION`(旧目标解除)。不记录文本、音频、凭据。 - -若真机日志证明音频循环被系统挂起,Darwin ping 无法唤醒挂起进程,缩短超时只能减少等待,不能解决免跳转。可落地后续方案是:在真机做独立 PiP/系统录音控制实验,验证后台重新开麦、停止后麦克风释放、能耗及用户可见界面;按系统/机型记录实测资格,再接入产品。当前 PiP 未实现,不能声称隐藏 PiP 或绝对免跳转已完成。 - -Apple 对引擎配置变化会停止引擎的说明见 [AVAudioEngineConfigurationChange](https://developer.apple.com/documentation/foundation/nsnotification/name-swift.struct/avaudioengineconfigurationchange),中断结束的恢复提示见 [Responding to interruptions](https://developer.apple.com/library/archive/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/HandlingAudioInterruptions/HandlingAudioInterruptions.html)。这些说明支持恢复处理的必要性,不证明本机输出保活有效。 - -## 已实现的修复与验证边界 - -- 探测改为一次 1.2 秒有界 ping,再决定前台接管;没有把旧快照当作真实 ready。单次请求仍有原目标、20 秒总期限和结束闩锁。 -- `NoJumpAudioSession` 在输出引擎配置变化时有限重启输出图;系统中断结束且带 `shouldResume` 时,才尝试恢复之前已由用户激活的输出会话。iOS 27 的 didBecomeInactive 与 interruption-began 先后顺序均保留该恢复意图;锁屏、媒体服务丢失、用户关闭或不允许恢复仍撤销资格。通知在其原本的 main queue 中处理,避免额外异步 Task 让旧中断影响新一代会话。 -- 新增可选 `backgroundRecovering` 表示真实的有界修复过程,键盘等待它结束;`backgroundReady` 仍只来自真实渲染/采集。恢复不创建输入节点、不复活被中断的录音,失败就撤销输出资格。 -- 进一步确认来源查询的缺口:`stopConnection/checkConnection` 期间无 bundle 的中间通知原来会立即结束查询,已改为等到原超时或完整来源;仍要求两次新 generation 的一致来源及原 document/window 挂载,不采用单次来源回退或历史缓存。此为代码可证缺口,是否正是微信本次失败原因仍需新日志。 -- 主 App 进入 active 时也检查已到达的 captureReady,避免首次音频事件早于 scene 激活时错过自动返回;详细记录导航 action/精确 bundle 打开/返回是否实际观察到。仍在收到真实音频后返回。 -- 无当前请求时不把旧 `.error/.cancelled` 沿用到新输入框;换输入框继续只解除旧会话目标,保持主进程音频资格独立。 - -本轮模拟器构建与定向共享测试通过;它们不能证明真机后台输出会话可长期存活,也不能证明微信来源查询/自动返回实际成功。设备已确认连接,本通道未覆盖安装用户设备上的包,交协调者合并两个通道后统一签名安装并按上文抓日志。若最新日志仍显示无响应或返回失败,需依据具体 `OPENLESS_` 分支继续真机修复,不应把本轮标记为真机 A1 验收通过。 diff --git a/openless-all/ios/docs/ios-build10-goals.md b/openless-all/ios/docs/ios-build10-goals.md deleted file mode 100644 index c141165df..000000000 --- a/openless-all/ios/docs/ios-build10-goals.md +++ /dev/null @@ -1,43 +0,0 @@ -# Build 10:目标、实现与验收边界 - -日期:2026-10-21。接续 Build 9,用户已确认基础 PiP 免跳转可用;本轮解决其后续反馈,不重做该结论。交付未签名 IPA,由用户自行签名。桌面端既有改动不属于本轮。 - -## 目标与实现 - -| 用户目标 | 本轮实现 | 验证要求 | -|---|---|---| -| 免跳转没有可见黑块、控制条或侧边拉手 | 透明 VideoCall 内容、0.1pt 高度、构建时隐藏 controls 适配;停止普通 sample-buffer 视频路径 | 编译与内部接口 fixture;实际外观需真机 | -| B 站等其他视频可以使用 PiP | 独立兼容层:按签名检查内部接口,普通 VideoCall 启动后提交一次共存内容类型;不循环抢占系统 PiP | fixture 验证隔离/取消,双 PiP 需要真机 | -| 锁屏解锁后保留免跳转意图 | 锁屏不撤销激活代际、不销毁已活跃 PiP;解锁重新读取实时状态;不会自动重开麦克风 | 状态测试;锁屏期间系统是否保留 PiP 需真机 | -| 回到 OpenLess 再离开无需再次激活 | 激活意图与前后台、音频录制状态分离;前台同步 PiP 并有界恢复 | 状态测试及真机前后台序列 | -| B 站恢复正常扬声器,无需切两次 | 删除空闲输出引擎与静音循环;只在录音期间激活 playAndRecord;硬件停止后 deactivate 并切回非录音类别;失败做有界重试,空闲路由通知不重启会话 | driver 测试验证释放顺序;音量/路由需真机 | -| 拼音模式能提交 openless 原文 | Return/原文候选提交 rawInput,空格/中文候选保留中文提交语义 | 真实 Rime smoke + 聚焦 UI 用例 | -| 键盘按钮更易点击 | 模式切换、语音工具、发送等尺寸调整;原文候选至少 44×44pt | 语法/布局检查,操作体验待验收 | - -## 拆包证据如何转成代码 - -Typeless 的 `stopRecording → stopService → cleanupKeepActive` 在 PiP 模式跳过 PiP cleanup。键盘先 ping 主 App,PiP active 时允许 microphone IDLE 直接启动。依据是 `Artifacts/keyboard-reopen-fix/competitor-evidence.md` 的 Hermes 字节码复核,不是原生隐藏方法体。 - -因此 `NoJumpAudioSession` 不再维持输出音频租约。`activate()` 只建立用户激活代际;`AppController` 将实际 PiP readiness 作为后台录音能力;`acquireCapture(.keyboard(generation))` 同时校验代际、PiP、权限和锁定/中断状态。录音服务仍只有收到显式请求才创建 inputNode。`AudioCapture.stopHardware()` 先拆掉输入引擎,再释放会话;转写和插入无需持有音频。 - -豆包的 hidden/stash/hook 导出以及 Typeless 的 pipHideEnabled 分支证明存在专用路径,不能恢复其全部原生实现。本轮隐藏/共存兼容代码参考已归档的 GlobalRefresh-PiP 固定版本,来源、运行时签名检查与未知边界见 `pip-hidden-coexistence.md`。不将参考项目方案冒称为豆包或 Typeless 原始源码。 - -PiP 启动允许临时 playback + mixWithOthers 会话,在启动完成、失败、取消、超时后释放;若此时录音或历史播放已接管音频,不得提前 deactivate。音频路由不调用强制 speaker override,不周期性改路由,不模拟点击控制中心。录音类别的 defaultToSpeaker 仅覆盖无外设时的内置默认值;空闲时退出录音类别才是本轮的主要修复。 - -## 验证与证据边界 - -- 自动测试能证明:状态转换、旧代际取消、录音结束释放、空闲不重开音频、兼容层实例隔离和 ABI 不符时降级,以及键盘原文提交。 -- 构建能证明:目标设备架构、Swift/Objective-C 编译链接、包结构和资源完整性。 -- 上述均不能证明:iPhone 上隐藏视觉、其他视频 PiP 共存、后台重新开麦、锁屏后的长期保活、实际扬声器音量。 -- `KeepAliveCompatibility.json` 继续为空,不伪造系统/机型实测记录。若接口不兼容、PiP 停止或已被系统挂起,`isReady` 必须为 false,键盘使用既有前台激活路径。 - -## 真机验收序列 - -1. 自签安装 Build 10,首次激活后在微信连续录音两次,确认真实 PCM、识别结果和麦克风指示正常。 -2. 停录后确认麦克风指示消失,检查完整屏幕和侧边无残留浮窗;开启 B 站播放,不切输出设备,记录音量与控制中心输出列表。 -3. 打开 B 站视频 PiP,再返回微信录音;关闭视频 PiP 后再录音。 -4. 锁屏 30 秒及 5 分钟,解锁直接在原应用录音;随后进入 OpenLess,再返回原应用录音。 -5. 插拔耳机/切蓝牙,结束后播放视频;确认不会被后台会话持续改回内置输出。 -6. 拼音输入 openless:Return 和原文候选应提交英文;中文候选和空格仍提交中文。 - -收集 `OPENLESS_PIP_*`、`OPENLESS_AUDIO_ARM`、`OPENLESS_AUDIO_IDLE_RELEASED`、`OPENLESS_AUDIO_EVENT`、`OPENLESS_AUDIO_CAPTURE_START_FAILED` 与诊断中的 routeIn/routeOut/idleAudio/provider/localType。若失败,按实时 PiP、系统开麦结果、会话释放结果定位,不用布尔开关替代真机证据。 diff --git a/openless-all/ios/docs/ios-build10-release.md b/openless-all/ios/docs/ios-build10-release.md deleted file mode 100644 index 4ae885983..000000000 --- a/openless-all/ios/docs/ios-build10-release.md +++ /dev/null @@ -1,37 +0,0 @@ -# OpenLess iOS Build 10 交付 - -日期:2026-10-21(America/Los_Angeles)。版本 `0.1.0 (10)`,arm64,未签名,由用户自行签名安装;未 push。Build 9 基础 PiP 免跳转已获用户确认,本轮接续处理其后的隐藏、共存、生命周期、扬声器及键盘反馈。 - -## 产物与目标 - -[下载未签名 IPA](../Artifacts/release-10/OpenLess-0.1.0-10-unsigned.ipa)。文件大小 198,093,424 字节(188.9 MiB),SHA-256: - -```text -24554fe1f24e50a2112d11b8ff64c478f2cab381e45a26ebb2c14a8f3e42de95 -``` - -目标、每项实现位置和真机验收步骤见 [Build 10 目标](ios-build10-goals.md)。专门设计见 [PiP 隐藏/共存](pip-hidden-coexistence.md)、[拼音原文与按键](keyboard-raw-input.md)。当前 README、keepalive 和待办已同步,历史 Build 7/9 记录保留并标识时点。 - -本轮移除待机音频引擎与静音循环。录音结束先停止采集,再 deactivate 音频并退出录音类别;释放失败做三次有界重试,旧重试不能关闭新录音。后台准入使用激活代际、实时 PiP 状态和权限/中断状态。锁屏保留意图,只对锁屏打断的 PiP 授予一次解锁恢复,不在后台反复争抢其他视频。 - -PiP 改为透明 VideoCall 内容,并集成独立、按运行时签名检查的隐藏/共存适配。该部分使用系统内部接口;不兼容时不会假报就绪。不是对豆包或 Typeless 完整原生源码的恢复,也不能用本地 type 6 提交成功证明系统已接受多 PiP。 - -## 验证 - -- 设备 Release 构建通过;主 App、键盘和控件版本均为 10。项目静态校验通过。 -- IPA ZIP CRC、三个 executable 权限、解压产品校验通过;532 个文件逐一 SHA-256 与原始构建产物一致。打包不包含 AppleDouble/xattr 旁文件。 -- 12 项模拟器音频所有权/准入测试通过:闲置不激活音频、PiP 独立准入、录音结束释放、锁屏解锁、前后台、系统中断、音频服务重置、路由变化、历史播放、旧代际、释放失败重试与新录音隔离。 -- PiP runtime fixture 六组通过:构造范围、签名拒绝、代理身份、type4→6 延迟一次提交、回调/取消顺序、100 次释放,以及锁屏一次恢复状态机。用生产适配文件编译执行,不是手抄实现测试。 -- 真实 AVKit 构造检查在当前 iOS 27 模拟器明确 skipped:该运行时 `isPictureInPictureSupported()` 返回 false。因此没有将 fixture 结果冒充实际 iOS PiP 运行证明。 -- 真实 Rime smoke 通过,包括中文候选/空格、四种原文、删除与清空;Swift 语法与差异检查通过。 -- 聚焦键盘 UI 用例 `testSymbolsReturnAndCompositionSwitch` 最终通过:原文/中文提交、两次 Return、44pt 目标、符号、大写与语音页换行。初次安装等待、跨进程更新同步及符号切换预期已更正,旧失败日志保留;未宣称整套 UI 或横屏验收通过。最终结果见 `keyboard-confirmed-tests.log/.xcresult`。 - -日志和 xcresult 位于 `Artifacts/release-10/`,包括 `build-device-release.log`、`validate-project.log`、`pip-runtime-tests.log`、`final-focused-tests.log`、`keyboard-confirmed-tests.log`、`validate-extracted-product.log`、`package-verification.json`。未运行完整测试套件。 - -设备构建复用原有 `Frameworks/device` 静态库,没有构建桌面端既有未提交修改。签名、安装、目标 iPhone 的实际隐藏、多 PiP、后台重新开麦、B 站扬声器音量和长期驻留尚未在本包实测;`KeepAliveCompatibility.json` 保持空,不伪造通过记录。 - -## 验收入口 - -自签安装后按目标文档的六步序列检查。最关键的三项:停止录音后直接播放 B 站无需切输出;B 站开启自己的 PiP 后 OpenLess 仍能录音;锁屏解锁和回主应用再离开不重新激活。失败时保留对应录屏及 OPENLESS_AUDIO/OPENLESS_PIP 日志,区分系统结束 PiP、录音准入失败和音频释放失败。 - -本轮没有修改原 provider 会话或归档,也未操作用户 Chrome。用户提供的 macOS DMG 路径在本机不存在,未安装或分析该文件;本次工作和交付范围为 iOS。 diff --git a/openless-all/ios/docs/ios-build11-goals.md b/openless-all/ios/docs/ios-build11-goals.md deleted file mode 100644 index c12c1ca76..000000000 --- a/openless-all/ios/docs/ios-build11-goals.md +++ /dev/null @@ -1,32 +0,0 @@ -# Build 11:键盘体验目标与实现 - -参考:用户提供的 `IMG_1751.jpg`、`IMG_1752.jpg` 和 `ScreenRecording_10-21-2026 16-58-04_1.MP4`(169.16 秒)。录屏前段展示 Typeless 的中文候选 → 确认原始字母 → 再次发送;后段展示 OpenLess 的尺寸、录音波形、翻译白条与 processing 文案。沿用 Build 10 的 PiP/音频生命周期,本轮不改变其准入或路由。 - -| 反馈 | 实现 | -|---|---| -| 键盘太大、希望自定义 | 默认四行内容区从 232pt 改为 208pt,接近参考截图;设置→键盘→键盘高度提供 90%–120% 调节及恢复推荐大小。主 App 保存并通过现有共享偏好同步,横屏使用更低的独立基准。 | -| 润色模式重开变原文 | 使用键盘私有 UserDefaults 独立保存风格 ID,扩展重新创建时读取。普通设置/旧主 App 快照不覆盖该选择;不可用风格显示不可用,不静默切回原文。 | -| 英文输入不应直接出现在候选栏 | 移除人工添加的原文候选按钮,保持 Rime 候选。组合期间第一次 Return 提交准确 rawInput,不发送;组合清空后第二次 Return 执行宿主换行/发送动作。 | -| 语音页缺少 @ | @ 始终占独立空闲编辑位置,不再被撤销替换;有可安全撤销的听写结果时,长按 @ 可选择撤销。删除放在右侧上方,减少底部拥挤。 | -| 输入法后端是什么 | 拼音组合/候选为 Rime;布局/手势为 KeyboardKit 9.9.0;项目提供本地联想与词库;默认语音识别为 SenseVoice Small。本轮不替换引擎。 | -| 红色录音与波形不明显 | 键盘录音圆由 72pt 改为 96pt,白色波形加粗;真实 RMS 按语音常见 dB 范围映射,低音量也能看清波形。无音量时不伪造跳动;尊重减少动态效果。 | -| 翻译白条难看 | 去掉实色背景,翻译状态放在“再次点击以完成”下方;两行同字体、同 secondaryLabel 灰色。 | -| 处理中/分析统一文案 | 语音 processing 标签统一为小写 `thinking`,覆盖共享按钮、主应用状态及激活页;准备和等待插入仍表达各自状态。 | -| 键盘整体体验 | 顶部模式改为波形图标/EN/拼,简化选中背景;中文主操作键缺少库内文案时显示发送/回车图标;空闲麦克风使用清晰胶囊和上方提示,收敛工具尺寸与布局。 | - -## 状态与兼容 - -- `KeyboardPreferences.keyboardScale` 为新增可选解码字段,旧数据默认 100%;限制异常/非有限数值,不让键盘塌陷或异常增高。 -- 高度在主应用设置;与其他共享偏好一样,扩展同步需要“允许完全访问”。基础打字和本地润色选择记忆不新增网络依赖。 -- 原文从 Rime `get_input` 读取,保留 `v`、用户输入的分隔符等,不从格式化 preedit 反推。点击中文候选、空格选词与原始字母确认是不同操作。 -- 录音波形只改变显示映射,不更改麦克风增益、PCM 或识别输入。视觉测试使用明确标识的模拟 RMS,不能作为实际开麦证据。 - -## 验收 - -1. 设置高度为 90% 后重开应用,数值保留;恢复推荐为 100%,键盘整体低于 Build 10。 -2. 选择润色风格,收起/重开及扩展重启后仍保留;主动选原文后才清除。 -3. 拼音输入 openless,候选栏不额外插英文项;第一次确认输入 openless,第二次执行宿主动作;nihao 点击“你好”仍为中文。 -4. 语音页输入 @,听写结束后 @ 仍存在;需要撤销时长按 @。 -5. 录音时能明显辨认圆形与波形;翻译说明在完成提示下面,无白条;结束后显示 thinking。 - -自动检查及产物见 [Build 11 交付记录](ios-build11-release.md)。真机打字手感、动态音量感受及宿主 App 的发送语义以安装验收为准。 diff --git a/openless-all/ios/docs/ios-build11-release.md b/openless-all/ios/docs/ios-build11-release.md deleted file mode 100644 index 0971400b7..000000000 --- a/openless-all/ios/docs/ios-build11-release.md +++ /dev/null @@ -1,40 +0,0 @@ -# OpenLess iOS Build 11 交付 - -日期:2026-10-21。版本 `0.1.0 (11)`,arm64,未签名,由用户自行签名安装。实现范围见 [目标与实现](ios-build11-goals.md)。本轮沿用 Build 10 的音频/PiP 逻辑。 - -## 安装包 - -[下载 IPA](../Artifacts/release-11/OpenLess-0.1.0-11-unsigned.ipa) - -- 大小:198,107,772 字节,约 188.9 MiB。 -- SHA-256:`7cfe27ef52cd19c6f32b1af6da2f844d313408a9e3fbf702231a95a538ccf790`。 -- 主 App、键盘扩展及录音控件均为 Build 11。 -- ZIP CRC、解压产品结构及 532 个文件与原始构建产物的 SHA-256 比对通过。 - -## 已实现 - -默认键盘内容区缩为 208pt;设置增加 90%–120% 高度与恢复推荐大小。润色选择独立持久保存,键盘重新出现会读取最近选择。候选栏恢复仅由 Rime 提供候选,第一次确认原始字母、第二次执行宿主发送/换行。@ 不再被撤销按钮替换,撤销改为长按 @ 的菜单项,删除移至右上、翻译移至左上,底部主按钮居中。 - -录音圆扩大至 96pt,波形改用真实 RMS 的语音范围映射。翻译白条改为完成提示下方的灰色文字;语音 processing 状态统一为 `thinking`。顶部模式控制和空闲麦克风外观参考用户截图整理。 - -输入法后端:Rime 负责中文组合与候选,KeyboardKit 9.9.0 负责键位布局和手势;英文候选结合本地预测词库与系统 UITextChecker;语音默认是 SenseVoice Small 本地识别。本次没有替换这些引擎。 - -## 验证记录 - -- 设备 Release 构建、项目静态校验、IPA 解压产品校验通过。 -- `KeyboardPresentationTests` 4 项通过:旧偏好兼容、尺寸范围/异常值、风格持久保存/原文清除、真实音量显示映射。 -- 界面资源检查 5 项通过,并补齐上轮新增 PiP 静态提示的翻译资源。 -- `SpeakButtonTests` 两项通过:未就绪时不偷偷录音,以及录音/准备状态的取消与停止。 -- 录音视觉测试通过:模拟 RMS 驱动录音组件并转到 thinking,截图及组件录像保留。没有使用麦克风,不能把它当作实际采集测试。 -- 高度偏好在主 App 调整、重启、恢复推荐的 UI 用例已通过。 -- 拼音两步确认、中文候选和 @ 输入 UI 用例通过;最终主按钮居中、语音/拼音布局截图检查通过。中文主操作键在库内缺少文案时也有图标兜底。 - -证据目录:`Artifacts/release-11/`。设备日志 `build-device-release.log`;偏好测试 `preferences-tests.log`;资源检查 `interface-resources-tests.log`;最终模拟器测试 `final-focused-tests.log/.xcresult`;视觉组件录像 `recording-component.mov`;包校验 `package-verification.json`。首轮并行编译受同机资源压力影响,主动中断后改为串行完成,未将中断记录标为测试通过。 - -未运行完整测试套件。真机输入手感、微信等宿主的实际发送动作、低音量实际录音视觉以及自定义高度的舒适范围,仍需自签安装后验收。没有把模拟器测试扩大为新包的 iPhone 真机结论。 - -最终 UI 证据:`keyboard-confirmed-tests.log/.xcresult`(输入行为)、`layout-tests.log/.xcresult`(最终布局)。冷启动设置导航及跨进程文字等待的中间失败记录保留,重跑后上述用例通过;没有重跑完整测试套件。 - -- [最终语音键盘](../Artifacts/release-11/final-layout-evidence/59A456C6-30E2-4E66-8438-A73452CE43DD.png) -- [最终拼音键盘](../Artifacts/release-11/final-layout-evidence/01E96C2E-35D4-4E47-85F6-A1B415925750.png) -- [录音组件动态演示(模拟音量)](../Artifacts/release-11/recording-component.mov) diff --git a/openless-all/ios/docs/ios-no-jump-plan.md b/openless-all/ios/docs/ios-no-jump-plan.md deleted file mode 100644 index 1645d5aa9..000000000 --- a/openless-all/ios/docs/ios-no-jump-plan.md +++ /dev/null @@ -1,25 +0,0 @@ -# 键盘免跳转修复方案 · 2026-10-19 - -## 根因与边界 - -本次审计基于 de062611。已有 KeyboardStartHandshake 使用请求 ID、原始目标、20 秒 uptime 期限、快照 freshness、host epoch 和完成闩锁;Host 忙碌时等待,只有探针失联或空闲 Host 缺少后台资格才请求前台。自动上屏通过 Mailbox 持久化 claim、同步 insertText 和 uncertain 终态防止重复提交,扩展不初始化麦克风、Core 或模型。 - -发现一个目标冻结缺口:beginVoice 在 DispatchQueue.main.async 中才读取目标;用户点击后、回调前换输入框时,会把原手势绑定到新目标。修复为在提交已有输入法组合后立即捕获目标,并在异步回调及发送 start 前重新核对目标和可见性。失配终止该手势,不转移目标、不打开主应用。 - -## 状态机与改动点 - -- 手势提交后冻结 target → 异步检查可见性与 target → 创建握手。 -- stale snapshot → 最多三次 ping → 超时才 openHost;fresh busy → 等待并保留绝对期限;fresh idle 有资格 → start;epoch、目标、期限变化 → 终止。 -- sendStart 作为最后一道边界,再次检查原目标与键盘可见性。 -- deferred start 保持原命令 requestID、epoch、deadline、KeyboardLease、后台资格和配置能力复核;不延长请求有效期。 -- 视觉、动画和文案由设计 worker 负责,本 worker 不保留相关修改;canStart=false 的展示原因交其区分 busy、准备、失联和缺少后台资格。 - -## 测试与验收 - -补共享握手测试:等待期间丢失后台资格、过期快照不能覆盖 epoch、deadline 边界、配置变更终止,保证每个手势只有一次终态。运行共享 swift test;集成阶段执行 scripts/build.sh simulator Debug,重装独占 QA 模拟器后运行 App 单测、真实 Safari 键盘冷启动返回、收起重开及自动上屏去重回归,xcodebuild 使用 -collect-test-diagnostics never。日志和截图保存在 Artifacts/ui-redesign-20261019/,按方案、实现及验证结果分阶段提交。 - -真机仍需验证:同一轮 run loop 换输入框与收起键盘、App 重启 epoch、连续录音清理与配置切换、锁屏/中断/路由变化、后台输出租约真实性与空闲 input I/O 关闭,以及主 App 返回原宿主后一次上屏。PiP 仍未实现,不能宣称隐藏式免跳转已验收。 - -## 追加发现:取消前台准备与延迟解析 - -requestForegroundVoice 的宿主解析异步返回后,原代码只核对 foregroundHandoffID;voiceAction 的取消路径却未清除此 ID,因此取消准备后仍可能被延迟回调带到主应用。修复为取消/结束首先作废前台 handoff ID 与输入 anchor,解析回调另受 20 秒 uptime 绝对期限约束;收起键盘原有 stopForDestinationChange 会清除此 ID。所有提示复用既有文案,无新增资源字符串。 diff --git a/openless-all/ios/docs/ios-nojump-root-cause.md b/openless-all/ios/docs/ios-nojump-root-cause.md deleted file mode 100644 index f00cc9426..000000000 --- a/openless-all/ios/docs/ios-nojump-root-cause.md +++ /dev/null @@ -1,68 +0,0 @@ -# iOS 免跳转录音根因与证据 - -日期:2026-10-20 - -## 结论 - -Build 8 已确认的实现缺口是:OpenLess 只用 `NoJumpAudioSession` 保留了一个**输出**音频会话,真正录音时仍由 `AudioCapture` 新建 `AVAudioEngine` 并访问 `inputNode`。输出引擎存活不能证明下一次后台开麦会成功。若 `engine.start()` 失败,旧路径还会销毁输出 generation,于是键盘下一次只能重新激活主 App。后台开麦被系统拒绝是当前待验证的解释;缺少该次真机错误日志,不能把它写成已证实的系统根因。 - -这不是“换输入框必然清理会话”的证据。当前代码中,换输入框主要重建键盘侧 target/lease;没有找到它直接销毁 `NoJumpAudioSession` generation 的路径。录屏能证明发生了两次“准备 → 跳主 App → 返回”,但没有 `OPENLESS_` 真机日志,不能把某个具体的系统错误码伪装成已观测事实。 - -## 录屏逐帧 - -输入文件:`/Users/trip/Downloads/ScreenRecording_10-20-2026 22-36-26_1.MP4`,时长 39.623 秒,1206×2622,按 0.5 秒抽取 79 帧。帧号按第 1 帧约为 0 秒计;时间为近似值。 - -| 帧 / 时间 | 画面与状态文案 | 结论 | -| --- | --- | --- | -| 1–30 / 0–14.5s | 微信聊天中切换系统键盘、进入 OpenLess 键盘、输入英文和打开风格菜单;主 App 没有跳转。 | 普通键盘操作本身没有触发主 App 激活。 | -| 31–34 / 15–16.5s | OpenLess 键盘出现录音面板,随后白色按钮显示“准备中…”,下方显示“正在连接 OpenLess…”。 | 键盘先走主 App 握手,而不是直接开始后台采集。 | -| 35–40 / 17–19.5s | 画面切到 OpenLess 主 App,显示“正在准备语音”“准备中…”;之后回到微信。 | 第一次确实发生主 App 前台激活并自动返回。 | -| 41–50 / 20–24.5s | 返回后的键盘显示红色录音按钮和“再次点击我完成”;顶部出现正常的系统麦克风指示。 | 采集开始后系统隐私指示正常,没有把待机保活误当成持续录音。 | -| 51–55 / 25–27s | 识别结果插入为“试 open试 openless 输入”,随后切到 QQ/另一聊天。 | 第一轮结果已返回;切换聊天发生在下一轮之前。 | -| 56–60 / 27.5–29.5s | 新聊天中又显示录音面板;随后进入等待/准备状态。 | 第二轮没有沿用可直接后台录音的资格。 | -| 61–63 / 30–31s | 键盘显示“准备中…”或“正在等待上一段语音完成…”。 | 第二轮仍在等待主 App/上一段会话收敛。 | -| 64–66 / 31.5–32.5s | 再次跳到 OpenLess,主 App 先显示“可以开始了”,随后显示“正在准备语音”;系统键盘语音面板也短暂出现。 | 第二次同样需要前台激活,不是单纯的输入框切换动画。 | -| 67–70 / 33–34.5s | 返回 QQ,键盘进入录音态并显示红色按钮。 | 第二轮在主 App 前台取得采集资格后开始。 | -| 71–79 / 35–39s | 结果“C试 opened输入功”回到当前 QQ 输入框,随后录音面板收起。 | 第二轮也能自动返回并插入,但仍付出了跳转成本。 | - -用户指定的上一份录屏 `/Users/trip/Downloads/ScreenRecording_10-20-2026 16-26-45_1.MP4` 在本机不存在,因此本报告不推断该文件内容。 - -## 代码证据 - -`App/NoJumpAudioSession.swift` 的待机引擎只创建 `AVAudioPlayerNode` 和低音量循环 buffer,类别是 `.playAndRecord`,但没有创建 `inputNode` 或安装采集 tap。它的 `outputInputIO` 诊断用于确认待机 output unit 的 input I/O 没有打开。 - -`App/Speech/AudioCapture.swift` 只有在一次真实录音开始时才执行 `AVAudioEngine()`、读取 `engine.inputNode`、安装 tap 并调用 `engine.start()`。因此后台失败边界发生在 capture start,而不是键盘 UI 或识别结果插入。 - -`App/AppController.swift` 的旧准入条件是前台,或 `keyboardAudio.isReady`;它没有 PiP 条件。`nativeRequest(captureStart)` 失败后旧代码还调用 `keyboardAudio.deactivate(generation:)`,会把本来可能仍然有效的输出租约一并撤销。现已改为:后台新录音必须同时满足输出租约和 PiP 实际 active;capture start 失败只记录错误并释放本轮 capture,不主动摧毁仍有效的输出/PiP 保活。 - -## Typeless 对照 - -仓库中的 `Artifacts/keyboard-reopen-fix/competitor-evidence.md` 以及 `docs/keepalive.md` 对 Typeless 2.7.0 的静态证据显示:键盘重开前会 ping 主 App;`isSelfApp`、麦克风非 IDLE、或 `mainAppState.isPIPActive` 任一成立即可走直接启动;一轮录音停止会停服务但保留 PiP;键盘隐退不清理 PiP;关闭保活、登出或模式切换才 cleanup PiP。其待机麦克风仍是关闭的。 - -因此本轮采用公开 API 等价边界:`AVSampleBufferDisplayLayer` + `AVPictureInPictureController.ContentSource` + 中性视频帧;Info.plist 使用 `UIBackgroundModes: [audio]`;`picture-in-picture` 不是该键的合法独立值。OpenLess 不调用私有 selector、不伪造隐藏窗口,也不在待机创建 `inputNode`。系统 PiP 窗口的大小和是否被用户收起不能由公开 API 任意隐藏;这部分必须以真机系统行为验收,不能由代码静态宣称与 Typeless 的私有隐藏表面完全相同。 - -## 需要的真机日志 - -当前录屏没有配套 `OPENLESS_` 日志。用户有签名包后,在 Mac 打开“控制台”并连接 iPhone: - -1. 左侧选中 iPhone 18 Pro `00008160-00065DA114800036`。 -2. 搜索框输入 `OPENLESS_`,开始录制日志。 -3. 先前台打开 OpenLess、启用键盘语音,再回微信完成两轮录音;保留主 App 和键盘扩展的完整时间段。 -4. 重点保留 `OPENLESS_PIP_CONFIGURED`、`OPENLESS_PIP_START`、`OPENLESS_PIP_STARTED`、`OPENLESS_PIP_FAILED`、`OPENLESS_PIP_STOPPED`、`OPENLESS_START_REQUEST`、`OPENLESS_START_DEFERRED`、`OPENLESS_AUDIO_ACTIVATE`、`OPENLESS_AUDIO_RENDER_READY`、`OPENLESS_AUDIO_ACTIVATE_FAILED`、`OPENLESS_AUDIO_EVENT`、`OPENLESS_AUDIO_INVALIDATED`、`OPENLESS_AUDIO_CAPTURE_RELEASE`、`OPENLESS_AUDIO_CAPTURE_START_FAILED` 和 `OPENLESS_VOICE_HANDOFF`。 -5. 对每次失败,必须保留同一行里的 `error`、`localizedDescription`、`appState`、`generation`、`outputInputIO` 和 `captureStart` session ID;其中 `cannot start recording`、`required condition is false`、`AVAudioSession` interruption/route change 是判断系统拒绝后台新开麦的关键字段。 - -## 代码边界 - -PiP 保活只有在用户启用后台保活且主 App 曾经前台准备过语音后建立。PiP 活跃和输出租约都是真实状态,任一失效时键盘会退回“激活主 App,完成后自动返回”的路径。关闭“免跳转后台保活”会显式停止 PiP、释放输出会话;待机路径不会采集麦克风,只有真实录音请求才启动 `AudioCapture`。 - -本文件记录的是 Build 8 录屏的现象、代码缺口和 Build 9 的改动;在没有签名安装和 `OPENLESS_` 真机日志前,不把长期后台免跳转标记为真机通过。 - -## 重启后续接与构建修正 - -此前工作停在 PiP 提交 `26ae3691` 和自动识别语言的未提交改动,尚未交付 IPA。续接时确认两个设备构建已结束,后台 agent 不再运行,未恢复旧会话。 - -本次补全了 PiP 的 inline source:以实际 `UIView` 的 `AVSampleBufferDisplayLayer` 作为根界面右上角 48×27 的可见源,持续保留在页面切换之外。帧采用运行中的 host-clock timebase,按 layer 背压投递;待机只绘制中性波形,不打开输入节点。关闭保活同时取消自动启动和重试,迟到的 `didStart` 不会重新发布就绪;暂停的 PiP 不再算作后台就绪。已修正无效的后台模式值,项目静态校验和设备 Release 构建通过。 - -默认 SenseVoice 固定传入 `auto`;打字布局变化不再使语音准备失效。开发者模式 Apple Speech 使用固定中文 locale,与布局解耦,其混合识别效果仍由系统实现决定。 - -这不是隐藏 PiP:系统可以显示画中画浮窗,用户可按系统方式收起。没有本次真机运行证据,不能保证当前 iOS 版本允许 PiP 中重新开麦。最终验收与 IPA 见 `ios-build9-release.md`。 diff --git a/openless-all/ios/docs/ios-ui-spec.md b/openless-all/ios/docs/ios-ui-spec.md deleted file mode 100644 index bf3d8afbe..000000000 --- a/openless-all/ios/docs/ios-ui-spec.md +++ /dev/null @@ -1,155 +0,0 @@ -# OpenLess iOS UI 规格(Sonnet 5.5,2026-10-19) - -本规格基于 `Artifacts/ui-sonnet-20261019/before-*.png`(iPhone 17 / iOS 27 模拟器,浅色,简体中文)实测审查,不照搬 `ios-ui-redesign.md`(系统标签栏方案已被否决)。 - -## 0. 不可改动的约束 - -- 导航保持 `App/ProductDock.swift` 的 `NativeDockPair`:左侧 dock 放 概览/历史/词典/设置,右侧单独一列 dock 放“风格”,选中后展开为 我的风格/风格市场/翻译目标。严禁改成系统 TabView 标签栏或把风格移到页面顶部。本轮只在其内打磨。 -- 不用假状态:账户同步、隐藏 PiP 未实现就保持“暂不可用”。结果自动上屏,界面不再要求用户二次确认。 -- 尊重 `accessibilityReduceMotion`、动态字号、深浅色;键盘扩展里不加重型动画(不加模糊/粒子/持续动画)。 -- 不碰免跳转逻辑(KeyboardStartHandshake、KeyboardVoiceLifecycle、NoJumpAudioSession、AppController 会话/握手、HostApplicationReturn.m、KeyboardViewController 的启动/握手/返回/状态机)。 - -## 1. 审查结论(问题清单) - -| # | 位置 | 问题 | -|---|---|---| -| P1 | 全局 | 页面横向边距 16/20/24 混用;圆角 20/24/14/12 混用;各页标题三种做法(首页自绘、历史/词典自绘大标题、设置/风格/帮助为居中 inline 标题)。 | -| P2 | dock | 浮动玻璃 dock 下方内容(卡片文字、搜索栏、列表行)直接透出,文字与图标叠在一起(首页“平均段落”卡、设置“界面语言”行);出现/隐藏无过渡;切换页面内容瞬切,没有过渡。 | -| P3 | 首页 | 口号 34pt 大标题 + 副标题 + 状态点 + 180pt 浅蓝光晕圆 + 提示 + 语言菜单 + “概览”标题 + 4 张全 0 统计卡 + 折线图(空数据时 140pt 空白)+ 试用键盘卡,首屏几乎只有营销语;主操作(启用语音/录音)不够突出,语言入口像孤立文字。无数据时统计占屏过大。 | -| P4 | 设置 | 账户欢迎卡 ≈ 260pt 占满首屏,而键盘配置被挤到下面;“账户”能力实际是登录 GitHub,同步暂不可用,不应是首屏主角。各行图标有无不一,pinned 搜索栏下方列表内容透过玻璃,造成脏乱。 | -| P5 | 风格库 | 每张风格卡 ≈ 220pt(图标、2 行描述、勾选圆、整行宽的“当前使用/使用此风格”灰色按钮),一屏仅 2 张;“当前使用”灰色禁用按钮看起来像失效;“勾选圆”与按钮重复表达同一状态;“设置文字模型”蓝色文字孤立。 | -| P6 | 翻译目标 | 空态文案与“配置翻译模型/尚未设置”像三个独立块;“在键盘中翻译”卡末尾有一个空 `Text("")` 导致底部空白和多余分割线。 | -| P7 | 详情页 | 底部主操作条用 `.regularMaterial` 矩形,贴 dock 上缘,和玻璃 dock 风格冲突;“当前使用”用灰色禁用 borderedProminent。 | -| P8 | 历史/词典 | 历史无日期分组,卡片 5 行文本过高;词典背景为 `systemBackground` 与其它页的 `canvas` 不同;空态图标/字号三页各异。 | -| P9 | 文案 | 帮助/系统录音说明仍写“停止录音后,回到 OpenLess 键盘确认插入”“键盘中的录音入口会打开 OpenLess”,与“结果自动上屏、免跳转”相矛盾。 | -| P10 | 键盘 | 见第 6 节(需实机/模拟器键盘截图;本轮模拟器键盘自动选择失败,依据代码审查)。 | - -## 2. 设计 token(`App/AppDesign.swift` 新增/调整) - -```swift -enum AppDesign { // 颜色沿用现有 canvas/surface/accent - static let accentSoft = accent.opacity(0.10) // 图标底、选中底 - static let success = Color(uiColor: .systemGreen) - static let danger = Color(uiColor: .systemRed) - enum Space { static let page: CGFloat = 20, section: CGFloat = 24, card: CGFloat = 16, row: CGFloat = 12 } - enum Radius { static let card: CGFloat = 18, tile: CGFloat = 12, icon: CGFloat = 10 } - static let dockClearance: CGFloat = 78 // 62 dock + 8 top + 8 bottom -} -``` - -- 排版(全部 Dynamic Type 文本样式,不写死字号):页面标题 `.largeTitle.weight(.semibold)` + `tracking(-0.6)`;卡片标题 `.headline`;行标题 `.body`;说明 `.footnote` + `.secondary`;统计数字 `.title2.weight(.semibold).monospacedDigit()`。 -- 卡片:`productCard(padding: 16)`,圆角 18,描边 `Color.primary.opacity(0.06)` 0.5pt,浅色无阴影;深色加描边即可。 -- 图标底 `IconTile(symbol:, tint:)`:28×28(设置行)/ 36×36(风格卡),圆角 10,底色 `accentSoft`,图标 `.system(size: 15/18, weight: .medium)`。 -- 命中区域最小 44×44;行最小高度 52。 -- 动画 token(`ProductMotion`,放 `AppDesign.swift`;`PlatformShared/ProductMotion.swift` 已被移除,不要恢复): - - `quick = .easeOut(duration: 0.16)`:按压、勾选、徽标。 - - `standard = .spring(response: 0.34, dampingFraction: 0.88)`:卡片展开、列表增删。 - - `page = .easeOut(duration: 0.22)`:页面出现(opacity 0→1 + y 偏移 8→0)。 - - `dock = .easeInOut(duration: 0.4)`(ProductDock 内 UIKit 动画保持 0.4s 临界阻尼)。 - - Reduce Motion:所有位移/缩放去掉,只保留 `.easeOut(duration: 0.12)` 的透明度。 - - 封装:`func motion(_ a: Animation, reduce: Bool) -> Animation`,视图用 `@Environment(\.accessibilityReduceMotion)`。 - -## 3. 双 dock 打磨(`App/ProductDock.swift`、`App/OpenLessApp.swift` RootView) - -保持结构与 UIKit 实现(`DockPairHost` / `DockBarHost` / `DockMorphItem`)不动,只做: - -1. **底部渐隐遮罩**(解决 P2):在 `RootView` 的 dock overlay 之下加 `DockScrim`:`LinearGradient(colors:[canvas.opacity(0), canvas.opacity(0.94)], startPoint:.top, endPoint:.bottom)`,高度 `dockClearance + safeAreaInsets.bottom + 12`,`allowsHitTesting(false)`,`ignoresSafeArea(edges:.bottom)`。内容从 dock 后滚过时淡出,不再与图标重叠。 -2. **出现/隐藏过渡**:`dockVisible` 改变时 dock + scrim 使用 `.transition(.move(edge:.bottom).combined(with:.opacity))`,包在 `.animation(motion(.standard), value: dockVisible)`(RootView body 的 overlay 上);Reduce Motion 时只用 `.opacity`。键盘弹出时即不闪烁。 -3. **触感**:`onPrimary`/`onStyle` 回调里触发 `UISelectionFeedbackGenerator().selectionChanged()`(仅当选中项变化时,且遵循 `controller.preferences.haptics`——`ProductDock` 通过 `@Environment` 传入布尔值;此项为可选,若无法干净取得偏好则省略,不加新状态)。 -4. **页面切换过渡**:新增 `PageAppear` ViewModifier(`.onAppear` 将 `@State shown` 置 true,`opacity(shown ? 1 : 0)`,`offset(y: shown || reduceMotion ? 0 : 8)`,`animation(page)`),应用在各 tab 根视图内容上。TabView 切换时新页面淡入上移 8pt,0.22s。 -5. 无障碍:dock 不变;scrim `accessibilityHidden(true)`。 -6. 验收:dock 下方不再出现内容透字;风格展开/收起动画不回归(`testDockRoundTripsAndStyleCardsStayResponsive` 通过)。 - -## 4. 页面规格 - -### 4.1 首页 `App/HomeView.swift`、`OverviewMetricsView.swift`(P3) - -- 顶部:保留品牌行(`OpenLessMark(34)` + 字标 + 键盘安装按钮,按钮改 `accentSoft` 圆底 44×44)。删除“少打字,多表达。/把你想说的,变成文字。”两行大字:品牌行即是首屏标识,口号放入空态副文案即可。 -- 主卡 `VoiceHeroCard`(新 private struct,HomeView 内):一张 `productCard`,内部垂直排列:状态行(状态点 + `stateTitle`,右侧语言菜单 `Picker` 改成 `Menu` 胶囊,44pt 高)→ 麦克风控件(`NativeSpeakControl` 230×132;去掉 180pt 光晕圆,改为录音时才出现的 `Circle().fill(accentSoft)`,随 `level` 缩放 1.0…1.12,Reduce Motion 下不缩放)→ 提示 `hint` → 次级动作“启用键盘语音”。结构不改业务调用。 -- 概览:标题与刷新放在一行;4 张统计卡改为一张卡内 2×2 网格(`Grid`,分隔线 0.5pt),每格“标题 caption / 数值 title2 / 说明 caption2”。无数据(`library.history.isEmpty`)时不显示图表,改显示 1 行说明“开始录音后,这里会显示趋势”;有数据时图表高 112。 -- “试用键盘”卡保留(identifier `openKeyboardTrial` 不变),底部 info 文案删除“启用键盘语音后…”重复提示或合并进主卡。 -- 状态过渡:`stateTitle`/`hint` 使用 `.contentTransition(.opacity)` + `.animation(motion(.quick), value: phase)`;错误卡 `.transition(.opacity.combined(with: .move(edge:.top)))`;结果卡出现用 `.standard`。 -- 页边距 `Space.page`。 - -### 4.2 设置 `App/SettingsView.swift`、`AccountProfileHeader.swift`(P4) - -- 账户行改为紧凑行 `AccountSummaryRow`:头像 44pt + 名称 `.headline` + 副标题(未登录:“登录 GitHub;同步暂不可用”)+ chevron,整体一个 `Section` 行,高 ≈ 72pt,去掉渐变大卡。`AccountProfileHeader(compact:true)` 重做为该行;`compact:false`(账户详情页)保留居中布局但头像 88、`padding(.vertical,24)`。 -- 区段顺序:键盘 → 风格与外观 → 语音识别 → 系统录音 → 账户 → 帮助与关于 → 版本。账户移到“键盘”之后(输入是核心任务,账户是辅助)。 -- 每行加 28pt `IconTile` 前缀(Picker 用 `Label` + `.labelStyle(SettingsLabelStyle())`),行高 ≥ 52。 -- 搜索栏 `PinnedSearchBar`:背景改 `AppDesign.canvas`(不透明)+ 底部 0.5pt 分隔线,消除内容透字。该改动在 `NativeSearchField.swift` 的 `PinnedSearchBar` 内,所有页面共享。 -- 页面标题:设置、风格根页使用大标题风格——设置改 `.navigationBarTitleDisplayMode(.large)` 不可与 safeAreaInset 搜索栏共存时,保留 inline,但标题文本 `.headline`;本轮保持 inline(风险最低),仅统一 `PageAppear`。 - -### 4.3 风格库 `App/StyleLibraryView.swift`(P5、P7) - -- `installedStyles` 的卡片重做为 `StyleCard`(≈ 92pt):`HStack`:`IconTile(sparkles, 36)` | 名称 `.headline` 1 行 + 描述 `.footnote.secondary` 2 行 | 右侧 `StyleUseControl`。整卡其余区域是 `NavigationLink`(identifier `styleDetail-` 不变)。 -- `StyleUseControl`:`Button`,当前使用 → 填充 accent 胶囊 + `checkmark`,文字“使用中”;未使用 → 描边 accent 胶囊,文字“使用”;高 32、最小宽 64;`accessibilityLabel` 仍为“当前使用”/“使用此风格”,identifier `styleUse-` 不变;当前项不再灰色禁用外观(disabled 仍保留语义,视觉用 accent 填充而不是 gray)。移除左下角重复的勾选圆。 -- 当前使用的卡片:描边 `accent.opacity(0.35)` 1pt,其余 `outline`。选中动画 `.animation(motion(.quick), value: style.active)`。 -- 空/可用性提示:`availability` 内“设置文字模型”改成 `ProductRow` 风格的小卡(symbol `slider.horizontal.3`),置于列表顶部提示区,不与风格卡抢层级。 -- 详情页底部操作条 `StylePrimaryAction`:背景由 `.regularMaterial` 改为 `canvas` 渐隐(同 DockScrim),按钮 `.borderedProminent`;当前使用时显示 “当前使用 ✓”,使用 `.tint(AppDesign.success)`,`disabled` 保留;底部 padding 加 `dock` 之上的间距(detail 页 dock 仍可见,沿用 `additionalSafeAreaInsets`)。 -- 风格市场行:保留 `List`,`StyleSummary` 的 `.padding(.vertical, 4)` 保持。 - -### 4.4 翻译目标 `App/StyleTranslationSettingsView.swift`(P6) - -- 删除 `Section("在键盘中翻译")` 中的空 `Text("")`,改 footer 文案 `Text("按住键盘上的翻译按钮并向上滑动选择语言,也可点按按钮后选择。")`;该区段改为带 `hand.draw`(`character.bubble`)图标的单行说明。 -- “翻译模型”区段:状态用 `Label`;未配置时按钮“配置翻译模型”保持 identifier;说明文案并入 footer。 -- 目标语言行当前默认项使用 accent `checkmark` 并加粗。 - -### 4.5 历史 `App/HistoryView.swift`(P8) - -- 条目卡文字 `lineLimit(3)`;时间与时长同一行,状态放在右下 `caption`,去掉整行 chevron 重复(整卡可点已足够,保留 `accessibilityHint`)。 -- 空态统一为 `EmptyState(symbol:, title:, message:)`(新建于 `AppDesign.swift`:56pt 图标圆底 `accentSoft`,标题 `.headline`,说明 `.footnote.secondary`,垂直 padding 48),历史、词典共用。 - -### 4.6 词典 `App/VocabularyView.swift`(P8) - -- 背景 `systemBackground` → `AppDesign.canvas`;空态改用 `EmptyState`;页边距 `Space.page`。 - -### 4.7 授权/激活 `App/HostVoiceActivationView.swift` - -- 结构保留;各 phase 之间用 `.animation(motion(.standard), value: request.phase)` + `.transition(.opacity)`;ready 文案已是“结果会自动输入”,保持。 - -### 4.8 文案(P9) - -- `SystemRecordingInstructions`、`HelpView`、安装页:删除“回到 OpenLess 键盘确认插入”;改为“停止录音后,文字会自动输入到当前输入框。”;“键盘中的录音入口会打开 OpenLess”改为“首次启用或后台会话过期时,键盘会短暂打开 OpenLess 并自动返回;其余情况直接在键盘内录音。” -- 同步 `Resources` 里对应的 zh-Hans/en `.lproj` 字符串(如存在),并检查 `AppTests`/`UITests` 中引用这些文案的断言。 - -## 5. 过渡动画清单 - -| 场景 | 动画 | 实现 | -|---|---|---| -| 页面切换(dock 切 tab) | 新页 opacity 0→1 + y 8→0,0.22s easeOut | `PageAppear` | -| dock 展开/收起 | 保持现有 0.4s 临界阻尼 morph | `DockPairHost.update`(不改) | -| dock 随键盘/二级页隐藏 | 下移 + 淡出,0.34 spring | RootView overlay `.transition` | -| 风格卡选中 | 描边/胶囊颜色 0.16s easeOut | `StyleUseControl` | -| 首页状态切换 | 文案 opacity 交叉淡化 0.16s | `contentTransition(.opacity)` | -| 错误/结果卡出现 | opacity + 8pt 上移,0.34 spring | `.transition` | -| 麦克风电平光晕 | scale 1.0–1.12,随 level,0.1s | HomeView 内 | -| sheet | 系统默认;详情 `presentationDetents([.medium,.large])` | 保持 | -| 键盘模式切换(语音/EN/拼) | 选中块平移 0.2s(已有);面板内容 opacity 交叉 0.16s | 第 6 节 | -| 录音 准备→录音→处理→上屏/失败 | 见第 6.3 | SpeakButton / 键盘 | - -Reduce Motion:位移、缩放全部关闭,仅 0.12s 透明度。 - -## 6. 键盘视觉(只改布局/样式/文案,不改状态机) - -> 依据代码审查(`Keyboard/KeyboardStyle.swift`、`PlatformShared/SpeakButton.swift`、`KeyboardViewController.swift` 视图部分);若运行截图显示不同,以截图为准并更新本节。 - -1. 模式条 `KeyboardModeControl`:保持 3 段;选中块圆角与外框同心(外 18 / 内 15 已满足);选中文字 `.label` + `.semibold`,未选中 `.secondaryLabel`;触控高度 ≥ 36(键盘垂直空间有限,不再增高)。 -2. 语音页 `KeyboardStyle.voicePanelHeight = 200`:提示/状态行放在按钮上方固定高度 20pt 的槽位,避免文案出现时按钮跳动;按钮居中,大面积留白用于“风格/翻译”芯片行而不是空着。 -3. 状态与文案(遵循协调者规则,只改文案,不改状态机): - - `canStart == false` 且 snapshot 新鲜 + 主 App 忙/配置刷新中:显示“正在等待,可取消”,不提示打开 App。 - - snapshot 新鲜 + 空闲 + `backgroundReady == false`(首次启用或后台会话过期):唯一显示“需要打开 OpenLess,将自动返回”的情形。 - - snapshot 过期:显示“正在连接…”,不用错误色。 - - 结果不再出现“确认插入”。 -4. 录音状态视觉(`SpeakButton`):准备中 = 按钮灰蓝 + 小菊花;录音中 = 红色实心 + 7 根电平条(现有);处理中 = 渐变扫光(现有,`presentationIsVisible` 控制暂停);上屏 = 0.16s 勾选淡入后回 idle;失败 = 0.16s 文案淡入,红色文字,不加抖动。均受 Reduce Motion 控制。 -5. 不新增模糊/Metal/持续动画,保持扩展内存。 - -## 7. 验收截图清单(`Artifacts/ui-sonnet-20261019/`,before-*/after-* 成对) - -首页、首页滚动、历史、词典、设置、设置滚动、账户、界面与外观、帮助、风格库、风格详情、风格市场、翻译目标、翻译语言选择、添加键盘、试用键盘;深色再做首页/设置/风格库;键盘三模式与录音各状态在可用时补充。 - -截图由 `UITests/UIAuditTests.swift`(只导航+截图,不改数据)生成: -`AUDIT_DIR` / `AUDIT_PREFIX` 通过 `TEST_RUNNER_` 环境变量传入,`xcrun simctl ui appearance dark|light` 切换外观。 - -## 8. 测试保护 - -保留所有 accessibilityIdentifier:`primaryDock`、`styleDock`、`dockTab-*`、`dockStyle-*`、`styleDetail-*`、`styleUse-*`(label 仍为“当前使用/使用此风格”)、`styleActivate-*`、`openAccountSettings`、`openStyleLibrary`、`openKeyboardTrial`、`prepareSpeech`、`historySearch`、`settingsSearch` 等。 diff --git a/openless-all/ios/docs/keepalive.md b/openless-all/ios/docs/keepalive.md deleted file mode 100644 index eacbaf0f1..000000000 --- a/openless-all/ios/docs/keepalive.md +++ /dev/null @@ -1,85 +0,0 @@ -# 跨应用录音:Build 10 当前实现 - -2026-10-21:用户已确认 Build 9 基础 PiP 免跳转可用。本轮改为隐藏 VideoCall PiP 保活、空闲释放音频,目标与验收见 [Build 10 目标](ios-build10-goals.md),隐藏/共存方案见 [PiP 设计](pip-hidden-coexistence.md)。 - -当前准入依赖用户激活代际、实际 PiP active/non-suspended、麦克风权限、解锁和系统中断状态;不再依赖静音输出引擎或 render timestamp。停止一次录音只关闭输入与音频会话,保留 PiP 和激活意图;关闭保活才显式销毁。运行时接口不兼容时降级为前台激活,不报告隐藏或共存成功。 - -下文全部为 Build 9 及以前的历史记录,其中“当前实现”“下一步”等措辞仅对应历史时点,不代表 Build 10 的代码状态。Build 10 真机效果以新包验收记录为准。 - ---- - -# 跨应用录音:输出会话与 PiP 研究 - -## 2026-10-20:再次收起键盘后的交付与准入修复 - -本次重新检查了“停止录音 → 收起键盘 → 切到其他 App → 再录”的代码路径,发现 Build 6 仍有三处缺口: - -- 输出音频在独立渲染线程上继续运行,但 `isReady` 使用主线程健康计时器缓存的时间。主线程延迟超过三秒后,IPC 回调可能先于计时器执行,把仍在输出的会话误判为失效。现在每次准入直接读取 `AVAudioPlayerNode.lastRenderTime`;健康计时器继续负责清理真实停止的会话。 -- 切换中英文现在只改变键盘布局,不会清零 `speechPrepared`,也不会重新准备识别器;能力快照始终使用 `sourceLanguage=auto`。布局切换不会创建采集引擎或重新激活音频。 -- 录音结束时键盘可能已经消失,识别结果仍向旧 `keyboardID/documentID/revision` 发送插入请求。旧扩展不再回执,Core 等待三十秒,新录音握手却在二十秒超时。现在键盘重新接入时,不携带 session ID 的有效空闲 ping 会撤销旧交付并立即回复 Core;即使 UIKit 重用同一个输入目标也适用。仍持有录音/结果的键盘发送带 session ID 的心跳,不会误撤销自己的结果。文字仍留在 SQLite 的待确认记录;尚未完成的识别结果随后到达也遵守该撤销。迟到的旧回执不能消费新会话,旧 native `insert` 必须匹配当前 Core 会话 ID。 - -键盘文案也区分了等待录音处理、识别配置准备、需要激活和主进程失联;空闲键盘不再一直显示“正在连接”,失去后台资格也不再被统称为“OpenLess 正忙”。 - -本次新增共享交付消息序列测试,覆盖真实 Mailbox 的旧插入、目标更换、保留待确认、新会话和迟到回执。原生音频探针增加了阻塞主线程 4.2 秒后直接检查实时准入的场景。最终运行结果由本轮构建/测试记录提供;代码修复本身不构成用户 iPhone 上长期免跳转已通过的证据。 - -Build 7 产物、测试记录和截图见[本轮交付记录](../Artifacts/interaction-build7/README.md)。 - -### 竞品与平台依据 - -[Typeless 官方说明](https://www.typeless.com/help/release-notes/ios/when-does-app-switching-happen)(2026-07-28,检索于 2026-10-20)明确区分两种状态:可直接听写,以及需要短暂打开主 App 取得麦克风后返回;同时说明待机时麦克风关闭。它没有承诺任何系统状态下都无需激活。仓库已有的 [Typeless 字节码复核](../Artifacts/keyboard-reopen-fix/competitor-evidence.md) 则显示,键盘隐藏、停一轮录音和关闭 PiP 保活是独立入口;本次沿用这种生命周期分离,没有声称恢复了其隐藏 PiP 原生实现。 - -Apple 的[自定义键盘文档](https://developer.apple.com/documentation/uikit/creating-a-custom-keyboard)说明键盘在独立且受内存限制的进程中运行,收起键盘也不意味着扩展必然销毁。因此后台语音能力与结果交付都不能以键盘视图是否还存在作为唯一判断。Apple 的[音频引擎配置变更文档](https://developer.apple.com/documentation/avfaudio/avaudioengineconfigurationchangenotification)还说明硬件通道数/采样率变化会停止引擎;本项目继续在真实输出停止、中断或权限失效时撤销准入,不凭缓存布尔值宣称可以后台开麦。 - -## 当前实现:输出音频会话 + PiP - -键盘仍通过 `NoJumpAudioSession` 的独立输出引擎保持后台服务,录音期间才运行输入引擎;首次在主 App 前台准备语音后,`ExperimentalPiPKeepAlive` 使用公开 `AVSampleBufferDisplayLayer`/`ContentSource` 建立 PiP 保活。只有输出租约和 PiP 都真实有效时,后台新录音才直接准入;待机不创建 `inputNode`,也不采集麦克风。Build 9 的代码根因与准入边界见 [免跳转录音根因](ios-nojump-root-cause.md)。 - -Build 6 补充了键盘收起重开的真实录音验证与两个准入竞态修复;Build 9 新增 PiP 保活和后台录音准入。公开 API 不提供完全隐藏 PiP 窗口的开关,且本机当前没有签名身份,因此 Build 9 仍不能宣称通过 iPhone 真机长期免跳转验收。 - -下面保留的是此前的 PiP 研究与 2026-10-17 历史状态;它不覆盖 Build 9 的公开 API 实现。系统中断、锁屏、其他 PiP、来电/Siri、进程回收和能耗仍需真机验证。 - -## 2026-10-17 历史验证路径 - -- 系统控制中心录音已实现:iOS 27 模拟器中,主 App 不在进程列表时点击控制可后台启动主进程,收到真实音频帧,持续 79.7 秒后主动停止。实时活动只覆盖录音期间,结束时释放采集并结束活动。 -- 键盘前台往返已实现:键盘按钮打开主 App 的对应请求,用户点按开始,返回 Safari 后继续录音,由键盘停止、预览并确认插入。输入位置变化时再次确认,交付不自动重放。 -- 键盘直接后台启动仍未实现。此前真实键盘的 `Button(intent:)` 路由证明只执行在扩展进程;控制中心的成功不能替代这项证据。 -- 最新界面与 Release 产物见 `../Artifacts/consumer-redesign/README.md`;语音运行证据见 `../Artifacts/overnight-usability/acceptance-summary.json`。模拟器证据不能代替真机运行。 - -继续检查发现一台已连接且开发者模式已开启的 iPhone 18 Pro(iOS 27.0.1 / 24A446)。本机当前可用代码签名身份为 0,项目未配置 `Config/Local.xcconfig`,该设备也未安装本项目默认 bundle。真机安装仍需有效开发证书、Team 和 App Group 配置。 - -## 硬要求 - -在明确激活过的会话内,同时做到: - -1. 键盘请求录音时不切主 App 前台。 -2. 两次录音之间没有持续音频采集。 -3. 没有长期可见的小窗、横幅、边缘拉手。 -4. 仍显示系统真实录音隐私指示;不越狱、不绕过麦克风权限。 - -## 已有证据与缺口 - -- 用户提供的 `ios-no-switch-report.md`:竞品将键盘、主进程采集和保活分离,存在 PiP/hidden/stash 模块线索。 -- Typeless 2.7.0 字节码:停录时关闭音频服务但保留 PiP 的分支可读;原生隐藏实现和设备行为未恢复。 -- 本机 iOS 27 SDK:公开 `AVPictureInPictureController` API 没有完全隐藏窗口的开关。 -- 历史 [AVKit](https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/AVKit.framework/AVPictureInPictureController.h)/[Pegasus](https://github.com/nst/iOS-Runtime-Headers/blob/master/PrivateFrameworks/Pegasus.framework/PGPictureInPictureController.h) 头文件只作研究导航,不能证明 iOS 27 的接口、ABI 或行为。 -- 已安装 iOS 27.0 模拟器运行时,App、实际键盘扩展与只读诊断测试已运行。真机连接与签名状态见上方更新;模拟器 UI、macOS PiP 行为均不能替代 iPhone 后台重新开麦和隐藏窗口证据。 - -## 代码实际状态 - -`ExperimentalPiPKeepAlive.isImplemented` 只表示当前系统具备公开 PiP API;`isReady` 只有在支持、已启用且系统报告 PiP active 时才为 true。它不写死成功状态,也不会在待机时打开麦克风。关闭设置中的“免跳转后台保活”会停止 PiP 并释放输出会话。 - -`Resources/KeepAliveCompatibility.json` 为空;即便人为修改 JSON,也不会把不存在的隐藏实现变成就绪。没有“只差打开开关”的承诺。 - -当前系统控制中心后台录音与键盘前台往返可独立使用;Build 9 的键盘直接免跳转仍需要签名包和 iPhone 18 Pro 运行证据。公开 PiP 实现不等于 Typeless 的私有隐藏表面。 - -## 下一步必须在真机完成 - -- 配置签名及 App Group,登记机型和完整系统 build。 -- 收集目标系统的实际接口,检查方法签名及对象所有权;明确恢复隐藏方法后才在隔离实验模块实现。不能猜 selector、复用历史 ABI 或盲目调用 `perform`。 -- 先验证隐藏动作是否维持真正后台执行及重新开麦权限,而不只是看不到视频内容。 -- 激活后连续 20 次听写,以及空闲 1/5/30 分钟后恢复。 -- 核对真实采集停止、系统麦克风指示、外部录像中的所有悬浮 UI。 -- 来电、Siri、其他媒体/PiP、蓝牙、锁屏、键盘进程回收、强退主 App:退出就绪且不得自动重开麦。 -- 记录 CPU、内存、发热和能耗,再登记可用 build。只出现一个成功截图不算通过。 - -没有通过就保留“不支持/未验证”,不得切换成持续占麦、透明内容的小窗、自动收边残留或循环跳转。 diff --git a/openless-all/ios/docs/keyboard-environment-check.md b/openless-all/ios/docs/keyboard-environment-check.md deleted file mode 100644 index 04da4c956..000000000 --- a/openless-all/ios/docs/keyboard-environment-check.md +++ /dev/null @@ -1,42 +0,0 @@ -# 软件键盘退化:当前环境对照 - -2026-10-16。ENV-02 尚未关闭,本记录只说明本次观察,不宣称已经确定根因或修复。 - -## 操作与观察 - -主 Agent 通过 Orca 自带模拟器连接唯一设备 `A4B5F07C-C6C9-498F-BEEC-AC7AC98B8A6A`,先读取共享 voice snapshot:inactive、level 0;没有调用准备语音/开始录音。 - -1. 打开当前已安装 OpenLess,Orca AX 返回真实页面;通过 normalized tap 点击词典 Tab 后复查 AX,词典 radio value 从 0 变为 1。 -2. 点击旧版词典添加,再点词条输入框。截图中没有软件键盘。未保存词条,点击取消离开。 -3. 打开系统 Settings,通过 Orca tap 从键盘设置退回根页,再点击系统搜索输入框。 -4. 系统搜索框出现光标,但截图没有软件键盘;Orca type `openless` 后,AX TextField 的 value 真实变为 `openless`,屏幕键盘仍无。没有修改任何系统设置。 - -证据目录 `Artifacts/execution-wave1/`: - -- `orca-after-tab-ax.json`:Tab 实际切换,不以 tap 返回 ok 当成功。 -- `orca-focused-word-input.png`:当前旧词典 Form,无软件键盘;不是新词典设计验收。 -- `orca-system-search-focused.png`/`orca-system-search-focused-ax.json`:系统输入框获得光标也没有屏幕键盘。 -- `orca-system-search-typed.png`/`orca-system-search-typed-ax.json`:系统输入框接收 ASCII,仍无软件键盘。 - -## 可下的结论 - -- 当前问题**不只发生在 OpenLess 编辑器**;系统输入框同样可复现。 -- `ConnectHardwareKeyboard=false` 的全局/设备偏好不是屏幕键盘真实显示的充分证据。 -- 输入服务/扩展进程存在不证明 UI 可见;AX 有焦点不证明屏幕键盘可见。 -- 模拟器 keyboard preferences 当时存在 `HardwareKeyboardLastSeen=1`,只是线索,不能单凭这个历史字段定根因,更不直接改用户偏好清库。 -- Orca 当前 serve-sim runtime 是 `1.4.227`,旧检查点的 `1.4.224` 已不存在。当前 normalized tap/type 有 AX 变化证据;不能继续引用旧版本 tap 无变化的结论。 - -## 后续恢复证据(同日) - -在当前 Orca serve-sim 1.4.227 中,通过其已实现的 `softwareKeyboard` HID toggle(helper WebSocket type 12,对应工具条软件键盘开关)切换一次后,出现底部系统地球键/听写栏,但键盘内容暂时仍未出现。随后实际点击地球键切到系统简体拼音,**系统26键显示**;再切回 OpenLess,**OpenLess 语音键盘也完整显示**。 - -- `Artifacts/execution-wave3/keyboard-toggle.png`:先出现底部系统栏,无键盘内容。 -- `system-keyboard-switched.png`:系统拼音键盘真正显示,输入框/弹窗随键盘避让。 -- `openless-keyboard-after-switch.png`:切回 OpenLess 后键盘真正显示(还是视频改版前版本)。 -- `keyboard-popup-restored.xcresult/.log`:原 `testTrialEditorShowsSoftwareKeyboardAfterRefocus` **通过,exit 0**;实际键盘存在、编辑器缩小、收起/再次点击三轮原断言未改。 - -没有重置数据、改 Full Access、重启系统服务或加产品强制聚焦补丁。恢复步骤是软件键盘显示切换+输入法切换;不能单凭此确定最初由哪个版本/服务导致隐藏状态,也不能保证所有重启后永不复发。 - -重要修正:系统应用输入框也可能选中 OpenLess 扩展;所以“系统输入框也不弹”单独并不能排除第三方扩展问题。上述地球键切到系统拼音再切回才是实际输入法对照。 - -当前恢复可继续验收新键盘。最终视频改版后仍需重跑相关输入回归;旧失败日志保留,不改写为历史通过。 diff --git a/openless-all/ios/docs/keyboard-raw-input.md b/openless-all/ios/docs/keyboard-raw-input.md deleted file mode 100644 index bbdf68a24..000000000 --- a/openless-all/ios/docs/keyboard-raw-input.md +++ /dev/null @@ -1,27 +0,0 @@ -# Build 11 更新 - -用户通过新录屏澄清:候选栏保留中文,不添加独立英文原文项。Build 11 已移除 Build 10 的原文候选按钮,保留第一次 Return 确认 rawInput、第二次执行宿主动作的两步行为。默认尺寸与自定义高度见 [Build 11 目标](ios-build11-goals.md)。以下为 Build 10 历史记录。 - ---- - -# 拼音原文提交与按键尺寸 - -目标:拼音模式输入 `openless` 时,蓝色确认键应提交实际键入的英文;用户也能直接点击候选栏中的原文。中文候选、空格选词及符号布局切换保持各自明确的行为。 - -## 输入行为 - -- 有组合输入时,第一次按 Return 提交原始字母,不换行、搜索或发送;第二次 Return 才交给宿主执行原本的动作。 -- 候选栏第一项显示实际输入,如 `openless`、`nihao`、`nvse` 或 `xi'an`。点击后提交原文,保留 `v` 和用户自己输入的音节分隔符。 -- 点击中文候选或按空格仍提交中文;切换符号布局时沿用 Rime 的组合提交规则,不隐式选择第一个中文候选。提交后原文候选消失,恢复后续词预测或工具栏。 - -`OLRimeSnapshot.rawInput` 直接读取 Rime `get_input`。`commitRawInput` 先复制 Rime 的输入缓冲,再清除组合并返回提交文本;不从会自动插入空格、显示 `ü` 的 `preedit` 反推原文。键盘沿用原有 marked-text 更新路径,替换当前组合,避免重复插入。 - -## 尺寸 - -语音、英文和拼音共用 232pt 内容高度。竖屏的四行文字键盘每行 58pt,保留 KeyboardKit 的错位、宽度与手势;模式切换文字为 18pt、44pt 高度,语音页 Return 为 48pt 高度。原文候选至少为 44 × 44pt。横屏继续采用 KeyboardKit 布局并适配共同视口。 - -## 验证范围 - -2026-10-21:`bash ios/scripts/test-rime.sh` 已通过,覆盖真实中文候选、空格中文提交、四种原文输入、删除、重复原文提交、清空及提交后原文状态清理;相关 Swift 文件通过语法解析,改动通过 `git diff --check`。 - -`OpenLessUITests.testSymbolsReturnAndCompositionSwitch` 在 iOS 27 专用模拟器最终通过,覆盖原文候选、两次 Return、中文选词、单字候选 44pt 点击尺寸、符号切换、大写及语音页换行。日志和结果为 `Artifacts/release-10/keyboard-confirmed-tests.log/.xcresult`。测试通过逐键确认真实原文、等待宿主实际文字更新来处理跨进程异步交付,不补打丢失的按键;符号切换沿用 Rime 当前提交规则,不假定隐式选中文。初次设置安装流程失败和中间断言失败记录保留。横屏用例初次停在安装辅助步骤,本轮未重新跑横屏视觉验收。 diff --git a/openless-all/ios/docs/keyboard-video-reference.md b/openless-all/ios/docs/keyboard-video-reference.md deleted file mode 100644 index 06f02e68a..000000000 --- a/openless-all/ios/docs/keyboard-video-reference.md +++ /dev/null @@ -1,41 +0,0 @@ -# 最新键盘视频:观察、实现要求与验收 - -2026-10-16,用户明确要求按此视频复刻 iOS 输入键盘的 UI 与逻辑,纳入剩余清单统一实施/审查/验收。 - -## 来源与边界 - -文件实际路径(Application Support 后无额外空格): -`/Users/trip/Library/Application Support/com.netease.uuremote/Download/ScreenRecording_10-16-2026 15-35-41_1.mp4` - -- 56.451667 秒,1206×2622,HEVC+AAC,72,970,649 字节。 -- SHA-256 `fe35d4f505d27fc98b7f5acc51341b0cf215466ea043d32c309ba85059c411c1`。 -- 已实际抽帧查看全屏4秒采样及键盘1秒序列,证据 `Artifacts/video-keyboard/{contact,keyboard-sequence-01,keyboard-sequence-02}.png`。必要时针对切换段加密采样。 -- 只参考键盘UI/可观察交互,不复制 Typeless 品牌或视频中的聊天内容/后台/服务凭据。仍使用 OpenLess 官方标志。 -- 视频主要展示**语音键盘**:普通录音、帮写、翻译选择和处理中;能看到 EN/拼切换入口,但没有实际展开英文26键/中文拼音键位。因此保留 KeyboardKit/Rime 成熟打字布局,统一顶栏/颜色;不能宣称视频证明未出现的文字布局或光标手势。 - -## 时间段与观察 - -| 时间(近似) | 实际可见 | 实现要求 | -| --- | --- | --- | -| 0~7s | 浅灰偏紫整片键盘、左上品牌、右上灰色圆形取消;中央黑色圆形真实波形,淡灰环;下方“再次点击以完成”,左下地球键 | 录音视图收起无关编辑键,波形绑定真实音量;点按完成、取消独立;无真实采集时不伪造波形 | -| 8~10s | 中央收缩为横向深色 Thinking 胶囊,内部浅色扫动;保留取消和地球键 | processing 状态、取消、减少动态效果;不以定时器假装返回结果 | -| 11~12s、22~26s | 空闲页品牌+右上语音/EN/拼白色胶囊;中央“点击说话”与黑色横向麦克风;左右有撤销/帮写、删除/@;下方白色换行胶囊 | 简洁一致的空闲控件;Return/delete/@作用于真实输入目标,撤销只在可安全撤销时出现/可用;不借参考增加不受控编辑 | -| 13~18s | “帮我写”页;左下较小黑色音量圆,右侧“描述要写的内容/再次点击以完成”;右上取消 | 提示词驱动帮写,不是选区润色;请求真正可用后才执行;生成预览/受控插入保留 | -| 19~21s | 帮写处理胶囊 | 真实任务处理状态,失败不伪造文本或插入 | -| 27s | 顶部弧形目标选择,提示“向上滑动以选择”,下方“松开以取消”;三个示例目标 | 长按进入选择态,上滑命中已配置目标;不是所有按住说话松开都取消;使用真实目标列表,不把视频示例语言写死 | -| 28s | 右侧英语目标黑底选中,提示“释放以翻译”,取消区域 | 有效目标释放提交意图;无目标释放取消;越界/中断规则可测 | -| 29~43s | 回到录音圆;顶部黑色“正在翻译为 英语(美国)”标签,音量随输入变化 | 会话开始固定翻译目标与服务能力;标签必须对应实际Core请求,修改全局设置不串会话 | -| 44~56s | 录音圆向处理中胶囊过渡,显示Thinking | 转场短而可打断;仅真实processing显示,完成/取消释放动画与音频 | - -## To-do(VID-01~06) - -- [x] VID-01:找到视频、核对元信息与哈希、抽帧观察,记录出现与未出现的内容。 -- [ ] VID-02:原生语音键盘空闲/录音/处理/取消布局,品牌、圆形/胶囊和实音量波形;深浅色/横屏/字号。 -- [ ] VID-03:帮写页与真实处理意图,配置不可用时清楚禁用/解释;不恢复已删除选区润色。 -- [ ] VID-04:弧形翻译目标选择与明确状态表、命中/释放/取消、冻结会话目标;多目标依赖Core T接口。 -- [ ] VID-05:EN/拼切换保留 KeyboardKit/Rime,Return/删除/@与安全撤销;无Full Access基本打字不退化。 -- [ ] VID-06:独立Codex review;主Agent在Orca内置模拟器逐态操作/截图,对照视频验收,不能只验静态布局或测试注入的假录音。 - -## 不得混淆 - -复刻键盘外观不等于隐藏式免跳转完成;当前可用性必须如实展示。视频中的圆环/橙色麦克风提示是该产品运行状态,不构成 OpenLess 已具备后台采集的证据。不能为展示效果自动启动人声采集或云服务。主Agent实际录音验收遵循已有用户授权边界,合成fixture与真实设备证据分开。 diff --git a/openless-all/ios/docs/local-speech-provenance.md b/openless-all/ios/docs/local-speech-provenance.md deleted file mode 100644 index 221762b4d..000000000 --- a/openless-all/ios/docs/local-speech-provenance.md +++ /dev/null @@ -1,34 +0,0 @@ -# 本地语音资源来源 - -资源由 `scripts/bootstrap-local-speech.sh` 下载、校验并复制。二进制在忽略目录中,不将下载一半的文件作为产品资源。主 App 打包模型;键盘不链接 LocalSpeech。 - -## 固定资源 - -模型仓库:`csukuangfj/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17`。 - -固定 revision:`2365baeacb507f821a0c8120fcee3d484dba7a07`。 - -| 文件 | SHA-256 | -| --- | --- | -| `model.int8.onnx`,239,233,841 bytes | `c71f0ce00bec95b07744e116345e33d8cbbe08cef896382cf907bf4b51a2cd51` | -| `tokens.txt` | `f449eb28dc567533d7fa59be34e2abca8784f771850c78a47fb731a31429a1dc` | -| 公共测试夹具 `test_wavs/zh.wav` | `b77f1794fe374a0ba1ee1dc458bfaf9349496cbbfc32780c50ba3c5a7ad8e373` | - -模型与 tokens 放入 `Resources/SenseVoice/`;公开夹具放入 `AppTests/Fixtures/`,不包含用户录音。HF 固定 revision 链接: - -`https://huggingface.co/csukuangfj/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17/tree/2365baeacb507f821a0c8120fcee3d484dba7a07` - -| 运行时 | 上游地址 | 压缩包 SHA-256 | -| --- | --- | --- | -| sherpa-onnx 1.13.8,Apache-2.0 | `https://github.com/k2-fsa/sherpa-onnx/releases/download/xcframework/sherpa-onnx-v1.13.8-ios-static.xcframework.zip` | `6b8e769cb153343270fdccbe92e3b3db0d1c421d67fa0989ab01fdf5b2fcf2de` | -| ONNX Runtime 1.28.2,MIT | `https://github.com/csukuangfj/onnxruntime-libs/releases/download/v1.28.2/onnxruntime-ios-static-xcframework-1.28.2.xcframework.zip` | `2c2299acbb461d26d4bac4bc85985d40e7c7177ed6072703ae0846d88b0b4599` | - -两个 xcframework 包含 device/simulator 切片。许可在 `Resources/Licenses/`。模型/夹具的完整授权和 notices 仍应在公开分发前按固定模型仓库核对,不把“公开下载”当作任意再分发授权。 - -## 验证口径 - -`SenseVoiceTests` 运行打包 int8 模型、读取公共 16 kHz mono PCM,检查非空中文输出,并验证预先取消不会启动模型。两项测试通过,没有打开麦克风。 - -没有为夹具建立人工 gold transcript。最初的测试误用了与音频无关的预期词,导致真实解码后断言失败;现改为明确命名的集成 smoke,不作为准确率测试。已观测输出为“开饭时间早上9点至下午5点。”,不能据此宣称字错率或真实人声体验。 - -桌面新分支的 TextStream 是经 Mac MLX 子进程运行的 Qwen3-ASR,不是可直接移入 iOS 的适配器。此次使用真正的 iOS C API 运行时,没有包装桌面 subprocess,也没有引入竞品服务或提供商密钥。 diff --git a/openless-all/ios/docs/pip-hidden-coexistence.md b/openless-all/ios/docs/pip-hidden-coexistence.md deleted file mode 100644 index c3fc26aa1..000000000 --- a/openless-all/ios/docs/pip-hidden-coexistence.md +++ /dev/null @@ -1,33 +0,0 @@ -# 隐藏 PiP 与生命周期集成(2026-10-21) - -## 目标与当前实现 - -待机只保留 PiP 和激活意图,不打开麦克风、不持续占用音频输出;后台录音准入必须同时检查真正活跃且未暂停的 PiP、解锁状态及音频捕获条件。用户关闭保活立即撤销状态;系统停止 PiP 后及时降级,不能沿用缓存的“已就绪”。 - -`ExperimentalPiPKeepAlive` 使用透明 `AVPictureInPictureVideoCallViewController`,尺寸为 300 × 0.1pt,替代普通 sample-buffer 视频方块。附着在主窗口的透明 `PiPSourceView` 提供系统启动几何位置。没有 AVPlayer、sample-buffer 视频、静音播放或音频输出引擎。活跃且未暂停、未锁屏时,每秒一次极低透明度内容更新;停用、暂停或锁屏后停止更新。这保留参考的内容更新路径,但 1Hz 是本次节能集成选择,不是已证实的长期保活条件。 - -`PiPCoexistenceAdapter` 将私有接口隔离在一处:构造期间仅对本次捕获的 adapter 返回 `_proxyControlsStyle = 5`;构造结束立即恢复该实例的原生 getter 行为。获取 lazy proxy 前装入限定实例的 content-type provider,启动使用 type 4,真实 `didStart` 后等待一秒,只提交一次 type 6。其他 adapter、其他 proxy 保留自身行为;不改对象的 isa,不循环强制覆盖系统状态。卸载时清除关联并恢复本地 type 4,不发送额外远端状态。 - -调用前校验 selector、参数数量、返回类型、参数类型、proxy 类和 `proxy.delegate === adapter`;拒绝覆盖系统原本已有的未知 provider。检查失败会明确返回免跳转不可用,走现有返回主应用录音路径。类上已安装的 wrapper 会保留到进程结束,但未关联实例继续执行原有行为。 - -## 调用契约 - -- `arm()`:开启保活意图并准备控制器,重复调用幂等;不启动音频输入。 -- `startIfPossible()`:有界启动。最多等待五秒 source/系统就绪;真正发起启动后再给系统最多五秒回调时间。 -- `onPrepareStart`:由音频所有者准备启动所需的短时 playback 会话;PiP 本身不改音频 category、route 或 active 状态。回调抛错时,音频所有者负责清理其部分准备。 -- `onSettled`:每次成功的 prepare 对应一次结束通知,涵盖 didStart、失败、超时、锁屏取消和 stop;音频所有者据此释放空闲会话,不得停掉正在进行的用户录音。 -- `foregroundChanged(Bool)`:恢复已有保活意图。前台通知与 didStop 顺序交错时,每次前台访问最多补一次恢复;后台被另一个 PiP 挤走时不持续争抢。 -- `onChange`:重新计算音频准入、发布真实 readiness。`isRecovering` 仅在等待或启动期间为 true。 -- `stop()`:取消任务、控制器、KVO、内容更新、私有适配和音频启动租约。异步回调检查控制器 identity 或 generation,旧回调不能重新激活新状态。 - -锁屏通知立即撤销 readiness、取消未完成启动、停止内容更新。已经活跃的 PiP 保留给系统管理;解锁后若仍活跃则重新检查暂停状态并恢复内容更新。如果锁屏打断了启动、或锁屏期间该控制器停止,解锁时消耗一次恢复标记,在前台或后台均做一次有界恢复尝试;同时覆盖 AVKit active 先变、didStop 晚于解锁通知的顺序。普通视频 PiP 挤出不产生标记,用户关闭立即清除标记,恢复失败不循环重试。其余已结束 PiP 只有前台访问触发恢复。KVO 监听 active/suspended,实际状态变化会通知音频所有者。 - -## 证据边界与验证 - -参考源是工作区已保存的 GlobalRefresh-PiP commit `1b62341c1d62308962fb3656192d6783631aa00c`(`Artifacts/release-10/research/globalrefresh`),不是声称恢复了豆包或 Typeless 的完整源码。来源署名随包保留在 `Resources/Licenses/GlobalRefresh-PiP-NOTICE.txt`。集成去掉了参考的 60Hz 动画、刷新率策略、诊断全局 hook 和不相关 UI。 - -可复现检查:`bash ios/scripts/test-pip-runtime.sh`(从 openless-all 目录)。它用生产 `PiPCoexistenceAdapter.swift`、Swift 6 与 MainActor 默认隔离,在本机 ObjC runtime 验证构造 getter 的实例范围、签名拒绝、代理身份、type4→6 一秒延迟、一次提交、暂停后恢复、旧任务/延迟 block 失效、恢复原有行为及 100 次释放循环;另直接验证生产 `PiPLockRecovery` 的一次解锁恢复、两种回调顺序、启动被锁打断、视频 PiP 隔离及用户关闭清理。脚本删除全部临时编译文件。 - -这些测试不模拟 iOS 画中画服务。系统是否接受远端 type 6、0.1pt 实际视觉隐藏、B 站/其他视频 PiP 同时运行、音频释放后的长时驻留、自动熄屏及锁屏恢复,仍必须在目标 iPhone/系统上验证。诊断里的 `transitionSubmitted=true` 只表示本地 mutation 已执行,不表示远端已接受多 PiP。readiness 仍以 AVKit active/suspended 和锁屏状态为准;系统不兼容时会降级,不假报成功。 - -真机验收顺序:全退后重新激活 → 键盘连续录音两次 → 结束后 B 站外放音量/路由 → B 站开启自己的 PiP → 回主 App 再离开 → 锁屏/解锁 → 用户关闭保活。每一步确认 readiness、麦克风占用、声音和浮窗;特别检查 didStart 后释放音频不会导致 PiP 立即结束。 diff --git a/openless-all/ios/docs/platform-support.md b/openless-all/ios/docs/platform-support.md deleted file mode 100644 index 5eab3d547..000000000 --- a/openless-all/ios/docs/platform-support.md +++ /dev/null @@ -1,34 +0,0 @@ -# iOS 16 起的系统兼容 - -最低部署版本统一为 **iOS 16.0**,主 App、键盘扩展、OpenLessShared 和 LocalSpeech 使用同一个下限。使用 Xcode 27 SDK 构建,不意味着最低系统必须是 iOS 27。 - -## 系统路径 - -| 系统 | 普通模式识别 | 音频采集/权限 | 可选 Apple Speech | -| --- | --- | --- | --- | -| iOS 16 | 打包 SenseVoice,本机 CPU,不预设 LLM | AVAudioEngine 传统 tap;回调先复制值数据,工作 actor 重采样;AVAudioSession 权限 API | SFSpeechRecognizer,仅在支持本机识别时启用 | -| iOS 17/18 | 同上 | 传统 tap;AVAudioApplication 权限 API | SFSpeechRecognizer,本机识别 | -| iOS 26 | 同上 | 传统 tap;AVAudioApplication 权限 API | SpeechAnalyzer/SpeechTranscriber 或 DictationTranscriber | -| iOS 27 | 同上 | immutable installAudioTap;在工作 actor 内复制/转换,保留现有新系统路径 | SpeechAnalyzer/系统转写模块 | - -较新的类型隔离在标记了 `@available` 的实现中,调用处使用 `#available`。不支持所选 Apple 本机识别的旧设备会明确报错,**不会偷偷转云端,也不会改变普通模式的 SenseVoice**。旧的 Apple 系统识别可能受系统语言资产、设备能力和会话时长限制;它不是 iOS 16 基础语音的唯一入口。 - -界面使用 iOS 16 可用的 NavigationStack、ObservableObject/Published、UIKit 文本视图。移除对 iOS 17 Observation 运行时和新版本专属 Button/动画重载的硬依赖。LocalSpeech 的取消标记使用有明确锁保护的 NSLock,不依赖 iOS 18 才提供的 Mutex。 - -## 不只是修改版本号 - -- Core 和 Rime 的 device/simulator 静态库都重建为 iOS 16 下限。 -- Core 使用 `.build/core-ios16` 独立 Cargo 目录,避免复用之前按 iOS 27 编译的依赖对象。 -- `scripts/validate-deployment.py` 检查库中每个 Mach-O 对象,以及最终 App/键盘/debug dylib 的最低版本。旧缓存里混入 iOS 27 对象时会拒绝通过。 -- 已下载的 sherpa-onnx/ONNX Runtime 原生二进制最低为 iOS 13,低于本工程的 iOS 16 下限,无需重新下载模型或替换识别引擎。 -- iOS 27 的 readonly tap 路径保留;iOS 16–26 的旧 tap 会在回调结束前独立复制,不能跨线程共享系统随后会复用的可变音频缓冲。 - -## 验证边界 - -16 组无麦克风合成音频检查覆盖新旧缓冲路径、4 种采样率、单/双声道、尾帧和幅度;旧路径在转换前覆盖原始缓冲,验证复制不依赖原始内存。 - -SDK 可用性编译、Mach-O 最低版本检查、iOS 27 运行回归是不同证据。**目前没有 iOS 16/18 真机或对应旧运行时的实测,不能宣称每个系统都已运行验收。**旧系统实际安装、权限、音频路由和资源占用仍应在对应设备验证。具体本轮结果见 [verification.md](verification.md)。 - -## 免跳转不在此兼容承诺内 - -隐藏式后台免跳转仍未实现;`ExperimentalPiPKeepAlive.isImplemented`/`isReady` 保持 false。降低部署版本不代表任何系统的后台重新开麦、隐藏小窗或免跳转已经完成。没有通过长期占麦或可见 PiP 代替。 diff --git a/openless-all/ios/docs/product-library.md b/openless-all/ios/docs/product-library.md deleted file mode 100644 index 230eae029..000000000 --- a/openless-all/ios/docs/product-library.md +++ /dev/null @@ -1,58 +0,0 @@ -# 历史、概览、词典与设置:本批实现与证据 - -更新:2026-10-16。对应主需求 P1 和 STYLE-06。**这是部分实现报告,不是 63 条需求全部完成。** 软件键盘弹出按用户最新指示归为模拟器环境问题,本批未再排查、重置虚拟机或修改其失败断言。 - -## 实现 - -- `CoreHost/src/library.rs` 复用 Core 的历史仓库、独立活动统计、风格与 auxiliary repolish。列表只传 160 字符预览及完整字符数;打开详情后才请求完整文本。预览不写回记录、不插入输入框。非原文风格须有 LLM 凭据,当前仍受开发者模式限制。 -- `CoreHost/src/control.rs` 增加 library、详情、单条删除、清空、音频资产、重新润色及词典 CRUD/启停/搜索/分页。普通模式可管理本地产品数据,但不泄露开发者频道或密钥。录音/处理期间限制写操作。 -- `CoreBridge.swift` 控制请求串行排队,上限 32,单请求超时 75 秒;关闭时失败返回。接收事件上限 2 MiB,不将音频或凭据放入键盘邮箱。 -- `ProductLibrary.swift` 为主 App 管理共享数据。模式重载和搜索使用请求标识,旧请求不得污染新 Core/新查询。操作错误真实显示。 -- `HistoryView.swift` 有详情、原文/结果独立复制、单条删除、刷新和清空菜单。不可逆动作使用有明确取消按钮的 alert;取消不改历史。没有音频时仍保留文字操作。 -- `HistoryAudioPlayer.swift` 使用 AVAudioPlayer;录音开始或页面离开时停止播放。系统 ShareLink 只接受 Core 返回的真实音频 URL,并受未完成 ASR 状态限制。 -- `OverviewMetricsView.swift`/`HistoryModels.swift` 使用真实数据。今日字数按 Unicode scalar,与 Rust `chars()`/桌面 `Array.from` 对齐;今日时间按本地日边界;“平均段落”是今日每段平均时长;累计记录表示当前保留的历史数量。 -- 7/30 天趋势使用 Core 独立活动数据,缺失日期补零,未来日期不纳入当前周期。清空历史不清空趋势。空、加载、错误状态不放示例数字。 -- `VocabularyView.swift` 接通 Core 本地新增/编辑词条、启停、删除、大小写不敏感搜索、分页及重复处理。**尚未桥接 Rime 学习词典、词条自动建议或加密同步。** -- `AppTheme` 只控制主 App 的浅/深/系统外观并持久化;帮助、版本说明和隐私内容有真实入口。UI 多语言、键盘独立主题与统一提供商中心尚未完成。 -- STYLE-06:删除 `SelectionRewriteView.swift`、试用编辑器改写入口/草稿状态和无调用的 Swift rewrite 方法。保留 Core/桌面 rewrite API、历史重新润色与后续帮写。 - -## 音频保留契约 - -`CoreHost/src/recordings.rs` 实现 Core 的 `RecordingArchive`,不在 Swift 新造识别业务。 - -| 状态 | 处理 | -| --- | --- | -| 主动采集 | 可选归档标准 16 kHz/mono/S16LE WAV,最大 30 分钟;独占创建、Unix 0600,每次完整帧更新 WAV 头 | -| 归档失败 | 不允许覆盖已有文件;无效帧停用/丢弃该资产。归档是可选项,不能因此禁用普通 ASR | -| 停止 | 先按原流程停止硬件和排空 PCM,再完成文件头与同步,由 Core 判断保留/清理 | -| ASR 失败且有有效音频 | 保存实际文件,并关联 Core 记录;可播放与系统分享 | -| 成功得到识别文本 | 沿用 Core 的临时音频清理策略;完成转写无导出入口,即使以后有可播放资产也不因此开放导出 | -| 主动取消 | 沿用 Core 丢弃策略,不把取消假装成已完成识别 | -| 单条删除/清空历史 | 清理相应记录关联的音频,不清理词典、独立活动、凭据或另一模式的数据 | - -目录是主 App 私有业务目录下的 `recordings/`,不是 App Group。资产只允许 UUID 文件名、普通文件及有界大小;不能用任意路径查询。录音没有加入本轮词典/模式/风格的云同步范围。 - -**尚缺:**崩溃遗留孤立录音的恢复、历史自动过期后的资产清扫,以及真机上的实际播放/导出、长录音磁盘与内存验证。不能据本批短 WAV 测试声称这些已经完成。 - -## 验证 - -证据位于 `Artifacts/product-library/`: - -| 证据 | 实际结果 | -| --- | --- | -| `core-tests.log/.exit` | Rust Host **21 通过**;包括 3 项 WAV 安全/生命周期测试、4 项产品库领域集成。使用临时目录与 memory vault,不读写用户 Mac Keychain | -| `library_tests.rs` | 验证预览有界/详情完整、正常模式产品权限、词典重复/编辑/启停/跨 Host 重开、raw repolish 不覆盖原文、原生 ASR 失败保留真实 WAV 且删除时清理、历史清空不清活动 | -| `core-build.log/.exit` | device/simulator 原生库重建成功,各 984 个 Mach-O 对象最高 iOS 16 | -| `native-and-ui-current.log` | 新历史模型 **4 项通过**;同包当时 UI 失败,不能把整包计为成功。模型覆盖导出状态、本地跨日/完整字数/平均时长、独立 7/30 天/溢出保护、原文与结果区别 | -| `related-regression-current.xcresult/.log/.exit` | **4 原生 + 4 UI,整包通过**:公共音频本地 SenseVoice、取消/按钮保护;清空确认后取消、首页设置裁切、滚动不录音、概览/词典/设置/帮助导航 | -| `large-type-current.xcresult/.log/.exit` | 最大辅助字号首页/设置裁切审计 **1 通过**;检查后恢复原字号 large | -| `device-current-build.log/.exit`、`device-current-validation.log` | 最新无签名设备构建和实际模型/产品/iOS 16 下限检查通过;不是签名安装/旧系统运行证明 | -| `Review/*-product-library-current.png`、`*-product-library-large-type.png` | 本批通过用例导出的真实截图;来源见 `Review/index.json` | - -本批发现并修复:父容器 accessibilityIdentifier 覆盖统计 picker 的标识;iOS 27 的 confirmationDialog popover 不展示 cancel,故不可逆操作改为显式 alert。原失败结果不算通过;包含用户历史的临时失败附件不作为交付材料。 - -本批未授予麦克风权限、未录制人声、未调用真实云服务、未清空用户历史/词典,也未改变 Full Access。公共中文 fixture 是集成 smoke,不是准确率测评。 - -## 仍然未完成 - -P1 的真实 LLM/播放/分享操作验收、历史详情全场景视觉与音频恢复清扫;P2 的市场/包管理/翻译目标/手势/帮写;P3 的账户与 Core E2EE 同步;Rime 用户词典、确认词条建议、UI 本地化和键盘主题一致性。隐藏式免跳转仍未实现;iOS 16/18 真实运行、签名与真机性能也没有新证据。 diff --git a/openless-all/ios/docs/requirements-and-todo.md b/openless-all/ios/docs/requirements-and-todo.md deleted file mode 100644 index 673c79606..000000000 --- a/openless-all/ios/docs/requirements-and-todo.md +++ /dev/null @@ -1,282 +0,0 @@ -# OpenLess iOS:完整需求汇总与 To-do - -更新:2026-10-16。范围从“重启模拟器、向下兼容”,延续到历史、键盘交互、风格市场、加密云同步、词典、翻译、概览和设置的最新要求。 - -**本文件是这一轮产品需求与待办的主入口,不是完成报告。** 后续 compact/会话恢复先读本文件,再读 [continuation-checkpoint.md](continuation-checkpoint.md)。实现事实与测试证据另见 [verification.md](verification.md)。 - -## 1. 执行原则与范围变更 - -1. 保留已经可用的语音输入。用户已反馈应用内语音可以正常聆听、感知,仍在手工测试;这不等于后台免跳转、所有旧系统或所有云服务已经验收。 -2. 新要求优先:账户、风格市场、词典和加密云同步现在属于 iOS 产品范围。旧的“个人预览暂不做账户/同步”不再作为排除理由,但也不能把尚未实现的功能写成已经完成。 -3. 普通模式仍默认打包 SenseVoice 本地 ASR,不预配 LLM/云端密钥。后处理、翻译、帮写需用户实际配置并启用相应能力。 -4. 尽量复用 OpenLess 桌面现有 Core、领域模型、词典、历史、风格包和同步协议;不在 Swift 重写一套网络、提示词或加密算法。 -5. App/键盘保持原生。键盘使用 MIT 源码版 KeyboardKit 9.9.0 与 Rime,不运行 Rust Core/ASR 模型,不打开麦克风、不保存 API 密钥。 -6. 不重置、提交、推送或覆盖工作区中原有桌面、Android、ASR 改动。用户历史、词典、配置和凭据不得为了测试被清空。 -7. 只保留一个 iOS 模拟器。不删除物理设备、当前保留设备的数据或仍需复用的模型资源。 -8. iOS 的选区润色入口按最新要求删除;历史重新润色、语音后处理和帮写是不同功能,仍然保留。 -9. Typeless 用来比较交互与信息结构,不复制其品牌、私有词库、商业实现、后端凭据或订阅权益。 -10. 最新执行方式:先补齐本文及执行清单,再按独立组件交给其他 Agent;全部使用 GPT-6.1、high,不得使用 xhigh/max 或其他模型。完成实现后由 Codex 独立 review,主 Agent 处理发现并做最终检查。 -11. 最终验收必须使用 Orca 自带模拟器实际操作与截图,不以 CLI 返回 ok、源码检查、单元测试或构建成功替代界面验收。只操作保留设备,操作前确认没有录音。 -12. 用户随后追问“之前能弹、为什么现在不能”:根因仍未查明,不能再断言一定是虚拟机问题。将系统输入框与 OpenLess 输入框对照、旧版本与当前版本回归列入执行清单;不清空数据、不用反复强制聚焦掩盖故障。 - -## 2. 当前真实状态 - -| 项目 | 状态 | 证据/边界 | -| --- | --- | --- | -| 模拟器清理 | 已完成 | 删除其余 11 台模拟器,只保留 `OpenLess iOS 27 QA`,UUID `A4B5F07C-C6C9-498F-BEEC-AC7AC98B8A6A`。本次汇总时它为 Shutdown,不擅自声称正在运行 | -| 模拟器重启 | 已执行 | 曾重启保留设备、关闭硬件键盘连接,重新连接辅助程序;`repair-input` 报告未被 Device Hub shadow,无额外修复 | -| 输入框/软件键盘弹出 | **当前已恢复,最初根因未证实** | Orca软件键盘显示开关后切系统拼音再切回OpenLess,两者实际显示;原popup/三轮refocus回归通过(`execution-wave3/keyboard-popup-restored.xcresult`)。没有改弱断言/清数据/加产品焦点补丁;视频新键盘仍需再验。见 [环境对照](keyboard-environment-check.md) | -| iOS 16 起的兼容代码 | 已实现,待完整验收 | 新旧音频路径、权限 API、Apple Speech 后端、Combine 界面状态、公开 API 可用性判断已补;App/扩展及依赖二进制下限检查通过 | -| 旧系统实际运行 | 未完成 | 尚无 iOS 16/18 真机或对应运行时证据,不宣称“16 到 27 每个系统都已实测” | -| 普通模式 SenseVoice | 已实现,有用户手工反馈 | 本地模型实际解码公共音频;用户反馈能正常聆听、感知。正常语音流程要继续保留 | -| ASR/LLM/全模态提供商 | 基础接线已完成 | 共用 Core,开发者配置界面和安全凭据入口已存在;新产品的统一权限/能力展示和真实云端验收未完成 | -| 历史与录音 | 新代码已接入,部分验收完成 | 真实详情、原文/结果复制、管理菜单、逐条删除、Core 重新润色预览、失败 WAV 归档与条件播放/导出;真实 LLM、播放/分享及崩溃恢复仍待验收/补齐,见 [实现与证据](product-library.md) | -| 旧键盘基础回归 | 有历史通过证据 | 兼容改造前曾 12 UI + 4 原生通过、1 授权测试跳过。**不能代替当前兼容分支的键盘弹出验收** | -| 最新兼容分支测试 | 部分通过 | 16 组合成音频、5 项 App 原生测试通过;首页/设置裁切和只读诊断通过;新软件键盘弹出回归仍失败 | -| 跨 App 免跳转 | **输出会话已实现;真机仍需验收** | Build 4 分离输出保持与输入采集,首次自动唤醒/返回;详见 [实现及验证](voice-handoff-fix.md)。隐藏 PiP 路线仍未实现 | -| 概览、基础词典与设置 | 已接入 | 真实今日及 7/30 天统计、Core 词典 CRUD/启停/搜索、App 深浅色、帮助与版本说明;尚无 Rime 用户词典桥、云同步、UI 多语言和独立键盘主题 | -| 风格市场/加密同步/账户页 | 未实现 | 仍须复用桌面领域代码,不能把本地词典、帮助页或未登录占位冒充打通 | -| iOS 选区润色 | 已移除:STYLE-06 | 删除专用页面、试用编辑器入口/草稿状态和无调用的 Swift rewrite 方法;保留共享 Core/桌面 API、历史重新润色及后续帮写 | - -## 3. 全量功能要求与验收条件 - -### A. 基础整理、模拟器与系统兼容 - -| ID | 功能/要求 | 完成标准 | -| --- | --- | --- | -| BASE-01 | 整理 iOS App 结构 | 入口、概览、历史、设置、键盘试用、语音服务分开;项目生成和脚本引用同步;不做无关大重构 | -| BASE-02 | 整理 ASR 入口和文档 | 清晰区分 SenseVoice、本地/Apple/云端/全模态路径、桌面实验模型;资源来源和构建入口可追溯,不重复下载已验证模型 | -| ENV-01 | 只保留一台模拟器 | 清点结果恰好一台;保留指定 UUID 的 App 数据与设置;清理其他设备和无用测试 Runner | -| ENV-02 | 重启并恢复键盘输入 | 普通点击输入框会弹出屏幕键盘;反复收起/重新点按仍可输入;Orca 显示/输入链路和产品焦点问题分开验证 | -| COMP-01 | 最低兼容 iOS 16 | App、键盘、Swift 包、Rust/C++/推理运行时一致支持最低 16,不只改 Info.plist | -| COMP-02 | iOS 16/17/18/26/27 路径 | 旧 tap 独立复制缓冲;17+ 权限 API;26+ SpeechAnalyzer;27 immutable tap;较新符号弱链接且有 availability guard | -| COMP-03 | 兼容验收 | 编译、全部 Mach-O 最低版本检查、对应系统运行分开记录;实际验证权限、中文/英文、识别、取消、路由变化、字体和深浅色 | -| VOICE-01 | 保留正常 ASR/聆听体验 | 准备不录音;主动开始才采集;停止先关硬件;取消、无帧超时、队列上限、目标改变保护继续有效 | -| VOICE-02 | 免跳转 | 单独实现真实跨 App 后台语音控制及失败恢复;禁止以长期静默占麦、可见 PiP/横幅/边缘把手或反复切 App 冒充;需真机证据 | - -### B. 历史 - -| ID | 功能/要求 | 完成标准 | -| --- | --- | --- | -| HIST-01 | 字体与排版 | 对齐 OpenLess 原有界面;正文/原文/时间/状态层级清楚,长段落可读、可选中,支持大字号和深浅色 | -| HIST-02 | 历史管理菜单 | 在历史页面提供刷新、清空等操作;清空需确认,执行真实 Core 动作,不能清空别人的云端/其他账户数据 | -| HIST-03 | 单条详情 | 可查看原文、最终处理结果、时间/时长/错误状态;不存在的字段不伪造 | -| HIST-04 | 复制与删除 | 支持复制原文、复制最终文本、删除单条;区别二者,不把润色结果当原文 | -| HIST-05 | 重新润色 | 对已有记录主动选择当前可用模式/风格/LLM 重跑;保留原文,显示处理中/错误/新结果,不假装成功 | -| HIST-06 | 播放录音 | 只对真正存在且可读取的音频资产显示播放器;播放状态、时长、停止与错误真实可用 | -| HIST-07 | 未完成 ASR 的录音导出 | 只有录音存在、ASR 尚未完成/失败等符合状态的记录才显示导出;使用真实文件与系统分享/文件导出 | -| HIST-08 | 已转写内容不导出录音 | 已转换完成的记录不显示“导出录音”,不能仅因有历史条目就展示导出按钮 | -| HIST-09 | 流式/无音频的降级 | 若没有可恢复的原始录音,不造播放器或导出;仍支持重新润色、删除、看原文和复制原文 | -| HIST-10 | 音频生命周期 | 明确音频在哪些状态保留、如何关联记录、何时删除;音频存主 App 私有目录,不进入键盘共享容器、不默认加入云同步 | - -说明:用户规定了“完成转写后无录音导出”,并未明确要求“完成后一定立即删除一切音频”。播放能力和保存策略要结合现有 Core 音频资产契约设计,不擅自把两者混为一个开关。 - -### C. 键盘语音、翻译、帮写与润色模式 - -| ID | 功能/要求 | 完成标准 | -| --- | --- | --- | -| KBD-01 | 长按选择态 | 按用户图实现长按反馈,出现“松开以取消”等提示;先明确正常说话、选择态、取消态、释放提交的状态表 | -| KBD-02 | 滑动选翻译 | 按住/滑动出现“滑动去选择翻译”,可滑向已配置目标语言;选择、取消、越界和中断清楚,不误开始或提交 | -| KBD-03 | 有能力才开放翻译 | LLM 后处理配置/启用后提供对应翻译操作;无可用能力时解释或禁用,不空跑、不静默改服务商 | -| KBD-04 | 左侧“帮写” | 入口语义是“描述要写的内容”,作为 AI 生成提示词;不是读取选区来润色;取消/完成/预览/插入边界清楚 | -| KBD-05 | 键盘内选择润色模式 | 选择实际可用的模式/风格;与 App 同一份 Core 配置;普通原文模式不被默认改成 LLM | -| KBD-06 | 语音会话固定意图 | 开始时固定源语言、目标、润色模式/风格和提供商能力;中途改设置不会串会话或写错输入框 | -| KBD-07 | 保留成熟文字键盘 | 保持 KeyboardKit/Rime、大小写、符号、删除、Return、空格光标、地球键、系统听写键隐藏和无 Full Access 基础打字 | -| KBD-08 | 无障碍与操作反馈 | 提示不只靠颜色;按下、录音、取消、翻译目标、帮写状态可读;减少动态效果、横屏和大字号不丢功能 | - -“松开以取消”属于截图中的长按选择态要求,不能在没有明确状态表的情况下把所有正常按住说话都改成“松手一律取消”。 - -### D. 风格市场与提供商能力 - -| ID | 功能/要求 | 完成标准 | -| --- | --- | --- | -| STYLE-01 | 打通云端风格市场 | 复用 OpenLess 现有市场服务、列表、包详情和领域校验,真实下载并落库 | -| STYLE-02 | 下载/导入/选择 | iOS 可从云端下载并导入兼容风格包,查看/应用/更新/移除;状态与 Core 一致 | -| STYLE-03 | 不做 iOS 风格包编辑器 | 不移植桌面编辑 UI;保留包的只读信息与必要管理 | -| STYLE-04 | 本地包导入 | 原话“VIP 导入”需核对是否指 ZIP;先沿用现有 style_pack_archive 的实际格式,不擅自加入 VIP 付费逻辑 | -| STYLE-05 | 提供商/模型权限打通 | 显示风格依赖的模型和可用能力;区分未登录、缺凭据、模型不可用、缺权限、网络失败,不能做虚假的开通/验证 | -| STYLE-06 | 移除 iOS 选区润色 | 删除试用编辑器改写入口和 iOS 专用选区页面/状态;共享 Core 和桌面仍需要的 rewrite API 不盲删 | - -### E. 云同步、加密与词典 - -| ID | 功能/要求 | 完成标准 | -| --- | --- | --- | -| SYNC-01 | 移植现有加密云同步 | 复用 Core 端到端加密协议、版本、校验、传输、错误和恢复,不另写一套 Swift crypto | -| SYNC-02 | 用户词典同步 | 同步用户确认的词条及其必要元数据;删除、重名、冲突和多设备更新有确定规则 | -| SYNC-03 | iOS 词典接入 | 研究并桥接 Core 词典与 Rime 本机词典;不直接多进程同步正在写入的 Rime 二进制学习文件 | -| SYNC-04 | 模式与市场选择同步 | 同步润色模式、风格包选择及必要引用;对另一端没有的包明确补下载/提示,不产生悬空选择 | -| SYNC-05 | 自动词条候选 | 用户说完后,键盘提示是否添加候选词;展示候选、确认/拒绝/关闭,不未经确认自动写词典 | -| SYNC-06 | 候选词纳入同步 | 用户确认后进入同一份词典并可加密同步;重复候选去重,原文不被悄悄替换 | -| SYNC-07 | 安全状态与恢复 | 账户、密钥、恢复/重置、同步中/错误/冲突状态可见;错误密钥、离线、退出账户和重试不覆盖本地数据 | -| SYNC-08 | 同步范围边界 | 本轮要求是词典、润色模式与市场选择;不擅自默认同步历史、原始录音、API 密钥或其他敏感内容 | - -### F. 翻译目标与词典页 - -| ID | 功能/要求 | 完成标准 | -| --- | --- | --- | -| LANG-01 | 多语言目录 | 复用 OpenLess/Core 已有语言目录与 provider 能力;UI 语言、识别语言、键盘布局和翻译目标分开,不凭空增加输入引擎 | -| LANG-02 | 目标管理页面 | 在页面内新增/删除/排序目标语言,编辑后持久化并反映到键盘滑动选择 | -| LANG-03 | 滑动选择目标 | 键盘选择的语言就是实际请求目标;可取消、有清楚选中状态,无效配置不能发送 | -| LANG-04 | 词典优先 | 像参考产品一样提供实用词典管理与相关历史/使用信息,但历史来源必须真实 | -| LANG-05 | 数量与兼容策略 | 参考图展示最多 3 个目标;这是参考行为,最终上限要与现有 Core 契约统一,不能无依据另设不兼容格式 | - -### G. 首页概览 - -| ID | 功能/要求 | 完成标准 | -| --- | --- | --- | -| HOME-01 | 首页成为概览 | 对齐 OpenLess 原有前端信息结构,保留清楚的语音入口,不只是大标语页 | -| HOME-02 | 今日字数/总时长 | 从真实历史数据计算;时间、字数口径和桌面一致,正确处理中文和跨日 | -| HOME-03 | 平均段落/累计记录 | 核对桌面字段含义并复用,不能自行把“平均段落”猜成另一个统计值 | -| HOME-04 | 近 7 天/近 30 天 | 可切换的真实趋势/统计;空数据、错误和加载有实际状态,不放示例数字 | - -### H. 设置、账户与视觉 - -| ID | 功能/要求 | 完成标准 | -| --- | --- | --- | -| SET-01 | 键盘与触觉反馈 | 整理默认面板、输入、空格手势、触觉与安装/Full Access 说明,开关控制真实行为 | -| SET-02 | 外观 | 深色、浅色、跟随系统与已有外观变体;App/键盘的一致性和大字号单独检查 | -| SET-03 | 界面语言 | 独立于识别/翻译语言;复用已有语言与翻译资源,不能把识别语言切换当作 UI 本地化 | -| SET-04 | 服务商与模型设置中心 | 使用真实 Core 提供商/模型配置、凭据状态、能力和验证结果;梳理普通/开发者入口,仍不预配云端密钥 | -| SET-05 | 帮助与版本说明 | 设置中心、帮助中心、关于、版本说明可进入真实内容;实验诊断保持次级入口 | -| ACCOUNT-01 | 账户显示 | 对齐 OpenLess 的真实账户/登录状态与同步身份;未登录/已登录/退出有完整流程,不展示参考图中的私人邮箱或伪造 Free/Pro 权益 | -| ACCOUNT-02 | 账户能力 | 若现有后端返回权限/方案则展示实际值;不因参考截图有升级卡片就擅自新增订阅/支付系统 | -| UI-01 | 整体对齐 OpenLess 前端 | 统一字体、层级、留白、卡片、空状态、动作菜单和深浅色,参考 Typeless 的交互,不照搬品牌 | -| UI-02 | 稳定而非装饰性重写 | 不破坏已可用的语音;键盘高频输入即时反馈,动画有边界、可打断并尊重减少动态效果 | - -### I. Typeless 对比与验收材料 - -| ID | 功能/要求 | 完成标准 | -| --- | --- | --- | -| REF-01 | 安装包与版本核对 | 找到用户提供的实际包后检查版本、架构、签名和 Mach-O 平台;普通 iPhone IPA 不等于 Simulator 构建 | -| REF-02 | 可安装时并排比较 | 在唯一保留的虚拟机使用合法、兼容的包;不为对比留下多余虚拟机 | -| REF-03 | 无兼容包时的替代证据 | 使用现有报告/四张截图和用户授权设备,不假装已经在模拟器安装成功,不绕过 DRM 或拿其服务凭据给 OpenLess 用 | -| REF-04 | 比较产出 | 记录长按/滑动、帮写、目标管理、账户和字体的实际差异;OpenLess 自己的实现/测试证据独立保存 | - -### J. 新增截图与执行/验收要求 - -| ID | 功能/要求 | 完成标准 | -| --- | --- | --- | -| DICT-01 | 词典采用最新截图的信息结构 | 大标题、右上搜索、浅灰胶囊来源筛选、简洁分隔列表、右下浮动加号;保留 OpenLess 品牌、原生 Tab 导航,支持深色/大字号 | -| DICT-02 | 所有/自动添加/手动添加 | 按 Core 实际来源在分页前筛选,搜索与筛选组合正确;无来源记录不凭空标为自动;自动候选仍须确认后入库 | -| DICT-03 | 紧凑添加弹窗 | 标题“添加到词典”、单词输入、取消/添加;空白、换行、超长和重复有明确处理,保存失败保留输入;不再使用整屏多字段 Form | -| DICT-04 | 精简行与管理 | 行内只显示来源、词条和必要停用状态;编辑/启停/删除收进可发现的行菜单,备注/使用量按需查看;不删除原有能力 | -| REF-05 | 新截图补充 | 最新四张图包括词典列表/添加弹窗、历史和首页统计;词典为明确实施要求,其他两页作为现有要求的视觉补充,不复制付费、零保留或云同步等未核实声明 | -| EXEC-01 | 分块实施与模型限制 | 各块有需求 ID、独占文件/契约、依赖、验收与报告;子 Agent 全部 GPT-6.1 high;隔离保留现有 dirty 快照,不先提交来换隔离 | -| EXEC-02 | Codex 独立审查 | 集成后审查实际代码,列证据化问题/等级/文件位置;修复后复审,不以 worker 自评代替 | -| EXEC-03 | 主 Agent 最终验收 | 核对剩余清单、实际产品与测试证据;Orca 内置模拟器操作、截图、深浅色/大字号/取消/错误;未满足条目不勾选 | - -### K. 最新键盘视频(本次新增) - -实际文件、时间段观察和逐态验收见 [keyboard-video-reference.md](keyboard-video-reference.md)。视频明确展示语音键盘,不虚构未展开的26键/拼音布局。 - -| ID | 功能/要求 | 完成标准 | -| --- | --- | --- | -| VID-01 | 视频核对与逐段观察 | 已找到56.45秒视频并抽帧;元信息、哈希、可见/未知行为有记录 | -| VID-02 | 语音键盘视觉与状态 | 复刻空闲/录音圆/处理中胶囊/取消结构,OpenLess品牌,真实音量、无障碍、深浅色和横屏 | -| VID-03 | 视频帮写逻辑 | 描述内容驱动,正确开始/完成/取消/错误,复用Core能力,非选区润色 | -| VID-04 | 弧形翻译选择 | 长按选择、滑动命中目标、释放翻译/取消,真实已配置目标,固定会话意图 | -| VID-05 | 打字模式与编辑操作 | 保留KeyboardKit/Rime,统一EN/拼/语音顶栏,Return/删除/@/安全撤销有真实行为,无Full Access打字保留 | -| VID-06 | 视频对照验收 | Codex review后主Agent用Orca内置模拟器实际操作/截图;未实现后台能力不伪装 | - -## 4. To-do list:执行顺序 - -最新分块、依赖、负责人及逐项执行/审查/验收清单见 [execution-plan.md](execution-plan.md)。必须先完成清单再开始新实现。 - -### P0:先修基础与兼容回归 - -- [x] 保留指定模拟器,删除其他 11 台:ENV-01。 -- [x] 执行重启与硬件键盘连接设置:ENV-02 的环境动作,**不等于问题已修复**。 -- [x] 归整 App 入口与页面、`App/Speech/`:BASE-01/02 的代码整理部分。 -- [x] 实现 iOS 16 起的新旧 API 路径,替换 Observation/Mutex 硬依赖:COMP-01/02 的代码部分。 -- [x] 重建并检查 Core/Rime/推理运行时,排除 iOS 27 旧缓存;App/扩展/debug dylib 最低版本 16。 -- [x] 16 组合成音频和 5 项原生测试通过,不打开麦克风。 -- [x] 曾按用户指示停止软件键盘排查;这只是当时执行决定,不是环境根因已经证明。 -- [x] ENV-02 当前恢复:Orca软件键盘开关+系统拼音/OpenLess切换后两者显示,原三轮refocus回归通过;原因未过度归因,不等于新视频键盘全部验收。 -- [ ] 当前代码重新完成键盘、App 页面与原生回归:COMP-03/KBD-07。 -- [ ] 在可用 iOS 16/18 设备或运行时验证;如果环境没有,明确记录缺口,不虚报覆盖:COMP-03。 -- [ ] 更新 README/ASR/验证文档,明确旧版本绿色记录不等于当前分支通过:BASE-02。 -- [ ] 记录正常语音的用户手工结果,保持已有链路:VOICE-01。 -- [x] 移除 iOS 选区润色 UI 与多余状态:STYLE-06;已重生成工程并编译。 -- [ ] 对免跳转做独立原生实现与真机验证,不以 UI 假按钮或占麦替代:VOICE-02。 - -### P1:历史、概览与设置基础 - -- [x] 核对桌面历史/音频/统计 API,扩充 Host/DTO:`CoreHost/src/{library,recordings}.rs`,不重写领域模型。 -- [x] 实现历史字体、完整详情、刷新/清空菜单及确认取消:HIST-01/02/03;长文本/深色详情仍纳入最终视觉验收。 -- [ ] HIST-04/05:单条删除、原文/结果复制和 Core 预览代码已实现;已测原文不被预览覆盖,还需真实 LLM 与详细 UI 操作验收。 -- [ ] HIST-06~10:失败录音真实归档、资产定位、播放/系统分享代码与完成态禁导出规则已实现并有 Core/原生状态测试;还需播放/分享实操、崩溃遗留恢复与历史过期资产清理。 -- [ ] DICT-01~04:按最新词典截图重做列表、来源筛选、搜索与紧凑添加弹窗,保留真实 CRUD;验证深浅色、大字号、空态和取消不写入。 -- [ ] SYNC-02/03、LANG-04:本地 Core 词典 CRUD、启停、搜索、分页及重复处理已实现/领域测试通过;Rime 用户词典映射和加密同步未接。 -- [x] 首页概览和今日/7 天/30 天真实统计:HOME-01~04;平均段落按桌面“今日平均时长”,趋势独立于历史删除。 -- [ ] SET-01~05、UI-01:应用主题、帮助/版本说明已实现,默认/最大字号首页设置裁切审计通过;UI 本地化、键盘主题一致性与统一服务中心未完成。 - -### P2:风格、翻译和键盘意图 - -- [ ] 按最新56秒视频补键盘UI和交互:VID-02~06,详细时间表见 [keyboard-video-reference.md](keyboard-video-reference.md)。 - -- [ ] 把现有提供商/模型/风格能力做成 App 与键盘可消费的统一快照:STYLE-05、SET-04。 -- [ ] 云端风格列表、下载、包校验、只读详情、选择/更新/移除:STYLE-01~03。 -- [ ] 核对“VIP 导入”的实际格式后,接现有风格包导入:STYLE-04。 -- [ ] 多语言目录与目标管理、目标排序/持久化:LANG-01/02/05。 -- [ ] 长按/取消/滑动翻译状态表与真实请求意图:KBD-01~03/06、LANG-03。 -- [ ] 左侧帮写:提示词描述、ASR/LLM 生成、预览、取消和受控插入:KBD-04。 -- [ ] 键盘内润色模式/风格选择:KBD-05。 -- [ ] 词条建议确认提示,确认才加入词典:SYNC-05/06。 - -### P3:账户与加密同步 - -- [ ] 核对现有 OpenLess 账户/同步认证与移动端回调、Keychain 保存:ACCOUNT-01/02。 -- [ ] 复用 Core E2EE:初始化、密钥/恢复、加密传输与错误状态:SYNC-01/07。 -- [ ] 同步确认词条、iOS 词典映射、润色模式与风格选择:SYNC-02~06。 -- [ ] 验证跨设备冲突、离线、错误密钥、退出/切账户和恢复;不自动同步音频/密钥/历史:SYNC-07/08。 - -### 对比与最终验收(贯穿各阶段) - -- [ ] 核对 Typeless 可用包;仅在平台兼容、合法可安装时装入保留设备:REF-01~03。 -- [ ] 根据截图/实际版本比较,记录而不盲抄:REF-04。 -- [ ] EXEC-01:完成分块、模型 high 核验与逐块实现/测试报告。 -- [ ] EXEC-02:集成后 Codex 独立 review,处理发现并复审。 -- [ ] EXEC-03:主 Agent 用 Orca 自带模拟器实际操作和截图,逐模块验收。 -- [ ] 逐模块保存当前版本截图、来源索引、真实结果与失败日志。 -- [ ] 最终检查 iOS 16 起的能力差异、27 运行、权限/Full Access、离线和网络错误、深浅色、字号、取消和输入目标变化。 -- [ ] 复核只剩一台模拟器、没有 Runner、多余探针或无用临时资源;不删除可复用模型和用户数据。 - -## 5. 需要核对但不阻塞先做代码审查的语义 - -| 项目 | 暂按什么处理 | 核对点 | -| --- | --- | --- | -| “选区认色” | 依上下文理解为现有 iOS 选区润色,删除其 UI | 若原意不同,再按用户反馈调整;不误删历史重新润色 | -| “VIP 导入风格包” | 不建立付费/会员逻辑;先检查现有归档格式 | 是否实际指 ZIP/本地文件导入 | -| “ts” | 按本次 Typeless 截图的词典/翻译体验作参考 | 不虚构一个新服务商 | -| 最多 3 个翻译目标 | 参考图展示的行为 | 以 OpenLess 现有契约和用户最终选择确定上限 | -| “平均段落” | 先看桌面真实字段与算法 | 不自己替换成平均字数/语速等其他指标 | -| 长按“松开以取消” | 定义为显式选择态提示 | 正常录音、按住完成、上滑翻译和取消的提交规则需成表 | -| 完成后的音频 | 不提供导出入口 | 是否仍保留用于播放,按现有资产能力及明确保留策略处理 | - -## 6. 四张参考图的实际用途 - -1. 深色键盘的弧形目标语言/“向上滑动以选择”/“松开以取消”:用于长按选择态与翻译目标的交互设计。 -2. 深色“帮我写/描述要写的内容/再次点击以完成”:用于提示词驱动的帮写,不是选区润色。 -3. 浅色账户页、账户身份、设置/关于/帮助与底部导航:用于信息层级;不复制私人邮箱、不伪造 Pro 或支付权益。 -4. 翻译目标编辑页:用于新增、排序、编辑与键盘选择一致性;截图中的 3 个目标上限与 OpenLess 契约分开核对。 - -## 7. 优先复用的代码与协议 - -以 `openless-all/` 为基准: - -- 原生 App:`ios/App/`,语音实现统一在 `ios/App/Speech/`。 -- 原生 Host:`ios/CoreHost/src/{lib,control,credentials}.rs`,`ios/App/CoreBridge.swift`。 -- 键盘与持久 IPC:`ios/Keyboard/`、`ios/PlatformShared/`、`ios/Packages/OpenLessShared/`。 -- 历史:`app/crates/openless-core/src/history.rs`、`app/src-tauri/src/commands/history.rs`、`app/src/pages/History.tsx`。 -- 风格与市场:Core 的 `marketplace.rs`、`style_packs.rs`、`style_pack_store.rs`、`style_pack_archive.rs`;桌面 `commands/{marketplace,style_packs}.rs`。 -- 词典:Core 的 `vocabulary.rs` 与桌面 `Vocab.tsx`。先确认领域模型,再桥接 iOS/Rime。 -- 加密同步:`app/crates/openless-core/src/cloud_sync_e2ee*`、`cloud_sync_e2ee_protocol/`、`cloud_sync_e2ee_documents/`、`cloud_sync_e2ee_store/`。 -- 同步契约:仓库根 `docs/{encrypted-cloud-sync,cloud-sync,cloud-sync-server-handoff}.md`;桌面 `commands/{cloud_sync,cloud_sync_e2ee}.rs` 和 `src/lib/encryptedSyncUiBridge.ts`。 -- 概览/翻译/设置:桌面 `src/pages/{Overview,Translation,Style,Marketplace}.tsx` 与 `src/pages/settings/`,先核对现有语义,不另造数据。 - -## 8. compact 与恢复执行约定 - -- 每个任务用本文件的 ID 更新状态,并补具体源码/命令/结果。不能把“有接线”“编译成功”“假服务测试”“用户手工反馈”“真实云端/真机通过”混作一种完成状态。 -- compact 前写好恢复检查点;compact 后重新读取本文件与检查点,不依赖模糊记忆,也不重做已经验证的下载和构建。 -- 当前接口没有发现可直接调用的会话 compact 工具。只有真实触发宿主的 `/compact` 或上下文压缩接口,才能称“已执行 compact”;写这份摘要本身不冒充会话压缩。 -- 最新执行顺序以 [execution-plan.md](execution-plan.md) 为准:先完成需求/To-do,分块实现剩余工作与新词典参考,再 Codex review、主 Agent 修复和 Orca 自带模拟器验收。ENV-02 原因待查,不能擅自归因模拟器;COMP-03 旧系统/真机证据仍须分开记录。 diff --git a/openless-all/ios/docs/verification.md b/openless-all/ios/docs/verification.md deleted file mode 100644 index 406096f48..000000000 --- a/openless-all/ios/docs/verification.md +++ /dev/null @@ -1,169 +0,0 @@ -# iOS 预览与验证记录 - -更新:2026-10-16。证据必须对应实现版本;与参考输入法的实现差异见 [architecture-and-processing.md](architecture-and-processing.md)。 - -## 最新状态:历史、概览、词典与设置基础 - -本批证据见 [product-library.md](product-library.md):Rust Host 21 项通过;新增历史模型 4 项通过;另外 SenseVoice/SpeakButton 4 项和不依赖软件键盘的 UI 4 项通过;最大辅助字号首页/设置裁切审计 1 项通过。模拟器与无签名设备构建、App/扩展/debug dylib iOS 16 下限检查通过。没有清空用户历史/词典、调整 Full Access、录制人声或调用真实云服务。 - -STYLE-06 的 iOS 选区润色 UI 已移除。风格市场、翻译/帮写、Rime 用户词典、账户/加密同步、隐藏式免跳转仍未完成;新播放器/导出及 LLM 预览还需要相应真实操作验收,不能以构建代替。 - -软件键盘弹出按用户最新指示是模拟器环境问题,不再排查或作为产品阻塞。原 `Artifacts/compatibility/runtime-regression.xcresult`、`keyboard-stable-navigation.xcresult` 仍保留失败事实;没有改断言或伪造绿色。下文完整 KeyboardKit 绿状态只属于兼容改造前基线。 - -当前完整要求见 [requirements-and-todo.md](requirements-and-todo.md),继续执行先读 [continuation-checkpoint.md](continuation-checkpoint.md)。 - -## 兼容改造前基线:KeyboardKit/SenseVoice/开发者模式 - -当前文字键盘使用 KeyboardKit 9.9.0 MIT 源码和 Rime。**完整浅色回归已通过:12 项 UI、4 项 App 原生通过,1 项授权回调因没有既有授权而跳过,0 失败。**没有用旧自制键盘的次数代替此次验收。 - -### 已完成的验证 - -| 层级 | 最新证据 | -| --- | --- | -| 完整 App/键盘回归 | `keyboardkit-full-current.xcresult`/`.log`,脚本 exit 0;xcresult 总计 17,passed 16、skipped 1、failed 0 | -| 键盘交互 | 完全访问关闭下真实“nihao → 你好”和 English;五轮收起/重开;符号/换行/删除/组合切换;Shift/Caps Lock;空格长按实际移动光标且不误插空格;语音空白区横滑;横屏和反复模式切换 | -| 系统底部区域 | 控制器初始化及重新连接时设置公开 `hasDictationKey = true`。实际完整屏幕图中右下角系统听写键消失、地球键保留;没有遮挡层、负 inset 或私有 Hook | -| 开发者真实 UI/Core | 完整套件包含三击版本、确认重载、真实快照读取、默认 LLM 关闭、保存传统管线、退出并重载普通模式;不发云端请求 | -| 深色/最大辅助字号 | `keyboardkit-current-dark.xcresult` 3 项通过;`keyboardkit-current-large-type.xcresult` 1 项首页/设置裁切审计通过。独立结果,不计成另一轮完整 UI | -| 原生 ASR/按钮 | 两项 SenseVoice 通过:打包模型解码公共 PCM、预先取消。两项 SpeakButton 通过:不可用只解释、不意外开始,准备/录音阶段仍可取消或停止 | -| 授权回调 | `NativeAuthorizationTests` 显式跳过未决定的系统授权,不自动授予权限。完整 UI 的拒绝权限分支通过;旧版本已有系统回调证据不能当作本次实际执行 | -| 共享 v2 协议 | `shared-v2-tests.log`:27 项/6 套通过;prepare 与 begin 分离,prepare 专用行为仍可补充分支覆盖 | -| Rust Host | `provider-host-verified.log`:14 项通过;首次开发者传统/原文且无 LLM、频道/凭据/激活持久化、选择改写和提供商错误脱敏;测试显式使用 memory vault,不读取用户 Mac Keychain | -| 无签名设备构建 | `keyboardkit-device-final.log`/`.exit`:build 和实际模型哈希验证通过,exit 0;不能直接安装到 iPhone,不代表真机性能 | -| 产品完整性 | `validate-product.py` 检查构建/安装包内可执行文件、编译图标、Assets.car、键盘、Rime、实际 SenseVoice 模型与 tokens 的固定 SHA-256;模型不进入键盘 | - -本轮没有授予麦克风权限或开始人声录音。模型下载是之前明确授权的资源准备,不是 UI 测试暗中触发。公开音频是集成 smoke,没有人工 gold transcript,不能宣称准确率。 - -浅色完整截图:`Artifacts/Review/*-keyboardkit-current-light.png`;深色和最大字号分别为 `*-keyboardkit-current-dark.png`、`*-keyboardkit-current-large-type.png`。来源索引在 `Review/index.json`;原始包对应上述三份当前结果,不能把旧图当成新键盘。 - -预览已恢复到 `OpenLess iOS 27 QA`(A4B5F07C-C6C9-498F-BEEC-AC7AC98B8A6A),实际安装的主 App/键盘二进制与通过完整回归的构建产物哈希一致;安装包内模型与 tokens 也通过固定哈希验证。系统注册只保留 `app.openless.ios` 一个 OpenLess 启动入口,Runner 已移除。Orca 已附加实际设备画面,没有启动麦克风。当前 CLI tap 虽返回 ok,但复核画面未观察到导航,不将它算作交互成功;上述交互验收来自真实 XCTest,而非这个返回值。 - -### 定位与兼容处理 - -- 收起键盘原有的跨进程“清焦点”通知会干扰再次编辑,现移除该通知,走 UIKit 原生生命周期。额外重开手势、强制反复 resign/become 及笼统的 keyboardDidHide 补丁均已撤掉。旧的硬件键盘日志不能直接当作全部根因。 -- 听写键需在控制器初始化、重新连接时声明能力,而非只在 viewDidLoad 设置。Apple [完整文档](https://developer.apple.com/documentation/uikit/configuring-a-custom-keyboard-interface)说明会抑制系统按钮;不能只凭头文件的 disabled 字样推断不支持隐藏。iOS AX 可保留 disabled 的隐藏元素,因此检查不可点击并核对屏幕,不错误要求 AX 个数为零。 -- iOS 27 下 9.9 的 Shift 适配收到的双击只有一次 release;仅给 Shift 增加显式双击识别,仍调用 KeyboardKit 自己的 caps-lock action,不重写布局、键位命中或大小写状态机。Caps Lock/解除/实际输入已整例通过。 -- 空格长按沿用库的 0.5 秒门槛;测试改为 0.65 秒,不沿用旧自制键盘的 0.35 秒。数字/字母/Return 用稳定标识;等待 SwiftUI 状态渲染完成,而非用旧文案和同步读取断言。 - -`keyboardkit-typing-*`、`keyboardkit-current-clean`、`keyboardkit-completed-hide`、`keyboardkit-public-capabilities`、Shift 诊断等失败保留,不计入通过。探针代码和临时日志已从产品代码移除。早期 `Review/*-keyboardkit-current-incomplete.png` 不是最终版本。 - -### 仍没有完成或未验证的部分 - -- 人声麦克风 → Core → 本地识别 → 结果/上屏,以及真机内存、耗时、热量与能耗。 -- 用户真实云端 API、额外认证、模型列表/验证;当前是接线、Core 测试和无网络配置 UI 证据,不是所有实际服务兼容证明。 -- 这份旧基线曾接入 Swift 选区改写;最新需求已移除 iOS UI,不再补第三方选区集成。共享 Core/桌面接口保留。 -- Team、App Group provisioning 和真机 Keychain。本机检查为 0 个有效 codesigning identity;开发者模式不代替签名。 -- 隐藏式后台免跳转没有实现,不是只缺测试。新模型/运行时/夹具的分发 notices 和少数 Rust 许可正文仍须核对。 - -## 历史版本:实际交付与旧自制键盘 - -以下为 KeyboardKit 替换前的验收,保留故障来源,不作为当前版本的 pass。 - -### 当时先修的是实际交付,不是只改源图 - -用户看到默认占位图、两个入口、点开退出。本机检查发现: - -- LaunchServices 中仍有 `app.openless.ios` 安装记录,但记录对应的 `.app` 目录、可执行文件、Info.plist 和 Assets.car 已不存在。启动日志为 `FBSOpenApplicationErrorDomain / NotFound`,没有启动出产品进程。文件被移除的来源没有证据,不能归因给某个清理工具。 -- 第二个入口是 `app.openless.ios.uitests.xctrunner`,即 UI 测试宿主,不是键盘扩展或第二个产品。 -- 重建原生依赖并重新安装后,SpringBoard 实际显示官方图标;安装列表只剩一个 OpenLess。完成三次独立冷启动和从桌面点图标启动,进程持续运行、首页控件可用。截图:`Artifacts/restored-springboard.png`、`restored-open-from-icon.png`。 - -新增 `scripts/validate-product.py` 检查**构建后的产品和实际安装后的产品**:主可执行文件、编译图标声明及小尺寸图标、Assets.car、嵌入键盘与 Rime 数据。源图存在或残留桌面图标不再算交付成功。 - -`scripts/preview.sh` 只构建/安装产品,不运行 XCTest。`scripts/test.sh` 在 UI 测试结束或失败退出时移除 Runner;再次打开预览也会清理残留 Runner,不删除产品数据。 - -### 旧版本测试 - -环境:Xcode 27.0(27A266a)、Swift 6、Rust 1.98.0。主 QA 设备为 **OpenLess iOS 27 QA**,iPhone 16 Pro,iOS 27.0(24A434),UUID `A4B5F07C-C6C9-498F-BEEC-AC7AC98B8A6A`。 - -| 层级 | 本轮结果/来源 | -| --- | --- | -| 共享 Swift | 27 项/6 套通过。`Artifacts/current-polish-light.log` | -| iOS Rust Host | 3 项通过。真实 Core 管线配明确标识的原生测试适配器;同一日志 | -| Rime | 桥接引擎的拼音、选词、提交、删除/取消检查通过;实际扩展中文/英文输入也通过 | -| 合成音频 | 8k/16k/44.1k/48kHz × 单/双声道共 8 组;一秒各输出 16,000 样本,幅度及尾帧通过;不打开麦克风 | -| App 原生 | 3 项/2 套通过。真实 Apple 授权回调返回 MainActor;不可用说话入口只解释;准备与录音阶段仍可取消/停止 | -| 最终完整 UI | **11 项 UI + 3 项 App 原生测试通过,0 失败**;安装产品检查通过。`Artifacts/current-polish-final.xcresult`/`.log`,`current-polish-final.exit` 为 0 | -| 定点复查 | 首页/历史/滚动不启动准备/权限或资源分支,4 项通过;`current-polish-targeted.xcresult` | -| 最大辅助字号 | 首页、设置 `.textClipped` 审计通过;`current-polish-large-type.xcresult`。保留系统字号和滚动,不强行缩字 | -| 新装权限拒绝 | 在临时全新模拟器实际点击“不允许”,主 App 存活、无录音,出现“前往系统设置”;`current-permission-recovered.xcresult`。没有修改主 QA 原有的授权;临时设备已删除 | -| 静态交付 | App Group/隐私/键盘无采集代码、空免跳转白名单、Rime 数据、官方品牌逐字节一致、1024px 无 alpha 图标检查通过 | - -本轮无人值守测试没有授予麦克风、没有启动录音,也没有下载语音模型。主 QA 原有系统决定已为授权,不能把它当“新装拒绝权限”证据,因此后者使用单独的全新实例。真正的 Speech 授权回调原生测试复用已有决定;无决定时会跳过。 - -### UI 覆盖 - -- 首页、设置、空历史、原生试用编辑页、键盘避让与无重叠 Tab 栏。 -- 完全访问关闭状态下,实际 OpenLess 扩展输入“nihao → 你好”和 English。 -- 符号、删除、Return、语言切换提交组合文本、横屏和连续切换模式。 -- Shift 单次大写、Caps Lock 锁定/解除、空格长按实际移动插入点且不误插空格。 -- 在语音页空白区横滑进入文字页;不以点击麦克风模拟横滑。 -- 滚动首页不触发准备/录音;授权回调、资源提示和只读实验诊断。 - -### 保留的失败,不算通过 - -`current-polish-light.xcresult` 初次运行中 7 项 UI 通过、3 项失败。首页/历史受准备资源提示干扰;原测试还用固定的 115pt 底部禁区反复滚动已经可见的内容,并错误假设已有授权的 QA 一定走拒绝分支。修正为实际 Tab 栏可见边界、区分既有授权与新弹窗,并增加滚动回归;4 项定点复查通过。 - -`current-polish-dark.xcresult` 与 `current-permission-fresh.xcresult` 的第一次并行执行因 120 秒命令上限中断,不算整轮通过:前者日志只确认深色裁切审计通过;后者新设备首次迁移及编译耗时,不能当 App 崩溃。随后复用已编译产品执行新装权限测试成功,临时设备/重复编译目录已清理。 - -## UI 与交互改动 - -| Before | After | Why | -| --- | --- | --- | -| 只核对源图,实际安装包缺失 | 构建包和安装包都检查图标、可执行文件与键盘数据 | 默认占位图和安装残影不能算成功 | -| UI 测试宿主留在桌面 | 测试结束清理 Runner,产品预览不运行测试 | 产品只保留一个入口 | -| 首页多个大盒子,视觉重点分散 | 独立 HomeView、统一冷浅色/深色底、官方品牌、集中语音入口与试用路径 | 减少诊断面板感,让主要操作更明确 | -| 模式选中背景直接跳变 | 一个滑块在“语音/EN/拼”间移动 | 让位置和状态连续,可在过渡中改选 | -| 只能从窄顶栏横滑 | 顶栏和语音空白区都可滑;排除 UIControl、候选和键位 | 手势可发现,不抢按住说话/移出取消/空格光标 | -| Shift/Caps Lock 无视觉区别 | 空心/实心 Shift 与 Caps Lock 图标、对应辅助功能值 | 明确下一字和持续大写状态 | -| 长按空格进入光标模式但没有反馈 | 提示“移动光标”,弱化字母,松手恢复 | 解释当前手势,不误插空格 | -| 轻触反馈偏好没覆盖实际普通键位 | 字母、Shift、删除、空格、Return 接入轻触反馈 | 偏好与实际行为一致,不加逐键弹跳延迟 | -| 拒绝授权只显示错误 | 提供可执行的“前往系统设置”入口 | 不让用户反复点一个无法重新弹权限的按钮 | - -### 动效参数与边界 - -- 主 App 的偶发按钮:按下缩放 0.98/透明度 0.8,140ms ease-out;减少动态效果时只变透明度。 -- 模式滑块:200ms、dampingRatio 1,可打断;切页:250ms、dampingRatio 1,拖动按真实触点,释放使用速度投影。 -- 说话控件沿用参考的 147×60/109×109/129×60 状态几何、200ms 形态变化;七根真实音量条 80ms 跟随,不播放伪波形。 -- 字母输入立即响应,不逐键等待弹簧或页面动画;减少动态效果不会关闭必要的状态反馈。 -- 本轮未主动录音,因此录音中形态和音量驱动有代码/原生单元及合成音频证据,**没有新的人声录音观感验收**。 -- 浅/深色的实际模式按钮、拼音候选及官方品牌在当前安装包中再次目视核对,Orca 预览保持开启。 - -## 复跑与截图 - -```sh -cd openless-all/ios -./scripts/test.sh unit -IOS_SIMULATOR_ID=<专用设备标识> ./scripts/test.sh ui -IOS_SIMULATOR_ID=<专用设备标识> ./scripts/test.sh all -IOS_SIMULATOR_ID=<设备标识> ./scripts/preview.sh -python3 scripts/export-ui-evidence.py Artifacts/current-polish-final.xcresult --tag current -``` - -`unit` 跑共享/Rust/Rime/合成音频;`ui` 跑 App 原生与实际 UI;`all` 跑两者。`UI_RESULT_BUNDLE` 可指定新结果路径。UI 测试会操作指定模拟器的设置、键盘和页面,应使用无个人历史的 QA 实例。 - -`Artifacts/Review/index.json` 关联截图、结果包、测试与原附件。完整 11 项 UI 回归后,视觉复核又发现系统 UIButton 选中样式叠出黑块、键盘品牌被缩成 24 个物理像素;现改用自定义文字按钮和显示倍率渲染,并补足辅助键按下色。它们经过增量构建及实际点击核对,未因此重复整套逻辑测试。 - -**当前安装外观**看 `current-pinyin-candidates-installed.png`、`current-english-dark-installed.png`、`current-voice-dark-installed.png` 和 `keyboard-interactions.mov`。录像是实际模式过渡与 Rime 按键,不是录音演示;没有点击麦克风。`*-current.png` 的自动附件保留为测试时的版本,不覆盖成改样式后的图。 - -横屏完整屏幕图可能保留设备原生方向,旋转查看副本必须标明,不能裁图掩盖布局问题。未封口的中断结果包不支持导出。 - -`Artifacts/` 是本机忽略目录,不是永久发布材料。之前的 9 UI/3 原生和桌面 1,163 Core 等是历史结果;旧结果包当前已不在磁盘,不冒充本次复跑证据。 - -## 已定位的原生崩溃 - -- 主 App 旧报告 `OpenLess-2026-10-14-191901.ips`:系统 Speech 授权回调不在 MainActor,隐式隔离闭包触发 `_dispatch_assert_queue_fail`。显式 `@Sendable` continuation 桥接和真实系统回调回归通过。 -- 键盘旧报告 `OpenLessKeyboard-2026-10-14-191900.ips`:远程代理断连时非空声明的 `documentIdentifier` 实际可能为 nil,UUID 强桥接崩溃。现经 nullable Objective-C 边界读取;无目标就停止,不生成假 UUID。 -- 重排键位时的 `OpenLessKeyboard-2026-10-14-211048.ips`:跨行等宽约束在没有共同父视图时激活。现先建层级再激活,实际扩展重建/横屏回归通过。 - -这些历史代码崩溃与本轮“安装记录在、包目录不在”的启动失败不是同一原因。 - -## 当前能力边界 - -以本文开头的当前版本表为准。开发者 ASR/LLM/Omni 和主应用选区预览已有接线;真实云端调用尚未验证。隐藏式后台免跳转和完整用户纠正规则/简繁设置仍未实现。 - -真机签名与 App Group、实际麦克风/识别、不同宿主上屏、系统中断、后台重新开麦、热量与能耗仍没有真机证据。开发者模式并不代替签名。公开分发前仍需补齐缺少的许可正文与新资源 notices。 - - -## 2026-10-18:Build 6 键盘重开 - -88 项共享协议测试(新增 9 项握手状态测试)、5 项资源检查、工程检查、Release 设备结构与 IPA 校验通过。实际键盘用例 `testKeyboardVoiceSurvivesDismissalAndReopening` 通过:输出会话准备后,收起 5 秒/30 秒重开录音,录音中收起后停止采集并再次重开录音,全程 Safari 前台、主 App 后台。详见 [本轮验收](../Artifacts/keyboard-reopen-fix/acceptance-summary.json)。这不是隐藏 PiP 或用户 iPhone 运行通过证明;本轮独立冷启动返回前置未取得来源 bundle,没有计作通过。 diff --git a/openless-all/ios/docs/voice-handoff-fix.md b/openless-all/ios/docs/voice-handoff-fix.md deleted file mode 100644 index b9b49760b..000000000 --- a/openless-all/ios/docs/voice-handoff-fix.md +++ /dev/null @@ -1,31 +0,0 @@ -# 键盘语音首次唤醒与返回 - -## 当前接线 - -键盘点击录音先通过 App Group 和 Darwin 通知确认主进程可服务。共享快照过期不会直接触发跳转;后台会话可用时沿用原进程启动采集。无法连接或后台会话失效时,保存包含输入目标与语音意图的请求,再打开主应用。 - -主应用只自动消费与本次 URL 精确匹配、仍有效且由新版键盘明确标记的请求。冷启动等待 Core 和前台状态就绪;系统麦克风授权照常显示。无需再次点击开始。恢复旧请求、重复打开 URL、取消及过期请求不会自动重开录音。主进程重建时将遗留录音请求标为失败;键盘在 IPC 无响应且存活快照过期后可以替换旧请求。替换与快照检查在同一 SQLite 事务内,新的有效心跳会阻止替换。 - -返回发生在收到实际音频帧之后。SwiftUI 通过 UIApplicationDelegateAdaptor/UISceneDelegate 接收 URL context;公开 sourceApplication 只对同一开发团队提供来源,跨团队为空。键盘因此在本次语音点击后读取当前宿主通知,不以旧 bundle 缓存推断去向。iOS 27 的键盘通知实际走 _didHandleKeyboardClientChange:shouldConsiderSnapshottingKeyboard:isLocalEvent:,返回 BOOL,代码先校验 ABI 再接收。重新建立 arbiter 连接、要求两个新 generation 的同一宿主结果,且 window 和 documentIdentifier 必须仍匹配。返回桥优先使用匹配来源的系统导航 action,必要时使用本次查得的精确来源 bundle 打开应用。返回 token 每次只消费一次;切换期间允许有界重试,只有离开前台才停止返回流程。每个 token 只消费一次,不枚举已安装应用,不猜 URL scheme。iOS 27 模拟器的独立双应用验证表明,旧导航 action 可为空,系统 URL context 的来源与精确 bundle 返回仍可工作。 - -这里使用了非公开的应用返回接口;桥在每次调用前检查实际方法签名。接口或来源不可用时保留录音界面并提示返回,不把调用失败伪装为成功。模拟器兼容性不代表全部真机系统版本已经验证。 - -## 录音与待机分开 - -NoJumpAudioSession 使用独立的输出音频引擎维持已经前台激活的音频会话。AudioCapture 只在录音期间创建输入引擎,停止时移除输入 tap、停止引擎并结束 PCM 流。待机路径没有输入 node、识别请求或音频上传。原有空闲十分钟主动销毁会话已删除。 - -播放历史录音可共用输出会话,不再销毁键盘语音的 generation。播放期间拒绝同时开始录音,播放结束后恢复原 generation。真实音频中断、失去渲染、权限变化或进程被回收仍会使会话失效;下一次显式录音动作才恢复,不自行重新采集。 - -本地 SenseVoice 的 PCM 在独立、加锁且有容量上限的缓冲区中收集,不再逐帧经过界面线程。切换应用时的界面停顿不会填满原来的 16 帧主线程队列。finish 在采集 drain 之后原子取出完整数据;cancel 和迟到数据按 sessionID 隔离,旧会话的错误也不能取消新会话。开发者选择 Apple Speech 时保留其现有主线程接线。 - -这个实现是输出音频会话方案。之前的 Typeless 报告证明了“PiP 保活与停止采集分离”的分支,并未恢复隐藏 PiP 的原生实现;不能把那份静态证据当成本项目实现同一套 PiP 的证明。 - -## 输入位置与自动写入(Build 5) - -返回结果就绪后,键盘等待可见且已连接的 textDocumentProxy,直接将结果绑定当前输入框。跳转前后的 keyboardID、documentID 或 revision 不同,不再触发预览和二次确认。若用户在返回后选择了新的可用输入框,则按当前输入框写入。 - -领取结果和写入仍串行执行:先提交当前拼音组合,再读取当前目标;在 SQLite 事务中创建唯一 insertionID,在 UIKit 写入前标记 attempting,完成后标记 submitted。重复通知、重新挂接或进程重建不会重放已经尝试的写入。没有输入框时保留结果等待连接,不静默复制到剪贴板。 - -## 证据位置 - -Build 5 的编译、共享协议测试和实际键盘验证见 [交付记录](../Artifacts/auto-insert-fix/README.md)。Build 4 的真实音频生命周期证据保留在 [上版交付记录](../Artifacts/voice-handoff-fix/README.md)。单独双应用探针已验证返回后原 UITextField 仍为 first responder;实际键盘路径需以相应 UI 测试结果为准。 diff --git a/openless-all/ios/project.yml b/openless-all/ios/project.yml index 363ef1617..e8d5fede6 100644 --- a/openless-all/ios/project.yml +++ b/openless-all/ios/project.yml @@ -67,8 +67,8 @@ targets: path: Config/App-Info.plist properties: CFBundleDisplayName: OpenLess - CFBundleShortVersionString: "0.1.0" - CFBundleVersion: "15" + CFBundleShortVersionString: "$(MARKETING_VERSION)" + CFBundleVersion: "$(CURRENT_PROJECT_VERSION)" OLAppGroupIdentifier: "$(OL_APP_GROUP)" NSMicrophoneUsageDescription: "仅在你点按或按住录音时采集声音,结束后立即释放麦克风。" NSSpeechRecognitionUsageDescription: "使用 Apple 语音识别将你主动录制的声音转换成文字。" @@ -114,8 +114,8 @@ targets: path: Config/RecordingWidget-Info.plist properties: CFBundleDisplayName: OpenLess - CFBundleShortVersionString: "0.1.0" - CFBundleVersion: "15" + CFBundleShortVersionString: "$(MARKETING_VERSION)" + CFBundleVersion: "$(CURRENT_PROJECT_VERSION)" OLAppGroupIdentifier: "$(OL_APP_GROUP)" NSExtension: NSExtensionPointIdentifier: com.apple.widgetkit-extension @@ -156,8 +156,8 @@ targets: path: Config/Keyboard-Info.plist properties: CFBundleDisplayName: OpenLess - CFBundleShortVersionString: "0.1.0" - CFBundleVersion: "15" + CFBundleShortVersionString: "$(MARKETING_VERSION)" + CFBundleVersion: "$(CURRENT_PROJECT_VERSION)" OLAppGroupIdentifier: "$(OL_APP_GROUP)" NSExtension: NSExtensionPointIdentifier: com.apple.keyboard-service diff --git a/openless-all/ios/scripts/bootstrap.sh b/openless-all/ios/scripts/bootstrap.sh index 2c74e8d83..330d5d4e9 100755 --- a/openless-all/ios/scripts/bootstrap.sh +++ b/openless-all/ios/scripts/bootstrap.sh @@ -20,6 +20,6 @@ BOOST="$ROOT/.vendor/boost_1_85_0.tar.bz2" echo "7009fe1faa1697476bdc7027703a2badb84e849b7b0baad5086b087b971f8617 $BOOST" | shasum -a 256 -c - [ -d "$ROOT/.vendor/boost_1_85_0/boost" ] || tar -xjf "$BOOST" -C "$ROOT/.vendor" boost_1_85_0/boost boost_1_85_0/LICENSE_1_0.txt swift build --package-path "$ROOT/.build-tools/XcodeGen" -c release -rustup toolchain install 1.98.0 --profile minimal -rustup target add --toolchain 1.98.0 aarch64-apple-ios aarch64-apple-ios-sim +rustup toolchain install 1.99.0 --profile minimal +rustup target add --toolchain 1.99.0 aarch64-apple-ios aarch64-apple-ios-sim echo "Dependencies ready. Run scripts/build-rime.sh, then scripts/build-core.sh." diff --git a/openless-all/ios/scripts/build-core.sh b/openless-all/ios/scripts/build-core.sh index bc20ce7ac..8458d18b4 100755 --- a/openless-all/ios/scripts/build-core.sh +++ b/openless-all/ios/scripts/build-core.sh @@ -2,16 +2,15 @@ set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" # Homebrew rustc can precede rustup shims even when cargo is launched by rustup. -export RUSTC="$(rustup which --toolchain 1.98.0 rustc)" -export RUSTDOC="$(rustup which --toolchain 1.98.0 rustdoc)" -# rustc reads the deployment environment, but Cargo may otherwise reuse old -# dependency objects. Keep this ABI/deployment build out of the old iOS 27 cache. -export CARGO_TARGET_DIR="$ROOT/.build/core-ios16" +export RUSTC="$(rustup which --toolchain 1.99.0 rustc)" +export RUSTDOC="$(rustup which --toolchain 1.99.0 rustdoc)" +# Isolate iOS 16 artifacts from caches built with another deployment floor. +export CARGO_TARGET_DIR="${CARGO_TARGET_DIR:-$ROOT/.build/core-ios16}" for spec in "device:aarch64-apple-ios:iphoneos" "simulator:aarch64-apple-ios-sim:iphonesimulator"; do IFS=: read -r platform target sdk <<< "$spec" mkdir -p "$ROOT/Frameworks/$platform" IPHONEOS_DEPLOYMENT_TARGET=16.0 SDKROOT="$(xcrun --sdk "$sdk" --show-sdk-path)" \ - rustup run 1.98.0 cargo build --manifest-path "$ROOT/CoreHost/Cargo.toml" --locked --release --target "$target" + rustup run 1.99.0 cargo build --manifest-path "$ROOT/CoreHost/Cargo.toml" --locked --release --target "$target" cp "$CARGO_TARGET_DIR/$target/release/libopenless_ios_host.a" "$ROOT/Frameworks/$platform/libOpenLessCore.a" python3 "$ROOT/scripts/validate-deployment.py" "$ROOT/Frameworks/$platform/libOpenLessCore.a" done diff --git a/openless-all/ios/scripts/collect-rust-licenses.py b/openless-all/ios/scripts/collect-rust-licenses.py index 2880aa8a7..6dfd7830f 100644 --- a/openless-all/ios/scripts/collect-rust-licenses.py +++ b/openless-all/ios/scripts/collect-rust-licenses.py @@ -7,7 +7,7 @@ root = Path(__file__).resolve().parents[1] metadata = json.loads(subprocess.check_output([ - "rustup", "run", "1.98.0", "cargo", "metadata", "--format-version", "1", + "rustup", "run", "1.99.0", "cargo", "metadata", "--format-version", "1", "--manifest-path", str(root / "CoreHost/Cargo.toml"), "--locked", "--filter-platform", "aarch64-apple-ios" ])) @@ -40,10 +40,33 @@ def visit(identifier): files.append({"file": name, "sha256": hashlib.sha256(data).hexdigest()}) if package["name"] in ("openless-core", "openless-ios-host"): files = [{"file": "../OpenLess-LICENSE.txt", "sha256": hashlib.sha256((output.parent / "OpenLess-LICENSE.txt").read_bytes()).hexdigest()}] + if not files: + standard = output.parent / ("SPDX-" + str(package["license"]) + ".txt") + if standard.is_file(): + # Some upstream crates declare a license but omit its standalone file. + # Preserve their metadata alongside the corresponding standard text. + vcs = directory / ".cargo_vcs_info.json" + revision = json.loads(vcs.read_text())["git"]["sha1"] if vcs.is_file() else None + name = f"{package['name']}-{package['version']}-UPSTREAM-NOTICE.txt" + notice = (f"Package: {package['name']} {package['version']}\n" + f"Declared license: {package['license']}\n" + f"Authors: {', '.join(package['authors'])}\n" + f"Repository: {package['repository'] or 'Not supplied by upstream'}\n" + f"Source revision: {revision or 'Not supplied by upstream'}\n\n" + "The upstream crate declares this license without bundling a standalone license file.\n" + "Standard license text: SPDX license-list-data v3.27.0.\n\n" + + standard.read_text()).encode() + (output / name).write_bytes(notice) + files = [{"file": name, "sha256": hashlib.sha256(notice).hexdigest(), + "source": "upstream package metadata and SPDX standard text"}] manifest.append({"name": package["name"], "version": package["version"], "license": package["license"], "repository": package["repository"], "files": files}) (output / "manifest.json").write_text(json.dumps(manifest, ensure_ascii=False, indent=2) + "\n") +retained = {entry["file"] for package in manifest for entry in package["files"]} +for path in output.glob("*.txt"): + if path.name not in retained: + path.unlink() print("Bundled attribution for", len(manifest), "resolved non-dev Rust packages.") missing = [item["name"] for item in manifest if not item["files"]] if missing: diff --git a/openless-all/ios/scripts/package-ipa.py b/openless-all/ios/scripts/package-ipa.py new file mode 100644 index 000000000..65f463ceb --- /dev/null +++ b/openless-all/ios/scripts/package-ipa.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +"""Validate an unsigned device product and package it without overwriting an IPA.""" +import argparse +import hashlib +import json +import os +from pathlib import Path +import plistlib +import stat +import subprocess +import sys +import tempfile +import zipfile + + +def digest(stream): + result = hashlib.sha256() + for block in iter(lambda: stream.read(1024 * 1024), b""): + result.update(block) + return result.hexdigest() + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("app", type=Path, help="Release-iphoneos/OpenLess.app") + parser.add_argument("output", type=Path, help="Destination .ipa; must not exist") + args = parser.parse_args() + app, output = args.app.resolve(), args.output.absolute() + if app.suffix != ".app" or not app.is_dir(): + parser.error("Expected an existing .app directory") + if output.suffix != ".ipa" or output.exists() or output.is_symlink(): + parser.error("Destination must be a new .ipa file") + if app in output.resolve().parents: + parser.error("Destination must be outside the app bundle") + subprocess.run([sys.executable, str(Path(__file__).with_name("validate-product.py")), + "--unsigned-device", str(app)], check=True) + with (app / "Info.plist").open("rb") as stream: + metadata = plistlib.load(stream) + output.parent.mkdir(parents=True, exist_ok=True) + descriptor, temporary = tempfile.mkstemp(prefix=".openless-ipa-", dir=output.parent) + os.close(descriptor) + temporary = Path(temporary) + try: + expected = {} + with zipfile.ZipFile(temporary, "w", compression=zipfile.ZIP_DEFLATED, + compresslevel=6) as archive: + for path in sorted(app.rglob("*")): + if path.is_symlink(): + raise ValueError(f"Unexpected symlink in device product: {path}") + if not path.is_file() or path.name == ".DS_Store" or path.name.startswith("._"): + continue + name = "Payload/" + str(path.relative_to(app.parent)) + with path.open("rb") as stream: + expected[name] = (digest(stream), stat.S_IMODE(path.stat().st_mode)) + archive.write(path, name) + with zipfile.ZipFile(temporary) as archive: + if set(archive.namelist()) != expected.keys() or archive.testzip() is not None: + raise ValueError("Archive members or CRC differ from the device product") + for name, (checksum, mode) in expected.items(): + with archive.open(name) as stream: + if digest(stream) != checksum: + raise ValueError(f"Archive content mismatch: {name}") + if stat.S_IMODE(archive.getinfo(name).external_attr >> 16) != mode: + raise ValueError(f"Archive permissions mismatch: {name}") + # A hard link publishes atomically and fails if another process created output. + temporary.chmod(0o644) + os.link(temporary, output) + finally: + temporary.unlink(missing_ok=True) + with output.open("rb") as stream: + checksum = digest(stream) + print(json.dumps({"ipa": str(output), "version": metadata["CFBundleShortVersionString"], + "build": metadata["CFBundleVersion"], "bytes": output.stat().st_size, + "sha256": checksum, "files": len(expected)}, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/openless-all/ios/scripts/test-interface-resources.py b/openless-all/ios/scripts/test-interface-resources.py index 12d68637e..63c96bcd8 100644 --- a/openless-all/ios/scripts/test-interface-resources.py +++ b/openless-all/ios/scripts/test-interface-resources.py @@ -54,8 +54,7 @@ def test_format_placeholders_match_and_have_helpers(self): self.assertIn(f'"{key}"', helper) def test_current_chinese_static_literals_have_resources(self): - # Deliberately ignores interpolated strings; their explicit migrations are - # listed in the handoff. Only static literal presence is asserted here. + # Interpolated strings use explicit format keys; this checks static literals. paths = [*IOS.glob('App/**/*.swift'), *IOS.glob('Keyboard/**/*.swift'), *IOS.glob('PlatformShared/**/*.swift'), IOS / 'Packages/OpenLessShared/Sources/OpenLessShared/Contract.swift'] diff --git a/openless-all/ios/scripts/test.sh b/openless-all/ios/scripts/test.sh index 237bfce78..a4e94e6fc 100755 --- a/openless-all/ios/scripts/test.sh +++ b/openless-all/ios/scripts/test.sh @@ -7,10 +7,10 @@ case "$SUITE" in *) echo 'Usage: scripts/test.sh unit|ui|all' >&2; exit 2;; esac if [ "$SUITE" = unit ] || [ "$SUITE" = all ]; then - export RUSTC="$(rustup which --toolchain 1.98.0 rustc)" - export RUSTDOC="$(rustup which --toolchain 1.98.0 rustdoc)" + export RUSTC="$(rustup which --toolchain 1.99.0 rustc)" + export RUSTDOC="$(rustup which --toolchain 1.99.0 rustdoc)" swift test --package-path "$ROOT/Packages/OpenLessShared" - rustup run 1.98.0 cargo test --manifest-path "$ROOT/CoreHost/Cargo.toml" --locked + rustup run 1.99.0 cargo test --manifest-path "$ROOT/CoreHost/Cargo.toml" --locked "$ROOT/scripts/test-rime.sh" bash "$ROOT/scripts/test-predictions.sh" "$ROOT/scripts/test-audio.sh" diff --git a/openless-all/ios/scripts/validate-product.py b/openless-all/ios/scripts/validate-product.py index 61ad6b082..3de5374bc 100644 --- a/openless-all/ios/scripts/validate-product.py +++ b/openless-all/ios/scripts/validate-product.py @@ -87,6 +87,10 @@ def app_groups(bundle, metadata): info = bundle_info(app) +for key, pattern in [("CFBundleShortVersionString", r"\d+\.\d+\.\d+"), + ("CFBundleVersion", r"[1-9]\d*")]: + if not re.fullmatch(pattern, str(info.get(key, ""))): + parser.error(f"Missing or unresolved app version: {key}") primary = info.get("CFBundleIcons", {}).get("CFBundlePrimaryIcon", {}) if primary.get("CFBundleIconName") != "AppIcon": parser.error("The built Info.plist does not declare the AppIcon primary icon") @@ -107,6 +111,9 @@ def app_groups(bundle, metadata): } for extension in extensions: metadata = bundle_info(extension, assets=False) + for key in ["CFBundleShortVersionString", "CFBundleVersion"]: + if metadata.get(key) != info[key]: + parser.error(f"Extension version differs from the app: {extension}: {key}") point = metadata.get("NSExtension", {}).get("NSExtensionPointIdentifier") if point not in expected_extensions or point in identified: parser.error(f"Unexpected or duplicate extension point in {extension}: {point}") diff --git a/openless-all/ios/scripts/validate-project.py b/openless-all/ios/scripts/validate-project.py index 254c770aa..fdfce80f1 100755 --- a/openless-all/ios/scripts/validate-project.py +++ b/openless-all/ios/scripts/validate-project.py @@ -44,6 +44,13 @@ def plist(name): app = plist("App-Info.plist") keyboard = plist("Keyboard-Info.plist") widget = plist("RecordingWidget-Info.plist") +version = (root / "Config/Version.xcconfig").read_text() +assert re.search(r"^MARKETING_VERSION = \d+\.\d+\.\d+$", version, re.MULTILINE) +assert re.search(r"^CURRENT_PROJECT_VERSION = [1-9]\d*$", version, re.MULTILINE) +assert '#include "Version.xcconfig"' in (root / "Config/Base.xcconfig").read_text() +for metadata in [app, keyboard, widget]: + assert metadata["CFBundleShortVersionString"] == "$(MARKETING_VERSION)" + assert metadata["CFBundleVersion"] == "$(CURRENT_PROJECT_VERSION)" assert app["NSMicrophoneUsageDescription"] assert app["UIBackgroundModes"] == ["audio"] extension = keyboard["NSExtension"] @@ -58,8 +65,7 @@ def plist(name): for path in (root / "Keyboard").glob("*.swift"): text = path.read_text() assert "AVAudioEngine" not in text and "SFSpeechRecognizer" not in text and "URLSession" not in text -# The existing interface-resource suite covers App/Keyboard/PlatformShared. -# Include the new widget's static localization keys here without narrowing it. +# Widget strings must share the app and keyboard localization inventory. inventory = json.loads((root / "Resources/LocalizationSources.json").read_text())["entries"] token = re.compile(r'"(?:\\.|[^"\\])*"') han = re.compile(r'[\u3400-\u9fff]') From 7b9397748248ee5340490d2f2c67f7e563532008 Mon Sep 17 00:00:00 2001 From: TRIP <192432815+appergb@users.noreply.github.com> Date: Thu, 22 Oct 2026 04:33:46 -0700 Subject: [PATCH 2/5] =?UTF-8?q?test(core):=20=E4=BF=AE=E5=A4=8D=E7=BF=BB?= =?UTF-8?q?=E8=AF=91=E5=AD=97=E6=AE=B5=E5=9B=9E=E5=BD=92=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=9A=84=20Clippy=20=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Codex --- .../src/cloud_sync_e2ee_documents/tests.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/tests.rs b/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/tests.rs index c3c0d2ffb..0ccf34e4a 100644 --- a/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/tests.rs +++ b/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/tests.rs @@ -111,12 +111,17 @@ fn all_current_preference_fields_have_an_explicit_registration() { // Wire-presence metadata is not persisted or synced. Verify the explicit // exception against actual serialization rather than exempting new fields. let metadata = "translation_target_languages_present"; - let mut prefs = crate::shared_types::UserPreferences::default(); - prefs.translation_target_languages_present = true; + let prefs = crate::shared_types::UserPreferences { + translation_target_languages_present: true, + ..Default::default() + }; let serialized = serde_json::to_value(prefs).unwrap(); assert!(serialized.get("translationTargetLanguagesPresent").is_none()); assert!(serialized.get(metadata).is_none()); - let names: std::collections::BTreeSet<_> = names.into_iter().filter(|name| *name != metadata).collect(); + let names: std::collections::BTreeSet<_> = names + .into_iter() + .filter(|name| *name != metadata) + .collect(); let registered: std::collections::BTreeSet<_> = registry::PREFERENCE_FIELDS .iter() .map(|field| field.rust_name) From dbbd7c847d4ef7df3841b00ce61d1fe9e362dde9 Mon Sep 17 00:00:00 2001 From: TRIP <192432815+appergb@users.noreply.github.com> Date: Thu, 22 Oct 2026 04:52:31 -0700 Subject: [PATCH 3/5] =?UTF-8?q?fix(core):=20=E4=BF=9D=E7=95=99=E6=97=A7?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E7=BF=BB=E8=AF=91=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E5=B9=B6=E5=90=8C=E6=AD=A5=E5=BD=95=E9=9F=B3=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reconcile a legacy scalar selection echoed with an initially empty target list without weakening explicit deletion of stored choices. Keep the recording picker selection and ordered targets in one durable update. Add persistence regressions and account for canonical language names in the Linux revision-conflict fixture. Co-Authored-By: Codex --- .../app/crates/openless-core/src/api.rs | 41 ++++++++++++++++++- .../src/cloud_sync_e2ee_documents/tests.rs | 8 ++-- .../app/crates/openless-core/src/settings.rs | 31 +++++++++++++- .../crates/openless-core/src/shared_types.rs | 9 ++++ .../app/linux-egui/src/preference_patch.rs | 13 +++++- 5 files changed, 94 insertions(+), 8 deletions(-) diff --git a/openless-all/app/crates/openless-core/src/api.rs b/openless-all/app/crates/openless-core/src/api.rs index ffe54b989..b6e5305a7 100644 --- a/openless-all/app/crates/openless-core/src/api.rs +++ b/openless-all/app/crates/openless-core/src/api.rs @@ -5753,7 +5753,13 @@ impl OpenLessBackend { }; // Keep finalization outside this critical section. A failed save changes neither // the active target nor the remembered choice, and no other preference is overwritten. - self.preferences.update(|preferences| preferences.translation_target_language = target)?; + self.preferences.update(|preferences| { + if !preferences.translation_target_languages.contains(&target) { + preferences.translation_target_languages.push(target.clone()); + } + preferences.translation_target_language = target; + preferences.translation_target_languages_present = true; + })?; state.dictation_context = Some(Arc::new(updated)); // The common stop boundary must also send the changed context to a streaming engine. state.dictation_translation_requested = Some(true); @@ -14368,6 +14374,10 @@ mod tests { let selected = backend.select_dictation_translation_target(session, "ja".into()).unwrap(); assert_eq!(selected.target_language, "日本語"); assert_eq!(backend.get_preferences().translation_target_language, "日本語"); + assert_eq!( + backend.get_preferences().translation_target_languages, + vec!["English", "日本語"] + ); assert_eq!(backend.get_preferences().microphone_device_name, "next microphone"); backend.stop_dictation().await.unwrap(); let contexts = engine.contexts(); @@ -14378,6 +14388,35 @@ mod tests { backend.shutdown().await.unwrap(); } + #[tokio::test] + async fn translation_picker_remembers_target_after_configured_choices_are_cleared() { + let data_dir = TestDataDir::new("translation-picker-cleared-choices"); + let engine = crate::testing::FixtureDictationEngine::successful("raw", "translated"); + let backend = backend_with_dictation_engine( + data_dir.path().to_path_buf(), + Arc::new(engine), + ); + backend.start().await.unwrap(); + backend.add_translation_target("en".into()).unwrap(); + let session = backend + .start_dictation_with_options(DictationStartOptions { + translation_requested: true, + ..Default::default() + }) + .await + .unwrap(); + backend.set_translation_targets(vec![]).unwrap(); + backend.select_dictation_translation_target(session, "ja".into()).unwrap(); + let saved = crate::preferences::PreferencesStore::open( + data_dir.path().join("preferences.json"), + ).unwrap().get(); + assert_eq!(saved.translation_target_language, "日本語"); + assert_eq!(saved.translation_target_languages, vec!["日本語"]); + assert_eq!(backend.get_preferences().translation_target_languages, vec!["日本語"]); + backend.cancel_dictation(Some(session)).await.unwrap(); + backend.shutdown().await.unwrap(); + } + #[tokio::test] async fn translation_picker_save_failure_keeps_active_and_saved_targets() { let data_dir = TestDataDir::new("translation-picker-save-failure"); diff --git a/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/tests.rs b/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/tests.rs index 0ccf34e4a..eb2e6ccb8 100644 --- a/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/tests.rs +++ b/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/tests.rs @@ -110,17 +110,19 @@ fn all_current_preference_fields_have_an_explicit_registration() { .collect(); // Wire-presence metadata is not persisted or synced. Verify the explicit // exception against actual serialization rather than exempting new fields. - let metadata = "translation_target_languages_present"; + let metadata = ["translation_target_languages_present", "translation_target_language_input"]; let prefs = crate::shared_types::UserPreferences { translation_target_languages_present: true, + translation_target_language_input: Some("en".into()), ..Default::default() }; let serialized = serde_json::to_value(prefs).unwrap(); assert!(serialized.get("translationTargetLanguagesPresent").is_none()); - assert!(serialized.get(metadata).is_none()); + assert!(serialized.get("translationTargetLanguageInput").is_none()); + assert!(metadata.iter().all(|name| serialized.get(*name).is_none())); let names: std::collections::BTreeSet<_> = names .into_iter() - .filter(|name| *name != metadata) + .filter(|name| !metadata.contains(name)) .collect(); let registered: std::collections::BTreeSet<_> = registry::PREFERENCE_FIELDS .iter() diff --git a/openless-all/app/crates/openless-core/src/settings.rs b/openless-all/app/crates/openless-core/src/settings.rs index 387d97215..ad33194bb 100644 --- a/openless-all/app/crates/openless-core/src/settings.rs +++ b/openless-all/app/crates/openless-core/src/settings.rs @@ -71,7 +71,15 @@ pub(crate) fn reconcile_translation_settings( }, &previous.translation_target_language, ); - let selected = canonical_translation_target(&next.translation_target_language); + // A legacy client can echo the initially empty list while selecting its first language. + // An empty list replacing stored choices remains an explicit deletion. + let input = if previous_targets.is_empty() && next.translation_target_languages.is_empty() { + next.translation_target_language_input.as_deref() + .unwrap_or(&next.translation_target_language) + } else { + &next.translation_target_language + }; + let selected = canonical_translation_target(input); let mut targets = if next.translation_target_languages_present { ordered_translation_targets(next.translation_target_languages.clone()) } else { @@ -80,7 +88,7 @@ pub(crate) fn reconcile_translation_settings( // Scalar-only clients (including existing Rust callers editing a snapshot) select // a target without replacing the ordered collection. Explicit [] always clears. if (!next.translation_target_languages_present - || (!targets.is_empty() && targets == previous_targets && selected != previous_selected)) + || (targets == previous_targets && selected != previous_selected)) && !selected.is_empty() && !targets.contains(&selected) { @@ -105,6 +113,7 @@ pub(crate) fn reconcile_translation_settings( next.translation_target_languages = targets; next.translation_target_language = selected; next.translation_target_languages_present = true; + next.translation_target_language_input = None; Ok(()) } @@ -408,6 +417,24 @@ mod translation_targets_tests { use super::*; use serde_json::json; + #[test] + fn empty_list_roundtrip_allows_the_first_legacy_selection_but_explicit_clear_still_wins() { + let previous = UserPreferences::default(); + let mut document = serde_json::to_value(&previous).unwrap(); + document["translationTargetLanguage"] = json!("ko"); + let mut next: UserPreferences = serde_json::from_value(document).unwrap(); + reconcile_translation_settings(&previous, &mut next).unwrap(); + assert_eq!(next.translation_target_language, "한국어"); + assert_eq!(next.translation_target_languages, vec!["한국어"]); + let previous = next; + let mut document = serde_json::to_value(&previous).unwrap(); + document["translationTargetLanguages"] = json!([]); + let mut cleared: UserPreferences = serde_json::from_value(document).unwrap(); + reconcile_translation_settings(&previous, &mut cleared).unwrap(); + assert!(cleared.translation_target_language.is_empty()); + assert!(cleared.translation_target_languages.is_empty()); + } + #[test] fn legacy_selected_target_seeds_list_and_preserves_custom_names() { for (input, expected) in [ diff --git a/openless-all/app/crates/openless-core/src/shared_types.rs b/openless-all/app/crates/openless-core/src/shared_types.rs index ad243ea9b..f2ad5f277 100644 --- a/openless-all/app/crates/openless-core/src/shared_types.rs +++ b/openless-all/app/crates/openless-core/src/shared_types.rs @@ -562,6 +562,10 @@ pub struct UserPreferences { #[doc(hidden)] #[serde(skip)] pub translation_target_languages_present: bool, + /// Retains the submitted scalar until an empty list can be reconciled with stored choices. + #[doc(hidden)] + #[serde(skip)] + pub translation_target_language_input: Option, /// Chinese output script preference (not exposed as a UI switch): /// - Simplified: prefer simplified for Chinese output /// - Traditional: prefer traditional for Chinese output @@ -1479,6 +1483,9 @@ impl<'de> Deserialize<'de> for UserPreferences { } } let translation_target_languages_present = wire.translation_target_languages.is_some(); + let translation_target_language_input = wire.translation_target_languages.as_ref() + .filter(|targets| targets.is_empty()) + .map(|_| wire.translation_target_language.clone()); let (translation_target_languages, translation_target_language) = crate::settings::migrate_translation_targets( wire.translation_target_languages, @@ -1592,6 +1599,7 @@ impl<'de> Deserialize<'de> for UserPreferences { translation_target_language, translation_target_languages, translation_target_languages_present, + translation_target_language_input, chinese_script_preference: wire.chinese_script_preference, output_language_preference: wire.output_language_preference, qa_hotkey: if cfg!(target_os = "linux") { wire.qa_hotkey } else { None }, // retired desktop follow-up shortcut @@ -1984,6 +1992,7 @@ impl Default for UserPreferences { translation_target_language: String::new(), translation_target_languages: Vec::new(), translation_target_languages_present: false, + translation_target_language_input: None, chinese_script_preference: ChineseScriptPreference::Auto, output_language_preference: OutputLanguagePreference::Auto, qa_hotkey: default_qa_hotkey(), diff --git a/openless-all/app/linux-egui/src/preference_patch.rs b/openless-all/app/linux-egui/src/preference_patch.rs index 3a101bf00..0871556bb 100644 --- a/openless-all/app/linux-egui/src/preference_patch.rs +++ b/openless-all/app/linux-egui/src/preference_patch.rs @@ -119,6 +119,15 @@ mod tests { }]; let initial = serde_json::to_value(initial).unwrap(); let changed = serde_json::to_value(changed).unwrap(); + let expected = |key: &str, value: &Value| { + if key == "translationTargetLanguage" { + Value::String(openless_core::language_catalog::native_language_name( + value.as_str().unwrap(), + ).unwrap()) + } else { + value.clone() + } + }; for (key, value) in changed.as_object().unwrap() { if initial[key] == *value { continue; @@ -150,7 +159,7 @@ mod tests { "{key} must retry exactly the revision conflict" ); let saved = serde_json::to_value(backend.get_preferences()).unwrap(); - assert_eq!(saved[key], *value, "{key}"); + assert_eq!(saved[key], expected(key, value), "{key}"); assert_eq!(saved["microphoneDeviceName"], key.as_str()); } drop(host); @@ -166,7 +175,7 @@ mod tests { let saved = serde_json::to_value(reopened.get_preferences()).unwrap(); for (key, value) in changed.as_object().unwrap() { if initial[key] != *value { - assert_eq!(saved[key], *value, "persisted {key}"); + assert_eq!(saved[key], expected(key, value), "persisted {key}"); } } drop(reopened); From c6e059b55f617a2e80e294dcdf11113a0b62558e Mon Sep 17 00:00:00 2001 From: TRIP <192432815+appergb@users.noreply.github.com> Date: Thu, 22 Oct 2026 05:07:22 -0700 Subject: [PATCH 4/5] =?UTF-8?q?fix(core):=20=E5=9C=A8=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E8=8D=89=E7=A8=BF=E9=87=8D=E5=BB=BA=E5=89=8D=E8=A7=84=E8=8C=83?= =?UTF-8?q?=E7=BF=BB=E8=AF=91=E5=81=8F=E5=A5=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolve translation scalar/list compatibility while producing a patched draft so rebasing and serialization cannot discard a pending selection. Cover the round trip and explicit deletion, and verify the Linux settings queue against the normalized result. Co-Authored-By: Codex --- .../openless-core/src/preference_patch.rs | 22 ++++++++++++++++++- .../linux-egui/src/linux_app/settings_save.rs | 3 +++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/openless-all/app/crates/openless-core/src/preference_patch.rs b/openless-all/app/crates/openless-core/src/preference_patch.rs index 411a4b5fd..07e176ecc 100644 --- a/openless-all/app/crates/openless-core/src/preference_patch.rs +++ b/openless-all/app/crates/openless-core/src/preference_patch.rs @@ -18,7 +18,9 @@ pub fn patch_preferences( if let Some(mode) = edits.get("/capsuleDisplayMode") { document["capsuleDisplayModeV2"] = mode.clone(); } - serde_json::from_value(document).map_err(invalid) + let mut patched = serde_json::from_value(document).map_err(invalid)?; + crate::settings::reconcile_translation_settings(current, &mut patched)?; + Ok(patched) } fn invalid(error: impl std::fmt::Display) -> BackendError { @@ -52,6 +54,24 @@ pub fn update_fields( #[cfg(test)] mod tests { use super::*; + + #[test] + fn translation_drafts_survive_rebasing_and_serialization_before_save() { + let current = UserPreferences::default(); + let edits = BTreeMap::from([("/translationTargetLanguage".into(), Value::from("ko"))]); + let draft = patch_preferences(¤t, &edits).unwrap(); + assert_eq!(draft.translation_target_language, "한국어"); + assert_eq!(draft.translation_target_languages, vec!["한국어"]); + let loaded: UserPreferences = serde_json::from_value(serde_json::to_value(&draft).unwrap()).unwrap(); + assert_eq!(loaded.translation_target_language, draft.translation_target_language); + assert_eq!(loaded.translation_target_languages, draft.translation_target_languages); + let cleared = patch_preferences(&loaded, &BTreeMap::from([ + ("/translationTargetLanguages".into(), serde_json::json!([])), + ])).unwrap(); + assert!(cleared.translation_target_language.is_empty()); + assert!(cleared.translation_target_languages.is_empty()); + } + #[test] fn capsule_display_edits_establish_v2_without_opt_in_from_unrelated_edits() { let mut current = UserPreferences::default(); diff --git a/openless-all/app/linux-egui/src/linux_app/settings_save.rs b/openless-all/app/linux-egui/src/linux_app/settings_save.rs index d7e83d1b4..c0deb0aa6 100644 --- a/openless-all/app/linux-egui/src/linux_app/settings_save.rs +++ b/openless-all/app/linux-egui/src/linux_app/settings_save.rs @@ -915,6 +915,9 @@ mod tests { external.microphone_device_name = "external microphone".into(); let merged = openless_linux_egui::patch_preferences(&external, &edits).unwrap(); draft.microphone_device_name = external.microphone_device_name; + // Core normalizes the selection and its target list before rebasing the UI draft. + draft.translation_target_language = "한국어".into(); + draft.translation_target_languages = vec!["한국어".into()]; assert_eq!( serde_json::to_value(merged).unwrap(), serde_json::to_value(draft).unwrap() From 7d2220cec71691fdfb1163fb187dc6711c1f8a66 Mon Sep 17 00:00:00 2001 From: TRIP <192432815+appergb@users.noreply.github.com> Date: Thu, 22 Oct 2026 06:01:09 -0700 Subject: [PATCH 5/5] =?UTF-8?q?build(ios):=20=E5=AF=B9=E9=BD=90=20Beta=20?= =?UTF-8?q?=E5=B9=B6=E9=9A=94=E7=A6=BB=E7=A7=BB=E5=8A=A8=E7=AB=AF=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E4=B8=8E=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Keep desktop sources identical to beta. Prepare the iOS input-contract additions in a generated Core copy owned by the mobile Rust workspace, and verify it through dedicated tests and an unsigned device build in CI. Co-Authored-By: Codex --- .github/workflows/check-ios.yml | 75 +- .../app/crates/openless-core/src/api.rs | 555 +----- .../app/crates/openless-core/src/auxiliary.rs | 199 -- .../openless-core/src/cloud_providers.rs | 82 - .../src/cloud_sync_e2ee_documents/registry.rs | 7 - .../src/cloud_sync_e2ee_documents/tests.rs | 16 - .../openless-core/src/dictation_context.rs | 65 +- .../openless-core/src/dictation_engine.rs | 48 - .../openless-core/src/language_catalog.rs | 24 - .../app/crates/openless-core/src/ports.rs | 9 - .../openless-core/src/preference_patch.rs | 22 +- .../crates/openless-core/src/preferences.rs | 2 - .../openless-core/src/provider_registry.rs | 11 - .../app/crates/openless-core/src/settings.rs | 257 --- .../crates/openless-core/src/shared_types.rs | 37 +- .../linux-egui/src/linux_app/settings_save.rs | 3 - .../app/linux-egui/src/preference_patch.rs | 13 +- openless-all/ios/.gitattributes | 2 + openless-all/ios/CoreHost/Cargo.lock | 2 + openless-all/ios/CoreHost/Cargo.toml | 5 +- .../Patches/ios-input-contracts.patch | 1682 +++++++++++++++++ openless-all/ios/README.md | 6 +- openless-all/ios/scripts/audio-smoke.swift | 11 +- openless-all/ios/scripts/bootstrap.sh | 1 + openless-all/ios/scripts/build-core.sh | 7 + .../ios/scripts/collect-rust-licenses.py | 1 + openless-all/ios/scripts/prepare-core.py | 96 + openless-all/ios/scripts/test-audio.sh | 2 +- openless-all/ios/scripts/test.sh | 3 +- 29 files changed, 1896 insertions(+), 1347 deletions(-) create mode 100644 openless-all/ios/CoreHost/Patches/ios-input-contracts.patch create mode 100644 openless-all/ios/scripts/prepare-core.py diff --git a/.github/workflows/check-ios.yml b/.github/workflows/check-ios.yml index 4446eb563..b2a33c758 100644 --- a/.github/workflows/check-ios.yml +++ b/.github/workflows/check-ios.yml @@ -1,10 +1,13 @@ -name: iOS source checks +name: iOS tests and device build on: pull_request: paths: - 'openless-all/ios/**' - 'openless-all/app/crates/openless-core/**' + - 'openless-all/app/crates/micyou-*/**' + - 'openless-all/app/contract/**' + - 'openless-all/app/assets/**' - '.github/workflows/check-ios.yml' workflow_dispatch: @@ -15,19 +18,73 @@ concurrency: group: ios-checks-${{ github.ref }} cancel-in-progress: true +env: + CARGO_PROFILE_DEV_DEBUG: 0 + CARGO_PROFILE_TEST_DEBUG: 0 + jobs: test: - runs-on: macos-latest + runs-on: xcode-27 timeout-minutes: 30 - env: - CARGO_PROFILE_DEV_DEBUG: 0 - CARGO_PROFILE_TEST_DEBUG: 0 steps: - uses: actions/checkout@v6 - uses: dtolnay/rust-toolchain@1.99.0 + with: + components: clippy + - name: Record the unchanged shared source baseline + run: | + git diff --exit-code HEAD -- openless-all/app + git rev-parse HEAD:openless-all/app + - name: Prepare the isolated mobile Core + run: python3 openless-all/ios/scripts/prepare-core.py - name: Test shared keyboard contracts run: swift test --package-path openless-all/ios/Packages/OpenLessShared - - name: Test the iOS Core host - run: cargo test --manifest-path openless-all/ios/CoreHost/Cargo.toml --locked - - name: Validate interface resources - run: python3 openless-all/ios/scripts/test-interface-resources.py + - name: Test mobile Core and iOS Host + run: cargo test --manifest-path openless-all/ios/CoreHost/Cargo.toml --workspace --lib --locked + - name: Check mobile Core + run: cargo clippy --manifest-path openless-all/ios/CoreHost/Cargo.toml -p openless-core --all-targets --locked -- -D warnings + - name: Test interface resources, predictions and native audio + working-directory: openless-all/ios + run: | + python3 scripts/test-interface-resources.py + python3 scripts/build-predictions.py + bash scripts/test-predictions.sh + bash scripts/test-audio.sh + - name: Verify shared sources were not modified + run: git diff --exit-code -- openless-all/app + + device-build: + needs: test + runs-on: xcode-27 + timeout-minutes: 60 + defaults: + run: + working-directory: openless-all/ios + steps: + - uses: actions/checkout@v6 + - name: Prepare native build tools and dependencies + run: | + xcodebuild -version + command -v cmake >/dev/null || brew install cmake + bash scripts/bootstrap.sh + bash scripts/bootstrap-local-speech.sh + - name: Build Rime and test composition + run: | + bash scripts/build-rime.sh host + bash scripts/test-rime.sh + bash scripts/build-rime.sh device + - name: Build the mobile Core and refresh attribution + run: | + bash scripts/build-core.sh device + python3 scripts/collect-rust-licenses.py + - name: Build and validate the unsigned iPhone app + env: + OPENLESS_DERIVED_DATA: ${{ runner.temp }}/ios-device + run: | + python3 scripts/validate-project.py + bash scripts/build.sh device Release unsigned + python3 scripts/package-ipa.py \ + "$OPENLESS_DERIVED_DATA/Build/Products/Release-iphoneos/OpenLess.app" \ + "$RUNNER_TEMP/OpenLess-ci-unsigned.ipa" + - name: Verify shared sources were not modified + run: git diff --exit-code -- ../app diff --git a/openless-all/app/crates/openless-core/src/api.rs b/openless-all/app/crates/openless-core/src/api.rs index b6e5305a7..ab3a2a084 100644 --- a/openless-all/app/crates/openless-core/src/api.rs +++ b/openless-all/app/crates/openless-core/src/api.rs @@ -5753,13 +5753,7 @@ impl OpenLessBackend { }; // Keep finalization outside this critical section. A failed save changes neither // the active target nor the remembered choice, and no other preference is overwritten. - self.preferences.update(|preferences| { - if !preferences.translation_target_languages.contains(&target) { - preferences.translation_target_languages.push(target.clone()); - } - preferences.translation_target_language = target; - preferences.translation_target_languages_present = true; - })?; + self.preferences.update(|preferences| preferences.translation_target_language = target)?; state.dictation_context = Some(Arc::new(updated)); // The common stop boundary must also send the changed context to a streaming engine. state.dictation_translation_requested = Some(true); @@ -6595,146 +6589,6 @@ impl OpenLessBackend { self.preferences.get() } - /// Replace the ordered target choices. Removing the selection chooses the first - /// remaining target; an empty list clears/disables the legacy selected target. - pub fn set_translation_targets( - &self, - targets: Vec, - ) -> Result { - self.update_translation_targets(|preferences| { - preferences.translation_target_languages = targets; - let targets = crate::settings::ordered_translation_targets( - preferences.translation_target_languages.clone(), - ); - if !targets.contains(&preferences.translation_target_language) { - preferences.translation_target_language = - targets.first().cloned().unwrap_or_default(); - } - Ok(()) - }) - } - - /// Add a catalog target once, at the end. The first addition becomes selected. - pub fn add_translation_target( - &self, - target: String, - ) -> Result { - self.update_translation_targets(|preferences| { - let target = crate::settings::canonical_translation_target(&target); - if target.is_empty() { - return Err(BackendError::new( - BackendErrorCode::InvalidArgument, - "empty translation target", - )); - } - if preferences.translation_target_languages.is_empty() { - preferences.translation_target_language = target.clone(); - } - if !preferences.translation_target_languages.contains(&target) { - preferences.translation_target_languages.push(target); - } - Ok(()) - }) - } - - /// Deletion is idempotent. Deleting the selection chooses the first remaining target. - pub fn delete_translation_target( - &self, - target: String, - ) -> Result { - self.update_translation_targets(|preferences| { - let target = crate::settings::canonical_translation_target(&target); - preferences - .translation_target_languages - .retain(|value| value != &target); - if !target.is_empty() && preferences.translation_target_language == target { - preferences.translation_target_language = preferences - .translation_target_languages - .first() - .cloned() - .unwrap_or_default(); - } - Ok(()) - }) - } - - /// Reorder only: omissions, additions and duplicates are rejected atomically. - pub fn reorder_translation_targets( - &self, - targets: Vec, - ) -> Result { - self.update_translation_targets(|preferences| { - let ordered = crate::settings::ordered_translation_targets(targets.clone()); - if ordered.len() != targets.len() - || ordered.len() != preferences.translation_target_languages.len() - || ordered - .iter() - .any(|target| !preferences.translation_target_languages.contains(target)) - { - return Err(BackendError::new( - BackendErrorCode::InvalidArgument, - "translation target reorder must be an exact permutation", - )); - } - preferences.translation_target_languages = ordered; - Ok(()) - }) - } - - /// Select a configured target, or disable legacy translation without erasing choices. - pub fn select_translation_target( - &self, - target: Option, - ) -> Result { - self.update_translation_targets(|preferences| { - preferences.translation_target_language = match target { - Some(target) => { - crate::settings::validate_session_translation_target(preferences, &target)? - } - None => String::new(), - }; - Ok(()) - }) - } - - fn update_translation_targets( - &self, - update: impl FnOnce(&mut UserPreferences) -> Result<(), BackendError>, - ) -> Result { - self.ensure_runtime_ready()?; - let _write_guard = self - .settings_write_gate - .lock() - .unwrap_or_else(std::sync::PoisonError::into_inner); - let previous = self.preferences.get(); - let mut preferences = previous.clone(); - let (targets, selected) = crate::settings::migrate_translation_targets( - if preferences.translation_target_languages_present { - Some(preferences.translation_target_languages.clone()) - } else { - None - }, - &preferences.translation_target_language, - ); - preferences.translation_target_languages = targets; - preferences.translation_target_language = selected; - preferences.translation_target_languages_present = true; - update(&mut preferences)?; - crate::settings::reconcile_translation_settings(&previous, &mut preferences)?; - // Own only these fields, not a potentially stale whole-document snapshot. - self.preferences.update(|current| { - current.translation_target_languages = preferences.translation_target_languages.clone(); - current.translation_target_language = preferences.translation_target_language.clone(); - current.translation_target_languages_present = true; - })?; - self.publish_preferences_changed(); - Ok(crate::SettingsUpdateOutcome { - preferences: self.preferences.get(), - reconciled_hotkey_count: 0, - effects: crate::SettingsEffectPlan::default(), - }) - } - /// Consumes the "first launch of this major version" splash PV marker: /// returns false when the config's `splash_seen_version` matches the /// given current major (no replay); on mismatch it writes back the major @@ -6862,7 +6716,6 @@ impl OpenLessBackend { }; crate::sync_dictation_hotkey_legacy_fields(&mut previous); crate::sync_dictation_hotkey_legacy_fields(&mut preferences); - crate::settings::reconcile_translation_settings(&previous, &mut preferences)?; // The splash marker may only advance via take_splash_playback: when a // whole-document submit (old frontend, or a request that hasn't read // the marker back) omits the field, serde's default would write the @@ -7847,42 +7700,10 @@ impl OpenLessBackend { self.start_reserved_dictation(reservation, options).await } - /// Capture using one explicitly registered native route and the unmodified - /// built-in Raw prompt. This never selects a cloud fallback or mutates styles. - pub async fn start_local_raw_dictation( - &self, - native_provider: &str, - insert_text: bool, - ) -> Result { - let provider = crate::credentials::ProviderType::new(native_provider.to_string())?; - let options = DictationStartOptions { - insert_text, - ..Default::default() - }; - let reservation = - self.reserve_dictation_session(insert_text, options.output_target, None)?; - self.start_reserved_dictation_with_raw_provider( - reservation, - options, - Some(provider.as_str()), - ) - .await - } - async fn start_reserved_dictation( &self, reservation: DictationReservation, options: DictationStartOptions, - ) -> Result { - self.start_reserved_dictation_with_raw_provider(reservation, options, None) - .await - } - - async fn start_reserved_dictation_with_raw_provider( - &self, - reservation: DictationReservation, - options: DictationStartOptions, - raw_provider: Option<&str>, ) -> Result { let DictationReservation { session_id, @@ -7899,25 +7720,14 @@ impl OpenLessBackend { return Err(error); } } - let captured = match raw_provider { - Some(provider) => async { - let context = self.capture_local_raw_context(&options, provider)?; - // Resolve the explicit adapter before capture; this route has no fallback. - Arc::clone(&self.deps.dictation_engine) - .prepare_transcription(session_id, Arc::new(context.clone())) - .await?; - Ok(context) - }.await, - None => { - self.capture_dictation_context_with_host( - &options, - DictationContextPurpose::Dictation, - host_context.as_ref(), - ) - .await - } - }; - let context = match captured { + let context = match self + .capture_dictation_context_with_host( + &options, + DictationContextPurpose::Dictation, + host_context.as_ref(), + ) + .await + { Ok(context) => Arc::new(context), Err(error) => { self.schedule_pending_audio_capture_discard(pending_capture.take()); @@ -9367,36 +9177,6 @@ impl OpenLessBackend { } } - fn capture_local_raw_context( - &self, - options: &DictationStartOptions, - provider: &str, - ) -> Result { - let preferences = self.get_preferences(); - let hotwords = self - .vocabulary - .list()? - .into_iter() - .filter(|entry| entry.enabled) - .map(|entry| entry.phrase) - .collect(); - let style = crate::style_packs::builtin_style_pack_for_mode(crate::types::PolishMode::Raw); - let mut context = DictationContext::capture( - &preferences, - &style, - DictationProviderInvocations::new( - crate::dictation_context::ProviderInvocation::for_provider(provider), - crate::dictation_context::ProviderInvocation::for_provider("raw-unused-llm"), - crate::dictation_context::ProviderInvocation::for_provider("raw-unused-omni"), - ), - hotwords, - Vec::new(), - options, - ); - context.pipeline_mode = crate::shared_types::PipelineMode::Traditional; - Ok(context) - } - async fn capture_dictation_context( &self, options: &DictationStartOptions, @@ -9418,11 +9198,6 @@ impl OpenLessBackend { ) -> Result { let preferences = self.get_preferences(); let mut captured_options = options.clone(); - if let Some(target) = &options.translation_target_language { - captured_options.translation_target_language = Some( - crate::settings::validate_session_translation_target(&preferences, target)?, - ); - } if !preferences.cursor_context_enabled { // This switch controls document text, including text supplied by // callers. Front-application metadata is still needed for history, @@ -12414,285 +12189,6 @@ mod tests { let _ = std::fs::remove_dir_all(data_dir); } - #[test] - fn translation_targets_business_apis_persist_order_selection_and_events() { - let (backend, _) = backend(); - let mut events = backend.subscribe(); - let original = backend.get_preferences(); - let outcome = backend - .set_translation_targets(vec![ - "ja".into(), - "en".into(), - "EN".into(), - "fr".into(), - "de".into(), - ]) - .unwrap(); - assert_eq!( - outcome.preferences.translation_target_languages, - vec!["日本語", "English", "Français", "Deutsch"] - ); - assert_eq!(outcome.preferences.translation_target_language, "日本語"); - assert!(outcome.effects.is_empty()); - assert_eq!(backend.snapshot().preferences_revision, 1); - assert!(matches!( - events.try_recv().unwrap().kind, - BackendEventKind::PreferencesChanged(PreferencesChange { revision: 1 }) - )); - assert_eq!(events.try_recv(), Err(crate::events::EventRecvError::Empty)); - backend.add_translation_target("en".into()).unwrap(); - backend - .reorder_translation_targets(vec!["de".into(), "en".into(), "fr".into(), "ja".into()]) - .unwrap(); - backend - .select_translation_target(Some("fr".into())) - .unwrap(); - backend.delete_translation_target("fr".into()).unwrap(); - let preferences = backend.get_preferences(); - assert_eq!( - preferences.translation_target_languages, - vec!["Deutsch", "English", "日本語"] - ); - assert_eq!(preferences.translation_target_language, "Deutsch"); - assert_eq!( - preferences.active_llm_provider, - original.active_llm_provider - ); - assert_eq!(preferences.working_languages, original.working_languages); - let reloaded = crate::preferences::PreferencesStore::open( - backend._data_dir.path().join("preferences.json"), - ) - .unwrap() - .get(); - assert_eq!( - reloaded.translation_target_languages, - preferences.translation_target_languages - ); - assert_eq!(reloaded.translation_target_language, "Deutsch"); - backend.select_translation_target(None).unwrap(); - backend.delete_translation_target("".into()).unwrap(); - assert!(backend - .get_preferences() - .translation_target_language - .is_empty()); - assert_eq!( - backend.get_preferences().translation_target_languages.len(), - 3 - ); - backend.set_translation_targets(vec![]).unwrap(); - assert!(backend - .get_preferences() - .translation_target_languages - .is_empty()); - assert!(backend - .get_preferences() - .translation_target_language - .is_empty()); - } - - #[test] - fn translation_targets_invalid_mutations_are_atomic() { - let (backend, _) = backend(); - backend - .set_translation_targets(vec!["en".into(), "ja".into()]) - .unwrap(); - let before = serde_json::to_value(backend.get_preferences()).unwrap(); - let revision = backend.snapshot().preferences_revision; - for result in [ - backend.add_translation_target("Unknown new language".into()), - backend.add_translation_target(" ".into()), - backend.set_translation_targets(vec!["fr".into(), "Unknown new language".into()]), - backend.reorder_translation_targets(vec!["en".into()]), - backend.reorder_translation_targets(vec!["en".into(), "EN".into()]), - backend.select_translation_target(Some("fr".into())), - ] { - assert_eq!(result.unwrap_err().code, BackendErrorCode::InvalidArgument); - assert_eq!( - serde_json::to_value(backend.get_preferences()).unwrap(), - before - ); - assert_eq!(backend.snapshot().preferences_revision, revision); - } - } - - #[test] - fn translation_targets_old_client_whole_settings_saves_preserve_choices() { - let (backend, _) = backend(); - backend - .set_translation_targets(vec!["en".into(), "ja".into()]) - .unwrap(); - for (selected, expected, targets) in [ - ("en", "English", vec!["English", "日本語"]), - ("ja", "日本語", vec!["English", "日本語"]), - ("fr", "Français", vec!["English", "日本語", "Français"]), - ("", "", vec!["English", "日本語", "Français"]), - ] { - let mut value = serde_json::to_value(backend.get_preferences()).unwrap(); - value - .as_object_mut() - .unwrap() - .remove("translationTargetLanguages"); - value["translationTargetLanguage"] = serde_json::json!(selected); - let legacy = serde_json::from_value(value).unwrap(); - let outcome = backend - .update_settings( - legacy, - crate::SettingsUpdateOptions::SETTINGS_DOCUMENT, - &crate::NoopSettingsRuntime, - ) - .unwrap(); - assert_eq!(outcome.preferences.translation_target_language, expected); - assert_eq!(outcome.preferences.translation_target_languages, targets); - } - let mut explicit = serde_json::to_value(backend.get_preferences()).unwrap(); - explicit["translationTargetLanguages"] = serde_json::json!([]); - explicit["translationTargetLanguage"] = serde_json::json!("en"); - let cleared = backend - .update_settings( - serde_json::from_value(explicit).unwrap(), - crate::SettingsUpdateOptions::SETTINGS_DOCUMENT, - &crate::NoopSettingsRuntime, - ) - .unwrap(); - assert!(cleared.preferences.translation_target_languages.is_empty()); - assert!(cleared.preferences.translation_target_language.is_empty()); - } - - #[test] - fn translation_targets_legacy_scalar_edits_survive_roundtripping_the_new_list() { - let (backend, _) = backend(); - backend - .set_translation_targets(vec!["en".into(), "ja".into()]) - .unwrap(); - // Older frontends may spread a preferences object including fields they do not edit. - let mut value = serde_json::to_value(backend.get_preferences()).unwrap(); - value["translationTargetLanguage"] = serde_json::json!("fr"); - let outcome = backend - .update_settings( - serde_json::from_value(value).unwrap(), - crate::SettingsUpdateOptions::SETTINGS_DOCUMENT, - &crate::NoopSettingsRuntime, - ) - .unwrap(); - assert_eq!(outcome.preferences.translation_target_language, "Français"); - assert_eq!( - outcome.preferences.translation_target_languages, - vec!["English", "日本語", "Français"] - ); - } - - #[test] - fn translation_targets_historical_custom_name_can_be_retained_selected_and_removed() { - let data_dir = TestDataDir::new("translation-target-historical"); - std::fs::create_dir_all(data_dir.path()).unwrap(); - // A historical file is migration input, not a new addition via the business API. - std::fs::write( - data_dir.path().join("preferences.json"), - serde_json::to_vec(&serde_json::json!({ - "translationTargetLanguage": "Historical custom language", - })) - .unwrap(), - ) - .unwrap(); - let migrated = backend_with_dictation_engine( - data_dir.path().to_path_buf(), - Arc::new(crate::testing::FixtureDictationEngine::successful( - "raw", "final", - )), - ); - migrated.add_translation_target("en".into()).unwrap(); - migrated - .reorder_translation_targets(vec!["en".into(), "Historical custom language".into()]) - .unwrap(); - migrated - .select_translation_target(Some("Historical custom language".into())) - .unwrap(); - assert_eq!( - migrated.get_preferences().translation_target_language, - "Historical custom language" - ); - migrated - .delete_translation_target("Historical custom language".into()) - .unwrap(); - assert_eq!( - migrated.get_preferences().translation_target_language, - "English" - ); - assert_eq!( - migrated - .add_translation_target("Historical custom language".into()) - .unwrap_err() - .code, - BackendErrorCode::InvalidArgument - ); - } - - #[tokio::test] - async fn translation_target_start_option_is_session_local_and_survives_settings_changes() { - let data_dir = TestDataDir::new("translation-target-session"); - let engine = crate::testing::FixtureDictationEngine::successful("raw", "final"); - let backend = - backend_with_dictation_engine(data_dir.path().to_path_buf(), Arc::new(engine.clone())); - backend.start().await.unwrap(); - backend - .set_translation_targets(vec!["en".into(), "ja".into()]) - .unwrap(); - let mut preferences = backend.get_preferences(); - preferences.working_languages = vec!["简体中文".into()]; - backend.set_preferences(preferences).unwrap(); - let revision = backend.snapshot().preferences_revision; - backend - .start_external_dictation_with_options(DictationStartOptions { - translation_requested: true, - translation_target_language: Some("ja".into()), - ..Default::default() - }) - .await - .unwrap(); - assert_eq!( - backend.get_preferences().translation_target_language, - "English" - ); - assert_eq!(backend.snapshot().preferences_revision, revision); - backend.set_translation_targets(vec!["fr".into()]).unwrap(); - backend.stop_dictation().await.unwrap(); - let contexts = engine.contexts(); - let context = contexts.last().unwrap(); - assert_eq!(context.polish.translation_target_language, "日本語"); - assert!(context.polish.translation_target_explicit); - assert!(context.polish.translation_active); - assert!(context.effective_polish_system_prompt().contains("日本語")); - assert_eq!( - backend.get_preferences().translation_target_language, - "Français" - ); - backend.shutdown().await.unwrap(); - } - - #[tokio::test] - async fn translation_target_start_option_rejects_unconfigured_or_empty_without_starting_engine() - { - let data_dir = TestDataDir::new("translation-target-invalid"); - let engine = crate::testing::FixtureDictationEngine::successful("raw", "final"); - let backend = - backend_with_dictation_engine(data_dir.path().to_path_buf(), Arc::new(engine.clone())); - backend.start().await.unwrap(); - backend.add_translation_target("en".into()).unwrap(); - for target in ["", " ", "ja", "Unknown target"] { - let error = backend - .start_external_dictation_with_options(DictationStartOptions { - translation_requested: true, - translation_target_language: Some(target.into()), - ..Default::default() - }) - .await - .unwrap_err(); - assert_eq!(error.code, BackendErrorCode::InvalidArgument); - assert!(engine.contexts().is_empty()); - } - backend.shutdown().await.unwrap(); - } - #[test] fn focused_microphone_selection_persists_and_publishes_once() { let (backend, _) = backend(); @@ -14374,10 +13870,6 @@ mod tests { let selected = backend.select_dictation_translation_target(session, "ja".into()).unwrap(); assert_eq!(selected.target_language, "日本語"); assert_eq!(backend.get_preferences().translation_target_language, "日本語"); - assert_eq!( - backend.get_preferences().translation_target_languages, - vec!["English", "日本語"] - ); assert_eq!(backend.get_preferences().microphone_device_name, "next microphone"); backend.stop_dictation().await.unwrap(); let contexts = engine.contexts(); @@ -14388,35 +13880,6 @@ mod tests { backend.shutdown().await.unwrap(); } - #[tokio::test] - async fn translation_picker_remembers_target_after_configured_choices_are_cleared() { - let data_dir = TestDataDir::new("translation-picker-cleared-choices"); - let engine = crate::testing::FixtureDictationEngine::successful("raw", "translated"); - let backend = backend_with_dictation_engine( - data_dir.path().to_path_buf(), - Arc::new(engine), - ); - backend.start().await.unwrap(); - backend.add_translation_target("en".into()).unwrap(); - let session = backend - .start_dictation_with_options(DictationStartOptions { - translation_requested: true, - ..Default::default() - }) - .await - .unwrap(); - backend.set_translation_targets(vec![]).unwrap(); - backend.select_dictation_translation_target(session, "ja".into()).unwrap(); - let saved = crate::preferences::PreferencesStore::open( - data_dir.path().join("preferences.json"), - ).unwrap().get(); - assert_eq!(saved.translation_target_language, "日本語"); - assert_eq!(saved.translation_target_languages, vec!["日本語"]); - assert_eq!(backend.get_preferences().translation_target_languages, vec!["日本語"]); - backend.cancel_dictation(Some(session)).await.unwrap(); - backend.shutdown().await.unwrap(); - } - #[tokio::test] async fn translation_picker_save_failure_keeps_active_and_saved_targets() { let data_dir = TestDataDir::new("translation-picker-save-failure"); diff --git a/openless-all/app/crates/openless-core/src/auxiliary.rs b/openless-all/app/crates/openless-core/src/auxiliary.rs index 55a7de23e..75c9c3c37 100644 --- a/openless-all/app/crates/openless-core/src/auxiliary.rs +++ b/openless-all/app/crates/openless-core/src/auxiliary.rs @@ -64,106 +64,7 @@ impl RetranscriptionFailure { } } -/// A one-shot compose operation prepared before recording starts. The instruction -/// is supplied only after real ASR completes; no editor selection is accepted. -/// This auxiliary operation does not hold the global voice-session gate. Hosts -/// must retain admission across their capture and this operation, including -/// runtime restore/management probes, until completion or cancellation cleanup. -pub struct PreparedVoiceCompose { - session_id: SessionId, - context: Arc, - polisher: Arc, - task_spawner: Arc, - abort: futures_util::future::AbortHandle, - registration: std::sync::Mutex>, -} - -#[derive(Debug, Clone, serde::Serialize)] -#[serde(rename_all = "camelCase")] -pub struct VoiceComposePreview { - pub text: String, - pub provider_type: String, - pub model: Option, - pub prompt_kind: &'static str, -} - -impl PreparedVoiceCompose { - pub fn cancel(&self) { - self.abort.abort(); - let polisher = self.polisher.clone(); - let session = self.session_id; - self.task_spawner.spawn(Box::pin(async move { - let _ = polisher.cancel(session).await; - })); - } - - pub async fn compose(&self, instruction: String) -> Result { - if self.abort.is_aborted() { - return Err(BackendError::new( - BackendErrorCode::Cancelled, - "compose cancelled", - )); - } - let registration = self.registration.lock().unwrap().take().ok_or_else(|| { - BackendError::new(BackendErrorCode::InvalidState, "compose is one-shot") - })?; - if instruction.trim().is_empty() || instruction.len() > 128 * 1024 { - return Err(BackendError::new( - BackendErrorCode::InvalidArgument, - "invalid spoken instruction", - )); - } - let input = crate::prompts::voice_compose_user_prompt(&instruction, None); - let operation = self.polisher.polish( - self.session_id, - self.context.clone(), - input, - Arc::new(DiscardTextStream), - ); - let output = futures_util::future::Abortable::new(operation, registration) - .await - .map_err(|_| BackendError::new(BackendErrorCode::Cancelled, "compose cancelled"))??; - if self.abort.is_aborted() { - return Err(BackendError::new( - BackendErrorCode::Cancelled, - "compose cancelled", - )); - } - let text = - crate::selection_voice_intent::clean_selection_voice_compose_output(&output.text); - if text.is_empty() || text.len() > 128 * 1024 { - return Err(BackendError::new( - BackendErrorCode::Provider, - "invalid compose output", - )); - } - Ok(VoiceComposePreview { - text, - provider_type: self.context.llm.provider_type.clone(), - model: self.context.llm.model.clone(), - prompt_kind: "voice_compose", - }) - } -} - -impl Drop for PreparedVoiceCompose { - fn drop(&mut self) { - self.cancel(); - } -} - pub trait AuxiliaryApi: Send + Sync { - fn prepare_voice_compose( - &self, - ) -> BoxFuture<'static, Result, BackendError>> { - Box::pin(async { - Err(BackendError::new( - BackendErrorCode::Unsupported, - "voice compose is not configured", - )) - }) - } - fn repolish( &self, request: RepolishRequest, @@ -311,62 +212,6 @@ impl AuxiliaryService { } impl AuxiliaryApi for AuxiliaryService { - fn prepare_voice_compose( - &self, - ) -> BoxFuture<'static, Result, BackendError>> { - let service = self.clone_for_future(); - Box::pin(async move { - let preferences = service.preferences.get(); - let llm = crate::provider_resolution::resolve_session_provider( - &service.credential_store, - ProviderSlot::Llm, - &preferences.active_llm_provider, - ) - .await?; - let style = - crate::style_packs::builtin_style_pack_for_mode(crate::types::PolishMode::Light); - let mut context = DictationContext::capture( - &preferences, - &style, - DictationProviderInvocations::new( - ProviderInvocation::for_provider("compose-unused-asr"), - llm, - ProviderInvocation::for_provider("compose-unused-omni"), - ), - Vec::new(), - Vec::new(), - &DictationStartOptions { - insert_text: false, - ..Default::default() - }, - ); - context.pipeline_mode = crate::shared_types::PipelineMode::Traditional; - context.polish.style_system_prompt = crate::prompts::voice_compose_system_prompt(); - context.polish.translation_active = false; - context.polish.translation_target_language.clear(); - context.polish.hotwords.clear(); - context.polish.cursor_context = None; - context.polish.front_app = None; - context.polish.context_window_minutes = 0; - context.polish.prior_turns.clear(); - let context = Arc::new(context); - let polisher = service - .polisher - .prepare(context.clone()) - .await? - .unwrap_or(service.polisher); - let (abort, registration) = futures_util::future::AbortHandle::new_pair(); - Ok(Arc::new(PreparedVoiceCompose { - session_id: SessionId::new(), - context, - polisher, - task_spawner: service.task_spawner, - abort, - registration: std::sync::Mutex::new(Some(registration)), - })) - }) - } - fn repolish( &self, request: RepolishRequest, @@ -629,50 +474,6 @@ mod tests { } } - #[tokio::test] - async fn voice_compose_is_lazy_one_shot_and_cancellation_prevents_provider_start() { - let polisher = Arc::new(FixtureTextPolisher::successful("draft")); - let (service, path) = service( - polisher.clone(), - Arc::new(FixtureTranscriptionEngine::successful("unused", 0)), - ); - let prepared = service.prepare_voice_compose().await.unwrap(); - assert!(polisher.inputs().is_empty()); - let preview = prepared - .compose("Write an invitation".into()) - .await - .unwrap(); - assert_eq!(preview.text, "draft"); - assert_eq!(preview.prompt_kind, "voice_compose"); - assert_eq!( - polisher.inputs(), - vec![crate::prompts::voice_compose_user_prompt( - "Write an invitation", - None - )] - ); - assert_eq!( - prepared - .compose("second instruction".into()) - .await - .unwrap_err() - .code, - BackendErrorCode::InvalidState - ); - let cancelled = service.prepare_voice_compose().await.unwrap(); - cancelled.cancel(); - assert_eq!( - cancelled - .compose("never sent".into()) - .await - .unwrap_err() - .code, - BackendErrorCode::Cancelled - ); - assert_eq!(polisher.inputs().len(), 1); - let _ = std::fs::remove_file(path); - } - #[tokio::test] async fn untouched_builtin_raw_repolish_is_a_true_passthrough() { let (service, path) = service( diff --git a/openless-all/app/crates/openless-core/src/cloud_providers.rs b/openless-all/app/crates/openless-core/src/cloud_providers.rs index bce7e3933..4c38be0f5 100644 --- a/openless-all/app/crates/openless-core/src/cloud_providers.rs +++ b/openless-all/app/crates/openless-core/src/cloud_providers.rs @@ -1056,89 +1056,7 @@ enum CloudPolisherProvider { Gemini(crate::llm_gemini::GeminiProvider), } -// Read-only, selected-channel request credentials. SecretValue zeroizes on drop; -// no vault reference, serialization, diagnostics or mutation survives preparation. -struct FrozenPolishCredentials(Vec<(CredentialKey, crate::SecretValue)>); -impl FrozenPolishCredentials { - fn denied() -> BoxFuture<'static, Result> { - Box::pin(async { - Err(BackendError::new( - BackendErrorCode::Unsupported, - "immutable polish credentials", - )) - }) - } -} -impl CredentialStore for FrozenPolishCredentials { - fn status( - &self, - _: crate::UserPreferences, - ) -> BoxFuture<'static, Result> { - Self::denied() - } - fn read( - &self, - key: CredentialKey, - ) -> BoxFuture<'static, Result, BackendError>> { - let value = self - .0 - .iter() - .find(|(stored, _)| stored == &key) - .map(|(_, value)| value.clone()); - Box::pin(async move { Ok(value) }) - } - fn write( - &self, - _: CredentialKey, - _: crate::SecretValue, - ) -> BoxFuture<'static, Result<(), BackendError>> { - Self::denied() - } - fn remove(&self, _: CredentialKey) -> BoxFuture<'static, Result<(), BackendError>> { - Self::denied() - } -} - impl TextPolisher for SharedCloudTextPolisher { - fn prepare( - &self, - context: Arc, - ) -> BoxFuture<'static, Result>, BackendError>> { - let credentials = self.credentials.clone(); - Box::pin(async move { - // OAuth resolves external runtime state and cannot promise an immutable - // delayed invocation through this credential-only seam. - if context.llm.provider_type == crate::polish::CODEX_OAUTH_PROVIDER_ID { - return Err(BackendError::new( - BackendErrorCode::Unsupported, - "OAuth delayed compose is unsupported", - )); - } - let mut values = Vec::new(); - for account in [ - LLM_API_KEY_ACCOUNT, - LLM_ENDPOINT_ACCOUNT, - LLM_EXTRA_HEADERS_ACCOUNT, - LLM_TEMPERATURE_ACCOUNT, - ] - .into_iter() - .chain(crate::llm_protocol::CONFIG_ACCOUNTS) - { - let key = CredentialKey::new( - CredentialNamespace::Llm, - Some(context.llm.provider_id.clone()), - account, - )?; - if let Some(value) = credentials.read(key.clone()).await? { - values.push((key, value)); - } - } - Ok(Some(Arc::new(SharedCloudTextPolisher::new(Arc::new( - FrozenPolishCredentials(values), - ))) as Arc)) - }) - } - fn polish( &self, session_id: SessionId, diff --git a/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/registry.rs b/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/registry.rs index 66a16066d..3b7e806c1 100644 --- a/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/registry.rs +++ b/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/registry.rs @@ -368,13 +368,6 @@ pub const PREFERENCE_FIELDS: &[PreferenceField] = &[ shape: PreferenceShape::TextList, reason: "portable_setting", }, - PreferenceField { - rust_name: "translation_target_languages", - key: "translationTargetLanguages", - class: PreferenceClass::Portable, - shape: PreferenceShape::TextList, - reason: "portable_setting", - }, PreferenceField { rust_name: "translation_target_language", key: "translationTargetLanguage", diff --git a/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/tests.rs b/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/tests.rs index eb2e6ccb8..d3d9688c0 100644 --- a/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/tests.rs +++ b/openless-all/app/crates/openless-core/src/cloud_sync_e2ee_documents/tests.rs @@ -108,22 +108,6 @@ fn all_current_preference_fields_have_an_explicit_registration() { .map(|(name, _)| name) }) .collect(); - // Wire-presence metadata is not persisted or synced. Verify the explicit - // exception against actual serialization rather than exempting new fields. - let metadata = ["translation_target_languages_present", "translation_target_language_input"]; - let prefs = crate::shared_types::UserPreferences { - translation_target_languages_present: true, - translation_target_language_input: Some("en".into()), - ..Default::default() - }; - let serialized = serde_json::to_value(prefs).unwrap(); - assert!(serialized.get("translationTargetLanguagesPresent").is_none()); - assert!(serialized.get("translationTargetLanguageInput").is_none()); - assert!(metadata.iter().all(|name| serialized.get(*name).is_none())); - let names: std::collections::BTreeSet<_> = names - .into_iter() - .filter(|name| !metadata.contains(name)) - .collect(); let registered: std::collections::BTreeSet<_> = registry::PREFERENCE_FIELDS .iter() .map(|field| field.rust_name) diff --git a/openless-all/app/crates/openless-core/src/dictation_context.rs b/openless-all/app/crates/openless-core/src/dictation_context.rs index 495952a72..b82b76a0e 100644 --- a/openless-all/app/crates/openless-core/src/dictation_context.rs +++ b/openless-all/app/crates/openless-core/src/dictation_context.rs @@ -43,9 +43,6 @@ pub enum DictationOutputTarget { #[derive(Debug, Clone, PartialEq, Eq)] pub struct DictationStartOptions { pub translation_requested: bool, - /// Configured target for this session only; None uses the legacy selected target. - /// Selecting a target does not request translation or enable any provider. - pub translation_target_language: Option, pub audio_source: DictationAudioSource, pub insert_text: bool, pub output_target: DictationOutputTarget, @@ -58,7 +55,6 @@ impl Default for DictationStartOptions { fn default() -> Self { Self { translation_requested: false, - translation_target_language: None, audio_source: DictationAudioSource::Microphone, insert_text: true, output_target: DictationOutputTarget::ForegroundApp, @@ -132,8 +128,6 @@ pub struct DictationPolishContext { pub hotwords: Vec, pub working_languages: Vec, pub translation_target_language: String, - /// True when the start options explicitly selected the snapshotted target. - pub translation_target_explicit: bool, pub translation_active: bool, pub edit_plan_input: bool, /// Selected text uses its own prompt envelope, separate from voice transcripts. @@ -258,12 +252,8 @@ impl DictationContext { omni, } = providers; let hotwords = normalize_hotwords(hotwords); - let translation_target_language = crate::settings::canonical_translation_target( - options - .translation_target_language - .as_deref() - .unwrap_or(&preferences.translation_target_language), - ); + let translation_target_language = + preferences.translation_target_language.trim().to_string(); let translation_active = translation_effective( options.translation_requested, &translation_target_language, @@ -367,7 +357,6 @@ impl DictationContext { hotwords, working_languages: preferences.working_languages.clone(), translation_target_language, - translation_target_explicit: options.translation_target_language.is_some(), translation_active, edit_plan_input: false, selection_input: false, @@ -824,56 +813,6 @@ mod tests { assert_eq!(local_asr_fallback(&no_model, &cloud_asr(), true), None); } - #[test] - fn explicit_translation_target_preserves_working_language_suppression_and_raw_mode() { - let preferences = UserPreferences { - default_mode: PolishMode::Raw, - working_languages: vec!["English".into()], - translation_target_language: "日本語".into(), - ..Default::default() - }; - let capture = |requested, target| { - DictationContext::capture( - &preferences, - &builtin_style_pack_for_mode(PolishMode::Raw), - DictationProviderInvocations::new( - ProviderInvocation::for_provider("local-qwen3"), - ProviderInvocation::for_provider("original-llm"), - ProviderInvocation::for_provider("original-omni"), - ), - vec![], - vec![], - &DictationStartOptions { - translation_requested: requested, - translation_target_language: target, - ..Default::default() - }, - ) - }; - let suppressed = capture(true, Some("en".into())); - assert_eq!(suppressed.polish.translation_target_language, "English"); - assert!(suppressed.polish.translation_target_explicit); - assert!(!suppressed.polish.translation_active); - assert!(!suppressed.uses_llm_polisher()); - assert!( - !suppressed - .with_translation_requested(true) - .polish - .translation_active - ); - let selected_only = capture(false, Some("ja".into())); - assert!(!selected_only.uses_llm_polisher()); - let translated = capture(true, Some("ja".into())); - assert!(translated.polish.translation_active); - assert!(translated.uses_llm_polisher()); - assert_eq!(translated.asr.provider_id, "local-qwen3"); - assert_eq!(translated.llm.provider_id, "original-llm"); - let legacy = capture(true, None); - assert!(!legacy.polish.translation_target_explicit); - assert_eq!(legacy.polish.translation_target_language, "日本語"); - assert!(legacy.polish.translation_active); - } - #[test] fn selection_polish_uses_the_selected_text_envelope() { let mut context = DictationContext::default(); diff --git a/openless-all/app/crates/openless-core/src/dictation_engine.rs b/openless-all/app/crates/openless-core/src/dictation_engine.rs index d4f951552..f8d3d58ee 100644 --- a/openless-all/app/crates/openless-core/src/dictation_engine.rs +++ b/openless-all/app/crates/openless-core/src/dictation_engine.rs @@ -1011,13 +1011,6 @@ impl DictationEngine for PipelineDictationEngine { let skips_polish_for_short_text = context.skips_polish_for_short_text(&transcript.text); // Optional polish may be skipped after fallback; an explicit translation is still required. let translation_active = context.polish.translation_active; - // Explicit per-session translation must not succeed with untransformed text. - let require_translation = translation_active && context.polish.translation_target_explicit; - let policy = if require_translation { - PolishFailurePolicy::Fail - } else { - policy - }; let uses_polisher = context.uses_llm_polisher() && !(context.voice_activation.is_some() && transcript.text.trim().is_empty()) && !skips_polish_for_short_text @@ -1070,16 +1063,6 @@ impl DictationEngine for PipelineDictationEngine { ) .await }; - let output = output.and_then(|value| { - if require_translation && value.text.trim().is_empty() { - Err(BackendError::new( - BackendErrorCode::Provider, - "translation returned empty text", - )) - } else { - Ok(value) - } - }); let result = match output { Ok(text) => (text, false), // Offline after local recognition: the raw transcript is the @@ -3827,37 +3810,6 @@ mod tests { assert_eq!(result.polished_text, "raw text"); } - #[tokio::test] - async fn requested_translation_failure_never_becomes_successful_source_text() { - for output in [ - Err(BackendError::new( - BackendErrorCode::Provider, - "fixture HTTP 500", - )), - Ok(crate::ports::PolishOutput::text(" ")), - ] { - let fixture = fixture_engine(false, output, None, None); - let id = SessionId::new(); - let mut context = DictationContext::default(); - context.polish.translation_active = true; - context.polish.translation_target_language = "English".into(); - context.polish.translation_target_explicit = true; - fixture - .engine - .start(id, Arc::new(context), fixture.progress.clone()) - .await - .unwrap(); - let failure = fixture - .engine - .finish(id, fixture.progress.clone()) - .await - .unwrap_err(); - assert_eq!(failure.error.code, BackendErrorCode::Provider); - assert_eq!(failure.raw_text.as_deref(), Some("raw text")); - assert!(fixture.engine.sessions.lock().unwrap().is_empty()); - } - } - #[tokio::test] async fn voice_activation_commands_are_cleaned_before_correction_and_polishing() { use crate::testing::{ diff --git a/openless-all/app/crates/openless-core/src/language_catalog.rs b/openless-all/app/crates/openless-core/src/language_catalog.rs index b8ac2f0c1..6bcfcf273 100644 --- a/openless-all/app/crates/openless-core/src/language_catalog.rs +++ b/openless-all/app/crates/openless-core/src/language_catalog.rs @@ -43,14 +43,6 @@ pub fn language_code(value: &str) -> Option { language(value).map(|language| language.code.clone()) } -/// Ordered catalog choices; provider support is checked separately. -pub fn translation_language_names() -> Vec { - LANGUAGES - .iter() - .map(|language| language.native_name.clone()) - .collect() -} - pub fn asr_language_code(native_name: &str) -> Option { language(native_name).map(|language| language.asr_code.clone()) } @@ -63,22 +55,6 @@ pub fn apple_speech_locale(native_name: &str) -> Option { mod tests { use super::*; - #[test] - fn translation_names_and_aliases_share_the_existing_catalog() { - let names = translation_language_names(); - assert!(names.len() > 3); - for (index, name) in names.iter().enumerate() { - assert!(!names[..index].contains(name)); - assert_eq!(native_language_name(name).as_ref(), Some(name)); - } - assert_eq!(native_language_name(" EN ").as_deref(), Some("English")); - assert_eq!( - native_language_name("繁體中文").as_deref(), - Some("繁体中文") - ); - assert_eq!(native_language_name("unknown"), None); - } - #[test] fn extended_names_route_to_iso_and_apple_identifiers() { for (name, code, locale) in [ diff --git a/openless-all/app/crates/openless-core/src/ports.rs b/openless-all/app/crates/openless-core/src/ports.rs index e5c8e58ff..66dfa69f4 100644 --- a/openless-all/app/crates/openless-core/src/ports.rs +++ b/openless-all/app/crates/openless-core/src/ports.rs @@ -780,15 +780,6 @@ impl PreparedTranscription for DeferredDictationPre } pub trait TextPolisher: Send + Sync { - /// Freeze request credentials/options for a delayed operation without provider network I/O. - /// Adapters with no mutable request configuration may keep their runtime. - fn prepare( - &self, - _context: Arc, - ) -> BoxFuture<'static, Result>, BackendError>> { - Box::pin(async { Ok(None) }) - } - fn polish( &self, session_id: SessionId, diff --git a/openless-all/app/crates/openless-core/src/preference_patch.rs b/openless-all/app/crates/openless-core/src/preference_patch.rs index 07e176ecc..411a4b5fd 100644 --- a/openless-all/app/crates/openless-core/src/preference_patch.rs +++ b/openless-all/app/crates/openless-core/src/preference_patch.rs @@ -18,9 +18,7 @@ pub fn patch_preferences( if let Some(mode) = edits.get("/capsuleDisplayMode") { document["capsuleDisplayModeV2"] = mode.clone(); } - let mut patched = serde_json::from_value(document).map_err(invalid)?; - crate::settings::reconcile_translation_settings(current, &mut patched)?; - Ok(patched) + serde_json::from_value(document).map_err(invalid) } fn invalid(error: impl std::fmt::Display) -> BackendError { @@ -54,24 +52,6 @@ pub fn update_fields( #[cfg(test)] mod tests { use super::*; - - #[test] - fn translation_drafts_survive_rebasing_and_serialization_before_save() { - let current = UserPreferences::default(); - let edits = BTreeMap::from([("/translationTargetLanguage".into(), Value::from("ko"))]); - let draft = patch_preferences(¤t, &edits).unwrap(); - assert_eq!(draft.translation_target_language, "한국어"); - assert_eq!(draft.translation_target_languages, vec!["한국어"]); - let loaded: UserPreferences = serde_json::from_value(serde_json::to_value(&draft).unwrap()).unwrap(); - assert_eq!(loaded.translation_target_language, draft.translation_target_language); - assert_eq!(loaded.translation_target_languages, draft.translation_target_languages); - let cleared = patch_preferences(&loaded, &BTreeMap::from([ - ("/translationTargetLanguages".into(), serde_json::json!([])), - ])).unwrap(); - assert!(cleared.translation_target_language.is_empty()); - assert!(cleared.translation_target_languages.is_empty()); - } - #[test] fn capsule_display_edits_establish_v2_without_opt_in_from_unrelated_edits() { let mut current = UserPreferences::default(); diff --git a/openless-all/app/crates/openless-core/src/preferences.rs b/openless-all/app/crates/openless-core/src/preferences.rs index 129f2a336..817d7663e 100644 --- a/openless-all/app/crates/openless-core/src/preferences.rs +++ b/openless-all/app/crates/openless-core/src/preferences.rs @@ -266,7 +266,6 @@ impl PreferencesStore { } pub fn set(&self, mut preferences: UserPreferences) -> Result<(), BackendError> { - crate::settings::reconcile_translation_settings(&self.get(), &mut preferences)?; self.update(|current| { // The sync transaction owns this field; stale whole-document saves cannot reroute its token. preferences.sync_custom_server_origin = current.sync_custom_server_origin.clone(); @@ -371,7 +370,6 @@ impl PreferencesStore { &self, mut preferences: UserPreferences, ) -> Result<(), BackendError> { - crate::settings::reconcile_translation_settings(&self.get(), &mut preferences)?; self.update(|current| { preferences.preserve_style_preferences_from(current); preferences.sync_custom_server_origin = current.sync_custom_server_origin.clone(); diff --git a/openless-all/app/crates/openless-core/src/provider_registry.rs b/openless-all/app/crates/openless-core/src/provider_registry.rs index 1112e0fe8..3f5c973b6 100644 --- a/openless-all/app/crates/openless-core/src/provider_registry.rs +++ b/openless-all/app/crates/openless-core/src/provider_registry.rs @@ -136,17 +136,6 @@ impl TextPolisherRouter { } impl TextPolisher for TextPolisherRouter { - fn prepare( - &self, - context: Arc, - ) -> BoxFuture<'static, Result>, BackendError>> { - let provider = match self.resolve(&context.llm.provider_type) { - Ok(provider) => provider, - Err(error) => return Box::pin(async move { Err(error) }), - }; - Box::pin(async move { Ok(Some(provider.prepare(context).await?.unwrap_or(provider))) }) - } - fn polish( &self, session_id: SessionId, diff --git a/openless-all/app/crates/openless-core/src/settings.rs b/openless-all/app/crates/openless-core/src/settings.rs index ad33194bb..51600f8d8 100644 --- a/openless-all/app/crates/openless-core/src/settings.rs +++ b/openless-all/app/crates/openless-core/src/settings.rs @@ -19,125 +19,6 @@ pub(crate) fn ensure_testing_features_enabled( } } -/// Preserve historical custom names on load, while canonicalizing catalog aliases. -pub(crate) fn canonical_translation_target(value: &str) -> String { - crate::language_catalog::native_language_name(value).unwrap_or_else(|| value.trim().to_string()) -} - -pub(crate) fn ordered_translation_targets(values: Vec) -> Vec { - let mut targets = Vec::new(); - for value in values { - let value = canonical_translation_target(&value); - if !value.is_empty() && !targets.contains(&value) { - targets.push(value); - } - } - targets -} - -pub(crate) fn migrate_translation_targets( - targets: Option>, - selected: &str, -) -> (Vec, String) { - let selected = canonical_translation_target(selected); - let mut targets = - ordered_translation_targets(targets.unwrap_or_else(|| vec![selected.clone()])); - // A nonempty legacy selection remains authoritative when an older client - // round-trips a newly introduced list it does not know how to update. - if !targets.is_empty() && !selected.is_empty() && !targets.contains(&selected) { - targets.push(selected.clone()); - } - let selected = if targets.is_empty() { - String::new() - } else { - selected - }; - (targets, selected) -} - -/// A missing list is a legacy scalar-only update, not permission to erase targets. -/// Unknown names already stored by an older client remain usable, but cannot be newly added. -pub(crate) fn reconcile_translation_settings( - previous: &UserPreferences, - next: &mut UserPreferences, -) -> Result<(), BackendError> { - let (previous_targets, previous_selected) = migrate_translation_targets( - if previous.translation_target_languages.is_empty() - && !previous.translation_target_languages_present - { - None - } else { - Some(previous.translation_target_languages.clone()) - }, - &previous.translation_target_language, - ); - // A legacy client can echo the initially empty list while selecting its first language. - // An empty list replacing stored choices remains an explicit deletion. - let input = if previous_targets.is_empty() && next.translation_target_languages.is_empty() { - next.translation_target_language_input.as_deref() - .unwrap_or(&next.translation_target_language) - } else { - &next.translation_target_language - }; - let selected = canonical_translation_target(input); - let mut targets = if next.translation_target_languages_present { - ordered_translation_targets(next.translation_target_languages.clone()) - } else { - previous_targets.clone() - }; - // Scalar-only clients (including existing Rust callers editing a snapshot) select - // a target without replacing the ordered collection. Explicit [] always clears. - if (!next.translation_target_languages_present - || (targets == previous_targets && selected != previous_selected)) - && !selected.is_empty() - && !targets.contains(&selected) - { - targets.push(selected.clone()); - } - for target in &targets { - if crate::language_catalog::native_language_name(target).is_none() - && !previous_targets.contains(target) - { - return Err(BackendError::new( - crate::errors::BackendErrorCode::InvalidArgument, - format!("unknown translation target: {target}"), - )); - } - } - let selected = if !selected.is_empty() && !targets.contains(&selected) { - targets.first().cloned().unwrap_or_default() - } else { - selected - }; - let (targets, selected) = migrate_translation_targets(Some(targets), &selected); - next.translation_target_languages = targets; - next.translation_target_language = selected; - next.translation_target_languages_present = true; - next.translation_target_language_input = None; - Ok(()) -} - -pub(crate) fn validate_session_translation_target( - preferences: &UserPreferences, - target: &str, -) -> Result { - let target = canonical_translation_target(target); - let mut targets = ordered_translation_targets(preferences.translation_target_languages.clone()); - if !preferences.translation_target_languages_present { - let legacy = canonical_translation_target(&preferences.translation_target_language); - if !legacy.is_empty() && !targets.contains(&legacy) { - targets.push(legacy); - } - } - if target.is_empty() || !targets.contains(&target) { - return Err(BackendError::new( - crate::errors::BackendErrorCode::InvalidArgument, - "session translation target must be a configured nonempty target", - )); - } - Ok(target) -} - #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum SettingsCollisionPolicy { @@ -411,141 +292,3 @@ mod tests { assert!(!tsf_with_hidden_pref.windows_show_openless_in_keyboard_list); } } - -#[cfg(test)] -mod translation_targets_tests { - use super::*; - use serde_json::json; - - #[test] - fn empty_list_roundtrip_allows_the_first_legacy_selection_but_explicit_clear_still_wins() { - let previous = UserPreferences::default(); - let mut document = serde_json::to_value(&previous).unwrap(); - document["translationTargetLanguage"] = json!("ko"); - let mut next: UserPreferences = serde_json::from_value(document).unwrap(); - reconcile_translation_settings(&previous, &mut next).unwrap(); - assert_eq!(next.translation_target_language, "한국어"); - assert_eq!(next.translation_target_languages, vec!["한국어"]); - let previous = next; - let mut document = serde_json::to_value(&previous).unwrap(); - document["translationTargetLanguages"] = json!([]); - let mut cleared: UserPreferences = serde_json::from_value(document).unwrap(); - reconcile_translation_settings(&previous, &mut cleared).unwrap(); - assert!(cleared.translation_target_language.is_empty()); - assert!(cleared.translation_target_languages.is_empty()); - } - - #[test] - fn legacy_selected_target_seeds_list_and_preserves_custom_names() { - for (input, expected) in [ - (" en ", "English"), - (" My historical language ", "My historical language"), - ] { - let preferences: UserPreferences = serde_json::from_value(json!({ - "translationTargetLanguage": input, - })) - .unwrap(); - assert_eq!(preferences.translation_target_languages, vec![expected]); - assert_eq!(preferences.translation_target_language, expected); - assert!(!preferences.translation_target_languages_present); - } - let defaults: UserPreferences = serde_json::from_value(json!({})).unwrap(); - assert!(defaults.translation_target_languages.is_empty()); - assert!(defaults.translation_target_language.is_empty()); - } - - #[test] - fn explicit_targets_canonicalize_dedupe_keep_order_and_validate_selection() { - let preferences: UserPreferences = serde_json::from_value(json!({ - "translationTargetLanguages": ["ja", " en ", "English", "", "繁體中文", "zh-TW"], - "translationTargetLanguage": "en", - })) - .unwrap(); - assert_eq!( - preferences.translation_target_languages, - vec!["日本語", "English", "繁体中文"] - ); - assert_eq!(preferences.translation_target_language, "English"); - assert!(preferences.translation_target_languages_present); - let invalid_selection: UserPreferences = serde_json::from_value(json!({ - "translationTargetLanguages": ["ja", "en"], - "translationTargetLanguage": "fr", - })) - .unwrap(); - assert_eq!(invalid_selection.translation_target_language, "Français"); - assert_eq!( - invalid_selection.translation_target_languages, - vec!["日本語", "English", "Français"] - ); - } - - #[test] - fn explicit_empty_list_clears_selected_target_and_marker_is_not_wire_data() { - let preferences: UserPreferences = serde_json::from_value(json!({ - "translationTargetLanguages": [], - "translationTargetLanguage": "en", - "translationTargetLanguagesPresent": false, - })) - .unwrap(); - assert!(preferences.translation_target_languages_present); - assert!(preferences.translation_target_languages.is_empty()); - assert!(preferences.translation_target_language.is_empty()); - let value = serde_json::to_value(preferences).unwrap(); - assert!(value.get("translationTargetLanguagesPresent").is_none()); - let forged: UserPreferences = serde_json::from_value(json!({ - "translationTargetLanguage": "en", - "translationTargetLanguagesPresent": true, - })) - .unwrap(); - assert!(!forged.translation_target_languages_present); - } - - #[test] - fn unknown_new_additions_fail_but_historical_targets_survive() { - let previous: UserPreferences = serde_json::from_value(json!({ - "translationTargetLanguage": "Historical custom target", - })) - .unwrap(); - let mut next = previous.clone(); - reconcile_translation_settings(&previous, &mut next).unwrap(); - assert_eq!( - next.translation_target_languages, - vec!["Historical custom target"] - ); - assert_eq!( - validate_session_translation_target(&next, "Historical custom target").unwrap(), - "Historical custom target" - ); - next.translation_target_languages - .push("Unknown new target".into()); - assert_eq!( - reconcile_translation_settings(&previous, &mut next) - .unwrap_err() - .code, - crate::errors::BackendErrorCode::InvalidArgument - ); - } - - #[test] - fn old_client_scalar_updates_preserve_order_and_disabled_selection() { - let previous: UserPreferences = serde_json::from_value(json!({ - "translationTargetLanguages": ["en", "ja"], - "translationTargetLanguage": "en", - })) - .unwrap(); - for (scalar, selected, targets) in [ - ("en", "English", vec!["English", "日本語"]), - ("ja", "日本語", vec!["English", "日本語"]), - ("fr", "Français", vec!["English", "日本語", "Français"]), - ("", "", vec!["English", "日本語"]), - ] { - let mut next: UserPreferences = serde_json::from_value(json!({ - "translationTargetLanguage": scalar, - })) - .unwrap(); - reconcile_translation_settings(&previous, &mut next).unwrap(); - assert_eq!(next.translation_target_languages, targets); - assert_eq!(next.translation_target_language, selected); - } - } -} diff --git a/openless-all/app/crates/openless-core/src/shared_types.rs b/openless-all/app/crates/openless-core/src/shared_types.rs index f2ad5f277..ddb570f96 100644 --- a/openless-all/app/crates/openless-core/src/shared_types.rs +++ b/openless-all/app/crates/openless-core/src/shared_types.rs @@ -551,21 +551,12 @@ pub struct UserPreferences { /// model knows which languages the user works in. See issue #4. #[serde(default = "default_working_languages")] pub working_languages: Vec, - /// Legacy selected translation target (canonical native name, or a preserved custom name). - /// Empty disables legacy translation gestures without erasing configured choices. + /// Translation output target language (single-select, native name). + /// Empty = translation mode off (Shift combos are inert). The frontend + /// picks from the built-in language list; the backend just splices the + /// native name into the prompt. See issue #4. #[serde(default)] pub translation_target_language: String, - /// Ordered, duplicate-free translation choices, separate from working/ASR/UI languages. - #[serde(default)] - pub translation_target_languages: Vec, - /// Wire presence distinguishes an old client's whole-document save from explicit deletion. - #[doc(hidden)] - #[serde(skip)] - pub translation_target_languages_present: bool, - /// Retains the submitted scalar until an empty list can be reconciled with stored choices. - #[doc(hidden)] - #[serde(skip)] - pub translation_target_language_input: Option, /// Chinese output script preference (not exposed as a UI switch): /// - Simplified: prefer simplified for Chinese output /// - Traditional: prefer traditional for Chinese output @@ -1102,8 +1093,6 @@ struct UserPreferencesWire { windows_show_openless_in_keyboard_list: bool, working_languages: Vec, translation_target_language: String, - #[serde(default)] - translation_target_languages: Option>, chinese_script_preference: ChineseScriptPreference, #[serde(default)] output_language_preference: OutputLanguagePreference, @@ -1357,7 +1346,6 @@ impl Default for UserPreferencesWire { windows_show_openless_in_keyboard_list: prefs.windows_show_openless_in_keyboard_list, working_languages: prefs.working_languages, translation_target_language: prefs.translation_target_language, - translation_target_languages: None, chinese_script_preference: prefs.chinese_script_preference, output_language_preference: prefs.output_language_preference, qa_hotkey: prefs.qa_hotkey, @@ -1482,15 +1470,6 @@ impl<'de> Deserialize<'de> for UserPreferences { selection_polish_hotkey = None; } } - let translation_target_languages_present = wire.translation_target_languages.is_some(); - let translation_target_language_input = wire.translation_target_languages.as_ref() - .filter(|targets| targets.is_empty()) - .map(|_| wire.translation_target_language.clone()); - let (translation_target_languages, translation_target_language) = - crate::settings::migrate_translation_targets( - wire.translation_target_languages, - &wire.translation_target_language, - ); let streaming_insert_default_migrated = wire.streaming_insert_default_migrated; let streaming_insert = if streaming_insert_default_migrated { wire.streaming_insert @@ -1596,10 +1575,7 @@ impl<'de> Deserialize<'de> for UserPreferences { ), windows_show_openless_in_keyboard_list: wire.windows_show_openless_in_keyboard_list, working_languages: wire.working_languages, - translation_target_language, - translation_target_languages, - translation_target_languages_present, - translation_target_language_input, + translation_target_language: wire.translation_target_language, chinese_script_preference: wire.chinese_script_preference, output_language_preference: wire.output_language_preference, qa_hotkey: if cfg!(target_os = "linux") { wire.qa_hotkey } else { None }, // retired desktop follow-up shortcut @@ -1990,9 +1966,6 @@ impl Default for UserPreferences { windows_show_openless_in_keyboard_list: true, working_languages: default_working_languages(), translation_target_language: String::new(), - translation_target_languages: Vec::new(), - translation_target_languages_present: false, - translation_target_language_input: None, chinese_script_preference: ChineseScriptPreference::Auto, output_language_preference: OutputLanguagePreference::Auto, qa_hotkey: default_qa_hotkey(), diff --git a/openless-all/app/linux-egui/src/linux_app/settings_save.rs b/openless-all/app/linux-egui/src/linux_app/settings_save.rs index c0deb0aa6..d7e83d1b4 100644 --- a/openless-all/app/linux-egui/src/linux_app/settings_save.rs +++ b/openless-all/app/linux-egui/src/linux_app/settings_save.rs @@ -915,9 +915,6 @@ mod tests { external.microphone_device_name = "external microphone".into(); let merged = openless_linux_egui::patch_preferences(&external, &edits).unwrap(); draft.microphone_device_name = external.microphone_device_name; - // Core normalizes the selection and its target list before rebasing the UI draft. - draft.translation_target_language = "한국어".into(); - draft.translation_target_languages = vec!["한국어".into()]; assert_eq!( serde_json::to_value(merged).unwrap(), serde_json::to_value(draft).unwrap() diff --git a/openless-all/app/linux-egui/src/preference_patch.rs b/openless-all/app/linux-egui/src/preference_patch.rs index 0871556bb..3a101bf00 100644 --- a/openless-all/app/linux-egui/src/preference_patch.rs +++ b/openless-all/app/linux-egui/src/preference_patch.rs @@ -119,15 +119,6 @@ mod tests { }]; let initial = serde_json::to_value(initial).unwrap(); let changed = serde_json::to_value(changed).unwrap(); - let expected = |key: &str, value: &Value| { - if key == "translationTargetLanguage" { - Value::String(openless_core::language_catalog::native_language_name( - value.as_str().unwrap(), - ).unwrap()) - } else { - value.clone() - } - }; for (key, value) in changed.as_object().unwrap() { if initial[key] == *value { continue; @@ -159,7 +150,7 @@ mod tests { "{key} must retry exactly the revision conflict" ); let saved = serde_json::to_value(backend.get_preferences()).unwrap(); - assert_eq!(saved[key], expected(key, value), "{key}"); + assert_eq!(saved[key], *value, "{key}"); assert_eq!(saved["microphoneDeviceName"], key.as_str()); } drop(host); @@ -175,7 +166,7 @@ mod tests { let saved = serde_json::to_value(reopened.get_preferences()).unwrap(); for (key, value) in changed.as_object().unwrap() { if initial[key] != *value { - assert_eq!(saved[key], expected(key, value), "persisted {key}"); + assert_eq!(saved[key], *value, "persisted {key}"); } } drop(reopened); diff --git a/openless-all/ios/.gitattributes b/openless-all/ios/.gitattributes index beea03bfa..9e6de3525 100644 --- a/openless-all/ios/.gitattributes +++ b/openless-all/ios/.gitattributes @@ -1,2 +1,4 @@ # Preserve upstream license text, including its original whitespace. Resources/Licenses/**/*.txt -whitespace +# Unified patch context includes significant whitespace prefixes. +CoreHost/Patches/*.patch -whitespace diff --git a/openless-all/ios/CoreHost/Cargo.lock b/openless-all/ios/CoreHost/Cargo.lock index b22e4d8df..69ae4c87f 100644 --- a/openless-all/ios/CoreHost/Cargo.lock +++ b/openless-all/ios/CoreHost/Cargo.lock @@ -1381,8 +1381,10 @@ dependencies = [ "micyou-dsp", "once_cell", "parking_lot", + "rand 0.8.8", "regex", "reqwest", + "rsa", "serde", "serde_json", "sha1", diff --git a/openless-all/ios/CoreHost/Cargo.toml b/openless-all/ios/CoreHost/Cargo.toml index ee8d4e6b9..a8301490d 100644 --- a/openless-all/ios/CoreHost/Cargo.toml +++ b/openless-all/ios/CoreHost/Cargo.toml @@ -9,9 +9,12 @@ publish = false crate-type = ["staticlib", "rlib"] [workspace] +members = [".build/core-source/crates/openless-core"] +exclude = [".build/core-source/crates/micyou-dsp", ".build/core-source/crates/micyou-infer"] +resolver = "2" [dependencies] -openless-core = { path = "../../app/crates/openless-core" } +openless-core = { path = ".build/core-source/crates/openless-core" } futures-util = "0.3" tokio = { version = "1", features = ["rt-multi-thread", "sync", "time"] } serde = { version = "1", features = ["derive"] } diff --git a/openless-all/ios/CoreHost/Patches/ios-input-contracts.patch b/openless-all/ios/CoreHost/Patches/ios-input-contracts.patch new file mode 100644 index 000000000..b11789cb0 --- /dev/null +++ b/openless-all/ios/CoreHost/Patches/ios-input-contracts.patch @@ -0,0 +1,1682 @@ +diff --git a/crates/openless-core/src/api.rs b/crates/openless-core/src/api.rs +index ab3a2a08..b6e5305a 100644 +--- a/crates/openless-core/src/api.rs ++++ b/crates/openless-core/src/api.rs +@@ -5753,7 +5753,13 @@ impl OpenLessBackend { + }; + // Keep finalization outside this critical section. A failed save changes neither + // the active target nor the remembered choice, and no other preference is overwritten. +- self.preferences.update(|preferences| preferences.translation_target_language = target)?; ++ self.preferences.update(|preferences| { ++ if !preferences.translation_target_languages.contains(&target) { ++ preferences.translation_target_languages.push(target.clone()); ++ } ++ preferences.translation_target_language = target; ++ preferences.translation_target_languages_present = true; ++ })?; + state.dictation_context = Some(Arc::new(updated)); + // The common stop boundary must also send the changed context to a streaming engine. + state.dictation_translation_requested = Some(true); +@@ -6589,6 +6595,146 @@ impl OpenLessBackend { + self.preferences.get() + } + ++ /// Replace the ordered target choices. Removing the selection chooses the first ++ /// remaining target; an empty list clears/disables the legacy selected target. ++ pub fn set_translation_targets( ++ &self, ++ targets: Vec, ++ ) -> Result { ++ self.update_translation_targets(|preferences| { ++ preferences.translation_target_languages = targets; ++ let targets = crate::settings::ordered_translation_targets( ++ preferences.translation_target_languages.clone(), ++ ); ++ if !targets.contains(&preferences.translation_target_language) { ++ preferences.translation_target_language = ++ targets.first().cloned().unwrap_or_default(); ++ } ++ Ok(()) ++ }) ++ } ++ ++ /// Add a catalog target once, at the end. The first addition becomes selected. ++ pub fn add_translation_target( ++ &self, ++ target: String, ++ ) -> Result { ++ self.update_translation_targets(|preferences| { ++ let target = crate::settings::canonical_translation_target(&target); ++ if target.is_empty() { ++ return Err(BackendError::new( ++ BackendErrorCode::InvalidArgument, ++ "empty translation target", ++ )); ++ } ++ if preferences.translation_target_languages.is_empty() { ++ preferences.translation_target_language = target.clone(); ++ } ++ if !preferences.translation_target_languages.contains(&target) { ++ preferences.translation_target_languages.push(target); ++ } ++ Ok(()) ++ }) ++ } ++ ++ /// Deletion is idempotent. Deleting the selection chooses the first remaining target. ++ pub fn delete_translation_target( ++ &self, ++ target: String, ++ ) -> Result { ++ self.update_translation_targets(|preferences| { ++ let target = crate::settings::canonical_translation_target(&target); ++ preferences ++ .translation_target_languages ++ .retain(|value| value != &target); ++ if !target.is_empty() && preferences.translation_target_language == target { ++ preferences.translation_target_language = preferences ++ .translation_target_languages ++ .first() ++ .cloned() ++ .unwrap_or_default(); ++ } ++ Ok(()) ++ }) ++ } ++ ++ /// Reorder only: omissions, additions and duplicates are rejected atomically. ++ pub fn reorder_translation_targets( ++ &self, ++ targets: Vec, ++ ) -> Result { ++ self.update_translation_targets(|preferences| { ++ let ordered = crate::settings::ordered_translation_targets(targets.clone()); ++ if ordered.len() != targets.len() ++ || ordered.len() != preferences.translation_target_languages.len() ++ || ordered ++ .iter() ++ .any(|target| !preferences.translation_target_languages.contains(target)) ++ { ++ return Err(BackendError::new( ++ BackendErrorCode::InvalidArgument, ++ "translation target reorder must be an exact permutation", ++ )); ++ } ++ preferences.translation_target_languages = ordered; ++ Ok(()) ++ }) ++ } ++ ++ /// Select a configured target, or disable legacy translation without erasing choices. ++ pub fn select_translation_target( ++ &self, ++ target: Option, ++ ) -> Result { ++ self.update_translation_targets(|preferences| { ++ preferences.translation_target_language = match target { ++ Some(target) => { ++ crate::settings::validate_session_translation_target(preferences, &target)? ++ } ++ None => String::new(), ++ }; ++ Ok(()) ++ }) ++ } ++ ++ fn update_translation_targets( ++ &self, ++ update: impl FnOnce(&mut UserPreferences) -> Result<(), BackendError>, ++ ) -> Result { ++ self.ensure_runtime_ready()?; ++ let _write_guard = self ++ .settings_write_gate ++ .lock() ++ .unwrap_or_else(std::sync::PoisonError::into_inner); ++ let previous = self.preferences.get(); ++ let mut preferences = previous.clone(); ++ let (targets, selected) = crate::settings::migrate_translation_targets( ++ if preferences.translation_target_languages_present { ++ Some(preferences.translation_target_languages.clone()) ++ } else { ++ None ++ }, ++ &preferences.translation_target_language, ++ ); ++ preferences.translation_target_languages = targets; ++ preferences.translation_target_language = selected; ++ preferences.translation_target_languages_present = true; ++ update(&mut preferences)?; ++ crate::settings::reconcile_translation_settings(&previous, &mut preferences)?; ++ // Own only these fields, not a potentially stale whole-document snapshot. ++ self.preferences.update(|current| { ++ current.translation_target_languages = preferences.translation_target_languages.clone(); ++ current.translation_target_language = preferences.translation_target_language.clone(); ++ current.translation_target_languages_present = true; ++ })?; ++ self.publish_preferences_changed(); ++ Ok(crate::SettingsUpdateOutcome { ++ preferences: self.preferences.get(), ++ reconciled_hotkey_count: 0, ++ effects: crate::SettingsEffectPlan::default(), ++ }) ++ } ++ + /// Consumes the "first launch of this major version" splash PV marker: + /// returns false when the config's `splash_seen_version` matches the + /// given current major (no replay); on mismatch it writes back the major +@@ -6716,6 +6862,7 @@ impl OpenLessBackend { + }; + crate::sync_dictation_hotkey_legacy_fields(&mut previous); + crate::sync_dictation_hotkey_legacy_fields(&mut preferences); ++ crate::settings::reconcile_translation_settings(&previous, &mut preferences)?; + // The splash marker may only advance via take_splash_playback: when a + // whole-document submit (old frontend, or a request that hasn't read + // the marker back) omits the field, serde's default would write the +@@ -7700,10 +7847,42 @@ impl OpenLessBackend { + self.start_reserved_dictation(reservation, options).await + } + ++ /// Capture using one explicitly registered native route and the unmodified ++ /// built-in Raw prompt. This never selects a cloud fallback or mutates styles. ++ pub async fn start_local_raw_dictation( ++ &self, ++ native_provider: &str, ++ insert_text: bool, ++ ) -> Result { ++ let provider = crate::credentials::ProviderType::new(native_provider.to_string())?; ++ let options = DictationStartOptions { ++ insert_text, ++ ..Default::default() ++ }; ++ let reservation = ++ self.reserve_dictation_session(insert_text, options.output_target, None)?; ++ self.start_reserved_dictation_with_raw_provider( ++ reservation, ++ options, ++ Some(provider.as_str()), ++ ) ++ .await ++ } ++ + async fn start_reserved_dictation( + &self, + reservation: DictationReservation, + options: DictationStartOptions, ++ ) -> Result { ++ self.start_reserved_dictation_with_raw_provider(reservation, options, None) ++ .await ++ } ++ ++ async fn start_reserved_dictation_with_raw_provider( ++ &self, ++ reservation: DictationReservation, ++ options: DictationStartOptions, ++ raw_provider: Option<&str>, + ) -> Result { + let DictationReservation { + session_id, +@@ -7720,14 +7899,25 @@ impl OpenLessBackend { + return Err(error); + } + } +- let context = match self +- .capture_dictation_context_with_host( +- &options, +- DictationContextPurpose::Dictation, +- host_context.as_ref(), +- ) +- .await +- { ++ let captured = match raw_provider { ++ Some(provider) => async { ++ let context = self.capture_local_raw_context(&options, provider)?; ++ // Resolve the explicit adapter before capture; this route has no fallback. ++ Arc::clone(&self.deps.dictation_engine) ++ .prepare_transcription(session_id, Arc::new(context.clone())) ++ .await?; ++ Ok(context) ++ }.await, ++ None => { ++ self.capture_dictation_context_with_host( ++ &options, ++ DictationContextPurpose::Dictation, ++ host_context.as_ref(), ++ ) ++ .await ++ } ++ }; ++ let context = match captured { + Ok(context) => Arc::new(context), + Err(error) => { + self.schedule_pending_audio_capture_discard(pending_capture.take()); +@@ -9177,6 +9367,36 @@ impl OpenLessBackend { + } + } + ++ fn capture_local_raw_context( ++ &self, ++ options: &DictationStartOptions, ++ provider: &str, ++ ) -> Result { ++ let preferences = self.get_preferences(); ++ let hotwords = self ++ .vocabulary ++ .list()? ++ .into_iter() ++ .filter(|entry| entry.enabled) ++ .map(|entry| entry.phrase) ++ .collect(); ++ let style = crate::style_packs::builtin_style_pack_for_mode(crate::types::PolishMode::Raw); ++ let mut context = DictationContext::capture( ++ &preferences, ++ &style, ++ DictationProviderInvocations::new( ++ crate::dictation_context::ProviderInvocation::for_provider(provider), ++ crate::dictation_context::ProviderInvocation::for_provider("raw-unused-llm"), ++ crate::dictation_context::ProviderInvocation::for_provider("raw-unused-omni"), ++ ), ++ hotwords, ++ Vec::new(), ++ options, ++ ); ++ context.pipeline_mode = crate::shared_types::PipelineMode::Traditional; ++ Ok(context) ++ } ++ + async fn capture_dictation_context( + &self, + options: &DictationStartOptions, +@@ -9198,6 +9418,11 @@ impl OpenLessBackend { + ) -> Result { + let preferences = self.get_preferences(); + let mut captured_options = options.clone(); ++ if let Some(target) = &options.translation_target_language { ++ captured_options.translation_target_language = Some( ++ crate::settings::validate_session_translation_target(&preferences, target)?, ++ ); ++ } + if !preferences.cursor_context_enabled { + // This switch controls document text, including text supplied by + // callers. Front-application metadata is still needed for history, +@@ -12189,6 +12414,285 @@ mod tests { + let _ = std::fs::remove_dir_all(data_dir); + } + ++ #[test] ++ fn translation_targets_business_apis_persist_order_selection_and_events() { ++ let (backend, _) = backend(); ++ let mut events = backend.subscribe(); ++ let original = backend.get_preferences(); ++ let outcome = backend ++ .set_translation_targets(vec![ ++ "ja".into(), ++ "en".into(), ++ "EN".into(), ++ "fr".into(), ++ "de".into(), ++ ]) ++ .unwrap(); ++ assert_eq!( ++ outcome.preferences.translation_target_languages, ++ vec!["日本語", "English", "Français", "Deutsch"] ++ ); ++ assert_eq!(outcome.preferences.translation_target_language, "日本語"); ++ assert!(outcome.effects.is_empty()); ++ assert_eq!(backend.snapshot().preferences_revision, 1); ++ assert!(matches!( ++ events.try_recv().unwrap().kind, ++ BackendEventKind::PreferencesChanged(PreferencesChange { revision: 1 }) ++ )); ++ assert_eq!(events.try_recv(), Err(crate::events::EventRecvError::Empty)); ++ backend.add_translation_target("en".into()).unwrap(); ++ backend ++ .reorder_translation_targets(vec!["de".into(), "en".into(), "fr".into(), "ja".into()]) ++ .unwrap(); ++ backend ++ .select_translation_target(Some("fr".into())) ++ .unwrap(); ++ backend.delete_translation_target("fr".into()).unwrap(); ++ let preferences = backend.get_preferences(); ++ assert_eq!( ++ preferences.translation_target_languages, ++ vec!["Deutsch", "English", "日本語"] ++ ); ++ assert_eq!(preferences.translation_target_language, "Deutsch"); ++ assert_eq!( ++ preferences.active_llm_provider, ++ original.active_llm_provider ++ ); ++ assert_eq!(preferences.working_languages, original.working_languages); ++ let reloaded = crate::preferences::PreferencesStore::open( ++ backend._data_dir.path().join("preferences.json"), ++ ) ++ .unwrap() ++ .get(); ++ assert_eq!( ++ reloaded.translation_target_languages, ++ preferences.translation_target_languages ++ ); ++ assert_eq!(reloaded.translation_target_language, "Deutsch"); ++ backend.select_translation_target(None).unwrap(); ++ backend.delete_translation_target("".into()).unwrap(); ++ assert!(backend ++ .get_preferences() ++ .translation_target_language ++ .is_empty()); ++ assert_eq!( ++ backend.get_preferences().translation_target_languages.len(), ++ 3 ++ ); ++ backend.set_translation_targets(vec![]).unwrap(); ++ assert!(backend ++ .get_preferences() ++ .translation_target_languages ++ .is_empty()); ++ assert!(backend ++ .get_preferences() ++ .translation_target_language ++ .is_empty()); ++ } ++ ++ #[test] ++ fn translation_targets_invalid_mutations_are_atomic() { ++ let (backend, _) = backend(); ++ backend ++ .set_translation_targets(vec!["en".into(), "ja".into()]) ++ .unwrap(); ++ let before = serde_json::to_value(backend.get_preferences()).unwrap(); ++ let revision = backend.snapshot().preferences_revision; ++ for result in [ ++ backend.add_translation_target("Unknown new language".into()), ++ backend.add_translation_target(" ".into()), ++ backend.set_translation_targets(vec!["fr".into(), "Unknown new language".into()]), ++ backend.reorder_translation_targets(vec!["en".into()]), ++ backend.reorder_translation_targets(vec!["en".into(), "EN".into()]), ++ backend.select_translation_target(Some("fr".into())), ++ ] { ++ assert_eq!(result.unwrap_err().code, BackendErrorCode::InvalidArgument); ++ assert_eq!( ++ serde_json::to_value(backend.get_preferences()).unwrap(), ++ before ++ ); ++ assert_eq!(backend.snapshot().preferences_revision, revision); ++ } ++ } ++ ++ #[test] ++ fn translation_targets_old_client_whole_settings_saves_preserve_choices() { ++ let (backend, _) = backend(); ++ backend ++ .set_translation_targets(vec!["en".into(), "ja".into()]) ++ .unwrap(); ++ for (selected, expected, targets) in [ ++ ("en", "English", vec!["English", "日本語"]), ++ ("ja", "日本語", vec!["English", "日本語"]), ++ ("fr", "Français", vec!["English", "日本語", "Français"]), ++ ("", "", vec!["English", "日本語", "Français"]), ++ ] { ++ let mut value = serde_json::to_value(backend.get_preferences()).unwrap(); ++ value ++ .as_object_mut() ++ .unwrap() ++ .remove("translationTargetLanguages"); ++ value["translationTargetLanguage"] = serde_json::json!(selected); ++ let legacy = serde_json::from_value(value).unwrap(); ++ let outcome = backend ++ .update_settings( ++ legacy, ++ crate::SettingsUpdateOptions::SETTINGS_DOCUMENT, ++ &crate::NoopSettingsRuntime, ++ ) ++ .unwrap(); ++ assert_eq!(outcome.preferences.translation_target_language, expected); ++ assert_eq!(outcome.preferences.translation_target_languages, targets); ++ } ++ let mut explicit = serde_json::to_value(backend.get_preferences()).unwrap(); ++ explicit["translationTargetLanguages"] = serde_json::json!([]); ++ explicit["translationTargetLanguage"] = serde_json::json!("en"); ++ let cleared = backend ++ .update_settings( ++ serde_json::from_value(explicit).unwrap(), ++ crate::SettingsUpdateOptions::SETTINGS_DOCUMENT, ++ &crate::NoopSettingsRuntime, ++ ) ++ .unwrap(); ++ assert!(cleared.preferences.translation_target_languages.is_empty()); ++ assert!(cleared.preferences.translation_target_language.is_empty()); ++ } ++ ++ #[test] ++ fn translation_targets_legacy_scalar_edits_survive_roundtripping_the_new_list() { ++ let (backend, _) = backend(); ++ backend ++ .set_translation_targets(vec!["en".into(), "ja".into()]) ++ .unwrap(); ++ // Older frontends may spread a preferences object including fields they do not edit. ++ let mut value = serde_json::to_value(backend.get_preferences()).unwrap(); ++ value["translationTargetLanguage"] = serde_json::json!("fr"); ++ let outcome = backend ++ .update_settings( ++ serde_json::from_value(value).unwrap(), ++ crate::SettingsUpdateOptions::SETTINGS_DOCUMENT, ++ &crate::NoopSettingsRuntime, ++ ) ++ .unwrap(); ++ assert_eq!(outcome.preferences.translation_target_language, "Français"); ++ assert_eq!( ++ outcome.preferences.translation_target_languages, ++ vec!["English", "日本語", "Français"] ++ ); ++ } ++ ++ #[test] ++ fn translation_targets_historical_custom_name_can_be_retained_selected_and_removed() { ++ let data_dir = TestDataDir::new("translation-target-historical"); ++ std::fs::create_dir_all(data_dir.path()).unwrap(); ++ // A historical file is migration input, not a new addition via the business API. ++ std::fs::write( ++ data_dir.path().join("preferences.json"), ++ serde_json::to_vec(&serde_json::json!({ ++ "translationTargetLanguage": "Historical custom language", ++ })) ++ .unwrap(), ++ ) ++ .unwrap(); ++ let migrated = backend_with_dictation_engine( ++ data_dir.path().to_path_buf(), ++ Arc::new(crate::testing::FixtureDictationEngine::successful( ++ "raw", "final", ++ )), ++ ); ++ migrated.add_translation_target("en".into()).unwrap(); ++ migrated ++ .reorder_translation_targets(vec!["en".into(), "Historical custom language".into()]) ++ .unwrap(); ++ migrated ++ .select_translation_target(Some("Historical custom language".into())) ++ .unwrap(); ++ assert_eq!( ++ migrated.get_preferences().translation_target_language, ++ "Historical custom language" ++ ); ++ migrated ++ .delete_translation_target("Historical custom language".into()) ++ .unwrap(); ++ assert_eq!( ++ migrated.get_preferences().translation_target_language, ++ "English" ++ ); ++ assert_eq!( ++ migrated ++ .add_translation_target("Historical custom language".into()) ++ .unwrap_err() ++ .code, ++ BackendErrorCode::InvalidArgument ++ ); ++ } ++ ++ #[tokio::test] ++ async fn translation_target_start_option_is_session_local_and_survives_settings_changes() { ++ let data_dir = TestDataDir::new("translation-target-session"); ++ let engine = crate::testing::FixtureDictationEngine::successful("raw", "final"); ++ let backend = ++ backend_with_dictation_engine(data_dir.path().to_path_buf(), Arc::new(engine.clone())); ++ backend.start().await.unwrap(); ++ backend ++ .set_translation_targets(vec!["en".into(), "ja".into()]) ++ .unwrap(); ++ let mut preferences = backend.get_preferences(); ++ preferences.working_languages = vec!["简体中文".into()]; ++ backend.set_preferences(preferences).unwrap(); ++ let revision = backend.snapshot().preferences_revision; ++ backend ++ .start_external_dictation_with_options(DictationStartOptions { ++ translation_requested: true, ++ translation_target_language: Some("ja".into()), ++ ..Default::default() ++ }) ++ .await ++ .unwrap(); ++ assert_eq!( ++ backend.get_preferences().translation_target_language, ++ "English" ++ ); ++ assert_eq!(backend.snapshot().preferences_revision, revision); ++ backend.set_translation_targets(vec!["fr".into()]).unwrap(); ++ backend.stop_dictation().await.unwrap(); ++ let contexts = engine.contexts(); ++ let context = contexts.last().unwrap(); ++ assert_eq!(context.polish.translation_target_language, "日本語"); ++ assert!(context.polish.translation_target_explicit); ++ assert!(context.polish.translation_active); ++ assert!(context.effective_polish_system_prompt().contains("日本語")); ++ assert_eq!( ++ backend.get_preferences().translation_target_language, ++ "Français" ++ ); ++ backend.shutdown().await.unwrap(); ++ } ++ ++ #[tokio::test] ++ async fn translation_target_start_option_rejects_unconfigured_or_empty_without_starting_engine() ++ { ++ let data_dir = TestDataDir::new("translation-target-invalid"); ++ let engine = crate::testing::FixtureDictationEngine::successful("raw", "final"); ++ let backend = ++ backend_with_dictation_engine(data_dir.path().to_path_buf(), Arc::new(engine.clone())); ++ backend.start().await.unwrap(); ++ backend.add_translation_target("en".into()).unwrap(); ++ for target in ["", " ", "ja", "Unknown target"] { ++ let error = backend ++ .start_external_dictation_with_options(DictationStartOptions { ++ translation_requested: true, ++ translation_target_language: Some(target.into()), ++ ..Default::default() ++ }) ++ .await ++ .unwrap_err(); ++ assert_eq!(error.code, BackendErrorCode::InvalidArgument); ++ assert!(engine.contexts().is_empty()); ++ } ++ backend.shutdown().await.unwrap(); ++ } ++ + #[test] + fn focused_microphone_selection_persists_and_publishes_once() { + let (backend, _) = backend(); +@@ -13870,6 +14374,10 @@ mod tests { + let selected = backend.select_dictation_translation_target(session, "ja".into()).unwrap(); + assert_eq!(selected.target_language, "日本語"); + assert_eq!(backend.get_preferences().translation_target_language, "日本語"); ++ assert_eq!( ++ backend.get_preferences().translation_target_languages, ++ vec!["English", "日本語"] ++ ); + assert_eq!(backend.get_preferences().microphone_device_name, "next microphone"); + backend.stop_dictation().await.unwrap(); + let contexts = engine.contexts(); +@@ -13880,6 +14388,35 @@ mod tests { + backend.shutdown().await.unwrap(); + } + ++ #[tokio::test] ++ async fn translation_picker_remembers_target_after_configured_choices_are_cleared() { ++ let data_dir = TestDataDir::new("translation-picker-cleared-choices"); ++ let engine = crate::testing::FixtureDictationEngine::successful("raw", "translated"); ++ let backend = backend_with_dictation_engine( ++ data_dir.path().to_path_buf(), ++ Arc::new(engine), ++ ); ++ backend.start().await.unwrap(); ++ backend.add_translation_target("en".into()).unwrap(); ++ let session = backend ++ .start_dictation_with_options(DictationStartOptions { ++ translation_requested: true, ++ ..Default::default() ++ }) ++ .await ++ .unwrap(); ++ backend.set_translation_targets(vec![]).unwrap(); ++ backend.select_dictation_translation_target(session, "ja".into()).unwrap(); ++ let saved = crate::preferences::PreferencesStore::open( ++ data_dir.path().join("preferences.json"), ++ ).unwrap().get(); ++ assert_eq!(saved.translation_target_language, "日本語"); ++ assert_eq!(saved.translation_target_languages, vec!["日本語"]); ++ assert_eq!(backend.get_preferences().translation_target_languages, vec!["日本語"]); ++ backend.cancel_dictation(Some(session)).await.unwrap(); ++ backend.shutdown().await.unwrap(); ++ } ++ + #[tokio::test] + async fn translation_picker_save_failure_keeps_active_and_saved_targets() { + let data_dir = TestDataDir::new("translation-picker-save-failure"); +diff --git a/crates/openless-core/src/auxiliary.rs b/crates/openless-core/src/auxiliary.rs +index 75c9c3c3..55a7de23 100644 +--- a/crates/openless-core/src/auxiliary.rs ++++ b/crates/openless-core/src/auxiliary.rs +@@ -64,7 +64,106 @@ impl RetranscriptionFailure { + } + } + ++/// A one-shot compose operation prepared before recording starts. The instruction ++/// is supplied only after real ASR completes; no editor selection is accepted. ++/// This auxiliary operation does not hold the global voice-session gate. Hosts ++/// must retain admission across their capture and this operation, including ++/// runtime restore/management probes, until completion or cancellation cleanup. ++pub struct PreparedVoiceCompose { ++ session_id: SessionId, ++ context: Arc, ++ polisher: Arc, ++ task_spawner: Arc, ++ abort: futures_util::future::AbortHandle, ++ registration: std::sync::Mutex>, ++} ++ ++#[derive(Debug, Clone, serde::Serialize)] ++#[serde(rename_all = "camelCase")] ++pub struct VoiceComposePreview { ++ pub text: String, ++ pub provider_type: String, ++ pub model: Option, ++ pub prompt_kind: &'static str, ++} ++ ++impl PreparedVoiceCompose { ++ pub fn cancel(&self) { ++ self.abort.abort(); ++ let polisher = self.polisher.clone(); ++ let session = self.session_id; ++ self.task_spawner.spawn(Box::pin(async move { ++ let _ = polisher.cancel(session).await; ++ })); ++ } ++ ++ pub async fn compose(&self, instruction: String) -> Result { ++ if self.abort.is_aborted() { ++ return Err(BackendError::new( ++ BackendErrorCode::Cancelled, ++ "compose cancelled", ++ )); ++ } ++ let registration = self.registration.lock().unwrap().take().ok_or_else(|| { ++ BackendError::new(BackendErrorCode::InvalidState, "compose is one-shot") ++ })?; ++ if instruction.trim().is_empty() || instruction.len() > 128 * 1024 { ++ return Err(BackendError::new( ++ BackendErrorCode::InvalidArgument, ++ "invalid spoken instruction", ++ )); ++ } ++ let input = crate::prompts::voice_compose_user_prompt(&instruction, None); ++ let operation = self.polisher.polish( ++ self.session_id, ++ self.context.clone(), ++ input, ++ Arc::new(DiscardTextStream), ++ ); ++ let output = futures_util::future::Abortable::new(operation, registration) ++ .await ++ .map_err(|_| BackendError::new(BackendErrorCode::Cancelled, "compose cancelled"))??; ++ if self.abort.is_aborted() { ++ return Err(BackendError::new( ++ BackendErrorCode::Cancelled, ++ "compose cancelled", ++ )); ++ } ++ let text = ++ crate::selection_voice_intent::clean_selection_voice_compose_output(&output.text); ++ if text.is_empty() || text.len() > 128 * 1024 { ++ return Err(BackendError::new( ++ BackendErrorCode::Provider, ++ "invalid compose output", ++ )); ++ } ++ Ok(VoiceComposePreview { ++ text, ++ provider_type: self.context.llm.provider_type.clone(), ++ model: self.context.llm.model.clone(), ++ prompt_kind: "voice_compose", ++ }) ++ } ++} ++ ++impl Drop for PreparedVoiceCompose { ++ fn drop(&mut self) { ++ self.cancel(); ++ } ++} ++ + pub trait AuxiliaryApi: Send + Sync { ++ fn prepare_voice_compose( ++ &self, ++ ) -> BoxFuture<'static, Result, BackendError>> { ++ Box::pin(async { ++ Err(BackendError::new( ++ BackendErrorCode::Unsupported, ++ "voice compose is not configured", ++ )) ++ }) ++ } ++ + fn repolish( + &self, + request: RepolishRequest, +@@ -212,6 +311,62 @@ impl AuxiliaryService { + } + + impl AuxiliaryApi for AuxiliaryService { ++ fn prepare_voice_compose( ++ &self, ++ ) -> BoxFuture<'static, Result, BackendError>> { ++ let service = self.clone_for_future(); ++ Box::pin(async move { ++ let preferences = service.preferences.get(); ++ let llm = crate::provider_resolution::resolve_session_provider( ++ &service.credential_store, ++ ProviderSlot::Llm, ++ &preferences.active_llm_provider, ++ ) ++ .await?; ++ let style = ++ crate::style_packs::builtin_style_pack_for_mode(crate::types::PolishMode::Light); ++ let mut context = DictationContext::capture( ++ &preferences, ++ &style, ++ DictationProviderInvocations::new( ++ ProviderInvocation::for_provider("compose-unused-asr"), ++ llm, ++ ProviderInvocation::for_provider("compose-unused-omni"), ++ ), ++ Vec::new(), ++ Vec::new(), ++ &DictationStartOptions { ++ insert_text: false, ++ ..Default::default() ++ }, ++ ); ++ context.pipeline_mode = crate::shared_types::PipelineMode::Traditional; ++ context.polish.style_system_prompt = crate::prompts::voice_compose_system_prompt(); ++ context.polish.translation_active = false; ++ context.polish.translation_target_language.clear(); ++ context.polish.hotwords.clear(); ++ context.polish.cursor_context = None; ++ context.polish.front_app = None; ++ context.polish.context_window_minutes = 0; ++ context.polish.prior_turns.clear(); ++ let context = Arc::new(context); ++ let polisher = service ++ .polisher ++ .prepare(context.clone()) ++ .await? ++ .unwrap_or(service.polisher); ++ let (abort, registration) = futures_util::future::AbortHandle::new_pair(); ++ Ok(Arc::new(PreparedVoiceCompose { ++ session_id: SessionId::new(), ++ context, ++ polisher, ++ task_spawner: service.task_spawner, ++ abort, ++ registration: std::sync::Mutex::new(Some(registration)), ++ })) ++ }) ++ } ++ + fn repolish( + &self, + request: RepolishRequest, +@@ -474,6 +629,50 @@ mod tests { + } + } + ++ #[tokio::test] ++ async fn voice_compose_is_lazy_one_shot_and_cancellation_prevents_provider_start() { ++ let polisher = Arc::new(FixtureTextPolisher::successful("draft")); ++ let (service, path) = service( ++ polisher.clone(), ++ Arc::new(FixtureTranscriptionEngine::successful("unused", 0)), ++ ); ++ let prepared = service.prepare_voice_compose().await.unwrap(); ++ assert!(polisher.inputs().is_empty()); ++ let preview = prepared ++ .compose("Write an invitation".into()) ++ .await ++ .unwrap(); ++ assert_eq!(preview.text, "draft"); ++ assert_eq!(preview.prompt_kind, "voice_compose"); ++ assert_eq!( ++ polisher.inputs(), ++ vec![crate::prompts::voice_compose_user_prompt( ++ "Write an invitation", ++ None ++ )] ++ ); ++ assert_eq!( ++ prepared ++ .compose("second instruction".into()) ++ .await ++ .unwrap_err() ++ .code, ++ BackendErrorCode::InvalidState ++ ); ++ let cancelled = service.prepare_voice_compose().await.unwrap(); ++ cancelled.cancel(); ++ assert_eq!( ++ cancelled ++ .compose("never sent".into()) ++ .await ++ .unwrap_err() ++ .code, ++ BackendErrorCode::Cancelled ++ ); ++ assert_eq!(polisher.inputs().len(), 1); ++ let _ = std::fs::remove_file(path); ++ } ++ + #[tokio::test] + async fn untouched_builtin_raw_repolish_is_a_true_passthrough() { + let (service, path) = service( +diff --git a/crates/openless-core/src/cloud_providers.rs b/crates/openless-core/src/cloud_providers.rs +index 4c38be0f..bce7e393 100644 +--- a/crates/openless-core/src/cloud_providers.rs ++++ b/crates/openless-core/src/cloud_providers.rs +@@ -1056,7 +1056,89 @@ enum CloudPolisherProvider { + Gemini(crate::llm_gemini::GeminiProvider), + } + ++// Read-only, selected-channel request credentials. SecretValue zeroizes on drop; ++// no vault reference, serialization, diagnostics or mutation survives preparation. ++struct FrozenPolishCredentials(Vec<(CredentialKey, crate::SecretValue)>); ++impl FrozenPolishCredentials { ++ fn denied() -> BoxFuture<'static, Result> { ++ Box::pin(async { ++ Err(BackendError::new( ++ BackendErrorCode::Unsupported, ++ "immutable polish credentials", ++ )) ++ }) ++ } ++} ++impl CredentialStore for FrozenPolishCredentials { ++ fn status( ++ &self, ++ _: crate::UserPreferences, ++ ) -> BoxFuture<'static, Result> { ++ Self::denied() ++ } ++ fn read( ++ &self, ++ key: CredentialKey, ++ ) -> BoxFuture<'static, Result, BackendError>> { ++ let value = self ++ .0 ++ .iter() ++ .find(|(stored, _)| stored == &key) ++ .map(|(_, value)| value.clone()); ++ Box::pin(async move { Ok(value) }) ++ } ++ fn write( ++ &self, ++ _: CredentialKey, ++ _: crate::SecretValue, ++ ) -> BoxFuture<'static, Result<(), BackendError>> { ++ Self::denied() ++ } ++ fn remove(&self, _: CredentialKey) -> BoxFuture<'static, Result<(), BackendError>> { ++ Self::denied() ++ } ++} ++ + impl TextPolisher for SharedCloudTextPolisher { ++ fn prepare( ++ &self, ++ context: Arc, ++ ) -> BoxFuture<'static, Result>, BackendError>> { ++ let credentials = self.credentials.clone(); ++ Box::pin(async move { ++ // OAuth resolves external runtime state and cannot promise an immutable ++ // delayed invocation through this credential-only seam. ++ if context.llm.provider_type == crate::polish::CODEX_OAUTH_PROVIDER_ID { ++ return Err(BackendError::new( ++ BackendErrorCode::Unsupported, ++ "OAuth delayed compose is unsupported", ++ )); ++ } ++ let mut values = Vec::new(); ++ for account in [ ++ LLM_API_KEY_ACCOUNT, ++ LLM_ENDPOINT_ACCOUNT, ++ LLM_EXTRA_HEADERS_ACCOUNT, ++ LLM_TEMPERATURE_ACCOUNT, ++ ] ++ .into_iter() ++ .chain(crate::llm_protocol::CONFIG_ACCOUNTS) ++ { ++ let key = CredentialKey::new( ++ CredentialNamespace::Llm, ++ Some(context.llm.provider_id.clone()), ++ account, ++ )?; ++ if let Some(value) = credentials.read(key.clone()).await? { ++ values.push((key, value)); ++ } ++ } ++ Ok(Some(Arc::new(SharedCloudTextPolisher::new(Arc::new( ++ FrozenPolishCredentials(values), ++ ))) as Arc)) ++ }) ++ } ++ + fn polish( + &self, + session_id: SessionId, +diff --git a/crates/openless-core/src/cloud_sync_e2ee_documents/registry.rs b/crates/openless-core/src/cloud_sync_e2ee_documents/registry.rs +index 3b7e806c..66a16066 100644 +--- a/crates/openless-core/src/cloud_sync_e2ee_documents/registry.rs ++++ b/crates/openless-core/src/cloud_sync_e2ee_documents/registry.rs +@@ -368,6 +368,13 @@ pub const PREFERENCE_FIELDS: &[PreferenceField] = &[ + shape: PreferenceShape::TextList, + reason: "portable_setting", + }, ++ PreferenceField { ++ rust_name: "translation_target_languages", ++ key: "translationTargetLanguages", ++ class: PreferenceClass::Portable, ++ shape: PreferenceShape::TextList, ++ reason: "portable_setting", ++ }, + PreferenceField { + rust_name: "translation_target_language", + key: "translationTargetLanguage", +diff --git a/crates/openless-core/src/cloud_sync_e2ee_documents/tests.rs b/crates/openless-core/src/cloud_sync_e2ee_documents/tests.rs +index d3d9688c..eb2e6ccb 100644 +--- a/crates/openless-core/src/cloud_sync_e2ee_documents/tests.rs ++++ b/crates/openless-core/src/cloud_sync_e2ee_documents/tests.rs +@@ -108,6 +108,22 @@ fn all_current_preference_fields_have_an_explicit_registration() { + .map(|(name, _)| name) + }) + .collect(); ++ // Wire-presence metadata is not persisted or synced. Verify the explicit ++ // exception against actual serialization rather than exempting new fields. ++ let metadata = ["translation_target_languages_present", "translation_target_language_input"]; ++ let prefs = crate::shared_types::UserPreferences { ++ translation_target_languages_present: true, ++ translation_target_language_input: Some("en".into()), ++ ..Default::default() ++ }; ++ let serialized = serde_json::to_value(prefs).unwrap(); ++ assert!(serialized.get("translationTargetLanguagesPresent").is_none()); ++ assert!(serialized.get("translationTargetLanguageInput").is_none()); ++ assert!(metadata.iter().all(|name| serialized.get(*name).is_none())); ++ let names: std::collections::BTreeSet<_> = names ++ .into_iter() ++ .filter(|name| !metadata.contains(name)) ++ .collect(); + let registered: std::collections::BTreeSet<_> = registry::PREFERENCE_FIELDS + .iter() + .map(|field| field.rust_name) +diff --git a/crates/openless-core/src/dictation_context.rs b/crates/openless-core/src/dictation_context.rs +index b82b76a0..495952a7 100644 +--- a/crates/openless-core/src/dictation_context.rs ++++ b/crates/openless-core/src/dictation_context.rs +@@ -43,6 +43,9 @@ pub enum DictationOutputTarget { + #[derive(Debug, Clone, PartialEq, Eq)] + pub struct DictationStartOptions { + pub translation_requested: bool, ++ /// Configured target for this session only; None uses the legacy selected target. ++ /// Selecting a target does not request translation or enable any provider. ++ pub translation_target_language: Option, + pub audio_source: DictationAudioSource, + pub insert_text: bool, + pub output_target: DictationOutputTarget, +@@ -55,6 +58,7 @@ impl Default for DictationStartOptions { + fn default() -> Self { + Self { + translation_requested: false, ++ translation_target_language: None, + audio_source: DictationAudioSource::Microphone, + insert_text: true, + output_target: DictationOutputTarget::ForegroundApp, +@@ -128,6 +132,8 @@ pub struct DictationPolishContext { + pub hotwords: Vec, + pub working_languages: Vec, + pub translation_target_language: String, ++ /// True when the start options explicitly selected the snapshotted target. ++ pub translation_target_explicit: bool, + pub translation_active: bool, + pub edit_plan_input: bool, + /// Selected text uses its own prompt envelope, separate from voice transcripts. +@@ -252,8 +258,12 @@ impl DictationContext { + omni, + } = providers; + let hotwords = normalize_hotwords(hotwords); +- let translation_target_language = +- preferences.translation_target_language.trim().to_string(); ++ let translation_target_language = crate::settings::canonical_translation_target( ++ options ++ .translation_target_language ++ .as_deref() ++ .unwrap_or(&preferences.translation_target_language), ++ ); + let translation_active = translation_effective( + options.translation_requested, + &translation_target_language, +@@ -357,6 +367,7 @@ impl DictationContext { + hotwords, + working_languages: preferences.working_languages.clone(), + translation_target_language, ++ translation_target_explicit: options.translation_target_language.is_some(), + translation_active, + edit_plan_input: false, + selection_input: false, +@@ -813,6 +824,56 @@ mod tests { + assert_eq!(local_asr_fallback(&no_model, &cloud_asr(), true), None); + } + ++ #[test] ++ fn explicit_translation_target_preserves_working_language_suppression_and_raw_mode() { ++ let preferences = UserPreferences { ++ default_mode: PolishMode::Raw, ++ working_languages: vec!["English".into()], ++ translation_target_language: "日本語".into(), ++ ..Default::default() ++ }; ++ let capture = |requested, target| { ++ DictationContext::capture( ++ &preferences, ++ &builtin_style_pack_for_mode(PolishMode::Raw), ++ DictationProviderInvocations::new( ++ ProviderInvocation::for_provider("local-qwen3"), ++ ProviderInvocation::for_provider("original-llm"), ++ ProviderInvocation::for_provider("original-omni"), ++ ), ++ vec![], ++ vec![], ++ &DictationStartOptions { ++ translation_requested: requested, ++ translation_target_language: target, ++ ..Default::default() ++ }, ++ ) ++ }; ++ let suppressed = capture(true, Some("en".into())); ++ assert_eq!(suppressed.polish.translation_target_language, "English"); ++ assert!(suppressed.polish.translation_target_explicit); ++ assert!(!suppressed.polish.translation_active); ++ assert!(!suppressed.uses_llm_polisher()); ++ assert!( ++ !suppressed ++ .with_translation_requested(true) ++ .polish ++ .translation_active ++ ); ++ let selected_only = capture(false, Some("ja".into())); ++ assert!(!selected_only.uses_llm_polisher()); ++ let translated = capture(true, Some("ja".into())); ++ assert!(translated.polish.translation_active); ++ assert!(translated.uses_llm_polisher()); ++ assert_eq!(translated.asr.provider_id, "local-qwen3"); ++ assert_eq!(translated.llm.provider_id, "original-llm"); ++ let legacy = capture(true, None); ++ assert!(!legacy.polish.translation_target_explicit); ++ assert_eq!(legacy.polish.translation_target_language, "日本語"); ++ assert!(legacy.polish.translation_active); ++ } ++ + #[test] + fn selection_polish_uses_the_selected_text_envelope() { + let mut context = DictationContext::default(); +diff --git a/crates/openless-core/src/dictation_engine.rs b/crates/openless-core/src/dictation_engine.rs +index f8d3d58e..d4f95155 100644 +--- a/crates/openless-core/src/dictation_engine.rs ++++ b/crates/openless-core/src/dictation_engine.rs +@@ -1011,6 +1011,13 @@ impl DictationEngine for PipelineDictationEngine { + let skips_polish_for_short_text = context.skips_polish_for_short_text(&transcript.text); + // Optional polish may be skipped after fallback; an explicit translation is still required. + let translation_active = context.polish.translation_active; ++ // Explicit per-session translation must not succeed with untransformed text. ++ let require_translation = translation_active && context.polish.translation_target_explicit; ++ let policy = if require_translation { ++ PolishFailurePolicy::Fail ++ } else { ++ policy ++ }; + let uses_polisher = context.uses_llm_polisher() + && !(context.voice_activation.is_some() && transcript.text.trim().is_empty()) + && !skips_polish_for_short_text +@@ -1063,6 +1070,16 @@ impl DictationEngine for PipelineDictationEngine { + ) + .await + }; ++ let output = output.and_then(|value| { ++ if require_translation && value.text.trim().is_empty() { ++ Err(BackendError::new( ++ BackendErrorCode::Provider, ++ "translation returned empty text", ++ )) ++ } else { ++ Ok(value) ++ } ++ }); + let result = match output { + Ok(text) => (text, false), + // Offline after local recognition: the raw transcript is the +@@ -3810,6 +3827,37 @@ mod tests { + assert_eq!(result.polished_text, "raw text"); + } + ++ #[tokio::test] ++ async fn requested_translation_failure_never_becomes_successful_source_text() { ++ for output in [ ++ Err(BackendError::new( ++ BackendErrorCode::Provider, ++ "fixture HTTP 500", ++ )), ++ Ok(crate::ports::PolishOutput::text(" ")), ++ ] { ++ let fixture = fixture_engine(false, output, None, None); ++ let id = SessionId::new(); ++ let mut context = DictationContext::default(); ++ context.polish.translation_active = true; ++ context.polish.translation_target_language = "English".into(); ++ context.polish.translation_target_explicit = true; ++ fixture ++ .engine ++ .start(id, Arc::new(context), fixture.progress.clone()) ++ .await ++ .unwrap(); ++ let failure = fixture ++ .engine ++ .finish(id, fixture.progress.clone()) ++ .await ++ .unwrap_err(); ++ assert_eq!(failure.error.code, BackendErrorCode::Provider); ++ assert_eq!(failure.raw_text.as_deref(), Some("raw text")); ++ assert!(fixture.engine.sessions.lock().unwrap().is_empty()); ++ } ++ } ++ + #[tokio::test] + async fn voice_activation_commands_are_cleaned_before_correction_and_polishing() { + use crate::testing::{ +diff --git a/crates/openless-core/src/language_catalog.rs b/crates/openless-core/src/language_catalog.rs +index 6bcfcf27..b8ac2f0c 100644 +--- a/crates/openless-core/src/language_catalog.rs ++++ b/crates/openless-core/src/language_catalog.rs +@@ -43,6 +43,14 @@ pub fn language_code(value: &str) -> Option { + language(value).map(|language| language.code.clone()) + } + ++/// Ordered catalog choices; provider support is checked separately. ++pub fn translation_language_names() -> Vec { ++ LANGUAGES ++ .iter() ++ .map(|language| language.native_name.clone()) ++ .collect() ++} ++ + pub fn asr_language_code(native_name: &str) -> Option { + language(native_name).map(|language| language.asr_code.clone()) + } +@@ -55,6 +63,22 @@ pub fn apple_speech_locale(native_name: &str) -> Option { + mod tests { + use super::*; + ++ #[test] ++ fn translation_names_and_aliases_share_the_existing_catalog() { ++ let names = translation_language_names(); ++ assert!(names.len() > 3); ++ for (index, name) in names.iter().enumerate() { ++ assert!(!names[..index].contains(name)); ++ assert_eq!(native_language_name(name).as_ref(), Some(name)); ++ } ++ assert_eq!(native_language_name(" EN ").as_deref(), Some("English")); ++ assert_eq!( ++ native_language_name("繁體中文").as_deref(), ++ Some("繁体中文") ++ ); ++ assert_eq!(native_language_name("unknown"), None); ++ } ++ + #[test] + fn extended_names_route_to_iso_and_apple_identifiers() { + for (name, code, locale) in [ +diff --git a/crates/openless-core/src/ports.rs b/crates/openless-core/src/ports.rs +index 66dfa69f..e5c8e58f 100644 +--- a/crates/openless-core/src/ports.rs ++++ b/crates/openless-core/src/ports.rs +@@ -780,6 +780,15 @@ impl PreparedTranscription for DeferredDictationPre + } + + pub trait TextPolisher: Send + Sync { ++ /// Freeze request credentials/options for a delayed operation without provider network I/O. ++ /// Adapters with no mutable request configuration may keep their runtime. ++ fn prepare( ++ &self, ++ _context: Arc, ++ ) -> BoxFuture<'static, Result>, BackendError>> { ++ Box::pin(async { Ok(None) }) ++ } ++ + fn polish( + &self, + session_id: SessionId, +diff --git a/crates/openless-core/src/preference_patch.rs b/crates/openless-core/src/preference_patch.rs +index 411a4b5f..07e176ec 100644 +--- a/crates/openless-core/src/preference_patch.rs ++++ b/crates/openless-core/src/preference_patch.rs +@@ -18,7 +18,9 @@ pub fn patch_preferences( + if let Some(mode) = edits.get("/capsuleDisplayMode") { + document["capsuleDisplayModeV2"] = mode.clone(); + } +- serde_json::from_value(document).map_err(invalid) ++ let mut patched = serde_json::from_value(document).map_err(invalid)?; ++ crate::settings::reconcile_translation_settings(current, &mut patched)?; ++ Ok(patched) + } + + fn invalid(error: impl std::fmt::Display) -> BackendError { +@@ -52,6 +54,24 @@ pub fn update_fields( + #[cfg(test)] + mod tests { + use super::*; ++ ++ #[test] ++ fn translation_drafts_survive_rebasing_and_serialization_before_save() { ++ let current = UserPreferences::default(); ++ let edits = BTreeMap::from([("/translationTargetLanguage".into(), Value::from("ko"))]); ++ let draft = patch_preferences(¤t, &edits).unwrap(); ++ assert_eq!(draft.translation_target_language, "한국어"); ++ assert_eq!(draft.translation_target_languages, vec!["한국어"]); ++ let loaded: UserPreferences = serde_json::from_value(serde_json::to_value(&draft).unwrap()).unwrap(); ++ assert_eq!(loaded.translation_target_language, draft.translation_target_language); ++ assert_eq!(loaded.translation_target_languages, draft.translation_target_languages); ++ let cleared = patch_preferences(&loaded, &BTreeMap::from([ ++ ("/translationTargetLanguages".into(), serde_json::json!([])), ++ ])).unwrap(); ++ assert!(cleared.translation_target_language.is_empty()); ++ assert!(cleared.translation_target_languages.is_empty()); ++ } ++ + #[test] + fn capsule_display_edits_establish_v2_without_opt_in_from_unrelated_edits() { + let mut current = UserPreferences::default(); +diff --git a/crates/openless-core/src/preferences.rs b/crates/openless-core/src/preferences.rs +index 817d7663..129f2a33 100644 +--- a/crates/openless-core/src/preferences.rs ++++ b/crates/openless-core/src/preferences.rs +@@ -266,6 +266,7 @@ impl PreferencesStore { + } + + pub fn set(&self, mut preferences: UserPreferences) -> Result<(), BackendError> { ++ crate::settings::reconcile_translation_settings(&self.get(), &mut preferences)?; + self.update(|current| { + // The sync transaction owns this field; stale whole-document saves cannot reroute its token. + preferences.sync_custom_server_origin = current.sync_custom_server_origin.clone(); +@@ -370,6 +371,7 @@ impl PreferencesStore { + &self, + mut preferences: UserPreferences, + ) -> Result<(), BackendError> { ++ crate::settings::reconcile_translation_settings(&self.get(), &mut preferences)?; + self.update(|current| { + preferences.preserve_style_preferences_from(current); + preferences.sync_custom_server_origin = current.sync_custom_server_origin.clone(); +diff --git a/crates/openless-core/src/provider_registry.rs b/crates/openless-core/src/provider_registry.rs +index 3f5c973b..1112e0fe 100644 +--- a/crates/openless-core/src/provider_registry.rs ++++ b/crates/openless-core/src/provider_registry.rs +@@ -136,6 +136,17 @@ impl TextPolisherRouter { + } + + impl TextPolisher for TextPolisherRouter { ++ fn prepare( ++ &self, ++ context: Arc, ++ ) -> BoxFuture<'static, Result>, BackendError>> { ++ let provider = match self.resolve(&context.llm.provider_type) { ++ Ok(provider) => provider, ++ Err(error) => return Box::pin(async move { Err(error) }), ++ }; ++ Box::pin(async move { Ok(Some(provider.prepare(context).await?.unwrap_or(provider))) }) ++ } ++ + fn polish( + &self, + session_id: SessionId, +diff --git a/crates/openless-core/src/settings.rs b/crates/openless-core/src/settings.rs +index 51600f8d..ad33194b 100644 +--- a/crates/openless-core/src/settings.rs ++++ b/crates/openless-core/src/settings.rs +@@ -19,6 +19,125 @@ pub(crate) fn ensure_testing_features_enabled( + } + } + ++/// Preserve historical custom names on load, while canonicalizing catalog aliases. ++pub(crate) fn canonical_translation_target(value: &str) -> String { ++ crate::language_catalog::native_language_name(value).unwrap_or_else(|| value.trim().to_string()) ++} ++ ++pub(crate) fn ordered_translation_targets(values: Vec) -> Vec { ++ let mut targets = Vec::new(); ++ for value in values { ++ let value = canonical_translation_target(&value); ++ if !value.is_empty() && !targets.contains(&value) { ++ targets.push(value); ++ } ++ } ++ targets ++} ++ ++pub(crate) fn migrate_translation_targets( ++ targets: Option>, ++ selected: &str, ++) -> (Vec, String) { ++ let selected = canonical_translation_target(selected); ++ let mut targets = ++ ordered_translation_targets(targets.unwrap_or_else(|| vec![selected.clone()])); ++ // A nonempty legacy selection remains authoritative when an older client ++ // round-trips a newly introduced list it does not know how to update. ++ if !targets.is_empty() && !selected.is_empty() && !targets.contains(&selected) { ++ targets.push(selected.clone()); ++ } ++ let selected = if targets.is_empty() { ++ String::new() ++ } else { ++ selected ++ }; ++ (targets, selected) ++} ++ ++/// A missing list is a legacy scalar-only update, not permission to erase targets. ++/// Unknown names already stored by an older client remain usable, but cannot be newly added. ++pub(crate) fn reconcile_translation_settings( ++ previous: &UserPreferences, ++ next: &mut UserPreferences, ++) -> Result<(), BackendError> { ++ let (previous_targets, previous_selected) = migrate_translation_targets( ++ if previous.translation_target_languages.is_empty() ++ && !previous.translation_target_languages_present ++ { ++ None ++ } else { ++ Some(previous.translation_target_languages.clone()) ++ }, ++ &previous.translation_target_language, ++ ); ++ // A legacy client can echo the initially empty list while selecting its first language. ++ // An empty list replacing stored choices remains an explicit deletion. ++ let input = if previous_targets.is_empty() && next.translation_target_languages.is_empty() { ++ next.translation_target_language_input.as_deref() ++ .unwrap_or(&next.translation_target_language) ++ } else { ++ &next.translation_target_language ++ }; ++ let selected = canonical_translation_target(input); ++ let mut targets = if next.translation_target_languages_present { ++ ordered_translation_targets(next.translation_target_languages.clone()) ++ } else { ++ previous_targets.clone() ++ }; ++ // Scalar-only clients (including existing Rust callers editing a snapshot) select ++ // a target without replacing the ordered collection. Explicit [] always clears. ++ if (!next.translation_target_languages_present ++ || (targets == previous_targets && selected != previous_selected)) ++ && !selected.is_empty() ++ && !targets.contains(&selected) ++ { ++ targets.push(selected.clone()); ++ } ++ for target in &targets { ++ if crate::language_catalog::native_language_name(target).is_none() ++ && !previous_targets.contains(target) ++ { ++ return Err(BackendError::new( ++ crate::errors::BackendErrorCode::InvalidArgument, ++ format!("unknown translation target: {target}"), ++ )); ++ } ++ } ++ let selected = if !selected.is_empty() && !targets.contains(&selected) { ++ targets.first().cloned().unwrap_or_default() ++ } else { ++ selected ++ }; ++ let (targets, selected) = migrate_translation_targets(Some(targets), &selected); ++ next.translation_target_languages = targets; ++ next.translation_target_language = selected; ++ next.translation_target_languages_present = true; ++ next.translation_target_language_input = None; ++ Ok(()) ++} ++ ++pub(crate) fn validate_session_translation_target( ++ preferences: &UserPreferences, ++ target: &str, ++) -> Result { ++ let target = canonical_translation_target(target); ++ let mut targets = ordered_translation_targets(preferences.translation_target_languages.clone()); ++ if !preferences.translation_target_languages_present { ++ let legacy = canonical_translation_target(&preferences.translation_target_language); ++ if !legacy.is_empty() && !targets.contains(&legacy) { ++ targets.push(legacy); ++ } ++ } ++ if target.is_empty() || !targets.contains(&target) { ++ return Err(BackendError::new( ++ crate::errors::BackendErrorCode::InvalidArgument, ++ "session translation target must be a configured nonempty target", ++ )); ++ } ++ Ok(target) ++} ++ + #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] + #[serde(rename_all = "snake_case")] + pub enum SettingsCollisionPolicy { +@@ -292,3 +411,141 @@ mod tests { + assert!(!tsf_with_hidden_pref.windows_show_openless_in_keyboard_list); + } + } ++ ++#[cfg(test)] ++mod translation_targets_tests { ++ use super::*; ++ use serde_json::json; ++ ++ #[test] ++ fn empty_list_roundtrip_allows_the_first_legacy_selection_but_explicit_clear_still_wins() { ++ let previous = UserPreferences::default(); ++ let mut document = serde_json::to_value(&previous).unwrap(); ++ document["translationTargetLanguage"] = json!("ko"); ++ let mut next: UserPreferences = serde_json::from_value(document).unwrap(); ++ reconcile_translation_settings(&previous, &mut next).unwrap(); ++ assert_eq!(next.translation_target_language, "한국어"); ++ assert_eq!(next.translation_target_languages, vec!["한국어"]); ++ let previous = next; ++ let mut document = serde_json::to_value(&previous).unwrap(); ++ document["translationTargetLanguages"] = json!([]); ++ let mut cleared: UserPreferences = serde_json::from_value(document).unwrap(); ++ reconcile_translation_settings(&previous, &mut cleared).unwrap(); ++ assert!(cleared.translation_target_language.is_empty()); ++ assert!(cleared.translation_target_languages.is_empty()); ++ } ++ ++ #[test] ++ fn legacy_selected_target_seeds_list_and_preserves_custom_names() { ++ for (input, expected) in [ ++ (" en ", "English"), ++ (" My historical language ", "My historical language"), ++ ] { ++ let preferences: UserPreferences = serde_json::from_value(json!({ ++ "translationTargetLanguage": input, ++ })) ++ .unwrap(); ++ assert_eq!(preferences.translation_target_languages, vec![expected]); ++ assert_eq!(preferences.translation_target_language, expected); ++ assert!(!preferences.translation_target_languages_present); ++ } ++ let defaults: UserPreferences = serde_json::from_value(json!({})).unwrap(); ++ assert!(defaults.translation_target_languages.is_empty()); ++ assert!(defaults.translation_target_language.is_empty()); ++ } ++ ++ #[test] ++ fn explicit_targets_canonicalize_dedupe_keep_order_and_validate_selection() { ++ let preferences: UserPreferences = serde_json::from_value(json!({ ++ "translationTargetLanguages": ["ja", " en ", "English", "", "繁體中文", "zh-TW"], ++ "translationTargetLanguage": "en", ++ })) ++ .unwrap(); ++ assert_eq!( ++ preferences.translation_target_languages, ++ vec!["日本語", "English", "繁体中文"] ++ ); ++ assert_eq!(preferences.translation_target_language, "English"); ++ assert!(preferences.translation_target_languages_present); ++ let invalid_selection: UserPreferences = serde_json::from_value(json!({ ++ "translationTargetLanguages": ["ja", "en"], ++ "translationTargetLanguage": "fr", ++ })) ++ .unwrap(); ++ assert_eq!(invalid_selection.translation_target_language, "Français"); ++ assert_eq!( ++ invalid_selection.translation_target_languages, ++ vec!["日本語", "English", "Français"] ++ ); ++ } ++ ++ #[test] ++ fn explicit_empty_list_clears_selected_target_and_marker_is_not_wire_data() { ++ let preferences: UserPreferences = serde_json::from_value(json!({ ++ "translationTargetLanguages": [], ++ "translationTargetLanguage": "en", ++ "translationTargetLanguagesPresent": false, ++ })) ++ .unwrap(); ++ assert!(preferences.translation_target_languages_present); ++ assert!(preferences.translation_target_languages.is_empty()); ++ assert!(preferences.translation_target_language.is_empty()); ++ let value = serde_json::to_value(preferences).unwrap(); ++ assert!(value.get("translationTargetLanguagesPresent").is_none()); ++ let forged: UserPreferences = serde_json::from_value(json!({ ++ "translationTargetLanguage": "en", ++ "translationTargetLanguagesPresent": true, ++ })) ++ .unwrap(); ++ assert!(!forged.translation_target_languages_present); ++ } ++ ++ #[test] ++ fn unknown_new_additions_fail_but_historical_targets_survive() { ++ let previous: UserPreferences = serde_json::from_value(json!({ ++ "translationTargetLanguage": "Historical custom target", ++ })) ++ .unwrap(); ++ let mut next = previous.clone(); ++ reconcile_translation_settings(&previous, &mut next).unwrap(); ++ assert_eq!( ++ next.translation_target_languages, ++ vec!["Historical custom target"] ++ ); ++ assert_eq!( ++ validate_session_translation_target(&next, "Historical custom target").unwrap(), ++ "Historical custom target" ++ ); ++ next.translation_target_languages ++ .push("Unknown new target".into()); ++ assert_eq!( ++ reconcile_translation_settings(&previous, &mut next) ++ .unwrap_err() ++ .code, ++ crate::errors::BackendErrorCode::InvalidArgument ++ ); ++ } ++ ++ #[test] ++ fn old_client_scalar_updates_preserve_order_and_disabled_selection() { ++ let previous: UserPreferences = serde_json::from_value(json!({ ++ "translationTargetLanguages": ["en", "ja"], ++ "translationTargetLanguage": "en", ++ })) ++ .unwrap(); ++ for (scalar, selected, targets) in [ ++ ("en", "English", vec!["English", "日本語"]), ++ ("ja", "日本語", vec!["English", "日本語"]), ++ ("fr", "Français", vec!["English", "日本語", "Français"]), ++ ("", "", vec!["English", "日本語"]), ++ ] { ++ let mut next: UserPreferences = serde_json::from_value(json!({ ++ "translationTargetLanguage": scalar, ++ })) ++ .unwrap(); ++ reconcile_translation_settings(&previous, &mut next).unwrap(); ++ assert_eq!(next.translation_target_languages, targets); ++ assert_eq!(next.translation_target_language, selected); ++ } ++ } ++} +diff --git a/crates/openless-core/src/shared_types.rs b/crates/openless-core/src/shared_types.rs +index ddb570f9..f2ad5f27 100644 +--- a/crates/openless-core/src/shared_types.rs ++++ b/crates/openless-core/src/shared_types.rs +@@ -551,12 +551,21 @@ pub struct UserPreferences { + /// model knows which languages the user works in. See issue #4. + #[serde(default = "default_working_languages")] + pub working_languages: Vec, +- /// Translation output target language (single-select, native name). +- /// Empty = translation mode off (Shift combos are inert). The frontend +- /// picks from the built-in language list; the backend just splices the +- /// native name into the prompt. See issue #4. ++ /// Legacy selected translation target (canonical native name, or a preserved custom name). ++ /// Empty disables legacy translation gestures without erasing configured choices. + #[serde(default)] + pub translation_target_language: String, ++ /// Ordered, duplicate-free translation choices, separate from working/ASR/UI languages. ++ #[serde(default)] ++ pub translation_target_languages: Vec, ++ /// Wire presence distinguishes an old client's whole-document save from explicit deletion. ++ #[doc(hidden)] ++ #[serde(skip)] ++ pub translation_target_languages_present: bool, ++ /// Retains the submitted scalar until an empty list can be reconciled with stored choices. ++ #[doc(hidden)] ++ #[serde(skip)] ++ pub translation_target_language_input: Option, + /// Chinese output script preference (not exposed as a UI switch): + /// - Simplified: prefer simplified for Chinese output + /// - Traditional: prefer traditional for Chinese output +@@ -1093,6 +1102,8 @@ struct UserPreferencesWire { + windows_show_openless_in_keyboard_list: bool, + working_languages: Vec, + translation_target_language: String, ++ #[serde(default)] ++ translation_target_languages: Option>, + chinese_script_preference: ChineseScriptPreference, + #[serde(default)] + output_language_preference: OutputLanguagePreference, +@@ -1346,6 +1357,7 @@ impl Default for UserPreferencesWire { + windows_show_openless_in_keyboard_list: prefs.windows_show_openless_in_keyboard_list, + working_languages: prefs.working_languages, + translation_target_language: prefs.translation_target_language, ++ translation_target_languages: None, + chinese_script_preference: prefs.chinese_script_preference, + output_language_preference: prefs.output_language_preference, + qa_hotkey: prefs.qa_hotkey, +@@ -1470,6 +1482,15 @@ impl<'de> Deserialize<'de> for UserPreferences { + selection_polish_hotkey = None; + } + } ++ let translation_target_languages_present = wire.translation_target_languages.is_some(); ++ let translation_target_language_input = wire.translation_target_languages.as_ref() ++ .filter(|targets| targets.is_empty()) ++ .map(|_| wire.translation_target_language.clone()); ++ let (translation_target_languages, translation_target_language) = ++ crate::settings::migrate_translation_targets( ++ wire.translation_target_languages, ++ &wire.translation_target_language, ++ ); + let streaming_insert_default_migrated = wire.streaming_insert_default_migrated; + let streaming_insert = if streaming_insert_default_migrated { + wire.streaming_insert +@@ -1575,7 +1596,10 @@ impl<'de> Deserialize<'de> for UserPreferences { + ), + windows_show_openless_in_keyboard_list: wire.windows_show_openless_in_keyboard_list, + working_languages: wire.working_languages, +- translation_target_language: wire.translation_target_language, ++ translation_target_language, ++ translation_target_languages, ++ translation_target_languages_present, ++ translation_target_language_input, + chinese_script_preference: wire.chinese_script_preference, + output_language_preference: wire.output_language_preference, + qa_hotkey: if cfg!(target_os = "linux") { wire.qa_hotkey } else { None }, // retired desktop follow-up shortcut +@@ -1966,6 +1990,9 @@ impl Default for UserPreferences { + windows_show_openless_in_keyboard_list: true, + working_languages: default_working_languages(), + translation_target_language: String::new(), ++ translation_target_languages: Vec::new(), ++ translation_target_languages_present: false, ++ translation_target_language_input: None, + chinese_script_preference: ChineseScriptPreference::Auto, + output_language_preference: OutputLanguagePreference::Auto, + qa_hotkey: default_qa_hotkey(), diff --git a/openless-all/ios/README.md b/openless-all/ios/README.md index 750f90443..9352b71c9 100644 --- a/openless-all/ios/README.md +++ b/openless-all/ios/README.md @@ -33,6 +33,8 @@ Normal speech recognition uses bundled SenseVoice Small int8. Developer settings Requirements: an Apple silicon Mac, Xcode 27 with its command-line tools selected, Python 3, CMake, Git, and Rustup. Bootstrap installs Rust 1.99.0 and the two iOS targets, and pins native dependencies and XcodeGen. Downloaded speech artifacts and prediction sources are checksum-verified. +Desktop sources under `openless-all/app/` follow `beta` unchanged. `scripts/prepare-core.py` copies the checked-in Core into the ignored `CoreHost/.build/core-source/` directory and applies `CoreHost/Patches/ios-input-contracts.patch` there. The iOS Rust workspace builds and tests that copy. The patch adds the mobile input contracts without changing the Core used by desktop, Android, or Linux. Bootstrap, tests, native builds, and license collection prepare the copy automatically; incompatible upstream changes fail patch validation. + ```sh cd openless-all/ios ./scripts/bootstrap.sh @@ -70,7 +72,7 @@ python3 scripts/validate-project.py IOS_SIMULATOR_ID= ./scripts/test.sh ui ``` -Unit checks cover shared contracts, preferences, delivery, Rust Host processing, real Rime composition, predictions, and audio conversion. UI tests exercise the installed extension and host app; use a dedicated simulator because they configure keyboard settings. `test.sh all` combines both suites. The GitHub iOS workflow checks shared Swift contracts, the Rust Host, and localization on iOS/Core changes. Runtime microphone, routing, and PiP behavior still require device testing. +Unit checks cover shared contracts, preferences, delivery, the mobile Core and Rust Host, real Rime composition, predictions, and audio conversion. UI tests exercise the installed extension and host app; use a dedicated simulator because they configure keyboard settings. `test.sh all` combines both suites. The GitHub iOS workflow verifies that shared sources remain unchanged, runs mobile Swift/Rust/resource tests, builds the native dependencies and unsigned iPhone app, and validates the IPA. Runtime microphone, routing, and PiP behavior still require device testing. ## Source layout @@ -82,7 +84,7 @@ Unit checks cover shared contracts, preferences, delivery, Rust Host processing, | `PlatformShared/` | Shared native controls and container access | | `Packages/OpenLessShared/` | Versioned mailbox, preferences, gestures, and delivery contracts | | `Packages/LocalSpeech/` | SenseVoice runtime adapter used by the app | -| `CoreHost/` | Independent Rust workspace and C ABI over `app/crates/openless-core` | +| `CoreHost/` | iOS Rust workspace, C ABI, and isolated Core source patch | | `RimeBridge/` | Objective-C++ composition and vocabulary bridge | | `Resources/` | Brand assets, localization, input schemas, privacy manifest, and licenses | | `AppTests/`, `UITests/`, `Tests/` | Native, extension, and runtime fixtures | diff --git a/openless-all/ios/scripts/audio-smoke.swift b/openless-all/ios/scripts/audio-smoke.swift index efef6f82f..418814d8c 100644 --- a/openless-all/ios/scripts/audio-smoke.swift +++ b/openless-all/ios/scripts/audio-smoke.swift @@ -3,7 +3,11 @@ import Foundation @main struct AudioSmoke { static func main() async throws { + var combinations = 0 for legacy in [false, true] { + if !legacy { + if #unavailable(macOS 27) { continue } + } for rate in [8_000.0, 16_000, 44_100, 48_000] { for channels: AVAudioChannelCount in [1, 2] { let worker = PCMWorker() @@ -26,8 +30,10 @@ import Foundation for channel in 0.. 0.005 && power < 0.1, "invalid PCM amplitude") print("PCM \(legacy ? "legacy copy" : "immutable") \(Int(rate))Hz × \(channels) → 16kHz mono: \(samples.count) samples") + combinations += 1 } } } - print("Audio conversion smoke passed: 16 combinations; no microphone was opened.") + print("Audio conversion smoke passed: \(combinations) combinations; no microphone was opened.") } } diff --git a/openless-all/ios/scripts/bootstrap.sh b/openless-all/ios/scripts/bootstrap.sh index 330d5d4e9..ee27bfd81 100755 --- a/openless-all/ios/scripts/bootstrap.sh +++ b/openless-all/ios/scripts/bootstrap.sh @@ -22,4 +22,5 @@ echo "7009fe1faa1697476bdc7027703a2badb84e849b7b0baad5086b087b971f8617 $BOOST" swift build --package-path "$ROOT/.build-tools/XcodeGen" -c release rustup toolchain install 1.99.0 --profile minimal rustup target add --toolchain 1.99.0 aarch64-apple-ios aarch64-apple-ios-sim +python3 "$ROOT/scripts/prepare-core.py" echo "Dependencies ready. Run scripts/build-rime.sh, then scripts/build-core.sh." diff --git a/openless-all/ios/scripts/build-core.sh b/openless-all/ios/scripts/build-core.sh index 8458d18b4..3b793c0b5 100755 --- a/openless-all/ios/scripts/build-core.sh +++ b/openless-all/ios/scripts/build-core.sh @@ -1,6 +1,12 @@ #!/bin/bash set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" +PLATFORM="${1:-all}" +case "$PLATFORM" in + all|device|simulator) ;; + *) echo 'Usage: scripts/build-core.sh [all|device|simulator]' >&2; exit 2;; +esac +python3 "$ROOT/scripts/prepare-core.py" # Homebrew rustc can precede rustup shims even when cargo is launched by rustup. export RUSTC="$(rustup which --toolchain 1.99.0 rustc)" export RUSTDOC="$(rustup which --toolchain 1.99.0 rustdoc)" @@ -8,6 +14,7 @@ export RUSTDOC="$(rustup which --toolchain 1.99.0 rustdoc)" export CARGO_TARGET_DIR="${CARGO_TARGET_DIR:-$ROOT/.build/core-ios16}" for spec in "device:aarch64-apple-ios:iphoneos" "simulator:aarch64-apple-ios-sim:iphonesimulator"; do IFS=: read -r platform target sdk <<< "$spec" + [ "$PLATFORM" = all ] || [ "$PLATFORM" = "$platform" ] || continue mkdir -p "$ROOT/Frameworks/$platform" IPHONEOS_DEPLOYMENT_TARGET=16.0 SDKROOT="$(xcrun --sdk "$sdk" --show-sdk-path)" \ rustup run 1.99.0 cargo build --manifest-path "$ROOT/CoreHost/Cargo.toml" --locked --release --target "$target" diff --git a/openless-all/ios/scripts/collect-rust-licenses.py b/openless-all/ios/scripts/collect-rust-licenses.py index 6dfd7830f..bdf3b1e2b 100644 --- a/openless-all/ios/scripts/collect-rust-licenses.py +++ b/openless-all/ios/scripts/collect-rust-licenses.py @@ -6,6 +6,7 @@ from pathlib import Path root = Path(__file__).resolve().parents[1] +subprocess.run(["python3", str(root / "scripts/prepare-core.py")], check=True) metadata = json.loads(subprocess.check_output([ "rustup", "run", "1.99.0", "cargo", "metadata", "--format-version", "1", "--manifest-path", str(root / "CoreHost/Cargo.toml"), "--locked", diff --git a/openless-all/ios/scripts/prepare-core.py b/openless-all/ios/scripts/prepare-core.py new file mode 100644 index 000000000..ac5862d55 --- /dev/null +++ b/openless-all/ios/scripts/prepare-core.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 +"""Prepare an isolated Core source tree for the iOS host without editing shared sources.""" +import fcntl +import hashlib +import json +import os +from pathlib import Path +import re +import shutil +import subprocess +import tempfile + + +IOS = Path(__file__).resolve().parents[1] +APP = IOS.parent / "app" +CORE = APP / "crates/openless-core" +PATCH = IOS / "CoreHost/Patches/ios-input-contracts.patch" +BUILD = IOS / "CoreHost/.build" +OUTPUT = BUILD / "core-source" + + +def checksum(path): + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def generated_files(root): + return {str(path.relative_to(root)): checksum(path) + for path in sorted(root.rglob("*")) if path.is_file()} + + +def main(): + repository = Path(subprocess.check_output( + ["git", "rev-parse", "--show-toplevel"], cwd=IOS, text=True).strip()) + names = subprocess.check_output( + ["git", "ls-files", "-z", "--", str(CORE.relative_to(repository))], + cwd=repository).decode().split("\0") + sources = [repository / name for name in names if name] + if not sources or not (CORE / "Cargo.toml").is_file(): + raise RuntimeError("The checked-in shared Core source is required") + before = {str(path.relative_to(APP)): checksum(path) for path in sources} + patch = PATCH.read_text() + paths = re.findall(r"^(?:---|\+\+\+) [ab]/(.+)$", patch, re.MULTILINE) + paths += [path for pair in re.findall(r"^diff --git a/(\S+) b/(\S+)$", patch, re.MULTILINE) for path in pair] + if not paths: + raise RuntimeError("The iOS Core patch contains no source paths") + for path in paths: + if not path.startswith("crates/openless-core/") or ".." in Path(path).parts: + raise RuntimeError(f"Patch escapes the iOS Core copy: {path}") + fingerprint = hashlib.sha256(json.dumps({ + "sources": before, "patch": checksum(PATCH), "script": checksum(Path(__file__)), + }, sort_keys=True).encode()).hexdigest() + BUILD.mkdir(exist_ok=True) + with (BUILD / "core-source.lock").open("a") as lock: + fcntl.flock(lock, fcntl.LOCK_EX) + stamp = OUTPUT / "source.json" + if stamp.is_file(): + saved = json.loads(stamp.read_text()) + if saved.get("fingerprint") == fingerprint and saved.get("generated") == generated_files(OUTPUT / "crates/openless-core"): + print(f"iOS Core source is current: {OUTPUT}") + return + staging = Path(tempfile.mkdtemp(prefix="core-source-", dir=BUILD)) + try: + for source in sources: + destination = staging / source.relative_to(APP) + destination.parent.mkdir(parents=True, exist_ok=True) + shutil.copy2(source, destination) + # Unmodified sibling crates and include_str resources remain shared and read-only. + for sibling in (APP / "crates").iterdir(): + if sibling.name != "openless-core" and sibling.is_dir(): + (staging / "crates" / sibling.name).symlink_to(sibling, target_is_directory=True) + for name in ["assets", "contract", "src"]: + (staging / name).symlink_to(APP / name, target_is_directory=True) + environment = os.environ.copy() + for name in ["GIT_DIR", "GIT_WORK_TREE", "GIT_INDEX_FILE"]: + environment.pop(name, None) + environment["GIT_CEILING_DIRECTORIES"] = str(BUILD) + subprocess.run(["git", "apply", "--check", str(PATCH)], cwd=staging, env=environment, check=True) + subprocess.run(["git", "apply", str(PATCH)], cwd=staging, env=environment, check=True) + after = {str(path.relative_to(APP)): checksum(path) for path in sources} + if after != before: + raise RuntimeError("Shared Core changed while preparing the iOS copy") + (staging / "source.json").write_text(json.dumps({ + "fingerprint": fingerprint, + "generated": generated_files(staging / "crates/openless-core"), + }, indent=2) + "\n") + if OUTPUT.exists(): + shutil.rmtree(OUTPUT) + staging.rename(OUTPUT) + finally: + if staging.exists(): + shutil.rmtree(staging) + print(f"Prepared isolated iOS Core source: {OUTPUT}") + + +if __name__ == "__main__": + main() diff --git a/openless-all/ios/scripts/test-audio.sh b/openless-all/ios/scripts/test-audio.sh index 59ace9dd5..7b31fa0de 100755 --- a/openless-all/ios/scripts/test-audio.sh +++ b/openless-all/ios/scripts/test-audio.sh @@ -2,7 +2,7 @@ set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" mkdir -p "$ROOT/.build/tests" -xcrun swiftc -swift-version 6 -target arm64-apple-macos27.0 -parse-as-library \ +xcrun swiftc -swift-version 6 -target "$(uname -m)-apple-macos14.0" -parse-as-library \ "$ROOT/App/Speech/AudioPCM.swift" "$ROOT/scripts/audio-smoke.swift" \ -o "$ROOT/.build/tests/audio-smoke" "$ROOT/.build/tests/audio-smoke" diff --git a/openless-all/ios/scripts/test.sh b/openless-all/ios/scripts/test.sh index a4e94e6fc..095734ce4 100755 --- a/openless-all/ios/scripts/test.sh +++ b/openless-all/ios/scripts/test.sh @@ -7,10 +7,11 @@ case "$SUITE" in *) echo 'Usage: scripts/test.sh unit|ui|all' >&2; exit 2;; esac if [ "$SUITE" = unit ] || [ "$SUITE" = all ]; then + python3 "$ROOT/scripts/prepare-core.py" export RUSTC="$(rustup which --toolchain 1.99.0 rustc)" export RUSTDOC="$(rustup which --toolchain 1.99.0 rustdoc)" swift test --package-path "$ROOT/Packages/OpenLessShared" - rustup run 1.99.0 cargo test --manifest-path "$ROOT/CoreHost/Cargo.toml" --locked + rustup run 1.99.0 cargo test --manifest-path "$ROOT/CoreHost/Cargo.toml" --workspace --lib --locked "$ROOT/scripts/test-rime.sh" bash "$ROOT/scripts/test-predictions.sh" "$ROOT/scripts/test-audio.sh"