Compare commits

...

No commits in common. 'master' and 'allelo' have entirely different histories.

  1. 2
      .cargo/config.toml
  2. 5512
      Cargo.lock
  3. 87
      Cargo.toml
  4. 138
      DEV.md
  5. 10
      README.md
  6. 25
      app/allelo/.gitignore
  7. 3
      app/allelo/.vscode/extensions.json
  8. 9
      app/allelo/README.md
  9. BIN
      app/allelo/app-icon-ios.png
  10. BIN
      app/allelo/app-icon.png
  11. 1651
      app/allelo/bun.lock
  12. 26
      app/allelo/eslint.config.js
  13. 18
      app/allelo/index.html
  14. 60
      app/allelo/jest.config.js
  15. 80
      app/allelo/package.json
  16. 32
      app/allelo/prepare-web-file.cjs
  17. 7
      app/allelo/src-tauri/.gitignore
  18. 39
      app/allelo/src-tauri/Cargo.toml
  19. 0
      app/allelo/src-tauri/build.rs
  20. 14
      app/allelo/src-tauri/capabilities/default.json
  21. 0
      app/allelo/src-tauri/gen/android/.editorconfig
  22. 0
      app/allelo/src-tauri/gen/android/.gitignore
  23. 6
      app/allelo/src-tauri/gen/android/app/.gitignore
  24. 70
      app/allelo/src-tauri/gen/android/app/build.gradle.kts
  25. 21
      app/allelo/src-tauri/gen/android/app/proguard-rules.pro
  26. 37
      app/allelo/src-tauri/gen/android/app/src/main/AndroidManifest.xml
  27. BIN
      app/allelo/src-tauri/gen/android/app/src/main/ic_launcher-playstore.png
  28. 11
      app/allelo/src-tauri/gen/android/app/src/main/java/eco/allelo/pnm/prototype/MainActivity.kt
  29. 0
      app/allelo/src-tauri/gen/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
  30. 0
      app/allelo/src-tauri/gen/android/app/src/main/res/drawable/ic_launcher_background.xml
  31. 0
      app/allelo/src-tauri/gen/android/app/src/main/res/layout/activity_main.xml
  32. 5
      app/allelo/src-tauri/gen/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
  33. 5
      app/allelo/src-tauri/gen/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
  34. BIN
      app/allelo/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp
  35. BIN
      app/allelo/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp
  36. BIN
      app/allelo/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
  37. BIN
      app/allelo/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp
  38. BIN
      app/allelo/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp
  39. BIN
      app/allelo/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
  40. BIN
      app/allelo/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
  41. BIN
      app/allelo/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp
  42. BIN
      app/allelo/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
  43. BIN
      app/allelo/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
  44. BIN
      app/allelo/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp
  45. BIN
      app/allelo/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
  46. BIN
      app/allelo/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
  47. BIN
      app/allelo/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp
  48. BIN
      app/allelo/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
  49. 6
      app/allelo/src-tauri/gen/android/app/src/main/res/values-night/themes.xml
  50. 10
      app/allelo/src-tauri/gen/android/app/src/main/res/values/colors.xml
  51. 4
      app/allelo/src-tauri/gen/android/app/src/main/res/values/ic_launcher_background.xml
  52. 4
      app/allelo/src-tauri/gen/android/app/src/main/res/values/strings.xml
  53. 6
      app/allelo/src-tauri/gen/android/app/src/main/res/values/themes.xml
  54. 0
      app/allelo/src-tauri/gen/android/app/src/main/res/xml/file_paths.xml
  55. 22
      app/allelo/src-tauri/gen/android/build.gradle.kts
  56. 23
      app/allelo/src-tauri/gen/android/buildSrc/build.gradle.kts
  57. 52
      app/allelo/src-tauri/gen/android/buildSrc/src/main/java/eco/allelo/pnm/prototype/kotlin/BuildTask.kt
  58. 0
      app/allelo/src-tauri/gen/android/buildSrc/src/main/java/eco/allelo/pnm/prototype/kotlin/RustPlugin.kt
  59. 24
      app/allelo/src-tauri/gen/android/gradle.properties
  60. 0
      app/allelo/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.jar
  61. 6
      app/allelo/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.properties
  62. 0
      app/allelo/src-tauri/gen/android/gradlew
  63. 89
      app/allelo/src-tauri/gen/android/gradlew.bat
  64. 0
      app/allelo/src-tauri/gen/android/settings.gradle
  65. 3
      app/allelo/src-tauri/gen/apple/.gitignore
  66. 489
      app/allelo/src-tauri/gen/apple/AlleloPNM.xcodeproj/project.pbxproj
  67. 7
      app/allelo/src-tauri/gen/apple/AlleloPNM.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  68. 10
      app/allelo/src-tauri/gen/apple/AlleloPNM.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
  69. 123
      app/allelo/src-tauri/gen/apple/AlleloPNM.xcodeproj/xcshareddata/xcschemes/AlleloPNM_iOS.xcscheme
  70. 5
      app/allelo/src-tauri/gen/apple/AlleloPNM_iOS/AlleloPNM_iOS.entitlements
  71. 44
      app/allelo/src-tauri/gen/apple/AlleloPNM_iOS/Info.plist
  72. BIN
      app/allelo/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png
  73. BIN
      app/allelo/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x-1.png
  74. BIN
      app/allelo/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x.png
  75. BIN
      app/allelo/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@3x.png
  76. BIN
      app/allelo/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@1x.png
  77. BIN
      app/allelo/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x-1.png
  78. BIN
      app/allelo/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x.png
  79. BIN
      app/allelo/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@3x.png
  80. BIN
      app/allelo/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@1x.png
  81. BIN
      app/allelo/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x-1.png
  82. BIN
      app/allelo/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x.png
  83. BIN
      app/allelo/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@3x.png
  84. BIN
      app/allelo/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png
  85. BIN
      app/allelo/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@2x.png
  86. BIN
      app/allelo/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@3x.png
  87. BIN
      app/allelo/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@1x.png
  88. BIN
      app/allelo/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@2x.png
  89. BIN
      app/allelo/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5x83.5@2x.png
  90. 116
      app/allelo/src-tauri/gen/apple/Assets.xcassets/AppIcon.appiconset/Contents.json
  91. 6
      app/allelo/src-tauri/gen/apple/Assets.xcassets/Contents.json
  92. 8
      app/allelo/src-tauri/gen/apple/ExportOptions.plist
  93. 30
      app/allelo/src-tauri/gen/apple/LaunchScreen.storyboard
  94. 21
      app/allelo/src-tauri/gen/apple/Podfile
  95. 8
      app/allelo/src-tauri/gen/apple/Sources/AlleloPNM/bindings/bindings.h
  96. 6
      app/allelo/src-tauri/gen/apple/Sources/AlleloPNM/main.mm
  97. 88
      app/allelo/src-tauri/gen/apple/project.yml
  98. BIN
      app/allelo/src-tauri/icons/128x128.png
  99. BIN
      app/allelo/src-tauri/icons/128x128@2x.png
  100. BIN
      app/allelo/src-tauri/icons/32x32.png
  101. Some files were not shown because too many files have changed in this diff Show More

@ -0,0 +1,2 @@
[target.wasm32-unknown-unknown]
rustflags = ['--cfg', 'getrandom_backend="wasm_js"']

5512
Cargo.lock generated

File diff suppressed because it is too large Load Diff

@ -1,28 +1,30 @@
[workspace]
resolver = "2"
members = [
"nextgraph",
"ngcli",
"ngd",
"ng-repo",
"ng-net",
"ng-broker",
"ng-client-ws",
"ng-verifier",
"ng-wallet",
"ng-storage-rocksdb",
"ng-sdk-js",
"ng-sdk-python",
"ng-app/src-tauri",
"ng-oxigraph",
"helpers/wasm-tools",
"helpers/ngnet",
"helpers/ngapp",
"helpers/ngaccount",
"engine/repo",
"engine/net",
"engine/broker",
"engine/client-ws",
"engine/verifier",
"engine/wallet",
"engine/storage-rocksdb",
"engine/oxigraph",
"sdk/rust",
"sdk/js/lib-wasm",
"sdk/python",
"bin/ngd",
"bin/ngcli",
"infra/ngaccount",
"infra/ngapp",
"infra/ngnet",
"app/nextgraph/src-tauri",
"app/allelo/src-tauri",
"app/tauri-plugin-contacts-importer",
]
default-members = [ "nextgraph", "ngcli", "ngd" ]
default-members = ["sdk/rust"]
[workspace.package]
version = "0.1.1-alpha.2"
version = "0.1.2"
edition = "2021"
rust-version = "1.81.0"
license = "MIT/Apache-2.0"
@ -30,10 +32,31 @@ authors = ["Niko PLP <niko@nextgraph.org>"]
repository = "https://git.nextgraph.org/NextGraph/nextgraph-rs"
homepage = "https://nextgraph.org"
keywords = [
"crdt","dapp","decentralized","e2ee","local-first","p2p","semantic-web","eventual-consistency","json-ld","markdown",
"ocap","vc","offline-first","p2p-network","collaboration","privacy-protection","rdf","rich-text-editor","self-hosted",
"sparql","byzantine-fault-tolerance",
"web3", "graph-database", "database","triplestore"
"crdt",
"dapp",
"decentralized",
"e2ee",
"local-first",
"p2p",
"semantic-web",
"eventual-consistency",
"json-ld",
"markdown",
"ocap",
"vc",
"offline-first",
"p2p-network",
"collaboration",
"privacy-protection",
"rdf",
"rich-text-editor",
"self-hosted",
"sparql",
"byzantine-fault-tolerance",
"web3",
"graph-database",
"database",
"triplestore",
]
documentation = "https://docs.nextgraph.org/"
@ -41,9 +64,25 @@ documentation = "https://docs.nextgraph.org/"
lto = true
opt-level = 's'
[profile.test]
opt-level = 1
debug = "full"
[profile.profiling]
inherits = "dev"
opt-level = 1
debug = "full"
[profile.dev]
opt-level = 2
[patch.crates-io]
# tauri = { git = "https://github.com/simonhyll/tauri.git", branch="fix/ipc-mixup"}
# tauri = { git = "https://git.nextgraph.org/NextGraph/tauri.git", branch="alpha.11-nextgraph", features = ["no-ipc-custom-protocol"] }
[workspace.dependencies]
[workspace.metadata.scripts]
libwasm = "cd sdk/js/lib-wasm && cargo run-script app && cd ../../.."
libwasmdev3 = "cd sdk/js/lib-wasm && cargo run-script appdev3 && cd ../../.."

138
DEV.md

@ -1,20 +1,26 @@
# Contributors or compilation guide
- [Install Rust](https://www.rust-lang.org/tools/install) minimum required MSRV 1.81.0
- [Install Nodejs](https://nodejs.org/en/download/)
- [Install LLVM](https://rust-lang.github.io/rust-bindgen/requirements.html)
- [Install Rust](https://www.rust-lang.org/tools/install) minimum required MSRV 1.81.0
- [Install Nodejs](https://nodejs.org/en/download/)
- [Install LLVM](https://rust-lang.github.io/rust-bindgen/requirements.html)
On OpenBSD, for LLVM you need to choose llvm-17.
Until this [PR](https://github.com/rustwasm/wasm-pack/pull/1271) is accepted, will have to install wasm-pack this way:
On MacOS, there are several bugs with LLVM above version 17. So you have to install version 17 only.
```
brew install llvm@17
```
On all platforms, we have to install wasm-pack this way:
```
cargo install wasm-pack --git https://git.nextgraph.org/NextGraph/wasm-pack.git --branch master
```
On Debian distros
```
sudo apt install pkg-config gcc build-essential libglib2.0-dev libgtk-3-dev libwebkit2gtk-4.1-dev
sudo apt install pkg-config gcc build-essential libglib2.0-dev libgtk-3-dev libwebkit2gtk-4.1-dev gcc-multilib curl wget file libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev
```
```
@ -25,16 +31,7 @@ git clone git@git.nextgraph.org:NextGraph/nextgraph-rs.git
// or if you don't have a git account with us: git clone https://git.nextgraph.org/NextGraph/nextgraph-rs.git
cd nextgraph-rs
npm install -g pnpm
cd ng-sdk-js
cargo run-script app
cd ..
cd helpers/wasm-tools
cargo run-script app
cd ../..
pnpm -C ./ng-app install
pnpm -C ./ng-app webfilebuild
pnpm -C ./helpers/app-auth install
pnpm -C ./helpers/app-auth build
pnpm buildfront
```
For building the native apps, see the [ng-app/README](ng-app/README.md)
@ -49,23 +46,29 @@ If you prefer to change the base directory, use the argument `--base [PATH]` whe
cargo run -p ngd -- -vv --save-key -l 14400
```
If you are developing also the front-end, you should run it with this command in a separate terminal:
```
cd ng-app
pnpm -C ../helpers/net-auth builddev
pnpm -C ../helpers/app-auth builddev
pnpm -C ../helpers/net-bootstrap builddev
pnpm webdev
```
In the logs/output of ngd, you will see an invitation link that you should open in your web browser. If there are many links, choose the one that starts with `http://localhost:`, and if you run a local front-end, replace the prefix `http://localhost:14400/` with `http://localhost:1421/` before you open the link in your browser.
The computer you use to open the link should have direct access to the ngd server on localhost. In most of the cases, it will work, as you are running ngd on localhost. If you are running ngd in a docker container, then you need to give access to the container to the local network of the host by using `docker run --network="host"`. see more here https://docs.docker.com/network/drivers/host/
Follow the steps on the screen to create your wallet :)
Once your ngd server will run in your dev env, replace the string in `nextgraph/src/local_broker_dev_env.rs` with the actual PEER ID of your ngd server that is displayed when you first start `ngd`, with a line starting with `INFO ngd] PeerId of node:`.
Once your ngd server will run in your dev env, replace the string in `sdk/rust/src/local_broker_dev_env.rs` with the actual PEER ID of your ngd server that is displayed when you first start `ngd`, with a line starting with `INFO ngd] PeerId of node:`. This step is needed if you want to test or develop the import of wallet with QRCode.
More details about usage of ngd [here](bin/ngd/README.md).
### If you are developing the front-end too
If you are also developing the front-end of NextGraph app, you should run it with this command in a separate terminal:
```
// run this only once, from root folder:
pnpm buildfrontdev
// to start the front-end for development
cd app/nextgraph
pnpm webdev
```
more details about developing the front-end [here](app/nextgraph/README.md).
### Using ngcli with the account you just created
@ -86,7 +89,7 @@ cargo run -p ngcli -- --save-key --save-config -s 127.0.0.1,14400,<PEER_ID_OF_SE
In your dev env, if you want to create more wallets and accounts, you have 2 options:
- creating an invitation link from the admin account
- creating an invitation link from the admin account
```
cargo run -p ngcli -- -s 127.0.0.1,14400,<PEER_ID_OF_SERVER> -u <THE_PRIVATE_KEY_OF_THE_USER_YOU_JUST_CREATED> admin add-invitation --notos
@ -94,7 +97,7 @@ cargo run -p ngcli -- -s 127.0.0.1,14400,<PEER_ID_OF_SERVER> -u <THE_PRIVATE_KEY
and then open the link after replacing the port number from `14400` to `1421` (if you are running the front-end in development mode).
- run a local instance of `ngaccount`. this is useful if you want to test or develop the ngaccount part of the flow..
- run a local instance of `ngaccount`. this is useful if you want to test or develop the ngaccount part of the flow..
See the [README of ngaccount here](ngaccount/README.md).
@ -106,23 +109,37 @@ Then you need to stop your ngd and start it again with the additional option :
### Packages
The crates are organized as follow :
- [nextgraph](nextgraph/README.md) : Client library. Use this crate to embed NextGraph client in your Rust application
- [ngcli](ngcli/README.md) : CLI tool to manipulate the local documents and repos and administrate the server
- [ngd](ngd/README.md) : binary executable of the daemon (that can run a broker, verifier and/or Rust services)
- [ng-app](ng-app/README.md) : all the native apps, based on Tauri, and the official web app.
- [ng-sdk-js](ng-sdk-js/DEV.md) : contains the JS SDK, with example for: web app, react app, or node service.
- [ng-sdk-python](ng-sdk-python/README.md) : contains the Python SDK.
- ng-repo : Repositories common library
- ng-net : Network common library
- ng-oxigraph : Fork of OxiGraph. contains our CRDT of RDF
- ng-verifier : Verifier library, that exposes the document API to the app
- ng-wallet : keeps the secret keys of all identities of the user in a safe wallet
- ng-broker : Core and Server Broker library
- ng-client-ws : Websocket client library
- ng-storage-rocksdb : RocksDB backed stores. see also dependency [repo here](https://git.nextgraph.org/NextGraph/rust-rocksdb)
- helpers : all kind of servers and front end code needed for our infrastructure.
The crates and packages are organized as follow :
- app : the main application of NextGraph
- ui-common : common UI elements
- [nextgraph](app/nextgraph/README.md)
- src-tauri : the Tauri based native apps
- src : the Web-based app
- bin : the binaries
- [ngcli](bin/ngcli/README.md) : CLI tool to manipulate the local documents and repos and administrate the server
- [ngd](bin/ngd/README.md) : binary executable of the daemon (that runs a broker, the verifier and additional Rust services)
- engine : the core engine including NGproto
- repo : Repositories common library
- net : Network common library
- oxigraph : Fork of OxiGraph. contains our CRDT of RDF
- verifier : Verifier library, that exposes the document API to the app
- wallet : keeps the secret keys of all identities of the user in a safe wallet
- broker : Core and Server Broker library
- client-ws : Websocket client library
- storage-rocksdb : RocksDB backed stores. see also dependency [repo here](https://git.nextgraph.org/NextGraph/rust-rocksdb)
- infra : tools and binaries for infrastructure of the platform
- ngaccount : broker service provider (BSP) account manager
- ngapp : server of the web app used by self-hosters on the public web
- ngnet : server of nextgraph.net that shelps with authentication of third-party web apps.
- sdk
- [js](sdk/js/README.md)
- api-web : the web version of the API
- [lib-wasm](sdk/js/lib-wasm/DEV.md) : the WASM library used by api-web
- [examples](sdk/js/DEV.md) : example for: web app, React/Svelte app, or node service
- alien-deepsignals, shex-orm and signals : used by the ORM mechanism
- [rust](sdk/rust/README.md) : Client library. Use this crate to embed NextGraph client in your Rust application
- [python](sdk/python/README.md) : contains the Python SDK.
### Test
@ -140,7 +157,7 @@ Test a single crate:
cargo test --package ng-repo --lib -- --show-output --nocapture
cargo test --package ng-wallet --lib -- --show-output --nocapture
cargo test --package ng-verifier --lib -- --show-output --nocapture
cargo test --package ng-sdk-js --lib -- --show-output --nocapture
cargo test --package lib-wasm --lib -- --show-output --nocapture
cargo test --package ng-broker --lib -- --show-output --nocapture
cargo test --package ng-client-ws --lib -- --show-output --nocapture
```
@ -154,7 +171,7 @@ https://googlechromelabs.github.io/chrome-for-testing/
then:
```
cd ng-sdk-js
cd lib-wasm
wasm-pack test --chrome --headless
```
@ -172,13 +189,8 @@ You need to freshly built it from source, following those instructions:
```
cargo install cargo-run-script
npm install -g pnpm
cd ng-sdk-js
cargo run-script app
cd ..
pnpm -C ./ng-app install
pnpm -C ./ng-app webfilebuild
pnpm -C ./helpers/app-auth install
pnpm -C ./helpers/app-auth build
cargo run-script libwasm
pnpm buildfront
```
then build the ngd daemon
@ -197,9 +209,9 @@ cargo build -r -p ngcli
you can then use the binary `target/release/ngcli`
For usage, see the documentation [here](ngd/README.md).
For usage, see the documentation [here](bin/ngd/README.md).
For building the apps, see this [documentation](ng-app/README.md).
For building the native apps, see this [documentation](app/nextgraph/README.md).
#### OpenBSD
@ -238,3 +250,17 @@ The generated documentation can be found in `target/doc/nextgraph`.
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you shall be dual licensed as below, without any
additional terms or conditions.
## License
Licensed under either of
- Apache License, Version 2.0 ([LICENSE-APACHE2](LICENSE-APACHE2) or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
at your option.
`SPDX-License-Identifier: Apache-2.0 OR MIT`
---
NextGraph received funding through the [NGI Assure Fund](https://nlnet.nl/assure) and the [NGI Zero Commons Fund](https://nlnet.nl/commonsfund/), both funds established by [NLnet](https://nlnet.nl/) Foundation with financial support from the European Commission's [Next Generation Internet](https://ngi.eu/) programme, under the aegis of DG Communications Networks, Content and Technology under grant agreements No 957073 and No 101092990, respectively.

@ -11,7 +11,7 @@
[![Crates.io Version](https://img.shields.io/crates/v/nextgraph)](https://crates.io/crates/nextgraph)
[![docs.rs](https://img.shields.io/docsrs/nextgraph)](https://docs.rs/nextgraph)
[node:![NPM Version node](https://img.shields.io/npm/v/nextgraph)](https://www.npmjs.com/package/nextgraph)
[web:![NPM Version web](https://img.shields.io/npm/v/nextgraphweb)](https://www.npmjs.com/package/nextgraphweb)
[web:![NPM Version web](https://img.shields.io/npm/v/@ng-org/web)](https://www.npmjs.com/package/@ng-org/web)
[![PyPI - Version](https://img.shields.io/pypi/v/nextgraphpy)](https://pypi.org/project/nextgraphpy/)
Rust implementation of NextGraph
@ -36,7 +36,7 @@ And our community forum where you can ask questions is here [https://forum.nextg
## How to use NextGraph App & Platform
NextGraph is in alpha release!
NextGraph is in alpha release.
You can try it online or by installing the apps. Please follow our [Getting started](https://docs.nextgraph.org/en/getting-started/) guide .
@ -54,9 +54,9 @@ See our [contributor's guide](DEV.md)
Licensed under either of
- Apache License, Version 2.0 ([LICENSE-APACHE2](LICENSE-APACHE2) or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
at your option.
- Apache License, Version 2.0 ([LICENSE-APACHE2](LICENSE-APACHE2) or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
at your option.
`SPDX-License-Identifier: Apache-2.0 OR MIT`

@ -0,0 +1,25 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
coverage/

@ -0,0 +1,3 @@
{
"recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"]
}

@ -0,0 +1,9 @@
# Allelo Personal Network Manager (PNM) Prototype
```
curl -fsSL https://bun.sh/install | bash
```
## Recommended IDE Setup
- [VS Code](https://code.visualstudio.com/) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer)

Binary file not shown.

After

Width:  |  Height:  |  Size: 641 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

File diff suppressed because it is too large Load Diff

@ -0,0 +1,26 @@
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import tseslint from 'typescript-eslint'
import { globalIgnores } from 'eslint/config'
export default tseslint.config([
globalIgnores(['dist']),
{
files: ['**/*.{ts,tsx}'],
rules: {
"@typescript-eslint/no-explicit-any": "off"
},
extends: [
js.configs.recommended,
tseslint.configs.recommended,
reactHooks.configs['recommended-latest'],
reactRefresh.configs.vite,
],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
},
},
])

File diff suppressed because one or more lines are too long

@ -0,0 +1,60 @@
export default {
preset: 'ts-jest/presets/default-esm',
extensionsToTreatAsEsm: ['.ts', '.tsx'],
transform: {
'^.+\\.(ts|tsx)$': ['ts-jest', {
useESM: true,
isolatedModules: true,
tsconfig: {
jsx: 'react-jsx',
esModuleInterop: true,
moduleResolution: 'nodenext',
baseUrl: '.',
noUnusedLocals: false,
noUnusedParameters: false,
paths: {
'@/*': ['src/*'],
'@/assets/*': ['src/assets/*'],
'@/components/*': ['src/components/*'],
'@/contexts/*': ['src/contexts/*'],
'@/hooks/*': ['src/hooks/*'],
'@/lib/*': ['src/lib/*'],
'@/pages/*': ['src/pages/*'],
'@/providers/*': ['src/providers/*'],
'@/services/*': ['src/services/*'],
'@/stores/*': ['src/stores/*'],
'@/types/*': ['src/types/*'],
'@/utils/*': ['src/utils/*']
}
}
}],
},
testEnvironment: 'jsdom',
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/src/$1',
'^@/assets/(.*)$': '<rootDir>/src/assets/$1',
'^@/components/(.*)$': '<rootDir>/src/components/$1',
'^@/contexts/(.*)$': '<rootDir>/src/contexts/$1',
'^@/hooks/(.*)$': '<rootDir>/src/hooks/$1',
'^@/lib/(.*)$': '<rootDir>/src/lib/$1',
'^@/pages/(.*)$': '<rootDir>/src/pages/$1',
'^@/providers/(.*)$': '<rootDir>/src/providers/$1',
'^@/services/(.*)$': '<rootDir>/src/services/$1',
'^@/stores/(.*)$': '<rootDir>/src/stores/$1',
'^@/types/(.*)$': '<rootDir>/src/types/$1',
'^@/utils/(.*)$': '<rootDir>/src/utils/$1',
},
setupFilesAfterEnv: ['<rootDir>/src/setupTests.ts'],
testMatch: [
'<rootDir>/src/**/__tests__/**/*.(ts|tsx|js)',
'<rootDir>/src/**/*.(spec|test).(ts|tsx|js)',
],
collectCoverageFrom: [
'src/**/*.(ts|tsx)',
'!src/**/*.d.ts',
'!src/main.tsx',
'!src/vite-env.d.ts',
],
coverageDirectory: 'coverage',
coverageReporters: ['text', 'lcov', 'html'],
};

@ -0,0 +1,80 @@
{
"name": "allelo-pnm",
"private": true,
"version": "0.1.0",
"type": "module",
"scripts": {
"dev": "vite --host 0.0.0.0",
"build": "tsc -b && vite build",
"build-importer": "cd ../tauri-plugin-contacts-importer && bun run build",
"check": "tsc -p tsconfig.app.json --noEmit && eslint .",
"build:ldo": "ldo build --input src/.shapes --output src/.ldo && bun fix-ldo-types.js",
"lint": "eslint .",
"preview": "vite preview",
"tauri": "tauri",
"test": "jest",
"test:watch": "jest --watch",
"test:coverage": "jest --coverage",
"webdev": "cross-env NG_ENV_WEB=1 TAURI_DEBUG=1 NG_PUBLIC_DEV=1 vite",
"webbuild": "cross-env NG_ENV_WEB=1 NG_ENV_ONEFILE=1 vite build && node prepare-web-file.cjs",
"libwasm": "cd ../.. && cargo install cargo-run-script && cargo run-script libwasm"
},
"dependencies": {
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.1",
"@ldo/connected-nextgraph": "1.0.0-alpha.15",
"@ldo/ldo": "1.0.0-alpha.14",
"@ldo/react": "1.0.0-alpha.15",
"@react-oauth/google": "^0.12.2",
"@mui/icons-material": "^7.2.0",
"@mui/material": "^7.2.0",
"@rdfjs/data-model": "^1.2.0",
"@rdfjs/types": "^1.0.1",
"qrcode.react": "^4.2.0",
"@tauri-apps/api": "^2.9.0",
"@tauri-apps/plugin-opener": "^2",
"@tauri-apps/plugin-log": "^2.7.0",
"dotenv": "^17.1.0",
"leaflet": "^1.9.4",
"libphonenumber-js": "^1.12.17",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-hook-form": "^7.62.0",
"react-leaflet": "^5.0.0",
"react-router-dom": "^7.6.3",
"react-waypoint": "^10.3.0",
"zustand": "^5.0.6",
"async-proxy": "^0.4.1"
},
"devDependencies": {
"@eslint/js": "^9.30.1",
"@ldo/cli": "1.0.0-alpha.15",
"@testing-library/jest-dom": "^6.4.2",
"@testing-library/react": "^14.2.1",
"@testing-library/user-event": "^14.5.2",
"@types/jest": "^29.5.12",
"@types/jsonld": "^1.5.15",
"@types/leaflet": "^1.9.20",
"@types/react": "^19.1.8",
"@types/react-dom": "^19.1.6",
"@types/react-router-dom": "^5.3.3",
"@types/shexj": "^2.1.7",
"@vitejs/plugin-react": "^4.6.0",
"eslint": "^9.30.1",
"eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-react-refresh": "^0.4.20",
"globals": "^16.3.0",
"jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0",
"ts-jest": "^29.1.2",
"typescript": "~5.8.3",
"typescript-eslint": "^8.35.1",
"vite": "^7.0.4",
"@tauri-apps/cli": "^2.9.1",
"vite-plugin-singlefile": "^2.3.0",
"vite-plugin-top-level-await": "^1.6.0",
"vite-plugin-wasm": "^3.5.0",
"node-gzip": "^1.1.2",
"cross-env": "^10.1.0"
}
}

@ -0,0 +1,32 @@
const crypto = require('crypto');
const fs = require('fs');
const {gzip, } = require('node-gzip');
var algorithm = 'sha256'
, shasum = crypto.createHash(algorithm)
const sha_file = './dist-web/index.sha256';
const gzip_file = './dist-web/index.gzip';
var filename = './dist-web/index.html'
, s = fs.ReadStream(filename)
var bufs = [];
s.on('data', function(data) {
shasum.update(data)
bufs.push(data);
})
s.on('end', function() {
var hash = shasum.digest('hex')
console.log(hash + ' ' + filename)
fs.writeFileSync(sha_file, hash, 'utf8');
var buf = Buffer.concat(bufs);
gzip(buf).then((compressed) => {fs.writeFileSync(gzip_file, compressed);});
fs.rm(filename,()=>{});
})

@ -0,0 +1,7 @@
# Generated by Cargo
# will have compiled files and executables
/target/
# Generated by Tauri
# will have schema files for capabilities auto-completion
/gen/schemas

@ -0,0 +1,39 @@
[package]
name = "AlleloPNM"
version = "0.1.0"
description = "Allelo PNM App"
authors = ["Niko Bonnieure"]
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[lib]
# The `_lib` suffix may seem redundant but it is necessary
# to make the lib name unique and wouldn't conflict with the bin name.
# This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519
name = "allelo_lib"
crate-type = ["staticlib", "cdylib", "rlib"]
[build-dependencies]
tauri-build = { version = "2.5.0", features = [] }
[dependencies]
tauri = { version = "2.9.0", features = [] }
tauri-plugin-log = "2"
log = "0.4"
tauri-plugin-opener = "2"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
tauri-plugin-contacts-importer = { path = "../../tauri-plugin-contacts-importer/" }
serde_bare = "0.5.0"
serde_bytes = "0.11.7"
tauri-plugin-barcode-scanner = "2"
ng-repo = { path = "../../../engine/repo" }
ng-net = { path = "../../../engine/net" }
ng-wallet = { path = "../../../engine/wallet" }
nextgraph = { path = "../../../sdk/rust" }
oxrdf = { git = "https://git.nextgraph.org/NextGraph/oxigraph.git", branch="main", features = ["rdf-star", "oxsdatatypes"] }
async-std = { version = "1.12.0", features = ["attributes", "unstable"] }
sys-locale = { version = "0.3.1" }
zeroize = { version = "1.7.0", features = ["zeroize_derive"] }
ng-async-tungstenite = { git = "https://git.nextgraph.org/NextGraph/async-tungstenite.git", branch = "nextgraph", features = ["async-std-runtime", "async-native-tls"] }

@ -0,0 +1,14 @@
{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "default",
"description": "Capability for the main window",
"windows": ["main"],
"permissions": [
"core:default",
"contacts-importer:allow-import-contacts",
"contacts-importer:allow-check-permissions",
"contacts-importer:allow-request-permissions",
"log:default",
"opener:default"
]
}

@ -0,0 +1,6 @@
/src/main/java/eco/allelo/pnm/prototype/generated
/src/main/jniLibs/**/*.so
/src/main/assets/tauri.conf.json
/tauri.build.gradle.kts
/proguard-tauri.pro
/tauri.properties

@ -0,0 +1,70 @@
import java.util.Properties
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("rust")
}
val tauriProperties = Properties().apply {
val propFile = file("tauri.properties")
if (propFile.exists()) {
propFile.inputStream().use { load(it) }
}
}
android {
compileSdk = 36
namespace = "eco.allelo.pnm.prototype"
defaultConfig {
manifestPlaceholders["usesCleartextTraffic"] = "false"
applicationId = "eco.allelo.pnm.prototype"
minSdk = 24
targetSdk = 36
versionCode = tauriProperties.getProperty("tauri.android.versionCode", "1").toInt()
versionName = tauriProperties.getProperty("tauri.android.versionName", "1.0")
}
buildTypes {
getByName("debug") {
manifestPlaceholders["usesCleartextTraffic"] = "true"
isDebuggable = true
isJniDebuggable = true
isMinifyEnabled = false
packaging { jniLibs.keepDebugSymbols.add("*/arm64-v8a/*.so")
jniLibs.keepDebugSymbols.add("*/armeabi-v7a/*.so")
jniLibs.keepDebugSymbols.add("*/x86/*.so")
jniLibs.keepDebugSymbols.add("*/x86_64/*.so")
}
}
getByName("release") {
isMinifyEnabled = true
proguardFiles(
*fileTree(".") { include("**/*.pro") }
.plus(getDefaultProguardFile("proguard-android-optimize.txt"))
.toList().toTypedArray()
)
}
}
kotlinOptions {
jvmTarget = "1.8"
}
buildFeatures {
buildConfig = true
}
}
rust {
rootDirRel = "../../../"
}
dependencies {
implementation("androidx.webkit:webkit:1.14.0")
implementation("androidx.appcompat:appcompat:1.7.1")
implementation("androidx.activity:activity-ktx:1.10.1")
implementation("com.google.android.material:material:1.12.0")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.4")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0")
}
apply(from = "tauri.build.gradle.kts")

@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
<!-- AndroidTV support -->
<uses-feature android:name="android.software.leanback" android:required="false" />
<application
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.allelo"
android:usesCleartextTraffic="${usesCleartextTraffic}">
<activity
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode"
android:launchMode="singleTask"
android:label="@string/main_activity_title"
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<!-- AndroidTV support -->
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
</activity>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
</manifest>

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

@ -0,0 +1,11 @@
package eco.allelo.pnm.prototype
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
class MainActivity : TauriActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge()
super.onCreate(savedInstanceState)
}
}

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

@ -0,0 +1,6 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.allelo" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Customize your theme here. -->
</style>
</resources>

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
</resources>

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#FFFFFF</color>
</resources>

@ -0,0 +1,4 @@
<resources>
<string name="app_name">allelo</string>
<string name="main_activity_title">allelo</string>
</resources>

@ -0,0 +1,6 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.allelo" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Customize your theme here. -->
</style>
</resources>

@ -0,0 +1,22 @@
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath("com.android.tools.build:gradle:8.11.0")
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.25")
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
tasks.register("clean").configure {
delete("build")
}

@ -0,0 +1,23 @@
plugins {
`kotlin-dsl`
}
gradlePlugin {
plugins {
create("pluginsForCoolKids") {
id = "rust"
implementationClass = "RustPlugin"
}
}
}
repositories {
google()
mavenCentral()
}
dependencies {
compileOnly(gradleApi())
implementation("com.android.tools.build:gradle:8.11.0")
}

@ -0,0 +1,52 @@
import java.io.File
import org.apache.tools.ant.taskdefs.condition.Os
import org.gradle.api.DefaultTask
import org.gradle.api.GradleException
import org.gradle.api.logging.LogLevel
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.TaskAction
open class BuildTask : DefaultTask() {
@Input
var rootDirRel: String? = null
@Input
var target: String? = null
@Input
var release: Boolean? = null
@TaskAction
fun assemble() {
val executable = """cargo""";
try {
runTauriCli(executable)
} catch (e: Exception) {
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
runTauriCli("$executable.cmd")
} else {
throw e;
}
}
}
fun runTauriCli(executable: String) {
val rootDirRel = rootDirRel ?: throw GradleException("rootDirRel cannot be null")
val target = target ?: throw GradleException("target cannot be null")
val release = release ?: throw GradleException("release cannot be null")
val args = listOf("tauri", "android", "android-studio-script");
project.exec {
workingDir(File(project.projectDir, rootDirRel))
executable(executable)
args(args)
if (project.logger.isEnabled(LogLevel.DEBUG)) {
args("-vv")
} else if (project.logger.isEnabled(LogLevel.INFO)) {
args("-v")
}
if (release) {
args("--release")
}
args(listOf("--target", target))
}.assertNormalExitValue()
}
}

@ -0,0 +1,24 @@
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx4608m -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app"s APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official
# Enables namespacing of each library's R class so that its R class includes only the
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true
android.nonFinalResIds=false

@ -0,0 +1,6 @@
#Tue May 10 19:22:52 CST 2022
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

@ -0,0 +1,89 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

@ -0,0 +1,3 @@
xcuserdata/
build/
Externals/

@ -0,0 +1,489 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 63;
objects = {
/* Begin PBXBuildFile section */
28BF89360F612D0B01477963 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 577D8E750BE93D9EAA3589DA /* Security.framework */; };
333BC12279D965EAB5258F49 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BA69AFCEFFB9B2637EA2735B /* CoreGraphics.framework */; };
5E985361B7FFD1B2904D66C1 /* libapp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B3E901BDA0460E4188DEE30B /* libapp.a */; };
6173C941C6942DEBDCE4E34E /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9DD1F696D6366E51654869D /* Metal.framework */; };
9514863B78DE92F92E6640A2 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A8A921DD9E7079DD30382EA4 /* UIKit.framework */; };
9E680AC552407A58EE2DCCAF /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7138E06D25D06D333994FFD9 /* main.mm */; };
9F597495A6AA394762782B9B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53F6E03EA197F6A6F09CC927 /* Assets.xcassets */; };
B2BE80B8093CFB7572728A69 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BAC4781903A2F2DBC2638326 /* LaunchScreen.storyboard */; };
B5B9B67F0B874F814BCD23A4 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 403F1A6FAD8FE5D58625C6BD /* WebKit.framework */; };
C223D37F3942F7744461AC94 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E9436ED6F82A31B69B3C2CF4 /* QuartzCore.framework */; };
C3FC9F3C82851A81823E94C9 /* assets in Resources */ = {isa = PBXBuildFile; fileRef = 95D05243CAEDE88D4DEB8663 /* assets */; };
C4FC7D07FAAAA5741D481567 /* MetalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A4E71F293DB22710E4CD3EFF /* MetalKit.framework */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
14C9A91FED765AD8296B7855 /* lib.rs */ = {isa = PBXFileReference; lastKnownFileType = text; path = lib.rs; sourceTree = "<group>"; };
1F8121A172263DDB11D84DD5 /* mobile.rs */ = {isa = PBXFileReference; lastKnownFileType = text; path = mobile.rs; sourceTree = "<group>"; };
3D04C6F4FB754F63A900149E /* bindings.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bindings.h; sourceTree = "<group>"; };
403F1A6FAD8FE5D58625C6BD /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
4D8D9976302B4006364692B3 /* main.rs */ = {isa = PBXFileReference; lastKnownFileType = text; path = main.rs; sourceTree = "<group>"; };
53F6E03EA197F6A6F09CC927 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
577D8E750BE93D9EAA3589DA /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
6F2CE3B81F1C7DF000752FA7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
7138E06D25D06D333994FFD9 /* main.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = "<group>"; };
8A3E463873C3C90E808C5881 /* AlleloPNM_iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = AlleloPNM_iOS.entitlements; sourceTree = "<group>"; };
95D05243CAEDE88D4DEB8663 /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; path = assets; sourceTree = SOURCE_ROOT; };
A323694DA279909245E1448D /* AlleloPNM.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AlleloPNM.app; sourceTree = BUILT_PRODUCTS_DIR; };
A4E71F293DB22710E4CD3EFF /* MetalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalKit.framework; path = System/Library/Frameworks/MetalKit.framework; sourceTree = SDKROOT; };
A8A921DD9E7079DD30382EA4 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
B3E901BDA0460E4188DEE30B /* libapp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libapp.a; sourceTree = "<group>"; };
BA69AFCEFFB9B2637EA2735B /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
BAC4781903A2F2DBC2638326 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; };
C9DD1F696D6366E51654869D /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; };
E9436ED6F82A31B69B3C2CF4 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
5CADD463727B2D8F792C6F21 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
5E985361B7FFD1B2904D66C1 /* libapp.a in Frameworks */,
333BC12279D965EAB5258F49 /* CoreGraphics.framework in Frameworks */,
6173C941C6942DEBDCE4E34E /* Metal.framework in Frameworks */,
C4FC7D07FAAAA5741D481567 /* MetalKit.framework in Frameworks */,
C223D37F3942F7744461AC94 /* QuartzCore.framework in Frameworks */,
28BF89360F612D0B01477963 /* Security.framework in Frameworks */,
9514863B78DE92F92E6640A2 /* UIKit.framework in Frameworks */,
B5B9B67F0B874F814BCD23A4 /* WebKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
03800BB3DD4503575CF7EEDA /* AlleloPNM */ = {
isa = PBXGroup;
children = (
7138E06D25D06D333994FFD9 /* main.mm */,
29C7A11C187AAF8C09085F1F /* bindings */,
);
path = AlleloPNM;
sourceTree = "<group>";
};
29C7A11C187AAF8C09085F1F /* bindings */ = {
isa = PBXGroup;
children = (
3D04C6F4FB754F63A900149E /* bindings.h */,
);
path = bindings;
sourceTree = "<group>";
};
30C28EBFE41CBC85260BB5B5 /* Frameworks */ = {
isa = PBXGroup;
children = (
BA69AFCEFFB9B2637EA2735B /* CoreGraphics.framework */,
B3E901BDA0460E4188DEE30B /* libapp.a */,
C9DD1F696D6366E51654869D /* Metal.framework */,
A4E71F293DB22710E4CD3EFF /* MetalKit.framework */,
E9436ED6F82A31B69B3C2CF4 /* QuartzCore.framework */,
577D8E750BE93D9EAA3589DA /* Security.framework */,
A8A921DD9E7079DD30382EA4 /* UIKit.framework */,
403F1A6FAD8FE5D58625C6BD /* WebKit.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
43D4899D514D738C896995F1 /* AlleloPNM_iOS */ = {
isa = PBXGroup;
children = (
8A3E463873C3C90E808C5881 /* AlleloPNM_iOS.entitlements */,
6F2CE3B81F1C7DF000752FA7 /* Info.plist */,
);
path = AlleloPNM_iOS;
sourceTree = "<group>";
};
87106571D67C5C0196DE38FB /* src */ = {
isa = PBXGroup;
children = (
14C9A91FED765AD8296B7855 /* lib.rs */,
4D8D9976302B4006364692B3 /* main.rs */,
1F8121A172263DDB11D84DD5 /* mobile.rs */,
);
name = src;
path = ../../src;
sourceTree = "<group>";
};
C735E16E47AFEFA09FD7A1CB /* Sources */ = {
isa = PBXGroup;
children = (
03800BB3DD4503575CF7EEDA /* AlleloPNM */,
);
path = Sources;
sourceTree = "<group>";
};
C8A45067838382C521889BBA = {
isa = PBXGroup;
children = (
95D05243CAEDE88D4DEB8663 /* assets */,
53F6E03EA197F6A6F09CC927 /* Assets.xcassets */,
BAC4781903A2F2DBC2638326 /* LaunchScreen.storyboard */,
43D4899D514D738C896995F1 /* AlleloPNM_iOS */,
DB50C0C35C05E6D415F5D482 /* Externals */,
C735E16E47AFEFA09FD7A1CB /* Sources */,
87106571D67C5C0196DE38FB /* src */,
30C28EBFE41CBC85260BB5B5 /* Frameworks */,
E1EADDA28654D3A5AB7227FC /* Products */,
);
sourceTree = "<group>";
};
DB50C0C35C05E6D415F5D482 /* Externals */ = {
isa = PBXGroup;
children = (
);
path = Externals;
sourceTree = "<group>";
};
E1EADDA28654D3A5AB7227FC /* Products */ = {
isa = PBXGroup;
children = (
A323694DA279909245E1448D /* AlleloPNM.app */,
);
name = Products;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
DFEDF72E2564EDCE36B6D3C6 /* AlleloPNM_iOS */ = {
isa = PBXNativeTarget;
buildConfigurationList = 346ADC40307FA89B5F4278F6 /* Build configuration list for PBXNativeTarget "AlleloPNM_iOS" */;
buildPhases = (
20A4C11E2B3317F9BAF3EC8D /* Build Rust Code */,
16B7B63524F8EAA724D1A3C1 /* Sources */,
FF44D36984BD984B41419CA1 /* Resources */,
5CADD463727B2D8F792C6F21 /* Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = AlleloPNM_iOS;
packageProductDependencies = (
);
productName = AlleloPNM_iOS;
productReference = A323694DA279909245E1448D /* AlleloPNM.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
324F1B8C3DDE8D19A82C14C6 /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
LastUpgradeCheck = 1430;
};
buildConfigurationList = 95F0DD767693C6F10A354E66 /* Build configuration list for PBXProject "AlleloPNM" */;
compatibilityVersion = "Xcode 14.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
Base,
en,
);
mainGroup = C8A45067838382C521889BBA;
minimizedProjectReferenceProxies = 1;
projectDirPath = "";
projectRoot = "";
targets = (
DFEDF72E2564EDCE36B6D3C6 /* AlleloPNM_iOS */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
FF44D36984BD984B41419CA1 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
9F597495A6AA394762782B9B /* Assets.xcassets in Resources */,
B2BE80B8093CFB7572728A69 /* LaunchScreen.storyboard in Resources */,
C3FC9F3C82851A81823E94C9 /* assets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
20A4C11E2B3317F9BAF3EC8D /* Build Rust Code */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Build Rust Code";
outputFileListPaths = (
);
outputPaths = (
"$(SRCROOT)/Externals/x86_64/${CONFIGURATION}/libapp.a",
"$(SRCROOT)/Externals/arm64/${CONFIGURATION}/libapp.a",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "bun tauri ios xcode-script -v --platform ${PLATFORM_DISPLAY_NAME:?} --sdk-root ${SDKROOT:?} --framework-search-paths \"${FRAMEWORK_SEARCH_PATHS:?}\" --header-search-paths \"${HEADER_SEARCH_PATHS:?}\" --gcc-preprocessor-definitions \"${GCC_PREPROCESSOR_DEFINITIONS:-}\" --configuration ${CONFIGURATION:?} ${FORCE_COLOR} ${ARCHS:?}";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
16B7B63524F8EAA724D1A3C1 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
9E680AC552407A58EE2DCCAF /* main.mm in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
72A55CF869D96F9926E6DAFC /* release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ARCHS = (
arm64,
x86_64,
);
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = AlleloPNM_iOS/AlleloPNM_iOS.entitlements;
CODE_SIGN_IDENTITY = "iPhone Developer";
DEVELOPMENT_TEAM = V2YR9RLTN7;
ENABLE_BITCODE = NO;
"EXCLUDED_ARCHS[sdk=iphoneos*]" = x86_64;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"\".\"",
);
INFOPLIST_FILE = AlleloPNM_iOS/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "Allelo PNM prototype";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
"LIBRARY_SEARCH_PATHS[arch=arm64]" = (
"$(inherited)",
"$(PROJECT_DIR)/Externals/arm64/$(CONFIGURATION)",
"$(SDKROOT)/usr/lib/swift",
"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)",
"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)",
);
"LIBRARY_SEARCH_PATHS[arch=x86_64]" = (
"$(inherited)",
"$(PROJECT_DIR)/Externals/x86_64/$(CONFIGURATION)",
"$(SDKROOT)/usr/lib/swift",
"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)",
"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)",
);
PRODUCT_BUNDLE_IDENTIFIER = eco.allelo.pnm.prototype;
PRODUCT_NAME = "AlleloPNM";
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALID_ARCHS = "arm64 x86_64";
};
name = release;
};
998DD1FAFA7BEB507CB0996C /* release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 5.0;
};
name = release;
};
BFF915546DE0D147AEC09B86 /* debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ARCHS = (
arm64,
x86_64,
);
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = AlleloPNM_iOS/AlleloPNM_iOS.entitlements;
CODE_SIGN_IDENTITY = "iPhone Developer";
DEVELOPMENT_TEAM = V2YR9RLTN7;
ENABLE_BITCODE = NO;
"EXCLUDED_ARCHS[sdk=iphoneos*]" = x86_64;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"\".\"",
);
INFOPLIST_FILE = AlleloPNM_iOS/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "Allelo PNM prototype";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
"LIBRARY_SEARCH_PATHS[arch=arm64]" = (
"$(inherited)",
"$(PROJECT_DIR)/Externals/arm64/$(CONFIGURATION)",
"$(SDKROOT)/usr/lib/swift",
"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)",
"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)",
);
"LIBRARY_SEARCH_PATHS[arch=x86_64]" = (
"$(inherited)",
"$(PROJECT_DIR)/Externals/x86_64/$(CONFIGURATION)",
"$(SDKROOT)/usr/lib/swift",
"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)",
"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)",
);
PRODUCT_BUNDLE_IDENTIFIER = eco.allelo.pnm.prototype;
PRODUCT_NAME = "AlleloPNM";
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALID_ARCHS = "arm64 x86_64";
};
name = debug;
};
DE939100669CE5433FF559AB /* debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
"DEBUG=1",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
};
name = debug;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
346ADC40307FA89B5F4278F6 /* Build configuration list for PBXNativeTarget "AlleloPNM_iOS" */ = {
isa = XCConfigurationList;
buildConfigurations = (
BFF915546DE0D147AEC09B86 /* debug */,
72A55CF869D96F9926E6DAFC /* release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = debug;
};
95F0DD767693C6F10A354E66 /* Build configuration list for PBXProject "AlleloPNM" */ = {
isa = XCConfigurationList;
buildConfigurations = (
DE939100669CE5433FF559AB /* debug */,
998DD1FAFA7BEB507CB0996C /* release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = debug;
};
/* End XCConfigurationList section */
};
rootObject = 324F1B8C3DDE8D19A82C14C6 /* Project object */;
}

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildSystemType</key>
<string>Original</string>
<key>DisableBuildSystemDeprecationDiagnostic</key>
<true/>
</dict>
</plist>

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1430"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DFEDF72E2564EDCE36B6D3C6"
BuildableName = "AlleloPNM.app"
BlueprintName = "AlleloPNM_iOS"
ReferencedContainer = "container:AlleloPNM.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "NO">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DFEDF72E2564EDCE36B6D3C6"
BuildableName = "AlleloPNM.app"
BlueprintName = "AlleloPNM_iOS"
ReferencedContainer = "container:AlleloPNM.xcodeproj">
</BuildableReference>
</MacroExpansion>
<EnvironmentVariables>
<EnvironmentVariable
key = "RUST_BACKTRACE"
value = "full"
isEnabled = "YES">
</EnvironmentVariable>
<EnvironmentVariable
key = "RUST_LOG"
value = "info"
isEnabled = "YES">
</EnvironmentVariable>
</EnvironmentVariables>
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DFEDF72E2564EDCE36B6D3C6"
BuildableName = "AlleloPNM.app"
BlueprintName = "AlleloPNM_iOS"
ReferencedContainer = "container:AlleloPNM.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<EnvironmentVariables>
<EnvironmentVariable
key = "RUST_BACKTRACE"
value = "full"
isEnabled = "YES">
</EnvironmentVariable>
<EnvironmentVariable
key = "RUST_LOG"
value = "info"
isEnabled = "YES">
</EnvironmentVariable>
</EnvironmentVariables>
</LaunchAction>
<ProfileAction
buildConfiguration = "release"
shouldUseLaunchSchemeArgsEnv = "NO"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DFEDF72E2564EDCE36B6D3C6"
BuildableName = "AlleloPNM.app"
BlueprintName = "AlleloPNM_iOS"
ReferencedContainer = "container:AlleloPNM.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<EnvironmentVariables>
<EnvironmentVariable
key = "RUST_BACKTRACE"
value = "full"
isEnabled = "YES">
</EnvironmentVariable>
<EnvironmentVariable
key = "RUST_LOG"
value = "info"
isEnabled = "YES">
</EnvironmentVariable>
</EnvironmentVariables>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict/>
</plist>

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>0.1.0</string>
<key>CFBundleVersion</key>
<string>0.1.0</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
<string>metal</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 570 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

@ -0,0 +1,116 @@
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "AppIcon-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "AppIcon-20x20@3x.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "AppIcon-29x29@2x-1.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "AppIcon-29x29@3x.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "AppIcon-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "AppIcon-40x40@3x.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "AppIcon-60x60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "AppIcon-60x60@3x.png",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "AppIcon-20x20@1x.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "AppIcon-20x20@2x-1.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "AppIcon-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "AppIcon-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "AppIcon-40x40@1x.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "AppIcon-40x40@2x-1.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "AppIcon-76x76@1x.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "AppIcon-76x76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "AppIcon-83.5x83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "AppIcon-512@2x.png",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>debugging</string>
</dict>
</plist>

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17150" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="Y6W-OH-hqX">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17122"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="System colors in document resources" minToolsVersion="11.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="s0d-6b-0kx">
<objects>
<viewController id="Y6W-OH-hqX" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="5EZ-qb-Rvc">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<viewLayoutGuide key="safeArea" id="vDu-zF-Fre"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="Ief-a0-LHa" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
<resources>
<systemColor name="systemBackgroundColor">
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
</resources>
</document>

@ -0,0 +1,21 @@
# Uncomment the next line to define a global platform for your project
target 'AlleloPNM_iOS' do
platform :ios, '14.0'
# Pods for AlleloPNM_iOS
end
target 'AlleloPNM_macOS' do
platform :osx, '11.0'
# Pods for AlleloPNM_macOS
end
# Delete the deployment target for iOS and macOS, causing it to be inherited from the Podfile
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
config.build_settings.delete 'MACOSX_DEPLOYMENT_TARGET'
end
end
end

@ -0,0 +1,8 @@
#pragma once
namespace ffi {
extern "C" {
void start_app();
}
}

@ -0,0 +1,6 @@
#include "bindings/bindings.h"
int main(int argc, char * argv[]) {
ffi::start_app();
return 0;
}

@ -0,0 +1,88 @@
name: AlleloPNM
options:
bundleIdPrefix: eco.allelo.pnm.prototype
deploymentTarget:
iOS: 14.0
fileGroups: [../../src]
configs:
debug: debug
release: release
settingGroups:
app:
base:
PRODUCT_NAME: AlleloPNM
PRODUCT_BUNDLE_IDENTIFIER: eco.allelo.pnm.prototype
targetTemplates:
app:
type: application
sources:
- path: Sources
scheme:
environmentVariables:
RUST_BACKTRACE: full
RUST_LOG: info
settings:
groups: [app]
targets:
AlleloPNM_iOS:
type: application
platform: iOS
sources:
- path: Sources
- path: Assets.xcassets
- path: Externals
- path: AlleloPNM_iOS
- path: assets
buildPhase: resources
type: folder
- path: LaunchScreen.storyboard
info:
path: AlleloPNM_iOS/Info.plist
properties:
LSRequiresIPhoneOS: true
UILaunchStoryboardName: LaunchScreen
UIRequiredDeviceCapabilities: [arm64, metal]
UISupportedInterfaceOrientations:
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
UISupportedInterfaceOrientations~ipad:
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
CFBundleShortVersionString: 0.1.0
CFBundleVersion: "0.1.0"
entitlements:
path: AlleloPNM_iOS/AlleloPNM_iOS.entitlements
scheme:
environmentVariables:
RUST_BACKTRACE: full
RUST_LOG: info
settings:
base:
ENABLE_BITCODE: false
ARCHS: [arm64, x86_64]
VALID_ARCHS: arm64 x86_64
LIBRARY_SEARCH_PATHS[arch=x86_64]: $(inherited) $(PROJECT_DIR)/Externals/x86_64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)
LIBRARY_SEARCH_PATHS[arch=arm64]: $(inherited) $(PROJECT_DIR)/Externals/arm64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES: true
EXCLUDED_ARCHS[sdk=iphoneos*]: x86_64
groups: [app]
dependencies:
- framework: libapp.a
embed: false
- sdk: CoreGraphics.framework
- sdk: Metal.framework
- sdk: MetalKit.framework
- sdk: QuartzCore.framework
- sdk: Security.framework
- sdk: UIKit.framework
- sdk: WebKit.framework
preBuildScripts:
- script: bun tauri ios xcode-script -v --platform ${PLATFORM_DISPLAY_NAME:?} --sdk-root ${SDKROOT:?} --framework-search-paths "${FRAMEWORK_SEARCH_PATHS:?}" --header-search-paths "${HEADER_SEARCH_PATHS:?}" --gcc-preprocessor-definitions "${GCC_PREPROCESSOR_DEFINITIONS:-}" --configuration ${CONFIGURATION:?} ${FORCE_COLOR} ${ARCHS:?}
name: Build Rust Code
basedOnDependencyAnalysis: false
outputFiles:
- $(SRCROOT)/Externals/x86_64/${CONFIGURATION}/libapp.a
- $(SRCROOT)/Externals/arm64/${CONFIGURATION}/libapp.a

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save