diff --git a/.github/workflows/daedalus-docker.yml b/.github/workflows/daedalus-docker.yml
new file mode 100644
index 000000000..f3e5a2d71
--- /dev/null
+++ b/.github/workflows/daedalus-docker.yml
@@ -0,0 +1,44 @@
+name: daedalus-docker-build
+
+on:
+ push:
+ branches: [ "main" ]
+ paths:
+ - .github/workflows/daedalus-docker.yml
+ - 'apps/daedalus/**'
+ pull_request:
+ types: [ opened, synchronize ]
+ paths:
+ - .github/workflows/daedalus-docker.yml
+ - 'apps/daedalus/**'
+ merge_group:
+ types: [ checks_requested ]
+
+jobs:
+ docker:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Fetch docker metadata
+ id: docker_meta
+ uses: docker/metadata-action@v3
+ with:
+ images: ghcr.io/modrinth/daedalus
+ -
+ name: Login to GitHub Images
+ uses: docker/login-action@v1
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+ -
+ name: Build and push
+ id: docker_build
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ file: ./Dockerfile
+ push: ${{ github.event_name != 'pull_request' }}
+ tags: ${{ steps.docker_meta.outputs.tags }}
+ labels: ${{ steps.docker_meta.outputs.labels }}
diff --git a/.github/workflows/daedalus-run.yml b/.github/workflows/daedalus-run.yml
new file mode 100644
index 000000000..dcdbd0496
--- /dev/null
+++ b/.github/workflows/daedalus-run.yml
@@ -0,0 +1,52 @@
+name: Run Meta
+
+on:
+ schedule:
+ - cron: '*/5 * * * *'
+ workflow_dispatch:
+
+jobs:
+ run-docker:
+ if: github.repository_owner == 'modrinth'
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+
+ - name: Log in to GitHub Container Registry
+ uses: docker/login-action@v2
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+
+ - name: Pull Docker image from GHCR
+ run: docker pull ghcr.io/modrinth/daedalus:main
+
+ - name: Run Docker container
+ env:
+ BASE_URL: ${{ secrets.BASE_URL }}
+ S3_ACCESS_TOKEN: ${{ secrets.S3_ACCESS_TOKEN }}
+ S3_SECRET: ${{ secrets.S3_SECRET }}
+ S3_URL: ${{ secrets.S3_URL }}
+ S3_REGION: ${{ secrets.S3_REGION }}
+ S3_BUCKET_NAME: ${{ secrets.S3_BUCKET_NAME }}
+ CLOUDFLARE_INTEGRATION: ${{ secrets.CLOUDFLARE_INTEGRATION }}
+ CLOUDFLARE_TOKEN: ${{ secrets.CLOUDFLARE_TOKEN }}
+ CLOUDFLARE_ZONE_ID: ${{ secrets.CLOUDFLARE_ZONE_ID }}
+ run: |
+ docker run \
+ --name daedalus \
+ -e RUST_LOG=warn,daedalus_client=trace \
+ -e BASE_URL=$BASE_URL \
+ -e S3_ACCESS_TOKEN=$S3_ACCESS_TOKEN \
+ -e S3_SECRET=$S3_SECRET \
+ -e S3_URL=$S3_URL \
+ -e S3_REGION=$S3_REGION \
+ -e S3_BUCKET_NAME=$S3_BUCKET_NAME \
+ -e CLOUDFLARE_INTEGRATION=$CLOUDFLARE_INTEGRATION \
+ -e CLOUDFLARE_TOKEN=$CLOUDFLARE_TOKEN \
+ -e CLOUDFLARE_ZONE_ID=$CLOUDFLARE_ZONE_ID \
+ ghcr.io/modrinth/daedalus:master
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 000000000..73f69e095
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/.idea/daedalus.iml b/.idea/daedalus.iml
new file mode 100644
index 000000000..3d715289c
--- /dev/null
+++ b/.idea/daedalus.iml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/discord.xml b/.idea/discord.xml
new file mode 100644
index 000000000..d8e956166
--- /dev/null
+++ b/.idea/discord.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/KotlinJavaRuntime.xml b/.idea/libraries/KotlinJavaRuntime.xml
new file mode 100644
index 000000000..78d18789b
--- /dev/null
+++ b/.idea/libraries/KotlinJavaRuntime.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 000000000..c73594817
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 000000000..35eb1ddfb
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/daedalus_client/.env b/apps/daedalus_client/.env
new file mode 100644
index 000000000..9aac220ad
--- /dev/null
+++ b/apps/daedalus_client/.env
@@ -0,0 +1,15 @@
+RUST_LOG=warn,daedalus_client=trace
+
+BASE_URL=http://localhost:9000/meta
+
+CONCURRENCY_LIMIT=10
+
+S3_ACCESS_TOKEN=none
+S3_SECRET=none
+S3_URL=http://localhost:9000
+S3_REGION=path-style
+S3_BUCKET_NAME=meta
+
+CLOUDFLARE_INTEGRATION=false
+CLOUDFLARE_TOKEN=none
+CLOUDFLARE_ZONE_ID=none
\ No newline at end of file
diff --git a/apps/daedalus_client/Cargo.toml b/apps/daedalus_client/Cargo.toml
new file mode 100644
index 000000000..de3b52c92
--- /dev/null
+++ b/apps/daedalus_client/Cargo.toml
@@ -0,0 +1,33 @@
+[package]
+name = "daedalus_client"
+version = "0.2.2"
+authors = ["Jai A "]
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+daedalus = { path = "../daedalus" }
+tokio = { version = "1", features = ["full"] }
+futures = "0.3.25"
+dotenvy = "0.15.6"
+serde = { version = "1.0", features = ["derive"] }
+serde_json = "1.0"
+serde-xml-rs = "0.6.0"
+lazy_static = "1.4.0"
+thiserror = "1.0"
+reqwest = { version = "0.12.5", features = ["stream", "json", "rustls-tls"] }
+async_zip = { version = "0.0.17", features = ["full"] }
+semver = "1.0"
+chrono = { version = "0.4", features = ["serde"] }
+bytes = "1.6.0"
+rust-s3 = "0.34.0"
+dashmap = "5.5.3"
+sha1_smol = { version = "1.0.0", features = ["std"] }
+indexmap = { version = "2.2.6", features = ["serde"]}
+itertools = "0.13.0"
+tracing-error = "0.2.0"
+
+tracing = "0.1"
+tracing-subscriber = { version = "0.3", features = ["env-filter"] }
+tracing-futures = { version = "0.2.5", features = ["futures", "tokio"] }
\ No newline at end of file
diff --git a/apps/daedalus_client/Dockerfile b/apps/daedalus_client/Dockerfile
new file mode 100644
index 000000000..19c88febe
--- /dev/null
+++ b/apps/daedalus_client/Dockerfile
@@ -0,0 +1,21 @@
+FROM rust:1.79.0 as build
+ENV PKG_CONFIG_ALLOW_CROSS=1
+
+WORKDIR /usr/src/daedalus
+COPY . .
+RUN cargo build --release
+
+
+FROM debian:bookworm-slim
+
+RUN apt-get update \
+ && apt-get install -y --no-install-recommends ca-certificates openssl \
+ && apt-get clean \
+ && rm -rf /var/lib/apt/lists/*
+
+RUN update-ca-certificates
+
+COPY --from=build /usr/src/daedalus/target/release/daedalus_client /daedalus/daedalus_client
+WORKDIR /daedalus_client
+
+CMD /daedalus/daedalus_client
diff --git a/apps/daedalus_client/LICENSE b/apps/daedalus_client/LICENSE
new file mode 100644
index 000000000..bc179be0a
--- /dev/null
+++ b/apps/daedalus_client/LICENSE
@@ -0,0 +1,7 @@
+Copyright © 2024 Rinth, Inc.
+
+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/apps/daedalus_client/README.md b/apps/daedalus_client/README.md
new file mode 100644
index 000000000..f0d5bd82f
--- /dev/null
+++ b/apps/daedalus_client/README.md
@@ -0,0 +1,12 @@
+# Daedalus
+
+Daedalus is a powerful tool which queries and generates metadata for the Minecraft (and other games in the future!) game
+and mod loaders for:
+- Performance (Serving static files can be easily cached and is extremely quick)
+- Ease for Launcher Devs (Metadata is served in an easy to query and use format)
+- Reliability (Provides a versioning system which ensures no breakage with updates)
+
+Daedalus is currently a work in progress, but will support the original Minecraft data and reposting for all Forge and
+Fabric artifacts.
+
+Once Daedalus is done, Modrinth will provide full documentation for how to query from it and use it for your own launcher!
\ No newline at end of file
diff --git a/apps/daedalus_client/docker-compose.yml b/apps/daedalus_client/docker-compose.yml
new file mode 100644
index 000000000..4e74e5ad8
--- /dev/null
+++ b/apps/daedalus_client/docker-compose.yml
@@ -0,0 +1,17 @@
+version: '3'
+
+services:
+ minio:
+ image: quay.io/minio/minio
+ volumes:
+ - minio-data:/data
+ ports:
+ - "9000:9000"
+ - "9001:9001"
+ environment:
+ MINIO_ROOT_USER: minioadmin
+ MINIO_ROOT_PASSWORD: miniosecret
+ command: server /data --console-address ":9001"
+
+volumes:
+ minio-data:
\ No newline at end of file
diff --git a/apps/daedalus_client/library-patches.json b/apps/daedalus_client/library-patches.json
new file mode 100644
index 000000000..0acd32e09
--- /dev/null
+++ b/apps/daedalus_client/library-patches.json
@@ -0,0 +1,2880 @@
+[
+ {
+ "_comment": "Only allow osx-arm64 for existing LWJGL 3.3.2/3.3.3",
+ "match": [
+ "org.lwjgl:lwjgl-freetype-natives-macos-arm64:3.3.2",
+ "org.lwjgl:lwjgl-glfw-natives-macos-arm64:3.3.2",
+ "org.lwjgl:lwjgl-jemalloc-natives-macos-arm64:3.3.2",
+ "org.lwjgl:lwjgl-openal-natives-macos-arm64:3.3.2",
+ "org.lwjgl:lwjgl-opengl-natives-macos-arm64:3.3.2",
+ "org.lwjgl:lwjgl-stb-natives-macos-arm64:3.3.2",
+ "org.lwjgl:lwjgl-tinyfd-natives-macos-arm64:3.3.2",
+ "org.lwjgl:lwjgl-natives-macos-arm64:3.3.2",
+ "org.lwjgl:lwjgl-freetype-natives-macos-arm64:3.3.3",
+ "org.lwjgl:lwjgl-glfw-natives-macos-arm64:3.3.3",
+ "org.lwjgl:lwjgl-jemalloc-natives-macos-arm64:3.3.3",
+ "org.lwjgl:lwjgl-openal-natives-macos-arm64:3.3.3",
+ "org.lwjgl:lwjgl-opengl-natives-macos-arm64:3.3.3",
+ "org.lwjgl:lwjgl-stb-natives-macos-arm64:3.3.3",
+ "org.lwjgl:lwjgl-tinyfd-natives-macos-arm64:3.3.3",
+ "org.lwjgl:lwjgl-natives-macos-arm64:3.3.3"
+ ],
+ "override": {
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "_comment": "Only allow windows-arm64 for existing LWJGL 3.3.2/3.3.3",
+ "match": [
+ "org.lwjgl:lwjgl-freetype-natives-windows-arm64:3.3.2",
+ "org.lwjgl:lwjgl-glfw-natives-windows-arm64:3.3.2",
+ "org.lwjgl:lwjgl-jemalloc-natives-windows-arm64:3.3.2",
+ "org.lwjgl:lwjgl-openal-natives-windows-arm64:3.3.2",
+ "org.lwjgl:lwjgl-opengl-natives-windows-arm64:3.3.2",
+ "org.lwjgl:lwjgl-stb-natives-windows-arm64:3.3.2",
+ "org.lwjgl:lwjgl-tinyfd-natives-windows-arm64:3.3.2",
+ "org.lwjgl:lwjgl-natives-windows-arm64:3.3.2",
+ "org.lwjgl:lwjgl-freetype-natives-windows-arm64:3.3.3",
+ "org.lwjgl:lwjgl-glfw-natives-windows-arm64:3.3.3",
+ "org.lwjgl:lwjgl-jemalloc-natives-windows-arm64:3.3.3",
+ "org.lwjgl:lwjgl-openal-natives-windows-arm64:3.3.3",
+ "org.lwjgl:lwjgl-opengl-natives-windows-arm64:3.3.3",
+ "org.lwjgl:lwjgl-stb-natives-windows-arm64:3.3.3",
+ "org.lwjgl:lwjgl-tinyfd-natives-windows-arm64:3.3.3",
+ "org.lwjgl:lwjgl-natives-windows-arm64:3.3.3"
+ ],
+ "override": {
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "windows-arm64"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "_comment": "Add missing tinyfd to the broken LWJGL 3.2.2 variant",
+ "match": [
+ "org.lwjgl:lwjgl:3.2.2"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9",
+ "size": 7092,
+ "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-tinyfd:3.2.2"
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9",
+ "size": 7092,
+ "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2.jar"
+ },
+ "classifiers": {
+ "natives-linux": {
+ "sha1": "39e35b161c130635d9c8918ce04e887a30c5b687",
+ "size": 38804,
+ "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2-natives-linux.jar"
+ },
+ "natives-macos": {
+ "sha1": "46d0798228b8a28e857a2a0f02310fd6ba2a4eab",
+ "size": 42136,
+ "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2-natives-macos.jar"
+ },
+ "natives-windows": {
+ "sha1": "e9115958773644e863332a6a06488d26f9e1fc9f",
+ "size": 208314,
+ "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2-natives-windows.jar"
+ }
+ }
+ },
+ "name": "org.lwjgl:lwjgl-tinyfd:3.2.2",
+ "natives": {
+ "linux": "natives-linux",
+ "osx": "natives-macos",
+ "windows": "natives-windows"
+ }
+ }
+ ],
+ "patchAdditionalLibraries": true
+ },
+ {
+ "_comment": "Add additional library just for osx-arm64. No override needed",
+ "match": [
+ "ca.weblite:java-objc-bridge:1.0.0"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "369a83621e3c65496348491e533cb97fe5f2f37d",
+ "size": 91947,
+ "url": "https://github.com/MinecraftMachina/Java-Objective-C-Bridge/releases/download/1.1.0-mmachina.1/java-objc-bridge-1.1.jar"
+ }
+ },
+ "name": "ca.weblite:java-objc-bridge:1.1.0-mmachina.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add additional classifiers for jinput-platform",
+ "match": [
+ "net.java.jinput:jinput-platform:2.0.5"
+ ],
+ "override": {
+ "downloads": {
+ "classifiers": {
+ "natives-osx-arm64": {
+ "sha1": "5189eb40db3087fb11ca063b68fa4f4c20b199dd",
+ "size": 10031,
+ "url": "https://github.com/r58Playz/jinput-m1/raw/main/plugins/OSX/bin/jinput-platform-2.0.5.jar"
+ },
+ "natives-linux-arm64": {
+ "sha1": "42b388ccb7c63cec4e9f24f4dddef33325f8b212",
+ "size": 10932,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-2.9.4/jinput-platform-2.0.5-natives-linux.jar"
+ },
+ "natives-linux-arm32": {
+ "sha1": "f3c455b71c5146acb5f8a9513247fc06db182fd5",
+ "size": 4521,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-2.9.4/jinput-platform-2.0.5-natives-linux.jar"
+ }
+ }
+ },
+ "natives": {
+ "linux-arm64": "natives-linux-arm64",
+ "linux-arm32": "natives-linux-arm32",
+ "osx-arm64": "natives-osx-arm64"
+ }
+ }
+ },
+ {
+ "_comment": "Use a newer version on osx-arm64",
+ "match": [
+ "com.mojang:text2speech:1.0.10",
+ "com.mojang:text2speech:1.5",
+ "com.mojang:text2speech:1.6",
+ "com.mojang:text2speech:1.7",
+ "com.mojang:text2speech:1.10.1",
+ "com.mojang:text2speech:1.10.3",
+ "com.mojang:text2speech:1.11.2"
+ ],
+ "override": {
+ "rules": [
+ {
+ "action": "allow"
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ },
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "f378f889797edd7df8d32272c06ca80a1b6b0f58",
+ "size": 13164,
+ "url": "https://libraries.minecraft.net/com/mojang/text2speech/1.11.3/text2speech-1.11.3.jar"
+ }
+ },
+ "name": "com.mojang:text2speech:1.11.3",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Use a newer version on osx-arm64, linux-arm64, and linux-arm32",
+ "match": [
+ "org.lwjgl.lwjgl:lwjgl:2.9.3",
+ "org.lwjgl.lwjgl:lwjgl:2.9.1-nightly-20131120",
+ "org.lwjgl.lwjgl:lwjgl:2.9.1-nightly-20131017",
+ "org.lwjgl.lwjgl:lwjgl:2.9.1-nightly-20130708-debug3",
+ "org.lwjgl.lwjgl:lwjgl:2.9.1"
+ ],
+ "override": {
+ "rules": [
+ {
+ "action": "allow"
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ },
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "697517568c68e78ae0b4544145af031c81082dfe",
+ "size": 1047168,
+ "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl/2.9.4-nightly-20150209/lwjgl-2.9.4-nightly-20150209.jar"
+ }
+ },
+ "name": "org.lwjgl.lwjgl:lwjgl:2.9.4-nightly-20150209",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ },
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ },
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Use a newer version on osx-arm64, linux-arm64, and linux-arm32",
+ "match": [
+ "org.lwjgl.lwjgl:lwjgl_util:2.9.3",
+ "org.lwjgl.lwjgl:lwjgl_util:2.9.1-nightly-20131120",
+ "org.lwjgl.lwjgl:lwjgl_util:2.9.1-nightly-20131017",
+ "org.lwjgl.lwjgl:lwjgl_util:2.9.1-nightly-20130708-debug3",
+ "org.lwjgl.lwjgl:lwjgl_util:2.9.1"
+ ],
+ "override": {
+ "rules": [
+ {
+ "action": "allow"
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ },
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "d51a7c040a721d13efdfbd34f8b257b2df882ad0",
+ "size": 173887,
+ "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl_util/2.9.4-nightly-20150209/lwjgl_util-2.9.4-nightly-20150209.jar"
+ }
+ },
+ "name": "org.lwjgl.lwjgl:lwjgl_util:2.9.4-nightly-20150209",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ },
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ },
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32",
+ "match": [
+ "org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209",
+ "org.lwjgl.lwjgl:lwjgl-platform:2.9.3",
+ "org.lwjgl.lwjgl:lwjgl-platform:2.9.1-nightly-20131120",
+ "org.lwjgl.lwjgl:lwjgl-platform:2.9.1-nightly-20131017",
+ "org.lwjgl.lwjgl:lwjgl-platform:2.9.1-nightly-20130708-debug3",
+ "org.lwjgl.lwjgl:lwjgl-platform:2.9.1"
+ ],
+ "override": {
+ "downloads": {
+ "classifiers": {
+ "natives-osx-arm64": {
+ "sha1": "eff546c0b319d6ffc7a835652124c18089c67f36",
+ "size": 488316,
+ "url": "https://github.com/MinecraftMachina/lwjgl/releases/download/2.9.4-20150209-mmachina.2/lwjgl-platform-2.9.4-nightly-20150209-natives-osx.jar"
+ },
+ "natives-linux-arm64": {
+ "sha1": "63ac7da0f4a4785c7eadc0f8edc1e9dcc4dd08cb",
+ "size": 579979,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-2.9.4/lwjgl-platform-2.9.4-nightly-20150209-natives-linux.jar"
+ },
+ "natives-linux-arm32": {
+ "sha1": "fa483e540a9a753a5ffbb23dcf7879a5bf752611",
+ "size": 475177,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-2.9.4/lwjgl-platform-2.9.4-nightly-20150209-natives-linux.jar"
+ }
+ }
+ },
+ "natives": {
+ "linux-arm64": "natives-linux-arm64",
+ "linux-arm32": "natives-linux-arm32",
+ "osx-arm64": "natives-osx-arm64"
+ }
+ }
+ },
+ {
+ "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32",
+ "match": [
+ "org.lwjgl:lwjgl-glfw:3.2.2",
+ "org.lwjgl:lwjgl-glfw:3.2.1",
+ "org.lwjgl:lwjgl-glfw:3.1.6",
+ "org.lwjgl:lwjgl-glfw:3.1.2"
+ ],
+ "override": {
+ "rules": [
+ {
+ "action": "allow"
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ },
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "155d175037efc76630940c197ca6dea2b17d7e18",
+ "size": 108691,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-glfw.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-glfw:3.2.2-gman64.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "155d175037efc76630940c197ca6dea2b17d7e18",
+ "size": 108691,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-glfw.jar"
+ },
+ "classifiers": {
+ "natives-linux-arm64": {
+ "sha1": "074ad243761147df0d060fbefc814614d2ff75cc",
+ "size": 85072,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-glfw-natives-linux-arm64.jar"
+ }
+ }
+ },
+ "name": "org.lwjgl:lwjgl-glfw:3.2.2-gman64.1",
+ "natives": {
+ "linux-arm64": "natives-linux-arm64"
+ },
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "99e9a39fa8ed4167e3ff9e04d47eb32c9e69804d",
+ "size": 108691,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-glfw.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-glfw:3.2.2-gman32.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "99e9a39fa8ed4167e3ff9e04d47eb32c9e69804d",
+ "size": 108691,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-glfw.jar"
+ },
+ "classifiers": {
+ "natives-linux-arm32": {
+ "sha1": "4265f2fbe3b9d642591165165a17cf406cf7b98e",
+ "size": 80186,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-glfw-natives-linux-arm32.jar"
+ }
+ }
+ },
+ "name": "org.lwjgl:lwjgl-glfw:3.2.2-gman32.1",
+ "natives": {
+ "linux-arm32": "natives-linux-arm32"
+ },
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "e9a101bca4fa30d26b21b526ff28e7c2d8927f1b",
+ "size": 130128,
+ "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-glfw.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-glfw:3.3.1-mmachina.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "e9a101bca4fa30d26b21b526ff28e7c2d8927f1b",
+ "size": 130128,
+ "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-glfw.jar"
+ },
+ "classifiers": {
+ "natives-osx-arm64": {
+ "sha1": "71d793d0a5a42e3dfe78eb882abc2523a2c6b496",
+ "size": 129076,
+ "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-glfw-natives-macos-arm64.jar"
+ }
+ }
+ },
+ "name": "org.lwjgl:lwjgl-glfw:3.3.1-mmachina.1",
+ "natives": {
+ "osx-arm64": "natives-osx-arm64"
+ },
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32",
+ "match": [
+ "org.lwjgl:lwjgl-jemalloc:3.2.2",
+ "org.lwjgl:lwjgl-jemalloc:3.2.1",
+ "org.lwjgl:lwjgl-jemalloc:3.1.6",
+ "org.lwjgl:lwjgl-jemalloc:3.1.2"
+ ],
+ "override": {
+ "rules": [
+ {
+ "action": "allow"
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ },
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "cc04eec29b2fa8c298791af9800a3766d9617954",
+ "size": 33790,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-jemalloc.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-jemalloc:3.2.2-gman64.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "cc04eec29b2fa8c298791af9800a3766d9617954",
+ "size": 33790,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-jemalloc.jar"
+ },
+ "classifiers": {
+ "natives-linux-arm64": {
+ "sha1": "762d7d80c9cdf3a3f3fc80c8a5f86612255edfe0",
+ "size": 156343,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-jemalloc-patched-natives-linux-arm64.jar"
+ }
+ }
+ },
+ "name": "org.lwjgl:lwjgl-jemalloc:3.2.2-gman64.2",
+ "natives": {
+ "linux-arm64": "natives-linux-arm64"
+ },
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "8224ae2e8fc6d8e1a0fc7d84dc917aa3c440620c",
+ "size": 33790,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-jemalloc.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-jemalloc:3.2.2-gman32.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "8224ae2e8fc6d8e1a0fc7d84dc917aa3c440620c",
+ "size": 33790,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-jemalloc.jar"
+ },
+ "classifiers": {
+ "natives-linux-arm32": {
+ "sha1": "9163a2a5559ef87bc13ead8fea84417ea3928748",
+ "size": 134237,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-jemalloc-natives-linux-arm32.jar"
+ }
+ }
+ },
+ "name": "org.lwjgl:lwjgl-jemalloc:3.2.2-gman32.1",
+ "natives": {
+ "linux-arm32": "natives-linux-arm32"
+ },
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "4fb94224378d3588d52d2beb172f2eeafea2d546",
+ "size": 36976,
+ "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-jemalloc.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-jemalloc:3.3.1-mmachina.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "4fb94224378d3588d52d2beb172f2eeafea2d546",
+ "size": 36976,
+ "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-jemalloc.jar"
+ },
+ "classifiers": {
+ "natives-osx-arm64": {
+ "sha1": "b0be721188d2e7195798780b1c5fe7eafe8091c1",
+ "size": 103478,
+ "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-jemalloc-natives-macos-arm64.jar"
+ }
+ }
+ },
+ "name": "org.lwjgl:lwjgl-jemalloc:3.3.1-mmachina.1",
+ "natives": {
+ "osx-arm64": "natives-osx-arm64"
+ },
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32",
+ "match": [
+ "org.lwjgl:lwjgl-openal:3.2.2",
+ "org.lwjgl:lwjgl-openal:3.2.1",
+ "org.lwjgl:lwjgl-openal:3.1.6",
+ "org.lwjgl:lwjgl-openal:3.1.2"
+ ],
+ "override": {
+ "rules": [
+ {
+ "action": "allow"
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ },
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "6dfce9dc6a9629c75b2ae01a8df7e7be80ba0261",
+ "size": 79582,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-openal.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-openal:3.2.2-gman64.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "6dfce9dc6a9629c75b2ae01a8df7e7be80ba0261",
+ "size": 79582,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-openal.jar"
+ },
+ "classifiers": {
+ "natives-linux-arm64": {
+ "sha1": "948e415b5b2a2c650c25b377a4a9f443b21ce92e",
+ "size": 469432,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-openal-natives-linux-arm64.jar"
+ }
+ }
+ },
+ "name": "org.lwjgl:lwjgl-openal:3.2.2-gman64.1",
+ "natives": {
+ "linux-arm64": "natives-linux-arm64"
+ },
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "304f0571fd5971621ee6da86a4c1e90f6f52e2ee",
+ "size": 79582,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-openal.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-openal:3.2.2-gman32.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "304f0571fd5971621ee6da86a4c1e90f6f52e2ee",
+ "size": 79582,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-openal.jar"
+ },
+ "classifiers": {
+ "natives-linux-arm32": {
+ "sha1": "ecbc981fdd996492a1f6334f003ed62e5a8c0cd5",
+ "size": 398418,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-openal-natives-linux-arm32.jar"
+ }
+ }
+ },
+ "name": "org.lwjgl:lwjgl-openal:3.2.2-gman32.1",
+ "natives": {
+ "linux-arm32": "natives-linux-arm32"
+ },
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "d48e753d85916fc8a200ccddc709b36e3865cc4e",
+ "size": 88880,
+ "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-openal.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-openal:3.3.1-mmachina.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "d48e753d85916fc8a200ccddc709b36e3865cc4e",
+ "size": 88880,
+ "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-openal.jar"
+ },
+ "classifiers": {
+ "natives-osx-arm64": {
+ "sha1": "6b80fc0b982a0723b141e88859c42d6f71bd723f",
+ "size": 346131,
+ "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-openal-natives-macos-arm64.jar"
+ }
+ }
+ },
+ "name": "org.lwjgl:lwjgl-openal:3.3.1-mmachina.1",
+ "natives": {
+ "osx-arm64": "natives-osx-arm64"
+ },
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32",
+ "match": [
+ "org.lwjgl:lwjgl-opengl:3.2.2",
+ "org.lwjgl:lwjgl-opengl:3.2.1",
+ "org.lwjgl:lwjgl-opengl:3.1.6",
+ "org.lwjgl:lwjgl-opengl:3.1.2"
+ ],
+ "override": {
+ "rules": [
+ {
+ "action": "allow"
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ },
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "198bc2f72e0b2eb401eb6f5999aea52909b31ac4",
+ "size": 937609,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-opengl.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-opengl:3.2.2-gman64.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "198bc2f72e0b2eb401eb6f5999aea52909b31ac4",
+ "size": 937609,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-opengl.jar"
+ },
+ "classifiers": {
+ "natives-linux-arm64": {
+ "sha1": "bd40897077bf7d12f562da898b18ac2c68e1f9d7",
+ "size": 56109,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-opengl-natives-linux-arm64.jar"
+ }
+ }
+ },
+ "name": "org.lwjgl:lwjgl-opengl:3.2.2-gman64.1",
+ "natives": {
+ "linux-arm64": "natives-linux-arm64"
+ },
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "9762ae928d02147e716cd82e929b74a97ea9600a",
+ "size": 937609,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-opengl.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-opengl:3.2.2-gman32.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "9762ae928d02147e716cd82e929b74a97ea9600a",
+ "size": 937609,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-opengl.jar"
+ },
+ "classifiers": {
+ "natives-linux-arm32": {
+ "sha1": "3af5599c74dd76dd8dbb567b3f9b4963a6abeed5",
+ "size": 56388,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-opengl-natives-linux-arm32.jar"
+ }
+ }
+ },
+ "name": "org.lwjgl:lwjgl-opengl:3.2.2-gman32.1",
+ "natives": {
+ "linux-arm32": "natives-linux-arm32"
+ },
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "962c2a8d2a8cdd3b89de3d78d766ab5e2133c2f4",
+ "size": 929233,
+ "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-opengl.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-opengl:3.3.1-mmachina.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "962c2a8d2a8cdd3b89de3d78d766ab5e2133c2f4",
+ "size": 929233,
+ "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-opengl.jar"
+ },
+ "classifiers": {
+ "natives-osx-arm64": {
+ "sha1": "bb575058e0372f515587b5d2d04ff7db185f3ffe",
+ "size": 41667,
+ "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-opengl-natives-macos-arm64.jar"
+ }
+ }
+ },
+ "name": "org.lwjgl:lwjgl-opengl:3.3.1-mmachina.1",
+ "natives": {
+ "osx-arm64": "natives-osx-arm64"
+ },
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32",
+ "match": [
+ "org.lwjgl:lwjgl-stb:3.2.2",
+ "org.lwjgl:lwjgl-stb:3.2.1",
+ "org.lwjgl:lwjgl-stb:3.1.6",
+ "org.lwjgl:lwjgl-stb:3.1.2"
+ ],
+ "override": {
+ "rules": [
+ {
+ "action": "allow"
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ },
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "46a5735f3eb9d17eb5dcbdd5afa194066d2a6555",
+ "size": 104075,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-stb.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-stb:3.2.2-gman64.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "46a5735f3eb9d17eb5dcbdd5afa194066d2a6555",
+ "size": 104075,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-stb.jar"
+ },
+ "classifiers": {
+ "natives-linux-arm64": {
+ "sha1": "077efa7d7ea41b32df5c6078e912e724cccd06db",
+ "size": 202038,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-stb-natives-linux-arm64.jar"
+ }
+ }
+ },
+ "name": "org.lwjgl:lwjgl-stb:3.2.2-gman64.1",
+ "natives": {
+ "linux-arm64": "natives-linux-arm64"
+ },
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "ea979b0af45b8e689f5f47c989aa8550c148d8a2",
+ "size": 104075,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-stb.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-stb:3.2.2-gman32.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "ea979b0af45b8e689f5f47c989aa8550c148d8a2",
+ "size": 104075,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-stb.jar"
+ },
+ "classifiers": {
+ "natives-linux-arm32": {
+ "sha1": "ec9d70aaebd0ff76dfeecf8f00b56118bf3706b1",
+ "size": 149387,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-stb-natives-linux-arm32.jar"
+ }
+ }
+ },
+ "name": "org.lwjgl:lwjgl-stb:3.2.2-gman32.1",
+ "natives": {
+ "linux-arm32": "natives-linux-arm32"
+ },
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "703e4b533e2542560e9f94d6d8bd148be1c1d572",
+ "size": 113273,
+ "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-stb.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-stb:3.3.1-mmachina.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "703e4b533e2542560e9f94d6d8bd148be1c1d572",
+ "size": 113273,
+ "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-stb.jar"
+ },
+ "classifiers": {
+ "natives-osx-arm64": {
+ "sha1": "98f0ad956c754723ef354d50057cc30417ef376a",
+ "size": 178409,
+ "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-stb-natives-macos-arm64.jar"
+ }
+ }
+ },
+ "name": "org.lwjgl:lwjgl-stb:3.3.1-mmachina.1",
+ "natives": {
+ "osx-arm64": "natives-osx-arm64"
+ },
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32",
+ "match": [
+ "org.lwjgl:lwjgl-tinyfd:3.2.2",
+ "org.lwjgl:lwjgl-tinyfd:3.2.1",
+ "org.lwjgl:lwjgl-tinyfd:3.1.6",
+ "org.lwjgl:lwjgl-tinyfd:3.1.2"
+ ],
+ "override": {
+ "rules": [
+ {
+ "action": "allow"
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ },
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "3a75b9811607633bf33c978f53964df1534a4bc1",
+ "size": 5571,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-tinyfd.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-tinyfd:3.2.2-gman64.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "3a75b9811607633bf33c978f53964df1534a4bc1",
+ "size": 5571,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-tinyfd.jar"
+ },
+ "classifiers": {
+ "natives-linux-arm64": {
+ "sha1": "37c744ca289b5d7ae155d79e39029488b3254e5b",
+ "size": 37893,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-tinyfd-natives-linux-arm64.jar"
+ }
+ }
+ },
+ "name": "org.lwjgl:lwjgl-tinyfd:3.2.2-gman64.1",
+ "natives": {
+ "linux-arm64": "natives-linux-arm64"
+ },
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "a8c09f5b7fa24bd53ec329c231b566497a163d5b",
+ "size": 5571,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-tinyfd.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-tinyfd:3.2.2-gman32.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "a8c09f5b7fa24bd53ec329c231b566497a163d5b",
+ "size": 5571,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-tinyfd.jar"
+ },
+ "classifiers": {
+ "natives-linux-arm32": {
+ "sha1": "82d16054ada6633297a3108fb6d8bae98800c76f",
+ "size": 41663,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-tinyfd-natives-linux-arm32.jar"
+ }
+ }
+ },
+ "name": "org.lwjgl:lwjgl-tinyfd:3.2.2-gman32.1",
+ "natives": {
+ "linux-arm32": "natives-linux-arm32"
+ },
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "1203660b3131cbb8681b17ce6437412545be95e0",
+ "size": 6802,
+ "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-tinyfd.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-tinyfd:3.3.1-mmachina.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "1203660b3131cbb8681b17ce6437412545be95e0",
+ "size": 6802,
+ "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-tinyfd.jar"
+ },
+ "classifiers": {
+ "natives-osx-arm64": {
+ "sha1": "015b931a2daba8f0c317d84c9d14e8e98ae56e0c",
+ "size": 41384,
+ "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-tinyfd-natives-macos-arm64.jar"
+ }
+ }
+ },
+ "name": "org.lwjgl:lwjgl-tinyfd:3.3.1-mmachina.1",
+ "natives": {
+ "osx-arm64": "natives-osx-arm64"
+ },
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32",
+ "match": [
+ "org.lwjgl:lwjgl:3.2.2",
+ "org.lwjgl:lwjgl:3.2.1",
+ "org.lwjgl:lwjgl:3.1.6",
+ "org.lwjgl:lwjgl:3.1.2"
+ ],
+ "override": {
+ "rules": [
+ {
+ "action": "allow"
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ },
+ {
+ "action": "disallow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ },
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "360899386df83d6a8407844a94478607af937f97",
+ "size": 318833,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-core.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl:3.2.2-gman64.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "360899386df83d6a8407844a94478607af937f97",
+ "size": 318833,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-core.jar"
+ },
+ "classifiers": {
+ "natives-linux-arm64": {
+ "sha1": "612efd57d12b2e48e554858eb35e7e2eb46ebb4c",
+ "size": 87121,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-natives-linux-arm64.jar"
+ }
+ }
+ },
+ "name": "org.lwjgl:lwjgl:3.2.2-gman64.1",
+ "natives": {
+ "linux-arm64": "natives-linux-arm64"
+ },
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "16ea3934fca417368250d1ddac01a30c1809d317",
+ "size": 318413,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-core.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl:3.2.2-gman32.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "16ea3934fca417368250d1ddac01a30c1809d317",
+ "size": 318413,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-core.jar"
+ },
+ "classifiers": {
+ "natives-linux-arm32": {
+ "sha1": "6bd0b37fef777a309936a72dc7f63126e8c79ea5",
+ "size": 90296,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-natives-linux-arm32.jar"
+ }
+ }
+ },
+ "name": "org.lwjgl:lwjgl:3.2.2-gman32.1",
+ "natives": {
+ "linux-arm32": "natives-linux-arm32"
+ },
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "8e664dd69ad7bbcf2053da23efc7848e39e498db",
+ "size": 719038,
+ "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl:3.3.1-mmachina.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ },
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "8e664dd69ad7bbcf2053da23efc7848e39e498db",
+ "size": 719038,
+ "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl.jar"
+ },
+ "classifiers": {
+ "natives-osx-arm64": {
+ "sha1": "984df31fadaab86838877b112e5b4e4f68a00ccf",
+ "size": 42693,
+ "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-natives-macos-arm64.jar"
+ }
+ }
+ },
+ "name": "org.lwjgl:lwjgl:3.3.1-mmachina.1",
+ "natives": {
+ "osx-arm64": "natives-osx-arm64"
+ },
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Only allow osx-arm64 for existing LWJGL 3.3.1",
+ "match": [
+ "org.lwjgl:lwjgl-glfw-natives-macos-arm64:3.3.1",
+ "org.lwjgl:lwjgl-jemalloc-natives-macos-arm64:3.3.1",
+ "org.lwjgl:lwjgl-openal-natives-macos-arm64:3.3.1",
+ "org.lwjgl:lwjgl-opengl-natives-macos-arm64:3.3.1",
+ "org.lwjgl:lwjgl-stb-natives-macos-arm64:3.3.1",
+ "org.lwjgl:lwjgl-tinyfd-natives-macos-arm64:3.3.1",
+ "org.lwjgl:lwjgl-natives-macos-arm64:3.3.1"
+ ],
+ "override": {
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "_comment": "Only allow osx-arm64 for existing java-objc-bridge:1.1",
+ "match": [
+ "ca.weblite:java-objc-bridge:1.1"
+ ],
+ "override": {
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "osx-arm64"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "_comment": "Only allow windows-arm64 for existing LWJGL 3.3.1",
+ "match": [
+ "org.lwjgl:lwjgl-glfw-natives-windows-arm64:3.3.1",
+ "org.lwjgl:lwjgl-jemalloc-natives-windows-arm64:3.3.1",
+ "org.lwjgl:lwjgl-openal-natives-windows-arm64:3.3.1",
+ "org.lwjgl:lwjgl-opengl-natives-windows-arm64:3.3.1",
+ "org.lwjgl:lwjgl-stb-natives-windows-arm64:3.3.1",
+ "org.lwjgl:lwjgl-tinyfd-natives-windows-arm64:3.3.1",
+ "org.lwjgl:lwjgl-natives-windows-arm64:3.3.1"
+ ],
+ "override": {
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "windows-arm64"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.1",
+ "match": [
+ "org.lwjgl:lwjgl-glfw:3.3.1"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "513eb39b866d0fe131a18d5c517087805433b029",
+ "size": 112350,
+ "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm64:3.3.1-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.1",
+ "match": [
+ "org.lwjgl:lwjgl-jemalloc:3.3.1"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "749be48a9b86ee2c3a2da5fd77511208adcfb33b",
+ "size": 159993,
+ "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.3.1/lwjgl-jemalloc-patched-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm64:3.3.1-gman64.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.1",
+ "match": [
+ "org.lwjgl:lwjgl-openal:3.3.1"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "cf4e303257e82981b8b2e31bba3d7f8f7b8f42b2",
+ "size": 470743,
+ "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-openal-natives-linux-arm64:3.3.1-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.1",
+ "match": [
+ "org.lwjgl:lwjgl-opengl:3.3.1"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "1c528fb258a6e63e8fceb4482d8db0f3af10a634",
+ "size": 57908,
+ "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm64:3.3.1-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.1",
+ "match": [
+ "org.lwjgl:lwjgl-stb:3.3.1"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "8e8348a1813aad7f30aaf75ea197151ebb7beba9",
+ "size": 205491,
+ "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-stb-natives-linux-arm64:3.3.1-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.1",
+ "match": [
+ "org.lwjgl:lwjgl-tinyfd:3.3.1"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "964f628b7a82fd909def086c0dd9a4b84bb259ae",
+ "size": 42654,
+ "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm64:3.3.1-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.1",
+ "match": [
+ "org.lwjgl:lwjgl:3.3.1"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "b597401014acb7196c76d97e15a6288f54f1f692",
+ "size": 86308,
+ "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl/lwjgl-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-natives-linux-arm64:3.3.1-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.1",
+ "match": [
+ "org.lwjgl:lwjgl-glfw:3.3.1"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "816d935933f2dd743074c4e717cc25b55720f294",
+ "size": 104027,
+ "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm32:3.3.1-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.1",
+ "match": [
+ "org.lwjgl:lwjgl-jemalloc:3.3.1"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "a96a6d6cb3876d7813fcee53c3c24f246aeba3b3",
+ "size": 136157,
+ "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-jemalloc/lwjgl-jemalloc-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm32:3.3.1-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.1",
+ "match": [
+ "org.lwjgl:lwjgl-openal:3.3.1"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "ffbe35d7fa5ec9b7eca136a7c71f24d4025a510b",
+ "size": 400129,
+ "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-openal-natives-linux-arm32:3.3.1-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.1",
+ "match": [
+ "org.lwjgl:lwjgl-opengl:3.3.1"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "e3550fa91097fd56e361b4370fa822220fef3595",
+ "size": 58474,
+ "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm32:3.3.1-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.1",
+ "match": [
+ "org.lwjgl:lwjgl-stb:3.3.1"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "b08226bab162c06ae69337d8a1b0ee0a3fdf0b90",
+ "size": 153889,
+ "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-stb-natives-linux-arm32:3.3.1-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.1",
+ "match": [
+ "org.lwjgl:lwjgl-tinyfd:3.3.1"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "d53d331e859217a61298fcbcf8d79137f3df345c",
+ "size": 48061,
+ "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm32:3.3.1-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.1",
+ "match": [
+ "org.lwjgl:lwjgl:3.3.1"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "41a3c1dd15d6b964eb8196dde69720a3e3e5e969",
+ "size": 82374,
+ "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl/lwjgl-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-natives-linux-arm32:3.3.1-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.2",
+ "match": [
+ "org.lwjgl:lwjgl-freetype:3.3.2"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "896e7d9b8f60d7273f3d491c69270afc67ece3ce",
+ "size": 1073374,
+ "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-freetype/lwjgl-freetype-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-freetype-natives-linux-arm64:3.3.2-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.2",
+ "match": [
+ "org.lwjgl:lwjgl-glfw:3.3.2"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "bc49e64bae0f7ff103a312ee8074a34c4eb034c7",
+ "size": 120168,
+ "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm64:3.3.2-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.2",
+ "match": [
+ "org.lwjgl:lwjgl-jemalloc:3.3.2"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "5249f18a9ae20ea86c5816bc3107a888ce7a17d2",
+ "size": 206402,
+ "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-jemalloc/lwjgl-jemalloc-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm64:3.3.2-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.2",
+ "match": [
+ "org.lwjgl:lwjgl-openal:3.3.2"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "22408980cc579709feaf9acb807992d3ebcf693f",
+ "size": 590865,
+ "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-openal-natives-linux-arm64:3.3.2-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.2",
+ "match": [
+ "org.lwjgl:lwjgl-opengl:3.3.2"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "bb9eb56da6d1d549d6a767218e675e36bc568eb9",
+ "size": 58627,
+ "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm64:3.3.2-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.2",
+ "match": [
+ "org.lwjgl:lwjgl-stb:3.3.2"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "11a380c37b0f03cb46db235e064528f84d736ff7",
+ "size": 207419,
+ "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-stb-natives-linux-arm64:3.3.2-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.2",
+ "match": [
+ "org.lwjgl:lwjgl-tinyfd:3.3.2"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "93f8c5bc1984963cd79109891fb5a9d1e580373e",
+ "size": 43381,
+ "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm64:3.3.2-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.2",
+ "match": [
+ "org.lwjgl:lwjgl:3.3.2"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "8bd89332c90a90e6bc4aa997a25c05b7db02c90a",
+ "size": 90795,
+ "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl/lwjgl-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-natives-linux-arm64:3.3.2-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.2",
+ "match": [
+ "org.lwjgl:lwjgl-freetype:3.3.2"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "b7f77ceb951182659fd400437272aa7e96709968",
+ "size": 924657,
+ "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-freetype/lwjgl-freetype-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-freetype-natives-linux-arm32:3.3.2-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.2",
+ "match": [
+ "org.lwjgl:lwjgl-glfw:3.3.2"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "5907d9a6b7c44fb0612a63bb1cff5992588f65be",
+ "size": 110067,
+ "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm32:3.3.2-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.2",
+ "match": [
+ "org.lwjgl:lwjgl-jemalloc:3.3.2"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "9367437ce192e4d6f5725d53d85520644c0b0d6f",
+ "size": 177571,
+ "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-jemalloc/lwjgl-jemalloc-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm32:3.3.2-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.2",
+ "match": [
+ "org.lwjgl:lwjgl-openal:3.3.2"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "7c82bbc33ef49ee4094b216c940db564b2998224",
+ "size": 503352,
+ "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-openal-natives-linux-arm32:3.3.2-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.2",
+ "match": [
+ "org.lwjgl:lwjgl-opengl:3.3.2"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "821f9a2d1d583c44893f42b96f6977682b48a99b",
+ "size": 59265,
+ "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm32:3.3.2-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.2",
+ "match": [
+ "org.lwjgl:lwjgl-stb:3.3.2"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "ca9333da184aade20757151f4615f1e27ca521ae",
+ "size": 154928,
+ "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-stb-natives-linux-arm32:3.3.2-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.2",
+ "match": [
+ "org.lwjgl:lwjgl-tinyfd:3.3.2"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "807e220913aa0740449ff90d3b3d825cf5f359ed",
+ "size": 48788,
+ "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm32:3.3.2-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.2",
+ "match": [
+ "org.lwjgl:lwjgl:3.3.2"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "afcbfaaa46f217e98a6da4208550f71de1f2a225",
+ "size": 89347,
+ "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl/lwjgl-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-natives-linux-arm32:3.3.2-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.3",
+ "match": [
+ "org.lwjgl:lwjgl-freetype:3.3.3"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "498965aac06c4a0d42df1fbef6bacd05bde7f974",
+ "size": 1093516,
+ "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-freetype/lwjgl-freetype-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-freetype-natives-linux-arm64:3.3.3-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.3",
+ "match": [
+ "org.lwjgl:lwjgl-glfw:3.3.3"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "492a0f11f85b85899a6568f07511160c1b87cd38",
+ "size": 122159,
+ "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm64:3.3.3-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.3",
+ "match": [
+ "org.lwjgl:lwjgl-jemalloc:3.3.3"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "eff8b86798191192fe2cba2dc2776109f30c239d",
+ "size": 209315,
+ "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-jemalloc/lwjgl-jemalloc-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm64:3.3.3-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.3",
+ "match": [
+ "org.lwjgl:lwjgl-openal:3.3.3"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "ad8f302118a65bb8d615f8a2a680db58fb8f835e",
+ "size": 592963,
+ "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-openal-natives-linux-arm64:3.3.3-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.3",
+ "match": [
+ "org.lwjgl:lwjgl-opengl:3.3.3"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "2096f6b94b2d68745d858fbfe53aacf5f0c8074c",
+ "size": 58625,
+ "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm64:3.3.3-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.3",
+ "match": [
+ "org.lwjgl:lwjgl-stb:3.3.3"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "ddc177afc2be1ee8d93684b11363b80589a13fe1",
+ "size": 207418,
+ "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-stb-natives-linux-arm64:3.3.3-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.3",
+ "match": [
+ "org.lwjgl:lwjgl-tinyfd:3.3.3"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "2823a8c955c758d0954d282888075019ef99cec7",
+ "size": 43864,
+ "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm64:3.3.3-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm64 support for LWJGL 3.3.3",
+ "match": [
+ "org.lwjgl:lwjgl:3.3.3"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "f35d8b6ffe1ac1e3a5eb1d4e33de80f044ad5fd8",
+ "size": 91294,
+ "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl/lwjgl-natives-linux-arm64.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-natives-linux-arm64:3.3.3-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm64"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.3",
+ "match": [
+ "org.lwjgl:lwjgl-freetype:3.3.3"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "7dd3b1f751571adaf2c4dc882bc675a5d1e796e6",
+ "size": 942636,
+ "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-freetype/lwjgl-freetype-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-freetype-natives-linux-arm32:3.3.3-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.3",
+ "match": [
+ "org.lwjgl:lwjgl-glfw:3.3.3"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "d9af485c32545b37dd5359b163161d42d7534dcf",
+ "size": 112560,
+ "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm32:3.3.3-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.3",
+ "match": [
+ "org.lwjgl:lwjgl-jemalloc:3.3.3"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "109b6931880d02d4e65ced38928a16e41d19873e",
+ "size": 178324,
+ "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-jemalloc/lwjgl-jemalloc-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm32:3.3.3-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.3",
+ "match": [
+ "org.lwjgl:lwjgl-openal:3.3.3"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "e1702aa09d20359d6cf5cb2999fa7685a785eca7",
+ "size": 505618,
+ "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-openal-natives-linux-arm32:3.3.3-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.3",
+ "match": [
+ "org.lwjgl:lwjgl-opengl:3.3.3"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "dbba17fc5ac0985d14a57c11f9537617d67b9952",
+ "size": 59263,
+ "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm32:3.3.3-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.3",
+ "match": [
+ "org.lwjgl:lwjgl-stb:3.3.3"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "1ae28ff044699ff29b0e980ffabd73fba8a664b3",
+ "size": 154931,
+ "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-stb-natives-linux-arm32:3.3.3-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.3",
+ "match": [
+ "org.lwjgl:lwjgl-tinyfd:3.3.3"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "c2a0a05c82c4b9f69ded0b6ad5f417addea78ce2",
+ "size": 49495,
+ "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm32:3.3.3-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Add linux-arm32 support for LWJGL 3.3.3",
+ "match": [
+ "org.lwjgl:lwjgl:3.3.3"
+ ],
+ "additionalLibraries": [
+ {
+ "downloads": {
+ "artifact": {
+ "sha1": "2075c51a80f0ef0f22ba616ba54007ac2b0debd4",
+ "size": 89565,
+ "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl/lwjgl-natives-linux-arm32.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-natives-linux-arm32:3.3.3-lwjgl.1",
+ "rules": [
+ {
+ "action": "allow",
+ "os": {
+ "name": "linux-arm32"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_comment": "Replace glfw from 3.3.1 with version from 3.3.2 to prevent stack smashing",
+ "match": [
+ "org.lwjgl:lwjgl-glfw-natives-linux:3.3.1",
+ "org.lwjgl:lwjgl-glfw:3.3.1:natives-linux"
+ ],
+ "override": {
+ "downloads": {
+ "artifact": {
+ "sha1": "0766bb0e8e829598b1c8052fd8173c62af741c52",
+ "size": 115553,
+ "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-glfw/lwjgl-glfw-natives-linux.jar"
+ }
+ },
+ "name": "org.lwjgl:lwjgl-glfw-natives-linux:3.3.2-lwjgl.1"
+ }
+ }
+]
diff --git a/apps/daedalus_client/package.json b/apps/daedalus_client/package.json
new file mode 100644
index 000000000..41c8b0ae3
--- /dev/null
+++ b/apps/daedalus_client/package.json
@@ -0,0 +1,10 @@
+{
+ "name": "@modrinth/daedalus_client",
+ "scripts": {
+ "build": "cargo build --release",
+ "lint": "cargo fmt --check && cargo clippy --all-targets --all-features -- -D warnings",
+ "fix": "cargo fmt && cargo clippy --fix",
+ "dev": "cargo run",
+ "test": "cargo test"
+ }
+}
\ No newline at end of file
diff --git a/apps/daedalus_client/src/error.rs b/apps/daedalus_client/src/error.rs
new file mode 100644
index 000000000..d4a0167cb
--- /dev/null
+++ b/apps/daedalus_client/src/error.rs
@@ -0,0 +1,63 @@
+use tracing_error::InstrumentError;
+
+#[derive(thiserror::Error, Debug)]
+pub enum ErrorKind {
+ #[error("Daedalus Error: {0}")]
+ Daedalus(#[from] daedalus::Error),
+ #[error("Invalid input: {0}")]
+ InvalidInput(String),
+ #[error("Error while managing asynchronous tasks")]
+ TaskError(#[from] tokio::task::JoinError),
+ #[error("Error while deserializing JSON: {0}")]
+ SerdeJSON(#[from] serde_json::Error),
+ #[error("Error while deserializing XML: {0}")]
+ SerdeXML(#[from] serde_xml_rs::Error),
+ #[error("Failed to validate file checksum at url {url} with hash {hash} after {tries} tries")]
+ ChecksumFailure {
+ hash: String,
+ url: String,
+ tries: u32,
+ },
+ #[error("Unable to fetch {item}")]
+ Fetch { inner: reqwest::Error, item: String },
+ #[error("Error while uploading file to S3: {file}")]
+ S3 {
+ inner: s3::error::S3Error,
+ file: String,
+ },
+ #[error("Error acquiring semaphore: {0}")]
+ Acquire(#[from] tokio::sync::AcquireError),
+ #[error("Tracing error: {0}")]
+ Tracing(#[from] tracing::subscriber::SetGlobalDefaultError),
+ #[error("Zip error: {0}")]
+ Zip(#[from] async_zip::error::ZipError),
+}
+
+#[derive(Debug)]
+pub struct Error {
+ pub source: tracing_error::TracedError,
+}
+
+impl std::fmt::Display for Error {
+ fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ write!(fmt, "{}", self.source)
+ }
+}
+
+impl> From for Error {
+ fn from(source: E) -> Self {
+ let error = Into::::into(source);
+
+ Self {
+ source: error.in_current_span(),
+ }
+ }
+}
+
+impl ErrorKind {
+ pub fn as_error(self) -> Error {
+ self.into()
+ }
+}
+
+pub type Result = core::result::Result;
diff --git a/apps/daedalus_client/src/fabric.rs b/apps/daedalus_client/src/fabric.rs
new file mode 100644
index 000000000..2c394bc23
--- /dev/null
+++ b/apps/daedalus_client/src/fabric.rs
@@ -0,0 +1,301 @@
+use crate::util::{download_file, fetch_json, format_url};
+use crate::{insert_mirrored_artifact, Error, MirrorArtifact, UploadFile};
+use daedalus::modded::{Manifest, PartialVersionInfo, DUMMY_REPLACE_STRING};
+use dashmap::DashMap;
+use serde::Deserialize;
+use std::sync::Arc;
+use tokio::sync::Semaphore;
+
+#[tracing::instrument(skip(semaphore, upload_files, mirror_artifacts))]
+pub async fn fetch_fabric(
+ semaphore: Arc,
+ upload_files: &DashMap,
+ mirror_artifacts: &DashMap,
+) -> Result<(), Error> {
+ fetch(
+ daedalus::modded::CURRENT_FABRIC_FORMAT_VERSION,
+ "fabric",
+ "https://meta.fabricmc.net/v2",
+ "https://maven.fabricmc.net/",
+ &[],
+ semaphore,
+ upload_files,
+ mirror_artifacts,
+ )
+ .await
+}
+
+#[tracing::instrument(skip(semaphore, upload_files, mirror_artifacts))]
+pub async fn fetch_quilt(
+ semaphore: Arc,
+ upload_files: &DashMap,
+ mirror_artifacts: &DashMap,
+) -> Result<(), Error> {
+ fetch(
+ daedalus::modded::CURRENT_QUILT_FORMAT_VERSION,
+ "quilt",
+ "https://meta.quiltmc.org/v3",
+ "https://maven.quiltmc.org/repository/release/",
+ &[
+ // This version is broken as it contains invalid library coordinates
+ "0.17.5-beta.4",
+ ],
+ semaphore,
+ upload_files,
+ mirror_artifacts,
+ )
+ .await
+}
+
+#[allow(clippy::too_many_arguments)]
+#[tracing::instrument(skip(semaphore, upload_files, mirror_artifacts))]
+async fn fetch(
+ format_version: usize,
+ mod_loader: &str,
+ meta_url: &str,
+ maven_url: &str,
+ skip_versions: &[&str],
+ semaphore: Arc,
+ upload_files: &DashMap,
+ mirror_artifacts: &DashMap,
+) -> Result<(), Error> {
+ let modrinth_manifest = fetch_json::(
+ &format_url(&format!("{mod_loader}/v{format_version}/manifest.json",)),
+ &semaphore,
+ )
+ .await
+ .ok();
+ let fabric_manifest = fetch_json::(
+ &format!("{meta_url}/versions"),
+ &semaphore,
+ )
+ .await?;
+
+ // We check Modrinth's fabric version manifest and compare if the fabric version exists in Modrinth's database
+ // We also check intermediary versions that are newly added to query
+ let (fetch_fabric_versions, fetch_intermediary_versions) =
+ if let Some(modrinth_manifest) = modrinth_manifest {
+ let (mut fetch_versions, mut fetch_intermediary_versions) =
+ (Vec::new(), Vec::new());
+
+ for version in &fabric_manifest.loader {
+ if !modrinth_manifest
+ .game_versions
+ .iter()
+ .any(|x| x.loaders.iter().any(|x| x.id == version.version))
+ && !skip_versions.contains(&&*version.version)
+ {
+ fetch_versions.push(version);
+ }
+ }
+
+ for version in &fabric_manifest.intermediary {
+ if !modrinth_manifest
+ .game_versions
+ .iter()
+ .any(|x| x.id == version.version)
+ && fabric_manifest
+ .game
+ .iter()
+ .any(|x| x.version == version.version)
+ {
+ fetch_intermediary_versions.push(version);
+ }
+ }
+
+ (fetch_versions, fetch_intermediary_versions)
+ } else {
+ (
+ fabric_manifest
+ .loader
+ .iter()
+ .filter(|x| !skip_versions.contains(&&*x.version))
+ .collect(),
+ fabric_manifest.intermediary.iter().collect(),
+ )
+ };
+
+ const DUMMY_GAME_VERSION: &str = "1.21";
+
+ if !fetch_intermediary_versions.is_empty() {
+ for x in &fetch_intermediary_versions {
+ insert_mirrored_artifact(
+ &x.maven,
+ None,
+ vec![maven_url.to_string()],
+ false,
+ mirror_artifacts,
+ )?;
+ }
+ }
+
+ if !fetch_fabric_versions.is_empty() {
+ let fabric_version_manifest_urls = fetch_fabric_versions
+ .iter()
+ .map(|x| {
+ format!(
+ "{}/versions/loader/{}/{}/profile/json",
+ meta_url, DUMMY_GAME_VERSION, x.version
+ )
+ })
+ .collect::>();
+ let fabric_version_manifests = futures::future::try_join_all(
+ fabric_version_manifest_urls
+ .iter()
+ .map(|x| download_file(x, None, &semaphore)),
+ )
+ .await?
+ .into_iter()
+ .map(|x| serde_json::from_slice(&x))
+ .collect::, serde_json::Error>>()?;
+
+ let patched_version_manifests = fabric_version_manifests
+ .into_iter()
+ .map(|mut version_info| {
+ for lib in &mut version_info.libraries {
+ let new_name = lib
+ .name
+ .replace(DUMMY_GAME_VERSION, DUMMY_REPLACE_STRING);
+
+ // Hard-code: This library is not present on fabric's maven, so we fetch it from MC libraries
+ if &*lib.name == "net.minecraft:launchwrapper:1.12" {
+ lib.url = Some(
+ "https://libraries.minecraft.net/".to_string(),
+ );
+ }
+
+ // If a library is not intermediary, we add it to mirror artifacts to be mirrored
+ if lib.name == new_name {
+ insert_mirrored_artifact(
+ &new_name,
+ None,
+ vec![lib
+ .url
+ .clone()
+ .unwrap_or_else(|| maven_url.to_string())],
+ false,
+ mirror_artifacts,
+ )?;
+ } else {
+ lib.name = new_name;
+ }
+
+ lib.url = Some(format_url("maven/"));
+ }
+
+ version_info.id = version_info
+ .id
+ .replace(DUMMY_GAME_VERSION, DUMMY_REPLACE_STRING);
+ version_info.inherits_from = version_info
+ .inherits_from
+ .replace(DUMMY_GAME_VERSION, DUMMY_REPLACE_STRING);
+
+ Ok(version_info)
+ })
+ .collect::, Error>>()?;
+ let serialized_version_manifests = patched_version_manifests
+ .iter()
+ .map(|x| serde_json::to_vec(x).map(bytes::Bytes::from))
+ .collect::, serde_json::Error>>()?;
+
+ serialized_version_manifests
+ .into_iter()
+ .enumerate()
+ .for_each(|(index, bytes)| {
+ let loader = fetch_fabric_versions[index];
+
+ let version_path = format!(
+ "{mod_loader}/v{format_version}/versions/{}.json",
+ loader.version
+ );
+
+ upload_files.insert(
+ version_path,
+ UploadFile {
+ file: bytes,
+ content_type: Some("application/json".to_string()),
+ },
+ );
+ });
+ }
+
+ if !fetch_fabric_versions.is_empty()
+ || !fetch_intermediary_versions.is_empty()
+ {
+ let fabric_manifest_path =
+ format!("{mod_loader}/v{format_version}/manifest.json",);
+
+ let loader_versions = daedalus::modded::Version {
+ id: DUMMY_REPLACE_STRING.to_string(),
+ stable: true,
+ loaders: fabric_manifest
+ .loader
+ .into_iter()
+ .map(|x| {
+ let version_path = format!(
+ "{mod_loader}/v{format_version}/versions/{}.json",
+ x.version,
+ );
+
+ daedalus::modded::LoaderVersion {
+ id: x.version,
+ url: format_url(&version_path),
+ stable: x.stable,
+ }
+ })
+ .collect(),
+ };
+
+ let manifest = daedalus::modded::Manifest {
+ game_versions: std::iter::once(loader_versions)
+ .chain(fabric_manifest.game.into_iter().map(|x| {
+ daedalus::modded::Version {
+ id: x.version,
+ stable: x.stable,
+ loaders: vec![],
+ }
+ }))
+ .collect(),
+ };
+
+ upload_files.insert(
+ fabric_manifest_path,
+ UploadFile {
+ file: bytes::Bytes::from(serde_json::to_vec(&manifest)?),
+ content_type: Some("application/json".to_string()),
+ },
+ );
+ }
+
+ Ok(())
+}
+
+#[derive(Deserialize, Debug, Clone)]
+struct FabricVersions {
+ pub loader: Vec,
+ pub game: Vec,
+ #[serde(alias = "hashed")]
+ pub intermediary: Vec,
+}
+
+#[derive(Deserialize, Debug, Clone)]
+struct FabricLoaderVersion {
+ // pub separator: String,
+ // pub build: u32,
+ // pub maven: String,
+ pub version: String,
+ #[serde(default)]
+ pub stable: bool,
+}
+
+#[derive(Deserialize, Debug, Clone)]
+struct FabricIntermediaryVersion {
+ pub maven: String,
+ pub version: String,
+}
+
+#[derive(Deserialize, Debug, Clone)]
+struct FabricGameVersion {
+ pub version: String,
+ pub stable: bool,
+}
diff --git a/apps/daedalus_client/src/forge.rs b/apps/daedalus_client/src/forge.rs
new file mode 100644
index 000000000..a560b81aa
--- /dev/null
+++ b/apps/daedalus_client/src/forge.rs
@@ -0,0 +1,793 @@
+use crate::util::{
+ download_file, fetch_json, fetch_xml, format_url,
+};
+use crate::{insert_mirrored_artifact, Error, MirrorArtifact, UploadFile};
+use chrono::{DateTime, Utc};
+use daedalus::get_path_from_artifact;
+use daedalus::modded::PartialVersionInfo;
+use dashmap::DashMap;
+use futures::io::Cursor;
+use indexmap::IndexMap;
+use itertools::Itertools;
+use serde::de::DeserializeOwned;
+use serde::Deserialize;
+use std::collections::HashMap;
+use std::sync::Arc;
+use tokio::sync::Semaphore;
+
+#[tracing::instrument(skip(semaphore, upload_files, mirror_artifacts))]
+pub async fn fetch_forge(
+ semaphore: Arc,
+ upload_files: &DashMap,
+ mirror_artifacts: &DashMap,
+) -> Result<(), Error> {
+ let forge_manifest = fetch_json::>>(
+ "https://files.minecraftforge.net/net/minecraftforge/forge/maven-metadata.json",
+ &semaphore,
+ )
+ .await?;
+
+ let mut format_version = 0;
+
+ let forge_versions = forge_manifest.into_iter().flat_map(|(game_version, versions)| versions.into_iter().map(|loader_version| {
+ // Forge versions can be in these specific formats:
+ // 1.10.2-12.18.1.2016-failtests
+ // 1.9-12.16.0.1886
+ // 1.9-12.16.0.1880-1.9
+ // 1.14.4-28.1.30
+ // This parses them to get the actual Forge version. Ex: 1.15.2-31.1.87 -> 31.1.87
+ let version_split = loader_version.split('-').nth(1).unwrap_or(&loader_version).to_string();
+
+ // Forge has 3 installer formats:
+ // - Format 0 (Unsupported ATM): Forge Legacy (pre-1.5.2). Uses Binary Patch method to install
+ // To install: Download patch, download minecraft client JAR. Combine patch and client JAR and delete META-INF/.
+ // (pre-1.3-2) Client URL: https://maven.minecraftforge.net/net/minecraftforge/forge/{version}/forge-{version}-client.zip
+ // (pre-1.3-2) Server URL: https://maven.minecraftforge.net/net/minecraftforge/forge/{version}/forge-{version}-server.zip
+ // (1.3-2-onwards) Universal URL: https://maven.minecraftforge.net/net/minecraftforge/forge/{version}/forge-{version}-universal.zip
+ // - Format 1: Forge Installer Legacy (1.5.2-1.12.2ish)
+ // To install: Extract install_profile.json from archive. "versionInfo" is the profile's version info. Convert it to the modern format
+ // Extract forge library from archive. Path is at "install"."path".
+ // - Format 2: Forge Installer Modern
+ // To install: Extract install_profile.json from archive. Extract version.json from archive. Combine the two and extract all libraries
+ // which are embedded into the installer JAR.
+ // Then upload. The launcher will need to run processors!
+ if format_version != 1 && &*version_split == "7.8.0.684" {
+ format_version = 1;
+ } else if format_version != 2 && &*version_split == "14.23.5.2851" {
+ format_version = 2;
+ }
+
+ ForgeVersion {
+ format_version,
+ installer_url: format!("https://maven.minecraftforge.net/net/minecraftforge/forge/{0}/forge-{0}-installer.jar", loader_version),
+ raw: loader_version,
+ loader_version: version_split,
+ game_version: game_version.clone(),
+ }
+ })
+ .collect::>())
+ // TODO: support format version 0 (see above)
+ .filter(|x| x.format_version != 0)
+ .filter(|x| {
+ // These following Forge versions are broken and cannot be installed
+ const BLACKLIST : &[&str] = &[
+ // Not supported due to `data` field being `[]` even though the type is a map
+ "1.12.2-14.23.5.2851",
+ // Malformed Archives
+ "1.6.1-8.9.0.749",
+ "1.6.1-8.9.0.751",
+ "1.6.4-9.11.1.960",
+ "1.6.4-9.11.1.961",
+ "1.6.4-9.11.1.963",
+ "1.6.4-9.11.1.964",
+ ];
+
+ !BLACKLIST.contains(&&*x.raw)
+ })
+ .collect::>();
+
+ fetch(
+ daedalus::modded::CURRENT_FORGE_FORMAT_VERSION,
+ "forge",
+ "https://maven.minecraftforge.net/",
+ forge_versions,
+ semaphore,
+ upload_files,
+ mirror_artifacts,
+ )
+ .await
+}
+
+#[tracing::instrument(skip(semaphore, upload_files, mirror_artifacts))]
+pub async fn fetch_neo(
+ semaphore: Arc,
+ upload_files: &DashMap,
+ mirror_artifacts: &DashMap,
+) -> Result<(), Error> {
+ #[derive(Debug, Deserialize)]
+ struct Metadata {
+ versioning: Versioning,
+ }
+
+ #[derive(Debug, Deserialize)]
+ struct Versioning {
+ versions: Versions,
+ }
+
+ #[derive(Debug, Deserialize)]
+ struct Versions {
+ version: Vec,
+ }
+
+ let forge_versions = fetch_xml::(
+ "https://maven.neoforged.net/net/neoforged/forge/maven-metadata.xml",
+ &semaphore,
+ )
+ .await?;
+ let neo_versions = fetch_xml::(
+ "https://maven.neoforged.net/net/neoforged/neoforge/maven-metadata.xml",
+ &semaphore,
+ )
+ .await?;
+
+ let parsed_versions = forge_versions.versioning.versions.version.into_iter().map(|loader_version| {
+ // NeoForge Forge versions can be in these specific formats:
+ // 1.20.1-47.1.74
+ // 47.1.82
+ // This parses them to get the actual Forge version. Ex: 1.20.1-47.1.74 -> 47.1.74
+ let version_split = loader_version.split('-').nth(1).unwrap_or(&loader_version).to_string();
+
+ Ok(ForgeVersion {
+ format_version: 2,
+ installer_url: format!("https://maven.neoforged.net/net/neoforged/forge/{0}/forge-{0}-installer.jar", loader_version),
+ raw: loader_version,
+ loader_version: version_split,
+ game_version: "1.20.1".to_string(), // All NeoForge Forge versions are for 1.20.1
+ })
+ }).chain(neo_versions.versioning.versions.version.into_iter().map(|loader_version| {
+ let mut parts = loader_version.split('.');
+
+ // NeoForge Forge versions are in this format: 20.2.29-beta, 20.6.119
+ // Where the first number is the major MC version, the second is the minor MC version, and the third is the NeoForge version
+ let major = parts.next().ok_or_else(
+ || crate::ErrorKind::InvalidInput(format!("Unable to find major game version for NeoForge {loader_version}"))
+ )?;
+
+ let minor = parts.next().ok_or_else(
+ || crate::ErrorKind::InvalidInput(format!("Unable to find minor game version for NeoForge {loader_version}"))
+ )?;
+
+ let game_version = if minor == "0" {
+ format!("1.{major}")
+ } else {
+ format!("1.{major}.{minor}")
+ };
+
+ Ok(ForgeVersion {
+ format_version: 2,
+ installer_url: format!("https://maven.neoforged.net/net/neoforged/neoforge/{0}/neoforge-{0}-installer.jar", loader_version),
+ loader_version: loader_version.clone(),
+ raw: loader_version,
+ game_version,
+ })
+ }))
+ .collect::, Error>>()?
+ .into_iter()
+ .filter(|x| {
+ // These following Forge versions are broken and cannot be installed
+ const BLACKLIST : &[&str] = &[
+ // Unreachable / 404
+ "1.20.1-47.1.7",
+ "47.1.82",
+ ];
+
+ !BLACKLIST.contains(&&*x.raw)
+ }).collect();
+
+ fetch(
+ daedalus::modded::CURRENT_NEOFORGE_FORMAT_VERSION,
+ "neo",
+ "https://maven.neoforged.net/",
+ parsed_versions,
+ semaphore,
+ upload_files,
+ mirror_artifacts,
+ )
+ .await
+}
+
+#[tracing::instrument(skip(
+ forge_versions,
+ semaphore,
+ upload_files,
+ mirror_artifacts
+))]
+async fn fetch(
+ format_version: usize,
+ mod_loader: &str,
+ maven_url: &str,
+ forge_versions: Vec,
+ semaphore: Arc,
+ upload_files: &DashMap,
+ mirror_artifacts: &DashMap,
+) -> Result<(), Error> {
+ let modrinth_manifest = fetch_json::(
+ &format_url(&format!("{mod_loader}/v{format_version}/manifest.json",)),
+ &semaphore,
+ )
+ .await
+ .ok();
+
+ let fetch_versions = if let Some(modrinth_manifest) = modrinth_manifest {
+ let mut fetch_versions = Vec::new();
+
+ for version in &forge_versions {
+ if !modrinth_manifest.game_versions.iter().any(|x| {
+ x.id == version.game_version
+ && x.loaders.iter().any(|x| x.id == version.loader_version)
+ }) {
+ fetch_versions.push(version);
+ }
+ }
+
+ fetch_versions
+ } else {
+ forge_versions.iter().collect()
+ };
+
+ if !fetch_versions.is_empty() {
+ let forge_installers = futures::future::try_join_all(
+ fetch_versions
+ .iter()
+ .map(|x| download_file(&x.installer_url, None, &semaphore)),
+ )
+ .await?;
+
+ #[tracing::instrument(skip(raw, upload_files, mirror_artifacts))]
+ async fn read_forge_installer(
+ raw: bytes::Bytes,
+ loader: &ForgeVersion,
+ maven_url: &str,
+ mod_loader: &str,
+ upload_files: &DashMap,
+ mirror_artifacts: &DashMap,
+ ) -> Result {
+ tracing::trace!(
+ "Reading forge installer for {}",
+ loader.loader_version
+ );
+ type ZipFileReader = async_zip::base::read::seek::ZipFileReader<
+ Cursor,
+ >;
+
+ let cursor = Cursor::new(raw);
+ let mut zip = ZipFileReader::new(cursor).await?;
+
+ #[tracing::instrument(skip(zip))]
+ async fn read_file(
+ zip: &mut ZipFileReader,
+ file_name: &str,
+ ) -> Result