# Minecraft DependencySorter Patch Patched `server-26.1.jar` (inner jar, extracted from bundler) with fixed `DependencySorter.isCyclic` — adds `Set visited` parameter to prevent exponential revisiting of diamond dependency graphs. ## Files - `server-26.1-patched.jar` — inner jar with patched DependencySorter.class - `../defects/minecraft/DependencySorter-before.java` — decompiled original - `../defects/minecraft/DependencySorter-after.java` — fixed version ## To apply to a full server.jar ```python import zipfile, os with open('server-26.1-patched.jar', 'rb') as f: patched_inner = f.read() with zipfile.ZipFile('server.jar', 'r') as zin, \ zipfile.ZipFile('server-patched.jar', 'w', compression=zipfile.ZIP_DEFLATED, allowZip64=True) as zout: for item in zin.infolist(): if item.filename == 'META-INF/versions/26.1/server-26.1.jar': zout.writestr(item, patched_inner) else: zout.writestr(item, zin.read(item.filename)) ``` ## Why the signing is stripped Mojang signs `server-26.1.jar` with SHA-384 manifests (`META-INF/MOJANGCS.SF`/`.RSA`). Any class modification invalidates the signature. The patched jar removes: - `META-INF/MOJANGCS.SF` - `META-INF/MOJANGCS.RSA` - Manifest stanzas for `DependencySorter.class` and `DependencySorter$Entry.class` All other class digests are preserved intact. ## Benchmark See `tests/bench/DependencySorterBenchmark.java`. | Diamond depth | Tags | BEFORE (ns) | AFTER (ns) | Speedup | |---------------|------|-------------|------------|---------| | 8 | 18 | 98,384 | 22,779 | 4.3x | | 10 | 22 | 436,388 | 37,353 | 11.7x | | 12 | 26 | 1,633,446 | 51,872 | 31.5x | | 14 | 30 | 6,486,367 | 73,704 | 88.0x | | 16 | 34 | OVERFLOW | 98,626 | — | Vanilla server (500 tags, shallow diamonds): no measurable boot difference. Large modpack (1000+ tags, depth 8-14): 11-88x speedup predicted.