diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 457a7e4464..0f09f73325 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -91,7 +91,7 @@ jobs: - name: Test run: | - python -m pytest -q tools/test_linux_port.py tools/test_host_watch_hash.py tools/test_touch_menu.py tools/harness tools/test_profile.py + python -m pytest -q tools/test_linux_port.py tools/test_host_watch_hash.py tools/test_touch_menu.py tools/harness tools/test_profile.py tools/test_map_index.py tools/test_map_download_check.py python tools/test_light_storage.py - name: Compile cache diff --git a/AGENTS.md b/AGENTS.md index abdbea8854..7f02c809b0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -26,7 +26,7 @@ end. | `port/third_party/` | Vendored libraries, each with a README naming its upstream, version and checksum | | `port/tools/` | Stand-alone tools (`cache_file_report.c`) | | `tools/` | Build scripts (`linux_build.py`, `windows_build.py`, `android_build.py`, `web_build.py`, `ci_build.py`, `web_serve.py`), generators (`ce_menus.py`, `port_settings.py`, `hud_assets.py`, `title_assets.py`, `embed_assets.py`, `xdk_headers.py`) and tests | -| `docs/` | Longer design notes (`custom_edition_caches.md`) | +| `docs/` | Longer design notes (`custom_edition_caches.md`, `map_downloads.md`) | | `pgo/` | Profile-guided optimisation profiles | | `assets/` | Game data for local runs (gitignored: `maps/`, `custom_maps/`) | | `.github/workflows/` | CI: builds every platform on each push, publishes releases from `main` | @@ -85,6 +85,7 @@ setting (`game.custom_edition`), checked at run time with python -m pytest -q tools/harness tools/test_touch_menu.py # the engine's functions in a fake world python -m pytest -q tools/test_linux_port.py # the build, the maps' checks (needs assets/maps) python -m pytest -q tools/test_cache_file_formats.py tools/test_bmp_files.py tools/test_profile.py +python -m pytest -q tools/test_map_index.py tools/test_map_download_check.py # the map downloads' index and checks python tools/test_touch_layout.py # the Android touch layout (JDK 17+) python tools/test_light_storage.py python tools/test_death_timing.py @@ -176,7 +177,10 @@ Custom Edition maps live in the data root's `custom_maps` folder with added: a map that needs them is refused, and one that only carries OpenSauce's header runs as stock Custom Edition runs it. Map files are untrusted input: read them through bounds-checked readers. See -`docs/custom_edition_caches.md`. +`docs/custom_edition_caches.md`. A map that a host does not send is +downloaded from the community's archives and checked against +`port/assets/network/map_index.txt` (`docs/map_downloads.md`); no player's +map file is ever replaced or renamed. ### Settings @@ -216,6 +220,7 @@ as documentation of file formats, never copied. | [port/web/README.md](port/web/README.md) | The web build, the page, the game data in the browser, limits, how it operates, hosting on GitHub Pages | | [port/include/xdk/README.md](port/include/xdk/README.md) | How the SDK declarations were written and are checked | | [docs/custom_edition_caches.md](docs/custom_edition_caches.md) | Loading and converting Custom Edition maps, and the evidence for each layout | +| [docs/map_downloads.md](docs/map_downloads.md) | Custom Edition maps downloaded from the community's archives, the index of the maps, `tools/map_index.py` | | [port/assets/menus/README.md](port/assets/menus/README.md) | The menu files' format and how to write them again | | [port/assets/menus/NON_HANDDRAWN.md](port/assets/menus/NON_HANDDRAWN.md) | Menu pictures that are not redraws | | [port/assets/menus/UNWIRED.md](port/assets/menus/UNWIRED.md) | Menu functions that do nothing yet | diff --git a/docs/custom_edition_caches.md b/docs/custom_edition_caches.md index 215b51b7b7..40ae7d0df0 100644 --- a/docs/custom_edition_caches.md +++ b/docs/custom_edition_caches.md @@ -34,11 +34,13 @@ games, progress, the next level). The game engine keeps 63 characters of a level name, so a map whose file name is longer than 51 is not listed. A map in `custom_maps` is named for its contents once the map lists (or a -host picking it) find it: `hugeass.map` becomes `hugeass_0e2b3ee4.map`, the -first 8 hexadecimal digits of its hash after `_`, its `.bmp` and `.txt` -renamed with it (`port/linux/game/map_share_files.c`; the name is cut short -to keep the level name within 63 characters). A network game's level name -then says which version of the map it is on, a player without it downloads +host picking it) find it: a game on `hugeass.map` is on the level +`custom_maps\hugeass_0e2b3ee4`, the first 8 hexadecimal digits of its hash +after `_` (`port/linux/game/map_share_files.c`; a name too long to keep the +level name within 63 characters with them is left without). The file keeps +its name: no map is renamed, and the level finds `hugeass.map` by its hash +(`custom_edition_cache.c`). A network game's level name then says which +version of the map it is on, a player without it downloads it under that name (`port/linux/NETCODE.md`, "Map sharing"), and two versions of a map keep apart. A level name without the hash (a saved last map, a test's) finds the one map of that name in `custom_maps`. The menus diff --git a/docs/map_downloads.md b/docs/map_downloads.md new file mode 100644 index 0000000000..f835f964a9 --- /dev/null +++ b/docs/map_downloads.md @@ -0,0 +1,197 @@ +# Custom Edition maps from the community's archives + +Map sharing (`port/linux/README.md`, "Map sharing") sends a player who joins +without the game's Custom Edition map the host's copy. Some hosts do not +send it: a host with SHARE MAPS off (`network.map_share = false`), a build +that names its maps without their hash (a level of `custom_maps\` +alone, which map sharing does not download), or a game seen in the server +browser before joining. For those, the game downloads the map from the +community's archives instead, the zips the maps' authors published, and +checks every byte against an index of the maps before it uses it. + +There are some 6,000 Custom Edition maps, over 500 GB. Nobody needs them +all: a player downloads the one map a game is on, from its zip. + +Nothing of this goes over the game's own connections, so it needs no +network version of its own (`port/linux/NETCODE.md`). A client looks the +host's map up by the name and version (the header checksum) that the +game's advertisement and settings already carry. + +## For players + +Nothing to set up. The download starts by itself: + +- when you join a game from the games list (LAN, Direct Link or the server + browser) whose map you do not have, under a name map sharing does not + download. The join goes ahead by itself once the map is there; +- when you join a game whose host does not send its map. You leave the + game, with a message that the map is being downloaded. Join again when it + is there. + +While it downloads, Halo's loading screen covers the menus, its light +sweeping from left to right as the map comes, with the map's name and how +much has come ("Downloading hugeass.map from HaloNet: 34 MB of 92 MB"). +B stops the download. With `maps.download_screen = false` the menus stay +up, and the status line of the games list shows the download instead. + +The loading screen's picture is the Xbox's own (the Halo ring and +LOADING...). Importing a disc image writes it into the maps folder as +`loading.tga`: the retail disc has no such file, and its `default.xbe` +holds the picture, which `port/linux/src/xiso.c`, the Android app's +`XisoExtractor.java` and the web page's `xiso-worker.js` take out. Without +one, from a maps folder copied by hand, the light sweeps over clouds that +the game makes. + +A map comes from the first of these that has it: + +1. The zips of HaloNet's map repository (maps.halonet.net) and of HaloMaps + (halomaps.org), in `maps.archives`'s order. The map is taken out of its + zip. +2. The web seeds (`maps.web_seeds`): folders on web servers that hold the + maps under their file names. The default is a seed box's folder that + holds every map of the index. + +A map that is not the index's version once downloaded (from a zip or a web +seed) is thrown away, and the next source is tried. + +Custom Edition's `bitmaps.map`, `sounds.map` and `loc.map`, which every +Custom Edition map needs, are downloaded the same way when missing. + +No map already there is ever replaced, renamed or changed. A downloaded map +is written to `custom_maps` as `_.map`, the name map sharing +gives that version (`hugeass_0e2b3ee4.map`), beside any other version that +you have. A resource map keeps its own name, and is written only when none +is there. A download goes to `custom_maps/downloads` until it is checked. + +When a host names its map without the hash (`custom_maps\hugeass`) and your +`hugeass.map` is another version (another header checksum), the game plays +the version beside it whose header checksum is the host's +(`custom_edition_cache_present`, `port/linux/game/custom_edition_cache.c`). + +The Linux and Windows builds download from the archives over HTTPS, with +the self-updater's HTTPS (`update.h`). The Android build and the web build +do not download from the archives: Android has no HTTPS of the platform +layer yet, and a web page fetches what it plays itself +(`port/web/src/web_map_downloads.c`). + +The settings, in `config.toml` (`port/linux/README.md` has every setting): + +| Setting | Default | Meaning | +| --- | --- | --- | +| `maps.downloads` | `true` | Download a map that is missing, and that the host does not send, from the archives. `false`: never. | +| `maps.download_screen` | `true` | Halo's loading screen over the menus while a map downloads (B stops it). `false`: the menus stay up, with the status line. | +| `maps.archives` | `"halonet,halomaps"` | The archives a missing map is taken from first, out of the zip that holds it, in this order: `halonet` (maps.halonet.net), `halomaps` (halomaps.org). Empty: none. Linux and Windows. | +| `maps.web_seeds` | `"https://halomaps.fractumseraph.net/maps/"` | Comma-separated `https://` folders that hold the maps under their file names: tried after the archives, and asked for pieces beside the players when map sharing downloads a map. Empty: none. Linux and Windows. | +| `maps.index` | `"map_index.txt"` | The index of the maps, next to `config.toml` unless a full path. | + +Nothing is downloaded while Custom Edition maps cannot be played +(`game.custom_edition`). + +## Map sharing's web seeds + +When map sharing downloads a map from the game's players +(`port/linux/game/map_share.c`), a web seed sends pieces of it too, if the +index has the file at the size the host offered (the map by its name and +header checksum, a resource map by its name). The seed is asked for runs of +16 pieces (4 MiB) that no player has been asked for, with an HTTP range +request (`update_request_range`, `update.h`), and each piece is checked +against its hash, as a player's piece is (the pieces' hashes come from the +host or the players, checked against the file's hash the host offered). So a +web seed cannot send a wrong map: a piece that is not the file's ends the +web seed for that file, and three failed requests end it for the download. +Nothing of this goes over the game's connections, so it needs no network +version, and players of builds without it are unaffected. + +With the default settings this uses the seed box's folder of every map, so a +host whose upload is slow does not hold its players' downloads up. It needs +`maps.downloads` on and an `https://` folder in `maps.web_seeds`; the +Android and web builds have none. + +## How a map is known: the index + +`port/assets/network/map_index.txt` lists every map, one a line, +tab-separated: the file name, the header checksum, the size, the piece +length and the info hash, then a column for each archive's zip that holds +it: `halonet:` (https://maps.halonet.net/maps/) or `halomaps:` (https://halomaps.org/hce/detail.cfm?fid=). The Linux and Windows builds put it next to the game as +`map_index.txt`. It was made from the halomaps.org and HaloNet archives +(5,829 maps, with the three resource maps) by `tools/map_index.py`. + +A host's game carries the map file's header checksum as the map version +(`cache_files_map_version`, `source/cache/cache_files.c`), which a client +checks its own copy against. So a map is known here by its file name and +that checksum, and two versions of a map with one name are two entries. The +three resource maps have a checksum of 0 and are found by name. A map +named for its hash (`hugeass_0e2b3ee4`) is looked up without the hash. A +host's version that is not in the index is not downloaded. + +The piece length and info hash are those of a single-file BitTorrent v1 +torrent of the map whose info dictionary is exactly `{length, name, piece +length, pieces}`, in that order. A machine that has the file can make the +info hash from the index line alone: the game hashes each piece of a +download with SHA-1 (`port/linux/src/map_sha1.c`), and then the info +dictionary, and the download is the index's only if that hash is the +index's (`map_archives_verify`, `port/linux/src/map_archives_zip.c`). The +same torrents can be seeded by any BitTorrent client, and a seed box that +seeds them can serve its folder as a web seed. + +To make the index from folders of maps: + +``` +python tools/map_index.py make --maps [--maps ...] + --resource-maps --torrents +``` + +which writes `.torrent` files (for seed boxes) and merges the +entries into the index, remembering the files hashed in +`/.map_torrents_cache.json` so that a rerun hashes only new +ones. `python tools/map_index.py check` checks an index against its +torrent files. The archives' columns come from copies of their zips: + +``` +python tools/map_index.py sources --halonet --halomaps +``` + +with HaloNet's zips under their names and HaloMaps's named +`-.zip`. A zip holds a map when one of its files has the +map's name (in any folder), size and header checksum. + +## How it operates + +- `port/linux/src/map_downloads.c` reads the index, takes the game's + requests (`map_downloads_fetch`: the level, its version and the files + missing), downloads the files one at a time, and puts each in place. + `map_downloads_poll` runs it each frame (`source/main/main.c`). +- `port/linux/src/map_archives.c` fetches one file on a thread of its own: + HaloNet's zip, HaloMaps's (its page gives a token that its form takes, + as a browser's download does), then the web seeds, with the + self-updater's HTTPS (`update_request`, `update.h`). A download that + stops starts again from the start next time. +- `port/linux/src/map_archives_zip.c` takes a map out of a zip (stored or + deflated, with zlib) and checks a file against the index's info hash. +- `custom_edition_cache_files_missing` (`port/linux/game/custom_edition_cache.c`) + says which files a level needs that are not there: the map, when no copy + of the host's version is there, and the resource maps. +- The game asks for a download when map sharing cannot have the map + (`cache_files_map_present`, `source/cache/cache_files.c`), when a host + declines map sharing's request (`download_offered`, + `port/linux/game/map_share.c`), and when a game in the games list is + joined (`ui_widget_port_join_map_fetch`, `port/linux/game/menu_functions.c`). +- `port/linux/game/download_screen.c` draws the loading screen over the + menus (`source/interface/progress_bar.c`). + +Map files and zips are untrusted input: the zip reader checks every offset +and size against the file, writes nothing but the one file asked for, and +nothing is used before its info hash is the index's. + +## Tests + +- `tools/test_map_index.py` tests the index tool with made-up maps. +- `tools/test_map_download_check.py` runs `build/linux/map_download_check` + (`tools/map_download_check.c`, which `ninja linux` builds): a map taken out + of made-up zips, damaged zips refused, and a file checked against the + info hash that `tools/map_index.py` gives it, other files refused. It + also checks that the committed index starts as the game reads it. + +Neither needs game data or the network. diff --git a/port/android/app/src/main/java/com/halo/decomp/XisoExtractor.java b/port/android/app/src/main/java/com/halo/decomp/XisoExtractor.java index 95ce93729a..2be2b3bf32 100644 --- a/port/android/app/src/main/java/com/halo/decomp/XisoExtractor.java +++ b/port/android/app/src/main/java/com/halo/decomp/XisoExtractor.java @@ -29,6 +29,11 @@ * The files are written to maps.partial first and moved into maps once they * all are, so an interrupted extraction never leaves maps/ui.map behind. * + * The loading screen's picture, which the retail disc has no file of, is + * taken out of the image's default.xbe and written beside the maps as the + * loading.tga the game reads (loadingPicture, as xiso.c's + * write_loading_picture); without it the loading screen makes clouds. + * * Some parts of this code are copyright in@fishtank.com. This product * includes software developed by in <in@fishtank.com>. * @@ -76,6 +81,12 @@ final class XisoExtractor { private static final int MAXIMUM_FILES = 256; private static final int COPY_BUFFER_SIZE = 1 << 20; private static final byte[] VOLUME_MAGIC = "MICROSOFT*XBOX*MEDIA".getBytes(StandardCharsets.US_ASCII); + /* the loading screen's picture (source/interface/progress_bar.c) */ + private static final int LOADING_WIDTH = 320; + private static final int LOADING_HEIGHT = 240; + private static final int TGA_HEADER_SIZE = 18; + private static final long MAXIMUM_XBE_SIZE = 64 << 20; + private static final String LOADING_PICTURE = "loading.tga"; /* where the game partition starts: a plain image, and whole-disc images (extract-xiso's GLOBAL, XGD3 and XGD1 offsets) */ @@ -213,11 +224,88 @@ private static void walk(ByteBuffer table, long offset, int depth, boolean direc walk(table, right, depth + 1, directories, out, visited); } + /** + * The loading screen's picture out of a default.xbe, as the TGA the game + * reads (uncompressed, 24 bits, rows from the bottom), or null. The + * executable holds it, 320 by 240, as runs of 4-bit greys (a byte each: + * the grey's high four bits in its low nibble, the run's length in its high + * one) after the width and height as 32-bit numbers: found by those two + * numbers followed by runs that fill the picture exactly. + */ + static byte[] loadingPicture(byte[] xbe) { + int pixels = LOADING_WIDTH * LOADING_HEIGHT; + byte[] greys = new byte[pixels]; + ByteBuffer words = ByteBuffer.wrap(xbe).order(ByteOrder.LITTLE_ENDIAN); + boolean found = false; + + for (int at = 0; at + 8 <= xbe.length && !found; at++) { + if (words.getInt(at) != LOADING_WIDTH || words.getInt(at + 4) != LOADING_HEIGHT) + continue; + int pixel = 0; + for (int next = at + 8; next < xbe.length && pixel < pixels; next++) { + int run = (xbe[next] & 0xFF) >> 4; + + if (run == 0 || pixel + run > pixels) + break; + java.util.Arrays.fill(greys, pixel, pixel + run, (byte) ((xbe[next] & 0x0F) << 4)); + pixel += run; + } + found = pixel == pixels; + } + if (!found) + return null; + byte[] tga = new byte[TGA_HEADER_SIZE + pixels * 3]; + tga[2] = 2; + tga[12] = (byte) (LOADING_WIDTH & 0xFF); + tga[13] = (byte) (LOADING_WIDTH >> 8); + tga[14] = (byte) (LOADING_HEIGHT & 0xFF); + tga[15] = (byte) (LOADING_HEIGHT >> 8); + tga[16] = 24; + for (int y = 0; y < LOADING_HEIGHT; y++) { + for (int x = 0; x < LOADING_WIDTH; x++) { + int out = TGA_HEADER_SIZE + (y * LOADING_WIDTH + x) * 3; + byte grey = greys[(LOADING_HEIGHT - 1 - y) * LOADING_WIDTH + x]; + + tga[out] = tga[out + 1] = tga[out + 2] = grey; + } + } + return tga; + } + + /** writes the root's default.xbe's loading picture into folder; whether it did */ + private boolean writeLoadingPicture(ByteBuffer rootTable, File folder) { + List rootFiles = new ArrayList<>(); + walk(rootTable, 0, 0, false, rootFiles, new int[1]); + for (Entry file : rootFiles) { + if (!file.name.equalsIgnoreCase("default.xbe") || file.size <= 0 || file.size > MAXIMUM_XBE_SIZE) + continue; + File picture = new File(folder, LOADING_PICTURE); + try { + ByteBuffer xbe = ByteBuffer.allocate((int) file.size); + readAt(partition + file.sector * SECTOR_SIZE, xbe); + byte[] tga = loadingPicture(xbe.array()); + if (tga == null) + return false; + try (FileOutputStream out = new FileOutputStream(picture)) { + out.write(tga); + } + return true; + } catch (IOException | OutOfMemoryError e) { + /* (no picture, rather than one cut short, which the loading + screen would read past: it makes clouds) */ + picture.delete(); + return false; + } + } + return false; + } + private void extract(File destination, Progress progress) throws IOException { long[] root = findVolume(); /* the root's maps folder */ ByteBuffer table = readDirectory(root[0], root[1], "The disc image's file system is damaged."); + ByteBuffer rootTable = table; List directories = new ArrayList<>(); walk(table, 0, 0, true, directories, new int[1]); Entry maps = null; @@ -234,9 +322,11 @@ private void extract(File destination, Progress progress) throws IOException { walk(table, 0, 0, false, files, new int[1]); long total = 0; boolean hasUi = false; + boolean hasLoading = false; for (Entry file : files) { total += file.size; hasUi |= file.name.equalsIgnoreCase("ui.map"); + hasLoading |= file.name.equalsIgnoreCase(LOADING_PICTURE); } if (!hasUi) throw new ExtractException("The disc image's maps folder has no ui.map: it is not a Halo disc."); @@ -274,6 +364,9 @@ private void extract(File destination, Progress progress) throws IOException { } } + if (!hasLoading && writeLoadingPicture(rootTable, partial)) + files.add(new Entry(LOADING_PICTURE, 0, 0)); + /* (the maps folder may be there, empty: the app makes it for adb) */ if (!finished.isDirectory() && !finished.mkdirs()) throw new ExtractException("Could not create " + finished + "."); diff --git a/port/assets/network/map_index.txt b/port/assets/network/map_index.txt new file mode 100644 index 0000000000..95b0fe7dcc --- /dev/null +++ b/port/assets/network/map_index.txt @@ -0,0 +1,5836 @@ +# halo map index v1 +# The Custom Edition maps (tools/map_index.py): each line a map, +# tab-separated: file name, header checksum (the map version a host sends; 0 for +# the resource maps, matched by name alone), size in bytes, piece length, info hash, +# then the map archives' zips that hold it (halonet:, halomaps:). +# A map's single-file torrent has info = {length, name, piece length, pieces}: a +# download is checked against its info hash (port/linux/src/map_archives.c). +''H3''_prisioner.map 38A1F1A5 95348399 262144 b5c5f4daa91b617761cf203e14609382688a9d94 halomaps:5988 +(!V1¡)-(HR)Floodinthebase.map 5475464E 256799462 262144 a0e8663211bb1f141fd7e40194fbe717dfe96f01 halomaps:6762 +(182) Zombies.map EF22A88F 32327989 262144 50e111ac1983a47f48808d0c304cbca758cbf40c halomaps:4791 +(182)_Chatroom_V2.map 0A718F72 62203403 262144 d32fc6c156cf2d7fa8d2f774a2bed27bdec5f813 halomaps:4891 +(182)_Hanger.map 82D8BC77 93403359 262144 c89764abedc39aff336ea2007154d56c8d70d03f halomaps:4892 +(182)_Zombies_ME.map 653C4F58 81438856 262144 f21b9b45cee776a942b458939afe38760f32efb2 halomaps:4850 +(182)_Zombies_V2.map 88EC2753 67410229 262144 8bd411704ffff3f359114aea6420efeb827c14a5 halomaps:4893 +(182)_Zombies_V3.map 53F27056 60627237 262144 d571c699c108b2ec33125a69f87e2b629d22d113 halomaps:4894 +(arbiter)VS(elite).map 3A831BB2 60873239 262144 882946d933f47678b3ead714d6660a3160a6ef8a halomaps:6763 +(CSK)Gulch.map 3A0BA64C 98629640 262144 1ede0c2dfea22daa1603ac6b6480023184f7f3ed halomaps:5364 +(DMC)PokemonStadium.map B27B19AA 48722606 262144 4654b80800950bb27db349862f08c4483873a677 halomaps:4283 +(H2)bloodgulch.map FD3A4A1C 107756739 262144 6623e0274e0b725c821265440a09a6b907373356 halomaps:6764 +(H3)-Battle_field.map D1C65D76 164423477 262144 ac57e32743fd431d2ceeafec952fc2234371bc7a halomaps:5555 +(H3)_Guardians.map 4F82DC57 395466083 524288 98bfe69315afcb97407167ee00518040d055bb61 halonet:(H3)_Guardians.zip +(h3)_precipice_gulch.map 73683B95 71627905 262144 b95d8dd39e3b679afb79592398a68ca6bcf9345e halomaps:5943 +(h3)_swampthing.map 2696E7ED 70374896 262144 dca05890e37e0ace62e5b7672642b88d8392123a halomaps:5978 +(H4)Batalla Total.map CD361D68 262244820 262144 44840fdee9e94a6efb5d1cbfbc286f1712bd81f2 halonet:(H4)Batalla Total.zip +(H4)Duelo-Spartan.map 946BC1C1 210790601 262144 95eb25ad4135c92192c245828525f94fa7a394ce halonet:(H4)Duelo-Spartan.zip +(H4)Prisoner.map 13D42E11 213192212 262144 71146184fca12fc57d507e8585a150d19a456019 halonet:(H4)Prisoner.zip +(H4)Rojos-vs-Azules.map 51A170E9 317704623 262144 692c03f8d31f7d041a98e34bcac2d05807f2c443 halonet:(H4)Rojos-vs-Azules.zip +(H4)Sanctified.map 717129AD 311624121 262144 55520f0bdcc9c5b2a77edba5072121a03c013ed1 halonet:(H4)Sanctified.zip +(H4)Spartans-Vs-Elites.map 0C7955EF 224255922 262144 2f2895a874f3d843e8ac95ffba6afdf5f95b0ad2 halonet:(H4)Spartans-Vs-Elites.zip +(H4)Wizard.map 436E6FE1 217836361 262144 c78774f3705a6031791e2581e8269229be822634 halonet:(H4)Wizard.zip +(H5)Rat-Spartan.map 1293883E 361324663 262144 aca819948ac828d2fab5d2841acfb8934bbd77d3 halonet:(H5)Rat-Spartan.zip +(H5)Rojos-Vs-Azules.map 1FBE5820 369149247 262144 40c850bff9cb8233142a3c0e9bc0876e34f984d6 halonet:(H5)Rojos-Vs-Azules.zip +(HR)Covenant-vs-flood.map 7BE2FC55 239992705 262144 bb30519be8c8aa0084ec67a93b1e0663e892b041 halonet:(HR)Covenant-vs-flood.zip +(HR)Emilie-Vs-Covenant.map 4CF13B7D 349205993 262144 3b79446c6b382df7be3fef3c2a3a21f4738982b0 halonet:(HR)Emilie-Vs-Covenant.zip +(hr)floodinthebase.map 5475464E 256799462 262144 140b1b9fc93a582ae02be8b9576766d37c72f465 halonet:(hr)floodinthebase.zip +(HR)Kat-Vs-Covenant.map 8FD94FBF 350818905 262144 cb2d78a8dd52f89714d344d622980ce6a3387604 halonet:(HR)Kat-Vs-Covenant.zip +(HR)Marines-Vs-Covenant.map 860E7BB1 374416590 262144 5d15c991753c02aaf9791295cf83fa92f1653d19 halonet:(HR)Marines-Vs-Covenant.zip +(HR)Noble1-vs-Covenant.map D1CC2E1B 254262021 262144 54861d7062fcbc3e2109b2148168b52d7ad02d3b halonet:(HR)Noble1-vs-Covenant.zip +(HR)Noble6-vs-Covenant.map 8B65EAE4 299582958 262144 3ad5a7d2d6f5f52a15b717263135bcb7eb3259dd halonet:(HR)Noble6-vs-Covenant.zip +(HR)Noble6-vs-flood.map 60E85E7A 312378503 262144 3fb2388f37509f8a4e2d6e0be614d7b9470bdbcb halonet:(HR)Noble6-vs-flood.zip +(HR)Survivor-Emile.map 635D2F68 284092698 262144 f273191a41e0dbff9e1ff042f09d8a96603a9ca6 halonet:(HR)Survivor-Emile.zip +(SHY)_ALPHA_CANYON.map BF9D6F67 209330979 262144 8f5a696b7402fa23f6d29a2813617dd0b1e5d7f4 halonet:(SHY)_ALPHA_CANYON.zip +(V2)EMILE-Vs-Covenant.map 00ED38A1 344880311 262144 34063e829739aac129a386a2a4140c7a6c90c1f4 halonet:(V2)EMILE-Vs-Covenant.zip +-ib-portent.map 6433A981 63348231 262144 298860d2abeb3b293051876e9b4ce4b2fb709fc1 halomaps:2880 +-ib-portent_v2.map 0F546F22 56192999 262144 2be60602dba99cb2cf0971f6cbc13de041a59013 halomaps:2901 +-IB-school.map 26F5172E 58537179 262144 68d62b2707977234802729c7d150b9fb45f48991 halomaps:2832 +-IB-~Zanzibar.map 55AC0ED3 105673495 262144 d48350d2a4fe3ec687f43e806cb17cb9a07fc9c7 halomaps:2833 +01_chamber.map 64B2281E 130046694 262144 637ec0c7714679b33ee28fbd4f9dc6d5bd78f833 halonet:01_chamber.zip +10khalothemebeta.map 9D2DEC11 23648804 262144 7c1f187976566f40ef46ef3c0f3737fab702e38f halonet:10khalothemebeta.zip +10kPoaThemeBeta.map F2F656B2 17750340 262144 49d1a7748e1f876d6555cafc2b3b2222d6e435a8 halonet:10kPoaThemeBeta.zip +10kTRBeta1.map 70F80298 27812832 262144 e7ecf02ef7756458147c6e6353f1a738ca293d69 halonet:10kTRBeta1.zip +123fight.map 4F7B4AB7 44447151 262144 1719727ac81dcc2a8a4ddda4082f17a6435deda9 halomaps:5755 +123FT.map D68E8C9C 133795937 262144 5fc9e2222c41f20644986e065c9c9f253062626c halomaps:6244 +123ground.map 9FA07FD4 115057282 262144 af156fce98037a469da8255624d69b2ffa4e0e30 halomaps:5518 +1337 Uber Gulch.map E14AAE49 16174000 262144 7862568280b22d5a5b20df2a9063a4a71e1a0e37 halomaps:2586 +1bloodgulch.map C0E1D983 16610796 262144 db2c89639e432a01f8f9d9ef4f0c832ba666e4e3 halomaps:1703 +1st.map 5C529782 30828479 262144 818d49377005b9016851fe47edff0c5b73ecc5b1 halomaps:2769 +2 to 4 sum.map 462567E6 31824248 262144 fac2c71073cd48107158afd137c61ed51a79580c halomaps:6989 +2 to 6 sum.map DD3C7366 126408087 262144 23294870fcf5c5febd667ecf32e7d64f9d1cdade halomaps:6990 +2 to 8 sum.map C5AF1F7F 130659408 262144 1da768289c9970b7e53aaef2b3cbf32ee6e4e6cc halomaps:6991 +240692.map 72E0C3A1 56089085 262144 4bcdc3f288b39c88fec52a4c888d55a3981e4e6a halomaps:5365 +2hblood.map EEC0BE4C 387975109 262144 a624772331d89a294b51d5d1dddea5765298185c halonet:2hblood.zip +2nd_dankest_christmas.map C5A81E34 55185839 262144 24a779a137928bd90be20fbb932eaa96f19409e4 halonet:2nd_dankest_christmas.zip +3Tiers.map 5DB7EA0E 22590613 262144 e5f7df56b187e129bab1ad4496103a9094ffddce halomaps:4731 +4d-61-70.map 8EEF7EEA 55615545 262144 dd0bcf411e9da6b32e21f513aea8e2143783f854 halomaps:3285 +4seasons.map 0964362E 19000204 262144 057cc8ec66ca928e4a3335a7b40f0e6c59af4e3c halonet:4seasons.zip +77th.map B4B9BF94 124437173 262144 ccd0ebc07a1228f4d3e7aa244380c3e36c99f7f2 halomaps:4611 +7Streak-TuTv2.map 4A4BCB49 120519901 262144 46760c59957b6acbad2c70f59a733b7669d3e4d9 halomaps:5932 +=ac=timberland.map 32F33845 14528292 262144 4ac973137bede1570bac8e7628da9e43297c0e87 halomaps:2747 +=GYD=maps.map 3FDCF80B 38899029 262144 d52433207cf7ec5480096038e6f52502b7bfebf6 halomaps:7072 +=NE= Coagulation Final.map B9A1C640 65950551 262144 4acf90ef72e47644cd526e30a0ab454261162823 halomaps:3810 +=ne=coagulation_version1.2.map A8C873B6 73308744 262144 e4ebb5cb15c8c4371ad93bec56aa0d1cf4c91c09 halomaps:3623 +[)H3(]Adrenalina.map A2735F03 238274017 262144 482ada3a84134efc9520f87d40e43a92966ef3bd halomaps:5859 +[)H3(]Batalla_Final.map 741297B8 307534914 262144 5315f7bc6a2231a4a9c00c2518a63ed3d5b87209 halomaps:5860 +[)H3(]Battle=Batalla.map 16E52588 375125691 262144 3405f2058047ca8e7c4d32a04a315794467d16ca halomaps:5874 +[)H3(]colossus.map E27ABD32 322361529 262144 687a5b9dc3e7f93484f51c16919896431af4ea28 halomaps:5981 +[)H3(]Highlands.map 995DD4FC 399230142 524288 0d5982a8c7f88de3b037d9d01b548f5b1f437f3f halomaps:5972 +[)H3(]Pinnacle.map 3A63D2D1 291474262 262144 d93ba4a3e6b37e08960393caf7a555064649e3f6 halomaps:5861 +[)H3(]Sand_Ghost.map 20BF9E9C 348021717 262144 d7f5c90be29f9f48bf9252d77bc5895f488bc14c halomaps:5974 +[)H3(]Sandtrap_Ice.map 7E5AB433 397181944 524288 a8cb371390c7e085948a6ffaa55de2425cdd6628 halomaps:5917 +[10]DEMO.map 778F0DB8 112150914 262144 40ef7056df6868e6d387a980f4da220c6cb227bf halomaps:6205 +[2507] Obelisco.map D4DA9EE4 402388154 524288 501e15a16f2451547e2396141c70d8c141b44d52 halomaps:6694 +[]EMS[]_Blood_ODST.map 243F1D8B 133078613 262144 da52e6ba9f65146500aa365209ab557ce0a7ea31 halomaps:6359 +[]H3[]Beavercreek.map A7645E1A 213783384 262144 05924ab2294657d4ef2c8b5462d3781ada60cda9 halomaps:5827 +[]H3[]carousel.map 66605E62 206494316 262144 4a03a065389783fdb19cd53429fb36f14565437d halomaps:5828 +[]h3[]Christmas.map C74231B9 130776861 262144 339dbc4ee09c0122f66afda52243d15150ea436d halomaps:5973 +[]H3[]Danger_Mountain.map 56B6FB85 217761268 262144 b94b23ece0a2dcb86e30c9358c5ca955b1104ccf halomaps:5829 +[]H3[]Desert.map 38559489 200469193 262144 9db677209889ab083ac0a9cb1f2523b0eab62608 halomaps:5830 +[]H3[]Géminis.map 8406C7B2 224936334 262144 c15e3e033d18fd5bf3b07bc32d41ad77c5486983 halomaps:5831 +[AMT]agonia_eterna.map 52525A07 334162610 262144 9d805c9673a9fb2df768782bdadebc4c37f14850 halonet:[AMT]agonia_eterna.zip +[AMT]Death_Desolation.map E8F56E5B 251410099 262144 21207e351041c3115ad923803a1420561c49a1f3 halonet:[AMT]Death_Desolation.zip +[AMT]HE-Coagulation.map D21A338F 331946098 262144 c5fc240144738f4c17edc46fc8412fa10c15e26f halonet:[AMT]HE-Coagulation.zip +[AMT]Hr-Master_Garden.map D8542935 319814914 262144 1d49b99affcaed65a5e0dce18b3fb1c1c82af280 halonet:[AMT]Hr-Master_Garden.zip +[AMT]Playa_asesina.map D587F3D3 287982228 262144 42416f815c19a16d7f50389dd3b188089523d248 halonet:[AMT]Playa_asesina.zip +[AMT]rapid_fire.map FA870E45 308349980 262144 e8faff75a86eaec2c729c93cee1f21bdcdd738eb halonet:[AMT]rapid_fire.zip +[AMT]survival_attack.map EB69B56A 335885926 262144 66900eb1113bd23debc7a0914dfaba77e6f5cd98 halonet:[AMT]survival_attack.zip +[asmt]covenant_garden.map 96949690 229912029 262144 1af75539ccb207c2c8980d67903f579304ec99c9 halomaps:6255 +[asmt]index4127.map AD438610 187179869 262144 e044ede1c6b8538a2e0f8db46f1b7c673a0a952b halomaps:6256 +[Btm]_h3_bloodgulch.map D890EE53 124008837 262144 63bf591ea87c60b087d49198fec0c65242de4a3e halomaps:6285 +[CEA]icefields.map 3C4E11AC 189023886 262144 5a2253a3120b8b4c1f6523adde0c333436bb7d56 halonet:[CEA]icefields.zip +[CEX]Hex_Zone.map 57FD8907 100297547 262144 62ed02f1c4b3b1b19fddc09ce84610929e33cff4 halonet:[CEX]Hex_Zone.zip +[CEX]Ice_Land.map C51671BF 113429130 262144 887fdc3df83465b007c69b577cb23e83e307f5a9 halonet:[CEX]Ice_Land.zip +[CEX]SideWinder.map 73B2406F 98441284 262144 caeb51c69802c8dd5ed106639e3869ab4a169806 halonet:[CEX]SideWinder.zip +[CoD]Templo-En-Guerra.map 40B093C3 227210807 262144 c2e80b800c8098530dde8a02418b41d15cb07af8 halomaps:6481 +[cs117]_coagulation.map 9ADF9DBE 384675622 262144 1a2e9aba7a67e4ecba4c6fab42cc42b2cefc8ce7 halonet:[cs117]_coagulation.zip +[cs117]_heretic.map BF9EBBE4 319213273 262144 d4a42f1cfbbf5789aa00697778a5928c528c0dd2 halonet:[cs117]_heretic.zip +[cs117]_heretic_ai_bots.map 3D330231 373120512 262144 adab5cbb327c34584c07d937577c95b4530c2cc2 halonet:[cs117]_heretic_ai_bots.zip +[Cs117]_Narrows.map D15B1A58 322313848 262144 3b24a3e7a20dbac8ee4688bcc33e7067b78826a2 halonet:[Cs117]_Narrows.zip +[Cs117]_portent.map 5C3D75B4 397421015 524288 426d628d6007f17cce7ae1e131cee0129474dcee halonet:[Cs117]_portent.zip +[Cs117]floorak.map 57E81C77 230678787 262144 3a54165bea3f65bda139e9250257b8921a060e8c halonet:[Cs117]floorak.zip +[dumb_ai]_h2_turf.map B1E53A51 92922070 262144 21657a2c4d63ed3a3248dc6661ed47a44ff64c12 halomaps:6325 +[EAN]Chaos-race-ai.map FE49FEB7 184753414 262144 90b41d6b880e134e226f24fe9a839863d24db7ed halonet:[EAN]Chaos-race-ai.zip +[EAN]Zoocaut.map 6003ACE5 259080841 262144 4437e2a7c09fe82eda7bb1ec496d92cfe20290ad halonet:[EAN]Zoocaut.zip +[FBI]bloodgulch.map D90332B5 140976959 262144 cf19597fe8fc34b7185635b86ee4c49114c211be halomaps:6483 +[FBI]Derelict.map E7A90E77 93439677 262144 67451a0a7c55f002479f9152a55ff51f8534e395 halomaps:6521 +[glory].map 13739664 59120360 262144 09ce58f3f5469b2d4e12be2fd11a562cfabb158b halomaps:5712 +[H2]_ascension.map 580EB06D 95136246 262144 e0c5e0e258943a2dde07dd9927e5d816cbf6f90e halomaps:4881 +[H2]_beavercreek.map 39766546 83119294 262144 0ef3bb81410502de8cdce353e25421f668cca5be halomaps:4882 +[H2]_coagulation.map 4F5B9353 107964790 262144 1300eca16555f0be98140f9ed549d5e83b92b878 halomaps:4883 +[H2]_Ivory_Tower.map 5B0A052A 130477195 262144 726a5e6782b64920e36d4ffa782759fd6fb984bc halomaps:5204 +[H2]_Lockout.map 955A6C43 86738698 262144 a3d8dc3db92ff56c49c8976a491915a2287cf7b9 halomaps:5271 +[H2]_New_mombassa.map 3C9B6D2E 118991398 262144 b0b6b33d25e4f90d5acbec630834d5c831c886b8 halomaps:4884 +[H2]_sanctuary.map 36A5FC45 109509622 262144 d236f0a0b6a1ef71abffe9c48f20d75aecccc720 halomaps:4885 +[H2]_Turf.map 50EE1551 110411058 262144 b10131e6e490ff6e51a13dfdf8564ddb4aecf479 halomaps:5205 +[H2]_warlock.map BB1294D8 95434882 262144 039bf91bb6368bbc642007b06937305bbbb96d89 halomaps:4886 +[H2]_Zanzibar.map 00DEC884 121732478 262144 5945a510bd7379a2b4e374c120690abcf8e30b4d halomaps:4887 +[H2]Beavercreek.map 55C3900B 67180229 262144 961860ee2629fae558858d3f54f78c41d7db77a3 halomaps:6564 +[h2]desolation.map EA6F20EA 91740481 262144 9eed1825ea76beaebee7672a7b95b6e0dcea2c39 halomaps:6933 +[h2]Firefight_Ascension.map 96DFE189 231258006 262144 bb1fe6b71f1c15b8d82e7fbdfe00b269a9e23c85 halonet:[h2]Firefight_Ascension.zip +[H2]Tutorial.map CCE97488 79082119 262144 0bd30b676091c9e0fd789388e8f3dbdcc4c296f2 halonet:[H2]Tutorial.zip +[h3] core.map 96559B3D 175968496 262144 d6aed5d0719b7ee18a2e0b0c7086bec9f312ff2a halomaps:6484 +[H3] Imposing V2.map FE30AAFC 199136076 262144 366bcc23307fe5b2eac62824e0c67a196686ba37 halomaps:6498 +[h3]-odst-bloodgulch.map C5175AB8 129396341 262144 7ab6f6f5e76b5ef301db453645e7e4e23b220e1c halomaps:6326 +[H3]_ODST_Firefight_Airlock.map 635E0688 264747263 262144 ee8880bc2cf645d768e3b254ea0f32f5c16cd722 halomaps:6584 +[H3]_odst_island_invation_42.map 0AC96D26 174531792 262144 df9ba6caeb15deb4b1487a4047ba241dcf98ccf8 halomaps:6258 +[h3]_sandtrap.map 0B658200 177920893 262144 0e60b85a091666efc0ebe8ce4747fae150943745 halomaps:5274 +[h3]_sandtrap_race.map 54305FF8 181331647 262144 9f7328b4a2847598ae7e32434731a7b67f00b6a9 halomaps:5302 +[h3]_snowgulch.map 9B542F57 397466444 524288 21b4ac3184823f9f88e7f3ba88dc6cabd164a0d1 halonet:[h3]_snowgulch.zip +[H3]_Turf.map A3478351 121055387 262144 4b21ba75af6bbb03422e54073faadf97d56c3681 halomaps:5261 +[H3]_valhalla.map BE77B7CE 108480138 262144 17e08a03844385b040c80665e70e4cdd49e615c6 halomaps:6207 +[h3]Ancient_Sanctuary.map 7A8C9665 129363218 262144 a40a6a3302f2b09031c22ccddd0c6d372270c550 halomaps:5760 +[H3]Beavercreek.map 42B88EF4 238648613 262144 2cd10997cfce79455c203e65c1ae412769be9283 halomaps:5524 +[h3]bloodgulch-legend.map 306C821A 142652754 262144 7e922ba0bd3ee557fada5fc0ab66b5a7632ce0eb halomaps:5824 +[H3]Bloodgulch.map B9775E1D 258916678 262144 a5f814d66df328945e70682eccd4b25a4be854a3 halomaps:5525 +[H3]Bloodgulch_Ds.map B9775E1D 259023588 262144 524b941d1e5083f98741327a7652cebca7c50d1e halomaps:7086 +[H3]bloodgulchK.map 7C06C0F8 127247996 262144 d9a2ac45ddba979735e83da98f0a48521e45f1c4 halomaps:5670 +[H3]camp_of_death.map 05FFA545 332117497 262144 0d4e2bd8f42b8d95c0abdb85a78fc8ef28a19b26 halomaps:6370 +[H3]City.map 04E3DCCD 158684230 262144 bd3c7536d8457262f36d91b7bb833832a2f544e4 halomaps:5550 +[H3]Coagulation.map 764FADB3 299625381 262144 25700b8cb67fa8980fb854e066e7c04960374a36 halomaps:5435 +[H3]Coagulation_v2.map D70DCBD3 302225022 262144 3e3aba8108d8ceef2a7f4ac557a580b385da2dcd halonet:[H3]Coagulation_v2.zip +[H3]Cold_v1.map 503E7147 123410907 262144 3c93e9362c70501dafb7d48b44a714c4c7fd1429 halomaps:5739 +[H3]Damnation.map ADDE7F43 268914165 262144 1806c6d1e181f4a77a95178d66af09a39f9a2690 halomaps:5715 +[h3]DarkCreek.map C063FA08 217559505 262144 43486eb63f50cb82b3f68ebb2d7ca69ba5f992ce halomaps:5813 +[h3]darkwar.map 90397C04 203970394 262144 3318991d0606cfc44db7a7ce28e66b77de8d0f70 halomaps:6566 +[H3]Death_Island.map 37E7247D 274466047 262144 e838b1190e569953aaaf6fb64e1b95a424f1408d halomaps:5716 +[h3]deltaruins_ice.map C9CB5A99 322026812 262144 84493f51824b9ae7c6546f0bbbbc5aa3c1449a42 halomaps:6257 +[h3]Derelict.map 959799C6 114333111 262144 2cf045bee85ddc9c1626d9bcbabea498c01df457 halomaps:5761 +[H3]Desertwinder.map 2F529F34 306219138 262144 5ed4c9c73f8e8e115e982eb0ba44601ff2cfa703 halomaps:5643 +[H3]Down_Ruins.map 42E2C714 298304506 262144 d7c5b434ffd20913cf2ab232b7ce9a4e6393d740 halomaps:6073 +[h3]elite_gulch.map 488241F7 227655680 262144 8e8c4658a0e97764c2e17afa77299440db710e2b halomaps:5745 +[h3]field.map 6CD1ACFA 187091823 262144 f44bd826fe832e2919218492018b9a72c7802299 halomaps:5544 +[h3]GreenGulch.map B25CA3DE 161131514 262144 f6c204fb8c7a050b24e645a54b659e056ee69e8e halomaps:5789 +[h3]greenwinder.map F9D445B2 122436148 262144 c7dcee7b2ff659a1025f3728e20bea7917dfec9e halomaps:5762 +[H3]Ground-Battle.map F7C00B46 177723326 262144 858f962fa4285a4daf408aec3f0c85ea41767423 halomaps:5825 +[H3]Guardian_Beta0.3.map B9A26A19 289746267 262144 d693c60863eb9209d2776a1f5898996b5de1db8c halonet:[H3]Guardian_Beta0.3.zip +[H3]hangemhigh_ice.map E5ABC163 281083650 262144 c38094ab13457663e73594af01549232a68b6434 halomaps:6240 +[H3]Ice.map 267CF77C 234497964 262144 ab0f904097ab2a8db10697a756f03381a05d5a74 halomaps:5573 +[H3]Ice_Coagulation.map 0AFA9197 216531478 262144 4d02ebe95ef2c0aba19f42211cf7c88e3f5cf30b halomaps:6123 +[h3]icefields.map F0838495 243844093 262144 cce7cce761d3adf81260a1e4bda66b2264de135f halomaps:5629 +[H3]Island_of_Halo_(Fixed).map 1488FD47 130693988 262144 c3f283e9640ef79bbdc66fd36c418bd0b8e69ecf halomaps:6104 +[h3]lac_chapter1.map E662743B 314063834 262144 1dd494ce18424cfe0ab4dfbdca539c6ff6ee138c halomaps:6259 +[H3]Last_Resort.map 80D91095 306662740 262144 83485dfe30ad00f4f4dfed639553c921080de706 halonet:[H3]Last_Resort.zip +[H3]Narrows.map DFFD8EF0 158849200 262144 ce985e67325a798fec86635c4098706fdeea3eb4 halomaps:5551 +[h3]new_mombasa.map 2B6103EE 130623190 262144 180f3a7d94e687cff876fd82b5cd6242431ea81f halonet:[h3]new_mombasa.zip +[H3]peril.map 5831718C 168398857 262144 1df630688d0a3f0a86c1d04b8deeb3be273c5e47 halomaps:5552 +[H3]Represa.map 4C0A43CB 324060526 262144 69915ab31e4cb5561c31d86350334032b612a56f halomaps:6074 +[H3]Ruins.map 01D044EC 169070794 262144 1b0fc1a9387f7d16a6041ca5ab13af8dca2d2626 halomaps:5553 +[H3]Sand-Of-Warriors.map 1203B9D5 154425296 262144 8f63bcd4460f947b21bdc8a7a07aac5f1e21ffb3 halomaps:5826 +[H3]Sandtrap_v1.map EA88B0F3 329058309 262144 497cb60968e44b76196c5acae16da8b5eccd4fab halomaps:5554 +[h3]Sandtrap_v2.map 7F9A51E9 345661991 262144 72ac86f938cbb2507fa864e15062e2230ed836e9 halonet:[h3]Sandtrap_v2.zip +[h3]silent_lexicon.map 8EEDD77B 114672137 262144 8101d5c65ed85ce1e73b153ebc52885ff0c8675a halomaps:5293 +[h3]sniper_beavercreek.map 8C496541 92180298 262144 30adee756261990c833d728413184c25b100d5bb halomaps:6052 +[h3]sniper_ratrace.map 64A09C09 84629814 262144 36a1e544c33183a347c0553672676e486deda176 halomaps:6075 +[h3]Stiftung.map 3E956E8A 188399676 262144 dcadb1661fdfb0370a174d7a811d9a0c673f5ed7 halomaps:5626 +[H3]Stronghold.map 0FFAA6CB 176318196 262144 d56be124e0cb8240bc59d087c304e2908cc1c1b0 halomaps:5495 +[H3]The_rush.map 08708DFE 252546313 262144 a0d4f264106fd872228bf0ae65e3c6a09c6cf764 halomaps:5520 +[H3]Trench.map 11CCD718 142288034 262144 de58f1d17abea3d505d1558490a3fbc6accb2882 halomaps:5533 +[h3]valhalla.map 4A6B7967 226839379 262144 8558a2aba4c1bdb6f9b706e201235d520453ff89 halomaps:5574 +[H3]War_island.map 28EF12C6 140597562 262144 15077cf7773fbb10b2f4f4c2e0a481792d6d2256 halomaps:5447 +[h3]wizard.map 04BBC059 93535577 262144 6370913090c99e74fb53c2d24d568f7d6038ec69 halomaps:5747 +[h3]zanzibar.map B874B38E 292381692 262144 66fcf0602d4a07511527dd21901bdae26b82efb9 halomaps:6304 +[h3_elite]siege.map B28C5041 210516679 262144 a0ff1282722c1919343b246c49106909a1874be3 halomaps:6208 +[h3_ODST]seclusion.map 4206B5FF 225444781 262144 e8f58669b8dfcdfa96c0a4bbacaf9d59922f7f25 halomaps:6209 +[H3Astyle]Ancient_Sanctuary.map 09C88C6F 226164482 262144 2e8cc3a0a965210180fd056729f0d930567ec317 halomaps:6206 +[H3D]_ascencion.map 6F845BFF 138066923 262144 b20fec1daac74a31bdaaddf63ea050040eede1af halomaps:5443 +[H3D]_brujeria.map 0C1F1478 135019367 262144 79fccbc7ec9980140f3d252dae100dbb59e97d49 halomaps:5444 +[H3D]_cyclotron.map 6D3D640F 176302000 262144 fb1442092ef015650d7baccb78b30a1b8fb06fc6 halomaps:5445 +[H3D]_santuario.map E78563B8 179859468 262144 ffa75e09ed3bbef679305dbad7a6f81f09551276 halomaps:5446 +[H3DARIX]Beaver_Creek_v2.map 83051406 131673663 262144 e85c764513181b2a4eb7421da3b5686ab0149303 halomaps:6565 +[H3Style]containment.map 3AB7EAC9 228196302 262144 9b1688fdaa60636a0a5adfb5bfb71b2e80c14aa2 halomaps:5993 +[H4-beta]re-damnation.map D9C7D38E 216225755 262144 9d2aeae9557d2a37684f2491ca243c4fe89cc3b3 halomaps:6583 +[H4]_infinity_v2.map 6E698DBF 219568972 262144 bcae3f8232a267c5321d239cb264699088b41149 halonet:[H4]_infinity_v2.zip +[H4]_Lockout.map 48C397E6 224182853 262144 049a64064cabb69044b491ecf96f504d02f19f37 halonet:[H4]_Lockout.zip +[h4]_pegasus.map 3B60B15D 131152118 262144 229d4b3b6f33c5cef88842e60851bab93e9fbc5c halomaps:7129 +[H4]Beta_hidden_passage.map 408FC356 400544816 524288 fe87dc9f37c1ffcf78aa161d944a663f0e27d86f halonet:[H4]Beta_hidden_passage.zip +[H4]Bloodgulch.map C564C8AD 260110790 262144 98ef94176248bd1f3e43bdb8c995f1a26f6fb1f5 halomaps:6768 +[H4]Composerv2.313.map 6C227EB3 260646430 262144 6aa868e94a9d9c50da66528161d9dc27b56aa83c halonet:[H4]Composerv2.313.zip +[H4]Eterno-Retorno.map D9E1A570 254738939 262144 b1de68c54c737a1ee7901de48add6b3d4ff77778 halonet:[H4]Eterno-Retorno.zip +[H4]Snowcast.map 6B49AAFE 281025334 262144 de5436b70b3dabe43cd49553246053ff32448930 halonet:[H4]Snowcast.zip +[H4_Sky]AsVerIsland.map C4DA3060 338832482 262144 147ed0c544a988be129c328dc7a0a19d4e71aa81 halonet:[H4_Sky]AsVerIsland.zip +[h5]Thunder-beta.map 9A28A470 248869023 262144 68910da245885ed6c76b64d40714d6b1d6fd2708 halonet:[h5]Thunder-beta.zip +[HACE]Clans_Eaters.map 92B03279 341619478 262144 fee622ce793b16219229723b1cf096809b79a6ab halomaps:6180 +[halo2]ascension.map C4650A78 168858802 262144 ce22ec8d56dfac2b5d79ac8c2b5d84ab35d8505d halonet:[halo2]ascension.zip +[halo2]Coagulation.map F734E609 183904153 262144 e1317120879903a60cb2c6f91d24b739e713679d halonet:[halo2]Coagulation.zip +[halo2]Colossus.map 388A84AC 228928857 262144 19a394835af642173a3775e7827b7bee0e5db579 halonet:[halo2]Colossus.zip +[halo2]flood_revelacion.map 5A435E01 224546793 262144 b07f6befb057f582a7ce4f9a0bec71b2e327cde5 halonet:[halo2]flood_revelacion.zip +[halo2]Hang_Ville_high.map 1F06EC82 189497026 262144 2644ec452be08d5b4febe554bf80bb36ebbd46ac halonet:[halo2]Hang_Ville_high.zip +[halo2]Midship.map AFC3C807 234446339 262144 30a7f8980f297c1c9c3e844422f27eecd0e59824 halonet:[halo2]Midship.zip +[halo2]snowcast.map 7DCE122B 121914357 262144 a3e56fc83bc8a7682f93d3181b949ab6630c8bab halonet:[halo2]snowcast.zip +[halo2]terra.map 4A321759 131958239 262144 62eef3e9e6d3ffacd38d6e7dc3e6d4eb43d4468e halomaps:6934 +[halo3]desolation.map E725AEFB 294039852 262144 fd877f4989e073fc15a48cd46ee17d92cd859eb4 halonet:[halo3]desolation.zip +[halo3]flood_revelacion.map C5FBE97A 351512281 262144 e140e48768f360af0c52eaa4979ea3b97de6978b halonet:[halo3]flood_revelacion.zip +[halo3]nueva_bloodgulch.map 0CC2F26E 245565444 262144 7408e6f427e0ba0f9e3cd86b2db68f5c45c80d4c halonet:[halo3]nueva_bloodgulch.zip +[halo4-reach]re-beavercreek.map 3309D18A 265680151 262144 3f45a934ef1480fe3646d21f5d795f1f7b93aede halonet:[halo4-reach]re-beavercreek.zip +[halo4-reach]re-dangercanyon.map 98174E80 299156117 262144 fe944eaa43734b15daa8a67b4578804f2ecd939a halonet:[halo4-reach]re-dangercanyon.zip +[halo4-reach]re-prisoner.map 26DEA553 255148407 262144 a39430b94add9f89b5c02be2b634b98401a431de halomaps:6684 +[halo4-reach]re-wizard.map 41F608F4 228659656 262144 6d8818369a5b911f6f25e83c9627a14038a39431 halonet:[halo4-reach]re-wizard.zip +[hmc]zanzibar.map D2806004 54719290 262144 73facc0acca302929cdf72aef1f745141a142dcf halomaps:3329 +[hmr]covetornvv1.map 65EAF44E 266583999 262144 d60697c917080dbe2b5cba2985071c01c1f66577 halonet:[hmr]covetornvv1.zip +[hmr]landtornv1.map 1735154F 234316489 262144 b61eb9c431ca427505df615f6857a9ea51919970 halonet:[hmr]landtornv1.zip +[HNET]Social_Club.map D5B75599 60269040 262144 e3e3e5f79b85663eda95f4e1c954b91de7002f5b halonet:[HNET]Social_Club.zip +[Hr-Elite]Distorsion.map E3F000DB 297061896 262144 cc3ab4b80c3523506622f5f8882fc41da33ace42 halonet:[Hr-Elite]Distorsion.zip +[HR-Z-5]Desolate.map 4DD84945 228821627 262144 42fc692e9063a02a5cde321826ab6093cd9a8b24 halomaps:6327 +[Hr-Z-5]Peril-of-War.map CE7BCC04 256938727 262144 f5d3f983226945625771e4d6ec3dfa269ec8caa9 halomaps:6348 +[HR-Z-5]Pinnacle_Storm.map 291C0122 269612384 262144 7de57b6dea2cd22373f1099bebdef710e827645a halomaps:6328 +[HR-Z-5]Requiem-UNSC.map E776AFC9 299545534 262144 55f5fbfff82c866ab2526a0ec5a25b348133dbb4 halomaps:6329 +[HR]-Sangre.map 6B533D8E 273891250 262144 2c60a504fbd2526d783e6ff40f31e44c47cd85ba halonet:[HR]-Sangre.zip +[HR]_blood_reach.map F499A9E8 168920713 262144 45b2f8baad290a1e2501f6cbadbddd6f4f8cc7e7 halomaps:6294 +[HR]_New_Alexandria.map 2243658E 163653141 262144 5b8c48271d71bce6ce17ae1b3ec926d87176ffcf halomaps:6330 +[hr]_sali_creek.map 5C1370B1 69030988 262144 8d3b5f984e574c52722118d5cdbfee620340b696 halomaps:6076 +[HR]_Unearthed.map 6F8F0CAC 389334393 262144 dc3fa5af034ca3c2ab3d79b0ad6b3d24ca67d7aa halonet:[HR]_Unearthed.zip +[HR]_Zealot.map FD52DFD9 393379057 262144 da9f6869199dcf5a8aa2105034a826ebf9862312 halomaps:6770 +[Hr]Alldev.map DF4E2139 356739525 262144 0733072ba497a556f172ca5856d9190152fd781c halonet:[Hr]Alldev.zip +[HR]Anyversary.map 461E7C18 132566003 262144 01529bab01d09f0a63c45d070929b96ddb7dfd2b halonet:[HR]Anyversary.zip +[Hr]Dark_base.map 85CFDA31 128130350 262144 9ba8c4bc40d0ee1b413a48aa683dccefdecca33a halomaps:6769 +[hr]Dia_soleado_beta.map 67D5296C 320114693 262144 515015dd967e6fbf3a255330ca04c9e3898ab74f halonet:[hr]Dia_soleado_beta.zip +[HR]Forest_Treacherous.map C1D0B3C2 324038559 262144 52c7d4bbcba1d4e5c07d6ef90d2577bf74919b36 halomaps:6567 +[Hr]Gladeador.map FFFA0D94 322522511 262144 ce1115c01ded889b4adb0ae8692366fc39e309b7 halonet:[Hr]Gladeador.zip +[Hr]Hechicero.map 459A7AD4 348397260 262144 026987349234b403d42b4acb061c3417fc63e92d halonet:[Hr]Hechicero.zip +[Hr]Hemorrhage[HKÑ].map 3ADD3B54 279027792 262144 432ff73f2a9ce77f6a47db67ecfd71ac9c6f1d11 halomaps:6461 +[Hr]Maurix-Tribute-Smoke.map 9AC29694 328718750 262144 12f3527202eba963764a7e74ac3f4645c270969e halomaps:6568 +[Hr]Valle-Peligroso[HKÑ].map 7A25C842 293470592 262144 e6d6f82d9be56eb442534cb161e35e4ad951c5f4 halomaps:6462 +[Hr_Z-5]Herejia.map 89F05AAA 254310748 262144 b9728dfe2fea83ccecf17e520605100897b7ea3e halomaps:6349 +[HSP]The-Pit.map 4329F197 192273494 262144 4c80842ca3ed0b02b05b910439a87bb7e37dfde7 halomaps:5300 +[NMT]DEJAVU.map 31D7A70B 160461325 262144 549fd7b54be776585455c6f01b7904a5d8086bfb halonet:[NMT]DEJAVU.zip +[ODST]_vertigo.map 4E3AD3FA 181405649 262144 fda890bcc8f45ddb52c0a8a3160bbc6720b83ab1 halomaps:5334 +[ODST]Ambry_ce.map 8C773639 257793232 262144 a1c54ee099608be5ebe788707055729b08644091 halomaps:6295 +[ODST]Contaminación-H3.map 803FA65B 262552241 262144 b503677294605ce1dd4443f72c969ab1c80908db halomaps:6371 +[ODST]hangemhigh.map F7284B2B 199743691 262144 e8d6bcf437008020efc0c270d6021e55cbd5b4ba halomaps:6143 +[ODST]Terminal(Z-5).map 958FBE1F 263942482 262144 33d9c911f889ec8d86b18cadd4240d909884367e halomaps:6372 +[ODST]upliftreserve.map 310F8AE1 213502582 262144 cbf94134325b51a7c019bbc30b5ed6bbb286cde3 halomaps:6405 +[ODST_Rebels]Portent.map 653D95B2 227185136 262144 16883b90d9a57832b17e8ab59bc874bf756725bb halomaps:6296 +[OHC3]_HangEmHigh.map EF6656CE 113744704 262144 2c5c95108e338ea95d166831161e3ac99c154243 halomaps:5335 +[pmt]coagulationcmo.map 322D7037 270409108 262144 9615c6756f2293b2d7831e318294be2b43ac3616 halonet:[pmt]coagulationcmo.zip +[pmt]h4_nostalguia.map CF6874E0 394033769 524288 7034e512a79377b32f7f202d1137894b80f319d1 halonet:[pmt]h4_nostalguia.zip +[pmt]soldier_zero.map 99E36BA0 116971360 262144 6a0ad567500b90a52d4134d1032f4ef4865ed221 halomaps:7099 +[RDX-ELITE]_Warlock.map D203356E 83276552 262144 db96293fa6841b77f34697d76cea845e9ef4dfed halomaps:6581 +[RDX-ELITE]Swamp_Creek.map 153F06CD 89322674 262144 385ef86f9d470b9d932cd824f88820f4464c7e64 halomaps:6582 +[RMT]-Oni_in_attack.map 5B687E5E 318891059 262144 c9e0cc11242aa61bef452352ae99718c6d2e5239 halomaps:6757 +[RMT]_Wizard.map 56CA568E 105667202 262144 679c4261bdcc69a925b0970e7076f1492b615be4 halomaps:6580 +[RMT]Ascension.map 566EDC9C 262865445 262144 5e9a235605586e18e215e572160182f441551da2 halonet:[RMT]Ascension.zip +[rmt]axterion.map 58357E11 16713416 262144 5a5df18380958e0be236e4c9a5a227c2b75b3ad3 halomaps:6736 +[RMT]covenant.map D71B6367 220336098 262144 533aba4ffa2e8104f50d490e1f8c83308cedbc83 halonet:[RMT]covenant.zip +[RMT]extreme.map A0DC75EA 141626730 262144 545561c20a8e20903a634bb2675429156191b0ce halonet:[RMT]extreme.zip +[SDM]H3-Winter.map 3BD61619 117710431 262144 c82d996f8a58ee825c631dbd1a2acbf28118481c halomaps:6305 +[SDM]HR-NEW_BLOOD_FL.map 39092C88 125556617 262144 9ffeef60205a7e2c832358fbf088e4907773c620 halomaps:6522 +[SDM]HR-POWERHOUSE.map CF83EC54 156710507 262144 745a785eefabfd4e46161d9d6a80884703268574 halomaps:6026 +[solitario].map 7373507B 123659563 262144 ac75111dce7ade4d0496ecb695564732e3c900c9 halomaps:6479 +[StarLagoon].map E81F6581 231249969 262144 4c93bb6599c6a580e00288d7de1ace4a6c7c09da halomaps:7081 +[TMM]_HR_Nieve_De_Invierno.map F961DD21 401490112 524288 2bb723d0893a725ea7afbbb23db61af7cf3f1d66 halonet:[TMM]_HR_Nieve_De_Invierno.zip +[TMM]_HR_Pinnacle.map 065050CB 401978314 524288 34e2072c0685e92bd31bdd8b0642c25c6a84e4d3 halomaps:6712 +[tmm]_lumoria.map 38B9090A 75389927 262144 db4a60254e779e1711b531bc067f4817b8563dff halonet:[tmm]_lumoria.zip +[TMM]Box.map 8FEEDA34 324937933 262144 f46312416dc71f12c24380d2b9a4e0e88920197f halomaps:6523 +[TMM]Guardia.map 98EDAEAA 398930183 524288 2b389aff001713103c2641a6af124fd396f139a7 halomaps:6524 +[TMM]H3_CONDENADO.map C1443513 350614845 262144 301238964d566e25ee36c3a9fa39e5d6c91784e9 halomaps:6373 +[TMM]HR-_CITY_OF_WAR.map B4B12706 280650419 262144 ad7469a1bc8823398696da766b44851b33733155 halomaps:6579 +[TMM]HR-BASE_SWORD.map 7A44E6DD 349526789 262144 a49f8a0e87a14b1955d295fda837066418020b23 halomaps:6525 +[TMM]HR-Camtrack-Battle.map 15A54269 395038460 524288 b3d76ee00a6d247a91c336e542a05972f07ce642 halonet:[TMM]HR-Camtrack-Battle.zip +[TMM]HR-COAGULATION.map D5EAA74E 246382531 262144 c09f877c1652576934885642e7591ea3a64d0fb7 halomaps:6499 +[TMM]HR-Dangerous_Quarentine.map 4A82D8EC 336430382 262144 ca7017fbc4334afecc3770d0bf4dc07bb6bb6ec5 halomaps:6685 +[TMM]HR-Epic_War.map 7BDF2BD8 307971504 262144 b3a61f5de4165a9642e44acf242b54988cf43ff5 halonet:[TMM]HR-Epic_War.zip +[TMM]HR-EXODO.map AA51A6ED 297420193 262144 bf19df57111d469e40f5b893d0c2f657cf99f30b halomaps:6526 +[TMM]HR-FABRICA_ABANDONADA.map E256B6A5 316002170 262144 859c268a8502888f1a86fb579c59de9a60d6d601 halomaps:6351 +[TMM]HR-Firefight-Airlock.map ADCB1453 257343889 262144 32c99b25ed16cd3706fee3e5e69263f00b4fb246 halonet:[TMM]HR-Firefight-Airlock.zip +[TMM]HR-Firefight-Airlock_v2.map 5C37A6FB 359831062 262144 7e9ad0abbc95ac7e88bc0d40369ddb7c030ee67b halomaps:6686 +[TMM]HR-Imperial.map B33624A3 321472260 262144 8c925ffaf499ed8961c809e36a494e8c056bf97b halomaps:6527 +[TMM]HR-ORBITAL.map B4BC2194 314141484 262144 72cc26658c146583fb7a68a5cf4132bbcdc706a9 halonet:[TMM]HR-ORBITAL.zip +[TMM]HR-SMOK3_FOREVER.map FE19DB90 316202193 262144 659f5bc6e20f29638cb67a16f34ea78d38d5b8f6 halonet:[TMM]HR-SMOK3_FOREVER.zip +[TMM]HR_INVACION.map D3282680 261525008 262144 8ae211b582d5f6c87ad2554dcf01bdf81392d039 halonet:[TMM]HR_INVACION.zip +[TMM]THANKS.map F484B64E 247234051 262144 eca6c63a2168189c668e4ee082c3f1cc2edf0f6e halonet:[TMM]THANKS.zip +[tmm]vientohelado.map 48223DD0 156891535 262144 72a4115dad66a251d1f57d00633fab5640358a57 halonet:[tmm]vientohelado.zip +[UMT]H3Elite_Flood-Tombs.map 84D83F53 306985186 262144 53cdd27a8ca547264a98a1e40f57f6c01fab2c51 halonet:[UMT]H3Elite_Flood-Tombs.zip +[UMT]octagon.map A26BFAB5 238897114 262144 362257a093e278a7e8be3e4c3da5eaaf1da9c4f0 halonet:[UMT]octagon.zip +[xXx] BEST MAP FINAL.map D19E9855 569658 262144 ba98ab292f7229e7709f3b65d8b33c245ea80b3c halonet:[xXx] BEST MAP FINAL.zip +[xXx] BEST MAP.map 974A9ED6 10273379 262144 294080a81c4edd989065ec8d75402cabe0f5a93c halonet:[xXx] BEST MAP.zip +[xXx] BEST WEEABOO MAP.map B5652116 9627745 262144 6bbdd0cebb77c8d3414a0c2f28b1c14a873889a0 halonet:[xXx] BEST WEEABOO MAP.zip +[Z-5]-Arroyo_del_valle.map BB468D64 147011951 262144 474d41478f58a0ab17633cc9989816e155d18a04 halomaps:6210 +[Z-5]-Campo-Sangriento.map 8818E151 162409067 262144 c0400e083faed7bbec5390a20383e560efc5e317 halomaps:6144 +[Z-5]-ChillOut_Alpha.map E2558B47 312759912 262144 1ccd8d8cb1026abf1d96e2c3d70533877ad208f2 halomaps:6286 +[Z-5]-H3_Reclusión.map A2F3C3F8 308753383 262144 bcebc69e0b184ef2d8d6be9d6f7ba37e1db3d965 halomaps:6211 +[Z-5]_Carrera-Mortal.map D14711C5 119090241 262144 7d5cd265d310ab1653de801f2f74c35625fa56d4 halomaps:6145 +[Z-5]_Ejecucion.map 24556F17 69986374 262144 31ed174c03eca663b71a8736a41ed7075b8a6cd0 halomaps:6146 +a day in the life of killer5000.map 3CE88295 17312172 262144 0ffcfedf04f92197d2eb0bfb47aca4613791d911 halonet:a day in the life of killer5000.zip +a-small-race-track.map 12A61039 31195511 262144 2c9057bb2ed89afaa1747d45fc3efd2dffd78171 halomaps:4996 +a.map D8D79C9E 35101221 262144 346bfbb77255a77314339114caa2d82be3322745 halomaps:5275 +a.t.c.s.xl.map E7592C69 13681048 262144 482e7228070480dd7ea15918d07abab923bb1e68 halomaps:1944 +a10.map B38A6A40 380768877 262144 0f0833e04ef908db94b7bea93df0609a6388ad3c halomaps:6761 +a10a.map 047C6580 116954080 262144 aecc72e4aad28b47aabdae5f06a37b37f0496f19 halomaps:4452 +a10av2.map F9B4EE68 131064153 262144 40bf1c27f7178f3a2d9558eee4c86daae6c408a9 halomaps:4505 +a10opening.map 601F9A70 24011460 262144 7e5fed31bc5116ab38f86c6de64e215d5bf1cafe halomaps:6765 +a10STH_movie.map 96EDDF8E 124017374 262144 fea58e69149db5aa3be0a638a1f01de8c58513b5 halomaps:3454 +a30.map F85A54F2 397315371 524288 4648b3d3c805c22c343426bbb6f859271d82885d halomaps:6929 +a30_b.map 4FF01AAB 47652554 262144 fd52370423c472ea82b6923a8fed320057974754 halomaps:1765 +a30_b_elite.map 2F4FC641 47653975 262144 41debdcb9bab8cec6eb9109b2ab73de60111e195 halomaps:1008 +a30_infinity.map 5ED5F39F 153837881 262144 27c9181c966e15dee7e3d299f8eab90bdfec5f04 halonet:a30_infinity.zip +a30multi.map 30DB39A8 39192386 262144 b7e244528633740169509f9c0fbeca800e11bae3 halomaps:2575 +a30playground.map F0078391 123808751 262144 e6e469181035bbcce3e6fdeb06999d2379c9509f halomaps:4758 +A50-BK-MLT.map 00000000 92372695 262144 fd5b59f930756558ae48a4a4bbc51bba0a59999c halonet:A50-BK-MLT.zip +a50.map 917E38EE 400023586 524288 ead7cdb99cdf447843ba8dfdcda890fa13da53eb halomaps:6272 halomaps:7051 +a501.map AD850A54 202909086 262144 5f8c5a9fc23fe88085864f13df3311f7b42f3903 halonet:a501.zip +a50_modified-v1.5.map D439FC67 162501110 262144 04008ae322c46869f80407cb4bfc9341802ea999 halomaps:3668 +a50_modified.map 72DE0CD5 161259456 262144 d8ac7b414f3fe9e296ca7c066ff18f52ab567a30 halomaps:3569 +a50_mp.map 6FC48A6F 49218388 262144 e48b56d32918b668679da25e006e4245ce8c56d7 halomaps:5956 +a50_mp_bk_v1.map AF840E53 161654800 262144 303c08635f54242df63fa8a161f91a8fff1318d0 halonet:a50_mp_bk_v1.zip +a50sth_movie.map D4760DD9 122473397 262144 f80cf3a8b50c151285b706e2a17f47a0bf5ba315 halomaps:3455 +A_City_Divided.map 63FADB3E 346419572 262144 082ff67eb9d7681cf13c0df1d09ae5e056d75f14 halonet:A_City_Divided.zip +A_Salting_Action.map CC0E1184 21812016 262144 13323fda64152271020e836111d59b990b6f76a5 halomaps:3113 +abandond_city_404.map A7E68F9B 46875795 262144 f598d909e5a85064875b84c203dbe613951c957c halomaps:1440 +Abandoned Turf.map 9B18FDBB 74088308 262144 0474381c910ffc4378662960c291a93a6df5a424 halomaps:4536 +abandoned.map 094DE1E5 27855961 262144 854ce20119369536d153fc4f1b7d5a935d804123 halomaps:2282 +abandoned_airball_ai.map A4126BFE 73660495 262144 5aef3c6dbba0f4594f9c12ab7a108ddc0bcabee6 halomaps:5780 +abandoned_city.map E91DDA1C 18280816 262144 9a6bb8e3289486b63a678d2e94947de1a4852a03 halomaps:5913 +abandoned_quarry.map 0349C409 20277239 262144 9d08ede89e4cb8b357b89a08c6a1146d791a01c6 halomaps:3974 +abandoned_sinister_grave.map 2F1CB903 17146892 262144 311ea60b60904cde3f76f48f9eaeeb9a30adf42f halomaps:3890 +abandoned_tourney.map B97B5FC4 29154289 262144 314f95a74952e782c563a2b3ea683144a827e975 halomaps:2554 +AbandonedTerritory.map 7EF43ABF 41596835 262144 bad3b471e998983dab4c91234998cb8731464c55 halomaps:4111 +Abandonment-BK.map 00000000 182853762 262144 2366a97ac7c272581cc8a289c7447ffa5e3dcf9b halonet:Abandonment-BK.zip +Abandonment.map 54E5D099 19670792 262144 46a23698587b2d4188cbd24ff9170ae9d654bd74 halomaps:4759 +aboveandbelow.map 8069B12F 25494706 262144 03c8002b9e0f578b1cebad936bdbe55d7f57eff6 halomaps:682 +abridgetofar.map E9AEA759 31376922 262144 77ea0d517fa85421f6a722193d8c404fe7ebd867 halomaps:1327 +Absolute_Zero.map 65C178D5 23738693 262144 230de9319aeae609188944209ce2cbc7dfaa26d0 halomaps:4186 +aburrido.map BE776E51 220433608 262144 8e9965f3fff2c950535601885d5d17241d80d270 halomaps:6137 +abyss.map EC9036A0 37938259 262144 e7e93ac2cdcbe4e2bfc1a7b527bb282d67d88bc4 halomaps:556 +abyss_beta_1.map 2C524FCD 38959809 262144 bed73032802e88e6626a79de61675f944efd0e1c halomaps:485 +Abyss_Redemption.map FC0D2422 89902934 262144 f83d553e9ef4af0b34a0e1ac5638144d8cfe7469 halomaps:4705 +acoball.map 34540954 15184121 262144 2a810aa318d5cd8b907312c822a189900332f807 halomaps:4963 +acoballarena.map 28C2C120 22277699 262144 f23b2ce4f0f9d07d3e884d2d1d6897875ad6e526 halomaps:5366 +acrophobia.map 718551FE 63961898 262144 15b9c9f27056d9143b68206a19a42857320022cb halomaps:1878 +act3.map 4005530E 83740039 262144 55086d2894accc9df2ceea004b4ba611421464b7 halomaps:5121 +acydmap.map E886E958 12836392 262144 44d57f4bf84a7061181f3f5a29c9a092d9b0fa0d halomaps:597 +adoddw_underworld.map 127F5727 31886492 262144 f919ef4ae02b8832d12c0b674303dad41aaf9584 halomaps:7100 +adolifatobia.map A16D5C84 46851063 262144 680dfae3847dd6eebce304edab1a074ab9006e82 halomaps:3375 +Adrift.map 8BA1A93E 308490853 262144 8e8147cb415c85468f64f8d0f65342bd11266174 halonet:Adrift.zip +advanced_bloodgulch.map 7B309554 13936092 262144 7b417196b91c04c07ba1ff65fc10586a1501b874 halomaps:6364 +Advantage_Point_West.map ECFBB3CE 17065768 262144 1f6fe2d57751a9b720b694b092debe1c405e73ba halomaps:201 +adventure.map C2778451 82701615 262144 5e4f10fd5975f441c84dd968a2992650d32d7cc4 halomaps:5286 +ae_mp_egypt_V1.map 14461E0B 43682534 262144 be119b62f0e26c68eae987255fe00b628a5cf897 halomaps:5243 +aerial-assault.map 63267B9B 27814731 262144 7d84ff679dc730401e4d4d33d47ef2b22a89e73d halomaps:4272 +aero.map 0AD81D15 19423956 262144 99e77427302aa319791d59da014bbcdfa21d719d halomaps:3099 +aerorace.map 80DC8278 29622215 262144 e6a139906eb6ac29c831b8e73926ba925fc72d18 halomaps:4977 +aerorace2.map 89FCE0EB 28754936 262144 484586a19e0e085c3e21576390c6befecbc1a1c3 halomaps:5317 +Aerorace2_Fixed.map 92E6B8F4 28755048 262144 ff333a25aa9182e7e8861454b8b2e27aba768fdc halomaps:5367 +aftermath.map 21791840 24741788 262144 767b83a71f6224416a23a20da3570874d427b140 halomaps:1065 +aftermathbeta.map 3FEF6CB6 18056897 262144 1607a1ee466a957684617d12c2a6845d00fd6afd halomaps:993 +agamemnon.map 1AF5A8FE 16115310 262144 e1317d3d9658f8221fc639ee5954e6e75a74b640 halomaps:3376 +AGN-Tornia.map C1366A04 68888002 262144 e65f421d48d17e5018c6bf79f7f27599a7f1cf7d halomaps:4793 +AI-Tum[H3].map 47B66AE5 118238299 262144 ff9d99c6a1c0ff491c6a70606ca47223360773e5 halomaps:6618 +ai.map 5B3289EB 14484032 262144 7d581a565aa7b3fdeff682c1125268eed9ac7f38 halomaps:202 +ai_battlecreek.map 5E5C20B2 55905581 262144 70a65585bf604aee3f48d9f503a36fffee3e7271 halomaps:4005 +ai_beavercreek.map 08078E79 58785067 262144 6247929b9424eec3cd176214ae137f3b160f39a7 halomaps:4523 +AI_beavercreek_Flood_FtD.map 4A688BC1 71999210 262144 49743476cf05baea94fa0a67596160e7181f6d21 halomaps:4646 +AI_beavercreek_Flood_FtDV2.map 4AA2C33D 79871626 262144 94a9c9be93e16c930de74c7a13e8b94c0a5aa541 halomaps:4647 +AI_CREEK.map B030113C 33329914 262144 e830a52f6432ce31c04c673fd10a46f6202d249d halomaps:2166 +ai_map_final.map 6403EACD 23879288 262144 33d103f0bba9385dd73f81419ea620c2b7180379 halomaps:3390 +ai_mombassa.map EDCBDE8B 50726291 262144 1b0e34ae997f4a53bf030639c0e716e5a88bb56e halomaps:3837 +ai_new_snow.map F0D65048 71847971 262144 3c355ed1e29afcfa43d980860a87b818a97c2745 halomaps:2988 +ai_ratrace.map 99681BF5 44445610 262144 a8f2d5c01a3965e493cd2202c1329348c25f6004 halomaps:5636 +ai_sync.map C594B884 22518656 262144 32ef5ff30407f4f42d7796833087c76389f30e49 halomaps:5989 +ai_takeover.map 937FA7E6 89887969 262144 c0845c532ebb7e8d47a479a14fecdfcb892d038c halomaps:4425 +ai_takeover_2.map CAA398E8 101589177 262144 6ab48654ea7b33bcf7afe0b26ce5572e737a0ce1 halomaps:4453 +ai_test1.map 99BC7D54 29790963 262144 9b3aee02524fc4640420403e0057df2f4789ecac halonet:ai_test1.zip +ai_test2.map 1A4A2D8A 29981888 262144 f8631875e693d03c597ffae6f82561d0769c95d2 halonet:ai_test2.zip +AI_Timberland_FtD.map C2DE2F54 15631816 262144 e6ec54eefed9422928261f80443e110733dbecb9 halomaps:4648 +aibattle.map 44402629 73087589 262144 b98026fe41fd3ac07c18e7f329e47310bb5f7c94 halomaps:3871 +aibeavercreek.map 4844B836 13822552 262144 a24dd6a4048d665391343699781d649830e5b2ca halomaps:1897 +aibombfieldbeta.map 09845A3C 24108496 262144 ac8640b41335209b3ed8d651e2a5a7e794ad7bed halomaps:1581 +aicreek beta1.map B0335D2F 13104208 262144 b3d471d026dc4c68b0e3ea66970f40276ccb0a30 halomaps:1978 +aicreek.map 165636B0 58988419 262144 b75ec7cca2b3c4aa64077cd6094b3e23c5d473bb halomaps:2813 +aigulch.map 791AB2F7 13305344 262144 414f0f0b9202863dee5ae3fd8895dbd9a5e2a12b halomaps:1038 +Aigulchv1.map 12FE21A2 112447114 262144 4a535a5df5c6fd2ec9976d185c1dee2862a7388a halomaps:3042 +AigulchV2.map 35664350 75600434 262144 99117dc56fdaa17f48ee38a4fe4cd2ca82ef41b7 halomaps:3078 +ailevel.map B2DF7009 15954122 262144 df7e8e57d3a427785dabcf5498676111537b9761 halomaps:3643 +aimania.map 26C3C8BE 46427527 262144 3b30980ef89f7dcff6c9b7d05627ce34a073d788 halomaps:3136 +Air_Battle_Canyon.map 96D603F4 69196684 262144 e9a299170d3b710ce74fec53faf783be2db4d23d halomaps:4303 +air_combats.map FF9947F8 58478452 262144 05e3270048337914e9d7a11f271b312653f78216 halomaps:3377 +airball.map 6203C1A4 20581713 262144 78e8253ead371f047ac68551aac78cce3230577b halomaps:3112 +airball_mod.map 54C226F1 27616581 262144 8c09a42c490d10cf01d00997b4112a989efd37ee halomaps:3137 +airbase_09.map 7E939D54 31485082 262144 0d9500538e30495854be264ab78ea978b403e257 halonet:airbase_09.zip +airborne_aco.map B0A4344E 29829629 262144 cf0842a4f364b4ef4780c8104a50f31411b0e913 halomaps:4997 +airfightbeta.map F3D13354 31617726 262144 1652321b1d02fbbfe6d30004557558cfe4d7c4d1 halomaps:3975 +Airfights-up-up.map D054EC1B 323289483 262144 7f5e699130d68bf1a23377cb87a52a202b5fe227 halonet:Airfights-up-up.zip +airlock.map 03ED11D5 17918528 262144 7ff089371f36426bcddffa28665a271d58fd0333 halomaps:5068 +airservatory-uplifted.map BD07DF7A 47545239 262144 a818258f25534b998580dafb2e6e75392876af69 halomaps:4461 +airstrike.map D933BFFF 26404412 262144 3b6b987ed9ea0e115432d4e3486d8bfb9e6f7ab4 halomaps:2979 +airstrike2.map 71F10690 31410330 262144 8463ea301db86eee6cc4b6330989753d030bfdbf halomaps:3138 +airwar.map 6371A9C8 47930210 262144 002addad4e4353bad64c3c56e81ce13604c82597 halomaps:6554 +airwars.map 02496AA7 45826185 262144 ea6a218e190ca13c250f895196a4b5f1983260bf halomaps:4357 +AIsnipers.map B1A26F53 44250862 262144 37a8b3253cf3d5dc159865cfe19309a9324f1e71 halomaps:4225 +aitcr.map 1DE030DA 97118656 262144 ccbffd7868271ad7be89151c09bff3e71b040ba4 halomaps:3490 +AiWarGulchBETA.map 2B627B03 70539466 262144 16e5cf7c424c395ac4fbfd7718c0805e023459dc halomaps:4051 +AiWarOfGulchBETA.map B8650413 70756870 262144 bc51d8f764af0989d3fb7f308e27b05f03f1c665 halomaps:4069 +aiweagulch.map AD400F0B 85644553 262144 823149d265d8269b75c656571fe979d983068dae halomaps:5556 +alasis.map D769D6B5 26951222 262144 162ee3a9c74308027e9bfddd34c83ede3ad63938 halomaps:3378 +Alaska.map 43AD8061 400872512 524288 3461cb07dfc4d8ca5afc696891a13cd215e0bd48 halonet:Alaska.zip +alberca.map 49F18A18 111611596 262144 f20fbf65feb28c057fa6a4a2ce683dd794bfa4d4 halonet:alberca.zip +alberca_v2.map D019DC40 147533785 262144 2df2820626e1a19da3ee0be87667d5f8b020a217 halonet:alberca_v2.zip +Alektorophobia.map 3537274D 17276752 262144 93f0941d1139dcbd0da9e4f4035a0686c7bd53d9 halomaps:1945 +alerion.map 6AA848F5 26616979 262144 35a2d79c706e499bef4534bb9a4cd9ff85e97db5 halomaps:6450 +alexey.map E74090E1 48958336 262144 33c24feb7d7008bc7ac0ab072ffb8ee4ce9fc7e2 halomaps:6308 +Alice-Gulch.map 5EA3D576 95598098 262144 92f61f74287efb113e5481442e21952d4217b213 halonet:Alice-Gulch.zip +alivah-pb1.0.map 5C0322E8 131923523 262144 dcd45926756a8de3c2221ce598e605ce69107a7c halonet:alivah-pb1.0.zip +alivah.map B0D3E958 119601716 262144 daf1204c792fc57c3ea6a7225268a58c7f3ef752 halomaps:6953 +all_out.map 2C2291A6 16329416 262144 cd837ec80f5eba59b49db6abf258a012452cf6d8 halomaps:3744 +alliance.map 45C5A924 79334219 262144 2eb89b4035fc47d5f516408f0b138242dbdf48a6 halomaps:3079 +alone.map 9CC355EB 24887356 262144 1493aa9c83c9ca6f68849f50d92fd1e8bba9dfcf halomaps:6992 +aloneisland.map 63766CA2 45209815 262144 03a5f255f6b91f4dacb80bbdda122ce085ed1e7f halomaps:1844 +alonewinder.map 0B3EF33E 36684948 262144 ce208b7e2041ee7b930d8bd99a7637a970b757ef halomaps:1822 +alpha halo b.map 7491DFDE 110066752 262144 1a3913132624514ab706c7a0c662a45cc8b2164b halomaps:6533 +alpha.map 8B79C1D9 15072148 262144 1594cd14c26e1aceeec3a8f4896d8e44690978d8 halomaps:3456 +alpha_bridge.map 2611014E 32835556 262144 24c65964ded6a9a47ad6ac1d7b5cfe07ff35b158 halomaps:5142 +alpha_m00kweapons.map 8DD77C5E 30117229 262144 e9a326a002febc1e526dc50e2b50ade7978da9a4 halomaps:3544 +alpha_oot.map A6EC64DE 31774206 262144 bd326381e467f9439b30e5b242a840bbf92fdbe9 halomaps:6228 +alpha_oot_race.map DF5CEEAA 32007954 262144 c8772dcdc50970acfee131596fba720a8520960c halonet:alpha_oot_race.zip +alphat1_compound.map 11D035FB 42647964 262144 6c34e0f94049c0f92a3aeaaa7ebb833bd20d5f1b halomaps:5673 +alpine.map 7ADF1DB3 62644912 262144 b3ea298bd6811199334e1e521054a238a1b97a21 halonet:alpine.zip +alt-b30_time_splitters_2.map 0B14E71C 113853131 262144 f2736394c1498cb93ba0bcbbd99de75c9ff2bcbb halomaps:5958 +Alta_Baja.map 9A33F242 116924065 262144 cfa4e770e78e3186efa48afd9b936022cb155888 halonet:Alta_Baja.zip +alter1.map 9C0CC1BD 50314575 262144 ecd07471959383c0a3e39ca19f43e848a4db09f6 halomaps:4834 +alter2.map 8104089E 95358740 262144 022fc4efae3e47642380423f788e5bbd4f120d85 halomaps:5037 +AM_house2.map 1000F69F 96656745 262144 6ce53ea197e3f649674beff94ed5c742c705af57 halomaps:3783 +amaranth.map 7AA7EAE8 17988589 262144 9b9e65bfb10486d81a55be8272651bfbe6c3258e halomaps:1021 +Ambry_CE.map C34F1DEE 95333756 262144 7a52f20c46d6d2354085721190f6e256d3b3b720 halomaps:5414 +ambry_ceclan.map 42298BBD 118771566 262144 28a970801761e900c2fa6dc74282983c820ace1e halomaps:5449 +Ambush-4.map 00000000 378530027 262144 4e37c074ad9ffa87904bd9372573c5e0daa0726d halonet:Ambush-4.zip +Ambush-Live.map 00000000 270562173 262144 b0f75f54bf0534e1ace4410b49f599098bac1666 halonet:Ambush-Live.zip +Ambush.map 2E11EF43 123073752 262144 7dc78e6c1fea4d51780c5c787c482166898f8e61 halomaps:3426 +ambush_2.map A8E53735 80690662 262144 a14853e446f5f1f9f84dfa1aa84c0326be0e5fc5 halomaps:5213 +ambush_3.....map 00000000 356612947 262144 52aabba1e94ea77254aa8271835844c65d11b73a halonet:ambush_3.....zip +ambush_3.map 00000000 356612947 262144 22b5dd7045d08bf720a8796157f0e9472166750f halonet:ambush_3.zip +Ambush_No_Way.map 1F9610BC 291885556 262144 fa1ffcae243f34e29d1dabc28a85ab174fa4c427 halonet:Ambush_No_Way.zip +Ambush_Your_Way.map 9652D33B 297054760 262144 e94b3fbaae02c8b940015a8637bc8aff3884f6f9 halonet:Ambush_Your_Way.zip +americans_vs_deutsche.map B275FB74 38449702 262144 f0b131b2abe47550e074e3767199c7fb8658e5dc halonet:americans_vs_deutsche.zip +amplitude.map 276C10B0 14097832 262144 02fca484232ebf8678a1fda04218b143ea1d5f5a halomaps:1823 +amysroom_beta.map 2A8F93F1 13031712 262144 fc4af21842768e3d7f5d89e06dba37fd20f0beda halomaps:1802 +ancient-carousel.map 4E41534C 18600704 262144 a1e66f2fe8e2708733aa9563a3158aafb3c85ee9 halomaps:5701 +ancient.map 8F3F2A35 18654068 262144 c17460cd1eeec9f4500b988696f30eabe5a15fe1 halomaps:1433 +ancient_evils_test_map.map 640FAC4F 47792344 262144 fc6ab721404c96a317947d788b212a1ddaea2688 halomaps:4794 +ancient_forces.map 46C22036 80982456 262144 fab8a8b03b0742a17afbc592b3fe6118a3b95b0f halomaps:6121 +ancient_forest.map 220BAFE1 28153916 262144 4d3e7ce223144a33780cc03c8bd97d6a31847330 halomaps:4240 +ancient_sanctuary_beta.map 49EC1489 25090576 262144 19ce37617561456767aa64b80ae1392c44663c4e halomaps:3934 +ancientcanyon.map 0932AD40 14377144 262144 79ed8c3f30988574fdd4146cc8671cf3d0cabc3b halomaps:5214 +And_You_Thought_War_Was_Easy.map 5D03C8F2 109126958 262144 6570c3b76b19fef65a07732c8380f616d7d2451d halomaps:5627 +And_You_Thought_War_Was_Easyv2.map 7C346CD6 126390931 262144 7d9f3c29b76415121c3276b9b911870c601f9889 halomaps:5702 +angel_island_pre_alpha.map D9916310 69729288 262144 72e64f4a0de28acf4af19cf73e6d75b82128d2a2 halomaps:4549 +anger_ai.map 9CB88DBB 86955385 262144 7c6b1d2e201f540135d5273284ae0f41660caf35 halomaps:5038 +anguish.map 0926473E 18876096 262144 fccca46355b0f1c29c7c8cd5ee3b4b01af495b01 halomaps:2335 +Angular.map 67C61E6C 22822773 262144 e446dcd1f6faaf96bbbdd39949eb5e128effd4b9 halomaps:4187 +anomaly.map 4AD258E5 13907336 262144 362e4fa94c285611e8399b3fa535aae8d7ab00a3 halomaps:4088 +Another_World.map 37B23A95 48928777 262144 d816e411aa3aa3256017394dcc74faac90e5304a halonet:Another_World.zip +Ant Man.map BF134338 179255333 262144 8ca74c413a1f9c7620789d6a78815ac7a64e2814 halonet:Ant Man.zip +antfarm.map 661CD346 166326601 262144 0f9e477bf7a1c03d785dbce6c40b27d23f9a3982 halonet:antfarm.zip +antfarm_sfw.map C1B49FE2 160277746 262144 41498639d237d13683ea3ad2fdf61412adc06446 halonet:antfarm_sfw.zip +Antimatter-Gulch.map 6A3D6420 288539848 262144 fa70072f9f5c0ef7ca6aa3a7fe0149a9116456ba halonet:Antimatter-Gulch.zip +anxiety.map 299106D2 22498520 262144 dc67c26becab705a12c5571096d520a5ccab12bd halomaps:1276 +AoTCR.map 9BA16CCF 119551586 262144 1819d761772ffd1272be96c0038bc269490f8e5e halomaps:4912 +aperture.map 1EFFA725 225321866 262144 d2d16544ddfdfb6237105451929b4b50dbf702cc halomaps:6993 +Apex-Base-War.map 53054B2E 102608718 262144 898c26fd8cd177c99045e6213f88d3cb5fcdc3d9 halomaps:6586 +apocalypsehugeassV2.map CBE0CDE2 52701680 262144 5afb0ddc67ccff95277edabae7854c04afc48beb halomaps:1582 +apocalypsehugeassV3.map 35BB3EE2 67705060 262144 be6718bbf93583da9a6f19e57d458f440c88cded halomaps:2419 +apocolypsehugeass.map 92373689 56291512 262144 d098ebdd7844f1b417bece28dd17d6896abf1445 halomaps:1548 +apparition.map D1232303 76012310 262144 1575dfe256f69ae6f939b4c625c5df2ca0e5864c halomaps:3624 +AQ-18253.map 8FA14789 41462318 262144 c0b15c511ffbf6dab96f13ac00093e0608cf337d halomaps:4337 +aquarii_ce.map 06D3FED9 61176884 262144 dffdb0893989fdc456c3222e233bccd7c0bc82f2 halomaps:5110 +aquarii_final.map BCF1D6BE 56943681 262144 70931317a6f9f5b3fcf9e51234708c4a0b201459 halomaps:6775 +aquatek.map 8ED376D6 15352100 262144 c684a7e1224e4d58134a1a6bcdabd97a53418a65 halomaps:3283 +arachnoid_alpha-0-ai.map 04A2AF46 84653820 262144 2cc8047656111bdb810dab2f7d6150c67044577a halomaps:6994 +arachnoid_alpha-0.map 5C7D7AAE 72758721 262144 3ceab005fef752456d46ad43ed094d829988951b halomaps:6995 +Arbiter(vs)Masterchief.map FFFA6F4C 111084690 262144 9e8232b2dbcfc34ef5c3053732de296f48fb414d halonet:Arbiter(vs)Masterchief.zip +arctic_battleground.map 0E469CDB 20459812 262144 e4ad809b2fc0b53b4f2fe4c9365bd72472b0cd08 halomaps:1318 +arctic_canyon.map 22F56BF3 17870744 262144 6e3d9e0704ca38a4f3e71001dab7759047f416bc halomaps:708 +arctic_wasteland.map 4483440C 50689881 262144 44acad9220f3b693b5a0490ae4a3effe5365bdc6 halomaps:1673 +arctic_wasteland_V2.map B05D6BAC 52241081 262144 851d399b6604514df39a364eae22aa9a472cc09a halomaps:1695 +area49.map 1D5DE208 75931973 262144 cbddace2ce98c3d0c4fc4ba2682bf90813204fa9 halomaps:3838 +area50.map C8057EBD 24474322 262144 18d9556b189c969d9183d91b2c81efe87bac0468 halomaps:3839 +area50_revamped.map 20D515D9 26280438 262144 c97195c89fc3e5233a2dc274b327a9c9f9e586d9 halomaps:3907 +area51.map 217AD954 133713233 262144 95f285ca85b1d58aa1660a8cff12c6a808b10120 halomaps:3872 +area51_alpha.map B51C2261 25183208 262144 d5a469e6f4cc460e0beb105599962411f98598ee halomaps:868 +area52.map 154FF79B 38582391 262144 97c3ed268bd367ecba7684b9293d25fb22c0993c halomaps:923 +area53.map DA83A7E5 46329042 262144 825336074da12d4fd5e53e18d87d0cf19ce4f708 halomaps:939 +area53_rescarified.map 51FB92F2 98471187 262144 160eec70119b1fe29e745bb01f609f6f77cb27e6 halomaps:3840 +area53_rescarified_V2.map 6E45921B 99145127 262144 6ecc2234624601e30663008fe14d82596c66757b halomaps:3841 +area53_Revamped.map 54EFAA36 106801334 262144 c7b1e4429fdb1d1196e8ce84ddeb8405fd24929d halomaps:2814 +area54.map F21EF75D 74640329 262144 87b134e84c64d23febf525e340531a213adbd8ab halomaps:1028 +area54_v2.map 82559694 71216957 262144 98e8e69b3cd5ae6ac22105e35e342a8b80019640 halonet:area54_v2.zip +area54revamped.map 17D1F223 107127076 262144 8c389dc9fb14e6a697284107ada5088099f3bf7f halomaps:4273 +area54revamped_v2.map CC952B5C 102033752 262144 83069105cfe2a8468e9b5d7d29fb1c73c64a02ef halonet:area54revamped_v2.zip +area55.map 80237CEB 46117456 262144 9ba7f5a5acd980e9aeeedaf0f921809d160509ac halomaps:1075 +area55_revamped.map C93FB363 54225250 262144 e3bae2b61a03e9b07ab958bd6510a60d8b77eb95 halomaps:3908 +area_b.map BE24059B 27030725 262144 07b72a9076aefaa68bf4e659fe43d4e3e9fca7c2 halomaps:6776 +area_maze.map D1F87A61 44251650 262144 c2c7d0813d1968aa6fdc60909d468c2bc157fce7 halomaps:2206 +Arena-Brawl.map D0B22EFB 58223778 262144 ad8437aae3f3e3e11c6c1a64155d2ccb47d4f465 halomaps:4188 +arena.map 097C7B9B 23601444 262144 cae68e5ca1113288f7fefb491ff902639e308a1c halomaps:1304 +arena_small.map FCF04E82 12325304 262144 6fd86b4dd03612546cdd4ec6e7860c0198f50a14 halomaps:2151 +arial-combat.map 8C341161 119429715 262144 f15d8a512328db5ad51733adecf2510efd659821 halomaps:5768 +aribgulch.map 89C1193E 13924304 262144 1ca0ec686c04d6a3cc5369ddbe1ac8eece6cdb36 halomaps:4284 +arid_crusade.map 0536021B 130355031 262144 e273490419a1f8b8a7a6a73d24cfe8f9537e3f16 halomaps:6365 +arida_map.map D217F0A4 86277997 262144 aabb4adface2f4b223d5cdf827a15076d5514818 halomaps:3559 +Armageddon.map BBF92E72 34211920 262144 638560e2a10ae9ae7c9258fe62c331d39c95bbf6 halomaps:4006 +armas.map 2CA79EF5 101182584 262144 89928f7fb3b928cf16d1000d11e9868517b74508 halomaps:6014 +armaspinki.map 46A7CE8C 19140657 262144 44c4f7265a6070e940295fccd470d116027ed3f6 halomaps:6749 +armor_lock.map 6619E4A1 112281018 262144 55332b1f90c749cee2fa6e95a9702d6552235455 halomaps:5888 +armor_lock_mp.map 36742169 17046056 262144 64bb6b9e578e56f92627568c5540116b8e3ea54e halomaps:5887 +array.map EC6E94C5 14092528 262144 acc11057bbf243540cbcac814e71538184bd9d52 halomaps:4089 +arrival.map F4BFAF51 40360828 262144 8dc33d968060cc19a56e74f19d9bb64de8870e38 halonet:arrival.zip +arrival_fixed.map A8EE4268 40348768 262144 94bfdcb30ca7c1d55cbe7139a1e437e7ee80d88b halonet:arrival_fixed.zip +arrow.map 357A8AD6 16721604 262144 a4e39cbb21dc9b161f9134b71d95ddf444222a56 halomaps:2329 +artificial_safari.map FBA2D54F 34341051 262144 46cbbc1417f2aed36022dbec4a4659fdba736d89 halomaps:4052 +artillery_zone.map E762ABCC 34851382 262144 0b3d3a3d530b6580498f4dd012137a57825184a9 halomaps:3391 +ascend.map 27AC7998 20983268 262144 dc5a890a882fe035b565bd2a592f3aa3eea2d039 halonet:ascend.zip +ascenion.map 5E1ED181 17490869 262144 3fa34d80005f612dcc25adcc5c3a96a8f0ce3ae1 halomaps:1314 +Ascension-BK.map 00000000 180133224 262144 3552ecac78527b0fa2e873fa7204b1136aa857f3 halonet:Ascension-BK.zip +ascension-hce.map 6A1220B6 33296995 262144 a98cf5da6c2c3a0c7949f3dbfd7eac0ef8a84102 halomaps:3368 +Ascension.map FA0D6A25 17423473 262144 94c951b41b94714fac5816c0f62db09acea895ae halomaps:1280 +ascension_classic.map 65D3F32D 26010424 262144 d80f549ede3f0a9408c66bd28e592e15b9bce594 halomaps:4851 +ascension_firefight_beta.map 91A825A6 78427525 262144 0ac8679f6f9092975092de36083f59effe495e96 halomaps:4796 +Ascension_Revamped.map E9878FF9 113078620 262144 e4303824e5d62f42d2cda1883caca8bd951c7456 halonet:Ascension_Revamped.zip +ascetic.map FAFC15F2 154551320 262144 61f5b026b6181277518aa7c6c207a8463081bc67 halonet:ascetic.zip +Asencion jakex.map B6334E7E 196941634 262144 c2395440afe747917872258964c6493a0f8be945 halomaps:7112 +asencion_8.map 8B839F9F 272053839 262144 70ab0309f9cecb38c471f890973c2132f38edfc0 halonet:asencion_8.zip +asencion_forge_world!!.map 1880EEC9 264720868 262144 aeb030f1f8a2b05ad47baca6b165905f0597a8b3 halonet:asencion_forge_world!!.zip +asencion_world_20.map D3A0A729 304474076 262144 5f6dabae1e1c064ea9e506edad8ec003898fbeb0 halonet:asencion_world_20.zip +asgard.map ECF24657 70728629 262144 6adc5bf3893e6a5b6cf46b73379da4ba554872e3 halomaps:3235 +asis.map ADFA229A 36782358 262144 489e880a74c9055d7a60eaf0c7fc2e813dce881a halomaps:3286 +asismod.map B2DC0260 52062017 262144 e621db35ebae7e702ef477343cb72a94794c2393 halomaps:2675 +ASP_Delta_Ruins.map 3A9DF031 71290520 262144 7e48f88d286af8098273a43f596c2f2429f3f83f halomaps:4706 +asrai.map 8FC1B0C6 21597004 262144 64ca5044e1c28a4b4ff50167b6e1853a5a3ab1da halomaps:3379 +Assasination_Covenant.map 73C5E21A 62831886 262144 e6d179bcafcc514bb57a1bec4517131f5deda5d3 halomaps:5085 +assault_control.map 1EE679D9 107398309 262144 a0b1e8e420079e92d3918a5de61e0ca1f305d192 halonet:assault_control.zip +Assault_on_Damnation.map 1F59A4C5 67807187 262144 60d12a1534f18db10f4bf463c3c2376e117a84a2 halomaps:3043 +Assault_on_Gephy.map D4DB17CD 34868308 262144 4d41249f75192c8baba21e86c0b57a58fe092893 halomaps:2848 +Assault_on_Hangemhigh.map 2E63C2B0 24675819 262144 82abe96c29bacbe0176c6cfa566befdc1ae7c15f halomaps:3215 +Assault_on_Longest.map 1CAB6F0C 50810358 262144 a8cd633a9f7605ca7fc8d1cd1ce3207c5edeeaed halomaps:3174 +assault_on_prisoner.map A48A8859 58152145 262144 3e03b922fd6ae530c2236caa2a907cd9ba5d6a4b halomaps:3249 +assault_on_the_aa_gun.map 798D94B2 328386516 262144 08ae4194eaad5cd64b1ae8a5697d447165384caf halomaps:6996 +Assault_On_The_Covenant.map E663A554 82068119 262144 ddb790b5f2ab8c5e04a43c1a1ec56eaa42dda041 halomaps:4852 +assault_on_wizard.map D63512B0 61579854 262144 ed66b1c0cdaa249e1bba320307f7525599d0a3ae halomaps:3191 +assault_the_aa_gunv2.map 0DA00030 381326673 262144 7da741f77d36eb0c376dacfccd203c50379ae1b9 halomaps:7043 +assault_valley.map AC34EC17 20334552 262144 d81deadfbc24abbaa02a5e8bc397e68f797cd9a8 halomaps:413 +Assaut-room_mp.map F1C12D3C 54783460 262144 ebc3e4695cfec610a711b7fa92a75c9602c3afa5 halomaps:5459 +asterisk.map 23E10122 24989491 262144 631207609b0ef84b904afcd0381fccf57e025f0c halomaps:3784 +asteroid.map B5FADF37 14997368 262144 2b7610d4469af3b5b9cbe09e7f4097f2bef6eaf3 halomaps:379 +astronomical.map 7CF95F78 38376283 262144 0956c7cec34ef9f2a1066b85ef70247996efcbdd halomaps:2317 +asylum.map ED5C062F 268805154 262144 9727891d50bce479b54a460775d576faf526e62e halomaps:6708 +asylum_v2.map ED5C062F 268880455 262144 7769581ebfb254d4ae01131a3bfa785735c5ed51 halomaps:7029 +asylum_v3.map 2B5E9281 396116835 524288 3acc04e5c6671f68a143c560f26c42feecee1742 halonet:asylum_v3.zip +atack_in_uncs_base.map A9207745 116207142 262144 0dcf2ef64df64ef26b2f7a454d702590d10efb89 halomaps:5539 +atack_in_uncs_base_noai.map BD4D7385 48192004 262144 318aeedd950dc1b3213d022753b0fa5550910aca halonet:atack_in_uncs_base_noai.zip +atalanta.map F972444B 17971240 262144 879ac773218767da459552086658776927892233 halomaps:203 +AtaleOfSwordsbeta.map E15389EA 15346777 262144 4c61e2b29ef39ffe2b22b2610307662a578ff10a halomaps:2034 +atephobia.map 34D594D1 21621856 262144 65b55a550f623efe0da4a0b51ccf46dae7b0192c halomaps:978 +atephobia__V2.map AEFD482E 22668164 262144 b249fe0366412376ecf3a51a2a4e72205be56234 halomaps:2555 +atephobic.map C582984A 27583121 262144 ef84991b2b3fd924d01681b5fe8fcad18725be59 halomaps:4853 +atest2.map 9AE70F6D 131350692 262144 58161f625715dc48198fcbc8f97ad6fe6f5001f6 halonet:atest2.zip +atestb.map 0FE825DD 73880354 262144 846ac271e2ecdcc81f25ac1120f453f89f4750ea halomaps:6088 +atomic.map 683399B0 23344947 262144 8ef30cb6219dfee78714ee9885a2f6bbfab92c7d halomaps:4911 +Atraves_de_las_bestias.map 6C70ADFB 25061289 262144 723ebc5d42639f9bf52dee3c7579e57076c62115 halonet:Atraves_de_las_bestias.zip +atrium.map B198D647 13193464 262144 88f56cfbba93ee8bba16ad9edf94a0ea46d68d45 halomaps:2420 +attack.map FE14A2E8 132827583 262144 3f44a8a85448c30d060dd5d0379f2d1122ad62fa halomaps:3745 +attack_of_the_rockmonsters.map A7CC9256 26276947 262144 dba84b68ff9946f8e4f9c37fb2496a6515c34768 halomaps:4524 +Attack_on_Covenant_Base.map 1BC65B88 147332187 262144 ec72441ec57a912391608ff3929545aacf8584f3 halomaps:3999 +attack_on_covenant_base2.map 7BC50474 98962917 262144 f39351bb0bed2fddf478a223eeb11fe9b2076d9b halomaps:4000 +Attack_on_Danger_Canyon.map EB046226 92945927 262144 121953b724f859832d33da2ce96aa18aafab85c3 halomaps:5623 +attack_on_halo.map 67D4BA94 33098118 262144 b27a2ff7b63411c34520353b6991155c03e55886 halomaps:4189 +attack_on_reviewers.map 367B7D2F 86252351 262144 f3371c7d38f184d0094e6d1894b2630943398dbe halomaps:6780 +atv_offroad_fury-track.map 74A316BC 58089398 262144 ab77ecfb073cb8c30f30945c178c9a79d485487c halomaps:1922 +atvstadium.map 583A6ACC 18533583 262144 947db3ee3b32804eede03fc944429afb42e48111 halomaps:3709 +augerer_ai_war.map EDDECA5B 65527461 262144 bb13fb4472b52a0f7b510e7e6f580b82e15db465 halomaps:3625 +augery.map 56014495 75925758 262144 a9d661859a35c6d7c8d677d48a57cd354fef6f28 halomaps:2384 +augurer.map 894926E2 18248264 262144 54f41673c5e1be4716a5485d28bc1c9d184f77d1 halomaps:3575 +augurer_v2.map 23B73842 16185824 262144 4e2ee37f48842580cdc56bce06026d0200813b0c halonet:augurer_v2.zip +augury.map C19444D8 18539453 262144 bf5e9e1d6c0bd2e3c557a1cbcd26b8783c0b6533 halomaps:1052 +autumn down beta.map 4CA0FD58 130919205 262144 d0074630832602174f8e4b1337f929ea90728288 halonet:autumn down beta.zip +Autumn Down.map 523CB699 133527197 262144 574f389db2bf7f4f0a5adfc081cc2dc3410d6226 halomaps:6819 +autumn.map C20016C1 132881975 262144 7fc88354a87918b3795762e5b1c6538aa059fe57 halomaps:5730 +autumn_ship_defense.map 3D04DE8A 92414369 262144 1ac1df92d20b2e0f170551cb6839143d2ab33eb8 halonet:autumn_ship_defense.zip +autumn_slay.map B2F4CDBF 37430248 262144 758920d628a45e89b1d7c230f0ea7c5571f3bd78 halomaps:380 +autumn_slay_reborn.map 036FD073 37168424 262144 06900031c0be1ea5d11bf815447090b50c40b1d4 halomaps:4462 +avalanche.map 7BC6C70D 60955148 262144 06c60b6ac689aaa9f26349b1f41ad836da26b054 halomaps:3909 +avalanche_interstate_BETA1.map 9F9E1B91 21689896 262144 e15bee6318a1947e495364c93159eb30830bb2cb halomaps:1461 +Awakening.map D5109225 307545087 262144 b27daeff0760a329094f47c3f3d5d07e6c2f9e16 halonet:Awakening.zip +Awakening_beta.map A43A13F2 31528388 262144 81fd17158c8d7e003144bf5a8ec6f2e65a251eb1 halomaps:533 +AWM_flood_attacks.map CBDDFDFC 64194818 262144 47ca4fb1d832b0891df1fd8bd0a835174032230a halomaps:4895 +azera.map EFDD37A8 126110712 262144 ce46ed326cea88d0204a5778576da06301338931 halomaps:6309 +azerty.map 88D8C014 48833999 262144 4fd0e566811c4db97d246d945f778b52a67682c0 halomaps:6513 +B-30-Cartographer.map B7EEEE7B 81498196 262144 a127d639d1959d59ebd1ca78439cc7cf22b33eef halonet:B-30-Cartographer.zip +B._Creek_duke_N_edition.map F6A7A866 113390471 262144 f9bcdef9d6fb2cdcd5a26f1cc61cc99f340221ce halomaps:3626 +b101.map BEB545A5 14166936 262144 f75f34fc316d370274013df197847fc831ada58d halomaps:4317 +b2b..map 08CBB625 33309807 262144 efb9e6db5d391ef7c496e2c34d42f6820e32cfd6 halomaps:2207 +B30-Cartographer.map 819FC0F3 81239804 262144 edc46542e45fcc00a0d281640f336a8fa60ec51e halonet:B30-Cartographer.zip +B30-Cartographer_v3.map 15E31FA1 64368134 262144 dabec006e0ea10d3371cda06d4898dc7487cc86f halonet:B30-Cartographer_v3.zip +b30.map A9106460 124261149 262144 4e9cae1c78342abc6c25aed5283a12d082b37b4d halomaps:6658 +b30_cartographer_multi.map B1F80CE5 80275672 262144 2987e5ca5572ad8491d23fcc2c6f3d0b7c286c38 halonet:b30_cartographer_multi.zip +b30_deathisland.map AF840E53 355551570 262144 c3e7b245347b3ae942d20d1c59e50f9a0f63abf5 halonet:b30_deathisland.zip +b30_elefant.map 8DE72254 160731746 262144 f9b02c129b65b4556c9516e54c1cde853a9e04ec halonet:b30_elefant.zip +B30_Halo3.map A4CCF750 241885217 262144 05a9596806fac6bf1ccc092cf21ea28a55e142fd halomaps:5325 +b30_mpz.map 9A8CBE2F 134439372 262144 5625cca869c555dc43ccf054f1a71974d251030a halomaps:5111 +b30_time_splitter_2.map F5A8208F 111984660 262144 9483f175ac94c81009ccfd209a678be8ec9fa023 halomaps:5599 +b30_Warfare.map 8D0A4C8B 78271366 262144 69297c6bc5a20c4762bfcc611f7d594c54da5fba halomaps:4732 +b30b_ai.map E4CB5B8E 98686250 262144 8403aaae12a3cd9209de4f4888f5bd1e889efc8d halomaps:6820 +b30coop.map F82F2D71 121559186 262144 9ca9323561bbf49b9bf5fc5040e7ccdf1b237fee halomaps:2598 +b30multi.map B10BD58B 107082657 262144 f7e87f3048e887304b7837baed89b7c230422d56 halomaps:5263 +b40-arena-v2.map 273337BD 101285568 262144 d4613b4d4998df7da6b69e720747dccc9bdd32a9 halomaps:5460 +b40-arena.map 28FE0A6B 78257381 262144 1be0ffeec61c5de4254db3ad019af9274dab4179 halomaps:4835 +b40.map 254FC9E2 190209235 262144 0a4d982cfcfddd738a772b342bd82432b3214e49 halomaps:6659 +b40_firefight.map 809B83DA 220265933 262144 d696a91cd85b9740a204feaf1df6698d82150be9 halomaps:5169 +b40_modified_v4.map FEE57A92 198042914 262144 65b230a8f06992f2a24629028fa64058b382e1d1 halomaps:3842 +back_cycle_ai.map 44C5BBE1 72543723 262144 57260260413534db1061e0443df6aae7a4c29238 halomaps:2035 +back_cycle_v3.map AB2597DB 27610996 262144 06200135ee8c53266fdb316fb319027914b5e744 halomaps:2036 +back_cycleV2.map C93289F5 18851105 262144 e49a452b1ebec1486ce06a5436285be6d0c5efe7 halomaps:1946 +backlash.map 2BF90D5B 16368020 262144 db3b8a35c4d0089aad7f26de1aa6294ca4214061 halomaps:324 +backpack_gulch.map C36F9C89 28087592 262144 456d43444be4d7c033da2ee47afea3e4c983d84f halomaps:2524 +backstab.map A53EA630 36884692 262144 d1b5a0aafb5219b0310ac8c8fe91644d81be7e9d halomaps:2862 +backstabv2.map 998F227B 36884692 262144 1e4edf228c5151b21d84754cd187f884223b2d97 halomaps:2898 +backwash.map AC740721 21200628 262144 a4def966e00a8ff8342fedb4f28636507d663344 halonet:backwash.zip +bacon.map 72AFAB71 17032414 262144 c6ce45e186a8b9939e09f401f5a5d630a3771229 halomaps:1017 +Bacons_race_track_v2.map 73404B41 26278360 262144 85c9689b94ae21087566993a9d18e908213775ed halomaps:1574 +bacons_race_track_v3.map A46C6DE2 23275540 262144 82d76904b85089e8dd45b9547a828dfd9ff82917 halomaps:2167 +baconsracetrack.map CB4CC18D 16885772 262144 1be55fe4b6cf5b9b1ca5a5dd9a63bd09983bfd3c halomaps:1150 +Badass-Bigass.map 986D849A 275199590 262144 1a67e6a4fd2b65344366bba85c423aa2b15e8a93 halonet:Badass-Bigass.zip +Badass-Bigass_ce.map 0327FAFA 278092982 262144 800ae24ac89c6cce9a2a4a821520b84dd42f74e5 halonet:Badass-Bigass_ce.zip +baddreams.map 6DC40C27 28090645 262144 fb6effb2813750a347f4314c29d18c99546a7133 halomaps:4090 +baddreams_pt2.map B5F29405 52344271 262144 4147ace15dae0502db826cc20859febad3e4513d halomaps:4112 +badlander_beta.map 98F22CC4 42621149 262144 b8fcfbbc5a844f4d70d4e442cce2d0d00535b11c halomaps:2074 +Badlands.map B9822E46 133021046 262144 4708fadfda10b4567a5bd56eb96a4c025bfc676f halonet:Badlands.zip +badlands3.map D43FD056 14127688 262144 1482d40d80fffdc8f54cf66885ef3ea3814b7b41 halomaps:200 +ball55.map FD958082 27029856 262144 2d6265ad121a0e61fa4fa210e9476e2b81a03baf halomaps:2915 +Ballyhoo.map 351E6D29 14113076 262144 e5b572ad3942e6169add02a56ec5ecebd1afb9bc halonet:Ballyhoo.zip +bang'em'high.map A4225445 35198144 262144 7f0265488f4fd76edd889eb2853390624f158fbe halomaps:1054 +banshee.map 1BA6236F 113399499 262144 b350f641645c79f6ce9193bc21aa3ec99fc107d6 halonet:banshee.zip +banshee_assault.map CB56E383 22194826 262144 af70c11c3da81c92589e9c818e0c1b46de76c8cd halomaps:3677 +banshee_assault_v2.map 417BAFC1 75443091 262144 963dda42f86c443ea5c0af073e821d05ffe6b450 halomaps:3693 +banshee_fight.map FAD9E761 13566868 262144 c79c3f14da920d21b0597285edd0264f3eb5a17a halomaps:5604 +banshee_lands.map 6B0345FD 12508496 262144 34e888cc33cc818546df076c4a1369d43a0041b9 halomaps:290 +banshee_map.map 28EC892C 37924493 262144 84d4d01d42a862e6124d24032d1598cf92d367ee halonet:banshee_map.zip +banshee_wars.map 76DEE919 83982350 262144 f0e831b0f8cf968e8590f87934c75d7056e7e1d7 halomaps:6366 +bansheemadness.map 48F5906C 12778260 262144 9d08efd1c28dbbebb9daa1cca18ad16b517bf24e halomaps:291 +barrel.map B5245B01 87431999 262144 536dcccdfcfe92d1cb84250ed092ee7de932b075 halomaps:6192 +base2base.map 3A4E2F32 37371008 262144 ef976c6857a76c6baab29ff44ac52244784cd4da halomaps:2947 +base_havoc_beta.map AD697F79 38637978 262144 b1e23b00df7da761adb15329d896b8067326e374 halomaps:5101 +base_to_base_beta.map 83E13B99 18481039 262144 2029898b81680d879e10074a292fd1183c363301 halomaps:3250 +bases.map 89020731 22946016 262144 610ece070d28f6e2984928a821cf44cdbb37d250 halomaps:3545 +basic.map FE3595FA 50009032 262144 449945f2ff88cb4f229cd03cb7a4f9af538d26af halomaps:2362 +basic_beta.map 94261EB7 16341298 262144 e85e793edca335461f7a27d3ebd7e81d88fc442c halomaps:5848 +basin.map E5572CA1 22776500 262144 5cb70ad847fdc222229e6e83c9df3ddd0e590740 halomaps:3036 +Basis.map 1406E97B 20473913 262144 ad23e32b9b52119f6bc32b630ed7eef086704a63 halomaps:1472 +Batalla-Spartan.map 95E4CBFF 369659775 262144 27d85b96ced6e1911291b5245309df0c77bbfeca halonet:Batalla-Spartan.zip +batalla_vhmt.map 7CCEF439 22904434 262144 ea38768f3841e56deb7967fde2f31d2ef3de450e halomaps:4007 +batman.map 7DE030D4 30740728 262144 b76c2c550695e0ac657e721ddd0b87d9d5f17a4d halomaps:1862 +batman2.map DF84DBDE 46308624 262144 7d76c0ce2e3f2d23a7fa6895cd34fdf3f9b77f0b halomaps:1863 +battle.map 6A01FD75 29883812 262144 7511b427d644464614b2380f5991d9cc3077b352 halomaps:2628 +battle4blood.map DAB2F785 88258913 262144 575fc876c306418a5c1677c8d67d8b28fb45e4e1 halomaps:6916 +Battle_Action.map 1C49DC1D 45663045 262144 a17528919f73553b7a1312fa2c6cbc43b10fc908 halomaps:4438 +Battle_Arena.map E65296CF 328181588 262144 df34ca6fdee9c36ba909319375234b1709964875 halonet:Battle_Arena.zip +Battle_Canyon.map CA4815D0 289045121 262144 037cd2bfc08b4bae20067b8052b815384fd40780 halomaps:6954 +battle_coast.map 41E8E41B 55895382 262144 2719dddc25cd08bc1285bfc9f86706f97e25441e halomaps:3726 +Battle_Creek_Unseen.map BCB4E320 117483582 262144 9e1a6b6e9fa99a3e28c398cd2b4241a48134f3b2 halonet:Battle_Creek_Unseen.zip +Battle_Cruiser.map 237C0ACC 130873320 262144 23b914cc70b8298ab66644cf1315921e253c3ce5 halomaps:4916 +Battle_For_Victory.map C1548F94 54622650 262144 ea635c032c3c8bfe17a899399376c9bc75f4fd7d halomaps:5010 +battle_forest.map D2836625 15247244 262144 2348fcc0b8fb5ffa6a83e84dadc61131cb54a298 halomaps:292 +Battle_In_Winder.map 53F984EC 42864132 262144 061686a083a6fe71de77535c2749b6ff69719cf6 halomaps:4426 +battle_night.map D85A66CD 59256436 262144 4f4288684e1d5729cb36246b28ef613fde1e8252 halonet:battle_night.zip +battle_of_gettysburg.map A11CBD6B 54081510 262144 a356aa3704ea0e8e3fe4af9ac45922c1d60a5ba5 halomaps:4649 +Battle_Of_Infinity_V1.0.map FEE02802 85577036 262144 2b0a589388e94a6761b2c411db6e11afd5e860d3 halomaps:7091 +battle_ravine.map AE55F2DB 13181100 262144 67ae6b9438c03d576ef910db8ea6867137ecf63b halomaps:2825 +battle_team.map 2F7F4563 49624410 262144 2077599041e3a658a20df4b4d4791bb9dc47150d halomaps:4928 +battlearena.map 45C2C48E 16630569 262144 4fba7c868544b1ce87fde420109718acdc58006f halomaps:1462 +battlecanyon_beta.map A82CC3DE 44977499 262144 dc38fcfeca5ac5b0d9be24cf9f1c2229a9674bbb halomaps:2724 +BattleCanyon_Final.map 2B3D040E 67625584 262144 0188a6c3ffdd1e0ed94f5147b20a1797178904ab halomaps:2676 +BattleCanyonV1.0.map 04FCEF24 87934830 262144 77a6ff3494a139569235bff3686e2f7112ba7bc9 halomaps:7090 +battlecity_lvl1.map 544FAAA5 9384192 262144 31e6d3d1f389cb302debf872dce982399d2f2fd8 halonet:battlecity_lvl1.zip +battlecity_lvl22.map 7282D825 9403743 262144 f4988d0972f1643bb603de0f7f489c05e018c4d2 halonet:battlecity_lvl22.zip +battlecity_lvl9.map 0A207E98 9405160 262144 bac1da771871045f334a855f00114924c7511139 halonet:battlecity_lvl9.zip +BattleCraft.map 08A5A846 85869645 262144 0f7ff9c8e187c8d4468c91549eebd827f83305fb halomaps:6777 +battlecraft[hac2-re-release].map 08A5A846 85869645 262144 9f24931360b07f66885b4854e56d35d4ceb1e67e halonet:battlecraft[hac2-re-release].zip +battlecraft_hd.map 9B405B6D 242933365 262144 2c41dcbf3346c9af7d639dc8cd00a1ef67698f31 halonet:battlecraft_hd.zip +battlecreek,v2.map 26D43B1C 241048876 262144 c753ff300136fd1c4760f8b8b806ed09efd9e302 halonet:battlecreek,v2.zip +battlecreek_ai.map 73F6E86D 288180761 262144 e7d128574a7fce3ff8b34febab67d9db0ba2aefc halonet:battlecreek_ai.zip +battlecreek_anniversary.map 2FBB40E0 274202757 262144 3dda2728c990eef633ddf989f40f73a64d5be8ec halomaps:7124 +battlecreek_v2.map 31FDD3F9 60078790 262144 dab0c51b68184377a5a5e2d73c1a8322d9576779 halomaps:4506 +battlecreek_v3.map 2C27FEDB 77576646 262144 055351f86dc7992a5922a51f3257a1f192d452c4 halomaps:5086 +battlefield.map F594A0E9 13955160 262144 f42f323dcf420e94a4f6972eb94dd83140dc35e9 halomaps:2899 +Battlefield_Final.map 53F07754 73286189 262144 9b2ea71d63550d9c3f1cd4bc1a5edb55434ea503 halomaps:4927 +battlefieldhalov2.map E367B764 99623258 262144 77837cbe801a86072f9203446b860188e9e68d0d halomaps:5461 +battleforbloodgulch.map 7BE5AC75 107558710 262144 fd8f1d4d26e87e7dbca435ea97a196fb84d49820 halomaps:4854 +battlefront.map 39A19C55 13763844 262144 1dc3fe360cf034623502ad708afa15bdb4b1c7c3 halomaps:2863 +battleground.map 11438FC4 12796412 262144 3b4084bfd72a70c81ef9c35eebf55033f48f2e6d halomaps:3059 +BattleGulch.map B7F7036B 26606338 262144 28140d2e800ceea59c46e67b350cf5757238ff21 halomaps:2534 +battlegulch_ai.map 82D15558 64291478 262144 afb496815dda887b8d924f1777de9a9c2ffde82d halonet:battlegulch_ai.zip +BattleGulch_V2.map BE65AF1E 29960073 262144 92f465f1570a393c860416cee5d00c3b9c19b574 halomaps:2576 +BattleGulch_V2_CHAOS.map A2F3EA45 29960077 262144 abf87c7336a28145aee1a617281de2159d4254cb halomaps:2577 +battlegulchV2.map CF15936D 29067661 262144 69031b38873e1b2baca92d1f1bbaf03f445349f8 halomaps:4797 +battlegulchV4.map E6DA9C79 35507175 262144 cf54762bac3a0081880d183d5f3b32ab05c1b70b halomaps:4836 +BattleGultch.map E3A230FB 65959345 262144 2a3deb27de27e0223a94bf02dc8ec1fbfa1d1bc0 halomaps:2629 +battleing_arena.map 60E0DE8D 16919897 262144 cedf05546b244ff90e47ffd4511a22ba60e3cc89 halomaps:964 +battleisland.map 5FB67858 13879780 262144 3527211c8a709c8fbbc4c50fe994304be1801400 halomaps:1178 +battleland.map FA185037 40935202 262144 5cd7b8fe66c39852346ffc080033806f7df673af halomaps:5998 +battleofbunkerhill.map 209C5B74 28371712 262144 19e058a247261bf3e21b50fbbf71de8078d75372 halomaps:2190 +battleon.map 304EEE6C 13992592 262144 e59b91801b51db17277ca93b9586fc7a6aaf5652 halomaps:2948 +battlepyramid.map B12C0AE1 14521608 262144 e716f26632b3c15ba9be62b234e7ec34a06ea2cd halomaps:4707 +battlesidegulch.map 1EDA56AC 22617759 262144 85e9bdb0f3111a3b376d25051519d5dcfd69ed6a halonet:battlesidegulch.zip +battlesidegulch2.map BEE8C3FB 22617759 262144 7ba322ad6fddfc29aff81f7e73fe7e875e8a9cd6 halonet:battlesidegulch2.zip +battlesidegulch_ai.map D3A356A6 86836576 262144 a1afb65749ce4cbe288579bca8c7632fb5ee8b5f halonet:battlesidegulch_ai.zip +battlesidegulch_sp.map 51489633 107093245 262144 23c70f2ce6c2a9f5d1d688210ebf54dbaaf9019f halonet:battlesidegulch_sp.zip +BattleWinder.map 23D1FC83 34560563 262144 94a2fb0bb2a3673f3c128d77647ae6f77a3ddafe halomaps:2824 +battlezone.map 83BCF160 24951765 262144 c45143db22ddc95d08d9682c8bc375adb4a8c8c0 halomaps:1139 +battlezone_v1.map 6BC2C80E 24955861 262144 a58854261ff45860d11ae91484a134cd74806329 halomaps:1140 +BattleZoneAI.map 92F98B41 19288644 262144 b3d2f5ce3b9013dcd8977c59bcae9bee952b8dcf halomaps:828 +battlezonev1.map 5540B9D5 17199188 262144 968431ff8827e07362bee971bce3fe899032b740 halomaps:829 +BAZ_Canyon.map E41BA3C5 21168831 262144 efa6ee4f8ce2006a8d20a85979961c2c559cb946 halonet:BAZ_Canyon.zip +bbb.map 55F479E7 72643025 262144 718ec09d759e14efc9d9b0b75bc95e4bcfb99674 halonet:bbb.zip +bc_carousel_mp.map 04D053B4 30090084 262144 b279249e5bd800e881d8cd437e5b1e9182e891d8 halomaps:5215 +bc_clearing_ground_mp.map 0AF94747 115851468 262144 f5049553b1dbf9a1e17e7f14fa5ed3fd9280fdcd halomaps:7092 +bc_distribution2_mp.map 60CFE48E 32506912 262144 94e9fc5b3ab6802f58ce9bb46a4cff3b5807ba3d halomaps:4489 +bc_distribution_mp.map AF0B2488 30132540 262144 e9a154cdc3eeaaf1c1babf6b1c4985534dc6dc5f halomaps:4082 +bc_matzors_temple_mp.map F7639E21 28213212 262144 a4b0a02bd6ed345e9faafd07b583569c0c0b7f1f halomaps:5957 +bc_raceway_ce3.map BE1EDA19 40256641 262144 63aec70face0800f373c8848daf55896f1a5d5fa halonet:bc_raceway_ce3.zip +bc_raceway_final_bfm_mp.map B1FAD533 42428750 262144 bf703a33e34d40278ae5f91c1bba00265502d9be halonet:bc_raceway_final_bfm_mp.zip +bc_raceway_final_mp.map 40E6E51B 40575522 262144 61cdde5715b7c0a3555ab6dc6a60cbea29795d97 halomaps:4665 +bc_raceway_mp.map F9DB03EC 28656473 262144 23337869a9ff2519a802dceb3f55196a15a85ea1 halomaps:4593 +bc_raceway_snowV.map 785E1D69 43636302 262144 77cd688c93d6f267ccedf6bd55dcb6c39a36cb9b halomaps:4998 +bc_rpgv0.4.map 6FE95499 129388215 262144 66d02d52d5ac36b74716fcd978c21e958ba6eb3e halomaps:6060 +bc_rpgv0.5beta.map 7FFE9A9C 134016864 262144 6dcbad173fe201ea712368bc8a985153859ba2a4 halomaps:6108 +bc_rpgv0.6beta.map 5955DD68 133839587 262144 a8dee45b28f7eae6af02ff49fb7dad0fc5f2ad4f halomaps:6138 +bc_rpgv0.7beta.map A529B007 147228550 262144 803073dce4add3227d45e6c3d91b91dab53f0040 halomaps:6472 +bc_spooky_hollow_mp.map 48065AEE 73979262 262144 963eb9515cef6ec2b047dac98cc1d6feb9f35771 halomaps:6245 +beach.map 7882244F 19937949 262144 9dd621f5417942821d79c56a763e02cd62c77784 halomaps:973 +Beach_Assault.map 37255DBB 15978580 262144 e086a9e82fa6ca2d2d6b9d72f6c6ecf3f00ffd79 halomaps:293 halomaps:382 +beach_assault_ai.map FB164605 85810757 262144 4fdf760c86bca2de69e435a4c3f0c4cff0390db5 halomaps:5295 +beach_relax.map CD59B6E0 35450509 262144 7592b13d1860a2d3c8ab55e670d31cabd6fe481d halomaps:3843 +Beach_Resort.map 1E7A410F 165074526 262144 7ff2d1b17177ddf5d3c7d0598cfc1e17659095a3 halonet:Beach_Resort.zip +beachasultmod.map 37255DBB 15978580 262144 4b96be5c0b26396114a2063ece1761a0545d1e80 halomaps:1315 +beachrun.map 209FD0E2 32953603 262144 6231824e859ee8692da35c1e0fb2cd1a7d702a84 halomaps:1583 +Bear's_Turf_final.map F01CEF3F 59353353 262144 ab931080b2348626628f0ca0004b712cd3e75e60 halomaps:4565 +Beaver Creek V2.map AE806987 36316462 262144 80b4464897d244e3356da1713cbe5f271c50acf4 halomaps:1749 +Beaver Creek.map 0246CB75 36223658 262144 932ad63f680603fbdd57cb2d72a5e05818a59a14 halomaps:1742 +beaverai.map E229DD94 28879837 262144 81b4157c6b9e016c3509ec7dc3483da08a510198 halomaps:4896 +beavercreek.map 07B3876A 13097000 262144 7de27aa9bb3b3018d92a0c5b1457020ca1f6d818 halomaps:4772 +beavercreek2507.map 5C240ADD 124942728 262144 b7dfd806bc8e24bc0b269cef3395ae046c415489 halomaps:6423 +beavercreek_beta.map B108C3F6 486438016 524288 de23148a18e6cc15531efb32f1d8b732999d2f52 halonet:beavercreek_beta.zip +beavercreek_rev_beta.map 3BEA0E1B 506480532 524288 dd6d9b2649b56c7afa995c5afee1d32b8b810521 halonet:beavercreek_rev_beta.zip +beavercreek_rm.map 07B3876A 337478100 262144 91371a5d70ce0aaec02948d610a51fdc6b7d199a halonet:beavercreek_rm.zip +beavercreek_swords.map C9D16102 18911901 262144 a9bda40ca7df49c043d6dfb37532ae6ada9f2b7b halomaps:2330 +beavercreek_tmcc.map 6FB5B38F 38661728 262144 e97438555297be97c5616c0efdd604bb7ea0d347 halonet:beavercreek_tmcc.zip +beavercreekmod.map 26D43B1C 71225417 262144 ed4e85f8097f3a73c17a0053047114ccc7061386 halonet:beavercreekmod.zip +beavercreekswords.map 3D49C5B4 14807605 262144 3d3d467a3fb974fb9d0ce23d210ef7852713fce5 halomaps:6955 +beaverreach.map 9CC818F0 130876163 262144 b9d987132c1321f14afe7f4a30b3dd7b5f4c24bb halomaps:6451 +BeaverStream.map 4BE75764 55504549 262144 fb2814b7e1e4b4e7dcfe255b3e06b1f2f8150a63 halomaps:1458 +beginer.map ED5E1B45 15048908 262144 e8e3612ae6a322807a46a8030660f253ba9780ce halomaps:2742 +beginner.map C430F8C6 17031996 262144 80730feb577a8517206cabf7096e94f22a9dcd18 halomaps:2770 +Beguiled-v1.map 00000000 252347706 262144 74a45cd5bfd2c1ec0b42baada90ffbd91ed2761f halonet:Beguiled-v1.zip +below_zero_ai.map 124806A2 74736368 262144 424ae2468344a613f329086874db5b693448e648 halomaps:3311 +Bender_town.map 8736E37B 31461690 262144 8a7edb92f4d5a5b6d3e57b84a56b3e2c3a6a733b halomaps:5143 +Benecia-Colony-pb2.map 00000000 255612942 262144 10b82b80e5a22e9b93099ac984737523129e02ee halonet:Benecia-Colony-pb2.zip +beryl.map 6F6202A6 63503775 262144 38828b54cc6dbefba948d477911f57f174aaecc3 halomaps:1652 +Beryl_Rescue.map FD5ED68A 65699178 262144 807f4fc697ff917eec835249e86f171d261f5c8b halomaps:2535 +Beta_Alpha.map 4C157FAB 279947749 262144 71897041b01df90a9ecba749a1c6589958db5d42 halonet:Beta_Alpha.zip +Beta_Canyon.map F199E15D 297893861 262144 4a2f59acd00561c7a588aa364c19e61dab2a236f halonet:Beta_Canyon.zip +Beta_Caro.map 63D420F3 396465014 524288 bf259e0bfb8189b20d0234412a034f167b0c3b63 halonet:Beta_Caro.zip +Beta_Chillout.map EDF6EA7D 379268947 262144 37d712b8d1a72f894595a70af140927aa23c0bd2 halonet:Beta_Chillout.zip +Beta_Coagulation.map 004FE5FD 284473978 262144 526cd14796bf2f8f58b21dc001a83549a9fd550a halonet:Beta_Coagulation.zip +Beta_Creek.map 24729DC7 338148626 262144 c8b8f56ea3914b194133156e7b49e9693a6dfadc halonet:Beta_Creek.zip +Beta_Damn.map 7C3FA987 214846694 262144 7757855558e3bcd106d43f102abefaff952ca7d6 halonet:Beta_Damn.zip +Beta_Fields.map 31B861FB 269705958 262144 c3f32e1ddd913d0d9bf221efebc50ccb15274d83 halonet:Beta_Fields.zip +Beta_Gulch.map F2B285AC 338919507 262144 2475fba6bfe7910dba4eb0c780f857176c2e8245 halonet:Beta_Gulch.zip +Beta_Hangem.map 7DD102BD 389234847 262144 4277be4a6cb42d48cd172b0438263b03dc32e0ec halonet:Beta_Hangem.zip +Beta_Infinity.map C895A5EE 289438790 262144 d919170fe0e1f7c913c52a029bd639194c70e6ac halonet:Beta_Infinity.zip +Beta_Island.map 0140EF45 295382387 262144 4c6a4be969d6a58b776faa8483fd7669325323e4 halonet:Beta_Island.zip +Beta_Priso.map 5FFB20DE 195674783 262144 c7e87576c1d1950176a07839375005860b52fd37 halonet:Beta_Priso.zip +Beta_Race.map 003B96B2 351911550 262144 524e5183a6ccfd87514fb241feb2fc5ef7540128 halonet:Beta_Race.zip +Beta_Stronghold.map 9EB4896D 240099945 262144 4c10ec61d43d1720821c6c9440ff6e0d581967b1 halonet:Beta_Stronghold.zip +Beta_Winder.map 0D438087 372436276 262144 78c15492a9ddc9fdc143cdcceb815e22663967c7 halonet:Beta_Winder.zip +Beta_Wizard.map D40391EF 357833481 262144 f9825235b281dbe142ecba7547eb9945850c759c halonet:Beta_Wizard.zip +Better_Bigass.map C7455EC7 165078044 262144 be3438cd3ab4f11c327ea6d866d18eb650d4befd halonet:Better_Bigass.zip +betterw.map 98B38CE1 15215236 262144 fdbbdc78f0f8987eb586591715fcbc7bb928f13a halomaps:204 +beyond_infinite_v7.map 02090784 23124044 262144 0c39d0fd3c7bfa5bf1e93c0fd8902ba37165fec0 halomaps:3251 +bfm_final.map C70B8954 16085864 262144 0eb9b34351d65022f31af41b1ae8d3e90f8cb780 halomaps:3546 +bfmdeathrace.map 46F7BF13 18158476 262144 05d21f05aed02db725b299740d7e8674cbf562b4 halomaps:4897 +BG-COVID-19.map 571B9E3D 134120055 262144 4b9f12e0937003f167d5dedec47898f8bd76d0f6 halonet:BG-COVID-19.zip +BG-Sorrow.map 20E4896E 17980809 262144 4a8ff68240ef8ec54a872182e08e46d9f2ce1a2b halomaps:1292 +bg-sorrow_update1.map CE82BB0B 71567081 262144 acb83330a0cf15508fecd1eae84a39d02f5ea990 halomaps:2083 +bg-sorrow_update2.map 557969CA 73040933 262144 232519e795d7e084a58eaa1d0e50491960bb1f3a halomaps:2120 +BG-Sorrow_update3.map 370D4234 71176730 262144 654af813057d1c4d7ad4dc5680f14de02fc004c8 halonet:BG-Sorrow_update3.zip +bg_flood_test1.map B7CFBECE 28573406 262144 727a51ede3b8317aaad1971b97ed2eca77338c71 halonet:bg_flood_test1.zip +bg_flood_test2.map 10322756 28573407 262144 d6ed84bdd0b74ce1a6f9e1573472bec2fa667975 halonet:bg_flood_test2.zip +BG_Turrets.map 5EA3D576 75724011 262144 107a4c0e1f86efa417af22e4c17e98b707d79884 halonet:BG_Turrets.zip +bgcops.map A37DFF89 19186931 262144 34b355dcd9b31759dbd769810a901087066553ce halomaps:5415 +bgi01.map 0515BAF4 24222630 262144 6159cf15c50b8995f37f1dd9cf64695d424a2be2 halomaps:3252 +BGooe.map CD05E1C7 45872503 262144 2e69c88772c3225c39074ec642b6a353c8f9a9af halomaps:3935 +bgpcmod.map A5D532B0 13947152 262144 f0d67c213db32f5a50f53a7e1085df605eedc178 halomaps:2152 +bgw3.map B8918FC5 78324625 262144 0025fc2bb813cd5afd7729114354578186b7eb6e halomaps:4548 +bgw4.map 364A2CC7 66392828 262144 b31098010be509f77b3ee0514457cf8f3eca2608 halomaps:4550 +bgw5.map 120B04DC 78325581 262144 9d30633c5a844dbe71c7c90c674e89a3a43efecd halomaps:4551 +big snowy map.map 63FF2996 107571473 262144 9b7c6754ec478403b031ea82b47578dba3221e8e halomaps:6821 +big.map 4A185A84 17674680 262144 c6b88d79d2dc352c9ed3a70e0007883f5c95eb62 halomaps:834 +big_boys_toys.map DA0EFF1E 29679861 262144 344eec3baa8237541453969796ae95e6b64aa983 halomaps:5999 +big_canyon.map BB360980 14062700 262144 569c714d2f1a62f58163dea24ab1ccb28bb832be halomaps:1769 +big_canyon_2.map 53965F4B 15919632 262144 42f69a82a3b7b77a52353a92c71d50d018166122 halomaps:1864 +big_canyon_3.map 63D592D4 28679082 262144 3ca1b2861aaec10d39858c295b9c165f081b0d35 halomaps:1947 +big_pool.map C6CA3B55 41330137 262144 e41b1f1b6e9e2ac805d423443412179437f55994 halomaps:4008 +Big_Sky_Ranch.map 975AC905 35913147 262144 c0dabecc283cc1c5b4b27ea8ed01adcd864404fb halomaps:2556 +big_thing.map FA4BFCD2 59475048 262144 95b4ea1672eb421f14054b94dc9683bf14370d9f halomaps:3694 +bigass-2021.map 7E276618 131345651 262144 fd9bd7909fa6c324e12af15fd46e64860e589ae9 halonet:bigass-2021.zip +Bigass.map CD5B1E48 188434561 262144 1ab11d1e2279eec481fd8b8da8c8e313d8543026 halomaps:7067 +Bigass.v3.map 54C6BCA9 238208444 262144 f7a8727897ad754376e1d439f5d85b9fbb52a9f5 halonet:Bigass.v3.zip +Bigass_Bigtits.map 4A4560A4 223126764 262144 fd8a442cc8ad841f70d43c71c0d2adf622d35618 halonet:Bigass_Bigtits.zip +Bigass_BUG.map 015869EF 200992219 262144 6d5f71b6513bab4d99d939e88e039d9736816e7c halonet:Bigass_BUG.zip +bigass_deathisland.map AF840E53 344143892 262144 d1b8bad3269f08885881bd929b39f7ba261699e0 halonet:bigass_deathisland.zip +bigass_island_bk.map AF840E53 344143892 262144 bdc272f6839bbae25948d306ec5063162c50bba5 halonet:bigass_island_bk.zip +bigass_mod29.map 9B5811F1 265752553 262144 66431946df9ae6ae87c96c6f713fa3324e50a069 halonet:bigass_mod29.zip +bigass_mod30.map B8BA3B4E 287176068 262144 43a671d700ddffa305a0de7dad7dd8c30daa5afe halonet:bigass_mod30.zip +Bigass_New_Year.map 9E120E56 231837468 262144 8b1fee92dfe3cdc501be898b5c9ff5946fb8b6c7 halonet:Bigass_New_Year.zip +Bigass_No_Mas.map 07210E46 222039308 262144 c6beaac2c489a47eebae01555ef8e94c5abebc40 halonet:Bigass_No_Mas.zip +Bigass_Una_Mas.map 12004626 222949502 262144 c9bd205913c20615c31f2500560d7f06932f5661 halonet:Bigass_Una_Mas.zip +bigassv1,71.map EA2B5297 87597456 262144 8ffd4ecdf03aad9b62d3288e0dc1e9883e1ae250 halonet:bigassv1,71.zip +bigassv1,7_special_ltd_edition.map 49940B30 81756240 262144 fd9ada5f082ad1920efca75087bc36a9bac31b1d halonet:bigassv1,7_special_ltd_edition.zip +bigassV1,81.map 2E52D20D 97542469 262144 3571fb8b4bce75e47e5750f945b10983d8b56dbb halonet:bigassV1,81.zip +bigassv2,069.map E2D16FF0 128138776 262144 34b449a98885db11f26a5905315d030c4d77078d halonet:bigassv2,069.zip +bigassv2,071.map 95C0A5A3 128060684 262144 0b8a1bd9125001c7e83cbf72d0a6ea272ae4474f halonet:bigassv2,071.zip +bigassv2,072.map 1910CED4 121049204 262144 c5dbad3de8b39f5c9fafcbe27aad688d47772bb8 halonet:bigassv2,072.zip +bigassv2,104.map 8082B5A2 141357525 262144 35af8808da3a54821a1373cbc6412bfdad97f032 halomaps:6997 +bigassv2,107snow.map 8077BAE2 202720557 262144 fb99c9a5d0ab66082be32010c76df04d9db93841 halonet:bigassv2,107snow.zip +bigassv2,113.map C0CD5432 171489145 262144 8fcfd4b97ef89339deef07880958170fd7f31b92 halomaps:7068 +bigassv2,pro.map 00000000 191459835 262144 1df9b76c68ec19b22f977f32b0519ad8fadfa086 halonet:bigassv2,pro.zip +bigassvv1111.map DD8CBDF7 232519650 262144 f6e2af26340ea0bc888f69249f1ef3ca348757e2 halonet:bigassvv1111.zip +BigGiantBattle2.map 0DB34CDB 198173913 262144 fdbbcb0efcd93f8c83d392c03f04cac46057abbb halomaps:6322 +BigGiantBattleV2.map A25E416E 180471678 262144 e1b9a39922aa9583bce39ba6a6ee9867cd491eb2 halomaps:6323 +Bighill.map 9223AF87 15796848 262144 0d30583bff3b317d1571c837ea7caa940b0d5eaa halomaps:2748 +bighill2.map 0C8BE247 16383924 262144 153f3e0227fce9366dbc0f038f066039e81c0969 halomaps:2826 +bighill2a.i.map CF72366B 62113480 262144 d4ae807cb451a19398a7afda2c904d482ddb1c99 halomaps:2827 +bighill2v2.map CBCB8186 25683131 262144 99f5fa66b9f4c20ad1089e5546d804c2f657a708 halomaps:2828 +bighillai.map 06A4C154 65950271 262144 7a52fb68779a208d285801e04e0aa16c320977dd halomaps:2771 +bigtits.map 17FE457A 330641487 262144 be2e95d442b7b6cd11045c933205e8cbe349473f halonet:bigtits.zip +bigvalley.map 00E12BD3 94856764 262144 f1adf53921f40fe00af37139ece5e8b668bfc6c3 halomaps:3287 +bigvalley2.map 5D29A028 96951140 262144 a7b27cac4b7efafdd1696db637f54b5ef64303f6 halomaps:3526 +bio_dome.map FB4D5790 12974300 262144 3ea1bde8c71414d0d9acbe16bce5a87187bea040 halomaps:1792 +BIO_SPHINX_117.map 8AB83FF6 18258016 262144 a93667a351e60ce0b5841c09e91f5e845aec39c2 halomaps:4676 +biohalo.map 718F0B10 75879311 262144 8e2a6731ddb5fcbabe4d82a70e9f28db892ad1c4 halomaps:1575 +biohalo_alpha4.map C8FD14FE 18445632 262144 de0c4dfb47e716914f0082c63b4e337197564adc halomaps:1187 +Biped_invasion.map F678B07C 15371233 262144 230c8d1fa7af83b513b2378b87e685b00e1cf531 halomaps:5218 +birdcage-plus.map 9D771767 175101822 262144 46279b439c2dc02c23503202b441a664039bcae6 halonet:birdcage-plus.zip +birthday_bash.map DD158D88 14106024 262144 59bdd533b00583e13c00459ecbbad7acb2f329b6 halomaps:482 +Bitch_Slap.map BA5BACBC 196062060 262144 8c649c63751f302c9486c77af2ce6e3ce421a249 halonet:Bitch_Slap.zip +bitmaps.map 00000000 123547749 262144 6efcb9d7c76abe0195f542c315f83868b3a6dc9d halomaps:1478 halomaps:6560 +bitterai.map 68C729D0 41598651 262144 f30720e4cc1496642dd74daded274f2bdbb53709 halomaps:2140 +BK-Abandonment.map 00000000 241646737 262144 810fd972fb8a0332f531de14c3df91a731e9d826 halonet:BK-Abandonment.zip +BK-Badass-Bigass_ce.map BCE3CB88 277693574 262144 fb202c371e18d4609b2c26fb84b00aac61827421 halonet:BK-Badass-Bigass_ce.zip +BK-Bigass-Mania_ce.map 5809FEA3 277176378 262144 7ecbd95c4089eed4233489535b605130e384ac2b halonet:BK-Bigass-Mania_ce.zip +bk-camtrack-arena-gold.map 00000000 148677597 262144 adc21078837c3e8251d7f06f4470e1ef9acc36d8 halonet:bk-camtrack-arena-gold.zip +bk-dead-to-rights.map 00000000 232477141 262144 ce0be318d16d895e27e8044739ce7381d211c4ab halonet:bk-dead-to-rights.zip +bk-g3-augur.map 00000000 269785671 262144 3aefd338c37573c750b98b509c63767bc09bb5fe halonet:bk-g3-augur.zip +BK-Lostcove.map 00000000 224392599 262144 dff2797c6d3c1e8095f179ce8931d2b3f040780c halonet:BK-Lostcove.zip +bk-orange-valley.map 00000000 230586701 262144 0a06c3d13d2ff157af777af6557aa401dff584f1 halonet:bk-orange-valley.zip +BK-Pirate-Island.map 00000000 184063420 262144 8065fce058057b29e92e22c8904b3ffc384ffec2 halonet:BK-Pirate-Island.zip +BK-Volcanoez.map AF840E53 122218415 262144 9e6d8440d73705b4627c69b342e00067c43bbcca halonet:BK-Volcanoez.zip +BK_Amnesty.map 569B04D9 142886276 262144 c4782441cc82f04dea1ee95bc5ce73cc23c05470 halonet:BK_Amnesty.zip +BK_Battle_Creek.map 122DD3AF 102734805 262144 e2fab0c69043597a5879864e5ac7694ac4ac9a6b halonet:BK_Battle_Creek.zip +BK_Carousel_Zombie.map E7E27133 33938272 262144 7cf2e7b8a73fc67b05879641c907ad0c576be62b halonet:BK_Carousel_Zombie.zip +BK_Coagulation.map 69CC8F2F 190962227 262144 fd1d4563f4d39c31c15ea60ee06e7ba72effea8a halonet:BK_Coagulation.zip +BK_Crossguard.map C8726F53 17000536 262144 0fa0f10a64996be55c2771107a2ff4542d61c1e2 halonet:BK_Crossguard.zip +BK_Double_Gulch.map E7DCC5AA 141985817 262144 d9e3b24404b7e934a7f9c862497afb18948e25d6 halonet:BK_Double_Gulch.zip +BK_Immure.map 00000000 161781141 262144 e49099849ea302288600bd7c2a28332e4f51e6d3 halonet:BK_Immure.zip +BK_infint.map 98C04D61 23119620 262144 34e815440f79c32dbcbefca9bba4a2c10e933313 halonet:BK_infint.zip +BK_Octagon.map 54DB0DC7 27116384 262144 360622cfe990f20c57db62ba15591c31a785edd6 halonet:BK_Octagon.zip +BK_Serenity_Lake.map F0B8CFC5 207072294 262144 717f8402a4cfd15f798b9944f7628e66b8ec897a halonet:BK_Serenity_Lake.zip +BK_Sidewinder.map 8478DB2A 14785216 262144 0d49a2b1bcc11701602e823043145305aa5db80d halonet:BK_Sidewinder.zip +Black Virus Infection.map 1D060A1A 16884580 262144 2dd9a56ef6c9b4269417836e6468627d9e5ddb6f halomaps:5585 +black.map 94A00EA0 20075608 262144 0442e31287bc54b65470c67a9f6e4da03171f7c1 halomaps:2037 +black_forest.map 0B29FAEE 14032200 262144 1db1d9ca245e823fcde9a6248630866087757a65 halomaps:3678 +blackcrypt.map 336D3162 28790308 262144 b1fc0bd6b24ab2ac91148b9458f11d5074821d8e halomaps:4009 +BlackDeth.map A9E0BDC2 125202878 262144 a94ebe67f65d9eecc27edb8ffc4ce6975b633893 halomaps:6324 +BlackIsland.map 8F00B132 129407880 262144 61e0be25dccb9ca5d39463356fe22e16123aa0ba halomaps:6514 +blackmoon.map 952C7D40 17518396 262144 e3de022403e37b8cf3fce855b38e5293c7a87441 halonet:blackmoon.zip +blah.map F408E667 49112653 262144 3fe3045c38c83918062194f4c13fff0e2935427d halomaps:6015 +blamitemines.map 000736D5 26598528 262144 559da12fb8cfbce138538102f4261041c8fda60d halonet:blamitemines.zip +Blasphemy.map B0E48AE7 88882108 262144 58c477b23273b03cbe8117cc9ba905ec7e31e206 halonet:Blasphemy.zip +blast1.map B1590B60 49373505 262144 17d46f5b4fcb4a2fc30116f4f7468e791a0f4f4a halomaps:5769 +blast1_odst.map 6E945F3D 112995568 262144 ed6746a3dfcc1400271d36ecf89fdfad1ddb5d3f halomaps:5837 +blastback.map D3461E9F 13407244 262144 b79d3568aea8bfe234cbeb0b8e8d71ba31a0d49e halomaps:5501 +blastburn.map 27FFA580 14232445 262144 d8e5f89f696f1ebeb1f67da0255a4cf82917fca3 halomaps:3288 +bleakdesolation.map 911275B6 302312450 262144 8f67f29f857c7a9a7acf69033167bc50f064c238 halonet:bleakdesolation.zip +bleakdesolation_ai_bots.map E9BB0606 349915418 262144 b9f7de70cfbd895b8cd395035d9800bb04d95dc5 halonet:bleakdesolation_ai_bots.zip +Bleakness.map 531E3429 205449668 262144 52570f4b2ea7cc1fcb5bde80e5403d1003250fa9 halomaps:7093 +bliss.map 8DE0B875 38755213 262144 d2b040474fc0d92542e9322710a216aab474568e halomaps:4760 +Blitzkrieg.map 600D2D05 159305049 262144 85198447f315a7455e91ce04ccfe723430f50c7d halonet:Blitzkrieg.zip +Blizzard-242.map CFDF355C 80125059 262144 8049e6ce45b06acc267e97c845dbca4ebdbc1b81 halomaps:3380 +blizzard.map 0490721B 15679808 262144 beba82fa02ad9c52cd8a8b554585f4988383dc32 halomaps:338 +blizzard_chill.map 2034A1C8 74042869 262144 13eb466085a0f288982af59395fd2457c594babe halomaps:4761 +blizzard_in_hugeass.map D8E06843 50253236 262144 27bb67a9d4b1c07bbbf6208ddf3b94b4586aa87a halomaps:3060 +BLN-Raven-VS.-Eliten.map F082202F 27048430 262144 193f19178c6973368fe6b6a14242805859d63790 halomaps:3504 +Block Fort.map 909AB6B4 16289140 262144 b9516870cb786aa3be60624b0456068509a6f9c4 halomaps:294 +blockfort.map 67E22F10 25048240 262144 31f8f41447267094644b63881d9904cede8e89b4 halomaps:2178 +Blockfort__Race.map EAFABEBF 17101256 262144 c21efdf3fcf4a8d500b4451fadab9b40361d1b27 halomaps:2743 +Blood Gorge 2.map BD09DF1E 294563265 262144 66ab4da9b637b850c1d734a88853295ea84469fe halonet:Blood Gorge 2.zip +Blood Gorge.map 4C7777C2 294562401 262144 fc1ae8accb3b511cc314672112405d25917f64ff halonet:Blood Gorge.zip +blood legend v3.map FE65A3F0 78330417 262144 67cfd08f8e696e00bef2bffbf416b24d2bc4906a halonet:blood legend v3.zip +Blood-Giant-Wars.map 9D6D9EED 128853723 262144 4fb86f2357e98770bf28584917180fa24b365d29 halomaps:3957 +blood2.map 484194D6 21410893 262144 f2fc7e68344c1cc2b2ad649534878707c6c94590 halomaps:4274 +blood_covenant_classic.map 5B18805C 122273676 262144 d611877ce53123efcd05ed2a3a3b1c54e68405a5 halonet:blood_covenant_classic.zip +blood_covenantv2.map 18F46675 201518284 262144 b64cf0983de47db1bbce714c67bcbd5626c5726a halonet:blood_covenantv2.zip +blood_covenantv3.map 83A81FA1 208709200 262144 1d5fa9abef0f1c3d8f2f7a8d13b81737c5dbdcd6 halonet:blood_covenantv3.zip +blood_creek.map 02F43A80 58199419 262144 81174daa2c2c820edb5f3ca705e4c18620a8615a halomaps:3493 +blood_creek_campus_pb1.map 465D4754 103139814 262144 9df1ea05731c8e0ce5fe17701799c3311e67adda halomaps:5087 +blood_creek_campus_pb2.map 5656B955 159577835 262144 991f7e24b4e92c55f20ebbc911ed2f2a851816c9 halomaps:5990 +blood_creek_rc1.map 1C177810 81736009 262144 dd5480681ef23f13aa87f864accebd764190a6bf halomaps:3392 +blood_creek_rc2.map 8F86D1C0 95049371 262144 0a070ceafa23d524e43709243691bc2118505589 halomaps:3577 +blood_flow.map C227605C 396021187 524288 cb516edbffaa8b71550f3165e6448e861e470ffc halonet:blood_flow.zip +Blood_Glade.map 064784C8 13183076 262144 33066527e1eca3ac9dd061ff11f7cac8128f94fb halomaps:4104 +blood_gulch_h3.map 128C3DC1 31225475 262144 2035593a0076b0e69b4e4be8e31a559547b5cf84 halomaps:2234 +Blood_Gulch_Storm.map 8CE31BA4 16035909 262144 453eb0f17ec035476957cd5eb0faaa04e44406f6 halomaps:3312 +blood_of_the_gulch.map 0F38C842 56507946 262144 febf1340294ec02b19b4bf8e74e4d3a9a6eb5035 halomaps:3061 +blood_patrol_v2.map A000310C 82367174 262144 643e83a63972ad685778d42c62ac485ab900153a halomaps:2300 +blood_pool.map E19A06C1 75022856 262144 f033aba31c2ba24e593a8cde691c5f1c41c22aec halomaps:5923 +Blood_Rocket.map 71A0A0F4 14598098 262144 43700261b44630a64e4c43bf20a19aad4d058b5a halomaps:3457 +blood_vhmt_gulch.map 80672A61 15052687 262144 4f1e09277fcc71c3fecccf137d740e177fca8121 halomaps:4651 +Blood_War_AI.map 5BF43137 54841198 262144 7649a64f17c2546fa4edb1e94727e45ed12252ba halomaps:5502 +bloodcanyon.map 6840D5D1 16516156 262144 a3f77755fc48dcc45381ca2fdc12fac7fb88957b halomaps:205 +blooddareffik.map 0AC8A628 50112340 262144 30243a25e0ccbcf1791046bfcea007130eaef225 halomaps:6750 +bloodead.map F1E43F79 81897657 262144 3d39b8ce17a7ff6fbaf87e13adbe1bae5c0d257a halomaps:5484 +bloodempire.map 4DE1C5CB 20226404 262144 beabcaf4861760d6285eeceb175e3daac0cb6942 halomaps:2121 +bloodencounter.map 40DC63A9 131865423 262144 ff75e49b014da0626e7a35164aea657ae17177e3 halomaps:6367 +BloodFast.map 1B85FE82 62311769 262144 5df3177ce8f8b7d9339bb6521bf7f446f6a48d8b halomaps:4612 +bloodforest.map B533ED2C 16331012 262144 330083178e5bfe017067a7bd53df1538a02d67f0 halomaps:2490 +bloodgaigher.map 46565F26 49792487 262144 82286fb732a2cc15bd3118f37e8684498d513bbf halomaps:2829 +bloodgaigred.map 0AA74F8C 23977808 262144 52bb7601984f5cd70b55b5e9d5ea1bbefc967f68 halomaps:3547 +bloodgiant.map 307708A9 41279745 262144 69d5912dfa8b92190fe88699be040e0e49ba1003 halomaps:1647 +Bloodgiant_Public_Beta_2.0.map 61625A27 38336529 262144 268ebfb630e6c5b033cade4ce97bc388bcbe591f halomaps:1665 +bloodgiant_public_beta_3.0.map 99BCDE72 43129653 262144 d0c5b596a1d1eae1de9f993e87173de5160b3f89 halomaps:1674 +bloodgod.map 7B309554 73921762 262144 a95fe5aebad0e0fe46ee10bef26fa7fa43786dec halomaps:1988 +bloodground_aco.map D28AE55B 26044281 262144 9d9b295deb0e8dabeeb66970702f7d1c4428a711 halomaps:4964 +bloodgrunts.map 8AE3AEDF 59932725 262144 bc025d24a14b92a8357a37d3ada5372bdddccc03 halomaps:4708 +bloodgulch night.map C05D6436 13998732 262144 763bccec29dce25d2e8cc23544d65a5a908447d2 halomaps:6670 +Bloodgulch Overkill v1.map 84145D5E 13956372 262144 7a8f60c7e590010e349f55668b347b1249912f71 halomaps:4439 +bloodgulch-camtrackarena.v2.map E7715BC6 62954316 262144 331724ab4ee481220f12f1a96f35f76ed113c200 halonet:bloodgulch-camtrackarena.v2.zip +bloodgulch-intervention.map 6D025D5A 92951273 262144 48ed70797822cc00c01001a53a3c013b66725e59 halomaps:4999 +bloodgulch-intervention_beta2.map CACDC7B4 109837108 262144 34c943b24cfa0fff8ab768e7b7a76e5f15d0f0b6 halomaps:5041 +bloodgulch-newweaps.map A9347691 51656820 262144 4198a11d1f7671dfa5b73df340991654a5327857 halomaps:5586 +bloodgulch-odst-ai.map A609570C 16779932 262144 b0ddb4f60fa6a07ada0fd950f6ff28e5ef2289da halomaps:4650 +bloodgulch-rail.map 91B9E601 15641424 262144 f264067b9c465858ee42ed73777f5cadfc5b05b9 halomaps:349 +bloodgulch.map 7B309554 13936092 262144 384911e8361a36a6aa69bbb076060540c55545ee halomaps:4773 +bloodgulch2.map A892596F 17480296 262144 e60b665e947ee13999def853382f50883ea7dd09 halomaps:206 +bloodgulch2_bk_v1.map 5EA3D576 268709880 262144 b9472362c89aaa893ada8f2b784a4883202e8b71 halonet:bloodgulch2_bk_v1.zip +bloodgulch2_bk_v2.map 5EA3D576 268709880 262144 1362a761b0b980943edc6dae81a083e1f58a0680 halonet:bloodgulch2_bk_v2.zip +bloodgulch2cse.map 4FEFCF1D 62796159 262144 6fa46b16029a198ceddebf1833890c6d696e0958 halomaps:2557 +bloodgulch343.map 14261BF7 87927004 262144 c1343f4a49dfe30b7288988dad6d1a70b3dfefe9 halomaps:6956 +bloodgulch_60fps.map 6E209CAA 33469316 262144 71c3045c4c4fd5152ce2843c56a93e7ca14a8a97 halonet:bloodgulch_60fps.zip +BloodGulch_AI#2.map 669CDC57 80478275 262144 1763eed45fcc7e4025feba2998955b31c3fd8907 halomaps:2815 +bloodgulch_ai.map EB3ED34B 55827874 262144 7eb9b028d05449d99882495a403650f622c775b5 halomaps:2256 +bloodgulch_anniversary.map 2910C500 290362443 262144 f59520e91ea52a050894afccd5158090d7c83a29 halonet:bloodgulch_anniversary.zip +bloodgulch_bamf.map CE01C3CB 49523675 262144 1d2306ef68a022b6e063797df00e93d033c9d8c8 halomaps:4102 +bloodgulch_base.map 59B36260 33605820 262144 355430ce8702a039de05e447dcba080b4b19b3f7 halomaps:4709 +bloodgulch_battlefield.map 31203DCE 84282137 262144 ac059bd2a076200fda8a79e26999b57f47235b36 halomaps:5485 +bloodgulch_battlefield_v2_chief.map 891A928C 73155643 262144 3d4106c6bd7032d2028941bc548ef31c18ada386 halomaps:6044 +bloodgulch_battlezone.map FC378A9B 46563032 262144 d2a4a823bbcd01f689d35b8c34b699a264851d70 halomaps:4226 +bloodgulch_battlezonev2.map 1CA800C1 63153120 262144 1b08f005d0c40047d3c89bb48bded62e37738afb halomaps:4245 +Bloodgulch_City.map 3E428A0A 91728966 262144 7e7575dd4726c1cf543ec28bb30382c68253835a halomaps:6778 +Bloodgulch_Enhanced.map 53D04AE6 16919784 262144 588924c44f4fda8483bde69e9df5e862e42066a5 halomaps:5059 +Bloodgulch_Enhanced_fixed.map E9AD5C38 73824358 262144 4d30a8ca74c0bb593b9d388ed1d51bcbd436062c halomaps:5276 +bloodgulch_extreme_2.map 077D292A 59603209 262144 bdcfc27b8a8ed942cf201ad34e3b6ddb6075b97b halonet:bloodgulch_extreme_2.zip +bloodgulch_firefight.map E266B39A 106254099 262144 ab9273e0562413a4839d1455f7832a5c9ab4d0f4 halomaps:5014 +bloodgulch_fl_a10_mod.map 5D336473 28004930 262144 9ba5608623808ab2989275c9e3f0766dd092b0ae halomaps:5296 +bloodgulch_H3_pistol.map 93FA18C5 23107148 262144 c9f1636e720245dc6ef10fa6955eb968ecfa8f43 halomaps:5416 +bloodgulch_h4x.map A2479AAE 18695249 262144 9df0e162ecac1dcca82db2e89c19b9e58ef08a0d halomaps:1555 +bloodgulch_improved.map C6D13987 102240256 262144 59877622737017f0ebc83f1cd3652ca307be5b34 halomaps:5683 +bloodgulch_marines_vs_covenant.map 13859E4A 73559807 262144 8d4861aa5049c02754338787c7de07bcb58b8389 halonet:bloodgulch_marines_vs_covenant.zip +bloodgulch_mix.map A6AA52D3 58819164 262144 803a36b45f07f644fc0618ffab58baec7881b5fb halomaps:5184 +bloodgulch_mix_2.map 9443F404 63184980 262144 9a83f6ba253e6e268dedf6f8fa9beda7cd435d28 halomaps:5185 +bloodgulch_mw.map B436CDE1 119908297 262144 46c8596432fd9a4d81bbc496f07f6f1880a397cd halonet:bloodgulch_mw.zip +bloodgulch_mw_beta8.map C4F383BD 128484557 262144 4748238d8eebcd5694c4efd06e8b996b762796e7 halonet:bloodgulch_mw_beta8.zip +bloodgulch_nightfire.map 279E490C 41490715 262144 7d6e1ee84b0d93ef8fda084635088bbba4ebeb75 halomaps:4917 +Bloodgulch_Paintball.map 00000000 96977164 262144 24baa2e055b34ed9f2843cb6c39339b9e576d7fa halonet:Bloodgulch_Paintball.zip +bloodgulch_rm.map 7B309554 321254040 262144 cad0ab725a8da051184eb82ab9e0d782bd5acfda halonet:bloodgulch_rm.zip +bloodgulch_scrims.map 12A333C4 36175979 262144 70e9de2b6169cbf5d836365f30f12612f24527e8 halomaps:7113 +bloodgulch_snow_no_ai_v1.map B8BA837C 77655115 262144 0deed74788d74aedf7c7e8557a816af438e4384e halomaps:6193 +bloodgulch_survival.map 3A92358F 64658688 262144 217f8e833097bbb0406c5af1170581d0e65dd995 halomaps:6177 +bloodgulch_tmcc.map E33F9238 37200720 262144 0b100ccf0f5e04bdb0ec5d229dec05cf437fd24f halonet:bloodgulch_tmcc.zip +bloodgulchblindado.map BE52CA25 14924311 262144 ba38c1f54f2b293878522e3a9ff8e7bb97fdbbbc halomaps:6109 +bloodgulchcool.map 8B1A553F 23454112 262144 644eec0a4df8a9743d36923fdf5bfb16b6cc3fe6 halomaps:5770 +bloodgulchcovenant.map 23FB3DE4 16636142 262144 389aabf0b9b665d3433b489b53d12b7c3f2fef18 halomaps:5349 +bloodgulchcovenant_V2.map 39D00CBD 23462786 262144 bba4eb93f6cac1945e6566efae33a6a92e7db311 halomaps:5395 +bloodgulchedit.map FDD80EAD 19647360 262144 c3c0b8f4a3f26c3f703511aa1db9f5a3f1a1021f halomaps:3476 +bloodgulchflames.map FC51B8CF 104948804 262144 69f9a099c40364e89876a59985e1b7d4eac134f4 halomaps:6016 +bloodgulchhuman.map D02D887F 19016236 262144 9d5b74712fe18e65b6a6e6a27e83c9ade5e5db88 halomaps:5350 +bloodgulchhuman_V2.map 6F27DCB4 22779183 262144 08f213e8e09ca580ca1ca0517318bfd3976a66f6 halomaps:5396 +bloodgulchi.map 4EF3913D 74839950 262144 e5cdee21e6466097b08670c1fd37fca27d6e7477 halomaps:3987 +bloodgulchmod.map 5EA3D576 71090520 262144 6acf5f81cabfdf887de1d82de56d21a9e1316f98 halonet:bloodgulchmod.zip +bloodgulchmods.map 22F1A537 62947092 262144 2bd154dfd59f01980edeb8eaf52b9c252ff312f2 halomaps:4929 +bloodgulchmx.map BC4B426B 70622950 262144 e85d1705569185be444bfb5c6c81b0def1192ba8 halomaps:5013 +bloodgulchrpgfinalmaybe.map 9F061D68 121770771 262144 98b75683b8b60d7ff0455ff1c27c546c204d4d1d halomaps:2421 +bloodgulchsp.map 4D134185 106185835 262144 2bd8025e80c63ed1dd3b459dfdd5affc4e1d87a8 halomaps:4934 +bloodgulchvs.map DE01482D 18718374 262144 855c9c2660e00987855869b6b9f436cc4a9dfb30 halomaps:5183 +bloodgulchvs_V2.map 653FAEE9 23219629 262144 2ec2173d4de37ce5b03d2fb309a2fc18c8b9ce86 halomaps:5397 +bloodgulchwar.map 3B02DF63 50344130 262144 0a8f364fe301e726234f6119bef867340113bfca halomaps:3253 +bloodgulchwarfare.map 61BDE8C9 38220033 262144 844044815e51e68aebce9db70e9716a00f1041ad halomaps:5056 +bloodhillV2.map 128313C2 31337532 262144 d71201c3b853a98c34e4dca31c37fdcd04159fb5 halonet:bloodhillV2.zip +bloodislands.map EA388642 18112200 262144 f8ec645dfb36daca85228aa132c0db02f343fe9d halomaps:175 +bloodlock_0818161.map B7C2FC39 13289584 262144 d208a7b34e9c84563dada95cc385df9efe8d9792 halonet:bloodlock_0818161.zip +bloodlock_0908161.map 0C770809 12788008 262144 c9a891388956eb39517960ed6f4615dae31b455a halonet:bloodlock_0908161.zip +bloodlust_h123.map 81C27E68 68116376 262144 10cfbf963c67f1b7c24b5f43bab79fa15698c79c halomaps:4762 +bloodmod.map A7DF659B 33865129 262144 309844d4a8498bd47ab005b6c6bf20def54ce77a halomaps:2542 +bloodmod2.map C1389DB9 34085095 262144 96414bdf5c0f0fa982738eef743bea206ea4f1d1 halomaps:3436 +BloodRage.map 06B41B62 128612147 262144 fcdad8f4e623fb47e8445543a24d5274d56d5e9c halomaps:6671 +bloodrot.map 69068AC7 14176668 262144 d52e9c23678158d0262a105469d920d8d2578464 halomaps:372 +bloodsand.map 22F38868 15291188 262144 8a37cd6ebbc7b492b824cddd42aac6401a85aba2 halomaps:5771 +bloodshed_sync_alpha3.map 3D4D97A1 43196687 262144 0f04567a2c55f5f1c22e332c0583085cf18b46c7 halonet:bloodshed_sync_alpha3.zip +bloodshed_sync_beta.map 82A2A6FF 40684595 262144 df8fd666ed810d86bf7c345ecbd0140475a0493d halonet:bloodshed_sync_beta.zip +bloodsphinx.map 2F6F51BD 40726441 262144 4b293745b87cb0c498be99f1c2b40224bb6120bc halomaps:4930 +bloodsword.map F3A2ED96 15551893 262144 8dbb596c1af1c8aa1cff6454b40e966ee6cf8192 halomaps:6957 +bloodwar.m.map 57649DFF 22329257 262144 5a82d9daa4f06c4b97fafd29dbd5c34a3de07747 halomaps:5122 +bloodwar.map 25CF3BBA 31210941 262144 1f5f9cfe2f47c5447776ead09fde524f79831c21 halomaps:4798 +Bloody Gulchy.map 671B7518 27904552 262144 2f03ca8842a58e66fe67cad02104ee784ade2dd6 halomaps:3114 +Bloodyhell.map 79BF50E9 20264294 262144 7c7fdbec9224e17b05e3f916d192bbf33f202b04 halomaps:2491 +bloodykills_ai_map.map 1FD5A9B8 50406838 262144 8d02fdcfaf8849b00d4594ddb1255f11b1ece035 halomaps:3576 +bloodynightmarerace.map CB0D453F 21474072 262144 55e18e3d92f0e13cf0b325da4c286a657a3f333a halomaps:1783 +blowalpha.map 20CCABC8 13295288 262144 7393ce3da87b35a3253e403ae41fdad1892315d7 halomaps:862 +BLUE.map 2892F85C 36562545 262144 8b43b6e4cf396c08506b8b679347228095080ddf halomaps:4070 +bluescreen_map.map 892B0AF2 13109268 262144 2877b716f45f323de153b8b61d49190a449c5c57 halomaps:1995 +BMT-alasis.map 37634CAC 43797491 262144 4d9f93f59e1edf1ad0c99e4894576965601bd99d halomaps:3393 +Bmt-Coagulation.map D451B29C 98409211 262144 c8bc92176d9ab7d470209c65ee0b829bc73a6760 halomaps:4140 +bmt_ascension.map 9F89F06E 48753145 262144 a027d4624290548cf25fe449b94fbc4062a79b21 halomaps:4855 +BMT_New_Mombasa.map 7031A954 74938991 262144 3557949d329f3305efad910eb87a0d950b825db9 halomaps:4856 +bntraining.map 575E9549 23601983 262144 4b30fca6ac738ff3a505ba59668e2c817657a4f5 halomaps:1785 +boardin_gepho_aco.map 59C1C8BE 17745116 262144 fe873cda32ee50e202baae55b0dee594ce850873 halomaps:4931 +boarding-pass.map 68ED1AE7 17145404 262144 57ebe5112c426ee2dc3c047b93827f5a8e741cdd halonet:boarding-pass.zip +boarding_ai.map 3111422B 21350764 262144 df55521e1e874a453cad2ba71dfcaf89ecb838e1 halomaps:4857 +boardingaction.map F4DEEF94 13960504 262144 a850470c38bf3fd8eff191ffa330d4bf211f5fe0 halomaps:4774 +boardingaction2702.map C101D344 121739343 262144 74e6ecb415ffda67835e4e5be3a75b28f3421601 halomaps:6424 +boardingaction_grav.map F4DEEF94 13961109 262144 a76d668e92f722f515e19c7f5eaae8957ff5ea49 halonet:boardingaction_grav.zip +boardingaction_grav_2.map F4DEEF94 13962253 262144 cc761660c8f30949d913b9c3bfb03488330e9013 halonet:boardingaction_grav_2.zip +boardingaction_grav_3.map F4DEEF94 13962254 262144 898a616216f10393f021a857ddc2fc97c04bf4d8 halonet:boardingaction_grav_3.zip +boardingaction_grav_6.map F4DEEF94 13962961 262144 b669519b761bc9bbb045b0960373001dbd4ec0f8 halonet:boardingaction_grav_6.zip +boardingaction_pp edition.map 7E706156 16596760 262144 a5bb10f4666e763ad8360cae18ab829ee186315f halonet:boardingaction_pp edition.zip +boardingaction_rm.map F4DEEF94 313468872 262144 3599c31771f1f19064ab9ee876f8c3805e02f58c halonet:boardingaction_rm.zip +boardingaction_tmcc.map 82BA8990 39568804 262144 00636b3cf680ec294fdb8ded941f9dcf0a138170 halonet:boardingaction_tmcc.zip +boat_test4.map 878E5EC6 40964830 262144 2696cd334f60c3999127cec1d5a2616788d9b10f halonet:boat_test4.zip +bob_omb_battlefield.map 69179117 31973360 262144 15e348dc39a74aba3990c1f6cfe8862709872c37 halomaps:1328 +Bond-Girls-and-Goldeneye.map 00000000 90722080 262144 df71bec4f88d16ca510e58e103ee541a760507d7 halonet:Bond-Girls-and-Goldeneye.zip +Bond_James_Bond.map 3B947150 96729076 262144 377ad550217414ec75f3680d884233eb5f5be015 halonet:Bond_James_Bond.zip +Bongo-bong.map A13C6E3D 44300953 262144 2a69814b2bc8b4a9e6adc019b0b93c9ec270dbc8 halonet:Bongo-bong.zip +boogie.map FA158B24 28392732 262144 de7949f46acabb1603ef9cf78d7c16fc55e9ad84 halomaps:2830 +boomboom_example.map D4360395 14114864 262144 ea5e3537e0a4d19fb2f6b88a4a96f9acbba8b6d9 halomaps:2492 +boombox.map 2BF0DEEF 22622103 262144 846da7b84af1b3618b41c45a2719a98c081f8a26 halomaps:2168 +boomgauchos.map 9BAA8960 34728033 262144 2c60829acf2c2c58118ea2e9ee7cb4b1fa25b1c0 halomaps:3844 +boomgulch.map 83497AC7 24691452 262144 87d5767d91cb13e8c69917583dbbcbefb384820a halomaps:2677 +boostglush.map 7F15DB80 18699268 262144 23730bb444b8acde8be1b54497cbb877e1838818 halomaps:2678 +bootcamp.map 9863C75B 116059661 262144 3a80cb895ce95b44324819843877fce9af8c8265 halomaps:2786 +booty_butt.map 174DE061 36265362 262144 b077fbba785b14c97f78b7a928fa7b5736308937 halomaps:1865 +booty_butt2.map 70651154 76144576 262144 7f0bc237f2da3976248b6de23cb38bf48d0b8bd0 halomaps:2208 +booyam-beta.map 3425EF0E 104563099 262144 1ca69e5fa8318ac712b33f5cc38a454436a5b45b halonet:booyam-beta.zip +Booyam_Fixed.map 0120B8CE 269169491 262144 5bd6ff270b5768ee65be52efbaec1b6513de7b8f halonet:Booyam_Fixed.zip +bordingerra.map ED3F7871 54571426 262144 62e103a850496354d156526f1cac7b2fe5007ead halomaps:6319 +Borg_part1.map ABF97054 89008825 262144 46afeeb817767386d1656c0192cf6534a1bf60c1 halomaps:3045 +BornIA.map E10B1A27 237865491 262144 32cbfde98f8fd45c942c10297e2cd6e75941681b halonet:BornIA.zip +bosque_gulch.map 0E8BD120 56444304 262144 3c09068650c340da0b82308a3c1264b574b0d6e0 halomaps:6000 +boss_grounds.map DC069CC4 19658176 262144 002b111a075ca94b103b795efcf8d1cfa83ea157 halomaps:5220 +bot.map FF2A4207 86681629 262144 2e02bbb74ec45b7ee120114bd9d15ca654c1773a halomaps:6320 +bots_in_bloodgulchV1.map 7C588F76 106449060 262144 0fcded471c576402d5eb7a22250d774e9fd22ced halomaps:6672 +bounce_arena.map E7BFB8AD 14664140 262144 3a26dca3facf2ec4becff533a2cc64ac5e4398bd halomaps:4799 +bounce_arena_2.map 552CEDDB 42882724 262144 2cc1f3c77dfd55b47c9fcc02e7fe8a64f64c302d halonet:bounce_arena_2.zip +Bouncey.map 03A40643 139968501 262144 2d54fd700a27cb9a8b544294fd149dff707cea6c halomaps:7105 +bountyGulchTribute.map 9CC66912 26615172 262144 c456a83023f654e4f0eb9d363234749511016646 halonet:bountyGulchTribute.zip +bowling.map DB0DC4CE 14890540 262144 075d0f63ab7f3aff2267ea98811eee3a31881a29 halomaps:1866 +bowling1.map 55D11B75 14874224 262144 c6d326e7ddcdca876f6b2bd365a86f45585d185d halomaps:1867 +boxedin.map 4C5ABB62 12865936 262144 c6d0f53cdfbb920164d3168f02ea02959bb241fc halomaps:517 +BoxMap.map 1A0D0D35 13344796 262144 5844e5a2207b048c24ae522ea222d15a425020b7 halomaps:207 +boxx.map 0573288B 13580032 262144 a4b7d848c5209501447f906b415c2a1e4de61fb7 halomaps:1242 +brace.map EC0F207D 24716930 262144 df5a11a15b330b0ac62a2925a66997c285c02777 halomaps:2816 +bravo_base.map 67A57052 26209741 262144 4ff0905ebc340a4f1ad6c59d7b8722472bdf92ac halomaps:4677 +bravofix.map E13ED35E 14463368 262144 9b9ad5bbf4961512d1e1548d49ac28be25b37874 halomaps:5221 +brawl.map 6DD233FA 12958688 262144 ba5d34cc430fa485beea282115243ab29eb13686 halomaps:4594 +breach.map CC11B8B7 13061720 262144 53023e33dc0b3584e25a7f5026850704df81ae64 halomaps:2587 +breach_n_clear.map 376701C5 137950119 262144 20122d6afecf0749a6b2b2a8c67d65c5bd6636d2 halonet:breach_n_clear.zip +Breaking_Bad.map 75112A88 236617941 262144 0a43557d5d14f543842fc99e1d951b083dd29c4b halonet:Breaking_Bad.zip +Briar_Patch.map 0D12BB0A 385702778 262144 f3e0d5ea7fc923ba3d596d82278224983b9200cf halonet:Briar_Patch.zip +bridge.map 53C04443 15246124 262144 20833c05240e8557fb52c4206d888cdbde72f894 halomaps:501 +Bridge_crossing.map D2E56584 23202532 262144 5f0c3a84301af11a3064403ae0fdabffe1e21ca3 halomaps:975 +bridge_war.map 05724E1A 75993889 262144 c172b44b44bac280f75767d2e2e6f85b9680e2db halomaps:6425 +bridgebreach_weapons.map B4E6317D 82296155 262144 c1fb2b875def41c442963f5d4fedcd15fb9d8f9d halomaps:3695 +Bring-Out-Your-Dead.map 00000000 199493008 262144 708b9fdfa601d5b7332d37d0f3f6b26ffe85f0c2 halonet:Bring-Out-Your-Dead.zip +broadsword.map 97C34B4A 18004236 262144 b2be0f2ace9cb4f53ec370dfc0dec3d629229eca halomaps:295 +broadsword_race.map 8AF7D807 18422204 262144 1a81203827fb71556140ab774c370a84c3cc703b halomaps:5012 +Broken Bridge Final.map 6DC86E2D 38325277 262144 93699fa598c5eba1405ccbfd804fec5ab9524dba halomaps:1594 +Broken_bridge_alpha.map C28B588E 17038792 262144 b84394f545cbe366b009c69c087e07c40efa44fe halomaps:1558 +brokendawn.map EA1AEB75 75057698 262144 c883102c359794aacc020d37b0edc374c97b0887 halomaps:6822 +brokenrift.map 9919905D 23588500 262144 67f8c6267d8496e8345bf9dd1b3a6b690e9a9496 halomaps:452 +brulante-fin.map D9421321 225859391 262144 a2474aeb3635643c3b7ec276c8e8b9a0db1c1a11 halomaps:7094 +brumal.map 5821F586 21913084 262144 f2c9eac5efba321c0fbe279a829cc71052f620c7 halonet:brumal.zip +Brutality.map 20D4C91F 112094963 262144 a33aa5ae5edefc492192a69311b6f38918c64b41 halonet:Brutality.zip +Brute-special-ops_online-ai.map 40E70525 87873547 262144 bd48c345d3fdb389d0b84a8aa8c2261ad32d0ad7 halomaps:6249 +BSA121BETAv2.1.map 0232BE13 94848172 262144 265b042c884657ec236f5c0636c52a9b57c4c582 halomaps:5222 +BTC_gulch.map CAD5973A 48091907 262144 18d011c50eeb9bf588aee93966ff86713720b9b1 halomaps:2630 +BTC_hangemhigh.map 1BEF1AFE 15030086 262144 6076ecf16e0c1b958f78db82fa15486ab97785f7 halomaps:2679 +Bug_Canyon.map AB331D41 61828560 262144 396e5b5466cd104caa9dacce1c59b22e9e102251 halonet:Bug_Canyon.zip +Bug_Invasion.map 3FAC53A1 121444698 262144 bca45144b4dda36840334abc04a05d5cc708aba9 halonet:Bug_Invasion.zip +Bug_Invasion_2.map 2E645355 121456150 262144 59467c296848554d2236cdb73c1ba64525743c40 halonet:Bug_Invasion_2.zip +Bug_Winder.map 68C6B237 62216715 262144 0153f5b3aa8295f7557d018f1cb9aec05d30b702 halonet:Bug_Winder.zip +Bugs_Be_Gone.map 30BA7164 257585199 262144 9d97c1e32e9bdb3d276bd1dfeb78be9311f1badd halonet:Bugs_Be_Gone.zip +builtforspam.map C0BC380F 12892832 262144 039a9baa32dc32b42c2db1f7455bd643f13a3a37 halomaps:759 +buisness_center.map C65D4F46 173018565 262144 021e4f0322c7b6a3c446d4dd56681b1825a95294 halonet:buisness_center.zip +bumper-hog-BG.map A08A6892 13942904 262144 d418b2b1f8ccd7b27b5370dd1612bda5b4fa5bbd halomaps:3710 +bumper_cars.map 63F9A4CC 24331940 262144 30dabd467e2c04224d51031fa29f02902c5d9ddd halomaps:5011 +Bumper_Cars_V2.map 37FC641B 38579936 262144 235904b310b7782d1e5776a105082f19fe706946 halomaps:5557 +bumpyhills.map F0B28A9E 13699800 262144 e41f84fa66b5e9653b2a3721434a05d79652af10 halomaps:1715 +bune.map 21F06788 18796244 262144 e995469ab864886802168fded45015c59ee93e4b halomaps:3595 +bunker.map 9F89E989 13320140 262144 e1a33d6147bf11703901044d465e7a0f4bf716dc halomaps:853 +bunker_holdout.map 336B26E7 50574736 262144 2bcb46022b3171b66874e5f7e0e4b8b4ac85dc9d halomaps:5040 +Burial-mounds-forward-into-time.map 1EA80C0A 86979526 262144 4d2f40d58a062dd386baf12fb80d15131a598b5b halomaps:6268 +burial_mounds v1.map CAAE4BB7 129404285 262144 f1766d04350be1b23bc349093bf86b99d1627433 halomaps:6741 +burial_mounds_classic.map 23F62B4B 33526032 262144 b33782fc3fab4d3b3012310e9804ffd8ed8d5d3a halomaps:5145 +burialgrounds.map 91F7A674 15403516 262144 934be422104d2866beea39231c403d945ac6fbde halomaps:1503 +burialmounds.map 03D97D6C 48162491 262144 4d0227e5b7440b89d7cdb47dac5f89bbe632af36 halomaps:3062 +burialmounds_classic.map CEDCA076 27026844 262144 5955f08cb36ac68a7e937823074d4f96bd07708a halomaps:4858 +Burn_Notice.map C4E69DAA 132851812 262144 6c6816d4a083986aa16fcc32105ecccaa925a336 halonet:Burn_Notice.zip +burning_grave.map E5E3B8B7 28462660 262144 dd7aee6c9adce281f88c5ce3f850570a428c1b14 halomaps:3958 +Burning_Tower.map 2B2FA349 321044672 262144 e216fab8e21461a44c096410eec306b51aa0d1da halonet:Burning_Tower.zip +Burnout_v3.map F9466570 15839701 262144 de2867c47d1996b63357b4e2fc4a28b5cffa77aa halomaps:2543 +burnout_v4.map A8977B20 18992800 262144 d25f93592e41278f038ee0ad7a87a37d161d59e2 halomaps:2680 +burnside.map 9703175E 40662788 262144 756a9fda50aea0ebb4b3524242c02ab7b8aba380 halomaps:945 +buro2.map A652DFDD 17059456 262144 141829ec38855ecbb909652e4129f0c06359cbf0 halomaps:3679 +buryemlow.map 21B45467 68056116 262144 3383b0d97d2164ca26ce3fbc8aa8d065b9aae973 halomaps:1463 +bussacap.map 8E85CF35 56101373 262144 bd3dc59a2342613b7dc64e01f778dc1bdb023f2b halomaps:1960 +buster_rifle.map 53102620 14443336 262144 85fb4ac4894461b6f4e2ac8d79e01493f09e85ca halomaps:1750 +Butter.map 4B483FFD 81521417 262144 72fc6bccf49d5b545eae300d8907b431187205ff halonet:Butter.zip +bz2.map 2F3A1240 14388840 262144 ec296fb7f1fde8c90e09b3f5b8ac4959c8b85c18 halomaps:3394 +C-V-M_deltaruins.map AA81CA83 79944043 262144 54772cec73c0fedb4e8465477ce2d434ef70701e halomaps:6858 +C-V-M_gephyrophobia.map 995D3A20 70328345 262144 f13cf745f06fd55df655b47ed75e8a0a34cc845b halomaps:6859 +C-V-M_hangemhigh.map B41AB263 66882633 262144 7568b24cb0614ae4450605864ee69e398229d03d halomaps:6860 +C-V-M_snowcast.map 3D50B6C6 79821100 262144 29d1d1e1fff678175a0c0c04fdd7c3affeb8e630 halomaps:6779 +c10.map 3113B208 168096245 262144 f17b87f5bdec9fd3d6476acc234252d9e810a6e6 halomaps:6660 +c10_explosive_ahoy-multiplayer.map EFFC56EB 36057948 262144 7eb3d55f8f6754230185f3c96cc7050502cad191 halomaps:5731 +c10_explosive_ahoy-v2.map F3970288 159676523 262144 2b5eb9fba09f36036d42ed29f0d4925bbd6983b3 halomaps:5489 +c10_mp.map A5E11D3E 61036516 262144 ac3c721e05023179ae3976a8cb292adaf05e319a halomaps:3578 +c10STH_movie.map 72AE781B 119233132 262144 087a771e198a5845e3fa940b574b431f2cc8e97b halomaps:3395 +c10sth_movie2.map 0A2B33E3 111515374 262144 8547542443167e465bca6256a764bd351be5ad4d halomaps:3396 +c10sth_movie3.map 991C9C9E 116709236 262144 f6a86c28b65477e7fa1a9cfdfb5967d33bd4885b halomaps:3397 +c20.map 0311C340 137242427 262144 92f8daed0b007e63c168b56d5761464295a9f64a halomaps:6692 +c20_all_fl_mods.map 0C04158C 162467274 262144 093838039f0df658f86b0a16c733feb6f4853d77 halomaps:5575 +C3LL.map 24765428 21391109 262144 f63ac6825263c62ce84cb11365d4cc5a84ee8739 halomaps:629 +c40.map 1674F31C 160161132 262144 52e8993b03146700bfc930c73a91e7fa74017e67 halomaps:6832 +c40b_bs0.map FC0F942E 29241189 262144 ec2f4254ad6b0bf3b2b7ae838199e6d4747196b1 halomaps:2631 +c90.map 26F1F43D 114922786 262144 62dde03cbc1d8dbe299e41bf7aced362c382f2d2 halomaps:5417 +c_garden.map 58899430 14265750 262144 5c46b311ec2c24848bfde5e48851cbb84c96ff64 halomaps:4616 +C_INFIERNO_1.map 82ABDAB0 28305601 262144 5db4a5ffeb8a518013b5dca9fceec93a8dfa5847 halomaps:5089 +C_INFIERNO_2.map 81D0F23B 24103993 262144 03de95c699c91bd09801228e34a534d9b40b011b halomaps:5090 +C_INFIERNO_3.map 051A9ABD 25485085 262144 4b4f1adb30cdd792f46af301a321b0a1cd0b71e2 halomaps:5091 +C_V_M_FINAL.map 70467685 89520580 262144 fd39d4e060be543b0de4164730560bcd82509918 halomaps:2337 +cafeteria.map D72BAA18 15398132 262144 0fdf2eb1c6b33acc222b9c314679465e31a10104 halomaps:1193 +CalibrationX.map 2B8361CC 19224112 262144 febf93690c736fe2d235f8abf8cba62bdf289aee halomaps:1679 +Call_of_Duty_MW2-LVL5.map FC8C2B79 129672989 262144 a151ef1f5983c0bd500d16b462be3a790e7b394d halomaps:6017 +Call_Sign_Foehammer.map 028747BE 357331816 262144 e35e2c7d55d8a2f3ad241b4640ff4fa5a7000580 halonet:Call_Sign_Foehammer.zip +callofdutyworldatwar-L1.map 08F76867 68969545 262144 b40ebd307d58a85e086562c9ff3d9663cd11929f halomaps:4595 +callofdutyworldatwar-l2.map 2E0C90BF 101573324 262144 0e3b1418b6888a5afb8e4b9ea70b6e2effdb936b halomaps:4965 +camden_place.map 8E82B439 73573779 262144 a36ebb3c842b9e47583e37c0b6e4c33daede374f halomaps:6018 +camo.map 33AE279C 14995704 262144 38bee4a3ac8395734531cd3e95a121c505546430 halomaps:1464 +camoteam2.map 69D352EF 12474484 262144 1a8ee76c1f420a49e074975ab8b15a7ddc7a64fb halomaps:3398 +camp.map 4333588B 58467987 262144 8d070fd9341a57255c98ffce447f09ff7ce2c995 halomaps:5781 +campagne2.map 8996420E 113573254 262144 d24e309c789145e6b6b8ba2793f0b73583a55899 halomaps:5151 +campo.map 8DF84892 70096927 262144 7912b99894beb13c16982d5ff39a5c7a2f9081d9 halomaps:6061 +campo_(v2).map 07CE8F74 111509662 262144 2d1084f3134e0e52be075ab8eca844a44ea1b35c halomaps:6139 +Campo_de_batalla.map A6938775 114348009 262144 33b176585806d808aee9c945ca2065f22d73962c halomaps:6587 +Campo_de_Entrenamiento.map E37A77A7 385033214 262144 d560412dc8092e0e8bdce7fd174b15c3eeb5724d halonet:Campo_de_Entrenamiento.zip +Camtrack-Arena-FX.map B23900B3 17234964 262144 4d225a162a914b60794deda76b998c0112020f13 halomaps:1624 +Camtrack-Arena-FX02.map 5D703A74 26667080 262144 8b0a72ee0f693cac68bfb3fb8be684c5bbc7b152 halomaps:4463 +Camtrack-Arena-Race.map 34C34FD3 17282072 262144 7cc74f07c3be24e6cea5031a3d28db76136b52c0 halomaps:4318 +camtrack_INTENSE.map E844C834 117960033 262144 296b099d64f16f72df5697fa95b6e3bf144d1549 halomaps:4613 +CamtrackArena.map EA779F2E 16381776 262144 9e1cfe941e22309281bbc42e660488fae78dd18e halomaps:208 +camtrackarenafixed.map DADCD2F0 16400664 262144 a341ea294bc3b6b206899b2710847d475ffb78cc halomaps:4464 +cannonscore_beta.map 815DE6F2 14754040 262144 2052d7b27945ae54e215d8ae1f583dfeabf1ceed halomaps:1803 +canopy.map 7E706156 185439884 262144 dca12b8e1cc8be5a987234f2974d58004c42c520 halonet:canopy.zip +canyon1.map 4BDFFDDC 106433769 262144 38b6d8f1c2c1a62c91dc7708ba96add455f81807 halomaps:3746 +canyon117.map A4681E1B 12892788 262144 9ea8166a957ebf80b55fcebf558ec03e0597dd3d halomaps:2881 +canyon2.map 5D2F8AB6 50619075 262144 fc3450776462c1c18dbf41cbda3c43bffb4bc257 halomaps:3747 +canyon_assault.map 2F600E6F 49920368 262144 a116ba44a163a68a646183d6873e38e986cf6929 halomaps:3217 +canyon_beta.map 38C26106 15433928 262144 38a67ab75105a843344ba72234d456c7c0dafcff halomaps:863 +canyon_complex___ALPHA.map 332320DA 57345321 262144 c8136f67603da6720cc31672c95a098ae105ddd8 halomaps:6299 +Canyon_XY.map 556F0D42 13567084 262144 b646831865dd47a464e441caea75bce37f1782aa halomaps:4614 +canyonfever.map 20D31E9E 26749850 262144 59913ca644020d438bb94ce9fa73b268f7a7bb3c halomaps:2544 +CaosGulch!.map 6E844523 13510740 262144 cf26dcfff726c9aafc9579a035706a0033ee33d1 halomaps:3458 +CaosGulch2.map 7B309554 13936092 262144 b62d25088fe6c5066a88d42f4442caf2e78f3d49 halomaps:1696 +Capital_Plaza.map A7CB042D 28330682 262144 ac3ad9e9ed6ac07aa70f80b422f3356af2cc64a8 halonet:Capital_Plaza.zip +captus.map 427A8072 136778571 262144 c7bc4b0e69bad67ea6a811f1f5b4a41356d6d79a halomaps:4615 +carljohnsons.map D672F14E 43987108 262144 70e06a7238057384b6d93a57199d416154a887be halonet:carljohnsons.zip +carnage_springs.map 6139BA86 18225400 262144 24eadb3817228afbb6683af828f0792a9d12b841 halomaps:2762 +carnage_springsv2.map 697CAE34 16595977 262144 19dc4b3c522f1f82e457a764cee1ec8b8a35113f halomaps:2980 +carnagehills.map E5979528 14386476 262144 5e2e30bfe44d14dd4700d704efc9d0d1ad875141 halomaps:366 +carousel.map 9C301A08 12643728 262144 67556f9d81afd5171fb1ceb9248f46445705a7f9 halomaps:4775 +carousel_rm.map 9C301A08 294874784 262144 9d461e1dd63593acf08983685d2f079ae3275383 halonet:carousel_rm.zip +carousel_tmcc.map EE8C395C 35744004 262144 3ed84bd4285327242455238d3fa1cea5012bd5ff halonet:carousel_tmcc.zip +Cartographer.map DD0C01F8 117085059 262144 9fd51fcb49b59e42f50e84390dc32ca0a59a87aa halomaps:6089 +Cartographer_v3,1.map F5BB508E 64095994 262144 695ff5fd27031d14f03135219f14a82c98e1d106 halonet:Cartographer_v3,1.zip +Cartographer_v3,2.map 64066B54 100967635 262144 c1a0d547c7692a64165e8a9438d930baf3cc36ee halonet:Cartographer_v3,2.zip +Cartographer_v3,3.map 4224A2F8 100977215 262144 6beb8583e7f512b1b73c0e0dc658feb3fff693b7 halonet:Cartographer_v3,3.zip +cartographer_v4,0.map E76E9C66 216687691 262144 23c51d1c85cb06f6033020516fea78934360be53 halonet:cartographer_v4,0.zip +cartographer_v4,1.map 5D35563C 216688123 262144 482031463d6f57a5a303de773033061bfd160c10 halonet:cartographer_v4,1.zip +casdeltha.map 0070FD3F 86654917 262144 e51a83846a6b2cbdbb3eb7dfdaaba5fa4968882c halonet:casdeltha.zip +castle.map 5316B490 19363516 262144 eb99d45875a0385d7309446ac190cea1ef4a091e halomaps:947 +castle_blackpool.map 86FC06E8 24668912 262144 340851ce0a3648e58f572b9f4d54b73ff54c6de8 halomaps:1039 +castle_island.map 665B8C50 42433811 262144 bcdcebf27c32017ce03b118ed2a85a2b19c0cdb3 halomaps:4113 +Castle_Keep.map B6C8DB0A 332160401 262144 7c27e84272b8c650ce58cd8f05b606f88cc0461f halonet:Castle_Keep.zip +castle_mp.map 3099566B 43351319 262144 7cab98445c31ae05f1b48480763a126f615260fe halomaps:3873 +casualty_isle.map B94CC1EF 24453412 262144 59313e82e7a2e5d7338f75a0f477a6200fd7862b halomaps:1861 +casualty_isle__V2.map 3E4A68A7 23845152 262144 a1bd8ccb776a36307f4db7089edb0690b60f2576 halomaps:2545 +casualty_isle_classic.map D747A884 23124680 262144 cf7af3d59a1f2d7b451a71ea988c8ba0996d9d6f halonet:casualty_isle_classic.zip +casualty_isle_classic_fix.map 3D7C0A8D 22630344 262144 6c308903ddd914dea7ad95b9fc872dfb9a646882 halonet:casualty_isle_classic_fix.zip +casualtygorge.map 9016FA99 17928476 262144 31aaa5583024b0a642f7780069c86b4a9555c89b halomaps:182 +cat_cage.map C4A5DFD0 47228365 262144 7b7c181f5918a9f44cad4bbc2d1d77e96c170abb halonet:cat_cage.zip +cat_cage_final_beta_nov_2017.map D4A4AC64 54297548 262144 e39f8d9b9e26b28a07f240c2b1ad2f1384cff59c halonet:cat_cage_final_beta_nov_2017.zip +Cat_House.map CCC7C0C8 210467513 262144 3f7bdbd7230d465774a14ca08a1db46d252ecefe halonet:Cat_House.zip +Catacombs.map D94225B6 366681730 262144 02d30434f2fb7fe3d5e2ac035de7cc66b9ccebfc halonet:Catacombs.zip +cave.map CE179B66 14934652 262144 1173f285acbbdbf17a8a79cd9ce811edf8c4cb4c halomaps:359 +cave_madness.map 54FC655C 37858856 262144 6cdfdaa5ddd001e13ceb77e768988f7539cb4b2a halomaps:6229 +CB_beavercreek.map 0FAD46AA 16071868 262144 db691bffc4a992d7952040f51d63d3ee261eac7c halomaps:3009 +CB_bloodgulch.map 5FD5F228 22551370 262144 6ca86ce02adc54ed422833f3c9960d899224660f halomaps:2981 +CB_boardingaction.map 38B74351 24915542 262144 a0f77c57c781b343188c330b6534493f619c4a8f halomaps:3010 +CB_carousel.map 57ABCCEB 23462162 262144 080790b78f511a3219cf45add4e433c3bd05e019 halomaps:3011 +CB_chillout.map 34B545CE 24385318 262144 33979bae0234b336df983721e35e256304c5bce1 halomaps:3012 +CB_damnation.map D639817F 25644050 262144 dcd3bdb7553bbcb2b6fd8ab939ee74663718ea28 halomaps:3013 +CB_dangercanyon.map E5297342 26814114 262144 9f4ce26faac7e93abc060468539129d3de0482d6 halomaps:3014 +CB_deathisland.map E2A39B49 29816886 262144 3880ee8359d827983325e394beac326bbcd59540 halomaps:3015 +CB_gephyrophobia.map 75E4B042 27238146 262144 7e525ac68c56d1586bc09b0b2cc53f7c5e20fdac halomaps:3016 +CB_hangemhigh.map 2D62D1BA 24391922 262144 f2764a96bac5326d3a50d5bc68f3b32714cafa27 halomaps:3017 +CB_icefields.map 9AE58C68 27513474 262144 d0bf225d48392dfb3fb7321ba049a12be95c857d halomaps:3018 +CB_infinity.map 0527749D 33723846 262144 70f04a44b656339606e55a222f1e79525d54cb0b halomaps:3019 +CB_longest.map 9EE20A59 24180118 262144 2305c11ee59d40b01fea995c60f8f4490cd7efe9 halomaps:3020 +CB_prisoner.map DC9EAEAF 24113230 262144 10a60bbe4cd5b33659483e57a2a9e446850bed18 halomaps:3021 +CB_putput.map 87B1B121 25832390 262144 b771f7951c51c0b1ada52d001b1997239a52fc88 halomaps:3022 +CB_ratrace.map 71CE0CA8 19554690 262144 93954f3e2c3f8b37f1abd3e761409e33bd2bd86c halomaps:3023 +CB_sidewinder.map 5EEE8D44 26499886 262144 80633b4079ef5f2177a0f5841f23c2389227222c halomaps:3024 +CB_timberland.map 38E49101 26343478 262144 810d13cc9fecf331f057bd58c7dbd9370492a345 halomaps:3025 +CB_wizard.map FD86606E 24387422 262144 366d71f460425d6d9385d936b0db3361b229d6be halomaps:3026 +CB_Yoyorast_Island.map 337601BD 42009526 262144 b2d55d501bb6d5a402c879dd4f5bda41dc0b5524 halomaps:3027 +ccf.map F97A5DCB 22426297 262144 697ed378dac79d060397789d42f83b0ab829d4ba halomaps:1090 +CE3_Stages.map CAB57C13 91296991 262144 327e95a0d61504f5b48fc2b0d4b90db2788621b0 halonet:CE3_Stages.zip +ce3_stages_0.7.map 79DB03EC 89456556 262144 bf459e4a506706e782b1f4acf38908fe3dd3bddd halonet:ce3_stages_0.7.zip +Ceaseless.map 9B6F6DF0 13797345 262144 bc03d367d9baf72d0b0a33a06ff2e99bf193cebc halomaps:1903 +Cel-BloodGulch.map CD7A5ADD 35057812 262144 add3fcaa3880af389a47232adbf72f782ffcb5fb halomaps:1879 +celebration_island.map 0935BD1A 129319491 262144 4a5ebcd92b42e02eded2aa269e9c85e40667cfec halomaps:5742 +celer_exile.map FF720227 167080250 262144 63d04a94e84af511c276b116b17b6b7a6df25bd5 halomaps:6005 +celer_exile_odst.map C6513835 163836310 262144 7548935084eeadb90bac69025576dea7d3ca61cc halomaps:6006 +cell.map 83365673 20948708 262144 aff119fc07c05af06813eecb407711ee8a8eb1bf halomaps:471 +cell2.map F929B31C 20924440 262144 fa6d1ef850939963aca3ac024eba9a636ac287a9 halomaps:571 +cenotaph_beta.map 62FAA10C 17679652 262144 fb42f0d34e9823bb4cd7a7ead6a7eeee579ff40f halonet:cenotaph_beta.zip +cenotaph_beta2.map 84739E4D 17569168 262144 6711ebd677c16fed9b6d82284ae3b76bf2658e57 halonet:cenotaph_beta2.zip +cenotaph_beta3.map E7A40D21 18056928 262144 0241f1fb14ae990bfa454dc4c8b34bbbd19d4849 halonet:cenotaph_beta3.zip +cenotaph_beta5.map BBFAED57 19513584 262144 96ef040a2e28f1eaf87589f8d3ada0457a5a2f83 halonet:cenotaph_beta5.zip +cenotaph_ce32016.map 56D2D140 19752156 262144 94259541120a387856ef7634ee03754d5bec62d4 halonet:cenotaph_ce32016.zip +Centaur.map 625F4A7B 27146584 262144 a187c8250e208e9c106037ffc9bf5b2893fa577f halomaps:1201 +Centaur_Fixed.map 46CFF32B 294508279 262144 78463ad96f3a02bc3661e8b31faedb98dcdba483 halonet:Centaur_Fixed.zip +Centre_Controle.map C79AE5CA 30212731 262144 a5ecd1bee8451a03e115a1ec263df09841ee5665 halomaps:7018 +centre_flood.map DB75BFAE 23920126 262144 f3830af46038514f1fef2152c54c7908a1503e63 halomaps:5000 +centro_de_nave.map 581DBA86 70185880 262144 0cf8a34cfd39c49ff3ee37681e34023443489af4 halomaps:7082 +cerazine.map 05A099E4 126519714 262144 0b30956bae233a1952e3cc90f6e5ac79ec807743 halomaps:6368 +cerazine_v2.map 377B9EBE 133037359 262144 2221dc76139386bdcad5b2eb097f8524453d3e9e halomaps:6473 +Ceti_Alpha.map 9D38DBD9 220890163 262144 eb10c19242ccb82f4050d702a26ca8c92e4df801 halonet:Ceti_Alpha.zip +cgpb1-10rc5.map A43B9BF0 112026221 262144 d15a19263110f4752be0dcf3606a102d13da723a halonet:cgpb1-10rc5.zip +cgpb1-5.map 93D1B672 102376143 262144 9f917819ece94cdfd8351c83cc5586f4f260d233 halonet:cgpb1-5.zip +cgpb1-8ce3.map 26BDABAB 110548097 262144 409415331cc0894c84a877245635adf93cc6bd52 halonet:cgpb1-8ce3.zip +cgpb1.map 6F0161C1 82556189 262144 3dc7d9617de7a659b43eef838710f4c2ceb71379 halonet:cgpb1.zip +CH3MT_Bloodgulch.map 2BD5521C 20299456 262144 2c5bcb9f4e5543538d77b2501ffb7ad446c28dab halomaps:3477 +chainguntest heavy weps.map FC7F7328 18276588 262144 320fcda60dd4a742173eb7062a5b52175fc61339 halomaps:3139 +chainspawning_test.map 4380F364 15945322 262144 1477c1b8d5d750cbeee9471fbf4968c65e2a3e9a halomaps:1948 +chamber.map E457CA7C 13144020 262144 90c48b8049a0cd19b4a5a74a0550f544b427741a halomaps:2726 +changemhigh2.map 46A66541 307141770 262144 466aaaebae626c7025ef644c5739230258fbc570 halonet:changemhigh2.zip +chaoillusion_beta.map 125DB304 15244636 262144 982aaaeaccdcedd87b249ec5552d9e04122b69e0 halomaps:1793 +chaoriders.map F1FE49E2 17625028 262144 e80f2d3deb642a5afa8e57a02750e7fa1b264c97 halomaps:4710 +chaos.map 1D1DFE4A 16761956 262144 2e80d3c1f68496b0a4b181c3ec7857d9ccedfae7 halomaps:211 +Chaos_Canyonv2.map C410CD74 15165396 262144 c0ec7418a62a3543a3de3ad552d5d9e45cdd1b3f halomaps:1113 +Chaos_School.map 38725220 51731278 262144 cddc9794df8c1e1772cdd473a5bb2fc37359cbc7 halomaps:2834 +chaos_zanzibar.map 6A8DA14F 68414258 262144 57802c8d60a75fd249f2ccadc6ad8feb4c3c5f41 halomaps:1114 +chaosanctuary_beta.map CB7092C7 13072196 262144 f433e1d3365fe8804f47c679911a695694d9adfc halomaps:1804 +ChaosCanyon.map 3BC48D14 16311398 262144 d6b4cf2a51f2ba41dd951b2edc489bcf4b3854b9 halomaps:3459 +ChaosCreek.map E123400B 20810184 262144 9506949e5ba28e1d2891c2a3719db3c10eae5a91 halomaps:3505 +ChaosGulch.map 7B309554 13936092 262144 30975bdfca90cdb1303aa9007421becfc01d4c0d halomaps:955 +ChaosGulch_by_MohamadV2.map B37BC6BF 17322192 262144 5067cc0884e16aa50be28cf36df0cd710bc0938f halomaps:3494 +ChaosGulchv2.map 85D2A6A4 13552868 262144 74d383f1636ccb6436297df16e2bc8145416b69e halomaps:2787 +ChaosGulchV3!!!.map FF4D38F8 15149026 262144 ac68fde71bee6aac2d43f56963c926d6f613325d halomaps:3460 +ChaosGulchV4!!!.map 60FDEF19 13559896 262144 0e055d497145189ef2d0dd95b9d884e4d8e47294 halomaps:3461 +ChaosGulchV5!!!.map B11E8AF1 13549680 262144 208e69dcb466a26d8d85e0beab173be139ce16e0 halomaps:3462 +ChaosHangV1.00.map 93C7C02B 13301666 262144 9d68449c4d2ddca9c0f2480352af69741c260e81 halomaps:3463 +ChaosHangV2.00.map 8748E6C4 13300830 262144 de9b498ee9cde3337f05278134e012e1a074b1a3 halomaps:3464 +ChaosHangV3.00.map 91A9CC7D 13301326 262144 6d0e27b35affee319b6d607f469e249f85fe90b7 halomaps:3465 +ChaosHangV4.00.map E7903EB6 14258566 262144 6c852acc5b78da1cabf08437f5c687770713d3f0 halomaps:3466 +ChaosHigh.map A7C8B9C6 12727888 262144 e8d70731ba23eeeb8663d4ca226d6d43268d8b24 halomaps:1102 +Chaosity.map 0E7F7FE7 18330556 262144 7bce864687318389468acc8f64f0d1cbe890e17c halomaps:1112 +ChaosLand.map 54446470 14690920 262144 9e37830aa0aa8564056061b6cab20f6c6f535065 halomaps:1103 +ChaosPhobia.map D2872165 15579312 262144 e928d088f7d2d43157feabd44e4c2785a62fe5b9 halomaps:1104 +chaosticgulch.map 0DB02038 14652172 262144 16d8b4739d74022bc0b4161cc033d336b85f717e halomaps:4190 +ChaosWinder.map BD95CF55 14840596 262144 93651bfbb81be4768e7b8ba40b04333712679142 halomaps:1105 +ChaosWorldGulch.map 2650AA6F 17253620 262144 07bc58d80b07c759c4e83f5592e79f27154df549 halomaps:3495 +Chaos forest.map C1A8EB4F 75314500 262144 08c644dc5859fa1cea6aaf0028ccbdbe7f9f7f85 halomaps:2965 +chargebeta.map BABB21E1 13601216 262144 426062b3af831cd5438a12ead3ce3b8671719ecd halomaps:3845 +chase.map 783415A3 125268379 262144 341920673da5e12894f070925016afffbaa06866 halonet:chase.zip +chasm_wars.map EFF6B9C4 58304768 262144 c4503570a34d58a1c46dddd896cb572f7e461d47 halomaps:3404 +chasm_wars_beta_2.map 72293D2E 53674389 262144 991bf916206fbd9ebaa2f0790ace2d4bcb71a2ad halomaps:3427 +chasm_wars_pb3.map D08BFC73 65833420 262144 ba0ccb9b4576002de15b537fb6ff8b3c4fba7627 halomaps:3440 +Checkers.map 3C3F899F 24793914 262144 f73f7de08d6751dd1a5f9f2f120ea34605c9ea3f halomaps:3381 +chibby.map 6663CFE8 14270296 262144 b371176b1b8cace43f29f4f30bd76663de8d01d0 halomaps:367 +Chica_Desnuda.map 00000000 229740284 262144 0a0c565af6f68de7d63ee33df53b7dd69cac0e4c halonet:Chica_Desnuda.zip +chicha2.map AC67E73A 26912388 262144 69ac2c476c42674d45ea85951f25d443fc7bc70c halomaps:4898 +chido.map 6EA7BB32 21203885 262144 d5e30ff83aff43ae1b1a1a48ecb29e24bd05159f halomaps:3910 +Chill_Zone.map FB2B2065 38204589 262144 d143a2e63d48711b5c9800861481c26f1fbd32dd halomaps:4763 +chiller.map 69AE9AC6 18224248 262144 a2dfd1c6fec743f9286b3a50a8b395aca944b3d0 halomaps:1723 +chillin.map 5B98A47C 105162051 262144 dffa2ff732cd9bc389c1b57ed76f9896b240e09e halomaps:6452 +Chillout-Wesker_Edition.map BDAED333 20544144 262144 ab32ff2ddf7938e9443a3e218a0a09c9b2b4d95d halomaps:5223 +chillout.map 93C53C27 12721124 262144 e1801d7f22f522509ffe29619f5c8e9227f50f43 halomaps:4776 +chillout_infected.map 6B026917 29487628 262144 fc3c379da1b45583566ba1f459d605cf7d3fd042 halomaps:3631 +chillout_pp edition.map 7E706156 15367388 262144 72cb3a65fc2c9aead5761e32354f2fe2bb821922 halonet:chillout_pp edition.zip +chillout_rm.map 93C53C27 296933144 262144 c4c050dba7544fe18b15a398cf53786548a5f45d halonet:chillout_rm.zip +chillout_tmcc.map 984E6E43 36493280 262144 ba8a8bc7af1686356a94dce93f03ef480560b47c halonet:chillout_tmcc.zip +chimberland.map A02A11BB 15626726 262144 1de943ce3df7240c637ebde63d07e78a2aa5be0e halomaps:3696 +chiron-md69.map E47884DF 15098544 262144 8b43b0a2ab657953324703ea9e04c342ce19decc halonet:chiron-md69.zip +choke_point.map FC18D8A0 131981233 262144 23bf86d23024fb8c23ff70e513aa5e92a0c41ab5 halonet:choke_point.zip +chopchop.map 789AE7D7 17927173 262144 81485ff7d85c2ca0509819186cc8064ae7f7ef8b halomaps:889 +Chorizo.map 00000000 108177225 262144 e60aa203b24025a795274514864f3cef425f44d3 halonet:Chorizo.zip +chosen-path.map 71635B59 75795759 262144 2e055def96e0a3bea1696839c7032e725c43d596 halomaps:1577 +chozo.map 9B8389D8 57286312 262144 5426960de6e6d024c479e73e24c29b11204d6158 halomaps:1923 +Chris - Haloball.map 4EEAEC85 59374952 262144 381b2c826e4f62b154316289538d2273c29f51fb halomaps:5959 +Chris - High Tide.map 6510B0F3 49921464 262144 29c98623b8a8bf74293ea6b9726fedcef2e0f568 halomaps:4668 +christmas_halo.map C387DCFD 35153968 262144 481008b8035c09b800d7641b497ce34ddd0597c4 halomaps:3399 +christmas_halo_remix.map 407B72EF 32532699 262144 3157b43bbd76ea5029b6b040bc86c51a73b25ce9 halomaps:4227 +Christmas_yoyorast_island_alpha.map 0BC62453 89643097 262144 77f30e29ce49d0798b5047fa47a4eb31bae22006 halomaps:4319 +Christmas_yoyorast_island_beta.map 9295313E 90909265 262144 200c43eaab8594441f55135de32e522a445681e1 halomaps:4275 +Christmas_yoyorast_island_final.map BCBD8E5E 40346014 262144 2b3b44e705727a05a8999947034bc4914a37acdf halomaps:4596 +chronic_response_beta.map BB7CE2B1 66621022 262144 9680213f912e3c0bd414361d1f8a3d420817bd98 halomaps:5587 +chronic_response_beta_v1.map 7E4C686B 98105584 262144 9f4a3d1be72a7ab73bb0fa18d9eaaf4ad7281b30 halomaps:5605 +chronopolis rpg marine version7.map CCCC310B 134165590 262144 ead06a7de59eac7e0923f9f9e0585be95a88621d halonet:chronopolis rpg marine version7.zip +chronopolis rpg marine version8.map BC062C2D 131805698 262144 ceb846719d9a0ebda5361ede82e5d90c8086b375 halonet:chronopolis rpg marine version8.zip +chronopolis-firefight.map F07FCBBF 291577753 262144 e8d6f9e3f7245dc9f9debf6d29e96e661a0e52e1 halomaps:6861 +Chronopolis_C3_Public_Beta0.2.map 99B2DC47 44628424 262144 4b5bf8ec81ef845d38f9b0bf0019a552091ebe56 halomaps:1625 +chronopolis_c3_public_beta0.3.map ED0B8005 51009548 262144 ace7ecb9e013654f5222a3738141b007c25b9da8 halomaps:3527 +Chronopolis_C3_Public_Beta0.4.map 0123612A 91519172 262144 e3278ebda552545be8d68cfd26b57622d7cc5dee halomaps:6917 +Chronopolis_C3_Public_Beta0.5.map 2DEF3591 92185640 262144 c34a5ad9a331b68f10c38f5c2d1bba4f35d693c9 halomaps:6918 +Chronopolis_C3_Public_Beta0.6.map 08F500C7 91517160 262144 3b767e4b4a755c580f54462713d689500b8d7bc3 halomaps:6919 +Chronopolis_C3_Public_Beta0.7.map AEA43964 93098948 262144 3663ab22920f4da6a79b03f496e2d99e9b5634f8 halomaps:6920 +Chronopolis_Mod.map 7233D85D 47128404 262144 0bb7f4e5b3a3ece926b135c10bdd63be4e190b9e halomaps:3605 +Chronopolis_Mod_2.map 332B5123 47985940 262144 cefa0f010940ec0cc99d5b5bef00e9f8400b1749 halomaps:3657 +CHT's_Coagulation_mod.map D851650D 79992206 262144 2e924a8e076f7ee4cb638b74be3730680fa6c2f3 halomaps:3496 +CHT_Coagulation_PB2.map 2C8C22BB 85386407 262144 d8f218f35d69e1b19589f68aecc69127d569b9e1 halomaps:3528 +church.map C06014ED 132237945 262144 f02d7443b4709af17cb09328b3ee15ed1cb33c39 halomaps:3135 +ChutesAndLadders.map 171FB0E1 12508528 262144 988b945157529a6d21b52d6394e039a16b845a36 halomaps:296 +circlepit.map C144BB3A 14490412 262144 0fa9a65fecc66fd4a725d0b73eebbc5d2cfa1d42 halomaps:3289 +circumference.map A09C633B 17231298 262144 9ee3decf13a2bafc4b2857435839f15bdd2116ac halomaps:2835 +citohiger.map 3E863EC3 119220350 262144 0e5e1f8d06ede85aaab8b1a39f10817a0c6e4fa1 halomaps:4666 +citohigher_helljumpers.map 37DB5F98 83167810 262144 1cc5f6fc418a2d263e6d868f1cc8ad672f283339 halomaps:4711 +citta.map 9BCED4DD 25223200 262144 1ed941e54369291a1f03b033ab935e0a692c5f42 halomaps:3529 +city-assault.map D56706F4 16524272 262144 e9f3ffba36addce29f9d900f03b3a1a52a5b774f halomaps:523 +city.map 5E4AB205 16770008 262144 a8e3b17d7204cb41fe3cfe6d8f7180b911281667 halomaps:212 +city2000.map 864E0082 71309390 262144 ed60fb4e5621454a6c50bbd4e965aacb41cbff42 halomaps:2788 +city2001.map C08CFEC1 77629381 262144 27bdc23b02dd482d8498ff6ff9c3c9e6cd02fcfd halomaps:3163 +city2001_v2.map 70970818 54242409 262144 cf472460fab1eba05bfb6936eb334e6eda0917d6 halonet:city2001_v2.zip +city2002.map 3DCF4D52 29583092 262144 30cdba68a0a45508b305be682383d60ad6a546d6 halomaps:3313 +city2010.map D109778C 67057426 262144 9683dfb4c7b736e1f57724b3eca4ea5f265a1466 halomaps:5368 +City_17.map 1F36B6A4 73035452 262144 517399f66a7ed3859df86d24807f7d3b5e2d7a12 halomaps:2681 +City_Dweller.map 5203398F 325237456 262144 76f9c9cf1ef9e881facc229885b676fbf6432d08 halonet:City_Dweller.zip +city_race.map F9672E2F 21124136 262144 33d7a9c9fa5d2c78e598b56aa2f0b9a4d7011a87 halomaps:3988 +Citygulch-online.map C4FD2F21 36504383 262144 73e80650d07ad2410fa26b729425a4bf573b9dcc halomaps:6269 +Citygulch.map 6A95022B 35148863 262144 03cfbbc68ffae8baf80c8d3eff16e6e653f4ea6c halomaps:6998 +Citygulch_Night.map CE4F038D 33569131 262144 e1c2ebeed65cd4537223e45cbdb7155d3e29480e halomaps:6958 +Citygulch_Space.map 490976C2 33566671 262144 0e8aa842094513b3d0b35b88264f046ad086177b halomaps:6999 +Citygulch_Storm.map 7D8EDD94 53497527 262144 abe53f10a4837d671d6bf4a2b03899f733bc1753 halomaps:6959 +Citygulch_Stormv2.map 7BC64FE2 58041519 262144 14a91b8f53dfa6084dd37d106d9d29bae7986298 halomaps:6960 +Citygulch_Stormv3.map 9EC00010 41310831 262144 30ba693e85816888d12732ff6c09341c28577e22 halomaps:6961 +Citygulch_Stormv4.map D2F237FA 40377887 262144 b91f1ee88e6467f5e63c12d79a17d8010c3c0fb7 halomaps:6962 +Citygulch_v2.map CAEB403D 33574087 262144 16f5d82be50a9707458957711686dbe2602b22fa halomaps:6963 +Cityscape-Adrenaline.map 866451D1 63886062 262144 2644cffff3d623ab1c766c92c5001beac27fcd4a halomaps:2836 +cityscape-beta.v1.map BEB5061D 64169693 262144 8caceb7c0d6ac7ff051b20804f3d11824d856df9 halomaps:4932 +cityscape-classic.map A9D12EC7 53946405 262144 b9b5bf662a09fc05e37f85e1bc9236cef132bd54 halomaps:1949 +CityScape_beta.map CF4C1608 27265060 262144 42712d9b38240fad65bc9438bda39c33c860d9d9 halomaps:910 +ciudad.map 2CBCE718 79713061 262144 6e93ba4dc656bc01b05f208a661c52c8f000732f halomaps:6733 +Ciudad_del_Diablo.map 3FCAC7B1 119147789 262144 941ead85fffa78031c87f39c31d32201b57e6709 halonet:Ciudad_del_Diablo.zip +ClamDan Arena.map 20633D40 23585348 262144 890e34116e795ec8ab5849d443520b82b620f17a halomaps:3080 +Clan@Reach.map F810C7F2 178767274 262144 2526f309871f9a90b6e8fda6d12d9cbb45bc6357 halomaps:6570 +clan[h3m]_stronghold.map 296F3276 190293628 262144 c79fcb7cb46ee6ce7b5bf89cca6fdde4c6b3f1e5 halomaps:5667 +clantss.map 6D8125BD 35148491 262144 7c45d550316a37b15ccf39ec3797b12b2ee23ed9 halomaps:6515 +clanxd.map 58DF51A3 27283823 262144 b070a30d483143c4c679663d678da0cec5cfcd89 halomaps:4764 +Clarity.map 628A481F 182193117 262144 aab7819281a9be2d03aa64da4f466ba059f25581 halonet:Clarity.zip +Classic Coagulation.map CB4C70D9 33348228 262144 299fac8cf0cdb57154b21b545751b444bd882f75 halomaps:1261 +claustrophobia.map E53E8329 28428040 262144 22303f64f10d7920d1029cbdf0b46aa2b0f8196c halomaps:213 +Claustrophobia2.map 2200E649 30412545 262144 3869dc604356361aa429d46c9c0e1c4758a1a0ad halomaps:620 +claustrophobia_tourney.map AFD673FF 44029569 262144 86ed6127e7703678e41b6078a255d063193fc848 halomaps:2508 +cleanup.map 6C10A0C4 107084270 262144 6a01a7e3b41a4b909dec737bf44c494925de8514 halomaps:2318 +clicksion.map 52DF407B 16492984 262144 56f756424f4e16ad74845fa63f77a0ee80b9f924 halomaps:1293 +cliff_shrine_beta.map 1ED56ABB 19170663 262144 050942338c8a516ebaca83fe9e97f40f50fcc904 halomaps:6673 +Cliffedge.map 4563DA45 41256296 262144 fe627d4188f74599beffeb4e2513df3de586be7e halomaps:2599 +cliffhanger.map F27650B1 27242431 262144 016f292deb802e00eb68202b693ef100431f69be halomaps:4298 +cliffhanging.map FFCA822E 100207904 262144 a393dad1f2de00581d86d1088e96bd22ec9218b3 halomaps:6823 +cliffrun.map A0A307CE 25739536 262144 b7e3f4d2de7a1bb8662a126f7e730bf061331137 halomaps:2600 +cliffs_to_win.map 4A759B85 40780666 262144 7837040adc456c1957ad24bceb32851acfa09a93 halomaps:4151 +cliffside.map 227F340C 15205504 262144 74b9a0d30b5ef496a99542f42499680afc50ae08 halomaps:3665 +Cliffzone.map EEBF938E 19081020 262144 9a7180113295683eb3d24dff9f7f248621b0b283 halomaps:4652 +cloneisland-waterday.map 48CA82BF 110756313 262144 b6ad5e23b593c6458615e78501f433e7cba573ba halomaps:4653 +cloneisland.map 81B41F88 49071516 262144 50063f7e2c032645e6db26e17d54bbf3d6e32472 halomaps:4633 +closecall.map 593C1555 14411816 262144 2f3dbf16b46b3943e498394a80be5a5b0248d26e halomaps:1794 +CloseOut.map 2874C3CE 74921786 262144 a2fcbd3211ab708b642e8186e10a0493bf1cf418 halomaps:4141 +club.map 64ED0C56 21565928 262144 84d57d9cde13393cb094938ad0f2ea2a93fb70b1 halomaps:4933 +CMO-Anniversary.map 1F36F404 223740110 262144 13638b9d569fc5fd6720d9c4883d45a288b1ef50 halomaps:6964 +cmt-like-grove-v2.map 179F233D 78410964 262144 335c72504c773c384cd67b880d6d0d314bc7cbc0 halomaps:4800 +cmt-like-grove.map 843E4F5F 73916519 262144 db0e2d6e85a572ccdc36a6e0340766802803fe72 halomaps:4765 +cmt_abandonedm.map 107E00CA 116779723 262144 19d07fcbc0057fdeb8ed6cc79cedf56fa7f1b0b7 halomaps:5303 +cmt_cliffrun.map F4A044B2 58477126 262144 57a904710e984cdcbb00c86cd0501e015b8fdee6 halomaps:5305 +CMT_Coagulation_CE.map E33F6E9D 106980679 262144 871ccba2ef65ada163a70ef4221952b2074dfc96 halomaps:2380 +CMT_Dissolusion.map 3CF5626D 109112718 262144 f2748d4514b0a8a22f7dd63c13511d41f99753ef halomaps:2381 +cmt_fragment.map 744E8271 119007719 262144 270ea5b053b6631352856c0fa3241b17cfffa32a halomaps:2382 +CMT_Fragment_v3.map 711614DD 134231471 262144 643c2dc79f60f0a887f380b9700b859e73861954 halomaps:7050 +CMT_G3_Augur.map 3BD61619 117710431 262144 ee86c69b9ae72930cb4ea89d49b473d7d925c088 halomaps:5398 +CMT_G3_MouseTrap.map 6EAF54E2 122298965 262144 0548ccc2a7b2be1adc6a7120d5b323f8338bfc64 halomaps:5399 +CMT_G3_Ruins.map 337F71A0 107882049 262144 986f695a12e1a048306117b843da5b6cf0bb4d5d halomaps:5400 +CMT_G3_Tags.map 03059AB8 95226685 262144 08cca7e9e1aa748b540cdd856685b402c1861ff2 halomaps:5388 +CMT_G3_Vestigial.map F4CA2A51 109628813 262144 a9c177c3408dde6b230a6ce7524363c0fddde053 halomaps:5401 +cmt_icy_swamps.map 4179839B 103153079 262144 1f594ac7a162a7f0ae825c3478aee234b4a9df2b halomaps:2383 +CMT_Iron_Tomb.map 6DB70AA5 122133806 262144 41d1f66b0f3d05f44cfb6c8fff232e8286ac798a halomaps:5306 +CMT_Ivory_Tower.map FE5C5F2B 90310248 262144 95a0bcf0701d061b73b1716f09281657fed627aa halomaps:5307 +CMT_JungleWarfare.map 8D0B964C 77168217 262144 08993810fdec25a06341878a1af40a9e768efc61 halomaps:5308 +cmt_rc1_grove.map B0F0A97F 124867621 262144 bdb4f19c9a7923667a1a1ca6610816d61ef978d4 halomaps:3911 +Cmt_RC3B_fragment.map 399E102F 133217418 262144 efe8cfbe259516752e937c32e9e16fac2ff105c3 halomaps:2336 +cmt_Snow_Grove.map 61B1C859 131301829 262144 7b068068e7565aa224e2ce4cc35972a62d2eec05 halomaps:2731 +cmt_snow_grove_v2.map 1F5C029A 133600509 262144 c32875f259438e6f0a1d41e57f6cc4a62a66798c halomaps:5001 +CMT_Snowtorn_Cove.map 9A74CA13 130199020 262144 740ccf5697e91c30cb55dc5192432a2a9ade46a0 halomaps:5309 +cmt_tags_unplayable.map CD04CDD2 269208574 262144 7afaf50a98dc0147737341329ab61ed84a52cf3c halomaps:5144 +cmt_tensity.map 5BB7D2F7 111352197 262144 7b15f00d510028a799acb588e4b7280ac36085ac halomaps:2734 +CMT_V2_Dissolution.map E540BF18 125764878 262144 93f670a83e3605e815cc1b71f310730d659419e3 halomaps:2735 +cmt_v2_fragment.map 711614DD 134149182 262144 1e20818d753b6b16e47b1ee4675e907224a0b17d halomaps:2732 +cmt_vestige.map 58DCE25B 105387659 262144 dae4e8fd1b5ff5532d15a82256e14e680e69103c halomaps:5310 +CnR_Island.map 1383F990 58294150 262144 380333b314ec3b48ec1791b7c846ee6f302defe8 halomaps:5003 +co2-plus.map 1257CDC1 114610523 262144 40c25f973e114eae2f871724da6280851557ab74 halonet:co2-plus.zip +CO_Challenge01.map 5A421BF4 29729529 262144 cd730cc9520f9e7d2bf0e5ce0935b9edff55f98d halomaps:6141 +coag.map 6D18623B 290241795 262144 ae1e939339986c7fc7f9bdb6a9344e4b6512073b halonet:coag.zip +coagul.map 15ECC930 144410444 262144 88910658a92e4eb97b40d10a8d1493de0b8e9d90 halonet:coagul.zip +coagulation-hce.map AEC1ECC8 57758575 262144 ffa9e3d3d4d83d79c9660536f506cd2ca2befa9c halomaps:3400 +Coagulation_Gulch-Final.map D2A732C5 41793470 262144 097aa84f9dcbb2497ef5c63e654496f23de3ba5c halomaps:1860 +coagulation_gulch.map 7FBAB407 42978280 262144 246449c80f5d1082b41690f2137ce84070978b0e halomaps:1824 +coagulation_gulch_fixed.map 87C9FDC2 41172746 262144 fce36326e4b49bde9cc4e1595342980f4cb869dd halomaps:1845 +coagulation_ver3.map 00000000 250295976 262144 94dca0dd76a2152ed50160999191e01bd7cafe9b halonet:coagulation_ver3.zip +CoagulationAIbeta.map 8B284FE0 21883836 262144 1436961abad4346be1e7958c8fd47542a7a03b50 halomaps:1559 +coagulationheltdark.map A199B8CB 196341169 262144 7121f7634eb84aed46d2803c80d3aec49921f3fe halomaps:6090 +coalition.map DAF67D22 14981040 262144 9ef0faca1ee27e3bdf631be31268ebe69404dd4f halomaps:1067 +coastal_canyon-2.0.map 3FE30637 90898079 262144 b0b82291b784a72239eebbe53c5ca7152572d7b7 halomaps:6388 +cod.map 2234E5E4 45485211 262144 e717b216528db0ef1bb29edacb576068530ffe4e halomaps:5588 +codenamedrain.map C22B3F74 12828700 262144 38c3ecb9e3b1d848a597eb2d2ec0774092ee7972 halomaps:2982 +codeshafts_map.map 7158766F 27952723 262144 007a5e0ea5b5c15b52d7af99617b56d513249c52 halomaps:4580 +codmw2-lvl5-beta.map C8B4A1E2 120557776 262144 565d4fc31659cf3dff90e70834a05120151d1398 halomaps:6001 +codwaw-L3.map 2F304EA2 81956703 262144 680b1eb03519ea15b344cf4629c883f4716c3ded halomaps:5088 +codwaw-Level-4.map A3427C37 99505969 262144 4563cad58ab8d03cc083c9233be3ee7fa0999bdf halomaps:5224 +codyfields.map 2047069E 22895056 262144 6832787f6a02559f30571ba2e190e56c7d545d63 halomaps:4246 +codygulch.map 27744227 26957502 262144 7eb82ba4210efa22936ebc4f9d4ec9032c3151dc halomaps:5225 +codygulch1.map 5B5A1A3B 27788839 262144 c7369d3c10efa22548c9b420c0667d1452411895 halomaps:5226 +codygulch2.map 7DFF1547 16207034 262144 e03122e87f0722c3ef906ad4e355aaf2c432b424 halomaps:5227 +COF-gulch.map 22177C9C 60714787 262144 3f27673cdcaa3118d82d1a13ed89f756db3abb20 halomaps:4978 +cof-gulchbiped.map A37B2A43 60121227 262144 5b9818a19b4b70c919a715921a0d52dd99cc2b13 halomaps:4979 +cogworks_final.map 77381691 90577838 262144 9034591e4c8aab8d71e67493f838488fa2185fa9 halomaps:5351 +cold bridge beta.map C3E0CE7E 184049690 262144 5b0cb0ed8f8079728daf28f8d5975bc05f395d1d halonet:cold bridge beta.zip +cold_bridge_Beta.map 1E469282 209641510 262144 8bce1f179a06a2c43de6f5d4c722524022a8deda halonet:cold_bridge_Beta.zip +cold_island.map D8F0E313 14367452 262144 67dc2e3ed4f9401e89f6ff8c1da639f792dee0f9 halomaps:4581 +cold_shoulder.map A15D07B2 53327632 262144 0eea85ac99cddc40797479815d761be878b1cbd6 halonet:cold_shoulder.zip +Cold_Steel.map EC96B53E 19367660 262144 72d7871c1a03671a6bdbb69fe7a5a917fffa54d7 halomaps:339 +Cold_Valley.map AE353A3C 72191582 262144 379c868f09ec01881bac62cd3665468b95809100 halomaps:4525 +cold_war.map CC0343FA 35213768 262144 449ec38b5749d98c43e17a8b5f77905165512524 halomaps:2493 +Coldaphobia.map 6AFDC9D5 51360591 262144 4880bb3baba0f7da648ea3ea7d49c9873a6ab066 halomaps:5663 +Coldaphobia_2.map 678918EA 80425097 262144 7a3fd5a58e4c2b1b0fdead95dd961ae6c575843e halomaps:5684 +Coldfire.map A891C950 19332912 262144 699504a9e20061936ec1ea109ebb5ef1160a1b73 halomaps:3606 +coldgulch.map FB785517 82620711 262144 d9e56c2abff6c783a27c2fbdb4cc7183ee0125c6 halomaps:1454 +coldpine.map 3B22C1AE 21169972 262144 760d455642a6906243b1fcd0b79234124ba0710c halomaps:2900 +ColdRush.map 74E906D4 71088470 262144 54fdd118d8d1850fb4ffc093eea79fb64df3252f halomaps:1115 +coldsnap.map 94ED459F 79925558 262144 324a7da33b364f9a04799816bc23d1551ed45e60 halomaps:1770 +coldsnapv2.map 27718324 98890894 262144 225cc6a6f0e3d1b4048175223adea816b10089cd halomaps:2179 +coldsnapwar.map EF46FD26 74673847 262144 baecfe056e50114573852d63d8fd1bb6d0fedfcf halomaps:4320 +coldsnapwar_endgame.map A4B38F94 95052827 262144 713c48d2abbf8b2e096fc0138edaf95d097e2f50 halomaps:5558 +coldsun.map A9E5773F 59493858 262144 5b2b8d33df8869781fae79e35c2e4316e460280f halonet:coldsun.zip +colin-blood's-mega-gulch.map ECCEE0C1 32499922 262144 81fdbeb678c977ff6b630ea50e690895c36abaeb halomaps:4321 +coliseo.map C521987D 112552905 262144 ef43ecf2cdd4dcad928c87f1d1a0911890783bb7 halomaps:6588 +coliseum.map BF58B6FC 12307016 262144 3bbcf9c4ee5c3511289d750f9785d5cb586a5adf halomaps:214 +Collide_Beta_1.map D757CF75 13630192 262144 bc45d577fb123091ed30cf5ba125876eeaff53ad halomaps:2916 +Colmena_de_Abejas.map 48B11795 240567033 262144 5eddfe7c5578d215428939329b6daf395cff7f02 halonet:Colmena_de_Abejas.zip +colonia_screamer.map 5D0F9455 96518369 262144 d85ac8eb3bcf08552853afbc60ccfb4454fc0950 halonet:colonia_screamer.zip +colonia_screamer_v2.map E15ED012 151398017 262144 903105f5d092268c324c7a8fccd50f06b0e129a5 halonet:colonia_screamer_v2.zip +colossus.map F3E5CC6B 25874332 262144 4689e750431fdb9d246c63092f13fbc0c4b66507 halomaps:7000 +colossus_beta.map 9C43C566 20833720 262144 2efa7c960f0497ed62d31b47bff30d7ca1d8d3de halomaps:5589 +columbia_gorge_beta.map 6180097E 27710748 262144 9c5b17d0b8a9e79656b350af52429a9644e8c2be halomaps:424 +columbia_gorge_race.map F2855681 28505052 262144 7f487b608813d718d855065a3da9d7dc832ebae7 halonet:columbia_gorge_race.zip +coluseum.map D97848D3 90640631 262144 304d55701df92f12bd3e574916e0b07174ec9355 halomaps:2283 +coluseumii.map AEDE325A 126119032 262144 b5d7f378cab6f23250e0a43d2d7a14283be2ce4c halomaps:3333 +combat.map 72B45C26 21757253 262144 43680f57f5c2fbff6da522406ad903b570f15cd6 halomaps:5914 +combat_arena.map 8FB7EF3F 50898233 262144 60794edb5b54854cbf74c701eecd2a53c2d90fd1 halomaps:6140 +Combat_training.map 0B7EC9CE 89750993 262144 21450814f89e7b274052ecf60322216d660fc287 halomaps:4304 +complex.map 6F592840 14151560 262144 4fa78622e3e29a402bff270776c8071483761b3f halomaps:353 +complexx.map 912E666E 27602985 262144 3ed340324ac110a654cb430fddb4910470931352 halomaps:2983 +Concat.map 3BEB5C6B 18493637 262144 d2a5d34399c4aa8ef64f24b90e0d4277c12df97b halomaps:1020 +concealed.map 1F81249F 17230865 262144 e6462715d53c1620a76a4d89143ced8056884b58 halomaps:520 +Concealed_Custom.map 223456B4 20512135 262144 242e09cf585381341e5f77819686a44ee26b8054 halonet:Concealed_Custom.zip +concept_test.map E9FE17A6 13810308 262144 871dd8568f7631b02d5480c3afdb5aa515b0d09a halonet:concept_test.zip +Conception.map 1B8109AE 21811444 262144 bb075c04898b35c99f88e83e53fd3366e3b9ba06 halomaps:1329 +condemed.map 270C3D49 14107600 262144 19f13aa5d7464eaa685f1ae2ca13fbedbefe74b9 halomaps:1924 +condemed_2.map 902B3B9A 17125880 262144 c2ea8b5cb7a91064df73aed627c13669f80645a0 halomaps:2494 +Condemned.map ED339B4D 97454992 262144 f7acded974fbfbb22b3456e24dfc14f490ea8da5 halonet:Condemned.zip +Condemned_v3,1.map 3D0E2470 50828092 262144 ea77e8ff084d2dc0cc8eeedf83fedd7e301baa71 halonet:Condemned_v3,1.zip +confined.map AAC033A7 54737488 262144 88b24e1d3f0fdc2651ed49eab8fbea286a5d2cd7 halomaps:3254 +Conflict.map 19716E73 109831113 262144 0558ee83fafc48740745a2fafbc0fdf8bb67e0c2 halomaps:6091 +Conflict_Canyon.map FFA97B38 101355341 262144 5522e8f01495d0f3f7f3cbe7eb1f13e1a5b7cd1b halomaps:5522 +Conflicted.map BBFBAF4A 320248395 262144 b4a6fbc7d4a54fa9e12df9dafda21ce6626675c2 halonet:Conflicted.zip +Conflicted_2.map 01423B41 350363693 262144 4fdbe0438684d94cc695131b5ead6f2f530904fd halonet:Conflicted_2.zip +confused.map 9FCEE2E3 12921708 262144 1128d4aa2d6b807d980757d2b07f127c69868c9c halomaps:337 +confusion.map D5A8D9C1 16725118 262144 1a4657cc8682bc92c7fef213ed494d341bdd9d16 halomaps:1305 +congestion.map BE3201EE 19049848 262144 861af91f93f5633bd8917012c85dd4b021fe9fd7 halomaps:2966 +Connemara.map 05CCF4D2 23928944 262144 aa51d5117e8fab4239379a5b0603b926ed2d4628 halomaps:5060 +conspire.map A9F1BF2F 28889128 262144 f32841fd11de00c204be76e4adf489238be7a2ed halomaps:3314 +contact.map 03AAD7BC 100833375 262144 a7f6b89149f73c3539165ceb80b6502187a07a7c halomaps:3579 +containment_beta02.map 7A80FA2B 26981135 262144 63b3e3ff5395f216386cca8ef3a681e930c82e45 halomaps:2422 +containment_segment.map A2EF485F 131879063 262144 719821e8fb4b50e5e0df1ae94f01de150fc28fae halonet:containment_segment.zip +containmentisland.map 31DDD46A 161140294 262144 7ce19ae6c52acbc3c7ed6e4b3b7886eb940c9719 halomaps:4490 +contamination_publicbeta.map D6BB0186 388882745 262144 8006675f65c7a36f5c9fd5ceb975695257e152d2 halonet:contamination_publicbeta.zip +contemplationbeta.map D7EC9DA5 42675665 262144 9e1e477787a07dbe5959cfcaa81755d9b9d642fe halomaps:3290 +contortion.map 745F6EFF 17074216 262144 26b905224aa5a6147aa4e65aedc67cd278536481 halomaps:463 +Controlcombat.map 1894F04A 61925135 262144 a3096e939cd01a6b5a416867cf8427bbe47ec54f halomaps:2359 +convoluted_complex.map 4B034597 13135396 262144 3a8aa0d79ef3f0fc5461ddb7615e178d47a97c28 halomaps:1925 +cool.map A99C78F4 36451078 262144 2b3e740efcfc08cd4060ce8e337fe099e73ae610 halomaps:2153 +Cool_Forest.map F433994E 354817140 262144 45467cba1b6ec1d542cb468b2e7517478e52f273 halonet:Cool_Forest.zip +coombo_wars_m-1.map FD35EA2F 57927821 262144 f942382780ea60d7f41ccfa570ab344f5dc5a56b halomaps:4491 +cop_gulch_mp.map 2107930B 74128992 262144 e01c7e33fae08edb424a3cdc408c213ad0c3d373 halomaps:2154 +copsandrobbersrpg.map DEB2DFCE 92374419 262144 625dc3e820d04d3e09bf6e0d41199ea31602f14c halomaps:5235 +cordiovexa.map 700565DF 17713640 262144 4c9426c374c4d004b30844341402bd38d7dbd74d halomaps:1151 +cordiovexa_final.map BBE32977 38892178 262144 80c122ca77f657affa644f111a4defb0a9448555 halomaps:1330 +corot.map 53D7A020 64559421 262144 83b4703684ae793cc760deca76058e7cb0ff2432 halomaps:5944 +corrupted.map DF459050 17175608 262144 75999a94129dd990fd26e92e8e6ac76eb4d28c4b halomaps:1279 +corrupted_nocamp.map E91D545A 16654380 262144 29ab77c1da1de88e261737b7ab69547b36eb4f5b halonet:corrupted_nocamp.zip +Cortana's Destiny.map 260E427E 31192816 262144 d9f5bf4a31c6fa411674c8f8447d5b1223da1b64 halomaps:4801 +Counter.map 38D459EC 39300317 262144 5de2c29ad806c0ac9849504abbf581002eaabf1b halomaps:3401 +counter_attack.map 6E043BFB 95196309 262144 4dc3c193ec9a8c63d7bc9ec514389eee461ca628 halomaps:4010 +counter_attack2.map 02395B30 106918968 262144 a073691ec82c07fdf1c4f85c83eb1ed78b3c9104 halomaps:4935 +COURTYARD.map 85E8E3DC 372780253 262144 805cf5804c8899ea73f65ffa48844cd93538b633 halonet:COURTYARD.zip +Cov._vs_UNSC_Blood_Gulch.map 2B4FCBAF 36023364 262144 8299ffde24a06b475b256f63c4ceb60fb3c65238 halomaps:3874 +cov_vs_humans.map 87F7E11D 50054434 262144 a3147d9aa0806e5f5ce18b6ad175af8363470107 halomaps:6092 +covanant_canyon.map 673469C9 17566962 262144 e91e108f56d8be06ef92b2a269250b06805a4f23 halomaps:215 +cove-island 1.1 by-skynetinc.map 6C890CB2 77677495 262144 eb2d954f872b5b7e6e9f60f2e65edfec4f1bc71a halomaps:4678 +cove-island.map BA42215F 27943031 262144 10b03bc7107c7dec4fa1f7fd30bb308e291dbbf2 halomaps:2155 +Covenant Arena.map 53F32E65 26290007 262144 77bd44e8136b7952c1d1cd901c77f4fc926953e8 halomaps:4191 +covenant carbine.map 7DF99214 27899808 262144 f03131719ee95bab03309dd9a1b64d0d61cdf88a halonet:covenant carbine.zip +Covenant's Canyon Public Beta 1.map DEC64849 183202752 262144 7c0bcb8a1810f36fa41235a54f37cfac9cdf415a halomaps:3804 +Covenant's_Canyon_PB2.map 0AC2E3EB 232392038 262144 085a7447eb70ad1968b05d330d3140b337e59c3c halomaps:4899 +covenant-rebellion.map 8AA8C79D 384504440 262144 7ff061bfe95ed1a9dae3d128c6e690c80d084626 halonet:covenant-rebellion.zip +Covenant.map 54861E65 36070967 262144 5cc38c4a7c984b982d3ea26e9658701266447313 halomaps:1036 +covenant_battle_menu.map 079667FC 24476102 262144 b05127dfa07000549fe4a9db6d7bc15f6f954e2f halomaps:3206 +covenant_desert.map C19E975E 83257962 262144 62468e2037f09ff61005adf8f834d83e58270141 halomaps:5624 +covenant_hugeass.map 9BBF380F 51378063 262144 993f06442d942bc61017384cdd16dc08a0ce9585 halomaps:6357 +covenant_outpost.map 9DA2FC4F 70351385 262144 154aaeae236d43b1d07050c6991db630009a969f halomaps:6300 +Covenant_V_Marines.map E9219B9A 106719809 262144 3f58d7cc5572aa2b793dea831ff14c0bb75d1d75 halomaps:2063 +Covenant_V_Marines_Beta_5.map FADA2FCA 111421130 262144 217513d5e0c47f73b08613696d601139847c37bd halomaps:2084 +covenant_war_1.0.map C9AF104A 52771279 262144 272a74763b863adb407c76fea8932da939c67f55 halomaps:2864 +covenantbase.map 45454938 85114424 262144 8407ce956f39f2202d993413f963e0b66e8a9b2f halomaps:3192 +covenantbasev1.1.map 8699BE17 82028968 262144 452650385fafb216d644ad377c441b853c67b54f halomaps:3989 +covenantcourtyard.map D0A6AE8F 14592178 262144 4c2f1c873f2e030b5da0fa3b626ffd5d33a6d116 halomaps:216 +covenantgulch.map A7FB5456 265604987 262144 c5cac81e26b52fdcc247d6b2d5a5c5a8be3fcf19 halonet:covenantgulch.zip +covenantgulch_v2.map 9D6AF64E 38813545 262144 a40005145a71eed2f592d7f9d0afa87153e05a3e halomaps:5889 +covenantlaststand.map 00A9FFAA 86693004 262144 cb56c089b6d111b82fd9fd528869e9e23b0176b0 halomaps:4400 +covenantphobia.map 5E6CBFFB 32263803 262144 0541c266c070562a22e6c152508c98758606a3af halomaps:5685 +covenants_last_stand.map F6E059FD 79085368 262144 819bcfb51e794f0a00bf686197986eca9c6ec9a8 halomaps:3596 +Covenantwinder.map 08D73AEB 71585266 262144 f4d9a6c8f6825200c8ea06b3eb747e3611acc575 halomaps:2700 +covenent_vs_flood.map 1274D409 40336036 262144 f5d2bd90df108c9a9ed25c30da7866aa85ca0f51 halomaps:7030 +covenent_vs_flood_beta1.map 7B1CC54A 40330088 262144 80e0e14f2288530e2a25c75c55def6efc532b3d3 halomaps:7019 +covenent_vs_flood_final.map E7BA8907 73568688 262144 d7781685c08b9612f6c36a9bf3d026b6a66c635d halomaps:7114 +CovenentWoods.map 54446470 14690920 262144 aaa0d33c2935d0df55baa938060d7ac7d5fbe084 halomaps:1195 +covenieye.map 9B822231 31121347 262144 62c5b4c4d3513da823b291213d4d098c5fb93852 halomaps:2528 +covercanyon.map D8A85139 14010120 262144 e1db0d7bf226ac9b37b80659930a9dc19c1d53af halomaps:210 +CoverCanyon2.map BC5937CF 16536912 262144 c97d9fe0054ce59423645d9c6aca895b33d1acd6 halomaps:217 +covevmarinebeta1.map 9CC5DB0F 75478307 262144 a4eb5157095fdcae8fbc6edcef8b44c05da2a20a halomaps:2038 +covevmarinebeta2.map 58F54443 77425231 262144 60039efd38e23c662f66196913319c271636e1b3 halomaps:2051 +covevmarinebeta3.map BD6A298F 72324257 262144 121f83b1b47dc16381cf4a38652d4d2439572401 halomaps:2064 +COVID-19-Wynder.map 5F151974 119958818 262144 158a0e4838118eb5f0dceb065a8575fa852a3a96 halonet:COVID-19-Wynder.zip +covid-gephy-19.map D0FFE7E8 132404365 262144 d3e714b626a130f4da827393f212bd0a84343336 halonet:covid-gephy-19.zip +COVID-Gulch.map 31A49A14 132917390 262144 f6ed2c3935505af16ddb0f3d38e4265e22a7b1f3 halonet:COVID-Gulch.zip +covid-island.map 4FBC86FC 132855340 262144 8929a3cd663058b7ec53908a4116145befe9fee8 halonet:covid-island.zip +covie-cruser.map 4F1480ED 26678878 262144 49e70dbcd33e4e66ef39b87ba787133b8f058495 halomaps:2361 +Covie_Assault_Beta.map E8A1FE68 93993603 262144 2a8d55d33aa8e560b2f0d724829c717546c25dab halomaps:3349 +Covie_Assault_Final.map B42952BD 82914488 262144 9344db0643d2f186a61bce6efcbe423c022f5d73 halomaps:3369 +Covie_Gulch_BETA.map DFD73AB3 22512395 262144 d4bfa43a287923e3383a343d4d6364eb2f0d832e halomaps:2967 +covie_vs_humans_beta.map BB398091 39752261 262144 5248bfac16f75732aa8b1ccd961788c96b32bdcd halomaps:4712 +CovieArena.map 85B1B044 13514692 262144 aedcc5eedb828d384aef8cac289c3ce5072e7b15 halomaps:1091 +coviecafe.map AF793193 13135220 262144 3004cee2a09829be7c8aff8797993208b2784434 halomaps:1950 +coviecenter.map 78ACF3D9 87702239 262144 a63b3c770314220f9618b80e9fc82a2e92f55409 halomaps:5671 +Covvzombiez.map 5122A8CE 46367434 262144 28d46cf30421136ca42940dbe982025d64ce43ea halomaps:4552 +covy_hangar.map FEEAB42D 50170794 262144 383aeb393e5d3809a2ed12c29939a2b6c7b58d3e halomaps:4131 +CoW_Final.map EF0FAA76 29846526 262144 d9f36aaf274051d1f7647b0860307eb01e6add92 halomaps:2882 +cr-1.map 3A2BA041 17013164 262144 ebf315a5a2eb0d2eb5de40cb1b91feda002a34aa halomaps:2728 +cracked.map A66915F3 13852240 262144 36b862e38b799c3868eea1392031c8f92f1138c0 halomaps:1683 +cracks_stack.map 8A8F1581 18704984 262144 fb3eebb6b755be4bf3e222cb111f293e470cd91d halomaps:2363 +cracks_stack1.1.map DF3C5C60 62929090 262144 5d26a8b6f29eb9e48d90e72fb572e92588b24140 halomaps:2495 +cradle.map BFD9D654 17031472 262144 dc937a479487a56d77f6885a3f0473e48e69cc43 halomaps:3063 +crag.map 86334116 60471997 262144 fd4ff1137a563407fe0ead94dfba4edf0713f020 halomaps:5418 +crandorcanyon.map AF022710 19426016 262144 a5f061d5fbb506dd89c1c9270129243980c281dc halomaps:2423 +crap.map BC7A27AE 14094184 262144 3e3134cf5629a3a97881b8a0191d2a22ea3d1512 halomaps:218 +crappy_valhalla.map 7FE145CD 21802168 262144 0ff51e6e1936a5a9b2b146b5a26a2c8e1d5e9d90 halomaps:3402 +Crash_gulch.map 00D0A995 73750255 262144 e7f6ea7e30672ee00508d707de09d0eb0cdf5b5d halomaps:6142 +crashtest0,1.map C79DF598 41108747 262144 4195c9635c2df6d52d305bb75a7055468f8f8aec halonet:crashtest0,1.zip +crater.map DB8CD6D9 13249412 262144 9b2571ee4a399f30468f7bd592e8242177fdd2b9 halomaps:2180 +crater_lake.map B2BF64FE 34993864 262144 4d376f96487ad3d9a0fc6ab78c2a0620bfe9f518 halomaps:6110 +crater_pit.map 327DE50D 13792960 262144 282d46fdc08c67f81bdbbbbb0329497dc45d6e01 halomaps:1996 +craterpit_final.map 10665913 13805240 262144 ae331c4d8db2e8534fc4dc239af464046d4cd3df halomaps:2012 +craze.map 47B80F23 12884422 262144 5964279c893318e5053a9a98ad14cdb673395235 halomaps:1504 +crazy.map 81E3EFFF 19410492 262144 d69777968f6c0c793abb515a9b9ed4b2f7877a6e halomaps:496 +CrazyGulch.map 7B309554 13936092 262144 2e24b4960a3bdf35252d1abadd88cd231c8e4436 halomaps:1116 +CrazyMap.map 8E3491E8 13652442 262144 76171db14fb42243a7667fa6abdcb526439a839b halomaps:1194 +crazymodv.1.map 3E755ED6 14904616 262144 9e5357dbc455f72599ff37ea875243414a7d1404 halomaps:2817 +CrazyWoodLand.map 77F90B03 19031500 262144 22cd7c4e2094ce7f1f7e85243718f19194136f1c halomaps:1224 +crazyzanzibar.map 6A8DA14F 68414258 262144 e7d8382af6c3e144b5ef000cb55d842a4f308bce halomaps:1117 +CRC_Derelict.map A971E023 31507347 262144 6a37feecc073aea79ffc52a6f3bb51d229ac8708 halomaps:3064 +Creature-forest-co-op.map 9369DC04 79167784 262144 ed4df4c25fb5fb2b8a56e33cd6eb25776653683e halomaps:6277 +creepswar.map C8A9C0F3 83127555 262144 9613457074188dc6421e62f9c006fceec41522be halomaps:6862 +crematoria.map C3482332 21510106 262144 2120164ca02af91e3e760fa95bc9989c6b0e8b6d halomaps:2039 +crevis.map 47AB380E 47737655 262144 73ed94643db4a0440e6b2eb352d42955407e805c halomaps:5015 +crevis_flood.map B7348AF5 51844033 262144 d719910b263e0805a548c837f89eee458c4e3ba3 halomaps:5016 +crevis_overflow.map 889D320F 55531147 262144 81dfd707d424be6ac1afeb4645fad865aac28683 halomaps:5463 +Crimson_Woods.map A9FA572C 24643915 262144 653f0f004396cfe590f26a0fc8edb2655e013c6a halomaps:595 +Critical.map FA7524B2 34765208 262144 ca5739330256acda37ad143518a6e1ebde74749e halonet:Critical.zip +Critical_Mass.map 3C7EB329 283599565 262144 c8b5aef97e531a48abace0f265826ae1908a4a52 halonet:Critical_Mass.zip +Critical_v2,0.map 482AB2E8 44974880 262144 d872e492755428a2858c8943aef5da94087a564c halonet:Critical_v2,0.zip +Cross Bridge-beta de halo 5.map F2CBE8D1 227821868 262144 5b7b70da3dc94ec5bd62b6387d605ceea20135b8 halonet:Cross Bridge-beta de halo 5.zip +Cross Bridge.map 07DA990B 256164714 262144 616c0326c8657b0785d9d8528f0cf3dbfa2b6311 halonet:Cross Bridge.zip +Cross Bridge1.map 07DA990B 256164714 262144 e60789b21cf33772a09a13104f4ee9f83d4a7aa4 halonet:Cross Bridge1.zip +cross.map 81BF1735 14637260 262144 80bb3b8984103f9696ad008a4023b959b1aa5900 halomaps:817 +crossfade.map 292D427B 13712724 262144 3c05311860fc7598cf35217fbdc00d594520f210 halomaps:431 +crossfire.map 6C47031B 22542054 262144 e4dc503cd0462827714a14a4d1945e5a251f09c7 halomaps:2682 +Crossguard.map FC55F727 17009052 262144 757ca939b9542906c876551379220042f32af0a8 halonet:Crossguard.zip +crossview.map 58AA4288 48965068 262144 d55f316f02b1ccf7b3690762bdaf0283f1501420 halonet:crossview.zip +crowd_control.map B010B0DE 316575810 262144 da47a4e75fe5c66b35de7186d68c8996ce57f863 halomaps:6474 +crunch.map E2AEEE87 23600618 262144 b3b4360aedd9e9ad284b8ef317edcc5598dccfdd halomaps:2865 +cryophobia.map 32B6F5D1 62769429 262144 6a3849f5f0ddfb1873c8131947fca6437aa93818 halomaps:3431 +cryptnosys.map 2EEFCE2F 22564804 262144 c514f9e0d155e45444b10a863542e210efcf66b2 halomaps:3315 +crysalis.map 56E426F3 27345684 262144 b732025ebf9a07618fabe10bd1252801e6d467f7 halomaps:3291 +crysis.map 751F3F75 15288116 262144 cff52cb36ca0e895b2079494c78c1bb7452050ee halomaps:5112 +cs-v2.map 3F5C92FF 45680766 262144 f4cd53cb8cd1071c1ca635f05f5f04a429835d47 halomaps:1024 +csg-wizard.map 52A8739B 12792048 262144 1c39ef1c8bacce5da47570e91177a78afd62594a halomaps:4669 +CSMT_Golden-Fire.map 34236FE4 93312877 262144 d86068d92d5a7f10e4d2d0f837718fab7fb7a33e halomaps:4427 +css_beta.map AE8FDA31 38061580 262144 698b8ed26faf3bb5f8b29ffcca1771bd070508cd halomaps:1459 +CSV2_insatiable.map 0DF074EB 133272284 262144 0694a06fa1f6f56d2d357055263544f3f6232ab3 halomaps:4713 +CTF GOLDfinal.map 081F3C8B 34724127 262144 8ec2a70ed04124d2791bdbc9ab20885d4316937e halomaps:2525 +CTF GOLDV2.map 13DD6214 51506987 262144 2071ce8171cb92ea73695fec43b88334d326e747 halomaps:2496 +Ctf-#1.map FC3ADF26 12988212 262144 77cf6a148229db07a59e9819b6581df1119bae91 halomaps:7115 +Ctf-Battle-#1.map CB05E549 12519696 262144 7296c0952b84792bb1716721328c0fd8192b9ddf halomaps:7101 +CTF-Face.map 34D9D4B8 15862098 262144 e997de339d4744d26e7feef26c79716d4802490b halomaps:300 +ctf_backlash.map 87309211 16801835 262144 17c41af09c2813417d67dee9604d549722f884c9 halomaps:4714 +ctfsingles_v.01.map E42A60C5 12442936 262144 225333be29c9c3e2ab32090b63a96184c10fed16 halomaps:2126 +cubacity.map FCF36E70 20097572 262144 27081a07ac600bab656b7ecc389db7459dacb189 halonet:cubacity.zip +cube.map AC51E006 12598882 262144 74ecaab410ab818e5e6b7e16751ef20eea7a51d6 halomaps:305 +cubemap_test_v2.map A934C953 89008842 262144 25021bb094d966163a2bf79f43570cd5d55f709f halomaps:4285 +cubix.map E6B35F82 20368273 262144 49df94b971ee43e6f6e178a95ee9ed803b7dcc9d halomaps:3081 +curio_caverns.map 1D8A59B2 50577055 262144 9e64fb3794a6dd5a1221073ce7d988a6d0bf8707 halomaps:1491 +curiocaverns.map 5371B251 49797853 262144 2f502c08514cb39306aff3e0e4fc3385d7aaa716 halomaps:1486 +cursed-beavercreek.map 93D8B303 132730460 262144 16b39daa10aeeafce64ae529ba0320b7f02dd622 halonet:cursed-beavercreek.zip +cursed-bloodgulch.map 915363F4 133305224 262144 267899b8580e531b91a3cfdb0808d4699bce92ce halonet:cursed-bloodgulch.zip +cursed-chillout.map 8F9AFBCF 133510752 262144 b5d8aa612632fb8298ee65df5b5f947276b87e29 halonet:cursed-chillout.zip +cursed-damnation.map 8DBA1807 135126044 262144 353bc16f785180a4e2193a56ef6ee91cd1be9cbe halonet:cursed-damnation.zip +cursed-deathisland.map 776DDC71 137289904 262144 b687817da54514e201bda0a0411fa406d0dcc079 halonet:cursed-deathisland.zip +cursed-derelict.map 2F55C2AE 137403200 262144 cb091893867aa8bd3e7e131d3061719644ff6e77 halonet:cursed-derelict.zip +cursed-hangemhigh.map 740ECA21 136106504 262144 114fd964dde8329d3438b9e2aabc9b2e61e01cb9 halonet:cursed-hangemhigh.zip +cursed-sidewinder.map 2006CCEC 187345048 262144 0dbb7a6e31309de048b36b97fa63f9dc6849addf halonet:cursed-sidewinder.zip +cursed-wizard.map 3C8A9590 134347836 262144 a76b0afdfcbe38f06d69116a92d8d1221ddf5242 halonet:cursed-wizard.zip +Cursed_Island.map AF840E53 242180991 262144 6e3d5e84ca287be4c17a406e4bbda30b54a32ee4 halonet:Cursed_Island.zip +customgulch.map BACB6089 20817184 262144 688a83bdcb07f998d68e11a053dafc7b9f5f05e1 halomaps:3936 +CutthroatCreek.map 9DB9ED6D 61537225 262144 9d6ffc799a9e1edc32ec9bd7a4b68804ccf483ae halomaps:4526 +cyan_city.map 8202026C 21431248 262144 532e95d1d135bd319fe4100ef5173c62ec96f5db halomaps:308 +cyberdyneb2.map 626F4397 132869960 262144 4fcef930334f18602c50d644abe43919b6e462c9 halomaps:6900 +cycle.map 2424E66F 13257236 262144 c6fe5c94dc97a941436dede92864a9cfb0cfba78 halomaps:1898 +cylindrical.map 1B1288A3 19831048 262144 c1a1c2a38d541f154b259dcb3ef1514e9d3f1702 halomaps:4286 +CñR_Infinity.map 02AB1F30 95035345 262144 2fae66942f1292757590efdf73faaf5cef2ee303 halomaps:5002 +d20.map BCE8E65D 138793801 262144 bd057a34bc996da4712ad884be0d88ce9f1bf216 halomaps:6661 +d40.map 35212B44 221165392 262144 71de2c9e45ae8cbea3fe35a117b01bc45280f77a halomaps:6705 +d40_race.map 562632C4 119370083 262144 2e81ab36dec593e16602710eeec4bb052bd8aef6 halomaps:7116 +da_battle_ground.map 9CE3FA51 15552688 262144 ab9b1852fb64fb9bdd524f8531a0f60855de5c67 halomaps:5273 +daglash.map FE2E831D 76406838 262144 9f54a5279bec06a1293e934a24c65587fb4f634c halomaps:7117 +dairon.map 393C7F14 24643415 262144 70a69b8dd7b2310be6c013bebfb55aee648c7453 halomaps:6619 +Dam Assault Pre-Alpha.map 91E20C92 24525124 262144 eae473a5660d8b8c4f1221ae00df7cc3254eed34 halomaps:2968 +Dam Defense Beta v0.3.map 3A902D9D 26915740 262144 0eb0c6d24186dab555e097e5e1d1b0a9bb80e5fb halomaps:3029 +DAM_Public_BetA1.map 1F9F8A0D 31424967 262144 2732631db1eba26c20ac90d4a1a45fd47d80904f halomaps:4053 +damnation-night.map F693B23A 114824056 262144 60e53f073acd0be815cc60caabfcfdd3ac3357d4 halomaps:6674 +damnation.map 0FBA059D 14006880 262144 9324485e0546fcd245d18759c427873308c6ea12 halomaps:4777 +damnation_elites.map FE31380D 18673448 262144 928150ef762528854338766aae55c3c56ad9c766 halomaps:2601 +damnation_elites_h3.map 08E13A09 87665431 262144 f52f127325a711cd05d741aef0baa2df554b3652 halomaps:5960 +damnation_elitesv2.map A772E5C8 24979245 262144 b69c6d37657d71c469614ca9968c9aa624ec068d halomaps:6007 +damnation_rm.map 0FBA059D 309467884 262144 9356dffbb9a5c4ac3dd2d4750d837153ec559747 halonet:damnation_rm.zip +damnation_tmcc.map F4EEF8D0 41198200 262144 edd290f49592f00db253c71772c5d9e76ccdd78b halonet:damnation_tmcc.zip +damnationai.map C3AEA5BC 38730388 262144 cd06bf40ed80d055c772b56792912a38e9c54496 halomaps:3607 +damnationedit.map 8344976B 22368448 262144 6df4c852e55e5b9dbfa26a76bb845b00329201a0 halomaps:3580 +damnationwar.map 9D7B0952 88126342 262144 be02a1c792c9f3e4aa20593a4db22a066b107519 halomaps:6863 +damone.map 5DA5626A 209448131 262144 2e41f888c594fb12daf415ad6515919ee7d529fd halonet:damone.zip +dance.map 832B3944 25225549 262144 02a93f7c20d391a8441306887ec9e8986ef5bbd3 halomaps:3181 +danger canyon v2.map AFB5292C 128058547 262144 7ef3c91743e51bcb021c8634cb54bccf95353c6d halomaps:6516 +Danger-COVID-19.map A4334311 133149316 262144 822fa117ce4ed865bbef6d50ede4e6ed5b6e6d8d halonet:Danger-COVID-19.zip +danger_ai.map 02DE5DF7 86016758 262144 da078ab9508a44c3d99b9d4eca963e255d79a6dd halomaps:2301 +danger_ai_2.map 5D49F91B 74243119 262144 0e9487242e2f06766b7dc025b215c64824aff16a halomaps:2302 +dANGER_AI_3.map E5342575 70745028 262144 ca7d6938dcd3a79e1089d7d619cb643a2c8ea409 halomaps:2358 +danger_metal_canyon.map 11859156 19648412 262144 5acd0feda68eb87378bd08f8fe7000f28cf88f87 halomaps:3847 +danger_nobyon_beta.map C410CD74 15165396 262144 d2a60d9b64e55e9bcc67d9d8c79b8baa2650e679 halomaps:1040 +danger_zone.map 1572F79E 13414580 262144 15d729b341310e607626522b49bf0710f32d77b1 halomaps:2236 +dangerbots.map C8885E76 70607952 262144 efbee48315f2a23d103c6b21fd364848352075bf halomaps:5352 +dangercanyon.map C410CD74 15165396 262144 e788b066e366f037156f8d5d155d1cbfedda491e halomaps:4778 +dangercanyon2.map 3C1F0C9C 20706960 262144 8d43b4444066af3a5a5ccb7c3195812beb4bb9df halomaps:3846 +dangercanyon_ai.map EED319BF 41701976 262144 e9531b6f8811a4367c764e58dc48828d748d370e halomaps:3046 +dangercanyon_attack.map 2F88245F 35326769 262144 9c150b5d6281ad0ec3c6505a35d82f1c633bc200 halomaps:3506 +dangercanyon_rm.map C410CD74 336720288 262144 fface5130464f3a5bb08f5b03c075c509fb827b9 halonet:dangercanyon_rm.zip +dangercanyon_tmcc.map B52F93CC 39975300 262144 eea79a7cfa142293d1a887c14b9c30cd9ef8210a halonet:dangercanyon_tmcc.zip +DangerCanyonFX.map ADD68344 25916461 262144 d6776ad7111ab37b05a076a12618c19aee988178 halomaps:1179 +dangercanyonmod.map E3BC80BB 76815820 262144 2fa2c9c16e6103fa0f69d7f687f7bcaf02549fef halonet:dangercanyonmod.zip +DangerFloodCanyon.map E10173C8 72866934 262144 e73ad23d81819b86ac01e35f8fec5644f3b35f4d halomaps:3140 +dangerforest.map 1F5D06FE 34563710 262144 45b4226e01264a606c2341bf8de498044d1ba6ea halomaps:3608 +dangerforest2.map 51E8F047 38192135 262144 14ec61b7af590a37e283f71194d0f7e8442b9d28 halomaps:3680 +dangermod.map 867716F8 23089676 262144 d71324a6f56d421f390fd3d29bd3323aa1d77a2b halomaps:2389 +dangerouscanyon.map E3BC80BB 76607716 262144 24349a93ede5447a8343e0a1fed1af1aa3fb2297 halonet:dangerouscanyon.zip +dangervalley.map ACB609A9 75568296 262144 4b534cb41a5fcde248e3db5885083fd89fd47f3a halomaps:4229 +dankest_christmas.map 614FC9EB 37911315 262144 ddb102fbebfed19989884a342cac4b667a486133 halonet:dankest_christmas.zip +dar.map 3E52FA09 47471850 262144 f451494f51ebfdb519b992b2bc0253062261c117 halomaps:5464 +Dark Matter.map CE40C228 316889020 262144 0407f959e9067f8647501e7333b61ef8a96a201f halonet:Dark Matter.zip +dark-forest.map 4FD54760 14953200 262144 b55994b572dbb59817b8b823ea234504e777aa77 halonet:dark-forest.zip +dark.map 77F0BBED 13308908 262144 bdc822af25662cdddef1905e0456ad04e510642a halomaps:1595 +dark_beta.map 57B0A744 12117920 262144 dbd4ec823a23c30b5a0b0bf9130ced964c0ba7a9 halomaps:2715 +Dark_ChaosGulch!.map FC1563EB 25308084 262144 7d23c97ea470fa205d373b7a5107a95174b8c3a4 halomaps:3507 +dark_inverted_star.map 8DB2A4F6 43355933 262144 ee797adc36963ce53c9f7248eef14b4eec6fd875 halonet:dark_inverted_star.zip +Dark_Splinter.map 3EB00E38 15187800 262144 687c4f6b75030bcfdcefb9c44c5125eb7f6a8b28 halomaps:3141 +dark_swamp.map A084DD8E 19636251 262144 ac5106cfe22557c0a2938a1db23962d0b157f162 halomaps:3976 +Darkest_Hour.map D91154FD 134152111 262144 fc2e2dcbda103101903ea414ab024ff90d4c21ad halonet:Darkest_Hour.zip +darkfootball.map 6C6E0FD3 16663752 262144 06745ade413857524fbc2b5a4ded6505d31a5d47 halomaps:219 +darkinclusion.map 4952F2C9 221561134 262144 bfec2f2309505302a1f42685a3bb23ab99173459 halonet:darkinclusion.zip +darkness.map 1DAA2939 54741482 262144 bbbb37fac284fd90c3a5162e9ecf8e9b415d882e halomaps:6093 +darknessp1.map 5E70834A 29529945 262144 18903111ac96fd1363724311ec17c38a344aae60 halomaps:2661 +darknessp3.map E136CC60 40554538 262144 49d0116f23b3f4ba9d9ef6637eb624f1cac42490 halomaps:2683 +darkrace.map 9ED66341 45056663 262144 66dad58f9edfc06395cf2d55422d36b30ee100c3 halomaps:6031 +DARKSTARZrewind.map 75400956 61314399 262144 0f2342ee9fa5e2cfa68552152fc0f2c88d33bc75 halomaps:4980 +Darkwood_H2.map A33F2BC2 55165511 262144 f0f9a8bac398feb8b5c33630a92216e585401090 halomaps:2578 +Darkwoods.map 27C452A7 15596768 262144 eb5f8d08e63c803578c3c3633ad456d73df13ad2 halomaps:3284 +darkzone.map A0B20B8B 32888677 262144 6eb2e4a8289e5ed13d1d81f8c3ea03b22b3d124b halomaps:5277 +dazman.map A855F44D 14345396 262144 35dc072c447dc908a44ea3f9eda70f74955ed996 halomaps:750 +dday.map AC14B053 21041044 262144 2043dc087c2465725a9f99d441d0bfdbf0fa00e8 halomaps:464 +ddaysctst.map 2D31A90A 88546038 262144 8439d30db19a361ea35be0c1054582e5dd926056 halomaps:4859 +ddzarea.map F1ED3F61 12887820 262144 323720d96c8a4a3c977733ed9e83070aa22d7164 halomaps:3467 +dead-isolation.map 71E3ED88 59461129 262144 d0f5a2faa61016df8a9a2ff0c752154b0f5c3d14 halomaps:4192 +dead_crater_by_rerout.map BAA62614 27122917 262144 5aea383d83c39d46344caecd202f841010ac4e27 halomaps:3990 +Dead_End.map 3D40ACFE 35818166 262144 b2075362ff346be599c73618a9ef530487e3e3fe halomaps:1488 +dead_halls.map 65C85489 37038595 262144 534cf47f64053dbb15cf29e7ae1b5c8dd102e873 halomaps:5703 +Dead_Outpost_v1.map 00000000 168527810 262144 79acf8811f2dc3d92b744513fea67fb35324364b halonet:Dead_Outpost_v1.zip +dead_volcano.map 4372BC8F 15283092 262144 ee82a782cf9240f04d25543dd0fd44bc5e4a3e95 halomaps:5070 +dead_volcano_ai.map 6788092D 69032601 262144 b6ce7a33959778acad82ba25df4d279a85812e10 halomaps:5228 +deadland.map E4F41145 14094728 262144 c2a4a9f1cb8434b1c5438ef53f25e766a27e7659 halomaps:4679 +deadlock.map 7B2BF48B 143279523 262144 a5d7b660f6ce36d10980bacaa1a892f8441c9834 halonet:deadlock.zip +Deadly_Canyon.map C5123FEC 13836236 262144 b94551476c8f223ae0aa981de57e2d52ae74e0e6 halomaps:4680 +deadlyshadows.map 211176BE 16030700 262144 e3e7dbf6d95a43230377388dc599e3d6746f2433 halomaps:3530 +deadmeat.map 2E34C821 13335484 262144 8a1aeaf818796ba9762a8d3eb333761b479b6f1b halomaps:2789 +deadzone_beta.map 5347E00E 115482275 262144 104dcf0baf5e0bd0de395c39b796e67c1af79378 halomaps:6453 +deagle6_texture.map 09D1B65D 23048142 262144 376cdfb0bc42d706298c6d5ffdea7885705490e1 halomaps:4715 +Death Race.map 9C1B4B1C 51549799 262144 8000aa4dee014810aa679e29d219fd169af8e144 halomaps:4054 +Death_Canyon.map 5F9EA6C3 162791834 262144 76b08bee84923aeffbee3520d0372aa8aab044f9 halomaps:6965 +death_castle.map C06D8205 12646824 262144 5f63cacc54579c1af23c3eee985fca642f9e4107 halomaps:965 +death_cube.map 4636236E 104586621 262144 986bf1bdcd1793c3d51f7f9185580e52171a9bba halomaps:6864 +death_fall.map D6FB99A6 15224384 262144 a7ecbafdf3a584d0446398690f8b423278777fcb halomaps:465 +Death_Gorge.map FF4C175E 20703240 262144 939d45fcb4e8933aba69bb75c279adc659c0baa9 halomaps:4597 +death_in_the_alps.map D32E71B5 14353968 262144 d07fc2b2e432f95423d8a6239d4a5ef8bac6a01e halomaps:304 +death_intrusion.map E840AC3D 108676624 262144 604063bacd82079eb50a934d80331cd02fd7b7c4 halomaps:4287 +death_karts.map 44BEFA32 63920713 262144 59e5269e1da5606e80967f92d1dfcab9f3aee8be halomaps:6742 +death_silent.map E4D94824 219423808 262144 dc0448581f775e4115910e95768edf7068dc2c85 halonet:death_silent.zip +deathbasin.map D547FAE9 15348504 262144 8a92f9e450055259b2f725c6b2d503633afd5a21 halomaps:220 +deathBGv1a.map 7B309554 13936092 262144 2adb18d85be053fde1ee9db55c217d09903a24ac halomaps:5146 +deathcanyon.map F82889EE 106606438 262144 93de0fa89dc20f438befaa4b728aa8533bb4eab0 halomaps:1505 +deathdealer_v3.map 54F211B1 32298305 262144 80b5b0b309c20e729cb5db514e2fdfe5617a9e95 halomaps:3065 +deathgulch.map 836070DC 26174957 262144 5f49461d94f7e18cfee309cabd551c5d1bed947d halomaps:1622 +deathisland rpg test.map 4B9B7912 134068585 262144 cae1f75e8e05d9f886fa5ed915a19174fb11b074 halonet:deathisland rpg test.zip +deathisland.map 1DF8C97F 18153284 262144 d3d2ce9fa245185f1d483e2638ba03f6825cb5b7 halomaps:4779 +deathisland.v.1.1.map 00271F9A 23414236 262144 5b7d54f3b2aedfbc8eeb1fb5ecae2365257195b8 halomaps:2411 +deathisland.v.1.2.map FAB87849 25515356 262144 191f38e674b188938359ce83581216edccd1d4be halomaps:2412 +deathisland_AI_1234567890.map 14372777 46474484 262144 4e94d588b1de93cbbf69e329496a3f15b1fdd946 halomaps:3891 +deathisland_ai_beta_v1.map 971F0A6D 90921054 262144 e4d29150cffdc91dd1e1df2b4c57777b24e28884 halomaps:5071 +deathisland_AI_the_flood.map 0A8772D9 37787305 262144 697a7843d4fec466a038c33e73deb23b8559f546 halomaps:3892 +deathisland_cops_and_gangsta_rp.map D7236223 32274498 262144 4ed657ec86d215936ebf09a33597a05fbb2e4fb0 halomaps:5772 +deathisland_ME.map 67AC3C5D 55324857 262144 437c453689c94ec9b71f796fb539fb50dc6818ff halomaps:1880 +deathisland_ME2.map 51CFF6DB 130318618 262144 88cf36726db87ea5fd3f7784499133c20d8510a6 halomaps:1881 +deathisland_movie_edition.map 292A14C8 88657330 262144 360a0dbd3fcf468adbf273b910242e9e0567a705 halomaps:3047 +DeathIsland_Race.map 946BCFFB 19486152 262144 c15ac9dbadbcfce4dcd471d70b9028eca37049c8 halomaps:2849 +deathisland_rm.map 1DF8C97F 366726820 262144 59555762471f9df1e69283b32940f5d23e536daf halonet:deathisland_rm.zip +deathisland_tmcc.map 213FF5DA 48027932 262144 ff6f7378567987a8f1c5e42d3325531cfc74888c halonet:deathisland_tmcc.zip +DeathIslandApcolypse.map 85F80D42 24783835 262144 cd4e50c5151b331b7cd50c427890c77805bcdccd halomaps:1536 +deathislandapcolypse1.5.map 8C9E2737 30191690 262144 6694a96e3426e4f26b2c5fcfaef20953c5234ccc halomaps:1549 +deathislandcovenant.map C88732CC 30000922 262144 cc1a90e1f68288d102f2d1c472f97c7db1af02d7 halomaps:5402 +deathislandhuman.map 68EA9D2A 29447679 262144 cd4e961f50b31fd102c25d6c628024dfb1918980 halomaps:5403 +deathislandmod.map AF840E53 91097797 262144 1ae31eea7637ffc2d9907efbe22af24127aa35e9 halonet:deathislandmod.zip +deathislandvs.map 28AA8B9F 27091053 262144 c3db619fe5ec820424946b394530993601ad4534 halomaps:5404 +deathisles.map 6701AA2C 23127668 262144 8cea2eac45fa51bc0ddcc597be2b2dd365a8aaa6 halomaps:360 +deathrace.map CB88378D 31569560 262144 03e9508211938dc12e098b7076874f023861bf07 halomaps:2602 +Deathrow.map 8FCA9AC7 15461640 262144 4e52530917c7d2fb3f4ccbbe2d8a8219c4ebd5a1 halomaps:1560 +debris-field-zodiac.map 71944C5A 39310852 262144 68abafb40fb83fa63093cca9e8fe0fab9a0fe8b8 halomaps:2918 +decay_gulch.map E7F8A0A9 14448284 262144 6b58c1f2c24d392b78da23fce594b9855da0f6cc halomaps:4091 +deceit.map FEC6C2DD 15470476 262144 3a8d1fda4651ce2fd1eb7cb1eb760ed09537aae0 halomaps:1904 +decimation.map B4863A90 19379844 262144 7827fa8a91c76578f4af73773bd73ed10887f59e halomaps:4025 +deck_classic.map CB99450F 16260716 262144 6f3d8e52a5f5e4de39e882ac6c4807ddcebbe3a2 halomaps:4358 +decoy.map BA87992E 17955536 262144 e5eb99cb42b734ed84a9ef3026e23d9fd3c40613 halomaps:303 +decoy_race.map 736E30CF 17956664 262144 62b26e39a60cb5266f6ca33e647d389be961e8a3 halomaps:4276 +deep.map 84349384 17541624 262144 f010f0e7e49ac78473f2707255807703bf95cbec halomaps:391 +deepcanyon.map 6A4AC49D 16563028 262144 951075f474b5db3f35858af2451d5fdeab4cff08 halomaps:890 +defense_of_the_gulch.map 34DF3BE2 76510983 262144 dc61d0bfed4d64411ee83e43de546417518e3d04 halomaps:4766 +defy.map B3E97AC7 32692479 262144 6c980f5c8efecc624f1f7eeae93df2e8b74d52aa halomaps:1905 +Dejavu_revamped.map B8B024C9 388722241 262144 2561b749a6710642e1320429aac2965e0dc109b2 halonet:Dejavu_revamped.zip +delta1.map 7502DA52 13737288 262144 d7c95dc94f4f1b5f022316458f7880dfe1baf2d7 halomaps:1219 +delta_cliffs.map A602F136 51636637 262144 620f9a02bd3ef22eab339afee1f7bc7eb8608bcb halomaps:4214 +delta_map.map 0984BC2C 106330984 262144 a4098d3fcb2a15b5f069424e8d8c64bf4051d2cc halomaps:5018 +delta_ruined-ai.map C52220E0 32222936 262144 7bb80580e4868e6caca717408d34b5bbb7ab7ef1 halomaps:4966 +delta_ruined.map 0CB98744 29339048 262144 6ba80dd2ec36603cad8658aab259b6c1e624b7c3 halomaps:3167 +delta_ruined_ai_war.map 8D529AFB 66464658 262144 1a2f00376de45f94188c5ddb363f219ded67a2b9 halomaps:3597 +Delta_Wizard.map 612C9B30 18964438 262144 503e8bfb8051418a0624c0713924ea4995e4a9b5 halomaps:3115 +deltacliff.map E786031B 133221107 262144 b5aed4c3e7dd86c56a8fe1c891a4d8f6dc44c3de halomaps:6032 +deltaruined_INTENSE.map 336AD0E3 59384404 262144 2ec4a624c1cb0485c0848853d149fc116a56754f halomaps:4152 +deltaruins.map BA3A5526 18772504 262144 331b8afece02e70b2599243d22886551e040caad halomaps:1136 +deltaruins_ai.map 1D29E4C5 253886259 262144 5d45e1030ac40b00ea5be02b7fd7944f8e4fe74f halonet:deltaruins_ai.zip +deltaruins_revamp.map 1DBE3B52 85663685 262144 061f67e69716ac85b59364a77151e8b06159d1e9 halomaps:7001 +deltaruins_tourney.map 5911C9F6 34150409 262144 119ba35836e385f262b2ea00138d32f18e1a3eda halomaps:2509 +deltaruins_v2.map E38C4C41 27370028 262144 d08bd8df386998378bf6585512b23694a676b448 halomaps:2772 +demino.map 7B7D19DF 28611068 262144 27eb79d3501213bdf294ceb59767f630c0ff4446 halomaps:3893 +deminoai.map D10957C2 80570585 262144 243f478903db4e63d6e41f872b40a6926874f12d halomaps:3894 +demise.map 4F0E3ACB 101432025 262144 2eacd50a66f183f81ac6027f7e248ae656476369 halomaps:4575 +demo.map 9F79BBA9 119919330 262144 992eec8b6c27e74f707ad04238b29444403e230f halomaps:5324 +DemonsAtWarv1.0.map 20A39BB7 68198693 262144 5b5c5a1c1865f762f0bd5855e91c97d536fb5788 halomaps:6865 +demonsatwarv1.5.map 1DFAFB0A 107656207 262144 7a568e652efbfd687c1c155b93994e4edfacefa0 halonet:demonsatwarv1.5.zip +DemonsvsCovenantv1.2.map 91CC81DA 129869947 262144 8a199a701510a98ea3e97b5d1d03e752d8b1edb5 halomaps:6866 +Denial.map 5CC4B538 17334776 262144 832b12377704c51288a5cd6ba9b10e949c3a18f5 halomaps:1906 +dennis.map 59A883A0 14051254 262144 4bdc62a43333ec6f12926f6dedc66fea4619975a halomaps:3066 +deployment.map 03766751 60015654 262144 626bf12cb00f3e4de50dec69573b112e6c3451c5 halomaps:2424 +depot_beta.map 686E65C3 13086048 262144 f44824863d91423ca6ee0ec0a344961e07b04b94 halomaps:1805 +depression.map 5FAC364B 38297733 262144 322b92f51f4af036e6c065f371df74220a4a82fb halomaps:6492 +derby.map 08CBA0E2 17212996 262144 778e8077a9891469bb79606ac16ae4515fb58dac halonet:derby.zip +derelict_tourney.map 34AB3300 26695416 262144 8657335c30e9675be556261c58a1b3af3c45adf7 halomaps:2510 +derp.map 3D0ABB28 12713576 262144 1e86473e68d5713e5e3fc0d03f9677aa8b6eb634 halomaps:5123 +descending_depths.map 448AFB18 17563248 262144 828909d7d2fc6e3e89f8d9867037cd7306362bbb halomaps:5278 +desert grove.map ED120CCC 52173672 262144 3b69717b8eec914819c253492a0a95d0ccccf75b halomaps:3754 +Desert-of-the-unggoy.map A0BA732C 31071013 262144 d847cf897814fd6e869850c9b38dcf3c9969680e halomaps:5326 +desert-warthog.map E56B254F 67730536 262144 1d3106141deeeaac71a7ccd9c6eda5ccc5f8ba89 halonet:desert-warthog.zip +desert.map 737DC176 71982597 262144 9db93b163e7931db56c3415efefe16f1dda412ea halomaps:2193 +desert2_beta_0.2.map 1EA0F72D 31797992 262144 99e5eec28c5325362971f2cc461f8f50d6b5aa1a halomaps:2338 +desert2_beta_0.4.map 80C4BE02 41350424 262144 c54e16f38776ca4910b54e498f6293f7840110a3 halomaps:2529 +desert_battle.map 9D97160B 58704614 262144 3a2ac5b74f5c60f00f043ca5866dacad76da7fa8 halomaps:3755 +Desert_Battleground.map B2BD3F5A 57335749 262144 a01e480fad6e2dd71163d7b57b57393c10e1c019 halomaps:3609 +Desert_Battleground_V2.map 0767CE5E 49814806 262144 d6e99a122f0f9dcadcd6b9c4b18af8c62c0ee68f halomaps:4507 +desert_combat.map B72A69EE 68403886 262144 63560ce63a011a913d2b88118190f8ca86b34b09 halomaps:6278 +Desert_flat.map 711A10E2 16007440 262144 f321199d937a9e229a4da58c6782a84924b542fe halomaps:5606 +Desert_Floodwar.map 09C624CD 79409710 262144 bccc738efc2bc06664624bd8bf9edca7990c39af halomaps:4636 +Desert_Island.map E59BFA3E 12240432 262144 aef2c90d8d50a4e4912d499b8602ccb1dc56e401 halomaps:398 +desert_island_b2_mined.map FC3F3E90 12586540 262144 c992ddb301e380855669b875e16353f6cbed84d2 halomaps:1707 +Desert_Island_Base.map EE14C24A 15546090 262144 ad888bfb23a0c1e52df53dfca74f6b2a23d5fb10 halomaps:4466 +desert_sands.map C25F14CD 53771634 262144 d29612e29aec9a3e3b9cbba38d3d1af40c032521 halomaps:2773 +desert_storm.map ABFB99E1 16754816 262144 6dd592285c46d143437299aa6b6f14929ceba7cd halomaps:590 +desert_storm_v2.map 8580209C 22476550 262144 c87c301147f962f93a656d1037d895b4bbaa08ac halomaps:2237 +Desert_Warground.map CFCAAB3F 15494372 262144 3ff9a572540a1227e5d57e23992f5b4de15b4c2a halomaps:3143 +desertb18.map FD3E8AA0 19807336 262144 66c72ea0e17dc41dd430bc52fd9c9577f60b34be halomaps:4193 +desertbox_mp2013.map 0E5CAF8C 67387970 262144 98d65e02c26c371212fbeac50512d36f7f8af2e5 halomaps:6589 +DesertCanyon.map 28F36C56 16919068 262144 75400958060d7641f69ae62e7de9b209d19b2ee7 halomaps:4323 +desertcanyon_pb1.map E3BC80BB 334405963 262144 64f67be3ae92fc75c4fdb588c3ba9be54ef531e8 halonet:desertcanyon_pb1.zip +desertcreekAI.map F3EF6836 47621954 262144 47df6ab213eb811ac4989b2d2811dfa11dec27c5 halomaps:3598 +desertdunes.map 8F77B526 27707808 262144 315d082760c68ec04447946bc5f629bfbe23f0b2 halomaps:5230 +desertdunestwo.map CB175F0D 30521636 262144 2133fee6ba2b55f3f0e68bea9e6ad4045c91a85b halomaps:5231 +Deserted Again.map A596CCF3 289518420 262144 5b465d1dda8add61740b72cf8e856e4f9112b176 halonet:Deserted Again.zip +deserted.map A4FEC615 28111791 262144 943842f0887d94e012d5cc1571681697d7d46c0f halomaps:3848 +deserted_beta.map FC69F771 25689820 262144 77582c163dfe71b410046977b5cb61b5c85421c5 halomaps:3142 +desertgulch.map 5EA3D576 153935208 262144 5e32c6102b7018016d21e1ee5d6724ceea1c0e4e halonet:desertgulch.zip +desertion.map 9AAEAD3C 21843787 262144 354057a9046ace85a2b2b3bb56652a3ca959d25f halomaps:3666 +desertland.map C99DF7E0 131697646 262144 d0dfc63771701076e3d7922e6325b34f527844c8 halonet:desertland.zip +desertpain.map 2839E9D8 16595920 262144 d93828464f7a484147def414f6fcf79dd2379a50 halomaps:2013 +desertplat.map A4793362 47075560 262144 1c8d4fe25a71a33c0b69b99e439232f63f902055 halomaps:589 +desertstormalpha.map 8F348752 23887660 262144 31105e8cfeb6f56388f1b00dcbf7ad7252099343 halomaps:1852 +desertvalley.map 8E4D5DFD 14698660 262144 a78ef42471ceae828e4c1dc1fe5d922df9ce467f halomaps:306 +desert assault.map 5896E658 32856560 262144 50d72fbbd00dd632ae3677efec78ba8e7b2139de halomaps:5423 +Desolate.map A4ED5076 19417052 262144 24228aa156cd52cc335faec8eb7928935858b395 halomaps:1907 +desolate_beta.map E2BC9098 28275100 262144 9067ab6ea2e6300277dd1a75120c74d1cbd83944 halomaps:2425 +desolate_keep.map 572E7088 21906018 262144 d76205e5a9ef1ad41f580de7aa5110229791b217 halomaps:3610 +desolation.map 0E7EF3BE 38237725 262144 136e2e2b4cb592f21a06b9cfd5f42123ac52be4a halomaps:5782 +desolation_Beta_ver1.map A0799CE1 29541264 262144 da0f8f723c97fc63c121620b8be4a2408cf28cfd halomaps:2603 +despair_canyon.map 9C713304 16800392 262144 d10616caa88923ff1b1506e2fc80de85fe5b2388 halomaps:2902 +Dessication-pb3.map 00000000 190393912 262144 96debb5d7c8d0382f6082fc37abc26fa1e6f5884 halonet:Dessication-pb3.zip +dessication_pb1.map A3825074 36900113 262144 014b80252ddb540d3776f735b783e22fe4989486 halomaps:4837 +dessication_pb2.map 48088E0B 36893053 262144 c6d07eebc69b5088290ca17d3611aa1b917bdfae halonet:dessication_pb2.zip +destination_v2.map 9D8DDC82 41319011 262144 49a6fb0dae899dff8b3553cbb51b96d76577c0d4 halomaps:3497 +destiny.map 9002E01B 21289860 262144 37665f0573538e855412009e20cd6db3f580a0bc halomaps:4681 +DestinyCanyon.map 4078091A 118693779 262144 163df5616c0e47f6181d83aaec3a337d9b9e0ba3 halomaps:6571 +DestinyCanyon_v2.map 690D29E3 114300835 262144 dfb7ab93dbb4ddb7bdd93bc764d74b0fa41f90ae halonet:DestinyCanyon_v2.zip +destruction.map EE7A5AD8 25166768 262144 a90833f216c1a7a38bb6b46bf1efe47cd4fed9f2 halomaps:5236 +destructiongulch.map 020BD3C9 53251997 262144 99292f015a74b2a032bfede84855ec8b8492bfbd halomaps:5244 +devils_delight.map CD3D578E 13035592 262144 225b3ed963d8845089b07d27a75e16f148a6b335 halomaps:3162 +Devils_Drop_Race.map DAE5E806 33843324 262144 dc60d82b24fbe2fb6fadb0000bce9c2f5e719d2c halomaps:2763 +dfs-bosque-abandonado.map 3CA54E44 23037828 262144 a785f04f6de3bcfb8ed0dff7ab53aa4137be0cd9 halonet:dfs-bosque-abandonado.zip +dfs-ciudad-spartan.map FF94709B 50720412 262144 ca7a7c9c7f4a0a5cebe5f641ef9c24b39a15f520 halonet:dfs-ciudad-spartan.zip +dfs-gran-nevada.map 63B3E58F 15609842 262144 0ad7b24664dd7b676a98c9a351ac309f40e61510 halonet:dfs-gran-nevada.zip +dichotomy.map 4548823D 22259500 262144 5fc6ab004fce74f3f92be0858e2bd21028c88a84 halomaps:4860 +dieing_forest.map F9ACDDCA 13725008 262144 09081bf372b8de809cf670ad0aab4702f0a9897b halomaps:2546 +dioptase.map 02DA8544 14164716 262144 b4356923a7741abc6187a2277c862ca224e1e094 halomaps:1331 +disco.map 5AC30DFB 36856375 262144 486121e73f3711b0da5fe19908d01a637b690557 halomaps:2790 +disconnect_beta2.map 7AF88DF7 50763396 262144 b182d01b2bb2e93b084434894404e24eac88face halonet:disconnect_beta2.zip +discovery.map 9B8F1690 43821731 262144 9296d5c821ac2bb418507b71cd4e42d0efc355f8 halomaps:2364 +discovery_final.map CC407E33 37812908 262144 d709681f535e46f24ba72ad5af2b78a74a4b0903 halomaps:2426 +dismal.map 086F47F4 38738186 262144 409b8edc7b35044ee2c55b282fe08acc7527ff01 halomaps:2969 +Disposal Site07.map 596D1ABD 26533856 262144 ed4c3b63897412882242e5e69e9cfbdd90f3e637 halomaps:3599 +Dissected.map 20E1B418 306603378 262144 56371f52a0368e9fcc7b24ddac074d6e3478f0f7 halonet:Dissected.zip +dissolusion_classic.map CF455E0C 45555905 262144 8bce279e4b9d92da9624c16c1bf52aa18b5782da halomaps:2385 +dissolution.map 2AA43FBA 25853607 262144 88ba6c35167435d75c624c78963ca5d9bf5b7777 halonet:dissolution.zip +Division.map 0E4AF52F 35678968 262144 46dc96685c74515cd04f873678fd024b044956fb halomaps:1716 +division_falls.map 1A1F1CFE 17503616 262144 16b109be3bb98529dddd0b1bf8980ffde1f1726a halomaps:1294 +djw-delta_station.map 57B0D25C 13354684 262144 f2e53dea3bef00c50297e12d087963921d51efe1 halomaps:221 +djw-pacman.map 3D40CB46 11349492 262144 53ebc065ceceb724b60758b677f940588384350f halomaps:1623 +djw-pacmanbeta.map 7D734EBE 11348652 262144 e776c869ac04efe49148d8eb633f0cabb05dcf1f halomaps:1611 +djw_alpha_onesimus.map F8BF70AB 36891484 262144 5275fab6fd9cca449be11810369718b24432a9ca halomaps:1806 +djw_alpha_onesimus_a.map C00771E0 36694212 262144 8eab0d0d11656e22cdd9ca968574c7968f521d53 halomaps:1825 +dm7fear.map 4AC71169 18211572 262144 435389e4d0de6db8422e754f2604c1cd1ebd6423 halomaps:222 +dm7fear_V3.map 10889D13 41236760 262144 f9d951b02f0277fdfdbdd9128d1113853a6af8e6 halomaps:2684 +dmap.map BC2E26B2 20136236 262144 d5e09ca03c9401c698520d125dc9badb45bda2e8 halomaps:2883 +DMCb30.map 5C85B6F5 115480554 262144 9dac9ab6d63677101ded873a394d97e48d02586f halomaps:4327 +DMfightgrounds.map 8AA46489 17658640 262144 10004587b3b8e57966a86d27cfa41f78b96bef92 halomaps:2339 +Dmt-Air.map A3F77C30 26410034 262144 a02238816a2a3700105cf27c7bf327f0cabeef9e halomaps:3820 +dmt-bound.map A4052187 46509634 262144 8511a37b396315cd04fce926bbf9e1cb19b8c90e halomaps:3468 +DMT-Broken Indigo.map 8E1A7F90 18731384 262144 87aecdc27b900ac0d1c51866d059e82202fa7dc1 halomaps:4114 +Dmt-Cairo Station.map F4C865FC 56821186 262144 9c78f449842eae8813c4d115cc075bfb38deab16 halomaps:4260 +DMT-Drug-Bust.map FE8E33DD 128664127 262144 2b55006b3aa396dda36b94a54017564501ed172f halonet:DMT-Drug-Bust.zip +DMT-Goldeneye_Stack-BETA.map 495DCA95 31126644 262144 fd1e0c24dbc14bdd5e7e91d55b81027a450b3343 halomaps:3469 +DMT-Neutral Bomb Canyon.map D0C01884 16901412 262144 e32594904092a249d1211009e9bef8364951c22a halomaps:4582 +DMT-Neutral Bomb Creek.map 8A66FB5A 14055556 262144 b04a3bd39ee36b9824c768ddf631f6e16257f8e8 halomaps:4583 +DMT-OD_BlowCity.map BE661B41 100477169 262144 86d308df33e6326e574cbe8bd14b6f491de27443 halonet:DMT-OD_BlowCity.zip +DMT-OD_BlowCity_Night.map 1CC24B07 103441697 262144 16327e48206c0e1393d3dafb0491c9b811dcc43c halonet:DMT-OD_BlowCity_Night.zip +dmt-od_crossfire.map 8BBFC3EC 126758233 262144 afba83a86d58905b1a3385b42513339eeea54936 halomaps:3697 +DMT-OD_CrossFire_Night.map B95BD2CD 108695159 262144 bc6e701cf42190d0903b0f2d414674dc066b775e halonet:DMT-OD_CrossFire_Night.zip +DMT-OD_CrossFire_V2.map D63325D7 107107423 262144 06e2a3e630054f1e263ce3374c303c68f89a8503 halonet:DMT-OD_CrossFire_V2.zip +DMT-od_docks.map 38A56820 99941892 262144 4f67ec63ba084cde033722ce737287b55047f6d4 halomaps:3756 +DMT-OD_Dustinteriors.map 1D63DAAA 89475849 262144 d9ce17c3545c12cb412e49cf19f0303d9fb73d10 halonet:DMT-OD_Dustinteriors.zip +DMT-od_hideout.map 180C8FEC 122956815 262144 bddc6b5a864b4aea124ec8ade330d213e0ff3a49 halomaps:3698 +DMT-OD_Hideout_fix.map EB6DA1BE 123002679 262144 a8e84564931f2036f0f72eaa4bfe7180569ca8ba halomaps:3699 +DMT-OD_NoRegret.map 0503AAF8 133552915 262144 fb13572ed47edc44a847fc130d9281f5c00e57d7 halomaps:3700 +DMT-od_outpost.map 736C6167 124550410 262144 cf45e5111fdcf5bc1d281e86008456e3557d9183 halomaps:3701 +DMT-OD_SP4_Upskirts.map 9A30071F 153203508 262144 418f5e5c68219d53d467aa080e87d724a49b4b70 halomaps:3722 +DMT-OD_Waterworks.map 601E6EC1 88768741 262144 932c387d38d690774f38da283d3700ea6804a56a halomaps:3757 +dmt-ohh-low planes.map 6E73ADED 12340016 262144 b874f648a3bed8ac40d15d4c43d6fda0f1929eb4 halomaps:4172 +dmt-ohh-timber.map 791B063F 13009248 262144 1bac56f6c59cc0446670aa2e77a615b9f1e0343c halomaps:4173 +dmt_racing.map AADD83EB 79069169 262144 9f3f8c70078ac646f4bd4ab375cb22de128300ac halomaps:3316 +DN3D hollywood holocaust RC.map B1106D7F 66940072 262144 b0e4040e355ac1a8c3346181985300703f5fd568 halonet:DN3D hollywood holocaust RC.zip +DN_Dangercanyon.map E3BC80BB 76599572 262144 c092e359d4eee2d955482b6b24330515bca047bb halonet:DN_Dangercanyon.zip +DNL_Path.map 76A7D259 17658400 262144 392ad0ed9f4271176a0f86f8d2bf6c8b6293525b halomaps:1997 +dodgeball.map C582B562 16786484 262144 56db6c08d5a71206b1f703dc5b8a0e8bf4776688 halomaps:6147 +dogs_of_war.map F47D9BB3 106164092 262144 159e5d6359ad493d6a8f388cdcb9e23c41507d7e halomaps:5327 +dogs_of_war_nightfight.map 9EA4799C 105517292 262144 f54daffe550fcb67b33c89545f686ca6b45d92fc halomaps:5337 +dojo.map 3D7E1FF9 16823020 262144 bc2d6a5e3e371cd1bb3746c35afc6d8ac8a43cc0 halomaps:407 +dojo_final.map 581ED67A 23053968 262144 6843995f1a047eba3e5a509d3d0a5b998299a742 halomaps:425 +Domain Final.map 5E0C299C 133541884 262144 9d8e19f5917bf4e0d24a0125cb90526786518c30 halomaps:4682 +domain_beta_2.map C5244CEF 118698688 262144 7835499ac8b20007eda1ad90f4e9e9cf02fa02a2 halonet:domain_beta_2.zip +domain_day_beta_2.map A714926E 124852150 262144 736f2cf53ea4e8772443a960b8c414fb428c6f1c halonet:domain_day_beta_2.zip +domestication_metest.map E9E30196 64470175 262144 c5a1071da4426c9a80e8086f917755d26e74e42e halomaps:2340 +domination.map AC06DDF9 17333300 262144 ccc109cb0167297475a6276fcbb1a19fcc9d3353 halomaps:3370 +domine.map 2D2D3DC1 19776764 262144 0a1c7bb652865004e8bac234d7127d2b4c1c7196 halomaps:3144 +donny_for_wirighi.map 6655B780 30333631 262144 09d96633ead85376ad35c3176c29db5b86cf4cee halomaps:6475 +dontlookdown.map 70FA8420 16065800 262144 80839c911a14008fe558b3d345ec8da29aad81b0 halomaps:5287 +Donut's_Mod_v2.map B7C73E68 75626665 262144 bbcd5a63697f6df5868debeff3c697f1570980e6 halomaps:3875 +donut'smodv1.map 57A26275 83843829 262144 0b7178dc26a3f1f5d125ebc8d414de341f66f66e halomaps:3563 +donutfactor_publicbetav02.map 72E8A728 16427184 262144 636101faab560299d45610f0c8ede32e39b12f92 halomaps:2666 +doom_wa_view.map 153D369F 86594262 262144 c9a547f29188830d0f94bf7d7d6cdea135fa496f halomaps:3959 +doomsday.map 6A342D2C 122322018 262144 2a89f3f4be527a598a3941872e1814109d9e5d0b halomaps:5561 +Double_Penetration.map 847B26E8 387508461 262144 241f050942f30e68e6ad7a76537e31be4f29035f halonet:Double_Penetration.zip +doublecanyon-beta.map 245B3F40 23371560 262144 684d987d012775130282826f87e17b3d0fc65b0c halomaps:5019 +doublecanyon-betaAI.map F5FA2B12 25170540 262144 55eaca1678e38f3823c01900d7887dad38a76c6b halomaps:5072 +doublefaced.map B8FB28C6 17531532 262144 2cbcbfdc13dd5f8802c3b10c420f6323ae48f7c2 halomaps:3067 +doublegulch.map 8853B4CC 20326404 262144 cdb066dfaed36a95e47bc624e738007a31d03cc1 halomaps:2850 +doublegulchv2.map 17BFE3DC 40609952 262144 96928eb506f0f5177ec76e29b67d92c2ca8fa4f9 halomaps:2949 +doublerock.map 1E3A5016 14844816 262144 e98632b700c1cc7271875c06c0a15d5a15bc0e75 halomaps:572 +downfallbeta2.0.map A31FC514 74809763 262144 d876337e4854cc7bb2b02a9137b7c9c0418446a6 halomaps:4981 +Downfalls.map EB5D4DC0 21279476 262144 d98601bb0644e37f0c23c7fcb446f9c4ab8e6ee2 halomaps:4454 +downflow.map 07B73D86 126166887 262144 7cc16ab98dd438b1dc44247d3c6c78c0cfd291b0 halomaps:2052 +downrush_h1.5.map 8F2A1335 13807476 262144 f1cca53d0d8d195bb0c9beafd289c00bfea4e99a halomaps:7020 +downrush_pro.map 8F2A1335 13807476 262144 dae261a57908685484406fb0ee66955b83d6b22d halonet:downrush_pro.zip +downtown_paintball.map E07653BA 90642799 262144 96e770a67babb9d17d51e7ceb5bc323d22af86a6 halomaps:4900 +DR_beta.map F536E60C 25392872 262144 651d91ed679b03455adadb654da9ef4755a8af54 halomaps:4537 +drag.map F5B9DB15 24270860 262144 51fd181d9cf1adeac9d8c69757e8eb1aedadd8a3 halomaps:1951 +dragonball_ce.map 00000000 48469176 262144 006e9ebdedba7134627242d0ca6d01727893c3db halonet:dragonball_ce.zip +dragv2.map 1ADEFB52 13787036 262144 6b09a86f257f1de4b70ee39a27d76e78d4adb4f3 halomaps:3937 +dredwerkz9.map 03ABE576 82881051 262144 f3072c1f7865b711ef9059657aa0ebf1f9c45a23 halonet:dredwerkz9.zip +Dredwerkz_PB2.map A2D7E021 74849188 262144 42ae0db665f38e948e935577aaf0bc4fd6e48a4f halonet:Dredwerkz_PB2.zip +dredwerkz_pb3.map 4C00FFB0 100142706 262144 53f1ce0f0a391403d09a1afd77481cebdf453198 halonet:dredwerkz_pb3.zip +dredwerkz_pb4.map 18C398FB 100202687 262144 ad4c9071cf45c380cbd343336c399db890aff584 halonet:dredwerkz_pb4.zip +drivegulch.map 003F66B5 23433687 262144 50e261a8b61e8ba906242b4a1ec8b15ef6ea871d halomaps:6620 +drknss-demolition.map 83240FC5 48775045 262144 1b60d5b6785387cb1dcdc2d82ba9514d3125cb12 halomaps:6341 +Drone-Gulch.map F2966A91 23783508 262144 2b8eb14a5ce6011a337e9d65284feee80a3bc805 halonet:Drone-Gulch.zip +dropzone.map 81EE7AA0 23673660 262144 7924876a09c44ed7ff67b0f1981daca93b963c32 halomaps:709 +drumsofwar.map 70EA3A88 14724696 262144 41fae06f41cff372f46fd0c8c778cee16fc8409c halomaps:3938 +drumsofwardestroyed.map F01AFD52 34727358 262144 cf857b61cb8f2d89fdc9203d186e55d9948841d7 halomaps:3960 +drunktank.map E3A2E513 20254281 262144 eb6f2f8955d7625333d5d017ed2d9ca581e4c90d halonet:drunktank.zip +dsmt_dreamtrap_classic.map A7F427FD 54659948 262144 0f6cf6430b8effb9c337c8710cf7a7bb34a9a7a0 halonet:dsmt_dreamtrap_classic.zip +dsmt_dreamtrap_modern.map C4BBBC4D 118282341 262144 0740eecc9ae610e570a6b00a5bcc32db0a2bf230 halonet:dsmt_dreamtrap_modern.zip +dsuclanmapbloodgulch.map A3BA8AEF 39942652 262144 41c82226cca9735c65a02e501fde46e19f8a2564 halomaps:2156 +Dt-Battlev2.map 695C8A48 130463130 262144 63ea313d4a94cc7377ae3a279a51c40781208382 halonet:Dt-Battlev2.zip +dtfo_hq.map 88BC9214 19885436 262144 9969410123997ff1f9b1c7519c04a209138482ac halomaps:3581 +dts_ascension.map 67C63D95 82482772 262144 8f93a66cb32a2442a8219f9695da640757c7be0e halomaps:4598 +DTSP.map 88E405A1 82681566 262144 f84258f7815df2380ede4ce124f1d163fb6e5858 halomaps:5177 +dualing_keeps.map B1A26446 20609392 262144 f4afbc8275d5cb0379dda2c6c0d12f2a84f3aa14 halomaps:1118 +duality.map 209A54CA 76145201 262144 c956e7a0b99fa271039936fac4df42379b821d2f halomaps:2427 +dub.map F18E79EE 13145256 262144 5f1a43535ed3105b4bee7d3658d567100e3645f4 halomaps:223 +dubai0,3.map C742D81F 174547672 262144 8b25a775bf52150e66ab6cc08e4b92222f42afb8 halonet:dubai0,3.zip +duck-hunting.map C3A2AB0E 17805990 262144 1246e5a84fe9b2fb85767199eaecbe84f09ab23f halonet:duck-hunting.zip +Dude_where's_my_BR.map 28508909 81004633 262144 89516729fc3bc6f7ff4362a146ece3cbd193e491 halomaps:4967 +duel.map 0D8035AB 25116576 262144 524fc30b6ecef128638cb716c27408aac83f58fe halomaps:5102 +duel_to_the_death.map 061204D3 88941910 262144 c48bd1d404093960e093a50c5fc965f28e8b03ef halomaps:5870 +Duke_Nukem.map 18070350 260184588 262144 1583d097ffbd25cc8c78f21d95cffd98da516f86 halonet:Duke_Nukem.zip +Duke_Nukem_Fig.map 26CCA269 260184668 262144 3f1faf322dd355aa08ca608e6e4a0263d380fa27 halonet:Duke_Nukem_Fig.zip +Dumb_AI.map 60514B93 76179609 262144 0ec4bc4678ea3b3d877449580dfe2d15eb396be2 halomaps:6194 +dummy.map 53400EF6 31418708 262144 7bb9377447630819a8257d3c63848d317ba2b527 halomaps:3479 +duncan.map 1CFA7678 19171301 262144 622a0071c6d186e6e587ab1976ff762f7231b5e1 halomaps:4538 +dune-race.map 06D4D19F 19998516 262144 a39b099fb58047f4e2bcaf9e0bb32fc1adf98108 halonet:dune-race.zip +dune.map 7043CF6B 15876988 262144 4b5e4f48b383671b7fc4f22b0cf1036a8e24915f halomaps:302 +duplicity.map 9D8265F3 42294411 262144 5f9331526d53061c18fb2d411da69c912878fa61 halomaps:2191 +dust_spike.map 511B6207 16770237 262144 c4613637318ec78e20460ef5c36153d8ff8fe7ff halomaps:7102 +dustbeta.map 7CF2FCDA 79957470 262144 ecfb22845dbafc8961fa1e727efce1bd144fcf88 halomaps:6824 +dustbox.map 1409DACB 24807640 262144 2798bebb6ecf3ad85710d856a38cfa31c1fa019e halomaps:7073 +dustyle.map 4FEE06BE 24894352 262144 a750744bba1529e27cf250c04c1cdb5319642098 halomaps:3531 +dwm_disregard.map 233DE62D 77100475 262144 fddf98857f021fa820b4dc074f8bf3d71b1fdf87 halomaps:5369 +dying.map F840E57B 21967356 262144 3d074593a8c23da393045f817750dd754ef285b4 halomaps:2716 +E.D.S.T.mission.map 55006FF2 127031484 262144 820416c3384b8a7b3c4597308823cc5ff7a5c3dc halomaps:6279 +E.S.V.map A2579255 33416195 262144 ece982b5084c70fe5816b47df3ef1ce6559bb7a6 halomaps:4324 +e10.map 2FC4CFD7 181013576 262144 821c89220014683a57096b9cb5633de59bfae1f6 halomaps:5345 +e10_demo.map 285C90CC 169864380 262144 e06c79e7ef6b5b6dabfd6a980f60fc68f4d28c94 halomaps:5233 +e20.map AAAE7ABB 123216074 262144 cf8e0ae7451c74fc162efd9b3f9b4a63a429a57b halomaps:5344 +e30.map 1328E3D6 110321062 262144 e0a469faad361573a51db0482370f8b8ba5d6155 halomaps:5343 +e3gulch.map 5AE96A14 54382739 262144 8daa0e013937645f3007e4a9548bf5176bdb1d9e halomaps:3405 +e40.map 4F182E1B 141044469 262144 c7fa58fbe6ce9e8abba8260f5ae141b65bbd4fde halomaps:5342 +e40_demo.map 3480C44A 117842156 262144 24c6415c134a5260440b11d1bfd3c503c0085b5f halomaps:5201 +e50.map 35BB6E22 122406962 262144 fd35e21bd18e30a15f1830a3a2c96362d636d186 halomaps:5341 +e60.map B0B0C31A 251715501 262144 9b690329e952801a4fba2724741bf16b535d9ff0 halomaps:5340 +earth-firefight.map E76EDC30 354659283 262144 e7c295cd30536ceda4fec6e33c0a11a5a1996345 halomaps:6921 +earth_canyon.map BBCC1BF4 28280320 262144 65799bff74034ae8f2fdb75b55bbb1ced067dacc halomaps:2717 +ECD_Plant.map 9D6587B2 44090420 262144 dd6b2de64a5fedb0105c1cc3641fc7287d4b8f2b halonet:ECD_Plant.zip +Echo_419.map A95F9AA4 133402152 262144 cd575ef27f1318ddd33b17114690ed3cfbfe308e halonet:Echo_419.zip +Echo_419_Foehammer.map 63AEC202 133407120 262144 76a42b0ad72fb442719ac39eb534cef0b2bf2cc0 halonet:Echo_419_Foehammer.zip +echo_canyon.map D279B484 14754544 262144 ec7585a59f49c5f56b4e8a72d18991dbe079100f halomaps:2127 +Echo_Hills.map BABA0FFC 128301101 262144 f85491fe89de3549387052cf007d2525fad65b48 halonet:Echo_Hills.zip +eclipse.map 4858BFAA 43243029 262144 3de7e847484811c5bccb8b4659a782a6a8c59e73 halomaps:3560 +ecocreek.map E40983E6 13100776 262144 e276b56f930abbb8bbc1aab49b0418240bfefb80 halomaps:3758 +eep_scarab!.map C45FA85E 40891994 262144 e0577d84eea8a54858e22862ad9144fd0cc7ad9e halomaps:6310 +egg_fleet.map 12198D32 14862885 262144 87b1312e8ec3440430dae87d2ddec808f7634b0c halomaps:1078 +eggfinity.map 5C540808 28599154 262144 6cef3e188487d698a0dc353beb5ca097e67802b5 halomaps:4115 +egypt.map CA5ECEB8 14704113 262144 4d5e0ef8754d7ce9320fde90c8370a913200d2b0 halomaps:2341 +Egyptian_Secrets.map 8EE05845 401628011 524288 ba6e570d874f305e024ed6f1d4255366af594113 halonet:Egyptian_Secrets.zip +ejvh.map 86E7512C 53027384 262144 2b70ed102dfb20d4be4762f42561e21146ce071e halomaps:6621 +el-horizonte.map A59D3B70 52705541 262144 c7fa62dd2e38575cebeff3b08ecaa2c045ae89be halonet:el-horizonte.zip +El_Cartografo_silencioso-parte1.map F82F2D71 121559186 262144 a1d5c6d6a88d22a15c712c56fb045ee6939a270e halomaps:7074 +Elara.map 7AB89072 23228702 262144 67ff8f57507b21d697c65cf3b02fba08929d3f28 halomaps:6922 +elarav10.map 047CEEE7 244194101 262144 b8e045ddf8fc42292bdaef307a6f0d861eae74a9 halomaps:7103 +electrica-beta.map E9886391 21746606 262144 f069952881af800ecd909eccaa91b6fa0e61550d halomaps:3582 +element valley.map C43F1B2C 21659533 262144 33fbc3062604aa8c4a3e60281167c4ed6262f9e3 halomaps:1100 +Elite_Alpha_Siege.map 91380C25 59280439 262144 87ce5863bce5cd3d5f4e83b0f2867157aa08346d halomaps:3658 +Elite_Alpha_Siege_No_AI.map F62F73EC 55198039 262144 ab0b7200bf49abf1a441f343873bf1eac9ebe49b halomaps:3659 +Elite_bloodgulch.map AB3AD629 25873114 262144 8e8463daa26b6625390e0b0e0ae2399f2e95d99d halomaps:5405 +elite_bloodgulch_style.map EC72C924 56156693 262144 e46647353086d8ef6c2d740183c29bdb3bcbe9ef halomaps:7044 +Elite_damnation.map FF9FA13E 222983771 262144 3c44f670e928d33259a8993df56a32948022523c halomaps:6825 +Elite_deathisland.map 58E2A04E 31647630 262144 2e7dca2f5d866e7093b1eec13b4a11c37966638b halomaps:5410 +elite_fight.map 7CC8D7A3 65598252 262144 30e874c09d58f079da6f52dab39af7f634e39d40 halomaps:4683 +elite_island_beta.map 1928EF15 24033148 262144 168a152b6521e06e1c0866b84c9d9c2ee760a92e halomaps:5686 +elite_siege.map E252D2B2 20678280 262144 2feac9b5b801ad28e214743fb559893833329442 halomaps:1853 +elite_timberland.map 30DEB7AB 98298184 262144 1a695aeb7ac23235af1103d5e0d8b24925578e51 halomaps:6826 +elite_tournament.map 1B0ABC31 22448832 262144 aa6dddbd69eab6d8861c3d93218241c2809774f8 halomaps:3193 +elite_wars.map 6FD8300A 32623465 262144 bb56cb620a2646b14c1f87c9f1710cf0aeb031f0 halomaps:2919 +elitegulch.map FA1BA122 24702582 262144 80d172138669c6bb2175767cabe361623aa6d67c halomaps:2365 +eliteland.map 130E42F9 23530519 262144 f55d82c6e50047ac3be61e98858f504c194f9cfe halomaps:2085 +EliteMassDeath.map 81B18370 19751998 262144 c13b6ef33d9634e1d9c1ca57a1c4dbc242f0c534 halomaps:180 +elitemidship.map 840206C3 58254744 262144 bad58dee85c98453206cb9eca5e7bc9cd27306d4 halomaps:5838 +Elites-vs-Brutes.map 00D7C43E 64659640 262144 a5bee926e33f5dd7f7f3d19daface163b18b9405 halomaps:6250 +elites_vs_flood.map 4602FFB7 86934578 262144 fc88e8c22f5618b2d2ca47a66d1613bcd6ba26d9 halomaps:6048 +elitesvfloods1.map 1FF32C43 90100451 262144 11af231565c9684263874a99e9b39e4050767f92 halomaps:5991 +elitesvsmarines.map 853FF3E5 66548959 262144 0fa7f1251105f5e28addb987a55204283153bb06 halomaps:3667 +ellites.map 90A08CE8 50600136 262144 9be45f9ad5cddd9736de6e44b306d209f2bf769b halomaps:6354 +elmo.map C8BF2180 22843860 262144 1102ae7781ff55e843ae4b874cbfdb7f60ef3a6d halomaps:3912 +elongate.map 2D70B400 36238601 262144 c9eb57f4e4c7daad8822f5abb67bfa60ca362e4d halomaps:6867 +elongationnoai.map 4F2243DD 23606065 262144 96d41da252976a2cf6dc88c06bfcaf817246a597 halomaps:1807 +eltes_elites.map 4C7DE2E4 49674724 262144 1146a159e1f94144c2303048f2c8df1c9b01cfe6 halomaps:5979 +Eluded_v3,4.map 60D2649D 75134297 262144 859d5ad34cb36ecddfcf44d33ff0a0605df4f3a7 halonet:Eluded_v3,4.zip +Eluded_v3,5.map BEE1AC13 76212137 262144 c20bc931eb1a4cc9563a3a9dc0495414fa81fdb8 halonet:Eluded_v3,5.zip +elvira_city.map D037E841 34674120 262144 9a74c3b8d33bf2cc1f0fd23b182026831610b2dc halomaps:1029 +emerald.map FFC2C054 99859815 262144 dfee512f1ba729a3bf9b7c9397e3d1564c5b570e halomaps:5961 +emerald_coast_final.map 2A13E571 22404052 262144 94480aa82e99665b82bc063a51949cd509ff7436 halomaps:551 +emeraldbeach_beta.map EFD0EC6A 13037536 262144 750816f0dfd55946da0262fd98e089f30c281fb8 halomaps:1808 +emersion.map F2FCCE23 129302514 262144 ad9d04cebaaac130718168d0d2e5256eb6deb4c9 halomaps:5890 +emersion_2.map 40284DBB 132519442 262144 3819d9b0bac4b2dd79e689decfc4e358a9e69114 halomaps:5906 +emt_cliff_drop.map AC97617A 26214203 262144 42e8113e71dc5d2a4f9b57c69b61f5508a4a26ca halomaps:3168 +EMT_Inverno.map 8A9B719A 33371871 262144 119ccbe539d76035569b4342ce2f8c1ef15e6adc halomaps:3480 +EMT_peewee's_playhouse.map 35442C5D 25669307 262144 14565a1b7721c1ffec6f1a7cd87cdf1064274859 halomaps:3194 +Encampment.map 00000000 319014923 262144 9d0c64fce9248b57229ce64edf42ba7bb8c9ea39 halonet:Encampment.zip +Enclosed.map 54E95C68 22311252 262144 57dcc0bbf4d19ad5ec1671df58201552a7df6fae halomaps:2604 +Enclosed_Battlefield.map 18981655 33289708 262144 0739294c3522882538faab1385b005f0767dd66f halonet:Enclosed_Battlefield.zip +enclosure.map E08DE109 16854469 262144 3325dabd9b4c9e096c7a4b74bc5a57b17d941e0c halomaps:4277 +Encounter_H3.map 40FC33E9 102632983 262144 3cd179fe934aabeed1b943ff47aabf96a83925da halomaps:5301 +end.map 092A7400 154837878 262144 b3d68d4e02bc5f937de14e8bbb9a56d5a1f889a8 halomaps:4574 +endurance.map EFCC9175 21794314 262144 336ffd2f8baeeadc5a0f70a60d8204ea29e29005 halomaps:1697 +Energy_Swords-BeaverCreek.map D0F86A3D 14383721 262144 2c98a9c146a4eb0b4a6cefafb3b6f6e6e6b556f8 halomaps:1584 +Energy_Swords-Wizard.map 4F0704EC 20783633 262144 5ef3914deb5932a012ef99b31b3ab8f9cf94f7d0 halomaps:1578 +energy_swords_test.map 00BDAE3F 26410157 262144 a7de4a75feb2a777bb4ed3ccd055b05cc670d7a1 halomaps:1181 +energybridge.map 322A5889 12433676 262144 4b3e6f34ca44fb44d02bb883629244b4472cc203 halomaps:2984 +engiegulch.map 11FDD343 57856127 262144 c27b595ca03224e492fcce9673daa6b816bd1749 halomaps:6476 +engils01.map 5944D8F0 50433050 262144 ca15defdff2c1809a27187a2942b18d2fb1adaaa halomaps:6454 +engineroom_beta.map 2B43ADC4 57864321 262144 2c73ce195efdcce4db14bccea020600554675726 halomaps:631 +Enigma.map 30E337FA 19450148 262144 00340fddb7caaaa6f2cda712ddc0572fe33e62cb halomaps:6517 +Entombed.map 18552038 14172136 262144 2a7a6a7edd78dc3a947d584c42249f9f12c36731 halomaps:3195 +Entrenamiento-Spartan.map E37A77A7 385033214 262144 d96f3bc30dc132850b545273aae95e7da92de4c8 halonet:Entrenamiento-Spartan.zip +Entrenamiento-Spartan2.map EB1F8DB8 242235014 262144 f5cd41c73154c866d6b8fc5f380974e07a411bb0 halonet:Entrenamiento-Spartan2.zip +entropy.map E4E47EFA 16034200 262144 203053d384194ed2bb74ce5499884a1de91da831 halomaps:439 +entry.map 3B678DAE 23840975 262144 d5d56a7786ba0a88819cb1bba4c1b1f292e634dc halonet:entry.zip +enush01.map E04F47CB 50433046 262144 286908b65eda57ed5f0ae554280bfe0e294ae583 halomaps:6455 +EP_a30.map 05DA825B 110294150 262144 9403feb05809c912b8949d4afdbc226ec9798778 halomaps:1984 +EP_WINDER_beta_1.map C719D60E 82681253 262144 bb561d188cf518972b1f2d6e42ecc3cb130df1cd halomaps:3350 +epic_canyon.map ADCCC0FE 25420605 262144 afe1eac17916acc1b639828dfe64e1d83206837c halomaps:5668 +Epic_War_final_2.map 75E27081 37472513 262144 51bc786af55d2ea21c38d7e3f21e962c218c5c59 halomaps:4937 +epicenter.map B0180C57 45195968 262144 92a6baeecd0dbb5e3ab05e8f238ae0cb932b07e7 halonet:epicenter.zip +Epidaurus.map 4A574D6D 31183374 262144 396d883bb3ff11a6371e6dc6e0206860e1721ceb halomaps:1188 +epsilon.map 198DB4ED 14476898 262144 e0559c48d13359d961c7d87630a4aa80ce6f08bd halomaps:2122 +Epsilon_Alpha_v2.map D0E23A86 109131382 262144 5dcdff5390ab0413e753a397d3942afa0f3b9fdc halonet:Epsilon_Alpha_v2.zip +epsilon_sp_final.map 0DEACA61 168672492 262144 7be14fc5768c4491dde3f22d5e59b8ed3a06481d halomaps:5565 +EqualEndings.map B956EE97 18456072 262144 2c282c43a65755db93583f047144dba94e0ef487 halomaps:4617 +equilibrium.map 7E706156 27357780 262144 43260e12f0e34a711873664c790efab461c4520b halonet:equilibrium.zip +equinox.map 68308C14 32327352 262144 faf765214fe07e7081e2f0d757ec147183aec777 halomaps:1899 +Equinox_V2.map 4230CBFD 31949392 262144 99939dbf4e81f84866246565a9f159f3f02c3e25 halomaps:2632 +Equinox_V3.map 68455588 67846845 262144 575ca7ab09fc088c554814cefd2944f0768f098b halomaps:2738 +erasus.map 8ABD43FF 52851435 262144 471f990f020474150c2fe9861a88b942daafd646 halomaps:6456 +Eridanus V.1.map 40E0BD0B 172041605 262144 0a95131dfcd679865d04e210ebae407ecfe47921 halonet:Eridanus V.1.zip +Eridanus.map DAC88A46 172037757 262144 981472c2609b0152ffe47d649cfa7d6c2b16b188 halonet:Eridanus.zip +erosion.map E0E403D5 30506240 262144 2fdbdf3c3fb747650b446d35c787f77c1619eb74 halomaps:1900 +Erwangulch.map 8827B33B 53556283 262144 ed08cd4063bc7bd5d8d51a85866ddf0c82d0ef71 halomaps:4618 +Escalade-Mount.map AF22AEEA 19823072 262144 dd00d8e0b4b2152ab45a4a5e8f94758f1da55464 halomaps:2605 +Escondite_de_Escobar.map F749020A 256815884 262144 2e088dadfcc2d94c77cec2efc523a28a295128cc halonet:Escondite_de_Escobar.zip +ESF_WAR.map 933D199E 13952960 262144 a12f4dfb03b91781b493a1268ff32be92cbabf74 halomaps:3337 +esther.map 15FCB800 106177959 262144 7d962571520f0cd984bab3e4c241e995de6a5c39 halomaps:5924 +eternal_pb.map 27BCDAAD 64050679 262144 65167ed71dbe57a96b6bda23d1ca0ce1f90b3615 halomaps:6827 +Eternity.map D51471F3 120200526 262144 b17d8d95d683fcf5e0b53811e7a7934d94ef40a9 halomaps:6622 +Euphoria.map 069C00EF 130454832 262144 27171969c3a3339c9630e5699c0015daacceccd5 halonet:Euphoria.zip +europa.map F329F1AA 12643800 262144 aa45be2326409f0157a18483252d41d6796ed593 halomaps:2739 +EV_jump.map 5F956F7A 15034988 262144 0bf41a9190e60b96996f12a74f2023a28a59b715 halomaps:2086 +evasion.map E7FF116E 186183087 262144 cc5ba323f7730f0d117692c59f175f6a9042e25e halomaps:5509 +eve.map 2BC66163 14890136 262144 976e4d6ddf4ccf02e86bbef3228640732b614b25 halomaps:4584 +everest.map 6C51E68B 12830972 262144 664fc9c6de10da6366b332d0f986f1eeef943c9d halomaps:2065 +everythingthateverwaslel.map 97E10C1F 90876828 262144 4b665a6f222462298287f005c4c2f7968a06a65d halomaps:7053 +Evolved.map BBBF7C39 19579610 262144 43074a446eea3a82b3f6c3a91739f6df22995497 halomaps:231 +evsg.map F2757EEC 29207024 262144 f6a81892eaff798c02657577c3a035a4ab44f43b halomaps:3082 +evsg_v2.map 86C5E69D 31533561 262144 8361cca4ba9132e8f1f7493e9d17b613860f7154 halomaps:3145 +ewok-remake.map 1103B555 80479374 262144 7e1a06b87c8348553f6296ef10c18f2653aa1ca6 halomaps:6923 +ewok.map CC60FEDE 21096424 262144 bc4cce199b2070b90afd0c89e74e8edca3d5db91 halomaps:486 +Excavation.map 508545F0 32071770 262144 be1705634afa5b77e57611ac56f776c47fdd0204 halomaps:1473 +excrenation.map F6F89A1E 30396312 262144 87ca467e613ede60a06b538cbb37bcad6b00790a halomaps:1926 +exhilaration.map 852F3686 18918456 262144 99800d6b22282ee761e075057150991ab37c6768 halomaps:683 +exodus.map E05403C1 127052996 262144 d005e40930a3f94cb4f73a1345ba3d2fa2885cd9 halomaps:5891 +experiments.map 1425DDCC 13695104 262144 be044203005b9ca0636ba0dd623d1ad3aa9f2d88 halonet:experiments.zip +expertsvsnoobsv1.map 92F6095A 16162292 262144 5942a89e278b88ab7f016e880575db998f78f68e halomaps:6675 +exposed.map A18D79A7 19280648 262144 c1aa8e484669f98925b9803f24553056c8cb3790 halomaps:2169 +extermination.map 19BD5F96 12820300 262144 57fe6210b9e222c26f9e5d27a9876bf5411c0298 halomaps:3481 +exterminator.map B8FEA658 15338359 262144 4e907386fd6ece5de4251eb3a0be98b70964af86 halomaps:3331 +exterminio.map 2EC783BF 64993598 262144 b19bbc318f54a1c20c6a3acb79813ff0bbcddc54 halomaps:6062 +Extincion_v3M.map C5372723 97888771 262144 08d79c73dc004d51301b28e19f51940c561f6be7 halomaps:6590 +extinction.map C5372723 97888771 262144 ae4122c79fe0325a26189a0938bf03054ece45c3 halomaps:2040 +extinction_ai.map 19E387C0 133975138 262144 038fd555fcbdb73a72f1fc89087e9da63fce61db halomaps:3961 +extinction_ai_nightfight.map D40DDBE5 133681674 262144 664c6b95702a447514a87d71f31aa4125036438c halomaps:4194 +extinction_mc.map C91994F8 97876659 262144 b3f6e3256f558824a13bb5b66383065ea3d05382 halonet:extinction_mc.zip +extinguish.map 2D5E5DD8 14886576 262144 f226be8e1a776275ae11842e2b5582a6585063b4 halomaps:3317 +extraneous.map 582423C1 54831553 262144 741ce83d75bbb6546f7063c5506493cae3911646 halonet:extraneous.zip +extraneous_v2,1.map 881E4679 57299585 262144 5e096a8bc730660d845ca1811c63489dad1daf92 halonet:extraneous_v2,1.zip +EXTRAS MENU --- alpha.map D805C9BC 25004775 262144 3e8be8cf8964072b3d39e30eb26ca1cab2215309 halomaps:4428 +extreme.map 3CAF3BBD 24349102 262144 33f3dfa765fd75cdc4dacec85ec6f1b70464c8a9 halomaps:3403 +extremglch.map 7B309554 13936092 262144 dcf156ace9bc185701f56d601ffe1b454099e736 halomaps:1275 +eyeland.map 6F0AFA03 30673621 262144 66cd6e0eb5e55311bd3d95f718c4a5eecdfd3315 halomaps:4968 +f25.map E94872E4 395251310 524288 48c3247ee8ecb16b157a433adcb5a097b39b4d65 halonet:f25.zip +faceoff.map 095F2484 14640052 262144 a999994ba7668a7aed9e8412b580fa68b57d2dc6 halomaps:866 +Facing_WorldsFB.map B8905985 15633508 262144 520a3e9ee5364170dffc755841c5fd6167bef285 halomaps:232 +Facing_WorldsRX.map AABF6F70 22473864 262144 e540a91fd1c4b0cacfaee608e947a41b99ce0a28 halomaps:2774 +facingtowers.map F6EC043D 27578145 262144 be7e786500c2996cfae13213bbf68ac90eaccc95 halomaps:3382 +Factory.map E18B77D3 14893820 262144 b2c4bb4c32ed741fd9d6a314ce4f36cbf21e0c85 halomaps:383 +faith-hope.map 10184D33 38823466 262144 065d83a70a372ce6020978d396044556abb15d2a halomaps:4153 +faith.map 204D54B7 13081248 262144 3daefbef24e6406f23e0dd59240faec519aa00af halomaps:178 +faith2.map 06D05292 14057632 262144 511b3db0e01cfee487d7fe243c262bd182a7418e halomaps:497 +fall_of_reach.map 8E4D7BF8 146328238 262144 b3e96291aacd1b9fc7e6eb2f6df9b9bb5435e6cc halomaps:5945 +Fall_Spartans_Hex.map 5532F0C8 35638183 262144 00756c8be9a58d4b6f3e252df6ba71f208a6af0b halonet:Fall_Spartans_Hex.zip +Fall_Spartans_TipToe.map AC826BA9 36918927 262144 4db529254013b25375e94c83e902d6d09c5d10ca halonet:Fall_Spartans_TipToe.zip +fallen.map 0C39B497 40919472 262144 abc007afcf8482426106f690d0cac06764b1d509 halomaps:2775 +fallen_timbers.map 4D24F79D 14953544 262144 e91996a0a9cfe9442af50e551e9d6d902267548a halomaps:554 +falo.map FDB15D6A 17107433 262144 025ca6b9884fe520ca45825f47aa734cd113028f halomaps:4670 +Falujah.map 8EA0B64C 63515679 262144 ba1200f5067a731eddd7c66b57f689337c0f9ccd halomaps:2076 +Falujah_1.2.map 04E677FA 61803432 262144 72a7f9e06025137f40aebb987093e703d8d66e95 halomaps:2087 +falujah_zambies0,3.map 3A35382F 49279499 262144 d4dfc5c518e6cdb74fd48ca84d28bd97897c5eaa halonet:falujah_zambies0,3.zip +farlands.map E872BDED 73024889 262144 2ac8adbcead453e51b74b975c45403e38bab33fa halomaps:7061 +Farmington.map 9B03831A 289231510 262144 ee5c5e66be2e4bf1622e1f0093e3cd356b2ac9a0 halonet:Farmington.zip +fatality.map FC2C2ED6 17018052 262144 3ff942dc2e166fd3df51e4058dd87cb3a90ac510 halomaps:2793 +fates_gulch.map 787BE8AD 20279648 262144 1a03ad64c3c6f004d1c95d059b9a471e42bb5024 halomaps:2989 +FDT_Gulch.map D8BD853A 16055760 262144 e3e100781ff76edd2510c3f62888f30cd99b0118 halomaps:6924 +fear.map 775C1B3D 16827000 262144 c9865380db67e30f44f875b9b8d6a91f1594ac89 halomaps:3748 +fears_of_jeff.map D2872165 15579312 262144 dc062706f9d6220e7e431e908d51593eb34c1af1 halomaps:2366 +feedeath.map 47EA6B1F 70404645 262144 0ff0249faf980f94a309ed8e38bd685f8d331576 halonet:feedeath.zip +FeelGoodInc.map 2D9B9846 22120153 262144 c63342ef17ad978c98e70fd10825b0f23376aa41 halomaps:5424 +Female_Hot_Zone.map 36A4CC9C 238022800 262144 7576dfe9216dcfaaf6ac7e8802ec5fd93edf339b halonet:Female_Hot_Zone.zip +fiddle.map D88BA47A 20848937 262144 9ed35c429eaf147173f56b21d67c5620824182ff halomaps:2851 +field_of_death.map D426D7A4 24929672 262144 8dd3533b28acecb503213b2adb13ce2b9679f951 halomaps:3196 +field_of_war.map BD5516D5 38045966 262144 a8f645e4fb94875c02c2ef44f7385f0af212cf3e halonet:field_of_war.zip +fierce.map 57436123 240189495 262144 ae26dbb1b832872d4783595425b76a79f25c01d2 halomaps:6743 +fight.map 9FADF5AD 14425812 262144 ed486c292e08a049688b1fdc7308bfdd9c881f9a halomaps:4154 +figurehead0,7.map CC2B232C 279008922 262144 58a00f031c9663e91e078a65757cad25ee922be5 halonet:figurehead0,7.zip +filtration.map 7951711E 14188576 262144 96ee1fae71da94c312e174a22b85d7bbfd45f055 halomaps:3228 +final-airlock.map A8C35E90 390495986 262144 de094172d980c9865d46428c1df0062cc0a6ddf6 halomaps:6966 +final_control.map F021422B 20888665 262144 5160d0bc221a5dedcd47510b98a358cf10987ecc halomaps:4508 +FinalFight.map B12C1E6D 56469343 262144 e8d692078107134669f87acfea324eee678e1b0d halomaps:3508 +finality.map 1FE15A71 39120445 262144 478dcb1a398e84a1a66ea10c7aafbf348b1590c5 halomaps:2547 +finite.map 1354764E 15025736 262144 a79af76f072b59b0a9fb083ecf5d90547aaa0783 halomaps:6833 +Fire_Cove.map 7FC013FF 16846028 262144 8f6d9532cd17db14309666c2260f20bd8697d4e0 halomaps:1199 +firefight-airlock.map 541924B0 80586549 262144 de6621073215827a398419d36594b6c634c9ac80 halomaps:5170 +Firefight-Amnesia-Demo.map 762B0611 331297324 262144 bb25840356645fd14e83150c684c434d45c358c7 halomaps:6747 +firefight-containment-Improved.map A3602F55 333230968 262144 c2046a5a60604f41007b9cec8a7a05b31463cdcb halomaps:6869 +firefight-containment.map 87DF09B8 347472247 262144 e62c93751982cf34f32d16c356a0d86753dc9708 halomaps:6868 +firefight-cryobay-final.map 07BBF8F8 228468578 262144 42a5fc272189d0fee84f6dd3174b1773322696ef halomaps:5477 +Firefight-Descent.map 558C4B74 302543994 262144 d794a20b6160a5c95c252657794fa584f8ed527b halomaps:6463 +firefight-fissurefall.map 32508D9C 128065813 262144 57b83ff8f06e223880d83bcd912e3d0529cd01ad halomaps:5704 +firefight-infinity.map AEF9E8EC 401095276 524288 aab69cbd27d9a72474003a6143b583fb962676ff halomaps:6870 +firefight-portent.map CF946835 198190209 262144 feb82f828d632e075b96e810fe89608ba54692f4 halomaps:5336 +firefight-relic.map EA2A2414 381234287 262144 0387b81a7d4f6fd7871af3fe582f1d3e527df035 halomaps:6925 +firefight_ascension_h2.map B9751A92 174282840 262144 038aae7f754e2f19528417ca3e31b80d74e3c233 halonet:firefight_ascension_h2.zip +firefight_infinity.map C9623A48 21428080 262144 c91ec269225a4abf96151822cbd69904da32e138 halomaps:7104 +Firefight_OmniBase.map 496CC10D 178320470 262144 561f112afa5b312e30d4baffd92b25326d416d19 halonet:Firefight_OmniBase.zip +firefly_beta.map 69B3F0E0 20332232 262144 ca62e82fc6e5f2486d33692cdca14eb59e7597a2 halomaps:3564 +firescythe.map 0BE631AD 23584397 262144 7cd8746007612a22a2d60400896772b0fda72fa5 halomaps:1189 +firewall.map E8EECE1D 13038392 262144 329de298d025da3508385ea6f63fe12fff8adca2 halomaps:2970 +firewing.map 9257899C 68205753 262144 b4d3a77c8b7a15f114f0893e1cfc6f4756bd8ae4 halomaps:1596 +first.map 34AE77F3 21529728 262144 8c1e50e3fb600dba8044d41680baf28b04850249 halomaps:2497 +first_fight.map E39FF0DE 81806443 262144 817a529b4aa000e622350f7fc8ff02ab2ae7fb52 halomaps:3913 +first_map.map 8635D02E 103795496 262144 102a74d08dd23efac66702405c6f24a2d0c5628f halomaps:5406 +first_strike.map 44807A12 28175564 262144 f075c39f1b1f938517ce2e6025dcde01a0505a9c halomaps:2428 +Fishes_City.map A7F71F7C 26051276 262144 695340f88b01785cf7a061eab417fa8c181cb3b2 halonet:Fishes_City.zip +Fission_Point.map 26FEABA3 27338114 262144 0a0e20f6e4004c291a29cd5131408ba3499ed0b0 halomaps:710 +Fission_Pointed.map 641AF8D7 26630522 262144 54da5807fdc57fed97d3aae3554e42fc9cf26323 halomaps:1826 +fissurefall.map C6D84E7C 15522908 262144 ee91a9c4fbba6975c12e4254a0a203ff4f5a7052 halomaps:233 +fissurefall_night.map 8DA66CF0 28030390 262144 94c608a7b37427ba6ddc8756f57cabeb5e91bbfe halonet:fissurefall_night.zip +FlameGulch.map 7B309554 13936092 262144 79863683595fd9030a1da4c24933bbcfea8510ff halomaps:999 +FlameGulchv2.map 7B309554 13936092 262144 c3a28fae92599e481770d4b206965f90dc74c013 halomaps:1004 +flankthecovanent.map D5A69FDF 66941140 262144 ed24c3d15c921bcc9c2fd21cc22a01e67357ac4c halomaps:5590 +flatland.map 2A296963 17738348 262144 233a86a3c3ac96befcde43621da488d307dbebba halomaps:2342 +flesrutihsotemit.map 1B4D4B2E 53119825 262144 cd5cd7ab45c51188ddf8cef271357acb52c321aa halomaps:3092 +flight_race.map 38A29591 26315144 262144 408ba63c4d8b735894e906b57ce56b9ca995ae8e halomaps:4440 +flight_top.map BE4C9C5D 19497912 262144 06e69eb48556b733d54abcac70133e100a9baedd halomaps:2837 +flightgulch.map EE67A4E9 18855344 262144 33934ca287b1805f4b8b89c47947fd89e24d4d8a halomaps:2498 +flood cannon 2.map 7338FBD7 19531878 262144 101271569513bd88033947abd444fd181f07d771 halomaps:4654 +Flood-Human_WAR-4.map 783FFD66 48560587 262144 7133d534f050ee285c2c02d9e1f2560a7d80c56a halomaps:6744 +Flood-rpg_beta4-4.map 55843513 127290428 262144 01b20027fca85dd313454d7ffea176edb9608ae0 halomaps:4599 +flood_'em_high.map 32B70E3D 32178818 262144 8a40abd327684075280caaefcd84cb8d6a13b23d halomaps:1751 +flood_assault.map 42787569 84293306 262144 19c6371d6d9626e3bbe72ef21d3dc9fd4505a822 halomaps:4451 +flood_cannon.map AA980AA6 14577012 262144 2d0439b275ce731c92a0736c3a7e675684ada09a halomaps:2268 +flood_extraction.map 9E602A7B 22140769 262144 552c9ff35d91e7bf9d86ed2685029b6e942986ab halomaps:4359 +flood_guardians.map E70C5FD9 84873285 262144 d40223216e2a10932d8d56355207170a93fc56cd halomaps:3895 +flood_paradise_beta01.map 7909B665 52403182 262144 f89c781f9535807a2aa227525e07f1ce7a48eb03 halomaps:2209 +flood_survival.map 8DDD8F7F 126203759 262144 47dcb7ee71a72a7395dba8c13240ade9e2853034 halomaps:5607 +flood_survival_3.map FC3B1F1B 119626111 262144 7ec550987b53f3c60c7ef078794a265f87a89381 halomaps:5628 +flood_territory.map 5D525303 100625635 262144 36ea27371e61541dc5318ef31eb3810ff89f691e halomaps:2303 +flood_territory_v2.map 845894C0 113230781 262144 63b6d1c88a55b89dcb0d71ec9ec5095681508761 halomaps:2536 +flood_threat.map DE06C87D 87694650 262144 5d6ac84f8a7dede7df65ddec08a34069bc512810 halomaps:4402 +flood_war.map EB4BC86C 159878659 262144 b5f77dcb966b1595577a4132dbc6e159d4bdb1f9 halomaps:5875 +flood_war_dangercanyon.map 84FBCE33 71492791 262144 a22f1277a23fff769b57b0deaefa287c945fa9bf halomaps:5042 +floodattack.map EC57AB76 18836893 262144 9b81b198aa7da3cff3cf12361d5d602e475be17b halomaps:3498 +floodcombat.map CB9B1D94 22122608 262144 06dd9e252838559064c87f8322adcbb1095766cc halomaps:4684 +floodcombat_v2.map 0AA5B82E 24888500 262144 4d1603187947aaba35495fe9e9abf873719c88a4 halomaps:4861 +floodcontainment.map 6830CA6B 90659134 262144 17c73a5fdf75ed35ef4739f90a974c2490615cf9 halomaps:4215 +floodcoviemarinewar.map AED10D83 70371317 262144 0b7c0528a35ba240b51497bbf3f559f50b405056 halomaps:2548 +floodcreek.map 94C848DB 42181728 262144 ef3e16b33d7e474f6f9bca40774f6ebdaabce9ec halomaps:5021 +flooderadicationbeta2.map A6B999B8 136456931 262144 9db107e0c75c4dc41cc3b1d4863c9ff897540b5c halomaps:4271 +flooderadicationbeta3.map 198D6C47 163987176 262144 b5f7642c1ad7c428c86d7111c72d067187a353a0 halomaps:4328 +floodfeast.map AA98CC81 47876466 262144 095f31e254eb73be34217fb489c9323577a6e7de halomaps:3759 +floodfest.map 6428505A 111436157 262144 85a3d0541433383b3ae83cc3cf11651dfad899b6 halomaps:1446 +floodfest2.map B0E5BCEE 115786122 262144 d58274689151ba8eb4cbe63afe0c7b0c15274e33 halomaps:1465 +FloodFright.map 30F7245A 131295976 262144 bb4d5da6c450a2a18ac4f7718d6cc672a1e597df halomaps:6342 +floodgate_3.map E15D79E9 76695027 262144 e1adbe2896ee6e9d76bca04aa793981e94a14757 halomaps:6389 +floodgate_anniversary.map 641DB1C2 72216683 262144 1a108000eafb0704571c66b67c04967e1509163f halomaps:6426 +floodgulch.map 651D10C1 15761232 262144 80fb8b6b46b8b38180e713d74114d783ad72113f halomaps:441 +floodgulch2.map 30A57A8D 56710727 262144 88d0f67408b4d6ce156387ebae42fdbdbf296a8e halomaps:1882 +floodgulch3.0.map 45B22000 56682530 262144 39cc4f935cb81b8c6c89d67d3fd8845553476d3a halomaps:3632 +floodgulch3.3.map 9195F6BE 57337126 262144 ede9a4092cdb5fd4ac31620cf74b529699e0115f halomaps:5004 +floodgulch3.4.map FC267BE4 330948928 262144 635cc190f953d543f36f6353ed39a58bcc3e44f1 halonet:floodgulch3.4.zip +floodgulch3.6.map DCE7A44C 120498737 262144 2fca99453e2f84861e8b487ce8de02c050948030 halomaps:5562 +FLOODGULCH4.0.map 92C107C1 69645917 262144 de7bb3c3cba568cb859a544729a660ca7efecd36 halomaps:4655 +Floodgulch5.0.map BF2B5424 89193279 262144 4ed062b7fa74722663393ddac4ee6e9046c23e77 halomaps:6033 +Floodgulch5.1.map D2D92B0C 57483951 262144 2e0ad08ceeadb46b4e12611aa3ef5132ac2cac7c halomaps:6311 +floodgulch5.5.map 6EC77C12 74408823 262144 fe0a2705af149686f27d4df2c6dcd66cb6cde21a halomaps:6871 +floodgulchmodtest.map 772761B6 109128179 262144 61d4c69feb049466d98b38b9489f8199e414255b halomaps:6045 +floodhigh.map 4F2AED05 396703555 524288 c1f622c6bb24de976bc0f0859245cb7320259133 halonet:floodhigh.zip +floodland.map 680432CD 48450551 262144 df29851c98e6518bc234cdd27dbab8329b1a5822 halomaps:3068 +floodnight.map 8F4E50F1 57352437 262144 a9ab6a2a2ca0a70a00e2b2141415cd8bf028707e halomaps:5126 +Floodphobia.map ED3352CA 71720411 262144 0659213f421729949a3283a4e4557fcb31046c3b halomaps:3131 +Floodphobiabeta2.map 4B9079FA 67980628 262144 77b2414d125cf6571bc7aa9eaeba82f384225c75 halomaps:3169 +floods!.map 0C43C1FA 400927745 524288 40eaee42cbf37457c3609f1edfc57f4852ad6ffe halonet:floods!.zip +floods_invasion.map 45E3E512 20042544 262144 d38ebef827f7dd02c3ddaaebbbc260759cad37ba halomaps:4671 +floodtrainer.map 6D906CE9 88766113 262144 82e869fec545e430e1c48d91d5f7170519c7f4a9 halomaps:4401 +floodtrainer_apocalysp_sp.map 5A0B780C 213334369 262144 6e187c4f0d882652b3027ac397ec5684b9cde414 halomaps:5165 +floodwar.map 0B58D542 51287715 262144 4acb8be602584c939bd0a037deaa91acdf3b3244 halomaps:4492 +floodwinter.map 7F17F1B9 77632523 262144 93efe9e38c7f59213203b95ba143e62e396abbd4 halomaps:4585 +flood  lab.map A8D534D7 37339247 262144 196a474bb8e6185a1b78fc80b1863d93053323a3 halomaps:3785 +florack.map 201C4B63 216347780 262144 a8a860d3333650daf5439122e06ac4c562cf2065 halonet:florack.zip +floudinvasion.map 500FD095 276884460 262144 41c6a3d4bc7056d22d7c1bfcf3413f3160957623 halonet:floudinvasion.zip +Fly Gulch.map 7B309554 13936092 262144 c32a327e3518751bfaf9c69e1e154f13d07b6cf4 halomaps:1846 +Flying ChaosGulch!.map 7B309554 13936092 262144 b4799c03e891e6d6a6ecdb9869305ca58c8d7d93 halomaps:3408 +Flying_ChaosGulch!_v.2.map 7B309554 13936092 262144 455425339024d2a4b9ae5d92f1c29cb778139471 halomaps:3470 +fm_timby.map 7ABE697D 30191336 262144 0aebad9819d8a0b5e74bc73c4d8243dc1294e42d halomaps:3282 +Fmaptest_alpha.map 36288B07 64042533 262144 2a0a51813b914e01595965f95792076549410b6d halomaps:6967 +Fmaptest_beta.map AA50276F 87478042 262144 c0197016559b80b9bd03788bd9360f4a17e55b45 halomaps:7002 +Fmaptest_delta.map 9C1E13CE 102009807 262144 7e66e557450f246e7e1456a6ada56c68e3e6ee00 halomaps:7040 +Fmaptest_gamma.map DD5CB38B 95582297 262144 3f5995bf68ea9c30bc1479fc2694ddad0b151fa8 halomaps:7003 +foe2.map 2ECB607F 20033299 262144 68db049c15da74cf99c37b0e8cf730a17c662e72 halomaps:483 +Foehammer_419.map 7DA24D22 381654885 262144 3f2acc69eea81d9940b7eb651d922511a157a9ec halonet:Foehammer_419.zip +fogg.map 04368628 172279290 262144 64d803346b1b41f59c95f41ee2291e40945f1285 halomaps:7004 +fogg_impossy.map F7E81E8F 1092572 262144 76e553c9fc2dcf790f96e58bbca77053b2c4fea6 halomaps:7004 +Foggy-Grave.map D77FEA9C 23120969 262144 85cad591b857e9071ea58c63ff84ff415d7eaf98 halomaps:3786 +foggy_war.map 4DE1083C 55786085 262144 18fecb3f4011e4f511382e93b38218ded1576bdf halomaps:5353 +Fogujah_1.2.map 04E677FA 61803432 262144 9e8bf2fc172c65e15dc887b82c8c857b2a94b758 halomaps:2488 +fogyoass.map 784CA990 59221172 262144 f9957f15b3df7b104bf4d41fad7fe170695cc117 halomaps:2499 +fojaxfield.map F9CA5FDB 18734572 262144 e6b9826e133d7c0c408c364417e8e2f9415d66ff halomaps:432 +foOl_tImBA.map 15F017E3 39275356 262144 eb4b7feef99834b6f35ba6dd30745c1e60bb7557 halomaps:3509 +football.map CA3FA09B 94992519 262144 f30e48dafbf247c389a54ad524d7418fe986a3e4 halomaps:5465 +For-Honor.map C9CA15BE 39474925 262144 9e9194ed7d3e17b72cee99d1a8b3638ea22d5c7a halomaps:6555 +forbode.map 920E0BAC 20861885 262144 a081586c0773a5ba99053414dbae692060822852 halomaps:6872 +forebode_v2.map DC289F1A 17756085 262144 ce261dabd4e3935396421c2cb40ae8645d1d6677 halonet:forebode_v2.zip +foreground.map F7BD1E8B 14017984 262144 dc927f8fbb7c8788fb67cea70d6c192bc8e8f897 halomaps:543 +forerunner.map 845AFD8B 13112884 262144 022a799fe1d555883ad0842f8867a27de9d48b21 halomaps:2343 +forerunner_dwelling.map 51793323 13556732 262144 4b7be917696d4e8b03f4ede68c41ebbee2d87201 halomaps:2852 +forerunner_facility.map 3174C788 28940966 262144 a9e6d77aac040950730f10a565efd2353bdfc866 halomaps:3760 +Forerunner_Waste_Storage_beta.map 04BB44F6 13945128 262144 687408cf003c6f4728f25aa7c742cb2d2399136e halomaps:2367 +forest.map 179ACC3A 16059668 262144 b861a9958ea6e4ea730b9da9343bc6b6687b3513 halomaps:1119 +forest_fallz.map 4DB0E101 13659516 262144 8d0db8c9d3798315c5c09e51f076a30e25383d23 halomaps:2950 +forest_fire1.map DC5B7AAA 13824252 262144 cceb206c083ba7f650e99294fd60b8410a278d08 halomaps:545 +forest_gulch.map 15FBFD02 17145536 262144 794fdf42e109b031a81cbbee5b6db1d57b3c5d4a halomaps:2319 +Forest_Hunt_Beta_V.1.map 060A1925 43017978 262144 b54ac7ffa5c03a5dee774c065391e9326be5a519 halomaps:4230 +Forest_Infetion.map 5F1D165D 399496128 524288 1b979e6239b80d05300b186fe432a29ca538139a halonet:Forest_Infetion.zip +forest_pit.map C60C60A0 13732784 262144 a57d27b307e9cd12cdbe60a1edb2a7bb7f3c953e halomaps:4467 +forest_plains.map 753BFC4B 14380828 262144 1e8dc735b3a3bc329cc32327568123f8678084b3 halomaps:4325 +forest_temple_classic.map CD038FC0 28375908 262144 c176c2bbf3afacac1d87dbee287dac00ad6b0e59 halomaps:4566 +Forest_View.map C6699421 20056043 262144 b2dfdbf4d406ba4316ec0ddd7684f849866f8bc5 halomaps:4403 +forest_view_nightfall.map 0D0BA631 24217570 262144 af4f457f6bfe9cd1de28e8f2c2dd4a2bbe5d6066 halomaps:4404 +ForestBlood_beta2.map C7A41538 37283127 262144 737250183c3160fe3423872be94c8b6d33f102e7 halomaps:4338 +forestgulch.map 2BBE0D55 17837536 262144 89790a645475c9279bf496a88319b64bd634da24 halomaps:1500 +forestmeadow.map B45DBCBF 16866117 262144 a612c6ec49edc2ec6a1b0a3985dd8971a33cd51a halomaps:3977 +ForestOfDeath.map 2AACFC98 36800324 262144 8de2f71afb2c26da5a9277decc7cf879c8c66f21 halomaps:4247 +forestry.map 82E5E1E2 17001752 262144 53427cc24be41b04faf6ac695f1caccacd0f7b9e halomaps:2170 +foresttemple.map 35DD6EB0 25373035 262144 2bea55174064a2102030f8409a014df6389e0dea halomaps:3978 +forestvally.map CB1022AF 13867628 262144 2f63c6fabb08bd2a402a655bb6a90440b3eea172 halomaps:3532 +forestwinder.map 8F2A61AA 15354412 262144 7ff77572ae333154755f7c7c46a931cbb2638c12 halomaps:747 +Forest  Fight.map C5C8582A 59372851 262144 a89ee4159cbfe237ee6ed64d238f3f1c58a0dd4f halomaps:3787 +Forge gulch.map 3F2AD966 248515269 262144 fb2012b93820e0f05982b8af0148d25d37e66ebf halonet:Forge gulch.zip +Forge-This.map 00000000 255079664 262144 c462f7950ed823ae630fa155b962d159fa3a879d halonet:Forge-This.zip +forge1,4.map E2DA4560 91802985 262144 4a03dc7ce299386b693a571fd322756639ef0e32 halonet:forge1,4.zip +forge1,6.map E6A58CB1 78658121 262144 a915e605606adbfa24f5274a2f9803f27220abe4 halonet:forge1,6.zip +forge1,8.map 00000000 263042037 262144 40355895f279d3dd74ac2bce5561f331b18a914a halonet:forge1,8.zip +forge_halo.map 744746FD 54506020 262144 2536f75ad102d4dcdcd3b08c92dd9182e31bd429 halonet:forge_halo.zip +forge_island.map 97DB8854 19739268 262144 80b8054324f67e19e480730e33521759b50b02b7 halonet:forge_island.zip +Forge_World.map 3C1D4394 231104839 262144 130014ccac0d29338e593ed9405fa7ce0063733a halonet:Forge_World.zip +Forget_War.map 7CD397AA 391314576 262144 66dd55a03cc1525ffe319d89de576456230d711b halonet:Forget_War.zip +forging beta.map 88E8F77F 230285003 262144 9753dea294122e0ddffff628842574f9a3c2aef2 halomaps:7041 +forging.map 9CD16154 204012163 262144 5e4d59486edf5055735c851b204249f138f886b3 halomaps:7069 +forgotten.map 9F14FC8A 18528573 262144 d564196fa7213cd44d24a80167d567638f79d559 halomaps:3849 +Forgotten_Fortress_Beta.map 1A185888 19621330 262144 d5f1410e3677fc384f4f223d03f6601d13f9bbca halomaps:1450 +forgotten_wynder.map 5EA868D3 82507689 262144 30ac466ec97b7b6e28bbbc79c0209bf9a3db7c0d halonet:forgotten_wynder.zip +Forrest_Assult.map 23FE7079 19613622 262144 3e50eb4d77c76b8384f054f95baaf6db64d06924 halomaps:3702 +forsaken.map 3AB1B64E 39946351 262144 6f75ba4703fa97b323cf1162fa3256c05f2a3d33 halomaps:4528 +Fortification.map 966041CF 23322301 262144 cc70c28e00ba7e472d3de8c75c3a3ce53ea91abd halomaps:4195 +fortress.map F705AA12 17926988 262144 0091d46f847be4b5ae29aa3bda45afddc94b6719 halomaps:1730 +fortressofsolitude.map 1594BFD4 15063088 262144 f3f325e7edae139c994e6fbff58655fe4cb24f6c halomaps:3037 +fortresstower.map 8388A327 13839782 262144 7d06c521b6be8a304751665e21c4a0df393f4813 halomaps:1645 +fortresswinder.map F363B529 35797061 262144 e9f856199c35e97b0b00450952d9a9eb7b87c68a halomaps:4838 +foundation.map 2686BBA3 120066223 262144 297425e3fc50ed0d6ceded8e737115d2db7e2014 halomaps:6945 +foundation_beta.map F9D6F942 15687780 262144 59e3304b3f11bffc7591f665599df996ac63952c halomaps:760 +Foundation_Halo_2_Mod.map 8BD932CC 31988549 262144 5a87c14e8330ec78e83167d06ddeb06158d6ffe0 halomaps:1306 +Fox_Abandoned.map D74516EB 46889656 262144 a7c9be1ea386ac4fa274cf3131b9d69b2fcf3699 halomaps:1061 +fox_abandonedEPSILON.map 6184EF7E 25458994 262144 4bd030073ffd00bae9e4e95b612976a0d700c5b2 halomaps:1046 +Fox_and_Yance_beta1.map F8918F79 48719861 262144 ee9a17b54b096dce95f7637175702a2f21dddeca halomaps:1613 +fox_condensedGAMMA.map B49D0191 26998904 262144 1797704bf988ce5770333d762d2f4f4ae4d12e31 halomaps:1064 +fox_island.map D3B37E16 27827965 262144 f5cf396bd5e8efda23a760d8834e1840a51597cf halomaps:621 +fox_island_ai.map A93B6FF8 132928881 262144 9cffbbdbd3f3e9be58f8cad547bcce26de9080e4 halomaps:5925 +fox_island_INSANE.map A754A97E 79046444 262144 dc04fb758be93a4ce748f3e312677588382d7b0c halomaps:3611 +fp_esfera.map BC335DEF 15106008 262144 e355c928bbf50483fd162bf92e20a84ee11070c5 halonet:fp_esfera.zip +fragment_v2.map 5A6E3E3F 23093144 262144 5bd7c679e0138bef1a1e17c1e0103c4c455dbebe halomaps:1447 +Fragmented_pb1.map 668E29C0 225633482 262144 ce19012c6df6daddeec2cb55df2d30af6f5673ea halonet:Fragmented_pb1.zip +Fragport.map A6355437 13983684 262144 2fecc4dea04fd49962ac2b48c3290a234e73ebb2 halomaps:3197 +FreeLands Mod.map 6BD2A5F4 13926992 262144 8d7ef0ee43fa952d9785f0b59af4fa5d04b5ab2b halomaps:457 +freelands.map 6BD2A5F4 13926992 262144 d5bb2184ae8205d29d7394a3272b397daa062de9 halomaps:436 +freeze.map 3D6B5B4B 146798747 262144 5a6bfcc0fd2941aafea069545b8ef961b0f377b1 halonet:freeze.zip +FreezerBurn.map 7D9EC00E 40017036 262144 079cc3d528c538c650a85da3b22f728d8d192b96 halomaps:6702 +Freezing_Point.map D2836BC4 21145756 262144 c942818d2aee9bec8a618504426b94e6e0169d52 halomaps:568 +frege.map B656C933 50871500 262144 c66474215c258ae8c2edd16a6a6cd3770bd1ffce halomaps:4839 +frektarax.map 0CFF0012 318992906 262144 82aabe6641af2cf9841f1919f31fbc81fcbb46d1 halonet:frektarax.zip +fresh.map 8D2FC28F 18812064 262144 f9348c71ab9358bcf80b0220378af44a594f9da0 halomaps:555 +frigid_keep.map A17A7833 14742756 262144 31c997b8a068a9ddc69c71b8b020a4f0d6c9809b halonet:frigid_keep.zip +frontline.map 13BDB1A0 23043736 262144 29b272c9fad8398e4b6d57295952c2a5857cce6c halomaps:2866 +frontlinefix.map A4841F1B 22382664 262144 42f2d4e98fc5c599e97410d8529dd3681ecbbed2 halomaps:2884 +frost.map 7ED99C0F 18020488 262144 503ae6b5fba25a4d992b55924a1f8413c837f11a halomaps:228 +frost_v2.map EDA60B7F 56198547 262144 2cf5c2e9e950423a0efda9bef71bf7aecf633355 halomaps:2776 +frostbite.map 86B9D33A 14427473 262144 03557df8835b5481ced6a7c234c14539c9e59453 halomaps:4360 +frosthaven.map D86177D0 20488196 262144 764eca3ef5ccced94f1a2f0e5dc2527de084d460 halomaps:1744 +Frosty_Field.map 56FFB156 13310180 262144 f34a36e149513ee26cc5fe26fcbfdb5d6b860b07 halomaps:4092 +frostyassault_beta1.map F57DD0BF 16949748 262144 43489b26f9403db26f931c8a4ff344fedc8b9ba6 halomaps:573 +Frostys_Revenge.map B53D6AD0 33816168 262144 c77dc8c89ba684765528021f2c7b4e576bee1385 halonet:Frostys_Revenge.zip +Frostys_Revenge_pt2.map C20E99FB 38242504 262144 a19cd3320252cb20d99e0f07fa606c1aa45756f8 halonet:Frostys_Revenge_pt2.zip +frozen-path.map 01BBB60C 61314682 262144 8d6f3a7f9748768e613914f33025522e6e40d7b0 halomaps:1743 +frozen.map 26CE67DA 22130248 262144 c2cd94ed780154c42bab285726e869688eb70c3b halomaps:1332 +frozen_bridge.map 6A1F0149 25694429 262144 be05976afb0af7ef95677fbacedb606d5758606b halomaps:5264 +frozen_canyon.map A4E469AF 19550370 262144 16a12593c910cdebf8a6102ac6d1500c707c4a36 halomaps:1101 +frozen_facilities.map D1537773 37373052 262144 ec5f451ff194ab0228682a8f34973bdba600bc02 halomaps:4361 +Frozen_final.map B8F380D6 27985479 262144 363e0ad10ba003895f8f6b1db15c3e6bd9508ac4 halomaps:1445 +frozen_wasteland.map 43EC4FD1 60847188 262144 9bedd57a287b11cecf4d761286da5e6293759558 halomaps:3821 +frozen  tunnels.map 5247FF43 19825785 262144 7888cd9cda0928e8d38d8bc5f8e8dc26209d74eb halomaps:3915 +ftw2_bloodgulch_beta.map 7E706156 83429100 262144 b18f8098ce1ee8abbb63013c15ae82d9177c1069 halonet:ftw2_bloodgulch_beta.zip +fudge.map BCF5DDA1 13921312 262144 594256aa9e9effaf439b70537044cdff73528eb0 halomaps:1784 +fuel_rod_wars_alpha.map 556ECFA3 58377960 262144 bd3112a61054f4344fec306cc0796cd60f1de103 halomaps:6390 +full-metal-snow.map A4B7E34D 57160800 262144 42f3b974833ea9b6416ad80454a64ee68162fe5a halomaps:4116 +full_circle.map 86D50512 14596093 262144 0f455c4f99076db38de026cf4ca15612a5c3bf28 halomaps:7005 +full_of_energy.map 894A9C7F 15090144 262144 bec007f76c3e916643f3fdb5f7cf5a8eb6b0a862 halomaps:442 +FullTruthAndReconciliation.map C88D21D0 161606789 262144 2fbdc1a1691d255ab5354048572cfa4ba3f5b050 halomaps:6873 +funhouse.map 8275B915 25146011 262144 997351a12b3a4ee649f3ace0972dc53730649c15 halomaps:5338 +funhouse1.1.map E2EF71DB 31760804 262144 a012010f3fd0f92ac2477bd5c2b2863c27648aed halomaps:5354 +FunkyGulch.map F843CD77 39309589 262144 72d9415c31067dec35ecc104148bc7b21574b7b8 halomaps:1537 +FusionIsland.map 2E2A385D 51492298 262144 195b97209d646d17148e15e2f6b8555ee9478d72 halomaps:4840 +futurama_beta5SE.map ED85FE99 22107740 262144 f30df0f8ae333d59a8029626abd34ce61db93a3d halomaps:2429 +futurama_beta_16.map 46107FCD 26954593 262144 f5a3e01dbe10a119a9349cdaa07ca735ebb78337 halomaps:2430 +Future.map F92757E0 19344897 262144 e62c6e4d273931eac8f761d560542d4f3325c89e halomaps:1333 +fy_iceworld.map 4C18DC14 23676128 262144 a1b6732fa4f1efdd60f4b38c626bc5435a889b50 halomaps:4862 +g10.map 54A1FACC 154443812 262144 48b5a6a9ada39ba28f03b634cae8a31fe81f7b42 halomaps:5773 +g9.map 2CB3F28A 138774069 262144 be835e06127644023d5929529802c6b95f8b9f00 halomaps:5519 +gaa.map BB33F142 81531294 262144 be28200eebc79e7df7e9dcfcbb763be763a11e66 halomaps:3681 +Gaia.map 878165B1 121461274 262144 337316d1714dea99279c0ff58c999d89a9fb273c halonet:Gaia.zip +Gaigher_Mod.map 82FC067F 246717917 262144 4b5c4c5cb954cbff57f571428a4d2a027381e07a halonet:Gaigher_Mod.zip +galleon.map 0AE264D7 126096594 262144 10a39820f9151e045076b375eea36b5e11c12a7f halomaps:2257 +Galleon_no_ai.map FBD480D9 126034558 262144 6302d772868aea2d2ba57dae956c8098ef351500 halomaps:2258 +Gallows.map 07BAFF3B 22043816 262144 c43a932e6d37d48465d603c052b1b54e1e9e8718 halomaps:4326 +gallowspole.map 1686443F 18243248 262144 61a1c6272275824cde10a3ffc9959650b696f1cc halomaps:229 +Galorndon_Core.map 239B466C 232922540 262144 e61cfec4c503e0ccb8c82e78ab86a593d8d6af43 halonet:Galorndon_Core.zip +game_wars.map 25BF099A 42727876 262144 1e573271b7d4f0e0b5ba2df7f99da1c06b7caeec halomaps:4619 +gamma.map FC2FC45B 83434195 262144 d34adc38d07e13b6125167032ae45e57a49c4a27 halonet:gamma.zip +gangafarm420.map 555D3AAD 14568864 262144 82f4d49091b4f80d9ff52d746d4431cefe71b459 halonet:gangafarm420.zip +gangland.map 07B129AD 36602120 262144 4b57d4c601e60f7e19c2772acc7858ea0e4c9374 halomaps:1868 +gannonscastle.map 533BE9BF 18826021 262144 8db506fc6ed819fa23839cf310f56ade23c17b6e halomaps:3962 +ganonhive.map 7F3F5273 48716831 262144 8ff7ee1f2f7b8312c38bc8fc08aae65633b9dcf4 halomaps:3069 +Ganymede_Swing.map 835B4DB7 46087963 262144 468441f49150bda8298088c1207c9302c838d514 halomaps:5152 +Garden_CE.map 024CACFC 52222757 262144 31844b0c9361da9f99a8581e5c9fac457986719d halomaps:4863 +gate.map 94725A61 22064156 262144 4463ad7f6243041bc9da04cb96fd3efec3abf644 halomaps:524 +GateWay.map 39ACCE9E 68640519 262144 2adc625aca3295ba2bb12bf83321a5189e83899a halomaps:3164 +gato-y-raton.map 7AC322A3 14689942 262144 0804e5411960b497e7f5e203e0e559d508eecfb7 halonet:gato-y-raton.zip +gauntlet.map D6F32D49 19579667 262144 88cdf17612be797a8fa65c0397bc1574ae629da8 halomaps:356 +Gauntlet_1.0.map D44BB1B1 19991151 262144 78e0cc8907963d287818ab20f433d0f26aa28e06 halomaps:371 +Gauntlet_classic.map 34C0BF49 19990587 262144 a36b3467ab8f418532491dff6522406e4ce39cbe halomaps:370 +Gauntlet_Race.map 98421991 21111501 262144 a827a2a85612a713fd50a2fb9837622d0b0038a2 halomaps:2500 +gcse2.map 8CD8D03D 13806820 262144 855ad3039f4b5d960016ab35c4ff89a319cd441e halomaps:2269 +Gearshift.map 52D37C4F 13108480 262144 c327b5bd95bd21b5c744b45dcb9531fda9559177 halomaps:4174 +geldarcreek_beta_release.map C93EEE80 41917854 262144 f1bd197588b048c15d487950b1b0b5d228577756 halomaps:6195 +Gemini.map 256BEF55 39355824 262144 bb039a968f7d963bd1565291ac960b692ec0be1f halomaps:5153 +Generator BETA.map 8AAE4508 25076932 262144 bffec7a3f90f07e15f963eb49e566a1eb787a39d halomaps:1708 +genesis_beta.map 3DC9A2C8 29597424 262144 a9a71d3eb26a55701597529b884ce4b203e90981 halomaps:3332 +Genesis_V.2_Beta.map C605E244 26930904 262144 478335b1a01914c65c9658a1a750d34421e26f8e halomaps:3338 +geomar_este.map BDCCAA0E 101446077 262144 58ab857a567229900edcebfdf93374fc42bc4f4b halonet:geomar_este.zip +Geomar_Final.map 714438E6 82413558 262144 72e6d0541f90a40d4c98bec0e33e1d8337b1b5a2 halomaps:6968 +geometric.map 507FA3E3 16595523 262144 1372c6b6cd35e2da713839fdaaff31e7ec511e1a halomaps:2733 +Gephy_Mod.map 51DA28A5 23811508 262144 5a7d861b7f4d44b6ccd1ad32aede86ea116b6fcd halomaps:4455 +gephyrophbia_falls.map F038888F 31801634 262144 c9c42aaa1e6c8424928635de28f5cb136cc76d26 halomaps:3822 +gephyrophobia-base-defence.map 0AF44D45 32700149 262144 d560e29b26bde274452e7f55c9c421e5ca045ce2 halomaps:6280 +gephyrophobia.map D2872165 15579312 262144 9ccbff49615dcfe4fefa97659bfc0826c0f5320a halomaps:4780 +gephyrophobia_reborn.map 3F2F4954 178010635 262144 be2fc2348033b7f6fb9f05792dfc36b5b3dda1a7 halonet:gephyrophobia_reborn.zip +gephyrophobia_rm.map D2872165 363580244 262144 51475ccc08b59f6a97721c6630f9a4fe6f8ace36 halonet:gephyrophobia_rm.zip +Gephyrophobia_Rocket_War_AI.map 9ECF91A0 216778376 262144 980e0c3e6ddcab9e16a3891063477f56d4372224 halonet:Gephyrophobia_Rocket_War_AI.zip +gephyrophobia_time_splitter_2.map 52A16A71 28937011 262144 d48ed11341cdd02150f526ba6ebe8956282496a5 halomaps:5608 +gephyrophobia_tmcc.map 6F39AADC 42956428 262144 8eda32a2eb75eab2d018cc41320add8f09671058 halonet:gephyrophobia_tmcc.zip +Gephyrophobia_War_AI.map AED25011 340429336 262144 9ea6a1b2882f06bc9bdf78b4d7101296c7b7d4a7 halonet:Gephyrophobia_War_AI.zip +gephyrophobia_zombies.map 85D1B4DE 90944289 262144 a6a5989ae6a1a34010571829c68883a034956c90 halomaps:5849 +gephyrophobiaai3.map EC404938 64170297 262144 106bd642b581d04238eb082d78aaabb0923e124d halomaps:4553 +gephyrophobiaedit.map 21AE23DC 17415956 262144 d56a1c381563bff63fc2e196ab03b6f5895fffaf halomaps:3482 +gephyrophobian firefight v2.map 98755AF4 73103127 262144 87afbb6827339ba91a65de21cd3152e3d5f587b3 halomaps:5563 +gephyrophobian_firefight.map 8DC208E7 127363036 262144 e7b8099e50454ba333e82f74ed1f80534bd7c301 halomaps:5154 +german beavercreek.map 7FA1C361 40013809 262144 a4746f0b868c5a3fbe4eb17619a8d8b3409577db halomaps:5644 +german bloodgulch.map 6CE1F4F5 40970309 262144 a2409a39acd51169a1a58691a6f1d12f49a84fdf halomaps:5645 +german boardingaction.map 0954DDDD 43372373 262144 04690f2dd0b7a6f3e27c1ca199ac8018a79fe2f9 halomaps:5646 +german carousel.map C1568419 39542397 262144 acd80c48da121af3ff0d40572357fd433f1669c9 halomaps:5647 +german chillout.map 649BBC56 40129929 262144 feddba2bc2e2cc61f7540222e607b2f967f056f5 halomaps:5648 +german damnation.map 66642C60 44887577 262144 f34770ea731d9e8c04e53e6443d398727ddbbe30 halomaps:5649 +german dangercanyon.map 74FA0247 43404293 262144 1a444761da38832bf90ddbaf3ce641ab428e69dd halomaps:5650 +german deathisland.map 765B1563 48563761 262144 daf00b54348e7ef37d87e3f6e8ed7e07b74d67f1 halomaps:5651 +german gephyrophobia.map 23947B25 45086337 262144 f0d8d5365454985199f6ab17f51f27fc802625e4 halomaps:5652 +german hangemhigh.map A4190A63 40212957 262144 8995c68fc4119ead6c0ca019d1936e80b7362a8a halomaps:5653 +german icefields.map BF554C26 45216641 262144 cb1875e05a05463e08d171f4537da9ac9cdddbe0 halomaps:5654 +german infinity.map AFA4A35A 47693017 262144 6da028f467ab18d6c61fd28541ab067e66c84d83 halomaps:5655 +german longest.map 58869E5D 39701513 262144 b350f5a4843e65938655a26c6bb3f183d69e5ee3 halomaps:5656 +german prisoner.map 54706AA3 41286385 262144 cce538ada890dbd671ad51ac0a85e0e369aa6b18 halomaps:5657 +german putput.map 13135CBD 41057657 262144 4e60d4fa3954a9cb3ed43776d2b8c4af58b0a7ce halomaps:5658 +german ratrace.map B47C95B1 43383653 262144 11eb60744e643bd0e8c7dfdecd6987f19c99d454 halomaps:5659 +german sidewinder.map 81B82169 44203053 262144 0edd5854a4b1e9ff1fabeaec98fffc867b3ddebd halomaps:5660 +german timberland.map 8C198D73 42205493 262144 e64fca0b27bfefeb7af8c680171277f979c02c6b halomaps:5661 +german wizard.map 2C0C2B06 39573317 262144 85ea389f66bac58499bf94a98b5440e2668f5358 halomaps:5662 +getwrecked.map 9D9FC994 132169805 262144 7905f522be9f4816a69e2ee8f6b8412ba2ff90c9 halonet:getwrecked.zip +gfmgulch.map 98F936DF 61431978 262144 c8bf82c7fc62246462e5ddfc5fe2f9632cbeb32f halomaps:4733 +ghost.map 6752AECD 68788057 262144 c5b8916f6b7d33455efa892a14d5b639225c309b halomaps:6391 +Ghost_Gulch.map FEB4FBD1 106015159 262144 095f7d657a390151e48b27ee4205e702f0158291 halomaps:4529 +ghostbox.map F955EB92 14279364 262144 9ee574d49ec8ab7d7a3eae2483d666bdf78432f6 halomaps:4093 +ghostdday.map 76D4B34A 91397444 262144 159d7982a0bd1485f6d1b1047d3ade783fa2283c halomaps:4938 +ghostvalley1.map C8E08CEE 25368822 262144 cabda5e05d7a2d6f007d83c94d7ec78c50131a75 halomaps:4429 +ghostwinder_beta.map E50E3AAC 15131728 262144 4988b0771636fcc83fa92c7221d9cc6a6661bee4 halonet:ghostwinder_beta.zip +ghoulhaven_hall.map D093C5E0 14926668 262144 84043f1a149a7544825092c46bfd579e3c91280e halomaps:562 +GHP_Dangercanyon.map 38AA0BCB 126231491 262144 b827a7d8412b4add1c3695d83175554b9338c833 halomaps:3133 +GHP_dangercanyon_2.map A61914C8 148114529 262144 cca2c3d3ae1e3629ccd081ef75c5d048022556dd halomaps:3281 +ghp_dangercanyon_3.map DD0BC533 154203825 262144 7392a6156ee76150e257c7d36b47c1d3ffcf516d halomaps:3293 +ghp_dangercanyon_4.map 52EFE941 148379548 262144 eee816f2dbdb61a17a3f895d1390900de36cf7f7 halomaps:3510 +GHZ_SP.map 4175EA36 20230266 262144 470c5a5cbf4b8e2ff9dfb53db5c170da6b0bc76a halomaps:2326 +gibraltarstation.map 60414A6F 28553200 262144 77c18a6974a9b6bd1b898e88e9704ad645b67894 halomaps:1025 +gih.map CBD48E2A 71488675 262144 07388c3d2a96cdef801b6189fedbd6bf26bf6711 halonet:gih.zip +gih0.map 894B5BBB 42809401 262144 89f026a15c24312e84cec8b77ab1614e568c9daf halonet:gih0.zip +gih2.map 30B299D0 74084467 262144 a72746e5aa9f8352f58ff01d60e63a107ad1d2ea halonet:gih2.zip +gilligans_island_beta.map 07A4C5CA 20310908 262144 2b950d811793f1dd252e60a28f5c03bd22768ca1 halomaps:2838 +GinSeng.map 298556B0 13308420 262144 26848f3d941f97fb184be2d500851d9bb30eadf7 halomaps:3437 +Girl_Games.map 057ED2D6 264268538 262144 62c66940a999fd3d9a6fe3211f7389096b3e3983 halonet:Girl_Games.zip +gj.map F78B5B58 30566900 262144 b5275f41f668c3151390d6a044a7a47674788ec1 halomaps:4802 +glacial_baron.map 7C86496A 43255310 262144 da7d97a6de110a5eda6e237127a1b3a4a8d41957 halomaps:3409 +Gladiators_Brawl.map B72C7061 35692619 262144 ab2400ad0ac86ab16b43e4bde399ac7a62b24f40 halomaps:4554 +Glenns revemped.map EFAF1E0F 82371213 262144 bc9bd6f8863a8764e6efcc868a3928057be704aa halomaps:6094 +glenns_castle.map FD4B9E8C 53385843 262144 9e3fdac1a5251594b63ef5d13bf8ef4232afbe93 halomaps:5705 +Glenns_Greenbay.map 1A8CC1BC 122473720 262144 b076f44eef0b8b4a6afa1f229c75560d365eb5c2 halomaps:5370 +glenns_map.map C6F8D995 49614404 262144 66136dc21c6c6e567047c603f1630341f9b8f4c6 halomaps:6148 +glenns_sandywar.map 3B73E484 90660199 262144 feffb53be7f95cd7c76ec409e9b6f496053a39a9 halomaps:6111 +glitchgulch.map 5EA3D576 14366196 262144 031a2d7cd089bed62192ae4508a0ab3c8b34cb53 halomaps:6874 +glupo_aco.map A54CC351 45696434 262144 11c4e5668e89dc2e2eeb3ef0fbef40d0e55b016d halomaps:5092 +GM-Slopes_Beta_V1.map BBB8279F 13417372 262144 3b441d8055bf4e282cbf14b6fd4eec40c756bf9d halomaps:5124 +GM-Slopes_Beta_V2.map 07DC3E7E 29673679 262144 d09320fab84770d8adb312db601e93d0d7691c88 halomaps:5155 +GM-Slopes_Final_Version.map FA6A2541 31251984 262144 407444547685d5a826f6d73592c2756d7c6be07b halomaps:5466 +gm_flatgrass.map 131C5096 94561087 262144 e67a8dbb586ff09ad1fb6a7b65161a0b36977e5c halomaps:3749 +goldwood.map 8519641E 20609566 262144 4c427dcc83b2fc7d9079cf28b3730811e59b60de halomaps:325 +gondolawarsv2.map 401A85E3 56734076 262144 a93076cce2ba8d00ccfe9a4264e553ed09e45042 halonet:gondolawarsv2.zip +goromap.map ED8A616A 51902321 262144 f53ae094eae6b847b349f55bf9ca0b1a6ff4cdc2 halomaps:3761 +gossip_beta.map 3C3E2428 16998200 262144 ed6406978d2e61d617665437c043642ea5c21247 halomaps:2744 +gothra-mp.map B6FF9DE1 103520956 262144 71dc5f620c6c80db6c640a02f25d6c1f4f9bfd72 halonet:gothra-mp.zip +granitegorge.map 463E1ACD 17898768 262144 045b2f9a87b0009ce0995848392f30bfe8ddd5e3 halomaps:3682 +granulation.map 55645E5A 94549140 262144 d27e798fc7d8bd3d5c537050e231111d0e6685c8 halomaps:6875 +grassland.map 3D0DCB4F 19577044 262144 443ec9efcddbe444e67fcf68afe46a56275baaad halomaps:2041 +Grasslands.map D5160E5E 27778851 262144 b744d1d8f41888c15928d043b3dfb60156b17c81 halomaps:2606 +grasslandv2.map C8D2676B 27477365 262144 67b10b4e79d10d69ee44bf17872fa3606a14c596 halomaps:2390 +Grassygauntlet.map 13C719DD 13755284 262144 40cdc8ca6c5a2ca80b1cf2c9f39d8884d8dfb96e halomaps:1134 +Gratify.map 83EE43F5 13650960 262144 56df650e9dd4b2626d67d51500ecdd99aa7347e9 halomaps:2171 +GraveYard.map 56959C4C 44857807 262144 6f44a3d1e5ecf9dea377e862d66c35b90fb3296d halomaps:4600 +Gravitary.map 104C6149 12818120 262144 187f03d2a6406c0a8be9cf7e3bb1d6a2c7c52f83 halomaps:2413 +gravity-gun-test-gulch.map BDDF5B31 14837292 262144 1960ced849177a73a31ed788d8e0d4aa81210e36 halomaps:2431 +Great_mission_V1.map 5FFA9703 78340395 262144 fb4c887446e750648594448c5871d535662bffd3 halomaps:7125 +Greatwar-Hopeless Battle.map 5E1029DA 120261919 262144 3e1cda394888e9f0ee88db88d83fdef436a10723 halomaps:1952 +green-screen.map D2EB7BF1 16519400 262144 885df3d2870917d0e947860b83843668d6c46d22 halomaps:2951 +Green_Canyon.map 551CE341 26415062 262144 06cda9e2b709aed47fa8971d8b54e3ce8221c627 halomaps:525 +green_hill.map 92E0158A 22467856 262144 353a35d2593d13f0843cc908d8dc980269831304 halomaps:509 +greenfall.map 0AC1A8D7 133379592 262144 e54f3cbbc4ed8a6956cd263940d7686a33867b48 halomaps:6591 +greenfall_v2.map 306B2BA2 137063451 262144 4550bcd3a22151b4d60cc5a9d9b7ff586227b780 halonet:greenfall_v2.zip +greengulch.map 589F02B3 42907505 262144 9863a04a4d7fd9d0cd836c508458a0fe31d4b6b2 halomaps:2607 +greengulch_v1.map 5EA3D576 95986050 262144 2e72175122ec77b26eb7a59fa5f20c3f3daaba30 halonet:greengulch_v1.zip +greenman_map_final.map 0184E291 55446420 262144 afbf7cf3498c5a54c7a75233f04df749beef859a halomaps:4175 +greenpitgulch.map B80202D7 28858800 262144 017671c3f535443e20d64b4d5dfb24931fbcd8d0 halomaps:4026 +greenvalley.map 4C8766CF 17833008 262144 ffadf7620a288d1080776131bc72591fe1e0123d halomaps:322 +Greenvalley_Canyon.map 05D1714C 19541013 262144 bce3b6c723d95ad130d36db1910342667d5511b5 halomaps:2549 +grenadetoygulch.map 6E2330EE 20869726 262144 04e3b971c82f9fc9e3f3f290114c743af66f33c6 halomaps:2081 +GrenadeWarz_v1_Ang88.map 40F53787 15678364 262144 69e22603dadd5c0a1f60dcefc5ddd2dc65aa8283 halomaps:234 +grenation.map 135A40A6 19320032 262144 e9526d747774f86a0c2800e6e498ee2627af999e halomaps:1130 +gridiron.map B6E9D10B 36348896 262144 1928ba843a3b1a7ceeac3ba8d17f8262906123ee halomaps:6946 +gridiron_beta117.map DE97B963 24935824 262144 af40bfb351d2052f5abe329bf2057255e6c81397 halonet:gridiron_beta117.zip +gridironv2-pb.map B5D21AFF 21419512 262144 e53d63465a068835e54e3ffd90f22f559c8bb6e3 halonet:gridironv2-pb.zip +gridironv2-PB2.map DC68BD3E 21417388 262144 acd0f140043f8e684a14fc855a33d6b5e2c78a28 halonet:gridironv2-PB2.zip +Gridlock Public Beta 1.map 00D4ED75 132630593 262144 1b0e935585e50f1e1feb963b7a1548d41f91f50c halonet:Gridlock Public Beta 1.zip +Gridlock Public Beta 2.map C2319471 132308085 262144 1480ea3d02fae83f10304043f3f01cf55347af10 halonet:Gridlock Public Beta 2.zip +gridlock.map 916C2085 87524404 262144 0390d9713a7f09876d5da01ce39c184cf42ea7c8 halomaps:4685 +grifball.map 1AC552CE 174287233 262144 452c4203b77e7208245cecf065e29ba6a24afa29 halonet:grifball.zip +grope.map FB973039 23290343 262144 2ce612748bacda9d010c2218f5603039690f6860 halomaps:2238 +ground_war.map F9AFB6F8 80025837 262144 486c29c3f5f6b01eaeaef477d3de88e9feee45bc halomaps:5093 +groundbase.map 1C03755C 13709644 262144 85b07e12a2cd00d5a42a8969ad089b9600b5cac4 halomaps:235 +grove_final.map 783B7225 31984316 262144 203f0d88038fa1f941e87a61c67b89e703fa7731 halomaps:2015 +grovebeta.map EE7690F3 18916526 262144 9356148cf4d4b0ca580c6d07ac20fa856e34e986 halomaps:1295 +grunt-golfing.map A11D422D 26021902 262144 b50f8d2808025e7bc3f29a694c27b98a68242e0a halomaps:3441 +grunt_attack_2.map E20F3DD7 30112137 262144 5965729f39c3fa61f52e3b3b7b516093f638053f halomaps:1962 +grunt_attack_2_rockets.map 635C35D3 23664889 262144 ce617431372e18f78ba75e7f84b69195bc9e70ba halomaps:1969 +grunt_attack_3.map F46AA181 60760256 262144 d20a260f8f464a1571959ed07383787092e9ef37 halomaps:6392 +grunt_attack_4.map 5C9DA2FF 70619255 262144 47b3c7537ffe086cd8ca706b76483a20b5fcf2e8 halomaps:6427 +grunt_bloodgulch.map 6A2B75A6 52447023 262144 17a42d6f5c841ac13c743182d03170b1b1a8b836 halomaps:3561 +grunt_deathisland_testalpha01.map C1FCA656 73423840 262144 f7948df904e1e28c947ca2c5a7e7ad006e2e4337 halomaps:5245 +grunt_infinity.map A3786EBB 29593705 262144 1a99dd0ef815fbdd2bda8e43f7fa7968b44d37e0 halomaps:5297 +grunt_tournament.map FBA0AE41 21936691 262144 91835b9a42b65bf0353c3835dc2e3f642b054dae halomaps:3216 +grunt_tournament_hangemhigh.map 8330B4B9 80128325 262144 850c0bedbbcf7993f07c4ffcdd0623f4e4b5b403 halomaps:3612 +Grunt_zone_v2_beta.map 12BF80A7 25934893 262144 e6522f97007e3c7ffa70b9ef9fd78176fc5820e0 halomaps:2370 +Grunt_zone_v3_beta.map 14A83BE3 25747139 262144 57a0aa3709c85e42494ea2213001fbca40c1d046 halomaps:2371 +gruntattack.map 663608C8 20545343 262144 97c770e783e5578ca4bb2124d525fb9db2b12889 halomaps:1961 +gruntground.map D884024B 67385979 262144 aa8aeb5f0b3168b9813551fe2afb5c9354a73cfe halomaps:5946 +gruntgulch.map 4684CE03 18429101 262144 56ab741b1c4c23a5a6a1300acebef34211cc9b59 halomaps:3703 +gruntpacolypse.map 13574588 68263831 262144 1bf9c3616e6174130aadd77fc86cff25654a570b halomaps:5743 +gruntrevolt.map 1E8D0F59 35978763 262144 6b5cbee343ae03a4ebf0bdff22b2b38ac43a8cdf halomaps:4509 +grunts red vs blue.map 7D26FE87 33739167 262144 e757a492019d0e289a5e97681e80f7729686d0ae halomaps:6876 +grunts+enginers_vs_spartins.map A4D679FF 23625047 262144 ffe40b89d2f941e7a4a6ecd17f2f9fc5c70f9ab8 halomaps:4637 +grunts-vs-angry-floods.map B7B82040 74918545 262144 f48d100b080a54254a54b9b471ca14bc24b4fa43 halonet:grunts-vs-angry-floods.zip +grunts-vs-drones.map C3654944 37489105 262144 4a36e8aae934739a86a4d8f5e9ef1942dcf77e94 halonet:grunts-vs-drones.zip +grunts-vs-elites.map A01BC2FB 41442931 262144 a6df8586c45e41887260e008327046251d5bdef2 halonet:grunts-vs-elites.zip +grunts-vs-jackals.map 648ECBA1 49062732 262144 6775df03ad4fda8366c15bd2227fad889f6d7d7a halonet:grunts-vs-jackals.zip +grunts-vs-marines.map 774B2E5C 53563593 262144 a651f4e0e0683a2cbce40b9b5df9ae85e41b4b60 halonet:grunts-vs-marines.zip +Grunts_Are_High.map E67B7B1B 21563128 262144 32c72f6134e2ae63255553bf1315e4bc0be00ede halomaps:2432 +Grunts_Vs_Grunts.map 8098E332 255128105 262144 987d913eb1f9f9f2c4a03975a6d98575697b0135 halonet:Grunts_Vs_Grunts.zip +gruntsiege.map 55C1C474 50631930 262144 8205a3b6a59dc81bde9ccb074327a57995a48337 halomaps:4841 +Gruntsvsjackalsbattlefortech.map 13963CDD 39184002 262144 8a18402f094ddd7bfed5a5a8492fa18f0eab4d8f halomaps:4155 +gruntwarsbeavercreek.map 6E163750 90766500 262144 33137759f1c3e414ca1391a13bd683ad57601630 halomaps:1698 +gruntypower.map A7CA0D7C 31790673 262144 159b16a6fcc9edb7c00f72939b09edc3ccdea360 halomaps:4305 +gruntzone.map 5F718C30 19951651 262144 3f15feaf566b6b8928dba48df452c9652f619ed6 halomaps:2344 +Gs_Mombassa_CvC.map 82B7EF69 47834805 262144 c11b363c93c010ea94b375beceb58c171cf9c401 halomaps:5947 +gta.map F604CC7D 61671629 262144 a30c61befba1ec9dffdee318afcaf654d2b81720 halomaps:2952 +gta_beta3.map 8BBBFC4E 12682874 262144 5f0523a039ff45df923ccc8a4acd6c3db893c488 halonet:gta_beta3.zip +gta_beta5.map 1B6DF2F8 13787116 262144 c7215cd3b619b61d3d293cfdf0ca82fc3d915bc4 halonet:gta_beta5.zip +gta_beta7.map F714F4D8 13787132 262144 f3dddde14945f86e14315d6267bcd7fc975f0387 halonet:gta_beta7.zip +gta_beta8.map F714F4D8 13789633 262144 f93704e3cee4a64e0a0f891ae18981f84a18accb halonet:gta_beta8.zip +gta_raceway.map 82752F03 112507973 262144 3feaba48134ea2e3500f464e36019a652a709f9c halonet:gta_raceway.zip +guardian-h3-fix.map 5A902891 248361092 262144 4716cdd26763d6457ada38e3687f5e1c1f6481bf halonet:guardian-h3-fix.zip +Guardian-H3.map BC4C9252 242265901 262144 f7a1f799af076ea166744abf91619fc22db30ca2 halonet:Guardian-H3.zip +guardian.map B1E455BC 53654776 262144 d77dbf6a03ef6d4b2f4e565312df63a840512f83 halomaps:7006 +guardian_forest.map 01924FC2 268540465 262144 e182322030bd7c0bdae24a6cfaf6006d64b17225 halomaps:7015 +Guardian_Temple.map BD9F2215 291584453 262144 edd2ddbb86ba65c22ec42458d4b3587ecfeb9c9c halonet:Guardian_Temple.zip +guerra-de-tanques.map 8F62A5E6 52701570 262144 fffe73f53daf04615c4cf46673928ef89b32b2c6 halonet:guerra-de-tanques.zip +Guilty Interior.map 88455D93 129943780 262144 c3635d5f1c943e85b8fb7600645db2a06035332e halomaps:7007 +guilty_mp.map 0D931E70 74532073 262144 e3eaf76e6b96402e2d55daca90b046129e656792 halomaps:1927 +guitar_hero.map 74E46F74 47176944 262144 1613cd203ace9f6737b287328c6a500dcdaf7c0a halomaps:2667 +Gulch-o-War.map 141F31BE 42556223 262144 3fef3c30c048e4b48f158c019431c836964c4df1 halomaps:2633 +gulch.map 61F6F7EB 50178252 262144 cec545814cf36a13bda20c96b2c9c9b09d35fc2f halomaps:5566 +gulch2.map 14B18B36 23193772 262144 294cd3e0ba343074ce5e76fe4585ee577040f64f halomaps:893 +gulch3.map 788CC5BD 20582835 262144 65e59f205065a0842758fbb4100fd6cfd44d8e80 halomaps:1619 +GulchAlpha.map 577A6CE1 13672148 262144 e4765df6bb3c299539875742bc6dee3fe271df3f halomaps:4430 +gulchblood.map F8A2186D 33422959 262144 83a1d273a05d0fadbaea69be29dd4a794fc839d9 halomaps:4216 +gulcherhoohoohoo!!!.map 7D855DD0 17764604 262144 a2d610de5db400c104ca857aad98b80a061cc83f halomaps:4261 +Gulchtropolis.map EEA908F9 103535860 262144 4434bb419e4911da5ee2c2c8129d6e5498dc19ff halomaps:6251 +Gulchtropolis.V2.map 81B0C98D 93227148 262144 6e4887161d6cdcf64e2f3be6f02c38ee3e463e8e halomaps:6937 +Gulchtropolis_Night.map E57C64D0 93222192 262144 516e6eabc762c017fb4f6ce15b08a477ab3c4bc1 halomaps:6938 +GulchtropolisV2.map 895ECF9B 94292708 262144 bcd5bd70095fbdd54adce67ff854775e4e85bfde halomaps:6834 +gulchv1.00.map 02E1F756 19642875 262144 f3667b0a1dfb77fafe3b001537760db0aaee2e3a halomaps:4156 +gun_me.map 7A88FAD5 236169071 262144 2b622e32bb40625158292be4c9fdb92e8834edea halonet:gun_me.zip +gunboat_wars.map 68995F11 95652597 262144 07ca499490493337dff830048403cc73feb7ee1c halomaps:6393 +gundown_showdown.map 4A9A69D7 42794336 262144 fdec4e94475275073946623d941d19e47562a1aa halomaps:5127 +gunrange.map 94E6FD14 381707297 262144 935fe4634c551118c0573bbcdf63be2b603119cf halonet:gunrange.zip +gunshot_valley.map D72E6BE5 13316896 262144 e77a1d63c0010934f033ed3c755df50b8f2cc8f1 halomaps:2608 +gv_arena.map 1AE472B9 14156432 262144 10f526c32cd449abff6f924d6d6b7c0df2ffd77e halomaps:2239 +gyrosphere_alpha2.map 392B30A1 13101836 262144 02c81a0a5816320cf04bd326a57944587a86f3d6 halomaps:650 +GZ_H2.map B7F9BDA2 44516761 262144 9e658658b85743b954aa01e3f54ede5f79c31a25 halomaps:711 +h1.5_crossway.map 094E0BFB 13778156 262144 8e0484132977966ee53be14401320ae24444a490 halonet:h1.5_crossway.zip +h1.5_crossway_fix.map 094E0BFB 13778156 262144 f7b3ed8b3f330f73e5705144bcdab32485dffb5d halonet:h1.5_crossway_fix.zip +h1.5_decidia.map 6D822601 15893528 262144 e9a1d30a7c29fbef483276060bf243e09a409a30 halonet:h1.5_decidia.zip +h1.5_decidia_fix.map 6D822601 15893528 262144 37a8e001242c954ece7e5ed35b8cce55b7d0f768 halonet:h1.5_decidia_fix.zip +h1.5_doubletake.map 00AAE3CF 13909748 262144 bf4b592883bdd795bf455f7e2d827747f5ec5bd7 halonet:h1.5_doubletake.zip +h1.5_doubletake_fix.map 00AAE3CF 13909748 262144 ab83a48f30462cda84ef2b67344abc7391ca76f3 halonet:h1.5_doubletake_fix.zip +h1.5_downrush.map A6814DAF 13684596 262144 5758dd53f09f0701c5a4d7f519b551b8ed452651 halonet:h1.5_downrush.zip +h1.5_downrush_fix.map A6814DAF 13684596 262144 5f85420438cd9fc5f072e8959460b6fac8806298 halonet:h1.5_downrush_fix.zip +h1.5_exhibit.map 96CA5B1A 13839396 262144 288a87e39424977288d6dd28fd4eae23ea414534 halonet:h1.5_exhibit.zip +h1.5_exhibit_fix.map 96CA5B1A 13839396 262144 4fd6d36127ee4e8ed84b09797654c50b5da14669 halonet:h1.5_exhibit_fix.zip +h1.5_hotbox.map 449993FE 14175596 262144 a80145ea9454e72349e9753b694910d34282b520 halonet:h1.5_hotbox.zip +h1.5_hotbox_fix.map 449993FE 14175596 262144 60c01d50369b811fb0722a97ab0fc66d5151d615 halonet:h1.5_hotbox_fix.zip +h1.5_imminent.map 66531BA3 13745428 262144 b75600e8535cb3a624e0eb01d63a5a9c2bf7322a halonet:h1.5_imminent.zip +h1.5_imminent_fix.map 66531BA3 13745428 262144 85fe014db31da3fff81bff409f37330a44f53bff halonet:h1.5_imminent_fix.zip +h1.5_levee.map 4BDB4960 16403624 262144 5704951547e350d4409d95406d95a89117de2400 halonet:h1.5_levee.zip +h1.5_levee_fix.map 4BDB4960 16403624 262144 7b1b531dcde1e2a48b77cdc6b5d0354814e7cfa2 halonet:h1.5_levee_fix.zip +h1.5_madhouse.map B78C06B1 13713096 262144 7290733471d3785ec0f11e730c451fc1a705c511 halonet:h1.5_madhouse.zip +h1.5_madhouse_fix.map B78C06B1 13713096 262144 2306dbceed7ca0f4a3628ccdb602423ddd68a471 halonet:h1.5_madhouse_fix.zip +h1.5_outbound.map 7E153647 15383460 262144 136d2058c41f2c4c5e61af21c13f70eb2574ea32 halonet:h1.5_outbound.zip +h1.5_outbound_fix.map 7E153647 15383460 262144 25b431fba809ed0071354f16c139486ebf6c47ef halonet:h1.5_outbound_fix.zip +h1.5_redshift.map 88072204 14311204 262144 666fd8aff934256d01dd11358e8bc574b9a4e2d3 halonet:h1.5_redshift.zip +h1.5_redshift_fix.map 88072204 14311204 262144 3c9af90b221a737767aa7816f694e445713eec71 halonet:h1.5_redshift_fix.zip +h1.5_uplift.map EF542FD2 14220944 262144 8f3c0b0a88d01ea9a39da18504376ecb30189953 halonet:h1.5_uplift.zip +h1.5_uplift_fix.map EF542FD2 14220944 262144 1b8635fb6fe5d6132bab9ddc6825126cf212d355 halonet:h1.5_uplift_fix.zip +h1.5_zerohour.map 0DE55F13 19514112 262144 62f3f1a4ec1ca16f9321f92f0caa3a9c50bdd415 halonet:h1.5_zerohour.zip +h1.5_zerohour_fix.map 0DE55F13 19514112 262144 0d363493266be4dd013bd715aff882db4a37ff45 halonet:h1.5_zerohour_fix.zip +h1x_beavercreek_v3.map ECD2354E 104467852 262144 a4500c5f5cba0b3bb0225a91edb14374d73d22d4 halonet:h1x_beavercreek_v3.zip +h1x_bloodgulch_v3.map 1E598CD5 105566668 262144 0815151d0ad93dc93f3bd4be3fa2adde9293ea6b halonet:h1x_bloodgulch_v3.zip +h1x_boardingaction_v3.map 0113946B 106242464 262144 e99a4bae08704851dc8faafaf877c51becb46b59 halonet:h1x_boardingaction_v3.zip +h1x_carousel_v3.map A9BED10A 104337696 262144 4bc0d678a4990adb4825304dc13460566eafea3a halonet:h1x_carousel_v3.zip +h1x_chillout_v3.map 48597AFA 104173988 262144 211b3a075bf80457671e4771d4c7edd8ae6d847d halonet:h1x_chillout_v3.zip +h1x_damnation_v3.map FCEBD17F 107062796 262144 438a64fcea985f0053c086779a1fea07ba21e76f halonet:h1x_damnation_v3.zip +h1x_hangemhigh_v3.map 25A10408 102892296 262144 f5b11de8dd1a299538085bc8c87e6cba1ff2b700 halonet:h1x_hangemhigh_v3.zip +h1x_longest_v3.map 29A606B4 102264332 262144 cfa402c3a8df1121dc3da62f09ba70bdbb2f8e98 halonet:h1x_longest_v3.zip +h1x_prisoner_v3.map E1D5F07C 102934344 262144 1dde15eacd855655f5e1402b15d57b103d3532f0 halonet:h1x_prisoner_v3.zip +h1x_putput_v3.map 7690BBFE 105595340 262144 9889a91d944520d38ce25d8811433373781bd649 halonet:h1x_putput_v3.zip +h1x_ratrace_v3.map FCDCCD2C 109628040 262144 a3fd5931b149312dd8f890696a1196686b373116 halonet:h1x_ratrace_v3.zip +h1x_sidewinder_v3.map 22A67953 106657320 262144 6f510a5618800ee4ec10b6d0b2465f47824ca3d9 halonet:h1x_sidewinder_v3.zip +h1x_wizard_v3.map 91C3B2D0 104039184 262144 7ac3a3468f68b1e2d52572a4872f7c7ff9aabd86 halonet:h1x_wizard_v3.zip +h2 coag modded.map 7A340AE7 76804386 262144 780ff709a652093ea95a48431ab14b5a2e0aae45 halomaps:2635 +H2 Coagulation ME.map 265D6EE1 132648978 262144 4595e71111968ed18ba204f1302fce940ce723a4 halomaps:1106 +H2 Coagulation.map 7A340AE7 76804386 262144 d853900bd2daed57baa93c52b59f6b7104ba53e1 halomaps:1095 +H2 Oblivion.map 7062A6D5 72824806 262144 e3b8a392eb03485578111b99bad7bab2a83c2588 halomaps:1675 +H2 Shadow Release by Advancebo.map 2CB84743 18598284 262144 793dc1255da4809b5a33b3fe7d1a34cf896bd718 halomaps:4975 +H2-ascension.map 5C656349 58670350 262144 5738d64013a5837008c60ca7c38b78072eb215ba halomaps:1731 +h2-bgv2.map 4DBB1B99 51351107 262144 e944332b8c9277c2ced5d22001cb4ef413c56147 halomaps:1506 +h2-blow-city.map F7AF38B9 122289573 262144 0f26dd338982fb7e3270ec1d91cacd31a28f2fb1 halomaps:1739 +h2-danger-canyon.map 0BF2AB67 20657500 262144 755c6a66651001e3149cb6cf3b3c59bfa0611c64 halomaps:3669 +h2-dangercaynon.map 31942FD8 50235783 262144 139be146c08bb1d156ff4ee80f326b5835648e3b halomaps:1543 +h2-foundation.map ACC9E98D 24723441 262144 759c1a19b0fbaa19db0c11ffa9bce877578521dc halomaps:1240 +h2-gephy.map B1478A8B 51283618 262144 f56d53055ef0fae17d3907712c1f52beb4d2fac7 halomaps:1544 +h2-huntercreek.map 79552A76 46870526 262144 1435e3f728717e35d85dd6cb0cb4a4c3fad8cf85 halomaps:1495 +h2-innerpoa.map E9EB0BC6 107777079 262144 d85b747c5d5d9fe9f9a4b8ba0beb3af7d337ccff halomaps:1466 +h2-lockout.map 968CA6B3 59101759 262144 2f11b07d668790405813845d7a9906d8849a046b halomaps:1699 +h2-lockout_final.map A47E5C39 69240095 262144 1403487105d45225783ea7103706a3a5defe0fa4 halomaps:1740 +h2-lockoutv2.0.map FCE18B76 73662932 262144 7c3c52ad60e2bafb28b71d58d66a1e84b42720c6 halomaps:1709 +h2-relic.map 7C03B89A 25033189 262144 e40acd8d1b7d9a5b6ed2621c994de342af4811b2 halomaps:1252 +h2-relic_V0.2.map 8D9FB02E 47749727 262144 9992eea43f8b64b3f300b547e0b17f1f3f0bc3cb halomaps:2433 +h2-snowing.map DAC59316 69443949 262144 9b034c66b048519fd010a1264a209cb0d1df3aed halomaps:1467 +h2-warlock.map 65F0D615 27585925 262144 53246e8511b9d44787f59e0ef32d285463eb2ad0 halomaps:1166 +h2-warrion.map F29D2033 28025598 262144 273a271b22c2b1a74408e0cf5eadab95eb14a669 halomaps:1190 +H2-xXxTrainer.map E27BA30D 54101961 262144 2260c4c25d8131814241cd99879ef40a0502789c halomaps:4339 +h2_ascension.map B5DF63E3 45171888 262144 5e4977b42d36839e319662cd8b5b218dcd427f6f halomaps:1550 +H2_Backwoods.map 359CDD9F 57007077 262144 5e5d29725e1c2ba63dd8d391ce9c7994ce879ccb halomaps:1155 +h2_beach_assault.map 0B64BD06 80970052 262144 dbd9740805035a22b5f5a80728326f16bb816af9 halomaps:5005 +H2_Beaver_Creek.map 1EAB3D92 52670293 262144 a07a52d38ffc4d095f72ce21b6b910a81d5864c6 halomaps:1160 +H2_Blood_Gulch.map 772AEB6C 59053893 262144 3c3895ef85184cd39e191d4adfb735a704989c0d halomaps:1161 +H2_Blood_Gulch_CE.map 87C91358 36092917 262144 09e1a8a4835a9e790036e89ea3dfc36d998d2edd halomaps:3670 +H2_Blood_Gulch_CE_V2.map 7867F882 42812233 262144 90580d77723869d0bbfe06209dd9d057ef8877a4 halomaps:3683 +H2_Bloodgulch.map ABAE1AA7 61620300 262144 b867d2644a1b95ac734bae40653b5a5e7e179774 halomaps:3727 +h2_canyon.map F23E5FB4 26560872 262144 d092022e9bc1659cbe364007bd23b291631a2b11 halomaps:1485 +h2_coagulation_ai_publicbeta1.map 9D32ED73 132721425 262144 0d03d4856265bace5cc4fd2fb36a3d015400a246 halomaps:4257 +H2_Dangercanyon-V2.map 62274AD2 78789125 262144 eabaa89cde9fcc4919c0364105ce3b1d83b2a8a1 halomaps:4027 +H2_Dangercanyon.map 111CB2D6 79736386 262144 c2238d555827c1bfa447df6f43776e218578579d halomaps:3788 +H2_Deathisland.map D738A508 57616260 262144 a6e463b4df00eb8657a913281f6a3e083b59d34d halomaps:3728 +H2_Deathisland_RC2.map 1170B9B0 82298302 262144 a5aaf51dbb510ef2f84a01e940a2fcce1fff202c halomaps:3750 +h2_deltaruins.map FD285BDE 75592033 262144 f8ad39d83f0482e454d2497bef0d92ac767698b2 halomaps:6877 +h2_derelict.map 82004BB1 20670872 262144 2c172420b23763b3418737fb63c872dc45b9787e halomaps:1561 +h2_desertplat.map 14160028 170325327 262144 c97abe4a950fcb6c89c9d6484a2a8a924264c053 halonet:h2_desertplat.zip +h2_fremantare.map BD1EB4C5 21364544 262144 b405dbc454f4dc226e30027ec35fcb408a0f5332 halomaps:2749 +h2_fremantarev2.map 6DD73B10 21640815 262144 c06dc432f2fa6673189b57c12ee6584d17ebe693 halomaps:2777 +H2_gerophobia.map E9550DFF 41859895 262144 315584f8afbde3288da82d3272c9b47d99cae9ee halomaps:4196 +h2_h3bloodgulch.map 024A9E49 44765773 262144 6d5152eeb14fc93c09efc84b1e576bac12afb3c1 halomaps:4969 +h2_h3damnation.map D3A2FC44 41763197 262144 4ff2a4a50070a1b287aa1244101e582e0d8ec01f halomaps:4982 +h2_h3sidewinder.map 59C66992 46093849 262144 c0e977625bea8f388a85e50b24c36b0530a696f7 halomaps:4983 +h2_headlong.map A030683D 73395951 262144 e578ddcb2ba0857b6c41c4f4d63f81f9b780e732 halomaps:1225 +H2_Hypothermia.map 2C72802F 65227226 262144 eb2166fd1f58f3972735b852d6b853e9ed81d72a halomaps:2434 +H2_meteore.map 47D791FA 50471798 262144 689411f2e271504a8ad751e0a72b0e9751159203 halomaps:3094 +H2_Momentum.map 6F46B2F0 51904537 262144 70e739a0e7d868c2da95a1c0bea66f182daa1548 halomaps:1156 +H2_New_Mombasa.map 2D97FD8B 75727085 262144 e0d86979028d1df531d453a059460ca19d14a852 halomaps:1154 +H2_New_Mombasa_v3.map 2D97FD8B 75727085 262144 7acafd052d66651206afd6d9a12db1e4ecb56a9a halonet:H2_New_Mombasa_v3.zip +h2_pinegulch.map 390489F5 27322303 262144 ebd3ae7304283540dcec61fc7f8d0cdf009afcf8 halomaps:4939 +h2_regret.map F9897706 82593007 262144 81d8519f1fb12fd6ff5d7ccb38d74a98721150f9 halomaps:5061 +h2_regret_v2.map F1EB363F 83526335 262144 f1dc6bb60fefcbab2ab4a360383d6229237e5ae5 halonet:h2_regret_v2.zip +H2_SCHOOL.map 3C467DDF 34453267 262144 5a925a44e887e19ab564f755e6f55b3e3c107fb3 halomaps:2718 +h2_school_Final.map F77CEC43 54733901 262144 4570ee12088c92a36ea95cb3ea5e9688b4f883fc halomaps:3095 +H2_SCHOOL_V2.map 51DF9CEC 36119321 262144 1e8256c3e04926679b169a9e9904cd60cf5204fe halomaps:2778 +h2_school_v3.map 0F867BC7 51461172 262144 6f3237956804883c403bcbd72d3266c6e84bd46b halomaps:2903 +H2_Sidewinder.map 992C7C13 61900874 262144 efa9234214126dc9ce3fb511aad62daa8b1b08a2 halomaps:3729 +H2_Sidewinder_With_AI.map 663E1EC3 67753712 262144 d297de4a8df11954788c922355d488c55a6b99a9 halomaps:3790 +h2_tropics.map CF8CAA7C 20112480 262144 98bde2bfcb39e753bf401d91110ca626562bab72 halomaps:1334 +h2_tutorial.map FF497A72 18056345 262144 fdb276bf3c02f15bcaf78c9ce2644dce7d35ccdb halomaps:2971 +H2_Warlock.map 3EFB34FD 62706185 262144 ef37e0a4385ce7bbb4826334d2f4a105df50e7c4 halomaps:1152 +H2_Zanzibar.map 7060B488 80340287 262144 e659c7d0f0ffdff7ef24a47cc2b727d97b1cf3c3 halomaps:1153 +H2_Zanzibar_v3.map 7060B488 80340287 262144 8eafd9ad8014249fbf218b85461453bb3f79c021 halonet:H2_Zanzibar_v3.zip +h2battlegulch2nigth.map C9676B89 119764036 262144 d96ae0cf931fef14af59b554c1d7e627315f9b3f halomaps:5915 +H2beavercreek.map B5A7825E 25096230 262144 92bd99c6a9ccf3d7b434e1229a5d3a2527cbfe4f halomaps:2885 +h2floodgulch.map 4DD11D2F 129209425 262144 6c644258a74f1839f25fa2af75f713afea3e8947 halomaps:5567 +h2floodgulch_V2.map 058935BC 128719890 262144 82d985c0043fe524fe5b09bff13c0d4f939f9a06 halomaps:5634 +H2H3_beavercreek.map E4766F0C 52624320 262144 806e3fbbad6152c3ff404f5345be7f3e700e41fe halomaps:5926 +H2HUDgulch.map 8105295D 23641116 262144 2dcc5cf9c03913b06e7a5723424c2ca7fe2a3b2f halomaps:5871 +h2v_cyclotron.map 25180720 107069723 262144 d3e426cd258a0b7ac5856293d7824da803c0e618 halomaps:5962 +h2~Chiron_TL34.map B89A60FD 39416313 262144 f9f08e48131efb3e0054fec266a4ed28b4ae18be halomaps:1492 +H2~Eternal.map D0C28757 38450815 262144 34b4bc9aa480e481969722016b04c60ef62d4347 halomaps:1317 +h2~warrion.map 3FBCC6AA 27685350 262144 e6a98c457d14381648699af1316f3dff249e076f halomaps:1620 +h3 foundry.map F8C7AF2F 133865339 262144 ee51cd330d95d07f31dae144ea81d06be20d3009 halomaps:6677 +h3-ample'smap.map 3C88616E 177745059 262144 f3640c1b33a01ae31c828c507fa7c122195ff797 halonet:h3-ample'smap.zip +H3-Beta_Ample.map 64D6CC73 270607472 262144 77b08cda9d4e91d36d5303a5176972f6adb24dc3 halonet:H3-Beta_Ample.zip +H3-bloodgulch.map 1C521CA6 130383071 262144 bb6d71164daf99e26a8cf12b01eb3dd267daa759 halomaps:5510 +h3-coagulation.map B10F4DEB 209742876 262144 c9387dab05c28f40ba5640219281e95149199574 halomaps:5156 +h3-deathgulch.map 7607BC51 132004202 262144 ae87e5e14aa7376a0cc8a61ce7d03568ccbe2afe halomaps:5687 +h3-heretic.map 2B7A2B1C 180775467 262144 4192ce55732536074e3d8fe7787966182ab8f347 halomaps:5246 +H3-island.map 8DF2993E 87356014 262144 5ba4cffe74ed08079c06500383299cf656252934 halomaps:5511 +H3-NovaGulch.map 878D336B 189001224 262144 42f8a1c573a6515298ce1ba56f94e67d8e3e85e8 halonet:H3-NovaGulch.zip +h3-reliquia.map 80EAF770 112530321 262144 c547d6642e80ff39d4f8f39db049b837f1492aea halomaps:5103 +H3_B30_Mod_Beta.map C53E5F2D 149188700 262144 077bc2aa65f5177eb83f87516c43a54f2e78140f halomaps:5637 +h3_bloodfores.map 4C0C3061 120885643 262144 adde305e4255b0259458c288703b41eea99b44a9 halomaps:6230 +h3_bloodgulch.map 603168AF 126027556 262144 c798053c3e80734d458aa18c45070f26cadfa832 halomaps:6281 +h3_bloodgulch_alpha-2.map C3DBD674 108009774 262144 dd2401f011847d6b3540a4ce35a506692f30c3c8 halomaps:5877 +h3_bloodgulch_alpha-3.map A77F1DB0 161232311 262144 c7925fb64cad4be59ee0bf1ff12104177fc187ba halomaps:5948 +h3_bloodgulch_alpha.map 062C1508 136506911 262144 529c59fb3890f57037c2cf4291c10f3540709d44 halomaps:5876 +h3_bloodgulch_death.1.map 2A37ECDF 93356226 262144 41c792c6bd2d633b3e99b29ad7ae44bb0ddfe29f halomaps:5850 +h3_bloodgulch_death_battle.map 44579A7A 132568774 262144 2f66fedbb03e590ca5c0fbb4493e306c3ed7d401 halomaps:5851 +h3_central_electrica_beta.map 834A47F0 234638385 262144 8808776a280d420b829db2e3e94602039fce5b2f halomaps:5839 +H3_Dangervalley.map 01D7CE4E 372025195 262144 8fc7c69f4e3fc3db6c2c88ee4bbccf77a7641d72 halonet:H3_Dangervalley.zip +h3_deathcañon_odst.map FC8605E6 194495318 262144 0af227ca3e841d2e4c8db29da33f748f29a88fea halomaps:6231 +H3_Delta_ruined.map 5FBB343C 52216744 262144 e9324121de958b291e20770d9341f1ebad8ac3fa halomaps:3207 +h3_derelict.map C42C0412 113614398 262144 4540ccda58560243b79458bb52f314fe18890df8 halomaps:5756 +H3_Guerra_Total_AI.map 03B7D401 312819707 262144 668459ba92aad1fcfdcf17f4a28fd40354efdfcf halonet:H3_Guerra_Total_AI.zip +h3_Hard_em_High_V1.map D72F8D22 162297333 262144 04d380994112b269f7c5516dd3b88f82f708347d halomaps:5872 +h3_invacion_beta_1.map 98B6A113 119964482 262144 44b2627b5f7963ca8a2d5a476576805c01603808 halomaps:6215 +h3_longest.map E4EB1A14 36295001 262144 cbcaafe71b621607bdc8ccef5d9084dd9b7c95ab halomaps:5139 +h3_narrows.map E981B041 127123984 262144 a8e34f2317231d0ef82d46c120e0e2a2274da00e halomaps:5783 +H3_plains.map F1921856 25720937 262144 6439fc584e283bc0ea6832655148e1b4c6a5fee0 halomaps:2372 +H3_prisioner.map 38A1F1A5 95348399 262144 7259e765b96175fd3946403a46010ae6340a1482 halonet:H3_prisioner.zip +h3_space_gulch.map 76DED7F6 115726795 262144 b864ba00e659fba8575f63b38a97075a680aadf1 halomaps:5840 +H3_Tower.map 2D51ED3A 96395613 262144 53b55236276b5c8533f02f91a82e2604e3061db9 halomaps:5927 +H3_Yoyorast_Island.map B248E52B 89612141 262144 41d13ccaaf0aa1dcd50ca7390c5b1e0e5045c1a6 halomaps:4620 +h3_zouina.map 559816B8 63799424 262144 91f040dfc58b72b0f7de21f9dfcc9570685050d5 halomaps:4667 +h3_zouina_remix.map B10248F9 55245780 262144 2b321be12b9be07c85e710add493da3ead66edc2 halomaps:4672 +H3Damnation.map D07BE864 91141495 262144 c6b5c658c41cc0015129b874a70d302fde41dd72 halomaps:6019 +h3mt-foundry.map 2E3B9BAC 132376855 262144 95a617ff74e04c3bd43b03b54bc2d504093ef005 halonet:h3mt-foundry.zip +h3mt-narrows-pb1.map 3F9D065C 131418501 262144 9991c101e98f3a889f39b509d52994bb44e352cb halonet:h3mt-narrows-pb1.zip +h3mt-narrows.map 8723BD96 82805477 262144 30b12b2dac6ad48ce976426d60ac4d7e26d18265 halomaps:4405 +h3mt_bloodgulch.map 52D45B41 134094095 262144 c82436faad5362d2208fcc574cf7cb26574d2f8e halomaps:5094 +h3pelitest..map A2FD3133 41296286 262144 3cc255e5cd687b0d79f1f03082224075d75a5412 halomaps:6178 +h3t-coagulation.map 963D896D 113245721 262144 8fb275b5dc61872b3b0512f621f9d8b5f055e773 halomaps:3359 +h3t-coagulation_pb2.map 87DB58ED 84102680 262144 c187e02d64ac1ce255faab22afd114db3c54db2a halomaps:3411 +H3T_BloodGulch.map 4EF58392 18750908 262144 738cd1936f222bc06aa82e59a4e3f6a15e7ec1a7 halomaps:3048 +h3t_soulrunner.map 269EE3E4 52688498 262144 e49efdccb29812fe3fd296a9ace72b6204d54cc1 halomaps:3185 +h3the_pit.map A4A7ABEA 156060426 262144 ca2be6e19fe9d05e12cc5f0967c97c035c060d6b halomaps:5022 +H4_Bloodgulch_War_AI.map 2EC3E3E3 373279732 262144 a11aded4668d557edff3bd2364b296e3b1149eda halonet:H4_Bloodgulch_War_AI.zip +H4_Chaosgulch_AI.map 453D6296 343767088 262144 3a4d3f63e632dd75e066517e127bcc342151b0f9 halonet:H4_Chaosgulch_AI.zip +h4_estacion.map FBE4CA92 282675857 262144 d3533a47d8a2b93864c59ea953baf9b070f01558 halonet:h4_estacion.zip +h4_lockout.map F876114C 370534865 262144 ffb63bb3132fe948ac6b002360018fcac9bfc864 halomaps:6709 +h4_snowcast.map 306D805F 394247900 524288 9e2477addd8ab81b2eba0f173675756f5ca3ae55 halonet:h4_snowcast.zip +h4_vs_h3_spartans_rockets.map EFB90125 282375620 262144 59f0cc6ec64ab0612b5fea1794b51b5ae4ecb616 halonet:h4_vs_h3_spartans_rockets.zip +h4e_putain.map 120E16C3 42293799 262144 6ff2753f546a2d49a957864930e6645378d73f02 halomaps:4248 +H4X.map 733BBA70 39315376 262144 c68843ff99c973bd8640eb1c5a2a75c76350161d halomaps:6095 +H5_Battalion.map 00CED108 399554271 524288 cc849628e7bf2a8ffd7eba9e740b9b8906f1b483 halonet:H5_Battalion.zip +habe_quidam.map 92E357BB 14630520 262144 2e3570c154734df392b8655110eb99a3f07148e5 halomaps:3236 +hack.map FAF1B589 13940556 262144 d1f3b30282c4b6601170448312fd9e586317e335 halomaps:468 +hackledjackalsinabrutalbattle.map 4827D4E5 30680820 262144 059fe6839add6414f13a977c52863bd563b195fc halomaps:6020 +haf_training_grounds.map 3CF17F2F 12207128 262144 ffa9b1035db5f78774248f95659d17d424cbd4c6 halomaps:2685 +Halcyon.map 695308D5 14666768 262144 4e5c06b6fbe7103bbb505e1831752116358fd933 halomaps:236 +Half_Jaw_Danger_Canyon.map 78841AA1 25381509 262144 7116ad0bf586533cd369678e38d3fbafc2968e82 halomaps:3660 +halfa-remake.map 43D31133 369219786 262144 5f14ce0f902c67d085b619b7efc9fa4a6747f4d1 halomaps:6926 +halfa.map 48F9C634 125200348 262144 015690c9fdc4f48165978b27851c30215797e1a9 halomaps:6796 +halio.map E7B455CD 34157787 262144 b23111fcab0823a0ac5886c3e8dac17bc032353b halomaps:3255 +halloween_gulch.map DF9E1F76 102550175 262144 cb33f2c001b19e62f219e76d0bd4f607428b2482 halomaps:4094 +Halloween_Gulch_V2.map 99F20964 120405225 262144 f8dd5548c71ee7dc2fdcccbab9c37048be350927 halonet:Halloween_Gulch_V2.zip +Halloween_Investigation.map 433F04C3 78567540 262144 5e4bd4bf63276f6ff3421da13aa8d5f3783c804a halomaps:4071 +halo-mod-map.map 5026EC3C 32995700 262144 28445380ab40b70e864cc87c655d005623c4dc12 halonet:halo-mod-map.zip +halo.map 9EB6133B 22047536 262144 92c2a5622bddacc08afda9639ceed73cace7ed43 halomaps:898 +halo2_backwash_beta1.map BBA2729B 44976584 262144 151782d424fcdab44a2c8693cac231025927a045 halonet:halo2_backwash_beta1.zip +halo2_characters.map 6B6AEFD4 36105470 262144 e4f7c749faa1dd08321eea640e6842933570781c halomaps:3850 +Halo2_Gluch.map 83505C17 86511000 262144 56a8be527cf47e86beaacf7a061c7ee4a0343c14 halomaps:5043 +Halo3_new_blood.map FDCE5C37 15686320 262144 1d30dbb946445262a8d64080b1f3e08d2f6b5490 halomaps:3471 +HALO4.map 0FC4870B 80151558 262144 4a080aa27712fff4dad117deca373fdb4dec0d2a halomaps:6693 +halo4gulch.map 192B4C1D 49371023 262144 2afa05bdb880a3fce6a6c0e09daa5cc6e8ce8297 halomaps:6520 +halo_2_lost.map 454AC696 67857005 262144 b84b05fc3d7ba6d4cd5e9414e5e1d96645caf336 halomaps:2435 +halo_arena.map D9C33BF9 15458280 262144 d7d34b40a78c2c4286a6e2aa978eeb9aa0aebc2e halomaps:1597 +halo_ball_5.map BA2CF301 21907844 262144 85acb22ad5097e4f44913a5fbbf5247a1d768839 halomaps:5006 +halo_ce_machinima.map 49D1E2D9 81744807 262144 8845952ce798bbcbcde2caa4bc81cacd67e458ec halomaps:6494 +Halo_Deep_Ocean.map 0476C594 391706554 262144 443123ad7df1c2536938be336ab09dfcc85a5c6e halonet:Halo_Deep_Ocean.zip +Halo_HQ.map 52E965E5 19819421 262144 0c646f6225b3d128b1e9fe64833c9a128c61507e halomaps:237 +Halo_HQ_beta2.map 9D3B875F 19885748 262144 7b83bab97723c1669f94a3e65471bd1711cd0d49 halomaps:238 +halo_hq_race.map E8EC8D8B 17859257 262144 75830e4b3a1cba9ade6f5026230cc046b8f94326 halonet:halo_hq_race.zip +Halo_Islands.map 3952F415 103750858 262144 0c87425cda9f40f59e08fca4f1df7a402c1e0d89 halonet:Halo_Islands.zip +Halo_Kart_Banshee.map B688358E 83214112 262144 c7bd8cad85fd0ce95686f7709e8f4031f119e1cf halonet:Halo_Kart_Banshee.zip +Halo_Kart_Bowser.map 355D8A39 66016372 262144 3450ce5b8c33c1ad8ab22e72bb61df4f3bf3d091 halonet:Halo_Kart_Bowser.zip +Halo_Kart_Fort.map 1EDF8C54 57721664 262144 dec30e92d66f472402542715f45f6104d52bd709 halonet:Halo_Kart_Fort.zip +Halo_Kart_Koopa.map 6FDD8B7A 64136928 262144 5b03fa3aefc894751a20cf72b6e3ac7c7b4f15fe halonet:Halo_Kart_Koopa.zip +Halo_Kart_Moo.map A76C2C93 69519856 262144 dd55fb0453a266ce78092bf077628a5140264956 halonet:Halo_Kart_Moo.zip +Halo_Kart_Peach.map 899B5141 82251916 262144 de2f77d9f0c4c93d853227054eff1fc92cb281ca halonet:Halo_Kart_Peach.zip +Halo_Kart_Sherbert.map 54306454 61939356 262144 9468929029450403486e7037b5475f3c90591e90 halonet:Halo_Kart_Sherbert.zip +Halo_Kart_wario.map 517CC7F8 70729200 262144 e5c03b7fe4fd0fa48be4c8610cc7f5b0b07e1f37 halonet:Halo_Kart_wario.zip +Halo_Kart_Yoshi.map 6551CF45 65769272 262144 6abe96b0b9ee8ef8e016778a3b849f6fc73e07a9 halonet:Halo_Kart_Yoshi.zip +Halo_Oil_Rig.map E8B79375 390513794 262144 4c0dbce69ba35479e8150b224c9df5795895596b halonet:Halo_Oil_Rig.zip +halo_skillz.map ABAB7A19 260642052 262144 5cfea675677f58656623e6d539f631ef9908d20f halomaps:7016 +Halo_tournament.map 1DF113A1 53004116 262144 4eb0c3bf9d99b2659580c0f2b3579dc76c29dc40 halomaps:5172 +halo_valleys.map 60D96FBE 70107736 262144 ce085f0f89c148fa726144c6804b932e2a4ee2d7 halomaps:1496 +Halo_Wars.map 434AD818 99216629 262144 e3615e5f78116aa28b35253e94aa99c774d5df28 halomaps:2839 +Halo_Wars_Beta1.map A25720D7 83734071 262144 f270d0344ac59532dd05f4d8ba451d600af74fec halomaps:4441 +Halo_Wars_Betav2.map 08F8B5D1 64915554 262144 51c0b515de322da0f1f89df9dfd5761691fc9047 halomaps:3130 +halo_wars_betav3.map A304E0AB 128569091 262144 a27b593088519f2356645cb8c6e049942147b7a6 halomaps:3963 +haloball.map E9126A18 14917108 262144 cc9cad324f70e6baf37bd146230b79bd962b294a halomaps:239 +HaloCE Map.map 7B309554 13936092 262144 125e5431d1be7011ed9a938e82121d998be23975 halomaps:1162 +haloceripper_online.map 7F2C31CA 104517975 262144 6b6445f4d09bf2ce3c8393349ac6e70185ffeaf2 halomaps:5674 +halocombat.map BE935DE4 47035548 262144 dc598d00d15f080ac61ca88f569509a3adea9af1 halomaps:2331 +halodust_beta.map C3C39AE4 24811428 262144 cd4d4388f8322a9589ff06ade29c977de8676d11 halonet:halodust_beta.zip +halomp-lightbridge.map 521EA965 28492444 262144 8036eb95ec54f37c1c3ecb3e994d23a8883ea45d halomaps:726 +halomp-reuniontour.map 43A75CEC 33064560 262144 77f5ab60f3c227386b87ec72b746fa999a7ae8c1 halomaps:723 +HaloNightHorror-ep1.map C56A4FF7 18634681 262144 08d4d470d30e87809405f6bcbf49dd7a4f97caf7 halonet:HaloNightHorror-ep1.zip +halorally.map 9D64B8C4 16646432 262144 e407a9cc083d9cacbba0130af303c82db2d43597 halomaps:1335 +haloslenderswamp.map 5C95505B 77846644 262144 f9ebe02f21a5cb4aedc5791273eb609b21583766 halomaps:6720 +halosocial.map AF0AC0F3 20240618 262144 cda12b2ee55a9b58ad8b999eac41080cd28375a6 halonet:halosocial.zip +halowar.map 19CA4629 82424064 262144 34471d0d3e9690974da737c50e964b5f74b9eb11 halomaps:5568 +halowar_v2.map 8C33CD29 83290410 262144 f3d1e9d7e53e2acbefb621561d882a1215c0c975 halomaps:5592 +HALOween.map 505AA5B5 56527536 262144 74d1e2d53de6bae24f1a3887d711f3940caca5ca halomaps:4028 +Halowood.map 5F6AA0A9 57580680 262144 e45ae066931d0eb762d5cb5736d06cf48f315366 halomaps:5784 +hang_the_ai_high.map 89BA5CC0 67475825 262144 ce2cf373c7bd34ea43ee81bd1671c47396293082 halomaps:4249 +hangem_even_higher.map E78B38B1 59840828 262144 b065dd85c35ee594b90be1f91a6918e8c59ad755 halomaps:3613 +hangem_high.map 00000000 199487058 262144 f4e30b814f884801277b1bd0f6be1f38c683937b halonet:hangem_high.zip +hangem_higher.map 19A57E2F 17988288 262144 4a95b37f208c1b06a6591f480ac28c925d6d598d halonet:hangem_higher.zip +hangemhigh.map A7C8B9C6 12727888 262144 4f59ec1c40f299ff529d36dbe4198a16643bb1fd halomaps:4781 +hangemhigh_rm.map A7C8B9C6 304473188 262144 4203935823d3a7f94202c6a71d061475574b8e78 halonet:hangemhigh_rm.zip +hangemhigh_tmcc.map 640670B3 36486360 262144 aa54dcad43fd950298238f862af538c0485957bb halonet:hangemhigh_tmcc.zip +hangemhighai.map 48CA2CD9 49884810 262144 169ea3b872519d4f4c5c2789410d0724007977f0 halomaps:1786 +hangemhighmod.map F3106082 74089836 262144 b259b242cb31629df6c10d17af14ec538fdc433f halonet:hangemhighmod.zip +hangemhighsnipers.map 72C5DF3A 14670650 262144 fafbc9f0d1febf92c11bf100fde39eb6c602b512 halomaps:6246 +Hangen EM Higher.map 318498C8 62776253 262144 934ee252d5d59ebdd02a348ff1106e8c6093788f halomaps:2158 +Hanger.map FA7C4D40 57440782 262144 717765b65005bfad6412cf7c5672c9f6910fd69a halomaps:1444 +hanger_strike_ai.map 45E2DFAD 94548566 262144 2a69992fc1c7c6b79b27dde10c1a4c56643727cc halomaps:3351 +hangout.map 201207FC 52793487 262144 19fef3e2a00cffc7189ebe5205425c6ba3f878b8 halomaps:5328 +hangover.map B2AC5A2D 34799986 262144 4af5f2bc132ad770daf68fa6f5f7a52102d9780c halomaps:3896 +Happy_Meal.map D2BAE435 186176707 262144 3706aac28e0f5b068347a451ad63e8fdfd472cea halonet:Happy_Meal.zip +harmony.map 4AE7B39E 229501798 262144 9150ef7352816df39e942aa19372367eafbb2847 halomaps:6969 +hat_castel2castel.map E554AE2D 19840208 262144 932fc0bc8924d38ec87a26e99645ff329ea3a1ea halomaps:438 +hat_mountain.map 0853CAC7 19848408 262144 d933530caebdaf0a82aaffe4a7900084937d43b5 halomaps:6970 +hat_mountain_2.map F85EC4C6 23653408 262144 1f51e023005cc34941bbf5f5b51d124ee80cf34b halomaps:7008 +hat_thinair.map 810412CB 17473544 262144 834a795f0026369d25b17b473bd73e7d161460f2 halomaps:362 +hats_off_to_eightnineteen.map A5CBD0B7 13781008 262144 ac7f9db1ba5eac0b4515a5f2c7c83b6a3ee3a120 halomaps:3318 +haunted_canyon.map D4823914 87488678 262144 32e91485501c761e74eb2a8fc774ce8708dca342 halomaps:3292 +haunted_creek.map 6077F3CE 41137026 262144 ccb3d18eddacdcd6a40f59c4866a0198dcac5cfe halomaps:4510 +havana.map 9689E2C7 25789732 262144 ad463c1620f2a02c5ab7a8575820197be936df0e halomaps:3070 +haven_unreleased.map 7FC86197 95071728 262144 94c9d2b0019cd01cce4e7b249952a901fd7a4bd6 halonet:haven_unreleased.zip +havencity.map 0F83B4B3 18386722 262144 4e67a204d5a8c23a04c2e3950bfcfad7a57529db halomaps:1079 +HavenH4.map 12727735 17689464 262144 8494cb9a6eb06aabcd0afdc17e89fcd089b4b0b4 halomaps:7119 +Hayabusa_Ruined.map 7520088C 60557767 262144 b13da4b59c4ccea767237a1f9e85d48863719b2c halomaps:4567 +hazard.map 30F7BD50 394850031 524288 4dcf53da18bbaac590a98f3e7d553438a2f89bc5 halonet:hazard.zip +hc-hanger.map B13E25B2 105762792 262144 d30481bb462e23d8e35a321c854cb9d21331678c halomaps:1455 +hcbloodgulch.map A47F8768 24515714 262144 357eb484f66ecf6cae5789f74068f25a5c0db15b halomaps:4406 +hcel_corrupted.map 7034E4BB 16657844 262144 6b4c82202903f3760754612f22ef4facefbc18e6 halomaps:4865 +hcel_gate.map 77F9A18F 22916604 262144 bafda31e32e90ddaa60c034c4cde38a7c12865f6 halomaps:4866 +hcel_orion_final.map 722234B8 18268768 262144 3639b50212f31b39d513715e458a05a9c15c9bba halomaps:4867 +hcel_tensity.map 0277B817 24973592 262144 38b446be5a8a86b4ed9bd12f158fed26a0d897b1 halomaps:4716 +hd12meetfinal2.map C4F9F6B1 62166225 262144 d019d89a5a2d66dbed6c76cedddf290b589a7567 halonet:hd12meetfinal2.zip +hd7big.map 156C1AF9 107270651 262144 02f9de5cc543d609f8a2490e4bcca8142501624f halonet:hd7big.zip +hd7boom.map 0FA846D8 110458223 262144 2fbabed97be9bc283ddb5251b913de7983f59fee halonet:hd7boom.zip +hd7deathfinal.map BD814720 35357457 262144 9aeef7282747b6431cec9c991c4679ccc1c41e58 halonet:hd7deathfinal.zip +HDK_dangercanyon.map 075DF75B 53374701 262144 27e7c1d877ebf7d2d098b9b6e9ee5c79dbb2bcde halomaps:3280 +hdm-beavercreek.map 7F990899 17175856 262144 34ddc4d58b8089538a2ccc9026bb7f7067983c54 halomaps:1434 +HDM-Beta-BloodGulch.map 4A8CA0DF 17451484 262144 fce58f670a0ef5763ba220eac5502df9d4164180 halomaps:1216 +hdm-chillout.map BB8A7A06 16799048 262144 a28e079ae46fcc56102d753fd5a2cebad88951d1 halomaps:1435 +hdm-damnation.map 51C114A9 18067912 262144 fc63af3db856cbaf90a253125d62dcf4198ae5c2 halomaps:1436 +hdm-hangemhigh.map 3821E7A3 16805692 262144 674d2c3881d187fb51ed5f91367c74a99cc5637e halomaps:1437 +hdm-sidewinder.map 6961ED25 18917856 262144 7d9c0173b756573a54f2cac00f6224d47e809242 halomaps:1438 +head_on.map 6B1726C0 19244320 262144 31da8cf974a9e56b94b478d31fc0efdefdb80cad halomaps:749 +Head_Water.map 3631C1C3 16986292 262144 baa14093528271ba217de92970e14c5764e486c0 halomaps:2159 +headcrabs-vs-parasites.map AAACC5FC 32240845 262144 4a94a120dd9e85c05c52cae38d48268ba8cd86cd halomaps:6232 +Headlong_PB2.map B56F7058 110542025 262144 e19ddc980bd6362918c87bc7476cb56ba14fd689 halomaps:3438 +headquarters.map 7BAE9ADF 19730655 262144 915cbf65ea9ca8c50b462faf0da6f52c1e38d25d halomaps:3600 +headquarters_beta_v2.map F4FE21D3 19570783 262144 aba61e0d284775fa8d85339f7426dc1d55fae182 halomaps:3614 +Heavy_ChaosCanyon.map 4853FE23 43538947 262144 a2d61299d28d571b8ed796a721d897f48c2fa614 halomaps:3583 +Heavy_ChaosGulch!.map A2BB17F8 27966285 262144 cad54d224f6fc1f16ec2a4acd6cae2ce9c4abd00 halomaps:3511 +Heavy_ChaosGulch!v2.map 2C8D01A4 40562949 262144 f90f61f392af2992e4b4727b0efa8ea5d8044aac halomaps:3533 +Heavy_ChaosIsland.map F8783813 42647001 262144 8a2d6c5359f9b027c28353ee104ddc2d9f27556c halomaps:3565 +hegemony.map 512652F1 19752402 262144 e48b64a22982a08b6d31f13b0691171eb173444f halomaps:3226 +heh2.map F7998086 20914932 262144 c322077216f2c5b98cff64700150a11034194d8e halomaps:3237 +heist.map 79ADC704 53715579 262144 3ae0fcb626cd28244c8a5a793d7d179a2c3d058f halomaps:2589 +hektik-plus.map C559DCBB 120047655 262144 0536d0a7e3620c77b154528c091d708bf13f0112 halonet:hektik-plus.zip +heliophobia.map 106B0533 25162757 262144 a535373c4c51b28672431fddad269d4ca4c4cb58 halomaps:3294 +helix_canyon.map F64FA994 20599804 262144 a9faae813890d81ad4ee86ebc09eef6793ce6640 halomaps:1854 +HelixStronghold.map 78BBD5AD 98059408 262144 fc1befd7c0a1659dd9b79e116008c82cc7178226 halomaps:3339 +hell.map FE66B547 12752845 262144 bcb8334eaf9aedb6b8e85a69ce9667ac24f70164 halomaps:2953 +hell_brawl.map 210D0962 72933862 262144 d39a981a6644d366a3a6527b8e73ab25d988d822 halomaps:4072 +hell_or_heaven.map 1DEA4C34 33496949 262144 6e80b37cf1840455b1ed217fe3a61c44d820143b halomaps:3165 +helldeath360.map 325421A3 23202439 262144 991c1d5bdd21d48b71c3b10306764d7d2c5c69a5 halomaps:7120 +hellfire.map 5C07666E 13713472 262144 d81cddd6f8848fe3cc34c791ddd04808dd88d05d halomaps:2609 +Hellgulch.map 1541D565 48800042 262144 8c34d9fd5c9c3a9d44401a8b6d310279106f280a halomaps:3256 +hells_c20.map 8D709A44 55497684 262144 f5d64a000984298240823dc922408451041b9a4e halomaps:4656 +hellshole.map A9AD2518 189570417 262144 5ded95e5b97a636c346f7cceb5a7722ecd4d2c39 halomaps:5841 +Hemmorage a v1.map 75F5CCB2 356488324 262144 5b0021d31cf01ea62e5a23e70da895489aba08b4 halonet:Hemmorage a v1.zip +hemoasis.map F5F94246 42873124 262144 8c0703224038f65493e77148759374f9227a7af7 halonet:hemoasis.zip +Hemorrage_II.map 0B8E2F01 127027027 262144 acc81b96522231e913f14533d3cc0dc66b0f1add halomaps:6034 +Hemorrhage.map C7BE3779 248199168 262144 eb3f556ace9b030391f7e6b5829f386d295e90b7 halonet:Hemorrhage.zip +hemorrhage_v2.map FFA43827 244681657 262144 9f0721c945c20167a957002395b674274fc792aa halonet:hemorrhage_v2.zip +Hemostasis.map 06B1B6E3 394998500 524288 6b325e980793ba389e65b2f8ab5d73c92e6e563d halonet:Hemostasis.zip +henry.map 334778B2 18088312 262144 a23c09a0e80ecfe2bbc2cd6cd6f27166cb74a3b7 halomaps:3876 +Heretic.map E78BFDA5 133380767 262144 ee7de8db6f71fad97a01bc0efa50a287b0862115 halomaps:6927 +Hex_Zone-v2,5.map 8FEEF052 166633304 262144 fc287b671991abfa74b4b920a9aab16c5d6dd288 halonet:Hex_Zone-v2,5.zip +Hex_Zone.map 19507C13 169203352 262144 3d8b117c21602c28ab78ca2cb63c8e81f5e099d2 halonet:Hex_Zone.zip +HF_sector1.map 59621359 15256064 262144 9f2ae7295ea8c94ac7f4346ad94ffca0028da77d halomaps:2920 +hfboxroom.map 4B083445 22402977 262144 8ea1996ef2097329d1487aafcb8065bde7bf4259 halomaps:2886 +hfboxroom2.map D6318B57 14427936 262144 3a6667e75a021946308e195613b7026180edb305 halomaps:2887 +hfboxroom3.map 2C9CAB5D 57421472 262144 4fd9ea524ebb2c10d2a03d1e72df0fd20d4001fa halomaps:2990 +HFLhalofootball.map 3B0AEB40 18870728 262144 5d4cf41c54f250350dbc83bf365dc42ce98d4b94 halomaps:412 +HGK_snowhold.map E7C622D9 50079415 262144 e1432d1125756d5707fe4e5ad133cd0521a1477f halomaps:3383 +HGK_tennsion.map 75037B74 54729637 262144 47cf3e7bb9105298e784e6ba3f476da7dcdf0eea halomaps:3499 +hidden_canyonv1.0.map A5EC7EA3 59694983 262144 d754f857672227fcda1b46a78a32d01261b01b80 halomaps:2779 +hidden_cove_beta.map 158F5AA1 14842010 262144 9e372b3914a2cb193de5487e567777d8af9ab474 halomaps:873 +hidden_grotto.map 146FC6B4 16188212 262144 1a396e6d60e60e3d9709eb595f8be6a8fad503c2 halomaps:2686 +hidden_traps.map 396209A8 14416872 262144 eebba6f727c10490ccd2fd8b3d319e87485fc352 halomaps:3548 +Hideaway-Cove.map 88A1C475 63822958 262144 9e4181d7eb2fbd5c55bd423b75dcc28cd7fa097d halomaps:4555 +Hideaway.map 3E71420A 45040002 262144 647c5407273289600740f8904843ead44c106ca4 halomaps:3412 +HidroPhobia.map 361DCFDA 18371324 262144 e3a4d725ace5bbc973c3716dcb6efde00d868f22 halonet:HidroPhobia.zip +Hielo_Mexicano.map 86C8ADF4 211488670 262144 d1379410b23b99d86b3e18ba5b322f3f0d815b6a halonet:Hielo_Mexicano.zip +high_skirm.map 5A6B5633 44386084 262144 2a53f6c3083ad385b0cce83a558b3cf398799718 halonet:high_skirm.zip +HighEndDevolved.map D1A19568 23322840 262144 174c9b50bd6319e0003212175be2ec249d0c2e6e halomaps:240 +highhill.map 5629CCA0 14216020 262144 d38083b61913297a007e9d06b9d936f88e43e541 halomaps:3916 +highhills.map 00206490 14004392 262144 17a205518e2c0877b8b53e0441df509d6f91944f halomaps:546 +highlands.map 1742E131 22854048 262144 f29937e8f6896d89f4d525ccabebb4d831800e5d halomaps:3964 +highlow.map 09E7EFA4 15839992 262144 bfd9afd650d137595165ba2a3b213bd56d1b87a7 halomaps:323 +highlow_race.map 7C65A6A2 16274004 262144 c6b891939d4cae8f592b4970cb604994425d8e8e halomaps:2794 +highway_beta.map CE25EFC9 13077496 262144 246b52a701d0f86e474f98da72ea99edb5e94410 halomaps:1809 +highway_shooting.map 58F58803 11944796 262144 556b0aa4f2f3a19691ddb7a35fe7ba26f4257b0f halomaps:519 +hill_battle.map B2A636EA 12902980 262144 8252d826262d9f63a94586e2a19080c34e57ac68 halomaps:4250 +hill_battle_v2.map 822E0F55 18731781 262144 e4eaecfc4d3f306c5bc76cd7e28cb245da435e14 halomaps:4262 +hillbillies.map 0098E161 13798340 262144 21f23d14586eda08a7da0056c6b5a8db0553916f halomaps:4142 +Hillbilly Mudbog.map 6FFC6E70 44150313 262144 18c7e609a50e1fb4975b75db539a2f5049a6a23c halomaps:4621 +hillmap.map 7DEEF4A8 12712652 262144 f2be5dad6b5611678aac184299e37e8a7afe2968 halomaps:5062 +hills.map 56599B6A 14003800 262144 6931f7852b290cc82f5fbc24d13dbbb43882ff79 halomaps:966 +hills_of_death.map 4D2713B4 14587684 262144 3dee9015a720e2560b10ed21fdce1eecb1a1ea36 halomaps:2610 +hillside.map 621CAE1D 12628076 262144 143dade9dcebb0fe8856060b63aa692a50c9500e halomaps:326 +hillz.map 48D5AC57 12455646 262144 06b13a10fc68fbdbcec06d7a44ef9e6df07337f5 halomaps:1771 +hjaw_blood_gulch.map 45F8F54F 33886817 262144 7278497d20e09fdfbf8cbe8d935d7c5efbd4ebc4 halomaps:3917 +hk-banshee-pb1.map 2F3C5DBA 79101376 262144 03f7d897fb08f5d65b3a6a30e9017942680e0d8a halonet:hk-banshee-pb1.zip +hk-banshee.map C46FE8A4 79101372 262144 234a178922a12d22828c9af793e4cd5d22649769 halonet:hk-banshee.zip +hk-bowser-pb1.map 3F65F37A 61070924 262144 189565bd71db12b6589b02d42fdf17a2d00b5103 halonet:hk-bowser-pb1.zip +hk-bowser.map 801F34B4 61070920 262144 c191cae773015ee6bd5b01b8f719e22483a31a87 halonet:hk-bowser.zip +hk-donut-pb1.map 2AD4D76E 52953924 262144 e01b312d139011e57f184769c3500a2afd4080d7 halonet:hk-donut-pb1.zip +hk-donut.map CB4EC531 52953920 262144 f7c6897ff617f703717b94de6679580b0ec13006 halonet:hk-donut.zip +hk-fort-pb1.map 0DE9C05B 53336796 262144 53d304647890639148e6a43c95854899ea21a4ac halonet:hk-fort-pb1.zip +hk-fort.map 8873FBBE 53374152 262144 cd46d35fff9a4d7897610408bac04ea0a72dd1ab halonet:hk-fort.zip +hk-koopa-pb1.map DED7B706 60315592 262144 39069c331a76b8088300d94e2a6e43411ed262e9 halonet:hk-koopa-pb1.zip +hk-koopa.map B6E3E958 60315588 262144 2b882f72814ef3d6fa9b8ee0da53bdad228ff090 halonet:hk-koopa.zip +hk-moo-pb1.map BC678B48 63402616 262144 150567a05bb572f02faf8ec011d5c51857f74a23 halonet:hk-moo-pb1.zip +hk-moo.map A8349784 63402612 262144 0bedb91abdc73c3d092522faafa5422812fe67f4 halonet:hk-moo.zip +hk-peach-pb1.map 758EE7FD 70945420 262144 dc17852331edb1a8377c67bdf716cfec35740e60 halonet:hk-peach-pb1.zip +hk-peach.map 828DFDD7 76744388 262144 d6e0026bbd5709b51a622b22d167641d9cda4016 halonet:hk-peach.zip +hk-sherbert-pb1.map E13AEBF0 57372616 262144 7070ed40fbe5ed5677807fed276ea87efbeeeaee halonet:hk-sherbert-pb1.zip +hk-sherbert.map 119E825A 57372612 262144 78d6849f4e828cd3b5be867a1679e693f8293873 halonet:hk-sherbert.zip +hk-wario-pb1.map 956F8ECC 67008664 262144 54f80dfbe61297af25beccb4016a5a549b325e4d halonet:hk-wario-pb1.zip +hk-wario.map 9D49870B 67008660 262144 b863a221e2d3d8eb269335a86e7b4b01384fd672 halonet:hk-wario.zip +hk-yoshi-pb1.map 402369A1 61079824 262144 8db636be8d06bb38f85f7af80eb1e217736acc81 halonet:hk-yoshi-pb1.zip +hk-yoshi.map 1852EA73 61079820 262144 04cb76aec378231ff78a05e52eec7be856294ff5 halonet:hk-yoshi.zip +HL1.1.map E03793D8 69948126 262144 7178d9d494e4ae2dfae3b4773f51db86dbdb583d halomaps:3704 +HL3.map 5F938211 13431704 262144 0c43c8b80361eb896adf1858d08450474432a01b halomaps:3705 +hmc-chasm.map 8F5BADE2 99370171 262144 753cbcbe92f8e504eda5782dbdd7208c78e415f3 halomaps:3166 +hmc-chasm_ai.map 2467DCF6 60251599 262144 8df3d6ddbb1742e06415261f7135fb55ac249269 halomaps:3198 +HMF_ablation.map 49A1CB89 74301352 262144 40633b4124453540f737c51845effb7700d94760 halomaps:3340 +HMF_amazonia.map AEBB0D4B 17191408 262144 546d86b349baed5784c1033b2d67c02e83e489e8 halomaps:3257 +hmf_iceland.map 68204256 53775870 262144 09e462e7c848283298889f081944813f7629a4ce halomaps:3146 +hmf_marecage.map 028F5EF4 29629137 262144 5db5c3c50f28acdba40d1823ebdddb7f181a4f1b halomaps:3129 +hmm-dichotomy-pb1.map B33663F3 63601857 262144 ad35a8b6838b3a737f1093f7d31fa692ef9bd2d6 halomaps:5074 +hmmt_crashsite-3250.map 7B33153E 41648890 262144 5d56a4d82fb298f338c9eb13b4609a486b53a8a1 halomaps:4556 +HNH-ep1.map 7F141C17 18556572 262144 6a63b42894d82345a28e9975f5b86b6c0f167dde halonet:HNH-ep1.zip +hog-track.map F33D48A3 66817533 262144 269d85534082bfab953ecd01e04df658b27c5efb halonet:hog-track.zip +hog_derby_duels.map 36B8F30C 25090516 262144 f8c3378e8ee4230fd3a0b1245769e085d2887ee6 halonet:hog_derby_duels.zip +hog_derby_military.map 6EA1B4CA 26728341 262144 f3364e0b8f48da1aae0b632583cc5b36f01d1074 halonet:hog_derby_military.zip +hog_derby_side.map 7C5F3ACD 21825393 262144 bcc446dddfe55a705786d6c6e4d0c9f48d9cec13 halonet:hog_derby_side.zip +hog_derby_timberalt.map 6B8B949C 19624893 262144 7afe708a806d6e6e4c4afb9a23d81141226bba82 halonet:hog_derby_timberalt.zip +hog_stunt_track.map 7D4495A6 12608780 262144 406599005079bb3f0a4d316838d99a0b35b788eb halomaps:2088 +hog_track.map 6AF4C827 13476620 262144 be6eaeafaf29b16097d19d959898826129dec837 halomaps:2298 +hog_wars.map A5CDEB5F 15540616 262144 f5415308a5ac8a44700b4aba0d87a6e7c242a5b8 halomaps:6096 +Hog_Wars_V1.map 1E1E5193 27377652 262144 366f2457d3c5b7c12a9f3adbac1a356f0cabb555 halomaps:3762 +hogarena.map 1CFAD392 14724068 262144 0c2775907d27a5aa9bc6dc954835c9e5c828f049 halomaps:2304 +hogbrawl.map AAE0D814 12651284 262144 26cc589686ec106e7904031a68e0fc282505325f halomaps:541 +Hogjuitsu.map EB27613C 17865496 262144 c186a8b408ee19aa481c4b0f7da248d753db8c71 halomaps:1928 +hograce.map A292DFEF 41489524 262144 f746bed8f8c67c8a6c93ef624d5551f665e73b29 halomaps:2780 +hograce_2.map 41E07124 60334529 262144 342b01c128815b67b22f99ab1e32e328a12c3691 halomaps:2904 +hograce_race.map 9B6254CA 56343722 262144 5524837b93ea41a7037c6feeef02b310cd915dfc halomaps:4132 +HograceV3beta.map F9CF03DF 46196699 262144 f3c5826d41a32a9d332e0a89099a9dbd8658168f halomaps:2921 +hogracing_day.map E4FFD9EF 45003948 262144 110bc81a0fafc442b7a8f5f446d2b0baf7dc8fda halomaps:2922 +hogracing_night.map 7AD71261 44008208 262144 5c6ac25493f6e9f9cd08717e228b4405fdd21b2e halomaps:2923 +Hogulch.map 43959C83 41670544 262144 cc6248ffd02e8dbe57b344f49d245050d5fa4d34 halomaps:3413 +hogwars.map D4FABBF8 17867120 262144 2310c899ff1459a082c5a02221232d457053a3dc halomaps:4803 +hogwinder.map 07FFCFA0 34015706 262144 3efa5266046d6f630faf206c20f6197b5b9773b3 halomaps:3279 +hogworld_prerelease.map 7E08893F 13349252 262144 3b7f2f9c3c79302e1870b85447205b93ad4ea2ae halomaps:241 +holdtheline.map BF1220FD 15773392 262144 2a2c667c10d9f28ff162c3f763f59f0bb7f8baf5 halomaps:1107 +holiday_day-v1.map 7D1412C8 121337381 262144 208abbbcf663332d436048dbec3242f6bd335cae halomaps:3877 +holiday_day-v2.map 2159B59A 77476842 262144 7fc19e717f2208a1a9c0f94ce5cea34e1b7587c6 halomaps:4217 +holiday_day-v3.map 3D200D36 124206450 262144 43111e56570e8ac2bae02e4cc8f7be9c61cafa52 halomaps:5075 +hollow_ground_final.map 724A2D6D 24102125 262144 bf7269c1910fb2c5f2e7dfb50a689f2328720814 halomaps:2924 +hollowhillbeta.map B93D0D4D 58293845 262144 3fa3ea5c135995e80c4a0f1518f30b221a389e01 halomaps:1418 +hollowhilljetroom.map 1E52A030 22515137 262144 044fc4a7a42757ffa253a080b5805e13f3039c0f halomaps:1419 +Homers_Melee_Dojo.map D9D7812D 57379621 262144 ccd59c47e2143ddb7800a7a9f50c9b1ceba9b2f4 halomaps:5609 +homestead.map 3A7562C8 110711612 262144 966182f324f880f422edfea239be460086e7e565 halomaps:6676 +homobox.map A7CF0468 13691472 262144 f169b4a07a4a4a4163c9d721074eb992913e9c7a halomaps:2141 +honor_revenge_v2.map 0718BA4D 54843451 262144 a630ae5a7dc95a718893eff5efca10fa6d3b1ed4 halomaps:4362 +hope and dreams.map 6D39F36F 62218124 262144 66640fa93ac6af3c9548b296ed3cea3eab2fc09c halomaps:4055 +hopeless_war_beta_v0.6.map 6AC92DFB 43495091 262144 f3cd75e39bcab235a27178c08a1c0e568b33a749 halomaps:2391 +Horizon.map 816F5A8D 27261605 262144 3ad3cda78fb818fc955fce1efa8562b3b7b2d291 halomaps:1177 +Hornets_Nest.map 4C78ECCF 56863867 262144 e8659e0fee27c31cdc34e04cae2473525d7dd791 halomaps:5371 +hornets_nest_v0.1.1.map DC9F0077 123224321 262144 a7bec9103d1090f8afd9516ba5b0ca86a28a9f39 halonet:hornets_nest_v0.1.1.zip +hornets_nest_v0.1.map 9F6C0086 123299714 262144 a08ccc1b681e5313d5d63e2d5d160b369e1b2e36 halonet:hornets_nest_v0.1.zip +horror.map 36B656A8 94703128 262144 c7c8437382e7122ae059367100b1be8b18f57094 halomaps:3128 +horror_canyon.map B614A715 70044511 262144 5572de887ca063b43b4c83f2bbe50d990876541e halomaps:3170 +hot_gulch.map F08C568D 44138372 262144 d73c49e637200a44881b84b60bf08bf146f1219c halonet:hot_gulch.zip +hot_gulch_final_beta_nov_2017.map B1DD891D 36168024 262144 8d99a396f1f73d825186e17fd71dcff82c441553 halonet:hot_gulch_final_beta_nov_2017.zip +hotbox_g_host_noscript.map 2C669DBB 18406928 262144 8a673a4d5445b3adfc017e5d93fcc6af20c1e066 halonet:hotbox_g_host_noscript.zip +hotsand.map B9CFDA7F 32047904 262144 23d91107f11c05da4db79fe11ad401a2cd7489b4 halomaps:4197 +Hotzone.map 46DA91F8 79621997 262144 9afd01cc7336ef482ca80b7abcfae724cc9fa972 halomaps:1810 +hourglass.map 7A619315 16781552 262144 d5dde4a71e2bc93637a095b6014aa10d8a9df732 halomaps:242 +house.map 2E1CA53F 14147796 262144 2d92f9696d6ef9629b9db7e5a75cebc949850056 halomaps:2089 +house2.map D4258D7D 60346159 262144 5abc5144c3e7e1b54f3fe86809ae6fbbd12adccd halomaps:2670 +house2_beta.map F8A7145C 28513004 262144 61eb5df914886a471cd6efdd1223b63c9a06de03 halomaps:2368 +house2v2.map 77B37677 67708065 262144 59927b96f585473b8c680ae680df939acde3e0ba halomaps:4176 +house2v3.map F1FBD3F2 134135374 262144 8e31112da7cee1cc096f902a38f6f4649cfb7dbe halomaps:7095 +House_of_Pain.map 8410BA37 283818877 262144 c21d892198a518dae32eef9f4ab2a505bcbe8472 halonet:House_of_Pain.zip +house_of_the_dead.map 312AA3D9 127469230 262144 ddcc0e79fa3cc128ecd1f7649510b40b7208a836 halomaps:6347 +house_of_wax_no-AI.map 7E395777 33139275 262144 6fc2de14368b52f8d25cc80c24433125da55cb49 halomaps:4029 +hq_racetrack.map E2063B56 26090108 262144 c4398d6b74c8242fbd6960e3006d52977278a63e halomaps:426 +HR Battle.map AACAE0DD 191268559 262144 4cadff1e5c928d41ac54487c9ea7741526753128 halomaps:6928 +HR-icefields.map 86C0EA91 50857087 262144 f82d9ed156b0687bb86886b17d786cf523226b09 halomaps:4198 +HR_Ascension_Firefight.map 949D38F4 377363895 262144 af2879cb74e8088b0d8a7a1dd8b3a202c2bda3ab halonet:HR_Ascension_Firefight.zip +HR_graveyard.map B5D9630F 322703131 262144 1db72b21e560c8cfa95910fa075b3e8b1d3f8316 halonet:HR_graveyard.zip +HR_VENTISCA_ETERNA.map E38D6F09 311820093 262144 75e6b84fb498cddc1e5efaf08364cadb45fcaf99 halonet:HR_VENTISCA_ETERNA.zip +hscanyonbeta.map 39D8C545 13764308 262144 7fbf04dc96e04edea346c4d20dd8bb09c6d580c0 halomaps:3319 +Ht_Brabeuk.map CD21BB66 98828446 262144 cf98dbca2c96a5efc1d64bee583bc95a4656db20 halomaps:4673 +Ht_Creek.map E71E8318 24458053 262144 316343d9e54401ed8fd2e679a315355f0abac08d halomaps:4363 +ht_detention.map B150046D 69609198 262144 412253460f7c555172fed6049261b977d8fd9656 halomaps:4456 +Ht_Ground.map 822FD748 49541834 262144 449a53902a8591fa2b4e87580a722bb8434e9b19 halomaps:4117 +Ht_Liberation.map B7C045D0 50272127 262144 43cb287f3889d1720fec96ee9da3b9db8b269ce5 halomaps:4511 +ht_playground.map 548187AA 48402874 262144 d08bde504153a490ba088dd06dc426762a60c0c4 halomaps:3851 +Ht_Sniper's.map 4F9DAC5E 26245474 262144 151bcc197d0b672e0ee30becd7eb90821470e766 halomaps:3763 +htc_death_match_beta.map 587A6DCF 16986244 262144 1fa9e5544b4cf065721828a0e04d5fcbd4ac2488 halomaps:3584 +HUDGulch.map EA811DDC 19512240 262144 2062cde5d523fe1cbf0d68e77d102c6567fb8e09 halomaps:1266 +HUDwinder.map F54188E9 22232021 262144 12be7bc07505c438a9e2e12e8de30cbb3614f3d4 halomaps:2478 +hugeass.map 784CA990 59221172 262144 a48df0cce03fe8128bed176efd046b0150a3b55a halomaps:1196 +hugeass_dogfight.map F3A9F36B 101255456 262144 f7c671e26d5d7b54586065740cb9504dc5e4792f halomaps:5023 +hugeass_fixed.map 1240F7C4 55806044 262144 5aa8d510fd9cc05f09adc266f66d7a3c44bfa6fc halomaps:3179 +hugeass_meV2.map E250E7A6 119172490 262144 6a4aa6d9be777ac478946e86a9484d2967efd0f2 halomaps:3534 +hugeass_rpg_beta2.1.map 4FD8D374 105508666 262144 2b7b43da680f2259c0810fd8a3a806e579c78704 halomaps:4030 +hugeass_rpg_beta2.2.map 813584FF 121051073 262144 aa1a3cb640bb46307064ab3b49b2176628d131e6 halomaps:4083 +hugemod.map 784CA990 59221172 262144 32eb01fb94b4a0bdbd2dc29b0b2d33bd614f1a7e halomaps:2090 +hugepass.map 0C2F1478 16867544 262144 c7e011fd96543dd8558a3509647ef0b6a32de40c halonet:hugepass.zip +hugesnap.map 7560EAED 69106434 262144 d57b5e3d7b738750c034608f6c02e5f27fea0296 halomaps:2501 +hugesnap_finalbeta.map 9DCE0B97 67888250 262144 1552f30a51dcca9e9449959e890d2dedbb58e9b9 halomaps:2436 +hugesnap_frigginbeta.map 1BE00B70 73852833 262144 30e0aa394509d9e8af31e04810903f90f3881fa6 halomaps:2375 +Huh-What.map 9B9E5A94 18833768 262144 36467657fdd97ca073b2ca9cfcc6a3ceb9834c58 halomaps:4468 +huh-what_2.map 1C17EDA0 22997675 262144 e2348c0f0edb6b63fba88de9f9ecf28f636b042b halomaps:5675 +huh-what_3.map D57A91A5 22235110 262144 a953e39069e45718b63986076c73e7cdb8326781 halomaps:6394 +Human_Landscape.map 12B150DB 22381226 262144 36448a6163c3df7dec747bcc745d19310c8e8567 halomaps:2590 +humanarkbase4.map 0ED9F425 62827511 262144 66c46dec71b521624bc3d0ee38783d358f655a89 halomaps:2270 +Hung-Higher.map 3C4FF972 15996960 262144 2cfd1e4c56f9c4786d672bb97c95a45d87bf9084 halomaps:4469 +hunter_territory.map 5EAED4E1 99474068 262144 9f46e467571220ed38ec1de5ff37fe4357aa0d80 halomaps:2284 +hunter_tournament.map 6CCE5D22 21475511 262144 e68f46de1e01659259a033c69b7442413e215814 halomaps:3671 +Hunter_wars-2.0.map EA924BBC 19070001 262144 05763dcbcf8014641fc0a9b957fee27092c296b4 halomaps:5486 +Hunter_Wars.map 83B71AA5 17980513 262144 2da09fdf350058edbe01f6d0691afb63ba696051 halomaps:3049 +hunter_wars_beta.map 672AC195 29026527 262144 63bcf9a6222083637fc1f135a33501d2eee870f1 halomaps:6395 +Hurricane Gulch 2.map 87E9E09C 98439810 262144 cbcaa9cac68c625ffec5abea78aea391a3911bbd halomaps:3238 +Hurricane Gulch.map 86425A39 34309983 262144 6be639877c14fa0426306c6c87c3280654aa5974 halomaps:3183 +Hydration.map 0305E96E 40219001 262144 b862964e124845e2bb34837d29fb6449c272b82a halomaps:1474 +hydro.map E751DD23 188464900 262144 aed9e207f432c4d83ca2a8311419ab6a0d62955d halonet:hydro.zip +hydro_generators.map 86BFC8AE 27516552 262144 4d107e8b58e322bc9c55c9e38b495a9536dd6df9 halomaps:3939 +Hydrolysis.map BE7B86CD 45677681 262144 0a4b9c7b7c7e188bd30946e23474690ef70cb9b6 halomaps:2611 +hydroxide.map 07017313 18894940 262144 abc61e3ead175a6ac1139259de094afa8f2dd56d halomaps:3239 +hypo_v0.3.map 6B7A1DA8 49632640 262144 6f740d9cd83dea82d17b901e9f949a4a2d243f76 halomaps:2476 +hypo_v0.4.map CB3FB4C5 50420976 262144 d78b82bc1c2f7fa1b5dccbaead14dfa13b8d02c3 halomaps:2750 +hypogluch.map 22321D64 50787544 262144 ca72ac1b687fcd3a15cf4257283682131ebd574f halomaps:2811 +Hypothermia_Race.map D3E67CC0 49507256 262144 c65efaefb5819e68b5cc1fb3ff02b4a3a1dc0d82 halomaps:2437 +hypothermia_v0.1.map 1AB8C84E 46330184 262144 cc293fe5f0523b4ee34e579df5cdd08d4bf2e921 halomaps:1672 +hypothermia_v0.2.map 11200CBA 47630940 262144 10ca800a01c0489825ba9594806a577c58caef9a halomaps:1676 +hyrule.map 1F2B75E1 18667748 262144 a0765aa406e69ddae2cb43e6f05c085b61276d5e halomaps:4031 +hyrule_castle_HV.map FF6DF441 28082916 262144 5807ac4b7e0e8aa5755169ddb9659ccee0591f81 halomaps:2128 +hyrulefeild_winter.map A1D725F8 25311694 262144 909d741198f035ce1ffdd3ddba4f0b5ba22f4da0 halomaps:4056 +hyrulefield.map 0DF84807 19465304 262144 2a74b69c2bc39106b7c45bf95b151e9020dac9fd halomaps:1141 +hyrulemod.map 9D29DF70 37565306 262144 be6e5daef14e107c5a2483bef35564fb2d6c4b33 halomaps:2853 +hyruleoutpost.map CF3FC05F 17572109 262144 080cd412288d76135a0070628b6bfde93d8bfcb4 halomaps:2954 +hysteria.map 7F4915BE 17150544 262144 14d8970d94d6a351beddd3a5181f13a9f794571d halomaps:4804 +iamlegend.map E19D3A11 106587963 262144 4eddd3ea6524afdbc5a45fa4ae7589a156a8ffab halomaps:5487 +iamlegend_no_ai.map 478FD0CD 44229608 262144 7789eceeb860887b97414ea7bfc243b8968848d4 halonet:iamlegend_no_ai.zip +Ice-Frost.map D9FDEFF1 22185307 262144 1e1d6f36acb553370d5e7151bf41cf58d9fdbc82 halomaps:2271 +ice_chaos.map 5EC1DEB7 15854180 262144 97a0245c05f1e506a69b3f47e101318e587a7794 halomaps:1120 +Ice_Combat.map 5D0BEFB4 33585638 262144 8c8b2ecc3e186c50981cf032499a731d3445cfe0 halomaps:2854 +icebloods.map D879A75B 40487820 262144 c38ff77a5511b825f8905b3e5bf377cf0f3e67e1 halomaps:6477 +icecold.map CEBBDEA2 54225488 262144 c46958584575de928c90b256f7408e8f66b2618a halomaps:5593 +icecreek.map 4D9F18AF 22399000 262144 90375592f23b1ef4730176ac5740d72a173cdbcf halomaps:6312 +icefields-firefight.map 5E5C6C05 304444447 262144 17dd5e67aaacfb435489e11ec7a855071bb4e974 halomaps:6901 +icefields.map 5EC1DEB7 15854180 262144 68bf8983bcb91c7b15c0a5cf4b90845b44d41865 halomaps:4782 +Icefields_Infected.map 586F7570 95889285 262144 be1e36d91623b9bdc890c40ab1132dbbcdb9904f halomaps:3171 +icefields_mod_mania.map B2E166EB 17572103 262144 88122c3ff9dcf10115ef89f66564bba66504d702 halomaps:5732 +icefields_rm.map 5EC1DEB7 336077636 262144 847d23bacbe09dd5d827134bf7a452cc315da067 halonet:icefields_rm.zip +Icefields_Rocket_War_AI.map A616DBFC 229232999 262144 286f38a86bd5cff70a23ce8d43990fa513ecb937 halonet:Icefields_Rocket_War_AI.zip +icefields_tmcc.map FEE5F24A 43105216 262144 ba11c1f63f3f1c3c3103d7ca469d1c9dc234c6e2 halonet:icefields_tmcc.zip +Icefields_War_AI.map 9DCC55AA 341700269 262144 24331aa90b5a54b83953472bf567f242314b4daa halonet:Icefields_War_AI.zip +icefieldsmod.map 954D8AE1 76692967 262144 70ccc3bc3998cfc1de8d3c32bda2f60da689bc3f halonet:icefieldsmod.zip +icefloe.map 00000000 52953788 262144 f154f1292c3e6f70b93112ae665b706683898fe9 halonet:icefloe.zip +icegoromap.map 07DA942E 63830537 262144 f3ae060c04a68952a96e5d643f8083d171deed22 halomaps:3897 +iceland.map 12AAF9EE 17435344 262144 dc8337285cbcc4f96b610dd0eb40197074826cab halomaps:502 +iceland_betav0.6.map AE551F78 106777057 262144 999f13ad7ef706bf1fd6dd2be679086f4f4d8973 halonet:iceland_betav0.6.zip +Icelandic-Tundra.map 00000000 215245399 262144 c7ae930bba12866a11c27596526c715b67041c26 halonet:Icelandic-Tundra.zip +icemod.map 7C13F4F3 35198288 262144 799d2c79b7fa781ba07b6219c720994b6cc97114 halomaps:2591 +icetigaurus_beta.map D826F3DC 14980876 262144 01987ac0638dc333d0772de594ab035300e20305 halomaps:299 +IceTrack.map 10580819 22153628 262144 1ad21a0b9dedc45374cbef1f29485886c3c0446e halomaps:390 +icewall.map 0FCB5751 17072576 262144 1068110c69c4e78d81c64f337e9c4e283ee55a7a halomaps:3147 +icewar.map 5EC351BC 57273559 262144 3de850a40a6030d6b0da1ca2467e9c660c039855 halomaps:6878 +icewing.map D783CB6C 57411596 262144 6fa667e26c1ed7be487f2d01975c075cc2cc2093 halomaps:1827 +iceworld.map 28AFC432 13163596 262144 33e3b977684393e1a67db67c94d34998c18a3162 halomaps:243 +iceworld2k.map 8A58227C 13110024 262144 07a6c027c5a54397b8c3a58454109e1c96d81b03 halomaps:340 +icext.map 2B278BBE 13519672 262144 8a1a68e9cc2dc617c01d45de3a6c5a65c16907d5 halomaps:2796 +icon-beta1.0.map AFF7B53A 110230772 262144 b2b5230b604b58d63b75079bd97597d6a218e3f3 halonet:icon-beta1.0.zip +Icy-Coagulation.map 552C02B9 66842012 262144 c3597ec2a11ede1c249f1aa57b5bee8874f39c7e halomaps:3442 +ICY-COVID-19.map BCA8253E 124964142 262144 74752b91b706b9032ed9a5f23322043d2e3f4bcf halonet:ICY-COVID-19.zip +Icy_flood_attack.map 6A335798 56844883 262144 54dd832d86a9ba2e0136dfbe1da24183da2a0c85 halomaps:4118 +icydeath1.4.2.map DBBDF2BC 28425900 262144 7c0c54675833672363ee0ae703ec00d27374e795 halomaps:2840 +idiotic.map 9B712B67 17587360 262144 dc38eb8b3f1bce6e7aea24d52ce887b77c96853e halomaps:3127 +ig-poc_path.map ECF295E6 19765596 262144 ddec64142fb0ed774216c3c9ed51a48e5a1f8f32 halomaps:3878 +IG-WYS_Beta.map BBB3635A 32672632 262144 e9c4298c6ac6ab6d15588f6fc7e5295e8b90f790 halomaps:3512 +ihopethisworks.map 060F5564 12241324 262144 5cdf318dc1c8dfa3a3c46b02ccadc59b62ea50f5 halomaps:1772 +Illumination.map 315BF992 296457685 262144 9a17d2df58a4fad9cdfced1be3f59b0ebe62633a halonet:Illumination.zip +imane_island.map D213BB3F 72061980 262144 2430a51a1014097ed2ded81d9b655aa4f26a5c09 halomaps:4073 +imminent_h1.5_beta.map FE6DEAE8 14620272 262144 cd793e09ff9128574112c476d927a70eaf16b9e0 halonet:imminent_h1.5_beta.zip +immure.map 2E876489 17718732 262144 cf72c1247f7d1c602dcd9cd674837a32dd9f800e halomaps:1278 +immure2.map 7C054D0E 24349675 262144 4c34522e8235691d948412ce5389d962061b268b halomaps:2248 +immure3beta.map BC12833B 34925918 262144 3ac358463260251e423a48cef5ffa999fc04a674 halomaps:6112 +immured.map 87E232A8 50255598 262144 6a3576231b3b7ed2e294b94b8f101b358d6e6008 halonet:immured.zip +impactground.map 5AA5A000 101731824 262144 6f9beb4def2b04394cd07414e56fa5e112684139 halomaps:6046 +imposing.map 0C51BBA5 125501413 262144 c78398c1fa944e607294804a672121a99e3b2929 halomaps:6301 +inbacion.map 2A14AF16 55550679 262144 bcccdbaee9aab5d0fc6e8ad1b2c8d562fc276253 halomaps:6321 +incognation.map D48B1A8B 13775656 262144 8318192bcefd1d0459e43a12429c894605f6c335 halomaps:1336 +incoming.map 5BAD537A 45316840 262144 c0bc919b9cef0f46732856ea1970b1bac9b81170 halomaps:6534 +incursion_1.map F8FDC1A8 85299332 262144 1332b2bcc4ebd9261053b79eadd9b77a7baa3db3 halomaps:6197 +inescapable.map B0B486A0 15872716 262144 8b17c328eb1fec0ceb5399b1bfa666a581f2f808 halomaps:3278 +infactation.map DB1E7D15 50651354 262144 89a11add2b0d672628dc15738fc3db36cd742564 halomaps:4143 +infección.map 8DDC4F41 119811640 262144 94ed266069648dda8797c1f80ed161726cdbdc0e halomaps:6835 +INFECTED.map 064F72F8 52635979 262144 acb592a6d64493435e86ae5e36418b76d0da665c halomaps:3566 +infection.map F096EC81 52045310 262144 738214da9d926264ba44f106c4c89909f874342e halomaps:3277 +infection_quaritine.map B1A35935 131897606 262144 0ba0026b97eccb0603a3196df772e6a185130e2a halomaps:3414 +infection_reborn.map 8EEBF66B 101285335 262144 2447f7f035759721723022191459dc1e6cd4d987 halomaps:3940 +inferno.map 3EBCB337 13863176 262144 9da095fb25238c8823e420418b302abdc459d4b9 halomaps:244 +infernus.map 8FF8ECAC 21069305 262144 45707c98120adcac9999c8f21f7812e8d87beaba halomaps:5963 +infestation.map BE421731 215945730 262144 2193d3771d0da49a075682136d0985a5a08cb788 halomaps:2722 +infested.map 8E77583F 59060316 262144 44d309c99de3b67f3fe66cd150fe82673ddb0e48 halomaps:5329 +infested_canyon.map 84D0973C 78683715 262144 8d9f249ab94684c206d4de3eda5aa8c6faad3c24 halomaps:2181 +infiltrate.map 86FE3649 396067661 524288 63b731338ccedd565473c9f1cb44ef803f629172 halomaps:6978 +Infinite.map 7752D7F8 31626662 262144 d6f78a68c19657fdf73dcb31ae17f9a5a7bee91b halonet:Infinite.zip +Infinite_Storm.map 0D8A8AEB 58662236 262144 eef52f97907b77de4dd314d3e7ba0470c234733b halomaps:2612 +Infinite_v2,0.map 57970480 31154080 262144 a9e5b1dc32d10c7122814d1c70109f911dac2be0 halonet:Infinite_v2,0.zip +Infinite_v3,0.map E5BC65D5 40085530 262144 1387d2fe99b09c474a51b338387bbd2dc17a3bc0 halonet:Infinite_v3,0.zip +infinity.map 0E7F7FE7 18330556 262144 e69a334d0b26e23d390960ea6114d80bd60e6feb halomaps:4783 +infinity_ai.map BDF9C36B 90611029 262144 636a1729d2ecb948b2c080c099f37fa496e9993c halomaps:2066 +infinity_desert.map 77796EDE 18233092 262144 6cf7c6ab571c048dadd5eed413130a07610cbb5c halomaps:3898 +infinity_forever_beta_1.map 05503625 50224660 262144 43debe3b619ba87b409ca116800456a8ef9567b2 halomaps:4805 +infinity_futur_weapon_mod.map 7F6B8FF3 25703884 262144 dc9585d759ef045d69c8308144ee19cbcfc44a91 halomaps:5330 +Infinity_Gulch.map 00000000 196079653 262144 aed5bf5fbf72c41a8526e2e47cd42ae948ab8644 halonet:Infinity_Gulch.zip +infinity_rm.map 0E7F7FE7 336958852 262144 97fdc18cfc157b3b659b27ce5191496bcc16def0 halonet:infinity_rm.zip +infinity_tmcc.map 0DF15527 45581588 262144 1716e81f6bed55b786e3a52360d16c29b4338e68 halonet:infinity_tmcc.zip +infinitymod.map B02B2125 45150033 262144 602704e286ef2a8779980cdb14bc3abce78f41b5 halomaps:2210 +infint.map 9C481F27 107537700 262144 e3777aea036506ede9d847033ea9d6a99c8acced halonet:infint.zip +inmortal-.map 3E592C2C 196171083 262144 32e2977e0963a0e93513f410c7312ec4783fd9fb halomaps:6971 +Inner_Sanctum_pb1.map 4EC6A465 50278389 262144 421195b49f7b2a3137498dabd834feab4afd146c halonet:Inner_Sanctum_pb1.zip +innerpoa(spartan).map BE12ED09 88426221 262144 9d684d5b888875cfc9982aa50ab7be3d54b8fc84 halomaps:2345 +innerpoa.map AD2E784C 123193133 262144 ebfdd3d806e629b63082eddf58867bdf2a1bd02a halomaps:1487 +innie.map AA5C69A4 213815960 262144 afca8a083d222239cd15a7f88cf1185f6e6c56e4 halonet:innie.zip +innocence.map AEFDFB38 22947772 262144 edde7b2dcdb7890cebc41721861b007b44a2f397 halomaps:2797 +InsaneGulch.map 94B4358E 54021216 262144 2d505215cd58106b6820070bc57bb33bd556d246 halomaps:4364 +Insanity!.map 47975C50 93988383 262144 a435ae942697a03c2fd2903d29cbe37e507239fb halomaps:1828 +Insomnia_map.map E0490028 104541981 262144 fa047659035ecab515f6fbc62329a248dc52f129 halomaps:4086 +Installation101.map AB392F60 18445496 262144 7ec22bb16b0bb98810f164dab989cfff956aff5f halomaps:5852 +installation_07.map 822D01FD 20033196 262144 0c1d3ceebac990263cb3bcdd96906b0584b1a8d9 halonet:installation_07.zip +instance.map 3F01206D 13247696 262144 8e862c984e5ccd608779fa142467327b6201416e halomaps:2687 +instinct.map 8F78191E 30394215 262144 9b8ac0d060191941add0865448b3d899da19e015 halomaps:2332 +integrity.map 3B48A4DA 13871952 262144 115667715005025a8dc43f26db05d1d4153f4897 halomaps:245 +Intense_Desert.map 5B3AF50B 280162291 262144 1689373442adb03be856063a293a9e83468c045b halonet:Intense_Desert.zip +intense_desert_ai_bots.map A191929E 391864008 262144 acb1c2dcaced5af7f5b75d0f74e5854d6b58459b halonet:intense_desert_ai_bots.zip +Intense_Warfare_Beta.map D56A62DA 63236859 262144 603f1dcefc2b09d3068360de8614e80a7bc6b0c6 halomaps:4717 +intensity-plus.map FB161DBA 143675205 262144 2ff76e132649c24c594e19a30bb9f021229a31d3 halonet:intensity-plus.zip +intensity_rebourne.map 7143389D 84321486 262144 1badab219bace5b2dd1a9978257585e19c8ee687 halonet:intensity_rebourne.zip +interference.map AAF17B31 15491302 262144 618e162beacbe148152be993b6567cd4a63e3ba9 halomaps:1202 +internment_v2.1.map F06984F7 50972537 262144 28d4ce4eada9f65bab1efe5c7a6fe5ba6565e423 halomaps:4407 +internment_v2.2.map 86B35DE4 15336856 262144 60765a5bd15708e2e15f89cfafa7aa18dad356a2 halomaps:4493 +internment_v2.map 61DC8312 57021475 262144 e7917e347f5dacadef98d72be577e6aa46fc2cb1 halomaps:4365 +intruders.map 1717BAF6 57198149 262144 951c76285f5569aaea393e541191b15daca2f8da halomaps:3852 +invasion.map C2C67E63 18363808 262144 63a6a6d246f7786d48f45b14217c6a9e8c38a224 halomaps:2320 +invasion_covenant.map BD3865AE 40499389 262144 4e4bd1d63d01f46b50c1473b9e5bfdfa400a3faf halomaps:5964 +Invasion_of_twins.map 9C342335 47489828 262144 0a6ef3920093fe53e008d753a21a676c5d0c2a2f halonet:Invasion_of_twins.zip +Ion_Zone.map E79C2891 13973496 262144 f9abe04c82a34690c6d52081e3b273d249be60d4 halomaps:2241 +ionic.map 5D7ADD7B 17017260 262144 75e6abfb8e72f4bb18c56e95cfbb1f81c9075a71 halomaps:1591 +Island Paradox.map CD756A2A 45243047 262144 59e256c673b69cd33c28d519177de58627fd6ada halomaps:4442 +island-a.map C523C70C 20373782 262144 3fc951cf70588b7499432d2de2b8b226be7bd235 halonet:island-a.zip +island-of-murky-water.map B5F3D3EB 86488680 262144 f540b06ed82823769efc5f82343726d080c5d7fa halomaps:3083 +island_assault.map 5DEB8722 119968902 262144 4969acf676eee293a533e4d7d16e0e32ec828491 halomaps:4288 +island_assault_p2.map 67961312 118589896 262144 244115cb5af3f04676a81f41b8b7bf03914430bd halomaps:4512 +island_defence.map DC3BCDE0 118516746 262144 6339928efa8747018c6ceea4a16319f10b2742a0 halomaps:3918 +island_hopping.map C8B2E312 18048244 262144 3c405aead4210a35c3c77aca46a3e8c62c37a172 halomaps:4157 +island_war.map BFAD4DB6 94552937 262144 86391c661de797967fcb6d48c8565bab2fed723d halomaps:5288 +island_x.map 6E0E36BF 31738927 262144 850280be6b0127c4a6def824ab4ca408e2118f17 halomaps:2592 +islandhop.map 5B8EFA37 26025570 262144 d77cf7713b1f8b7e06f46a3ce33b4fe1dd7b6e87 halomaps:384 +islandofhalo.map 1F66C195 91118071 262144 5f75e979d02bae868579288d86fbe516400d4736 halomaps:6063 +islandthunder.map 1E7C4126 19005036 262144 675c8d55d4bf891585ab2b22e536538354bf3117 halomaps:1795 +islandthunder_race.map 9BEA9F17 21058444 262144 3b73e1c375bc03ff7f28dd23c2215ae8fba52f57 halomaps:4470 +isle.map D5C0A6EF 18905570 262144 cc6107227395d68a22c89feeeaad15889300dab0 halomaps:4119 +Isolated_Keep.map 63F55CDC 125789426 262144 915602e66ae234a37224eee2b39f40873742971e halonet:Isolated_Keep.zip +Isolation RC1.map DCE18406 28922201 262144 40a3fc1db09c0a1a9a3d58946b6f22e90fad9f22 halomaps:3352 +isolation.map 6B08C152 18620500 262144 df44d43a3b1bc8ee348729c72981fafef274f131 halomaps:3919 +isolation_npb1.map D7016B41 65799174 262144 cedadc3d438ef4ea12c3f08058727784eed8a46c halomaps:3295 +it_ff7.map 9F16A1E2 62109316 262144 603197c28c513766da61d387daadfb3e90888871 halomaps:6758 +ivory_tower_final.map 0CB106BB 70676373 262144 58be08c027e5ed228288c5867b556436d33de89a halomaps:5045 +I~~Hate~~Bugs.map E043E073 129672500 262144 582af6d15ebad11e45fd911cfc64d94fcf9e8228 halonet:I~~Hate~~Bugs.zip +I~~Hate~~Bugs~~2.map E29CA6BC 129672500 262144 4b3a2cf58d6093f8e4cc12e106d7ecfabdff3439 halonet:I~~Hate~~Bugs~~2.zip +j.map BD3160B4 27391379 262144 c3d965c370ab12c7233ff13faeb43151021f4f33 halomaps:1855 +jackal_shield_gulch-0.1.map BDACE6D8 45374107 262144 f3c0b44294f85161b0b995afe9ef3527d542f903 halomaps:4231 +jail.map 73DC29A1 13544116 262144 b4f50184cbd26db307795f6033d287e494d04bb0 halomaps:1999 +jakgulch.map B7ED7253 43079010 262144 6681b24283daf10b34376e09a6219451b0a9f07a halomaps:4530 +jangle.map 2D195035 39157617 262144 e909554db8a8e559d4dc6b2058da8e1c13701753 halomaps:1456 +jarassicpark.map BBA025AF 73249920 262144 6a9bd4170d1c6f4899adb27b29e120784a3213c2 halomaps:6113 +Jeep_Cliffs.map 34483CC8 22995900 262144 b92de9b4a85895e23956282cc63492836ff4a7d3 halomaps:1989 +JEFE-MAESTRO-VS-INQUISIDOR.map 22C281E1 236049393 262144 d453890b540fe7474a4aa023c00366bc72b84260 halonet:JEFE-MAESTRO-VS-INQUISIDOR.zip +jefe-vs-covenant.map 50B8F13C 326716103 262144 2a27735906d1eabf7b0aeab7242b6af7b58e63fe halonet:jefe-vs-covenant.zip +JefeVsFlood.map 76E17800 348384134 262144 6ee6424ca1521b64e973aec302ea9939d13a17e8 halonet:JefeVsFlood.zip +jellystone.map 39B5887A 13949968 262144 38b7ae7811a2e513b75b3f021dc02e62c5a999ec halomaps:246 +Jetpacking_Action.map D89779C9 240489758 262144 87245c2331be65c28244e14027aa4bbbf34fde6d halonet:Jetpacking_Action.zip +john_ai.map 5397CF2A 192656355 262144 5576285b7c26f422053d82cd9be4812e2fabb40f halonet:john_ai.zip +johnlex-fucking-sucksv4.map 7A99FD67 66339071 262144 5bd5cf9c6f5414a41a59133934d1cecbc614c7b0 halonet:johnlex-fucking-sucksv4.zip +jomart_ascension_i.map 5542EB86 177443718 262144 b55499d67cbad48e1d003a8456e798023d8a0c5f halonet:jomart_ascension_i.zip +juggernaut.map BBA52C21 89718372 262144 8e8c17de42d7af806d0c92a50d28f9e13957afa3 halomaps:7042 +jugular.map FE739BBF 15318712 262144 5ecb7839bc177ca051b7bfa0cdbb03c472a840a6 halomaps:1457 +jump.map D13014B0 13164568 262144 58d7602c7564b2e07931b93f1466ce322dde9ac4 halomaps:177 +jump_classic.map F2DEA1A9 12731444 262144 bf6f2e52bea81e806243f5d661355676934071c8 halomaps:3791 +jump_pit.map 0995D3EA 18616722 262144 96d88e589b63e8252f255f6610cb954aeeaa85b5 halomaps:4263 +jumpers.map 830D51D6 29079946 262144 66ad98089268fe1412bca78e3fd6b7a23c07f04d halonet:jumpers.zip +jumppit-reborn.map CFC19F62 23303878 262144 08f6c2a4be789200ad639ef933b92b169e037ae0 halomaps:4471 +jumps.map DA3D5B28 14230096 262144 4803008ce79c269a886b6d4a8d45195207f94d8a halomaps:3644 +junction.map D2A40ECC 13699356 262144 cdcb488b0ed7b18362e086dfb456f4bb8c46318c halomaps:3706 +jungle.map FE44B3B1 13985432 262144 2147242ed0d4701a6e474478c851b84edd3e6fbd halomaps:3991 +jungle_battle.map 0050810A 118166886 262144 ebe4e9a205a34b73423ff421b1df29d0222cb526 halomaps:3707 +junglecombat.map 1414CC7C 56507570 262144 3e7d450809c452f3983aaa8ffaabf28a9f30cbed halomaps:2260 +junglecreekai.map E463E808 46071674 262144 9c030470b3cfbcbf1344ff8e51bef63ea422c66d halomaps:3549 +jungleraidnight.map 1626A740 14161132 262144 90f5c663dcce48ab6096cf46d33d20cbd18c4911 halomaps:1847 +jungleraidV2BETA.map 07DF12DF 20802756 262144 6af459538b581f0869cadd1b59d28b035c772951 halomaps:2867 +junk.map 5037E56D 35559712 262144 93c513f5a73fc0f138f0a7085c5949f6fd5cd6e3 halomaps:5237 +junk_with_weapons.map E24BB429 41552346 262144 46f673368ebccc4e28b454dba1262c97c33a9d81 halomaps:5425 +justin.map B59DCB0B 12051760 262144 b1180d6c1d213d1f411546d346f3c94995add34a halomaps:4901 +kac.map BEAB1F77 14427376 262144 6c2c1827d42ed65c16cd0036cf1bb8d87b58aad6 halomaps:4494 +kaferdel.map B6D07196 84031259 262144 45640a290c46ddca87ecf224d7ee9113887c0190 halonet:kaferdel.zip +Kakariko-Lost.map 5AB57CBF 84279280 262144 0eef03a7736332b256d116be765b00ef9845a0eb halonet:Kakariko-Lost.zip +kakariko.map 082E5DD5 72780272 262144 493e6a67a27d75213b6bec965bed49b8c99cc4f9 halomaps:5788 +kasheek_(starwars).map 669EA763 90986431 262144 a85fb4fd4c809bdec6c862c6105ce437498a129c halomaps:4735 +kbattle_creek.map AC6FFB05 64327862 262144 571db656c994255fd9cab821364a76f65c2fe496 halomaps:3175 +kensworld2.map 3F7B11A8 15121260 262144 863958150d816679e3931286036829ef633908cd halomaps:2346 +kerplunk.map CF7746E9 13493968 262144 a6b024b55314fdb4c15937204428444a15f09286 halomaps:540 +kgephyrophobia.map 1D55E963 68820282 262144 8295c4ae330646f7efdc5a30e7593ad20d897cce halomaps:3176 +kgm_bosque_perdido.map 15C00A15 358705084 262144 ed4ba918349c1a3073319ddf8999e78059877bdd halonet:kgm_bosque_perdido.zip +kgm_oficina_abandonada.map A15AD828 325315864 262144 bb719a478e87b6654d42856d70beb4e59f53cfb9 halonet:kgm_oficina_abandonada.zip +kgulch.map FC453AC5 70884505 262144 def546cf429b875856df3c952d8e16f87140c034 halomaps:3177 +khand.map B2792942 17471664 262144 ccf512d632648ccc0638ac271a82c368dff73248 halomaps:4513 +Khar_Shian.map DB43602F 197996564 262144 679dd6b0e9212db638364a9e35f445408c2e757c halonet:Khar_Shian.zip +khl_crossfire_test_v0.map F954104E 13280540 262144 8e615ef1df8c935a62a3b46fff26ad80a19eb08e halonet:khl_crossfire_test_v0.zip +kill_team.map 5196267D 40750173 262144 edce1a001e885f5925370b0a59c328eb8633f232 halomaps:2798 +kill_your_television.map B80F1148 16135180 262144 f7103346cd0026cb65fe75e1b774906f08a18109 halomaps:2955 +killa.map 4AB2E3A8 24831514 262144 a2759b8cf62cb95386ddfdeac541a1f994dd2cf6 halomaps:991 +killa1.map A5725C17 49994194 262144 01b2d2b57a2109be24d3aaf1d5167f9bce9b29a5 halomaps:518 +killbox_beta.map EA716A3E 27193723 262144 51cd4e3c350efbfcec719e91f079b563f99771a9 halomaps:1041 +killer-gold.map AC7DE8EA 159474991 262144 232080d09b19372c3421be3b339e93a231599a33 halonet:killer-gold.zip +killer.map 170FDB1B 12663136 262144 c059da64506c3cac00aab7ce536b7ffd4675785c halomaps:2688 +killer_cove.map F11568BB 14495940 262144 30caccfa80f398c59a1f70c529acf7c497fd43da halomaps:2855 +Killing_House.map CA5E67D9 227223508 262144 e51da74107c53807358fe350909df6d20c49e898 halonet:Killing_House.zip +killingfields.map F1095B66 13798016 262144 01667d9a65b902724b5d05643023674840acbe5f halomaps:2764 +killingfields2_day_version.map F3753A75 13990748 262144 1eae59b9751a92da74118d8692785e868f53a498 halomaps:2765 +Killtacular.map 7A07D00F 20279740 262144 9a0ee3572ccc236eec3821a942538fee93db2486 halomaps:2091 +killter.map A0B99FF4 13782627 262144 25c486a4f09a252d5fddc02f0b96f42c99821c63 halomaps:3030 +killvalleywinter.map D739AFB4 18649547 262144 d9d1815e06c3c84b1dd415ac156fc62680f5874b halomaps:327 +killzone.map F992B4E0 36626628 262144 09d2c052ac2ac0ae0bff6b6b4e982d3fc0d97d5b halomaps:2925 +killzonexray.map AD0A6F61 42722992 262144 6d1cb21eef0c921972950d7d6d47edf2fb0c25e9 halomaps:4689 +kindred.map 4A1BC6CE 18827880 262144 05ad15875d160da5622d2ce2cba3d36381eefcc7 halomaps:4514 +King-Battle-#1.map 8AACE00A 12991440 262144 4386697e8b46e7aab0df872d9b609c064bd70710 halomaps:7126 +king-beta.map 9034C0DD 185988435 262144 c911c4b11349d438127e8204575171dc7cb6783e halonet:king-beta.zip +king.map BA7327CD 17189840 262144 52208e0928e98e20dda841a5820c17c267e333c6 halomaps:542 +king_mar.map 1F44D325 36140622 262144 51707237347b5cb8152f478c9689728822b345ec halomaps:1829 +King_Mar_AI.map 2DB9C3C0 23521696 262144 c205e9a53f582683e91fa6e0f4c431211813e27d halomaps:1848 +king_shinzo.map A4F32739 25087415 262144 06735c26fae7e469c8f83d87289e38e18e2322ca halomaps:4718 +Kingdom Valley.map D85E0460 56173953 262144 ee71bd4f9b63436fd6f05159ae2ee3840aa3cc5f halonet:Kingdom Valley.zip +kingdomsun.map A421DDAA 25894738 262144 fa6eca88c4026fae6839d9d4548c2c94e1190d16 halomaps:2719 +kitsune.map 173F4D64 16817616 262144 3efa2bc004825ba45564eba21ff2112f7263e5a3 halomaps:1661 +kiwiland.map CAD39856 21882632 262144 44f0ebba4b2241e449fb1d5392a167fe388635e8 halomaps:3550 +klioster2.map F293AFCC 15583341 262144 1c985f5f60c3488d7f1cbac7c334cb10a52c638b halomaps:1108 +kmap1,0.map 4B42EBD8 81696529 262144 42ec8b72ba1217ae23763218c45c4e6233376d61 halonet:kmap1,0.zip +knot.map 79D05930 17149041 262144 436f2542a8d0bd3a2c1bda97870f360f2748abed halomaps:2856 +kod.map AFEE9163 30532716 262144 0a2a232df7d5a623d91b36e46d846da39aa1fabd halomaps:2689 +kokiriforest.map C5890622 63927409 262144 cf4f049caf0ca92c6d9062e608c8e300aa2c94b8 halomaps:2720 +kprisoner.map 92CB3DE9 62891833 262144 ab059907aefe11df7d7858cb361ad98b064e80a0 halomaps:3178 +krakendemomap.map 0BC07DAF 20839570 262144 74fc71dc2f8573dfe367842ebfe8e12338c3c97b halomaps:3184 +kzcm_no-mercy.map CE5DCA20 129691929 262144 c424b0231d42e845c99eab243a0d3582a1dc06ab halomaps:5950 +l'évolution.map D25AF0AF 32271731 262144 6d3b8e66f54d7de8dc61d414f89d0aff14acb49a halomaps:6282 +l.n..map 24D06B2A 100075551 262144 fadd0b583ca8937ca390ed2109e95becb21c23cf halomaps:6495 +lab.map 3BA23371 19471053 262144 37217e643822a219b8abd00983956a71b775109c halomaps:967 +laberinto_2.map 68D0CBAC 19524979 262144 6b01a758894c0fff7c0cdbb530ddb01eb50ed2ad halomaps:5842 +labor.map D1E01A96 85889558 262144 2130e84672f7d6f2ab030e7267f2cce19a4cd2e9 halomaps:4443 +labs.map 5F93A01A 32122634 262144 69980ee11639874197859f542793abb9847183d1 halomaps:4120 +Labyrinth-desert.map F92B82A8 17703826 262144 6f6943d150cf584efb5496368576cf8818f04986 halonet:Labyrinth-desert.zip +labyrinth.map 3A1AD6BD 17397648 262144 b56d1e1ff9fce16bd7fb6171bd38c0dbc045fc2a halomaps:354 +labyrinthe.map E109CD46 26545032 262144 3758330ab609d66d18bae0f92ee2e56c1ba3b5e5 halomaps:3227 +lac_chapter1.map 25733249 138087274 262144 b43c6a0fde81eda64255b06e029f4497fbbb3b7c halomaps:6027 +Lair_Final_Beta~FX~.map D8A9C4C3 13554932 262144 fe3d4cd88a202497123071821e65c50d22a3a2c3 halomaps:1830 +Lake Forest.map AE1ED1FF 40692312 262144 3f2963141722deac5beb43e70c4ed2695028b523 halomaps:3992 +lake'sbloodgulch.map 44CA5600 30664867 262144 af81877b09f0fb36972b879d66aa44f7ea0fcf63 halomaps:1724 +Lake-Natalie.map 4017F5BF 22281538 262144 bfa8d63003300d7b89ae6b8b7de9d2063863bd1c halomaps:4472 +lake_bovatoya.map 5E9DCBAD 51356466 262144 ea46287d62481334e6e5fd06a30c237b3bd63dc1 halomaps:2956 +Lake_Serenity.map FF7AF0BC 109704171 262144 772a9c1c5b2377435bfc59000792d5bae006292e halomaps:6114 +lamborace.map 35FB3E47 40778888 262144 c26d6ca68f145bafc9cd6a1ba78522f4a2b8a5fc halomaps:5843 +lamda.map 9A7522FC 17091568 262144 8aa5dbc73e3f643f72426665e01289a08c3f57d8 halomaps:2502 +lame.map F7040525 13777112 262144 de8f98e8e83dbaa71399506a588f126ab0b8e4ca halomaps:247 +Lameass Box 2- Crappy Evolved.map 3043159A 33436171 262144 93bfc0d7f1fdc9c0548b9a0c28c21fd246e07db3 halomaps:4032 +lameassbox.map C59CA737 12389092 262144 c026162506c78375ef0feac12cdaf211b14fbfcb halomaps:3513 +lameassbox3.map 6A02C1F2 20357019 262144 fd57f14a4319706338eb94184f6103effdc4b62b halonet:lameassbox3.zip +lameasscardboardbox.map 6B8889FD 12089236 262144 2ed5f0222ceab0300d2b643c020482909fff5efa halomaps:5372 +Land_of_the_Lost.map 1C8356D9 327385864 262144 6b3fc27562b0fa38423d2d492166632682532c79 halonet:Land_of_the_Lost.zip +landofconfusion.map 1C9C6DDB 20720548 262144 15dca5f3a85a5c883e9a1a55aec80dbabbd3195d halomaps:3415 +landslide.map 2E540F13 18116774 262144 bfd9b3b3af61992cb4c11a7986a1ed6374c0d1de halomaps:3811 +landwar.map 8A2C77F6 76876303 262144 c9e6fc997ae4bbc8e3a53c469e28947c9756eb39 halomaps:6766 +landwars.map 0F733EA0 82496660 262144 686507f6e3d588b37c2d023291b2eb8deef9ea57 halomaps:4366 +lanthanein-pb-SSL.map D8FEFF8B 124558105 262144 15bbb7ea8e8d8234be7b582a37be3593e433d49b halonet:lanthanein-pb-SSL.zip +Lareliquia.map 689E9A66 121501486 262144 24bf4623f9c3962f167dc6782bc1c44cfa64f765 halomaps:6836 +large.map 10918FBE 22404680 262144 036969b24afae1ca941ac464876d267e72d31e78 halomaps:2489 +large2.map C1DB6BE8 27579439 262144 50103182a9bc1d22d1b4675a5a22273c98d2183b halomaps:2636 +lasertag.map 2A5CCC69 13706420 262144 1e8a10d53d1a2f8e236ad03054d1993a1324b954 halomaps:2347 +lassirenas_screamer.map B8AC0E63 119802891 262144 351e8efa397b0a768ff4666a77fabf25558e768e halonet:lassirenas_screamer.zip +lassirenas_screamer_v2.map 9BBC685B 141596852 262144 c129c32e4f8aaee74001111d148835c8e38483a1 halonet:lassirenas_screamer_v2.zip +Last-IceCoagulation.map FCC3B761 249865605 262144 d65a191a72ed9598355a857b2f3bbd288fa2d1b2 halonet:Last-IceCoagulation.zip +last_fight.map 29A4E018 14574156 262144 3e5b758ee6315bb5f79ebe01d60caacfcd36c484 halomaps:4251 +last_hope.map 364CC541 13828018 262144 555731d178aa76e036c6ee0b1821ad2d0b775d5b halomaps:2905 +Launch Bay.map 04CDBB66 30281756 262144 4cb027afb4557d9d4243c81872d80a401cb9c8a0 halomaps:563 +launch.map C894A4E0 13607284 262144 263515582ab29c97ba69793c7ce91b1b14ddbe0d halomaps:5407 +Launch_Bay_X.map A5D36CA2 25000872 262144 37a2f5a28a0ece958db4028487045f36915bca50 halomaps:934 +lava_base_rpg1.map DC5F60C2 81059762 262144 df932cc5219da34208a4aa6796de591a74fb5b3f halomaps:5892 +Lava_Bed.map 297BD71E 294814802 262144 7d5a7a6fbbfcc0d9f6dd03bcc4b96a5d5ec746a6 halonet:Lava_Bed.zip +lavaflows.map A5EC4C1D 16353916 262144 117d93fee8b7f9e78986e6dd3f27ed92d8f1ceb7 halomaps:399 +lavalamp.map 57DAF4C5 18119754 262144 1fc05e7477732f316bae25a2e50d822b15d83071 halomaps:2857 +lavel.map F4FB7AAE 15710064 262144 64232bc0a64b068919fc561fbe5f9d7ce90a9225 halomaps:2305 +lazarus_valley-v2.map 98384C78 105928557 262144 a406ee012b21db2eefdb99167e0c5fd616581e71 halonet:lazarus_valley-v2.zip +lazarus_valley.map 20B48727 89799404 262144 22e2865479fd8f13e5c3c53b6689848fff946525 halomaps:7075 +lazarus_valley0.1.map 570409F9 114411539 262144 833a6c50db8c803eaeba3031767d088175ff17c7 halonet:lazarus_valley0.1.zip +leadhead.map 4C7A03FA 19243115 262144 2e450ee42e0bd9e66d78e99b255227d49b9671c4 halomaps:2348 +leafygulch.map EB7B2ED0 18018988 262144 f5c9c15a34032afa34b640b7a5d28517fe3eae91 halomaps:3645 +ledge.map D821443B 97423727 262144 faf5c08dc73124855b616f9a2affcaa94a12865d halomaps:5095 +Ledge_fixed.map D92C9CDC 100084284 262144 172ea0bb1b9f5bb881a5939c3b457894593e1e96 halonet:Ledge_fixed.zip +Ledge_v3.map 00000000 188205584 262144 f5bfffe6bd1ed391c3f02f3723dba9170eb45c00 halonet:Ledge_v3.zip +leer.map 3058CA93 111766317 262144 7b39a86c5014c615dce28e9b6a2a954ac4f12969 halomaps:4657 +left2dieforever.map C4BE94AA 28678690 262144 32be5f6a87197adcd90233d0c16aa7a65733f865 halomaps:4431 +Left_4_Dead.map 6A4C0B7E 400311841 524288 ee6cb220aa92660174c9675861081af0b7df3c26 halonet:Left_4_Dead.zip +left_4_onotix.map E9F32E92 98167600 262144 fc246efb343416c67008bbb6eea79a996a288b62 halomaps:4658 +LegendaryGulch.map FECCE9DD 113932218 262144 366bc9449f9a148f9bab94ec2ead4855fc6115b0 halomaps:5503 +LEGGESTER.map 82F9A078 395051700 524288 40c91475a790dd31fe2d0e85db15c7cfa6d2bd7a halonet:LEGGESTER.zip +legionairs5.map 2DB44B90 121899867 262144 1df25fb90d2951b5f2aa41db4951cafe2ce88f9d halomaps:3353 +lemondrop.map 5646E081 57419594 262144 1e9a0e5f674483997b1ae89eb788f25d32905eb2 halomaps:5186 +Lethality_Canyon.map 7D0E5337 89337550 262144 4ccb0e7cf414d4854dfdb288e0eae1fe3b9550f4 halomaps:1869 +level2_training.map 8C297E1E 14068288 262144 5e6a8ad1f3f78b12a8ac8ff1d2f5df6728524c2a halomaps:4278 +level4_training.map 8690BFE4 33070612 262144 b9536e071c1ceb5329ff35155fbac9a59b70e7a8 halomaps:4289 +level9trainer..map EADFD797 15587704 262144 9fe222c8927302cfbfdc02ecf2ddad8fffc030d9 halomaps:4408 +level_1.1_trainer.map AC5737A7 13116044 262144 9c2819d872ba8bb931c64df59cd5f6e04f655bf8 halomaps:4264 +level_5_trainer.map AB23304B 14032644 262144 588b9e2d006b15922b7b2c9d37ec2f10d774c247 halomaps:4310 +level_6_trainer.map E2B24A6F 14004288 262144 d763aee6ac7eb097c4d4a1263f2a69948bb60693 halomaps:4329 +leviathon.map E31F7919 19436658 262144 2255788418e09bcdad714fc04d281abadb813ed4 halomaps:3031 +levitation_devistation.map 2DACCC70 18545332 262144 15475a95fcb86d27411477bf977f1226449ae5c2 halomaps:3730 +levlel8trainer.map 65AFF53E 15881237 262144 fb00f4d17bc9206df9a9e9b3ad1a0ad9db10cffe halomaps:4367 +Library CE SV.map 243DA414 54137797 262144 d187a7611cb3f0aae998fc2913f1a62bf5d4b773 halomaps:1066 +Library CE.map 243DA414 54137797 262144 c29dce5ed53a27a4f9db6dadadabe1eb9183024e halomaps:1022 +library-final.map A3CCEC04 73384545 262144 0c7772c77be105914b52845de874a3fb7f771093 halomaps:3258 +lies_and_vengeance.map 8E6C11D6 118670890 262144 48a231bd98672dad745efcadc49d9d6fc0e67f3a halomaps:3535 +lies_and_vengeance2.map 3DB07F0D 131860019 262144 f7766eb934537ffe50220341fd0d88f350851af4 halomaps:3615 +life_rpg_v1.map EC472F1E 132050195 262144 b25617006714c00704e1ccec4ae3562222b22b30 halomaps:5638 +Lightmap_tut.map B04D03CE 20849808 262144 157ae5d731510dd133072695d77f971640d2e03e halomaps:6444 +lightningstrike.map 49ACD8DE 13424624 262144 a16b34d888307fc532b0425ea580097aaf518e22 halomaps:248 +lightningstrike2.map B02D46C4 15737176 262144 6e242aa95d604b8849c0708d4785ef98dbc4bb69 halomaps:1074 +lightsout_deltaruined.map CC9EB3FF 60770925 262144 627e105bca1d3ffaeb7dcd1b4e87b11105386584 halomaps:4920 +limbo.map F84E0421 12823339 262144 df7806b38fa9bc8d5e5ae467c5ff3587c3d0a702 halomaps:5785 +linkbeavercreek.map 31F2CCF8 13958356 262144 b20d1ba19603047e15475ef276d85b9b25a4e756 halomaps:2392 +linkbloodgulch.map AF5E9226 14797448 262144 e09bc6069014781680bc79559fe513928148161c halomaps:2393 +linkboardingaction.map A3499F46 14821860 262144 75070dd09b260bf84e2b8181583d182c16fa4116 halomaps:2394 +linkcarousel.map 1A1C94E7 13505088 262144 b0c4a4cf848b9cb7a609e8b5247bb7ce03588904 halomaps:2395 +linkchillout.map 638535C0 13582480 262144 a16dcb912f1af0ebc978c071ca2905428f8c6cb5 halomaps:2396 +linkdamnation.map C5E42C13 14868236 262144 75a3031f476c61a206a24e9c1671040fe61f1b52 halomaps:2397 +linkdangercanyon.map 9850C04A 16026756 262144 cf834cc5dc27dfa8b6bcbd6b05d4659e05777314 halomaps:2398 +linkdeathisland.map 993227B6 19014640 262144 38de0133f02a27a5da9ad5f851b85379bb5b8203 halomaps:2399 +linkgephyrophobia.map 38EFF4A1 16440668 262144 d6af06df699e08d29889b4df418bd17496cea2e0 halomaps:2400 +Linkgulchmod.map 5EF1B0B0 20266179 262144 373679bf40fa9b9fbc6e0979bbea6b73d4d7bc2c halomaps:4516 +linkhangemhigh.map 07666F33 13589248 262144 fed3aed7d32d5ef3bec523fdb031b9c8a87e5fc2 halomaps:2401 +linkicefields.map 54724C0C 16715536 262144 2ab830a95b4dff17b19f9e4ecc81cabe70147154 halomaps:2402 +linkinfinity.map 8A4684B3 19191912 262144 e4338dc140579e626d0dbe0c511da5d859cbc93f halomaps:2403 +linklongest.map 1895CB99 13394916 262144 17dcf3017b5eaec4680d609d64f578d8cd7334f3 halomaps:2404 +linkprisoner.map 0C9B6C66 14031464 262144 9588777810ed9e11f5f23ecec4a3abc8586929d7 halomaps:2405 +linkputput.map EAB504A1 15032936 262144 c878bc3262d999491780287ffc649ae94524e86e halomaps:2406 +linkratrace.map E9B1FBA2 13623796 262144 ab95f7515d02aeb2668b189267e461ba47ee5117 halomaps:2407 +linksidewinder.map A049E855 15701952 262144 4851a7c1166601d9e5e1998fba7023d783cf5795 halomaps:2408 +linktimberland.map 8CEE5B54 15552276 262144 5ed1df07e930d2f0c8d89dbb184a596d50dd7318 halomaps:2409 +linkwizard.map 2AF8FE3A 13592820 262144 24264a35f49823b6b5940b7dec90dc4caf4fdb22 halomaps:2410 +Litiferium.map 8C364E48 91478292 262144 8d41413ec3306e1be81a41a5a7886b6c04093f0f halonet:Litiferium.zip +litretad.map BF66261F 13000172 262144 9901cec644b3c1a2346e694dd5c14efc3d9e1d0b halomaps:6535 +Little_Bigass.map 00000000 296733898 262144 3d09559c7cc22f66cc867f6d22be6bf0d01d4a8e halonet:Little_Bigass.zip +Little_Bigass_v2.map 00000000 331650608 262144 d50712525900a011700e6e6ac17b613cb4b9d07e halonet:Little_Bigass_v2.zip +Little_Bigass_v3.map 00000000 331650608 262144 b6a2e15ce5b8fd56c6e772ccba0ca77204211d24 halonet:Little_Bigass_v3.zip +Little_Bigass_v4.map 00000000 331653648 262144 b9c5d758a7e1738d76ab30bc6a3751b5d9c02f43 halonet:Little_Bigass_v4.zip +little_bigass_v5.map 83C6B7A5 255843410 262144 400b372b6050a53df5735b7bb5d54735df17a56d halonet:little_bigass_v5.zip +LMT-station.map 2C5C9097 97685023 262144 2ad4038750dfe273119bc4f806cee3f7dab0d60c halomaps:5202 +LMT-zanzibar.map 59A90A86 207160241 262144 29cd646b292d6c879936f37647eeb598b411e941 halomaps:5238 +lmt_air_duel.map 0E86ACC6 83092746 262144 2aaf361d3283845ddf4fa5b2b9e569b0fd9e38a7 halomaps:5893 +lmt_Bloodgulch.map 0EC7FFB3 97487938 262144 25b016a03938f0073ea5928e58bf5f7b1dd64bfc halomaps:5894 +lmt_bridges.map 278291C8 121434536 262144 42aed5868edde10dea3ba89a29a336143d374543 halomaps:5965 +lmt_force.map B6C5FC4F 84906059 262144 62a7b5c917b0bce398da9da015c773df23b559d7 halomaps:5853 +lmt_high_ground.map 5C1DBB24 83273407 262144 4add8411c1c4f5d520e830fed5f9eed1dfd1b82c halomaps:5895 +lmt_hill.map B1EEB6DD 100180771 262144 1957e107875ca783dfa1467cdd4d77fe74fa812b halomaps:5844 +lmt_ice.map 18DBDC3E 94946078 262144 33c2a671a9e4571da348649e165a9ade768ae655 halomaps:5933 +lmt_powerhouse.map E34E61C4 116857655 262144 8a327de0763e0104421871dd6c6075b4c3514203 halomaps:6021 +lmt_reach_hangemhigh.map 158EBD70 95792883 262144 cfce4ea8167b11173b219afadde0070ccc05ab7f halomaps:6022 +lmt_ruines.map 0C0424F4 106262319 262144 e07188ad69c2f6455901665247dbc9befb62451b halomaps:5934 +lmt_sanctuary.map CC31613C 84837085 262144 28b9d94969f51a9b157f744b9306d560d2b231cd halomaps:5896 +lmt_satanic_blood.map 38835EB5 109340221 262144 41120e956b29e90fbcfef11c78fb5eeab051b5b7 halomaps:6008 +lmt_trust.map 558085FA 83848279 262144 c930f8e5667214c97201c62650397c5fcb6863fc halomaps:5854 +lmt_valley_dry.map 1E5C3EFC 110278224 262144 776db26e051c706c56d2a3a768f8ad1680530084 halomaps:5897 +lmt_war_without_truce.map 62328F44 87826151 262144 7a5472c9d608990037719cacb1f7f1eecc32c099 halomaps:5898 +lobby_classic_PB1.map 296C5B46 50972982 262144 2221497e3c044aebcc9eb5358bf46c4dccc89c29 halomaps:2868 +Lobo_Solitario.map 60A74846 156473044 262144 fb052672a8b082d234abd0d6ae86e5dc0ca0655b halonet:Lobo_Solitario.zip +loc.map 00000000 391996 262144 25d71e677845df08087f6e2e4621cf350d7f62cc +lochscot.map 3CD2A694 13634932 262144 69610c6b1d34cd01c4b3efff66b7d811955a540f halomaps:472 +Lockdown_Mombasa.map FA55DECA 85158860 262144 ee2b5b2e0d1ac79fd41494a3f006adb2e2b706b3 halomaps:4515 +Lockdown_Mombasa_V2.map 78202177 88163563 262144 3108efce2c90c7cc324f63e6b072b78583a58f82 halomaps:4842 +lockout.map 34A65263 12761100 262144 aae405707b89a35b3262c564c5dd0e991e5111dc halomaps:924 +locus.map 7CBA03B6 15978824 262144 e9d097a5f7c0b76ecfe98d63b19d42405f8a7e58 halomaps:249 +lol-creek.map 1B03F3DD 42533015 262144 c8adacb652c2250b1e77cde9928e1ba5b2ce32c7 halomaps:4868 +lol-gulch.map 14F51E8B 59892529 262144 54976615d92ed3976bdc66539b70e00cf6e0987f halomaps:4902 +lol.map 410B25C7 63181937 262144 456ee3e8a5cab49a7e7e650dd5ad1fefec7702e4 halomaps:5639 +lolcano.map 607D1792 14706116 262144 c78ea85600ba2ba01a9132b2363406c76dfd3b46 halomaps:1636 +lolgulch.map 7A2FE140 51669475 262144 bb4f9de7b9d913c8ea756bea55a38b629acb12fc halomaps:6837 +lone_obalisk.map 8EBF83ED 12612696 262144 9868a12386f6ca320153699f3917e2c8ed5e45e8 halonet:lone_obalisk.zip +long_run.map 3BC277E0 27780767 262144 ae70e9cb1e20d87d75f41477debd024d8ac7f967 halomaps:1307 +longest-king-ai.map 2F6A3779 18041020 262144 cfd082bd82186bd61f424960b70f850487aef1df halomaps:4970 +longest.map C8F48FF6 12533560 262144 0a1e51963ac4e639a57438210b05548a542be996 halomaps:4784 +longest_rm.map C8F48FF6 306474856 262144 1818b861466daa51dc208304c6764dc15ae8ecbb halonet:longest_rm.zip +longest_tmcc.map EA3D6FF7 36332348 262144 1717465e40d4922d824c38d244c413e19662465c halonet:longest_tmcc.zip +longrun.map 1287B8E6 16914016 262144 4dd8f668de2982b37ecfbee0d1c60c5092928c75 halomaps:250 +longshaft.map 35FAE535 53146038 262144 2ff8cea4b8489af4458b00bbe11f4357824588da halomaps:2160 +Lookout.map EA943683 26376120 262144 f6c0e84883daccf41d7a24be825448e8cb51611c halomaps:2067 +lookout_classic.map FFAFCB71 23629812 262144 8b082a9dd21dbf8942e9d2648841fb7614c35331 halomaps:2075 +loop.map 25962283 12492280 262144 ff16525df94670970326d75c2e1fcf30d3b94f4a halomaps:251 +losgauchos.map 5F48BE09 29626296 262144 18c878d51dae13693e4de464c474b387aa878f35 halonet:losgauchos.zip +LOST The Hatch.map 80115546 16291940 262144 32d6d57332420df8c94685a99098844ee2609b5c halomaps:1677 +lost-castle.map 37A13BCB 67201291 262144 d26e208a37f7d335e7b6a0a82ce7d36d403d97e1 halomaps:5855 +lost.map 25AD41DD 18906680 262144 3a697b763a732980337ca242b767674784c2d7d3 halomaps:364 +lost_at_zanzibar.map 60C70A3D 87966518 262144 ddb07a88aa4348b6900ba2447048d7c8f7c55cfb halomaps:2082 +lost_at_zanzibarv2beta.map E16D9BF9 111061634 262144 66befdd81e453061550382b757d0f241a80eb6b5 halomaps:2092 +lost_halo.map 27AB7BDA 126044436 262144 5700c8690d315cdc415bab2fdae10ffb64ef018c halomaps:4990 +Lost_Temple.map 4750CF46 349953764 262144 aa01ee6309d99c6cf427df578e33e49a397d20cb halonet:Lost_Temple.zip +Lost_Valley_Of_Blood_Beta_Map.map 9530CDC7 25552444 262144 c911ab902bb6da9991d1b66b1a0caf8ec2a97216 halomaps:2991 +Lost_Winter.map F1B00190 347701153 262144 1ec52cd53775fe5900254bdc3e5359ccc7d633be halonet:Lost_Winter.zip +lost_without_hope_ai.map 585227CA 34386423 262144 a86c58008ceebd2b3a9e1e2dd14eac73ddb9499c halomaps:4495 +lost_without_hope_fixed.map 4E52D959 33191249 262144 b21314bcabf7d4c751b456d072aa4dcfe347447a halomaps:4473 +LostCove.map B4D99BD8 24147788 262144 973e9a07ffcf9f92501fb9e1c567583832106cfa halomaps:393 +LostCove_INSANE.map F61AD74B 103371679 262144 da348e85fce1244bf84475fdb77a22b459f9afeb halomaps:3823 +LostCove_Race.map 08DE2CB0 24423068 262144 7e7a0a64c8993e1011728b2d7c6bee8d8034b7b2 halomaps:2799 +lostsquad.map 782C6B52 110595890 262144 d51fddcb12f12adbdbfe6554b209bbfa1a58d777 halomaps:6396 +ls3.map 2CB218D1 19930192 262144 d2e208a38569484a0d8c86df773b4ede64626fab halomaps:1085 +ltd2-Bounty-Gulch.map 00000000 70739844 262144 52510c8e51a59214ab3d9d3c26b9afbc6fa6950d halonet:ltd2-Bounty-Gulch.zip +ltd2ratrace.map 00000000 78104616 262144 2e67e0b6e85030dcfd42a73e550c713b0504ab5d halonet:ltd2ratrace.zip +lucidity_alpha5o.map 1BF02BF8 18540216 262144 8c781386b43568a0139be29d94733c9f62de6fa3 halonet:lucidity_alpha5o.zip +lucidity_rc_b.map AFE770EB 26269440 262144 1c4102a8af35490886c330201fffb8fa70343f7e halonet:lucidity_rc_b.zip +luigi_raceway.map D978D3EA 24015592 262144 c9db6ae76b54bba4bca223f23c81e143e3948067 halomaps:3708 +luigi_raceway_v2.map CE2BAE1D 71279104 262144 f6cda034230133a7803ff7c9692f78274fc6b12f halomaps:4474 +lumoria_a.map FF5E6EEB 274873434 262144 d76ff6d12af8820de28c2b32ee41a4c43f07886c halomaps:6503 halomaps:6507 +lumoria_b.map 231AF796 228054210 262144 88fea378a62116bc3d74deda35297d00a609fef3 halomaps:6504 halomaps:6507 +lumoria_c.map 38455729 198269022 262144 1eb859401cd168aea6cf23911d24944f01e2d96a halomaps:6505 halomaps:6507 +lumoria_d.map 5EB11819 191220134 262144 9f54fbf63e28937102280ff344b76686d55a5e1e halomaps:6506 halomaps:6507 +m_downrush_h1.5.map 6E17F56D 13807340 262144 c26df79ebeea4ca09a21d10d33b5eb0cbc0b9e3d halonet:m_downrush_h1.5.zip +m_mlg_amplified.map ED828CCD 129461625 262144 129bd9d1dd26216e58191cb5b8be76294eee8f64 halonet:m_mlg_amplified.zip +m_mlg_amplified_beta9.map EDDAB839 108844211 262144 5cdebf2b69d929c8de704e2102d98b41637c63a4 halonet:m_mlg_amplified_beta9.zip +m_mlg_amplified_fix.map 7E706156 126745564 262144 3019766484fe84eb6195ea12574d8027a7c6117b halonet:m_mlg_amplified_fix.zip +m_outbound_h1.5_rc3.map 99A29106 14951944 262144 4375ef2b9eccc109c2a87a34a21b0f81c95fb697 halonet:m_outbound_h1.5_rc3.zip +Machinima_Bloodgulch.map 2CA18C43 100661284 262144 fb6a4727dc4e6d2f0909de86b5ecb13dddb1e3fb halomaps:4517 +mad_canyon_beta_v1.map 280050B7 12938400 262144 20c6962571ed3759932b26afd94ca624d94cb68b halomaps:4252 +mad_canyon_beta_v2.map 68604A46 20955316 262144 8f8056c44afb27fd11d305002b454127610a184f halomaps:4253 +mad_scientist.map C26D5BB1 16138088 262144 11bbc9367bf54a1fe367bb55c3bc3737bdfee518 halomaps:252 +MadHouseXL.map EE7FA9C8 13127608 262144 1cd050feecfb17ba55f23bbacd739263f58d5d3b halomaps:254 +Madmod.map 74648966 41788752 262144 7185b2c750935a9c2eb787b227148558c0768fb1 halomaps:2242 +madnessp1.map F812F7D1 90169198 262144 878c3e234c9f81933eca94f88e6118d190fa556d halomaps:2008 +madnessp2.map 090AD3F4 84046205 262144 a08017c8d12a047642281f8d2ec0cced4707eea4 halomaps:2033 +madnessp3.map 84A36C96 103237264 262144 bf9585991cbf4e935959cfb1199c2dc119823fbb halomaps:2068 +madnessp4.map 96E288DB 100434303 262144 1eef956f4d32d1d59dc3edf6eaf33a5485e88afc halomaps:2172 +madnessp5.map 06655A17 91279593 262144 f0f7338ef66fea06d01a00c94764976a10092503 halomaps:2272 +madnessp6.map 0EB227EA 91422281 262144 0a68b2f8368553288d4b494e01c6bd16820515df halomaps:2558 +maga.map 252EED6B 28785143 262144 78b70915f0767dcc6699ac8c60cbd0123c00ed38 halomaps:6838 +magical_torus.map B3DEE66C 12225136 262144 410d429772936a6164d10e8c1b105ff2edea04be halomaps:5104 +magnum_test.map 224F013F 61765688 262144 c1d2ee3b6ce520d77d971554e45e4c0040976b75 halomaps:6972 +magnun.map 591F338A 16933798 262144 a9160decfa0e9bb2ebe56d547a0d0032f7f8b1ec halomaps:6703 +magnus_trucido_ai.map F91C956F 20426429 262144 8e8087ac8b5820890e2c8a0a9f966267d3ccc15a halomaps:2321 +Majeek-Island-BETA.map 42499DAC 26171712 262144 849b079ef82fd604e6b3f5d0c726029ae37e568c halomaps:3259 +MajeekV1.map 0C8B1F6D 42619520 262144 b95993ae318e85052c0d935c78f4d3331059643a halomaps:2691 +Majestic.map C056F2B2 16546484 262144 01428615d416eba790b457463303c30aa48ddd75 halomaps:1296 +Majoras Mask.map 939EB752 44687612 262144 a90b7cfa3d3b0333b75ebec154976baa676c9916 halonet:Majoras Mask.zip +maldey.map 409C0A7B 79158481 262144 395d4a481376a23991f57551036831f978353ade halomaps:5173 +malia.map 9E788428 39510279 262144 00dbf7ea072e1d998cf1cfc6f88a111361c1b1a2 halomaps:3792 +mania.map FE948945 31071629 262144 257dde55beb010424591b2f6a9a4975e144df26a halomaps:3360 +maniaccreek.map BCDD8199 380910082 262144 d2a4f8d5c7774b9ae72fdb5933abdf19f9c622ef halonet:maniaccreek.zip +maniaccreek2.map 97EE11ED 361199183 262144 57d1d4dce0a9bc413d7a4b7f67068b1da3ef55e5 halonet:maniaccreek2.zip +maniacgulchV2.map 6827834E 53767123 262144 2cb11ca9b2d20316d1a424432c4dcc6e710bea6b halomaps:2671 +maniagulch.map B4922E63 71771770 262144 59d2262d7f563a78aebfdfe196514415067ebf3b halomaps:2637 +mansion.map 14555EEF 67664394 262144 78d36dd41567a245c12f372c5f40078cef236c5a halonet:mansion.zip +map.map 123D8E95 12879932 262144 6f671eaa8a1a64b02d9c1adbd2a27ca2ad7f649d halomaps:1684 +map_room.map 1AE8A98C 92808811 262144 e58f24e9a95fc8a6b5cb369336110a696049b561 halomaps:4265 +mapa001.map EB34E73A 62476017 262144 dd384b56ff8719929ae401c7696f325e1b3f955e halomaps:6064 +mapCE.map DBDE9E1C 57145459 262144 00b1145ed9d8961d0f297ddf27c4f3c1a023c59b halomaps:4496 +mapenjoi.map 795B7BCE 13679456 262144 47f1caab77b4ee63888a3fcd61680ff350b0e5a3 halomaps:2692 +March.map 2E074AF4 14790673 262144 9f2d9341f2ef0ad60fbf6fa364ec594fa1001c09 halomaps:1301 +maridia.map C30D09E0 58950356 262144 6c1cb53329b96d2ebd32800e424ab1c9c0b4bb47 halonet:maridia.zip +Maridia_Public_Beta.map B93098F5 52993589 262144 a5b7cca7b8d4058170998ce610054af68b7406c7 halomaps:4869 +marin_infeccion.map 112FA735 241636322 262144 982319f326b2d84785401a3eccb2ff92e6160866 halonet:marin_infeccion.zip +Marine's_Territory.map BCC8A7E3 51592654 262144 f4d1aae182da250e652dd75c6ebc566c14bf5f0a halomaps:2438 +Marine-color-war.map 5E92AEC1 81652874 262144 dd256b61f5309a582e41f37e0f820a02710671bc halomaps:6247 +marine-covie_fight.map 56E50414 115374259 262144 9f1d554bdf0b8ccbe2b6920d9faf53f35f23e683 halomaps:5408 +Marine-Red-VS-Blue.map CB16C0DC 57450225 262144 89515fbb5b2facfe7e1eda8bc5a27fc30fca9acc halomaps:6252 +marine.map EE4A5866 56449301 262144 316a0024ebb65f9cce66958a1fc03677378a36db halomaps:5298 +Marine_assault.map D956BC24 53149517 262144 6df989a330080efb6488637de723aa0f3fc45df5 halomaps:4601 +Marine_assault_v2.map 66C0C498 64947905 262144 3395b400e9cc6f23bab618210ea9ff6c3329a883 halomaps:4602 +marine_vs_marine.map CA6A5842 50241827 262144 82d7e9bd2330ab3961cd5e01faa0cb024c0018d5 halomaps:4586 +marine_zombie_gulch(beta).map 217B736C 98251233 262144 5d585140d4e0af479ab0777db268edfd3875090e halomaps:4971 +marines_vs_covenant.map 14CFAEB6 67939061 262144 e6432f25e737a1e7693004a756f92d1d4f0be30b halomaps:6302 +MarinesvsCovenant.map 19F61F57 343017619 262144 22f07eb471ede6e3f8f3cfc57d4c60b27a05126b halonet:MarinesvsCovenant.zip +marinewinder.map E30EB56F 50496920 262144 ebbf5215b0b39a8cc4e54f5f339eef48477f51a9 halonet:marinewinder.zip +mario.map 96FEAEBA 15804352 262144 b237fb4f86dc0af1568ff7ede2e8c86eeb721a6f halomaps:443 +mario64.map CF3B53C0 14220740 262144 111ea974a17b8a2b3039e12cd913ef2bc7b82f6f halomaps:3384 +mark_of_shame.map DCA18B00 27565493 262144 b56ecf84de9ac8df2e7db972facd93f96d21069f halomaps:3965 +mars.map 910CEFFC 16870120 262144 f5cfa987833bf345b2c2a3da1338ca78bef3c82c halomaps:433 +MASK.map 8E7CA49F 34939617 262144 c9ba16637f1184f560499e05fd9b6bae9c87f483 halomaps:1475 +MASK_INSANE.map 5FB447F1 68876259 262144 531e85e7d368c2c2c837ffb0f108682eb5d834f7 halomaps:3764 +masked_mud.map AF8E2552 15893968 262144 8a5ea223a0b45759fb631069a5458caa24eca338 halomaps:2992 +Mass-Effect-Gulch.map BD63141C 94259545 262144 506bf1b9cbc70331321defc6939e62a55c94e44b halonet:Mass-Effect-Gulch.zip +Mass-Effect-House.map 95AB78A3 64500094 262144 979ecca8836eb1840192a718ddba3e3ffaeb9ba8 halonet:Mass-Effect-House.zip +mass.map FAC863AF 40974041 262144 4522605e6fd58bcab79e47b57e825dd8bd321eba halomaps:1133 +massacre.map A7606116 14519936 262144 f7d8666b27ea50d686b2011a3119e1c8aef519bf halomaps:4158 +Massacre_Mountain_Race.map FB409E89 22732690 262144 024e05f8d4f6278bf9aa77547d6db7972facc2f1 halomaps:4444 +massRVB1.map 278C34CA 89190285 262144 4eb22083536c7e00588a95c26a6ff49d18b4b422 halomaps:5540 +MassRVB2.map 3E05411A 90425481 262144 394560e05b08213568ec940ff792462d26e7b44e halomaps:5706 +Matadero.map 2F891B71 369112955 262144 6e71711e212a788ded23f698ba268c4ee3d5dce2 halonet:Matadero.zip +matrixcreek.map 07B3876A 13097000 262144 2d02813a3da1a0e62838c82ca233e275e393554e halomaps:1006 +matrixcreek_reloaded.map 07B3876A 13097000 262144 42e086d9320ee5f20ff40299cf0b0966faa2b194 halomaps:1018 +mausoleo.map 5E8E7C49 21940228 262144 bf274cc446306f32461b7f524eab2a630433b31f halomaps:3551 +mausoleum.map B580DA90 29157326 262144 2da78bd46a569d2877ade4366b26d73b819c78b5 halomaps:5426 +mavrick.map 450D6722 13462336 262144 403d07bfb63070cc02ba78b0efbc14c5d150f40d halomaps:1934 +maw.map F6148A6C 71351523 262144 9d31e1b04381e9001aa41e06647752a68e67b11d halomaps:3341 +mawrun.map 2043B24E 131056630 262144 da08467a530262d6e88e5a3360af49f9f6b2cb89 halomaps:3616 +mayan-forest.map D08AB15F 24736116 262144 1edbb15533fb6343b0867531223a372373884cf1 halomaps:3793 +mayan-temple.map 5A72B30F 20708488 262144 d63ab5ea676d93a8e5670e3d1b1dbea10f3a22a0 halomaps:2069 +Mayan_Sacrifice.map 3E1111EF 26350536 262144 48b5e51619c975d809e6ed187f1966e189e64eba halomaps:2721 +mayan_temple_beta_1.map 5B100678 21921224 262144 493442625c9ad6fa3260c7d6702b32ad3dbaf2a7 halomaps:408 +Maze.map D89ECAC7 12398724 262144 68e75ec631528b7bd71a15ef5f54d39e8ed5f98b halomaps:5928 +mba_canyon.map 148A26E8 45194586 262144 70a86fade60c7c91552b552c8090e1dc500a483d halomaps:3126 +measure_me.map 3AFF1961 26022085 262144 71505ea548dcd31b98dc079f22848d6a1f200c8f halomaps:6457 +meatlocker.map 20C8C071 13229000 262144 83e2a088a6236ef219e0311755ce1dff7c8991e7 halomaps:255 +MeatLocker_Race.map 79DC52F9 14929488 262144 28a0567887f7fceb0a919668b7544fabc651c4f2 halomaps:2414 +mech_gulch.map BB382B92 17323736 262144 16d7bd13dffe619468879f0e863d9004abf7cd48 halomaps:3208 +Medical Block.map 84257719 44353033 262144 e1eaf7e941b6586aea8784b4e3a3adcce1ac5709 halomaps:6179 +mega_zork.map EA79FC14 217702346 262144 01f4e254b94ddea965c8af0eb1571779317cb0cb halomaps:6593 +megadoomer.map 6A44AA37 15257052 262144 1b5119a5c6d04ed9ef5b8df4873490910f48c42b halomaps:387 +megastunt.map 72169ECA 19268840 262144 e00c1b8c5e2a7c1cbdc1f591b0828492026db0c7 halomaps:1811 +megondoombox.map D3EF88EF 12709378 262144 b8fc8bad1666c1508b0cf5a5f0462ff2da9e2404 halomaps:6023 +meh.map 0C98791C 27120613 262144 c0ab73d822d74891d21406d45b443f55f6779de4 halomaps:2009 +meincrapv0,4.map 4EE5F4F6 28624235 262144 ee8ccbe6a722eb25ec2ca7e5e875bf290685d35b halonet:meincrapv0,4.zip +melee.beta.map DA66AA37 14957956 262144 c35b23cbe4fd83f255f382c048ddd1b52c2f6eab halomaps:473 +melee_mania.map 1D1AB4FF 24387333 262144 4642dd90ec30c1d3509a2a9c383d07264fb66895 halomaps:3260 +memory.map EDEBF2F8 21962766 262144 910bc555f7f0822efc67c4c9f4ed2be5f16c0c2d halomaps:4719 +Memory_Alpha_pb1.map 00000000 258911428 262144 59b990b518ea990d34e2bad4727b9427662c71c9 halonet:Memory_Alpha_pb1.zip +MercenaryGulch.map CB5FF112 46307764 262144 1e94f97ec2fe5b9d3c319392e43921b35594489e halomaps:4843 +mercury_falling.map E8076789 68761121 262144 f60dd1d151ad258c89208fa36ddc7dfed1080ef3 halomaps:6216 +mercury_falling_3.map 00000000 326841632 262144 98bb0057565e2c73d24b89cbed7c864b839847e2 halonet:mercury_falling_3.zip +mercy_is_a_problem.map E2279F21 20387524 262144 1639d2a95062cc04751964042221149c464b44dc halomaps:3125 +merkfalls.map E96E0A06 28385840 262144 c86edbf9ae8274328b4b0e801d3952c230a02dec halomaps:321 +mermaids_plaza.map 50C34AA9 81399050 262144 a9e4a933a2d3b436844d621e43b2534e64aa6b5d halomaps:5899 +Merry_Xmas_Halo.map D979EF51 35473544 262144 2d73c40139ab3e0cf9e19b930a4f4046dd4d2174 halonet:Merry_Xmas_Halo.zip +mess_armageddon.map 15ABC152 56099747 262144 f34ac0a8ce507b619a6e33e2dbd351c930fb61f5 halomaps:6428 +metabox.map 478AF5FE 12589328 262144 14a98ed0bcf37d726dd075a4ca071b1528b04c40 halomaps:4095 +metalharbor_beta.map E6FBD13C 13246992 262144 2c28218bd8d4547553211025c1757f6ea34e1e5f halomaps:1812 +metalicarena.map E0B237DA 15001620 262144 058538b497334e0291911d11bfae41c20ea80504 halomaps:928 +metalicism-x97.map DF65B48E 20132523 262144 20d10ec5f3a459ab7251145c3925eab338114de5 halomaps:1086 +meteorgulch.map 25F813B8 20662250 262144 ce18117ae482d9a27a185c6b9f91ecdfcb734271 halomaps:2322 +metrobyte.map AD15BF71 198181396 262144 93e15f4091d6e25a86c982c5bcd7e7e164f92b3e halonet:metrobyte.zip +metroid-processing-plant.map C529E508 58194084 262144 8b7ad3ffbb972bdd17cf258a91f0a77b3341d09c halomaps:4121 +metroid_invaders.map 9D3A427B 41979544 262144 d433ffca651515ab264c8b426cae6930a11852ea halomaps:3879 +Metropoli_Assault.map 1A28B674 250685384 262144 351087b0f55cf81ddca92a3a54bad0306957991b halomaps:5409 +metropolis.map 55F8D86F 13258880 262144 01c712fdc8259c2e14b24bf7eaed3f81bb69a3d6 halomaps:870 +Mexico_Deathisland.map 95D6F022 50994267 262144 df81ff4b5a287a9dbcf87b2e9001a7899cdde20c halomaps:5689 +Mezmoriced.map C1944313 64164582 262144 66c4b947c5a955a50c0073635e4d8dee20607daa halomaps:1970 +mgulch.map 2FB19FB5 55753831 262144 5b120dfbfdc88355827190717c378c4693b63651 halomaps:3071 +miasma.map 0E33353C 127900795 262144 7c325873560d50ac22a84f7f5f5f6752d8bdc524 halomaps:7009 +miasma2.0.map ABA84A4F 111318323 262144 928ec63b87432d5e90e4efd0529c52e0d73bc6f4 halonet:miasma2.0.zip +miasma2.8.map 45C22F24 115644510 262144 23921e977c02b9984e676b7643716caa8e6e977a halonet:miasma2.8.zip +miasmapb0.9.map 14360AC4 96885602 262144 b7ab17ef3549c0c82da97ba4c26d3f8058cfa256 halonet:miasmapb0.9.zip +midas.map 5E36F254 17234284 262144 1cd7bdb455eb459f62124bcb0717c958dc9251c9 halomaps:3050 +midevil_arena.map 03E83EBA 19778612 262144 163d8788bfe5d1b407120239fc249793e66bf4ba halomaps:927 +MidSali.map 71E2B9B9 33787328 262144 a84855e8e93a34d06eee36a3096f6077ffad386f halomaps:5757 +midship.map 38C808AF 18222084 262144 fa254113e28f18eeb85c1ff93a2c7144758d99ca halomaps:4057 +midshipAI.map F269EBE7 58280642 262144 01459995a51e1d944a6773cf002dca2a65a720e9 halomaps:4133 +military-base-alpha.map 160FC059 48893031 262144 d85eeffea4d3aba45ec6d0da9e06f3e7e74ad5ec halomaps:1856 +Minecraft.map 36E93484 293637789 262144 538fa43d9101d0fd59efa4c47cfb531081f031c9 halonet:Minecraft.zip +mines.map 1D589247 16684544 262144 46c8ae325d1f3d685990c5916a472948bb88883f halomaps:1297 +mini_guerra.map 4483A0FA 93238759 262144 f0f4326692d4c5f3bf2434058fc2b95d29145472 halomaps:6065 +miniforest.map 52532100 73620846 262144 c542cb88af3920feb1b8eb92da7a91211317414e halomaps:3731 +Miniguns Damnation.map 0FBA059D 14006880 262144 beca795ad746c4ce5a7c68ed4d70e7d5c2928960 halomaps:6556 +ministunt.map 3D4100C9 27035920 262144 7b4e31e93b0939344e009375eef12c959d9a1f4c halomaps:746 +minizone.map DFB6493B 14207420 262144 148c9dc74bfd38dba8667c26e2c07de77db99e94 halomaps:5007 +Mirror.map 436F2A44 18441245 262144 234b7d4678b0bae781366d9dddd82259e1db1de8 halomaps:6009 +mission.map 8579902E 15252293 262144 13de85952c3545b45126af8ae59e9b471f2fa6bb halomaps:925 +mission1.map 7CA936F0 112838688 262144 60d05012196f635b7dc234772931b0416162d1dc halomaps:5532 +mission_battlecreek_beta1.map D05CEBD1 86604947 262144 04511983fb491b4f363b7d7c47b3507c9578eb44 halomaps:3941 +mission_beavercreek.map C8CCA670 118000627 262144 193a467a4fb60c7490ec82a224a1ca5d57c12cf7 halomaps:4123 +mission_rio_beta.map 653C2CBE 67481574 262144 f2ac06cd4f5c18e2cd4c966be462c7fd1cea45a0 halomaps:4336 +mistylagoon.map CB56D5B3 12663364 262144 34598365670e6677f82d0bd4b6d38d087b382d28 halomaps:256 +mitut1.map ED44E52B 12256444 262144 428b5195d60b4a522fff2c47d8c726e56a91e8d3 halomaps:373 +mlg_amplified_kadem_mod.map 572BE5AD 55355015 262144 968bc8fda86af6b91817a9535c4f60217f90c43b halonet:mlg_amplified_kadem_mod.zip +mlgwizard.map 36AD3E67 16455976 262144 bde1cee643c6a49c902758d669b09e864a546dc5 halonet:mlgwizard.zip +MMT.map 4CC0C146 13891744 262144 1c7e977f60ac7aa1d961f208f6407d72b850d2a9 halomaps:1497 +mmt_sandtrap.map 314DABD1 51603327 262144 53d9f7cc6ee261e42f933aaf44c87031aef51077 halomaps:4343 +MNL_bloodgulch.map AF1915BB 46554426 262144 ce184ced916d0b4d5e39c7ec4b0e166976bf7a29 halomaps:5610 +MoD's_boardingaction.map 989F3BE0 90026060 262144 58ec3c3b4e87d3ed115ad41214bd1ae36a216d56 halomaps:4913 +mod_pistol.map 695DDE84 190697830 262144 09ceeaa82992295394e997609dad49605a464540 halonet:mod_pistol.zip +Modbloodgluch.map 130F5BAB 16468057 262144 2d7ea191d56dbd6c591bd94d9d8cdd7a1134dcd2 halomaps:4940 +Modded Deathisland Me Beta.map C3B30FDE 132427845 262144 490916c78ea02c05fbd421798ef85b290a9d4301 halomaps:2957 +modern_cov_invasion.map F01CAD80 95506648 262144 8a3f4823ae87c590b475ea043175e3a9fe54b6b9 halomaps:5488 +modern_cov_invasion_no_ai.map 22EA36C1 51596829 262144 43d9ce0c580174546b60e2b3c783f4df563cac85 halonet:modern_cov_invasion_no_ai.zip +modern_warfareV2.map BB6136E0 67297659 262144 3c3c1b92004b74bc42597291d29f03e980409578 halomaps:4122 +modern_warfareV3_the_outbrack.map A00598BD 98603080 262144 9339aff9c9d86fe91c38d416dc6d9a5e10399f9e halomaps:4767 +modservatory.map 8440E901 44005301 262144 980477a16191f1f4e5461c9f1611a9c37afd3c6e halomaps:4199 +Modwinder.map A35AB192 16834804 262144 f2577b105d85bdb87568f902358e0fe7300fc037 halomaps:3320 +moksha.map 4C35EB48 18213632 262144 3dd34129610bf26d44682617bcd00d2b12823bff halomaps:1598 +molag.map 72561C80 19023788 262144 7a5a7ae445e108a13270ee25ba5f377970c8374a halomaps:2306 +Mombasa.map BDC5BFCA 400144531 524288 f230f2ae5d59c4436eb47d6ba484996c1df6c998 halonet:Mombasa.zip +mombasa_aiv2.map 95D8A51A 363979982 262144 82308c357495d621a8107e26334340e624f0becc halomaps:6902 +Mombasa_Race.map 8E0AF69E 44692609 262144 c4382fef80d61687155c4c36aeeb71371993b18f halomaps:4290 +Mombassa-Cops-and-civs-version2.map CAFAFA15 117293910 262144 d80a27a049e70b3ad4bc5accee13a6930355e78f halomaps:4557 +mombassa_cops_n_civs.map 117111FD 110905389 262144 6d7cd7f9897cd9555c0f9fd66ead08f9104a0813 halomaps:3646 +mombassa_cops_n_civs_v3.map 221D64DF 175415306 262144 f68803e6c4959786c92f6edcb96f7e77899e2f86 halomaps:4941 +mombassa_rp_v3.map 91BBC99F 132450148 262144 a64b0daf3ed1400f54036380a462afb429ddffd9 halomaps:5247 +mombassa_Rp_V4Mod.map EE87FF3C 125915989 262144 0d767b7fc7c4cf8fc3d72cfa8f32411f583d7e07 halomaps:6536 +momodgulchbeta1(redone).map DE9D4095 41583434 262144 a21eeddfe6123912f9b04313d727d980736bcdfb halomaps:4871 +momodgulchbeta2.map 4B24CE1C 50705402 262144 958bc83017829753c202d8ebb8bb783a7238dbbb halomaps:4972 +Mongoose_Point.map D3AC367A 55509181 262144 93e832019dfd088621eaa2e685b5ea3e2788b64f halomaps:5064 +mongooseheaven.map 0A31CD27 13118692 262144 4be15a22e3ee18cc260beae7ce964f2bfc680629 halomaps:3443 +monkeyrap.map 1681AC37 76625825 262144 9c536d15b0d110763291c660a04d47d489fdedc6 halomaps:1710 +monolith.map 386278DA 13575384 262144 65a22edc4581c40112036d403127b17797fcb0f3 halomaps:6903 +monster_jam.map 7210D286 23255217 262144 f956f47c9d387f4a73ae064d84e977774235cdef halomaps:4200 +mont_st_michel.map 83A0A5E1 31440606 262144 72e8442cbd68224ce42d37488046b5d5a126864d halomaps:3124 +moodbkwds.map B712CED9 22725100 262144 23b303708a8d27fb6cd9c90bbcb01a6bc52a1545 halomaps:5467 +moon.map C00F9C08 13605204 262144 2ef52734b0f5ed2c621904879c6e120d7fe2c7f0 halomaps:257 +mooncrater1.0b.map C1044A9D 18502860 262144 695ed1a08c3e3cdc21852e8fe34487415f0c9f4e halomaps:3432 +mopup.map 51C80B53 49217405 262144 0a4b3d94321a46dfa38a9802a393178cdf328f5d halomaps:5357 +morbuto.map CAB55DC4 72739611 262144 1bb7925db1d681613de44892cb29b34564cc9ded halomaps:6839 +mort_agr_ble.map D811F360 46068857 262144 ad3e9a7e5a085874d516800508a238ddd0f8cd4c halonet:mort_agr_ble.zip +mort_agréable.map D811F360 46068857 262144 65e4699a757e25aaae23c836c1b51f2ba49a003e halomaps:3123 +MortalKombat.map 30EA273B 107669438 262144 52746dc1a2c433938f27e5d1a82d3279a75c96e0 halomaps:6594 +mossgulch.map 92BA7091 43588893 262144 d41f2d907f00b5b5707ad92255566be6edaddc16 halomaps:4033 +motor_head.map 1982CAD1 15290648 262144 36a39bd3584f6a3039c6fab201541bbf3ff96372 halonet:motor_head.zip +mount_retsinis.map AFEBED54 51965769 262144 ad9ca8e93579dd3b6841f202e5e56d142f304f54 halomaps:3051 +mountain top fixed.map 9C09B9C4 46059601 262144 12870f4a39e8eb88b8963be8e49ef271c1810f05 halomaps:1460 +mountain top.map FC58138B 51493409 262144 a3971cea101b2a96b66d47c752201cb64c8d07d4 halomaps:1420 +mountain_king.map B280C002 47310443 262144 9f1d1df4b4fbc904fc9c314b113302ddf8c44b64 halomaps:3342 +mountaingulch.map 49327690 23997325 262144 51595a0892e7aba5b86b2ad51d1d0aacbc8fa90d halomaps:1637 +mountainisland.map 8DF2C3B8 13580206 262144 f9d1631cbc7f2d12cbf495e131f885c630dfb90a halomaps:258 +MountainKingdom.map 72CBBE5F 13351628 262144 c5f3c3a21116820894d2879c7f59a50b465cbbe0 halomaps:4219 +mountains.map 662CBA88 27611108 262144 e758a2d74ce4fa9d38ac85d5713a3928076ed54e halomaps:3552 +Mourn_the_Dead.map 09CCA7F4 387165579 262144 2c39be278094966265d0c1ff880edb4e4a9acdd7 halonet:Mourn_the_Dead.zip +moutain_cliff.map BE51C150 16510960 262144 77dae5f725466dc1358375f4fe2984582646e7a3 halomaps:3445 +movieset1.map CEA36F30 117556013 262144 5992f9dc40b7132f8c0779414c31d1d873ecc12c halomaps:3343 +movieset2.map CF6F9B14 118845049 262144 75f06c29d9f73d758fce148458f0c47503c4d4a9 halomaps:3472 +mp.map E5578419 14198432 262144 7093c107498e0c6bf6b24c36df992437ac979974 halomaps:6537 +mp_aotcr_b.map 3C15D973 18836201 262144 723005b84c73565e27a15daaed9b4cc6ac547d73 halomaps:259 +mp_secret_mision_1.map D3792681 111241368 262144 c6cadf57807440fa2266b3a391f501898c4481a5 halomaps:5867 +Mt. Egnever.map 7D5DB3A4 18360032 262144 c9b564f1fd35e9c82ae2dccc5cea07bf02a1d38c halomaps:2530 +MT_cereal_bowl.map 259EA970 24743947 262144 7912fc6435097897cde919c19d04e4a67ba2ee64 halomaps:2285 +mt_dementia.map A205ADD5 20951979 262144 44aba605d11e9b6b712fe2454a82f55ae98a262f halomaps:260 +mta5_bowling.map 52D7D02C 65003582 262144 1856fd1317ef6df41b7a0c79fe318a22425861b7 halomaps:6538 +MtEgnever.map 7D5DB3A4 18360032 262144 eaeecb82239b375717c696a930199154444a8c5f halonet:MtEgnever.zip +mtm_emile.map 86819541 138847457 262144 fbe0d621dd92312e54dacc39a3df8ceca877d1ee halomaps:6198 +mtm_mario_bros.map 3EE224FC 62726474 262144 abb945b0006d662daf419a58e35282d46dac4703 halomaps:6150 +mtm_paradise.map B42905C4 114136253 262144 25e1df985537262b527fdc62ca8808691e69cfc7 halomaps:6049 +mtm_reach_hangemhigh.map B1B6408F 129237188 262144 02409b021095fee3eb4686416577ab47b44f33ed halomaps:6066 +mtm_reach_hangemhigh_v2.map D571427F 141602445 262144 87303dee699ef82197f99e48487aa3ff4bdd6aa8 halomaps:6199 +mtm_rock.map 020C998B 112510117 262144 011ec9ab296331a7f96396d104c7faf3f65f015d halomaps:6050 +mtm_silent_hill.map FD197D41 160498085 262144 d52c1bffd748f21ce23ce3b0853cf29d42c3449a halomaps:6217 +mud_skirmish.map 911C766B 187569298 262144 b2b1dc4417dd0e1fe0be3197547ca6d442fd06b0 halomaps:4903 +mudgorge.map 7E706156 38991596 262144 a3badd4976c9a8aa01c2ec5a1d980274f8b803d6 halonet:mudgorge.zip +mudhole.map 09D7A304 21161301 262144 3e19c58dd99d240ccda7abf8e8d1a8cbe0fba686 halomaps:7070 +mudslide_ai.map 87F99439 84923442 262144 8d589f34adc19770be9bf68618ceb4e533fcb803 halomaps:5786 +mudslide_INSANE.map 3BBDA550 81841705 262144 5b0f180529f6def2175b88b8fb57d15585bbff97 halomaps:3661 +mudslide_INSANE_fixed.map F055A72E 89679807 262144 7f5ad2fbf5f3010cf147c82b23af366a2ce5ecce halonet:mudslide_INSANE_fixed.zip +mudslide_INSANE_v2.map F055A72E 89679807 262144 c304c2b9fb0c4d6a0ec222df238a9a701274d793 halonet:mudslide_INSANE_v2.zip +mudslide_INTENSE.map 10DE3FA9 99017823 262144 06664f53cf2c82bfbda6c08b7032f638131c616d halonet:mudslide_INTENSE.zip +Mudwinder.map 7D01B837 29344781 262144 29ad3364112e27ba7d2b574f6e0137d6b0667bec halomaps:5065 +mugglegulch.map 7B309554 13936092 262144 ee41496bc3964941c360200aa3407fd6aa474a37 halomaps:5129 +mulgore.map A7EB60BA 13208316 262144 47befafdb6f1722c4c0d40f17714ea6f6226b0f7 halomaps:4603 +Multiplex.map EC3479FD 14007628 262144 6f4352265024e85da9ed2d058eeb3403b37a6180 halomaps:527 +municipality.map 402D5CB0 32477596 262144 96b3dd7d91ec679cb02e53d18a577c18e9583d38 halomaps:1700 +murena.map CBD3CA5F 27383149 262144 0fe3a7c36276e0d2581cdbce408b8969874cfdc6 halomaps:6067 +mus__sexe.map 10976F8F 49744133 262144 f19a8fde9c0ac5913083e60978e648c3c00c246b halonet:mus__sexe.zip +museum_beta.map D7830F57 13029340 262144 6253d5cb50ec570dd04bf66cb64fb4b76d7ff950 halomaps:1813 +musée_sexe.map 10976F8F 49744133 262144 5f030a0a1769f90d44cafb6ae52a1b143d714d43 halomaps:3186 +Mutations.map C30084AD 155854523 262144 38f1120dc96af46ad2cd206c9f97c5f8ea562d16 halonet:Mutations.zip +mute_city.map 2B59DF3E 34608196 262144 d5c3abca9c5ec111973876f4b57e3582d4b27619 halomaps:5468 +mute_city_beta_2.map AEE8E01E 36330428 262144 038066bda666055e4e757c9cb4522ee1e73a3558 halomaps:5504 +MW2B_Warlock_BETA3_PUBLIC.map 2DD950FD 85048176 262144 14892fd713e24db3a6ff6646d3c99b81cb34ef4e halomaps:4220 +mx.vs.us.snow.gulch.map 00000000 126561189 262144 5de79e0a2b1271cca1815eca1172249ad441fe28 halonet:mx.vs.us.snow.gulch.zip +My House Is Bugged.map 4F63686E 343684360 262144 0e80acad4847d937601a2720fb8c97683e08d1f6 halonet:My House Is Bugged.zip +my.map 7465B68F 13896072 262144 b937d6bacdb0a121ea2f3bc3ddd9dcc90cf3deb9 halomaps:1087 +My_Big_ASS.map EF30A8B8 222474540 262144 875b607d5838e5c57dbae36f508860737cfdef91 halonet:My_Big_ASS.zip +Mystic.map 63DDCC61 67961704 262144 a88b1520403500ac9f6d304278203034e76353d6 halomaps:2192 +mystic_classic.map 8C9C9E4C 38314996 262144 5d4fc460d1468264cbf64310ebac1c82ea47c084 halomaps:2195 +mystic_mod.map 0001BB29 41687720 262144 047d22a988e449d55811eeb90642428ec0397088 halomaps:2819 +Mystic_Revival.map 434A7748 142759017 262144 e086e6a348b3aa372208e08c8336cfead8c4faea halonet:Mystic_Revival.zip +Mysticruins_beta.map E9D5ACA3 24925968 262144 00a76e09172ee061fc41136b836be020b898db47 halomaps:1551 +mythic beta.map CE3BA598 28855372 262144 fded14c61e25610847599e33097bebfe622ae822 halomaps:6151 +myzanzibar.map F55EDE2F 97050437 262144 4567124c518805297c09006edfd61c986657dcda halomaps:3261 +n25.map 78A35FF0 74843205 262144 b43d7b56706335973e80b0a47ce2c5c1102c4c9f halonet:n25.zip +n35v.map 1CF8C923 267176461 262144 4566cdb117d053cba3baba6db1ee189bf3ec0bc5 halonet:n35v.zip +N40.map 08654880 165001220 262144 f717965b283f0833413c1e34ab7e003dacf6fdef halonet:N40.zip +nabane.map 567C344A 15028852 262144 2cfb466ab9e08e5d0c9178ebe80a47f9a5cecd18 halomaps:307 +nabane2.map 39A83DD7 33778033 262144 b7c7e0672dc2101368073b7045104c3af8b5de00 halomaps:498 +nadewars.map 38FDF72F 18475407 262144 04c54ae719628310c2ad23b644bb5140a89b4a79 halomaps:4844 +nadewars2_unleashed.map 20A56AE9 35946359 262144 45465e22285e47b501ebfc40e63d3fed74d276be halomaps:5427 +nadir.map E1950BA4 73260036 262144 88cbdb859eb9a3fea019eee13c90bc36672cb0b8 halomaps:4690 +Naked_Blood.map 8755E26E 125219860 262144 c3b892b9921fa8747c694acc7e74353a8bbcc47f halonet:Naked_Blood.zip +naked_bloodgulch.map 5EA3D576 206205077 262144 c3f5d3910caa6e58bc117f937634242d2a31027d halonet:naked_bloodgulch.zip +naked_icefields.map 954D8AE1 76680511 262144 9745ac9a4698f06bb0062702cd5e4556106bc622 halonet:naked_icefields.zip +naked_insomnia.map 00000000 187630292 262144 c32a0b0335082a08dcd4197224aaf5cef67bebbf halonet:naked_insomnia.zip +naked_obsession.map DED81E94 111354451 262144 6569b3bfd6c86dc87a5a3525022a5800c2b9a8f6 halonet:naked_obsession.zip +naked_presidio_mod_05.map 00000000 230332041 262144 f94251f6626d5deed4164957a2afcb2a8b557382 halonet:naked_presidio_mod_05.zip +naked_sidewinder.map 5618A0E5 14852232 262144 fb0f69d037f3642e8118c3b647ed9a750bbf0d67 halonet:naked_sidewinder.zip +napalm.map 0402A348 96386000 262144 7ce46125cc453ef4bddde38a3660989375ba1156 halomaps:4311 +narow.map AC08CAC7 338630878 262144 3f713609fe6678480e5d4029793e2b7a1fbff51d halonet:narow.zip +nascaar.map E423E1B6 20577356 262144 8c768713882be0667d0c5aa62077907b2a414b71 halomaps:1260 +nationalpark.map 72FB73F0 25674390 262144 c05ee0da30a0ed3eb3de535b400e5bd43230a577 halomaps:3647 +naval.map 85679296 22321767 262144 9b88b8303b173266c9f6419b97405ef7972723b5 halomaps:3385 +navidad-grunt.map C384EAD1 84702955 262144 0a8a20253dec74e5978aa064a7015b78dde55fa4 halonet:navidad-grunt.zip +Navy's_playground.map 8D7AF9D7 40908534 262144 db34201cdf386355abf9adb38398bdf2e6eaaae1 halomaps:4622 +Navys_Revival.map 1A3719AF 46399632 262144 dfd0237db83b85143385bf57dd67d433d8cf704c halomaps:5008 +naz_gulch.map 8D841307 56043146 262144 86bf1e1f1eece7cc117f0e405069a0c47bb5cca6 halomaps:2638 +Nazi-Boot-Camp.map E08936DB 136731689 262144 188010af79e677e26aaf8957264d9b0e4fe2545a halonet:Nazi-Boot-Camp.zip +Nazi_Hideaway_beta.map 6851044D 65577178 262144 c7fb44a4da6502c39d386681c9e05a6b6e2fa5a5 halomaps:1592 +nb2.map 5AD1A744 17602792 262144 ef0df5a0f589aa4002e2e2f8ed8adfe7b3b84b69 halonet:nb2.zip +ncoliseum.map 3273718F 19942613 262144 cecca022c7efe9c9b01213f06455f817f2588cc6 halomaps:5076 +ndugu.map A4433FF0 16904696 262144 16b8de47ea0dd2635b3e3d98097e55c8d53aef06 halomaps:374 +ndugu_race.map D51DBA39 17296552 262144 f2fdf3c0860ed718c5ef64f1dd3f87a9147664de halonet:ndugu_race.zip +NE_beta1f.map B534C551 40143269 262144 00bb58807fc15a6ba758bd9400643f39143a1589 halomaps:6200 +nebru_a.map 603DCF96 113436527 262144 72f2fe884b9ece68688b1b07188796b99c0e5cc7 halonet:nebru_a.zip +nebulaphobia.map B3B63B22 237488482 262144 ae701d73359d6544d95d0a8c78a5308ccf80b33b halomaps:6706 +needleosity.map A4B5AC5C 16923605 262144 022adf5ad32c90ab1b8a6dd959491aa5334676c7 halomaps:368 +needleriflegulch.map DC9C60E6 17679984 262144 c2dd35acb89f9a579daeecf6b4c2c608d06f5461 halomaps:1244 +nekari.map 22F3986C 14662932 262144 ca5632aca0d7889d5ff5d9de08014b2c7a0162e7 halomaps:1614 +neko-chan-v2.map 8667ED48 207665612 262144 e876f11a80b54d42979fe0b0d38cae5e6979ae95 halonet:neko-chan-v2.zip +Neko-chan-v3-br.map 3C0C2404 232978994 262144 4e1097ec9fafa82cfac07886d2f88404a0b26ec6 halonet:Neko-chan-v3-br.zip +Neko-chan-v3.map 1BADEA50 238655608 262144 07daf14d3d74c46efe3bfa8729bd91ea4c1030c1 halonet:Neko-chan-v3.zip +Neko-chan.map 162EB2CA 144824353 262144 4cca0a83b880023131142ab2e7f7c242632b5d90 halonet:Neko-chan.zip +nemesis.map 59DC539E 15816472 262144 805efac61b47e9e473854b07ebef08d49a145b92 halomaps:1005 +neophobia_beta.map 671B854D 25540508 262144 dcfd672493674ade5e9700a26edd2e1d21a2d49a halonet:neophobia_beta.zip +neophobia_beta2.map C19F0C9A 40931792 262144 f08eafad3bbd2d688e11bab7b650d6a0833107d6 halonet:neophobia_beta2.zip +neophobia_beta3.map DE6D9D9C 28627520 262144 0d773f9939537ee438c580d301376f6fefa392fe halonet:neophobia_beta3.zip +neophobia_beta4.map CBA20FF6 21041412 262144 2ea2a0eb220ca768ecf0d111d868596a36f68fc2 halonet:neophobia_beta4.zip +neophobia_beta5.map C78282B1 21251368 262144 eb8a77a33d4edeb863a43b85f459817f61bf8664 halonet:neophobia_beta5.zip +Nervous_Canyon_Race.map D57B6808 17478692 262144 8ffc0b1147165c59be4d3f38c7466c815472a6ec halomaps:2415 +Nervous_King.map BC4AD8C0 19474586 262144 73f85f58bfac8a0677ad5f53afdfcbab704a40d8 halomaps:2526 +new bloodgulch.map E6F47352 29483004 262144 d28113dd6dcb8f124d93f1b87efd70970cd89c88 halomaps:5166 +new.map 7314CD2F 13903092 262144 fd0502e7237d69552dda82fab7e25f844f3090cd halomaps:5428 +new001.map 01473ABA 19361087 262144 06198a15ac36550b04dfc91e93fce4740a21e6e5 halomaps:1831 +new157.map 4003A8D9 392997682 262144 dce9d37b1595cda21a7fe2e367399567ef5ab9a2 halonet:new157.zip +new211.map DF9EF5F1 402384028 524288 859d959818d01af7e16fa0dede4ac54271fae4b3 halonet:new211.zip +new51.map 45959B6F 401370195 524288 c19217f22d1b3e955359667c4eb5ee5b49b35196 halonet:new51.zip +new56.map F157492B 394199746 524288 45dcca1acaa51f68fe1f6009e5f4348ca3163ca6 halonet:new56.zip +new59.map 69C7C12E 394199645 524288 1faee318e441272fa7c089ea55f4c843060198a0 halonet:new59.zip +new_hallows_eve.map AA6C6519 21008984 262144 233250eb49a02dba224aea9e77806e609b695901 halomaps:2906 +new_map.map F36680DB 75921372 262144 a4def0860cd60418d5a3b54ef737562ae6cc5402 halomaps:4254 +New_Mombasa_Chaos.map EB6249F4 39139092 262144 280891731e1884682fc5763d275e8d8bd36e09ec halomaps:1109 +New_Mombasa_Classic.map EB6249F4 39139092 262144 10a7704774fe01355e759c1044996f2212e5d5ac halomaps:341 +New_Mombasa_H2_v2.map 28F9A2D9 87560155 262144 ea3f658038ef5ce921323db143cb60c1cb2b2781 halomaps:2579 +New_Mombasa_Mod.map EB6249F4 39139092 262144 44593839e683dde0b9f7cfb81f871722de8b246c halomaps:403 +New_Mombasa_odst.map 5AFD6899 133903522 262144 8d4be23939f177a312bb112bbb885588d44dd953 halomaps:4905 +New_Mombasa_Race.map ADECE599 38715480 262144 3bfaa91f1c2e57219f1e5b7d12037ed45977039f halomaps:2044 +New_Mombasa_Race_v2.map 1EF8ACCE 39714856 262144 4f8db66d43a6c307daccdf49263fa5257a0fb837 halomaps:2559 +new_snow.map 9DFB2E8D 71844423 262144 16ad94c4e08436f3e2d1163e867da91a9f3676f4 halomaps:3052 +new_swamps.map 86D76BAD 51108917 262144 c1bb967511cbf7e658466a5ed764ce5701df60c3 halomaps:1752 +new_timberland.map 40FB3988 28956416 262144 04515547f57543394cc9c651daec13f153e74013 halomaps:3585 +newchaosgulch.map 5F7F317A 23915669 262144 9b1cdaca3aa1e1e2fa611a848a286d22e97a5ded halomaps:3553 +newgulch.map E94E3D16 18344632 262144 e92215d55144cc86900124335a71a73de6cbb83b halomaps:3500 +newgulch3.map 1D13BB77 32527025 262144 0c5dd8ba0dbfe81667f799e2dfb6453f900cf539 halomaps:3433 +newgulch4.map D0B00EE6 45001580 262144 d06849a5d8c864a68bf523decfc02f1e9789823c halomaps:3514 +newgulch_4.map 73F110A8 21896683 262144 7bb9cd3a8455e305d03ffd6b9a051b4de759b455 halomaps:3515 +newgulch_5.map 9B1F8FD4 33527977 262144 c126a46368a4dc4027c5e8fa4efc981600ffec17 halomaps:3536 +newgulch_5_nuevo_v2.map DAE13FAC 33260454 262144 4065952a0dc1ba8f093d17e0c0703e874e968005 halonet:newgulch_5_nuevo_v2.zip +newmap.map 9F777ADC 14730344 262144 39f6cbc26441f47c677c989e832d83c412fecfb0 halomaps:864 +newmap2.map 5CC33B1C 27837849 262144 4d873cced72da476af31191ba404d8da4d459d88 halomaps:4330 +newville.map 586FC7E7 107976866 262144 7b35fe8611b56c7430d019cd865a8a67bccb0e43 halomaps:7031 +NGMT.map 1D8B2780 19997348 262144 e6c8509f1fbb0cfe366971199bc8feac33ffb3c9 halomaps:3672 +ngmt_pb2.map 7E06983E 26317436 262144 a505925be32bfb9ca1b0f0b9be173be577a6ec02 halomaps:3711 +nhpgulch.map 65F3045F 18650476 262144 0951d65355a58ba3dda35a73fbfb6c07f5ff3840 halomaps:2537 +nicksalpharp.map DED3B006 129592295 262144 911897f7d8fec799756532312f2a989aa710e8bc halomaps:4984 +nicksalpharpfinal.map 0481890F 132330737 262144 64634a94d3a72724dad2ae3e2fbe9498676d9ce2 halomaps:5289 +nicksalpharpfinalv2.map 911C231C 132268147 262144 1d206cd14d54a281dc244b6d2e5db9d154aa9fb9 halomaps:5411 +nicksalpharpv2.map 4329E8A2 126208168 262144 87cac9499cab1bc4d09b3f57a3dd834af3852272 halomaps:5024 +nicksalpharpv3.map D2D82ABD 128503983 262144 b46d70dc5561d0bad335cb9157140681b49b65c5 halomaps:5096 +nicksalpharpv4pb1.2.map 9E263196 125869703 262144 2519fe4bccba09a77778242355e9887dd00ea461 halomaps:5140 +nicksrpgv1.2.map 5F9EA8D3 69190567 262144 4b15d4402ac569b578d7ee913a2979dd67fc1a49 halomaps:4845 +Nier_Automata.map E5D2AA8A 352999135 262144 4ddb02053d8f4f595e2929ce8319526ca80a2fc1 halonet:Nier_Automata.zip +Nier_Automata_2B.map BB010310 353002683 262144 d2f099eadea42721eeedacc77daa945676a68d79 halonet:Nier_Automata_2B.zip +Night-Coagulation.map DADBA88A 70605484 262144 93f52edbcae6fc31781d06098b770686d2fd2d94 halomaps:3516 +night-gulch_beta.map BB7DEEC2 19838252 262144 c37b59eaa3fb45836662ef1cbee9e56bb7b95e98 halomaps:1165 +Night-lockout.map 21399E7B 72221454 262144 d92b01409b8afce7e21a103c4d3da2377561e960 halomaps:3586 +night-time-motel.map 5CD931D4 43221131 262144 001e4dcb014f7f46e550eac38ebaedf12c2fff95 halomaps:4124 +nightcamp.map 5B1C8915 18875757 262144 270efc1574cdeac2a6c6a5d0a31a848bbd94e660 halomaps:176 +nightcamp_ce.map C66BA8DB 19135889 262144 0fbe91f8320edf19d14d49a70c32eeec92c53692 halomaps:350 +nightglow.map 0589AF4B 19174800 262144 075cfe7a46ebdd65cb2ab6d87ef259774ec7a210 halomaps:2841 +nightglow_v2.map 9AA2DD17 25466908 262144 316805c15dde098ab738baaf3e2855d13e832b96 halonet:nightglow_v2.zip +nightmare_arena.map 54F5567B 49697268 262144 89ed54df611a05b12207629955af6d6b5e98959a halomaps:4568 +nightriders.map 780B1E1B 15614742 262144 19a299baa222c43008c95e690355a519e0c497d9 halomaps:5113 +nightslights.map 000642D8 14952736 262144 5d64b0349a0792832e6dc7a9a453557699f1857d halomaps:4475 +Nirvana.map 98B556D8 55357362 262144 9f0c44e7241a9a6dfddbfa3a8cc6d88cf545fbeb halomaps:1599 +nirvana_beta.map A6AF9BD8 21669226 262144 9eb8d0eeea523c80220a2859485b6f72c64d7dad halomaps:6904 +nirvana_nuevo.map 3EF2C8DA 50600546 262144 f660f27587cbad374308e2d5a37244f190124aa1 halonet:nirvana_nuevo.zip +nitra.map 6451923F 27082644 262144 b82de666631a33024ac0d76f1516175a89e83852 halonet:nitra.zip +nitra_ai.map EF7716C5 231535597 262144 d21fb33de8299b4b0483d89fef57a2bd2be40970 halonet:nitra_ai.zip +nitra_beta.map 63778879 17722780 262144 2341720bae65da48fbc4cc657cd615ca3fac9a23 halonet:nitra_beta.zip +nitro.map 7B075E96 14831522 262144 00a4077809ac2cf2fde3a3a44c3f445c861881c0 halomaps:963 +NK-G3-Augur.map 7A6E0C0C 203362098 262144 d7595fdedd7f24d9c21487e033494e142291452f halonet:NK-G3-Augur.zip +No Conflaguration.map 7A340AE7 76804386 262144 cb7b277aa5f77bc871f7bd99bbe49c7a6e1a90e5 halomaps:2349 +No-Anxiety.map 00000000 243093774 262144 a9863304473e838d909c3c2baef0ed7b03446e4e halonet:No-Anxiety.zip +No_Fear.map DDA10707 214987768 262144 3ebdfd93fa321ad68e169db888daadde23e2632f halonet:No_Fear.zip +No_Remorse.map B48B47F7 49749974 262144 c45bc3803e724bc3a1bee0399c653538912ab4ef halomaps:1759 +NO_Remorse_ce_ai_v2.map DBC32829 105055786 262144 3b6d8989ba78f0cff22e9d84b300a6880644566b halomaps:5450 +NO_Remorse_ce_ai_v3.map C8F51E89 129351094 262144 2dd976cdeee452aa568a529b250f9583133885c4 halomaps:5664 +NO_Remorse_ce_classic.map 46A92101 98035022 262144 3137bffbedc96d16f14faa6be131175d8ee6e526 halomaps:5469 +NO_Remorse_flood_survival.map 0963332B 124975527 262144 8818781d4566785df8aa8611bf2144b535565d88 halomaps:5690 +No_Remorsed_KILLERZ.map CD3970B7 122831615 262144 b08058bc6984bb24c4a47e3f56631294e3b5344c halomaps:4034 +no_where_beta.map 15F92E7F 20292383 262144 20c54b653f31b9716e21ab291b1966bdffcfcc19 halomaps:2593 +no_where_beta3.map AD765E2B 23361407 262144 3a2ae0360a830f6de47a7946cd533acc933236c5 halomaps:2727 +nob_winder_beta.map BD95CF55 14840596 262144 e1f3619f703d45a530d0ee50f5a211ef22caf948 halomaps:1019 +Noble-Leader.map 59C7034F 289298041 262144 7bd76331ffc1b8b0bfad3c4c6179e6376f1fde05 halonet:Noble-Leader.zip +noblepower.map 2C0BEE15 24241167 262144 45477724b24140f3ea9102fe8739d47ba726b59e halomaps:3794 +noisland.map A4C184F5 80276103 262144 ba9bc294f26c22d3c718972d61b30e8de6d86fcf halomaps:5097 +noob.map 4B51BBA2 15869040 262144 2216618f59bf6ac9838a54923c20866a72591fd9 halomaps:6270 +noobinator8000testmap.map 0779C9C3 42181940 262144 d61321762b99ca6cb119629b1b08a0cada827fae halomaps:2693 +noobmap.map 9CBDA6A8 14350188 262144 7818d34604bea2e9aef08dee8570c60c41e1a3ef halomaps:2323 +Noobophobia.map 4C71854B 128489816 262144 e896e7c38ac508b67173712ac6a19feb73561721 halomaps:6840 +Noobophobia1-2.map 64E9C706 127352418 262144 5703b9c6938d2f71cfe54007215aaeac88aef170 halomaps:6841 +Noobtacular.map 0F24F310 19643446 262144 a4a90113d55397b62624f8f93166c8dcca72af7b halomaps:2842 +north_terrains.map 52D573AD 63647731 262144 c03eb55cdb5bc46c1ae676b1f505dfc001f7509c halomaps:3712 +Not A Failure Thanks To Me.map 72169ECA 19268840 262144 df092b8fe82333aa6433f74ecd6d6f4ab65a7e14 halomaps:1849 +Not_Alone....map E31229CC 23640376 262144 584d63e34b4d9574f98c27a21aacb374c1737389 halomaps:313 +not_alone_2.map FB63F75C 28808424 262144 59be09750b792cc184d461f7345434835f3cf202 halomaps:6973 +Not_Dark.map BD873432 270493522 262144 e4f03176a37d2a57cffd55c2efa28577eb53ec34 halonet:Not_Dark.zip +noteasy.map F807B0F5 215215504 262144 a37e417645f268cb6cecc3fc3247890c6e204dc6 halonet:noteasy.zip +novasphobia_beta.map 753BB4DE 40552592 262144 5af58a962011459146ee02250cacbd15d31f8118 halomaps:7106 +nowayout.map 5A878866 105419654 262144 33d8cbce8a008c941d53587cd2ba18ab90de29e3 halomaps:4159 +nowayout_MAD.map 9A33B8D6 107169878 262144 30f1506cdab3c3a6260747bf6537bfa31b954f16 halomaps:4177 +nspm.map 362E643D 73218993 262144 ef5fea6fca588013319c531a7b05673baef31e12 halomaps:5858 +nuclear.map 7681D1DE 20912512 262144 f8aa3ac46c2532a286028bdbe6f177a5db5145a6 halomaps:5157 +Nueva-Bloodgulch.map 2F891B71 369112955 262144 a4c464e3f113d5cee6d9820ad7113ef89df66fad halonet:Nueva-Bloodgulch.zip +nukem.map 77EE5B93 51198456 262144 b513e67837cd009023beec853f5cd47338658dd1 halomaps:3096 +Nukem_INSATIABLE.map F198A5A8 126886746 262144 b311518c816e8b0ca36a5c18aa473e91033ad67d halomaps:4808 +Nukem_INTENSE.map 280AE58E 123266222 262144 e16df2c5bf61fc0c7cd12e28abfc0995ba9c5812 halomaps:3966 +null-zombies.map EF2E5E95 27415270 262144 47dc277f43d22d3671de20873de417d2ad7e621d halomaps:4691 +null.map 320DD998 27330094 262144 18dee52c6839685de52e33f4476f277e1090a7cc halomaps:4692 +nuts.map 65BC86D3 44808077 262144 e39d02795f460bc265815780d2088a6f6a89e67a halomaps:4497 +nya_flood.map C635E4A0 143026832 262144 569a52bc84af6d9b92ba92ade9cdac334539cdb1 halonet:nya_flood.zip +Nyan-cat.map 3F2B31E4 246538572 262144 c6bc431d960986f3cb2f2787f273beea93dcf613 halonet:Nyan-cat.zip +Nyctophobia.map BFCFDB6C 15877916 262144 320f199dba9a6fb1b462db194e770ca8e5768a19 halomaps:309 +O-Canyon.map 8059E542 16473495 262144 c2714aaedd02b978db363c4717985e1d8cc7c3b5 halomaps:4409 +Oasis.map DB7F0907 28286777 262144 eb203a09a05d52a11e7993641964f671d5a2201f halomaps:4058 +obasc.map 4C9F028D 21330898 262144 688eb46922bc0eecd4610fd6ae724b9559909ce3 halomaps:4432 +obelisk.map 93305FDD 22383799 262144 6613d592145c2bacb985fe698e7cc4ee6030f0ca halomaps:1585 +Obliteration_Station.map 9E9C4B77 14203080 262144 dd496c05c3ac5151d13f700acc4aa0dc93e813a8 halomaps:4291 +Oblivion.map 84D0C79A 21196632 262144 03dd3676d2c03e23741eb24fe0070ebddae7cf97 halomaps:474 +observatory.map 104798B9 29945884 262144 837f18607d177fd9908a992e334141aad546c48a halomaps:4125 +obsession.map 94600B81 15511754 262144 e51448f0a467134867985dd072d3fc0d9ac3f634 halomaps:5239 +obsolete.map FF21BFA4 95002548 262144 ed18cb9f7f2e1c0e59968f4061bc6586f1b3c1d9 halomaps:2993 +obsolite.map 5F8DBE22 16063236 262144 d1a920f06d08d98deeff76ae6a777ce3edade309 halomaps:3173 +obstruction_beta.map 4B408A78 22304580 262144 55e58cbf5d9ba745c754c855d4960e70fa8699b5 halomaps:2439 +obtuse.map E557E7E4 38814468 262144 a8bb07f7f51613fe03a0697cf471c6d50f12c7e1 halomaps:6842 +obtusev1.map 222BC0D0 14895916 262144 903628818e0db31966b3679c5470f92fdd6eaab9 halomaps:1787 +oceancrater.map BAB61DBE 21910792 262144 961a68dbca95c3e9309257fadb4ba93ca2642717 halomaps:4201 +oceans_apart.map 90499172 18192796 262144 c7150deb87d036f9ccb828bef6ab908c9378470a halomaps:328 +octagon.map DDB576BC 13906808 262144 315f8650624f9d4dd38968683ce5f807b6f8d32f halonet:octagon.zip +octagonv1.map C7F11FDF 13971136 262144 1ce23f6f4b85971cd0da623be1408cf2be8b7d7a halonet:octagonv1.zip +odd_worlds.map 5C89C918 26344833 262144 1ae21606c6c4a9999c68418e3e34d07c526a86e7 halomaps:5412 +Oddball#1.map 726C15AF 14552960 262144 9ef0dd6f3e4d8e388032af26e233ba7e0cda30fe halomaps:7107 +Oddball_dioptase.map 17C92489 14587287 262144 c6b5c4b156f3d4ef84d4d7e7f051d5c13c0cdd45 halomaps:4720 +odst desert.map 1CE67086 147828249 262144 cdb44bb978a27ef99d666861daafd109c4267a7c halonet:odst desert.zip +ODST The Floods.map F42E8C4B 214096203 262144 cd52068e6ce45576da9b46fcb72725559bc34501 halonet:ODST The Floods.zip +odst-ascension_firefight.map 2CE40250 92679755 262144 1eb3b484835ee61932e1d79450b283a3e2716634 halomaps:5026 +ODST-RPv7.5.map DDCC9D6F 117023728 262144 e12a94364c471c754c62a843bb2355580f004822 halomaps:5158 +Odst-vs-Flood.map 9CAEB1B1 269529557 262144 4e266ba21c09355e8bee34726744a5d11cc4a11b halonet:Odst-vs-Flood.zip +ODST_BattleCreek.map 1E3101E0 195766788 262144 2c07c707de86c87be2ff3e40f8560fbd0dd98ac3 halonet:ODST_BattleCreek.zip +odst_c1.map 1258D2D5 269833692 262144 37e402d2c5a28c670672a003f57917e1f4337371 halomaps:6664 +odst_c2.map B69E5CB7 226201215 262144 7d69234caf2922380a1e57424b90a1c78084f347 halomaps:6665 +odst_c3.map ABE474A7 230069619 262144 c38887d2d195b1654edab184c03e34896bd6e2ca halomaps:6666 +odst_c4.map 27F50FF2 198706195 262144 0fbfee938cc133a7b19f2b381f4cd8126acd086c halomaps:6667 +odst_c5.map B3C1A14C 207221007 262144 016408162b17caf5dfde0cca49ce4084d15176e9 halomaps:6668 +odst_c7.map 7B41C534 252400249 262144 f346e031c01241879b032d9c0650d96bc944d9b1 halomaps:6669 +odst_chaos.map 98C38BAB 212508991 262144 103e0e3fe10a95cb212275d35a46f3e34e048d1c halomaps:6201 +odst_drop.map A8A6367E 115012992 262144 4888720e08223891d108c2bcf0e6b32cd2edf1f2 halomaps:6152 +ODST_mission.map 2FB4074D 74632015 262144 f3432026ce8b00c3e0956b4fbee0176da57b0d0a halomaps:4846 +ODST_regret.map 1544C4F4 128122255 262144 1ece66a64b13691e631294ce51e829a331c47ad4 halomaps:4906 +odst_regret_pb_v2.map 4DA6D95D 125094334 262144 8a69580b6b13d1a75b6962f0982cb7388a7a3af0 halomaps:4942 +ODST_RP_T2.map DC8CE0E0 97333474 262144 cb9ed86b0e8656f77b907c770d4c7dc606d9f537 halomaps:5159 +ODST_snow_gulch_pb1.map 7DF41503 186006553 262144 22e05fdc92ad8f6fe2155e5018f46fda14d23ab6 halomaps:5017 +ODSTgulch.map 92EC1FD9 65239453 262144 536d268db0e74dfd1b3ee8b1b16ad2a4d88954c4 halomaps:4872 +odstisland.map 0AD08E97 58831778 262144 a751c9d80718b70b43606500d1859d6c9e0d642d halomaps:5248 +Off Ground Classic.map 015A0DF5 27370576 262144 3a2a3f66de9aecf5d8cef68c705968326587a2c1 halonet:Off Ground Classic.zip +Off_Groundv1.map E77F217A 112591618 262144 874cb0f247ae9b07b0a5f0538678e959874715ba halonet:Off_Groundv1.zip +office_building_alpha.map 768D12EB 14866832 262144 c29647fae7e35bb7a5d0582bbdc8a7f8907fe98b halomaps:435 +OHMANOMAN.map E1324568 46091312 262144 2ddb3ca93b32f4c14868ebae31b0c3f015bcbe34 halomaps:5774 +oil platform.map C2D7E8AB 36350393 262144 c44e1953980755a3fbc22562443a2a157136e971 halonet:oil platform.zip +oil_spill_aco.map 6E834224 38921168 262144 759abb2a5132f132b5d307cdd8056f89d1b6acfd halomaps:4985 +oilisle.map C36D19E2 15810376 262144 4236ec265a24c268153aab579e59a423b5e72552 halomaps:261 +oily_victory.map 2B836813 53829108 262144 dc1a3140fbf7dc00c810a909d2c1ad5cbe04aaad halomaps:6097 +okenfenokee_tourist_trail.map 887CC9B9 24587372 262144 a3f83bb1c3290e9b8004908822fd8cc99387bdc6 halomaps:3038 +old-convertido-en-new.map EE5BD224 232338647 262144 4855b7ae9d3d826fc72d65ce4f7ac4d63f0b43b9 halomaps:7108 +old_cemetery.map 8751613A 33065253 262144 e151346cfb90087de57cf12110134408604f6c1d halomaps:3587 +oldmombasa.map 644910F7 41754096 262144 5b31ff605ac1fc04b2c4cf6592775d6bf96eb5a2 halomaps:4907 +oldstyle_bombed.map 917C5CB0 16488032 262144 2a8588e065371b63aa7debb3822b464406b1c704 halomaps:1621 +olympus_mons-ai-fight.map AD264073 98945067 262144 207c48ee8dc2d62de989f267b15d26dde3da4f0d halomaps:6233 +olympus_mons.map EFA6839F 49361352 262144 a98410a9749055a8182f5334550487acfc9eddb1 halomaps:2613 +omairsumgulch.map 5445694D 36099871 262144 1cd6e5ce1aedfe3a62314ddf424ae9f03640dde2 halomaps:6397 +omega_outpost.map 2939AC93 118965200 262144 9f82a67930741ccffdb201e3b8e58daab71ae9ea halomaps:5733 +omg_it_bloodgulch_beta.map B9E814A0 22856633 262144 fc7bf4e11c1fb83249f0829ee321227589abc544 halomaps:3633 +omg_it_bloodgulch_pb2.map AC43E233 27409326 262144 78ae393cb0d373e0902ad9be8859b0cd430b87ed halomaps:3713 +omg_it_bloodgulch_pb3.map F07CFE5A 22881417 262144 fe64d5e30e59be350a296ff4cd25cb95ded91c27 halomaps:3732 +omg_it_bloodgulch_pb4.map 33397661 68104308 262144 cf9a0b0b7424bed0d3afb75639c8fa04f74328a8 halomaps:3880 +omg_it_bloodgulch_pb5.map 1C3F6074 81415856 262144 c663620e0f16920aa7cdf37fb3e4a2aa1a1bffd2 halomaps:4035 +ominous.map 6C7FF2EA 19289020 262144 130e1c1414783d360fd568c088e74cac9d661a7d halomaps:994 +OMMT_modded_Bloodgulch.map 9BA13981 27343732 262144 b07d47a6d876c6205f5531bdc17ca7a0844f1d84 halomaps:3967 +one_way.map 0349EC05 20553536 262144 a68ed474927c2cb80ea96cb04b266d0c71169806 halomaps:3714 +onesided.map 1A749BDE 13160660 262144 207ec185a61fca6c42fe68b72486849d35520ebd halomaps:262 +oni.map 56478B9C 26858521 262144 ca0adce2b75e01fc4194731b80c4d6200a4093f8 halonet:oni.zip +ooe_big_chees.map CEC4E30F 56560389 262144 b260dcde9132e0716c2427845516ee05da7aca61 halomaps:4266 +OOE_Gulch_final.map C80DB99A 50117396 262144 d8c569c4f69bfcaf01b0b2b4cac56b7b62d52a65 halomaps:3993 +ooecookie.map F0A16987 34349554 262144 a05285325266675f6aa852bc1a44bc68e506b20e halomaps:6678 +op_ctf.map 1297045D 14727176 262144 98485eace81fd0b45f284b6e092db7f6415252e1 halomaps:675 +opavo.map 04D7EE36 14425764 262144 5a830e2f4117929df86c645b8342d9ccbd708d12 halomaps:569 +open.map 0E68F7E6 13932604 262144 12df482a95f45853667ce06fac18c99c6e9429a0 halomaps:263 +openseasbeta.map 2EB57AF8 35396290 262144 8b61ca6e8e31b678a79bf66eed077ace77f0a494 halomaps:2843 +operation_blackwater.map 946FE88A 156993722 262144 5ea222b9f951b2bf5a828d3315670b9fc5e71011 halomaps:6625 +Operation_Exodus.map 3B9979FA 121608208 262144 011a1d238f75c89c8ba036515285f72142603e01 halomaps:6343 +operation_frostbite.map BA4736E0 135625903 262144 148df46367fe13e0c2eb1b692aaad0dc1d76cc04 halomaps:6626 +operation_quarantine.map 8482D5BE 109709176 262144 a4536458d5feb6ade338815e233514549cd63b26 halomaps:6627 +opeth.map 7002B985 133211620 262144 8995394f070755556e1dfc74abb48dc35d1c5ca1 halomaps:6947 +oracle.map 1A6DD407 27143572 262144 e519f6c247128d6666577dff812206fe4f808a93 halomaps:1901 +orbital.map 05472AB5 33514884 262144 97f1a43dea6f6ddbf6381c1b79ae734a20e75fc4 halomaps:4331 +Orbital_Defence_Station.map 26380D59 12497120 262144 6dfa7ebb9cf82179f1c2280f9db7bd477bb4f9d3 halomaps:544 +origin_of_chaos.map 225C15EA 18369148 262144 b2b78f3efeb220cf9d6e5d1f45cd02be8e09934b halomaps:1814 +orion.map 44FF46E8 32384371 262144 6f6e6115a0ffe9112d8729f37f2c6b1029fc6ddc halomaps:1857 +orion_final.map E919B157 18753372 262144 5588e44f5d47b8fd6a85cc3d3c74357f944e7735 halomaps:4292 +orpheus.map 9CE1F678 79032972 262144 77fe34ec950d76e5bb21084777d4e4eddcb9f80b halonet:orpheus.zip +osiris.map 4F01F940 15027972 262144 66caefaa6fa0e50c1809859ad622b57f532ac0b4 halomaps:264 +otro_atake.map 57F5EA50 74854298 262144 2ae436d3db7580ac13c42bbdb73ed743b13ba156 halomaps:6068 +out_of_reach.map 03BA6D71 93201756 262144 88c2ad83d5384dc080c69d5210ede3bd68a11549 halomaps:5935 +outcome.map 13FBDC97 21774924 262144 867f9fd3b5c1852df3263d8bd0e9e3b023da9e5c halomaps:4255 +outdoor.map 2E86E00D 57656576 262144 8dcd85360d364e6c877045301ee2413b234e94d2 halomaps:6721 +outgreet.map 1A291ADA 14900756 262144 c7b2ea386bcfa5d048ca8855fd52b15f9c32ed6d halomaps:4587 +outkast_arena.map CEA5E221 44933339 262144 3d77756203a37346ee272a069eec8273e28cc7b4 halomaps:4659 +outland.map 8C74AF85 53876923 262144 d7fc7f2d3b7f55320ea91819a4e129d48f5ccd30 halomaps:5240 +outpos.map 33C49E2C 232749181 262144 9ee0bffb3edc7f40a93d120c46619208f38d74ab halonet:outpos.zip +Outpost Bloodgulch 127.map 8E7C7CCE 56114178 262144 a710db1b47c4be93edaa6d1331a4a316440a7bb9 halomaps:5187 +Outpost-firefightv2.map 5A0D8A13 267022838 262144 786223fd521d4a9ed875d51ae20398b0495f5895 halonet:Outpost-firefightv2.zip +outpost.map 2FC1E0F2 15912904 262144 0e730f6b9385bf9eff9d738f65b36573a42959f1 halomaps:1241 +Outpost_Rio_Classic.map 3188F517 20320064 262144 9e8028f4cb94a2cf753272b3900dd5eaa93ca0f3 halomaps:532 +outpostbeta1.map BDD6E849 13533468 262144 00d53ead1e22143f18798234e2fb4a6bac34936a halomaps:1180 +outpostdn.map C20F353D 38020601 262144 a107b698efd47fb6380c4c8ba9cb6ef086743082 halomaps:1468 +outpostgp.map 4B85EC3F 48180447 262144 2984aac4b3aff432945ad8e713c5622833acf756 halomaps:1469 +outpostlolo.map 66996389 63311171 262144 7c67866422cf0b06fbf87fa594665b84100ff852 halomaps:6291 +outpostsw.map 58A8DA6D 45679243 262144 386602749b899e04bca7ee08c81afe531d17f64d halomaps:1470 +outside.map 0685A2EB 13836028 262144 8c14d53df0fab9af59e87de664ee71c7188f8394 halomaps:375 +oval_track.map 93EE95B0 41075235 262144 0396c6730b6ca8f11246a2ede2e525ef24270b17 halonet:oval_track.zip +overflow.map A3B97BBF 16756336 262144 3f784825c5d4e7cb1016f48ba94d45fc98e3b40a halonet:overflow.zip +OverGrown.map E58C2166 34974637 262144 a2c244e3edd2e8529a1ebd3d8c2f25604b5ad7fa halomaps:3715 +overkill.map 12DA3C26 240269553 262144 bc8e52f4bf52f8fb1e4b06e8dfe0ecd2d1110f0f halomaps:5787 +overrun.map 5C5CED50 21302068 262144 09d6a4c901762c4d6a683bbe888911cdcc6b1e1e halomaps:1507 +overwar.map 556E7502 196571570 262144 b0a818882790f7d24ccea9deea76224013ca657c halonet:overwar.zip +p-ball_alpha1.map 9ED7B5A9 15855888 262144 413a0b4030643e4d4fa9b2a69bb69dd58caba677 halomaps:818 +p_canyon.map B34A5CB7 78401277 262144 75f7ab2e77155aa67196c2b2f6b768e9484165bc halomaps:1717 +pac-man.map A00E31B1 14950689 262144 5bec3283e9f4ed000a2d454af8136742718f2aee halomaps:3649 +pacman.map E9DEFE15 13516172 262144 11623b10181d5f148437b4d67cd5f3de5afe4b39 halomaps:2011 +pacmanthing_1.map 00007FE7 70812123 262144 6e4c31f209678b23cbd897fe351b17d6e40c8aca halonet:pacmanthing_1.zip +pain_canyon.map 6434D1BB 18247480 262144 2a57fb238dcc30275d81feec921d8c301ddba8c2 halonet:pain_canyon.zip +Pain_Water-v0,5.map 78D2C03F 18908308 262144 5d3925d0d3feee48e803a40319865bb3c1695739 halonet:Pain_Water-v0,5.zip +Paint ForestV1.map 11D75ABC 50588972 262144 aaabf315cbd8431f6b92a97a0d1619bb23872ece halomaps:2173 +Paintball-BK.map 0A324ABD 59607963 262144 c75f580cb5eec656ee9976807ebd23dab05ca76e halonet:Paintball-BK.zip +Paintball-Gulch-v2.map 00000000 96865175 262144 e806c9b3d119b745e5696cb1e128956bdf3e11e6 halonet:Paintball-Gulch-v2.zip +Paintball-Gulch-v3.map 00000000 96977164 262144 1888d3645276dc92dce285ccdea3b4636db7eb74 halonet:Paintball-Gulch-v3.zip +Paintball-Gulch.map 00000000 94699523 262144 ac7f23b75c514420f1d10f72c45fa1874ee2a4a4 halonet:Paintball-Gulch.zip +paintball.map 2F4674CA 17582660 262144 2ff2d177f21e8ce82bcfc61d9be3c4620dcc97a5 halomaps:3276 +paintball_beta.map BBA82C26 22804041 262144 170bbc5d7b38b8de7c43c5ab41f3dfd990157b7c halomaps:4074 +paintball_madness.map 5872D879 112332097 262144 9e566673e9c34c1457d1e0455d8bdf6463865654 halonet:paintball_madness.zip +PaintforestV2.map 101A0441 39899020 262144 819338e5d9732544cc36b7b8f080190f58b710e8 halomaps:2580 +Paintswamp_v1.map 4BCEE10E 59104258 262144 86bb881b1003b4149cb0ec75d12e97fbcabad891 halomaps:2273 +pancor.map 34C6472E 22747322 262144 7ab83859c7b8bbdd4bd17917685c82a63c37214b halomaps:5279 +Panda_fantasy.map 7DF374FC 260613055 262144 78f24e417496dd00315da1fcf5183d4f55a52f02 halonet:Panda_fantasy.zip +Panda_House.map A5A0E937 347879848 262144 2ee64b4e5d2075a8d123cea1ea9e32521abd9059 halonet:Panda_House.zip +pandemic.map A1465931 195771128 262144 be35af409f94ef86f208eb28689c7013af4f7fce halonet:pandemic.zip +pandora_swamp.map B0E9E481 129023551 262144 8a65943277cb8a045fb1b3e923e907033f8e1b8a halomaps:6122 +parabola.map F713BDC6 22900434 262144 7155698ad0e6259b6cb8394176dd8eccead9e5e9 halomaps:3321 +paradis_perdu.map B9A9F328 132875773 262144 99350aa4abf1a31d7b93e918c3df2d4f90b8b3a5 halomaps:4721 +Paradise-2.map BCBCA678 38223223 262144 cd194a9acb33187d8c563e150184e957f3c4b45c halomaps:2360 +Paradise.map F2C024C8 25426825 262144 8e86f66ef4f58587a8ecdd34137e70b0a3b19d36 halomaps:1077 +paradise_lost.map A56F1AA1 24956805 262144 a71e0fdb19b4697e5a984909af4ce6319b153ccb halomaps:1191 +paradise_map.map 9EC44AD4 43646828 262144 2e7a00100946d5c0e8eb98ba87f0e19c61888019 halomaps:5046 +paradise_map_V2.map 050CCBAA 118967026 262144 8b1e16090a1f88a01642c29cd1a733a96669e8c0 halomaps:5816 +paradise_tourney.map 0D9E9C05 41718336 262144 337f165c67b90680020a97f8fd808d0e12507fe3 halomaps:2511 +Paradoxical.map 57FBE5D7 18714433 262144 d63c74fee126d5192c2a73cdd6b57ab983645d8d halomaps:1680 +parallax2.map 7E706156 41624596 262144 54094e45e66fe6e94a95a5c1e20a9e8a73a72525 halonet:parallax2.zip +paranoia.map 8EE7CC9C 12263728 262144 ef66eb1b8111aa6b4c8b1a82601c01c113dc0467 halomaps:3716 +paranoidx2.map 17807076 20617715 262144 e8e2b01ce384471e2002afe4a0a0f14ff461141b halomaps:365 +parched.map 9242E86B 13422768 262144 7d76504db7f5178449ec1771ee7278a3dd98ac78 halomaps:5280 +Party-Station.map 656483BE 81591004 262144 2d1f73dbca290cffc52d599de295e14c80a32a69 halomaps:6458 +party.map 1B97239C 31150725 262144 aa72684acb853b111aa3f9869af659943153776c halomaps:4075 +Partygulch.map B9C0A543 83846828 262144 b798049f2c76df5c107aa80302f6c275f493feb4 halomaps:6253 +pass_bridge.map A1C373F0 182922878 262144 68901c94c74779f08177b683c065adeb0e31d360 halomaps:6353 +Passageways.map FBA24091 23714920 262144 73289a214e357cfe70cbdbe8610b2de51082fb29 halomaps:3354 +patxi_island.map 9F5C920C 124014490 262144 39e7767fcbdb43ad1cd0f8a7c9a496c967118ee2 halomaps:6976 +patxicreek.map F1D6DEA4 98564575 262144 96215aa5adf1aac66b0720e69ad54ad44db11f07 halomaps:6974 +patxigulch.map 838FBAA6 121532846 262144 73dddec548c774aa07fc5f89f495c3cea947120b halomaps:6975 +pb_forest.map 21EE54FC 22917408 262144 1949fbd39b116153c64c9fd47fc325654caa526b halomaps:2416 +pb_forest2.map 605009CF 75454898 262144 d7f32f25a966a53a5efe319880bf0c4b0f27ac7c halomaps:2503 +pc-level.map 24ECE3D4 12551560 262144 8cd248060a568297ae8f980118ac821fe02d7bf9 halomaps:2504 +Peace-n-Harmony.map 00000000 303715953 262144 13cfd880a15c381b2832cfb7553aab6ed691c55e halonet:Peace-n-Harmony.zip +peak.map F9C5E410 13944348 262144 b081f8a8028d04ce313a4b4006344e7a3d9f8c0c halomaps:3148 +peakofdespair0.8.map 55726BE7 14957856 262144 8612c11baa66b3f2bee93989b34b4149832ad55b halomaps:2594 +peakofdespairv1.1.map 1A17F017 34719992 262144 ab30de5501e9a266e815d5861314520d73df7d48 halomaps:2729 +peakofdespairv1.map 0AEF00E3 57390878 262144 1585f244f09bfde6974f43c84e1a6dc121205661 halomaps:2694 +peakofdespairv2.map A6D07E97 31573197 262144 d9276916a8c6b697c67115d94c47d6e7a14aebb2 halomaps:3149 +peanut.map 1607AFFE 28763315 262144 98bd1ce7aa0725edd4c60ed4ba0854bca5fb9887 halomaps:5373 +Pegasus.map 703721A5 103797310 262144 ea206b6fd9af93135da95e85f2fb8cf3467ef88d halomaps:7076 +pegasus_classic.map EDF68484 15697428 262144 86297a8d8d770a17d2c6bc8af0dacd92e3a6e8ea halomaps:7109 +pelican_crash_site-2.0.map FAA573C2 81249692 262144 5b2109118c696f247c82c3cf54aa035a65364488 halomaps:6433 +pelican_crash_site.map D4FD17F6 84272453 262144 e689eb61ae2f3b88621f9522e960f6da5cc097c6 halomaps:3439 +pelican_island.map F71F8C7A 34778407 262144 21d446fe968825a03fc75e4d5d3174a34b0d46a5 halomaps:4457 +Pellude.map BEE6ADA0 22034208 262144 0cdfc38b68a6d1863daaabcbdc72d5a4ab50c79d halomaps:2614 +pemba.map F3262CD2 51532405 262144 9d856b205f975435124b6b4a6faba3573b1b71c2 halomaps:1593 +Pen_Island.map 552C1089 15467300 262144 4abec9d7a3a5cc1cafc5f6f225c5ddb8bc869a78 halomaps:1255 +penisland.map D96ADE5B 12066960 262144 8a4bbb852c01b422aa6fbd25073bcbb6b2f485fb halomaps:1182 +Perdition.map ED339B4D 99670348 262144 51f60d8a48d8fe4a6be4bd35aa264eeee7cce6e7 halonet:Perdition.zip +Perdition_v2,0.map 34A71B99 48741578 262144 a9efdd1814b8c17a6f85634c313a2b2e5032ac85 halonet:Perdition_v2,0.zip +perfectriders_beta.map 5AD16A24 13912988 262144 184994d4aa9f4678ff6c2d96070620ddbfdb5b61 halomaps:1815 +pergitory.map 784967B6 13009576 262144 642029a81a1a1ef54b125400693eb31f121b7ff3 halomaps:539 +peril.map 40D51DE3 41794918 262144 04f3bded8528ca99c651e316c5241c9974d94ae6 halomaps:4096 +peril_h3.map 7CD92648 101831703 262144 649aa0a8657a38c7d718df3010ad167bbe3230aa halomaps:4160 +Peril_Redux_Alpha_pb1.map 721F4505 21393336 262144 426b689bd2da61caf862df2d1166633bf42874da halomaps:4809 +Perilous_Mission.map DB6C8E60 193256546 262144 b444a603d4368be685e9eed8c87370d6d0b1941c halonet:Perilous_Mission.zip +perimeter.map 62F2ECAF 21223972 262144 9e6663890fd3c66bbbbcb06672155114b843c7a2 halomaps:4410 +perimeter_v2.map 7DE47521 15582684 262144 c132a2b38dab518aa1c01443474983a7d98a3991 halomaps:4458 +perspective.map 96556E0A 30598788 262144 712c0213c9868d1d244cf62d910c1d791ed953c0 halomaps:2531 +Petitbonum.map 18CA1226 15811544 262144 2e5c9e770f9a51e96cb32cac04e1df3766d9d798 halomaps:2581 +ph_canyon.map DC98BAB5 82768279 262144 5edd2725a1224990d37571c23cd5229d23bea0ac halomaps:1725 +phalanx.map D227B296 95230533 262144 822d6deb34bec7ac3b8df199f51590b5c74b85f2 halomaps:5929 +Phantom-Zone.map 00000000 238312292 262144 f8892b276d910bbde0db39e4f23dbbd66e5104fc halonet:Phantom-Zone.zip +Phantom.map F3412EEE 72362210 262144 46ed5407c045ad11b09a418d59f66781bacf30c3 halomaps:1439 +pharaoh_2.map 53216824 20858316 262144 57120bd46af1019a39062e599671995819204fbd halomaps:376 +pharaoh_2_final.map 3058B904 25956756 262144 47e385b4be93a9dafe8f0d3d18e35f15e94a48d0 halomaps:466 +phatgulch.map 2AE6DFD7 50415250 262144 27bfc3df5c354798bb39ed324da11fb21e7b514e halomaps:2560 +phoenix.map BD494848 13165532 262144 354c42a112fbb4ee31a554a13a56718288335c90 halomaps:772 +phoenix3.map 00000000 70096498 262144 bc4f47f857387ceb1b1992edb143e97e987d5116 halonet:phoenix3.zip +pillarofautumn_mp_beta1.map DAB6A3C4 54244300 262144 1a97432fb10db4fe9626264d67e38b90e6e38c75 halomaps:2926 +pillarofautumndestruction.map 732CE0B9 86471371 262144 feb90e42a90cda0138f535fe47add401023502e8 halomaps:2350 +pillars.map 904C07A2 68209886 262144 68bee0a971ed59b80df116e6b9fb2de0a0fff737 halomaps:6704 +pillars_v2.map 61AD3141 50141437 262144 dbefe10c88e850a94d2a03b1a00ea190926d23e4 halomaps:7110 +Pimp Hogs 2.map 461292AE 32877090 262144 a0d269746d21cc9c6a70fea2ba5bf7439b00e03f halomaps:1163 +pimple.map CAE81F98 13402020 262144 34fff9935dc9edebe8c43be49ff8b63262646230 halomaps:4036 +pimpness.map AD6BF017 21395332 262144 b545aebb76fb759456020d8a22bc16b81d7bc292 halomaps:2532 +pinch.map D7674395 24149454 262144 552b30f2fa8e5ba3b6593ef5bde7c6c0b48ff070 halomaps:2595 +pine_circle.map 6F3DE314 16335176 262144 9db1bd49964ac8dfba88062f3a9ef17765f36b03 halomaps:2695 +pineic.map 23010FFA 55726890 262144 a4406112e3b9e95a9997528b7768c3e44485b866 halomaps:7071 +Pink Eye.map 6509BC6C 275139119 262144 1d79476b272588334b50811ed3a50a60a70d5fe5 halonet:Pink Eye.zip +pinnacle.map 346AACF0 395444207 524288 45375a7fc5f55bba07684706d84fed4423e9f790 halonet:pinnacle.zip +Pipe_Dreams.map 6D8F81F5 396446044 524288 a35bbe24037b84da652a3b93ff9ac1ec87af0fa3 halonet:Pipe_Dreams.zip +pipedream.map 78483F82 24861247 262144 c47b48b3dbfbc83ba8311ae61dc2d6ce7505684a halomaps:487 +pipeline.map 12E840B0 15909620 262144 a95ea2a3c48887c9a9b2577e5014b040e1030a27 halomaps:1850 +pirate_ship.map 35058C36 25949631 262144 9c509546d5dfd7fd09f98eeb9305b168cf4eb4a9 halonet:pirate_ship.zip +Pirates_Gone_Wild.map 210A67B0 234993733 262144 7aae48b523b0235f427472a1c5b4c72694b4cb0a halonet:Pirates_Gone_Wild.zip +pit.map 21A91CEC 48180630 262144 f96270781cdce5da3ef367ad7e2cb3356e015414 halomaps:5429 +pit_v2.map 50723DD1 133107261 262144 35d565ae15f7e148c005ca022325e4ca6d94a285 halomaps:6751 +pit_v2_top_race.map A201BD7A 130623786 262144 046d557f648ec0c9f9a4c617244b3d1a22d201ee halomaps:6752 +pitfall.map FC3CA89B 124255705 262144 08dab32276efb4615bdcab3e0f5e7c6f05ce035d halomaps:5413 +Place.map 2AA1CC8F 13958148 262144 4bb859a433fd91f75e7b7686320a8b4326d3442d halomaps:4411 +place_01.map 84915A36 31965618 262144 d9e4e3adcdfe7a187b67137acfbbcd79bded4e82 halomaps:5188 +plain.map D3DBA0FA 12695104 262144 b035e8022808bf83b3bd14cb0bc799e912c99202 halomaps:3824 +planet_flood_a.map 36D6CBC5 98534228 262144 8921539204ee6318c983223176b04f0f9b547b6a halonet:planet_flood_a.zip +planet_flood_b.map F1109AE9 141251433 262144 b94306c1c16a36a29e5847ef187f072ee186aea4 halonet:planet_flood_b.zip +Plasma_Duality_Carousel.map 0DD942A9 67191405 262144 ff30fbe666af212ba3f43ca5de4a62f79d4d69b8 halomaps:6234 +Plasma_Duality_Chillout.map AFEDCC08 66986921 262144 59aa2c53801a446d1b79c849a547dfcf64926555 halomaps:6235 +Plasma_Duality_Damnation.map E91BE10D 68295469 262144 2f472f68a012d306a9bbb8708e417e8404428c46 halomaps:6236 +Plasma_Duality_Last_Hangar.map 12E6DD34 96364697 262144 4a8103f53da46a4ee431fae655a55c140b3d5d46 halomaps:6237 +Plasma_Duality_Midship.map 34CD22C7 71857949 262144 fbb8697f1ede1ddcac6cf4812a5526e40fc429f6 halomaps:6238 +Plasma_Facility.map A8752267 97547360 262144 2306406672ca655b4c4482949ec440cf0815f45d halomaps:2791 +plasma_skies.map 8029AF26 16393032 262144 ff1a1ff86ecc6ccca57bf3ad0617251521202dc5 halomaps:444 +plasmagulchv2.map 5C30143F 14776772 262144 abeda7ce2c5bee8fc05e74c014f9c526903027fb halomaps:2958 +plasmanaderifletest.map 0CE68429 19508332 262144 060f0bffa874c13b7534dca6cec538ffc41ec402 halomaps:1417 +plaza(noche).map B85FEA77 120135215 262144 7b871ea6e04461b74a55262d46187ed2fcf7a6bf halomaps:6734 +plaza_las_sirenas.map D0CC1C64 80854406 262144 771c2ba5307f586e35a649fa2fa8520e1c9c903f halomaps:5873 +Plunt_tuiama.map FC7A0F95 63529139 262144 1df3921acb9ee9b24ac7b340e10bff4f67e668fc halomaps:5025 +pluto.map 53FB1379 62711855 262144 603377a3042ef85366568433a29aefa7fe278b62 halomaps:3262 +pluto_real.map 2E26F0F7 64844523 262144 bb578639477df960b363294160d3583463b428c2 halomaps:3275 +pokemon_tournemant.map 784484F2 30870084 262144 eb43685a5db6927625b435d8fea1b52893f89a33 halomaps:4037 +polarity.map E835D497 123371142 262144 392ca5202e207506e27accd960c4ed7921e3e927 halonet:polarity.zip +Pool_Party.map BF5FFF44 286257351 262144 fda52a6e449522b84f5a4679e17a3e8344274028 halonet:Pool_Party.zip +poopoo.map AF2F0B84 14171580 262144 bdee58da6d029de22a020b268528814ec458a327 halomaps:1685 +poq_ambush_ce.map 00000000 356613203 262144 964dd8fc04544b9734d982262375ca641af9b599 halonet:poq_ambush_ce.zip +poq_anguish.map 00000000 96001064 262144 1e65a9ae529f74b66959eb62ef218b0f8757a956 halomaps:7083 +poq_bloodgulch_ce.map 5EA3D576 206205077 262144 7dbcf79a208d2116e7c7cc736e5f910f05532d46 halonet:poq_bloodgulch_ce.zip +poq_ghost_town.map 00000000 207492481 262144 a95518876eb86b9af739e5b9c1f29d1b87210a24 halomaps:7077 +poq_icefields_ce.map 954D8AE1 76680511 262144 98ec484ef077455401adc3a03600eacc26796306 halonet:poq_icefields_ce.zip +poq_insomnia_ce.map 0F1E9604 81583166 262144 49c9b80b8230763c1290fda2b791eba5fd135c8a halonet:poq_insomnia_ce.zip +poq_presidio_mod2.map 00000000 230349381 262144 4d32cf8f318d6df2b031fe167c2792a47edf7d1e halomaps:7084 +poq_presidio_mod4_ce.map 00000000 230332041 262144 3a14ee8010e30ac8b54f57cd6a1f47d5ec01bd94 halonet:poq_presidio_mod4_ce.zip +poq_prisoner_ce.map 00000000 300393303 262144 e3934b2afc4d01de822f9962b6747578a734562f halonet:poq_prisoner_ce.zip +poq_the_abyss_ce.map 00000000 258911428 262144 d2aa968de8932d3d42cf02d1fe85a4f230973ae6 halonet:poq_the_abyss_ce.zip +poq_the_abyss_v2.map 00000000 258911428 262144 c73e459fe3af8caafa0ba68fcfbd20a0e914d1cc halomaps:7085 +poqisland_modv1.map 238528F5 58827277 262144 ae21f0f7d217e651d9fa1f599d684a76579e95fd halomaps:4873 +Port.map 9B2A46E1 28749688 262144 a6b30c297b86345bb84da83d45f5990cbfff3333 halomaps:5695 +portalgun_sp.map 226BFBB3 13821476 262144 60e7ad6eb7d6d3069fbd2e5042aea6f279f74200 halomaps:5171 +portent.map AAF2E70E 41661525 262144 bbf36b5c3c9b286a57de180c8213af93b1b25c0b halomaps:1796 +portent_AI.map 8AAE2519 110429361 262144 816c1e19b2da954a47949ad2f32c34a2318ac71b halomaps:4874 +portent_ai_red_vs_blue.map A462B53A 47865105 262144 2353428b2a656f889002d7732cae832df3584e2c halomaps:4943 +portent_custom.map A7252F6F 43270659 262144 5db27dde1228c1243516158ee114a5d62f1eca92 halonet:portent_custom.zip +porter_creek.map 3EB616AB 61156550 262144 9b96ea19ace2db28d2d1a0095acdc29e04c707ac halomaps:6153 +Potamophobia.map 69D24ABD 45697180 262144 de64f3301f4f67e1835e5e071a01efd10013f63b halomaps:4368 +powder.map 0D18D76C 15995176 262144 7761f2e9d0f83a6d4799e932f89dac61d22f7028 halomaps:2639 +power.map 4E3EE637 47031310 262144 a8b07587d8db20d09f8fc66279439d3376647dbc halomaps:6098 +Power_House_Final.map FC7E80C3 384006653 262144 a34bc26e5684f6e1a4c4991ae09adf89fd80ef07 halonet:Power_House_Final.zip +Powerhouse.map 6299A90B 31652268 262144 5a408d25cc9db8ffe8dc4db4f2b2877a8c298672 halomaps:5470 +powerhouse_ai.map CAC8AB1E 101997763 262144 10b3a551dfa53bd4e5c07b9ec395a8c9aee909ab halomaps:5490 +Powerhouse_replica.map 3EDE0956 76182672 262144 aacd0242960e4b3b3e25e006b3bad4c13aac19fb halomaps:5665 +powerhouse_replicav2_beta.map FD77A402 81639453 262144 9cafc131b008def0a42d583f8f58b347a80a4d30 halomaps:5707 +Powerhouse_v2.map F3317333 76641722 262144 44ad0571d44cabba5d53bb239e4da6e1bedb57c6 halomaps:5491 +pr0n.map 54E11646 40519084 262144 026165a05de652ec11b595032223238bbb561b19 halomaps:1337 +practicum.map D97DD3FF 14436820 262144 99a27ed45469eb20ce277be5b3debd89d13954a2 halomaps:3717 +practicum_npb1.map 9678814C 14280252 262144 afc9f5c27afd087240cddf0d9c1fdb4b37ae07fc halomaps:3122 +preachershill.map F1A6F022 13918652 262144 43b3b894bbae75df845b8da2fb75d439137702fa halomaps:265 +precipice.map EB4FC29D 89366708 262144 562e191db412e25467cf5608b914fce743b3d469 halomaps:5708 +precipice_refined.map 3F7017DA 177771574 262144 5b56e3d5206412eb0e8a7d1ba701a868406ac921 halonet:precipice_refined.zip +predator.map 0EA0B8CA 71372295 262144 21f96fd4d4602140fbd61299bc73cf4967ce15ea halomaps:5167 +prescenium.map 87C154F6 59487102 262144 d7b357561b4e775c11c4cbfac9e74b9d42051fcc halomaps:2858 +preservation_site.map 2E9993CA 67382736 262144 d91efbe6f8f300f21721185b27a7044446ed2c93 halonet:preservation_site.zip +Primal_Hunt.map 39542EE6 132986027 262144 40306e70e6febdb566cebb6bb3ee5266d3d0c488 halomaps:3942 +Prime_C3.map DDAC00BE 59855636 262144 0fb418229d4f6521e11a7110774b9fd9d595c57b halomaps:1990 +Prime_C3_Race.map 2FD87B21 60729992 262144 a656b023a0b90661cb54570ba1b73b89943f3acb halomaps:2820 +Prime_T3.map 7B9B8667 59398688 262144 07031b9d622984ac38ec28c7cd9d0221310e0232 halomaps:1991 +prime_t3_KV.map 2B372B38 56172610 262144 4270ae7d87fad1d5212c87c728e21dc7e89c8558 halomaps:4344 +prisoflood.map 7D5FD2D4 35806496 262144 371921b81545475e13ff486006757478aeb8f22a halonet:prisoflood.zip +prison_break.map AC601926 55516756 262144 22428b9e3f67620764ae0adb83ea6b8e40180a55 halomaps:5471 +Prisoner 2.0.map 651611AE 134318344 262144 b88dc92570546d9c89e333c5f200b6c728a91663 halomaps:6557 +prisoner.map 43B81A8B 13170108 262144 9d9b7d9ebc6e18af172e7cf0cdf727245d49d463 halomaps:4785 +prisoner_ai_war.map C7E6966F 54396639 262144 fa7eec746709439daa4fb70b7390f2aa58a76640 halomaps:3617 +prisoner_colour_war.map F2A1B3CD 26826962 262144 adbfa828371040ce281eeeb6886ed2b8d0ab8411 halomaps:5290 +prisoner_pp edition.map 7E706156 15821356 262144 c2f3523a70394beee02138263a0dfccf7bcdf5de halonet:prisoner_pp edition.zip +prisoner_race.map C6F54CA2 24105644 262144 803f78b13b4dbc68b39cb772d53694f545d99e33 halomaps:3501 +prisoner_rm.map 43B81A8B 301190400 262144 e65926668423536cc523540b6bd53232204500f5 halonet:prisoner_rm.zip +prisoner_tmcc.map D9A9E47C 37560004 262144 1f0d2303cee8e112af3c636aa5a18dab94189c4e halonet:prisoner_tmcc.zip +prisoner_ts2_robot_factory.map E4F9783F 17469320 262144 5269574293ab4edec160ec5d2508ee95da8166dd halomaps:5291 +privada(noche).map 79C3055D 99534878 262144 ca1db7ebc305fe369a1a1b73fa25f4ca68ae79d3 halomaps:6753 +prodigy.map 64B9657A 17331017 262144 84f000367724652952fee4b2c2a669058dbb5946 halomaps:1298 +project_subterfuge.map F073DCC1 214209085 262144 c817f28bfb0f8e5d1d45a5ce5833fd01d51631dd halomaps:6241 +projectsalvo.map 00E90C2D 91738138 262144 a360284641424020e6cf2858fc247c63e72142ac halomaps:5472 +promenade_beta.map B8044E38 15581412 262144 a4392ac35992debdbb83c325a9dffcf92bada99d halomaps:266 +Prometheus.map 3378DD2E 212945015 262144 787e19c12d2abc19986f7cc67d1001374b1030e6 halonet:Prometheus.zip +promises.map 15E78A94 36384895 262144 3fc906a620c884ff9c2026b76cb961ebdc283c02 halomaps:5135 +provenance.map EA01C76E 13978624 262144 971363981006e701f4be1bce4a384c948f431075 halomaps:1088 +Proving_Ground.map DE2F1784 195802503 262144 a10713e7e316e96b3f062e044fc141dad31f2e02 halonet:Proving_Ground.zip +prudhoebeta1.0.map 621DE9D0 33715420 262144 0417715b3cbea1fd999c44c33d718602d9262cb8 halonet:prudhoebeta1.0.zip +pruebaxD.map 45A9C643 285091252 262144 d24be032e5eb880e9383d41b9968c07f8fdc8e95 halonet:pruebaxD.zip +pry-h4-infinyty_beta1-azu.map ACB35846 377672131 262144 f0428ea9712261b4bcc090941136ea44c86bff66 halonet:pry-h4-infinyty_beta1-azu.zip +ps_rainbow_road.map 12C0EF7F 63510102 262144 9aac2fa31eac32e4fc3549fafe550c0d8d22164f halonet:ps_rainbow_road.zip +pso_da.map BAA69173 14909905 262144 c7983192aa701771affe2e22fea767d88c3bd1f0 halomaps:926 +psyconeedletastic.map 5D81DA12 21953954 262144 eb7a41cd4bba2e5626340a8f05b8db7c743cb00a halomaps:2261 +PTM-Permafrost.map AC842DB0 21956070 262144 91bfefc20eef67b03d7ac7bc67a8c7c1932fd0d6 halomaps:6496 +public_01.map 09E53D2B 16717845 262144 ba5bca63bea491fa8dcf7fecd7ee816d4c22beec halomaps:5374 +public_02.map 52631412 26380510 262144 7dd96f36b9cfefb8c17572e52c6d7a72943e16c9 halomaps:5375 +Pueblo_Fantasma_BETA.map 860B13AD 99090448 262144 89935b3fff10cc572d615163fdb37c0ef663aa99 halomaps:5790 +Pueblo_Mexicano.map 33D00A75 253225669 262144 1f2b97ffda799209991e03a78990f86c0c81fb70 halonet:Pueblo_Mexicano.zip +purgatory_public_beta.map 67A3922A 21419968 262144 0c8828dac304c7042abf455008278fd8c653d960 halomaps:1638 +purity.map FDD0B808 76511245 262144 854311204ad2f94ae82c1e6bfac5b37e28f1c2d1 halomaps:4810 +purity_and_innocence.map AF7BA1D0 23004144 262144 f862c8074d11d903d34301a3c65b476ab8a72b31 halomaps:2386 +purity_and_innocence_ver2.0.map F24EA998 23015421 262144 e18d4b206e58c7a4e1bdb09eab5688c2f7700e62 halomaps:2440 +purity_and_innocence_ver3.0.map 41F6824B 23015965 262144 bd2d8fedb40c5b73c8641c3ae90b0454f30959f0 halomaps:2441 +purple-screen.map 08A90538 22815408 262144 ea0859d9a5382a4c782def2525d316e95dc3265c halomaps:5066 +putput.map AF2F0B84 14171580 262144 e2294fc3903879c44756491f0fcf7d8cc52e40e4 halomaps:4786 +putput_ftw.map 023902F1 56340428 262144 74a5be074ba62c274f0385270c9d33e7a81a6ee5 halomaps:4604 +putput_rm.map AF2F0B84 300258336 262144 bb22de71d8e3bf9fe5d4f134f68056134b95b3e9 halonet:putput_rm.zip +putput_tmcc.map AA17E680 38302104 262144 700d831a0118f6af629bcb966bf731de5a1143bf halonet:putput_tmcc.zip +Pwn_elites.map 1321F5EC 17376172 262144 b6b0f6c53e15fc97d233f5f4b1ae5381d0b890de halomaps:2615 +pyramid-of-power.map EE9C7035 17114992 262144 ce455a4f5724f6322964e8c118a0006dc5c4ae2b halonet:pyramid-of-power.zip +pyramid.map DA22D852 15228144 262144 7344189757ec56173367536cbcdd4b9ca2e7faa5 halomaps:361 +pyramid_alpha.map 1CC5234E 94789640 262144 2c6248ecc1b95c68d88d7df601ac203b252bf75d halomaps:3567 +Pyramids.map 4E42243E 16471309 262144 ea7b0882a936cfac65b8b321295e4519a9de9fe7 halomaps:6024 +Qauntum_Realm.map 447DED2B 232286150 262144 73637f680cf812fe363308dde3094318423a6e8c halonet:Qauntum_Realm.zip +qpq.map D900BAF1 55089270 262144 d09d41c3db8ae8ce0dfd7b557db6a0946451f9c9 halomaps:6905 +qpq_zambies0,4.map 0908333E 69717063 262144 231d6edb689cd21b1922256688f938f9c939eabb halonet:qpq_zambies0,4.zip +quadropond.map 6B751B82 17906336 262144 eca5b278bbc376025ff6ccfd2b67718d2ae5cdd9 halomaps:402 +quagmire-v2.map 62306AC9 90622195 262144 80b76b1bbd5a4197661b7b8081723ae07db601e0 halomaps:5265 +quagmire.map 02E4FC3D 22242880 262144 6790eac5f989974a60139d93e1a959b470485066 halomaps:267 +Quagmire_Daylight.map 20FD4D65 25500580 262144 ede1a1890c12571c8f59bcd840dc5063dcece7b1 halomaps:2533 +Quantum_Realm.map 447DED2B 232286150 262144 81bc26703fd52f15bcc1d154d877a09a678d7bd7 halonet:Quantum_Realm.zip +quarantined.map ADC8B924 69038429 262144 46b992efd49bd8e6241d7dfde85585be5a14ea0e halonet:quarantined.zip +Quarantined_Again.map 1F507169 361585234 262144 aaa31110d11cef69af82cf4b71f96d4968396206 halonet:Quarantined_Again.zip +quarentine_zone.map FC783ABF 146851242 262144 ec660b6ff781cc06e1a9c06dd1e2ef601ca3867b halomaps:5027 +quarry_site.map 614D3EAA 16239620 262144 4100a19f69f4763c3e7233a021bb572b09d0245b halomaps:2696 +quick_death.map A86ABCA6 14034840 262144 79105c755b8d98b83c894efbeefba6e6edba8828 halomaps:475 +quick_feet.map BC280601 17344617 262144 3edbf07cbe174b9618a8b216e9c1971cea6e5fa8 halomaps:4267 +quickest.map B2471730 12185104 262144 0e0add37b5f7c50a206b1d36bed51be9bbdd315b halomaps:268 +qwertyuiop_test_map.map 8DD9DFA3 14237924 262144 ee3426aae22a0cef6e187292b2350b59ce49d427 halomaps:5640 +r_legado.map CC381A42 204261087 262144 5f3759b73bcb673e9e8588057511a49c65bd031b halonet:r_legado.zip +raaar.map D900BAF1 55089270 262144 2a2e031a9b77c02b21dd92e0dc104eb0bd6de166 halomaps:6906 +Race House.map 3B32F167 295167781 262144 b8464fa3c6d58e79404db199d3966a625b292966 halonet:Race House.zip +Race-Track-#1.map 8E868FBD 16986596 262144 8f4da60aebd237a9243121cf853732af7906a19c halomaps:7111 +Race-Track-#2.map 6F7E805D 31152171 262144 710fcfd76605883817fbe167cf95d15521f58dfa halonet:Race-Track-#2.zip +race_track.map 3DC2FD9E 13002056 262144 0b0b1126b87b9bc9bb787601f1d6f7214dc28759 halomaps:312 +race_warofhog.map 645CDDAE 33557287 262144 98a75bc124690357d43f7aee4e6346fd7911a6cd halomaps:4722 +raceofpain.map 6E52FFB6 13914244 262144 dfdf1ee0f056c3bfbea612b026fbe57e6e4fa1a3 halomaps:4914 +raceofpain2.map A2BBCC64 75955318 262144 1c4b2e70b1652a701de683a7aa3c96cd9700d30d halomaps:4944 +Racers-city.map 682566CD 20678500 262144 89e95bb6d17e51b738dd6a9ac8130c0faff5a37a halonet:Racers-city.zip +racetime.map 4F235804 33110018 262144 43730d297f0db7c0edf44b56675490b7cf03b680 halomaps:3968 +raceway-mod.map B8390513 21377831 262144 7e0898881bb47a00d2e30276fbd339f8ffbacd30 halonet:raceway-mod.zip +racingfield.map A947BB44 14405656 262144 33843a4cb27e5ee7d1a1b62f28c13db7eaf61719 halomaps:4518 +racist.map 06B5E736 19483007 262144 e45331a1d9b09f8681226560bd82d236228b263a halomaps:7010 +radius-ai-demo.map 1D988CE1 71823053 262144 38164030ac4f1cd27c65baba415d94272c2927e0 halomaps:6754 +radius.map 1EF590E9 17804280 262144 b4b9979c387822bd58782543b6679503d6ddc34d halomaps:3601 +Raging_Troll.map D602630F 12796624 262144 289054a8a1dcad810c6460ab689ee6c40ae87549 halomaps:5299 +ragnarok.map 0787CF18 389319286 262144 8f9fe1bdfd84c300a96f110276b69feedcd1ee5f halomaps:6722 +rainbow-road,v2.map 12C0EF7F 63483847 262144 a97e41594b9a389560ef39d6156e49057d095896 halonet:rainbow-road,v2.zip +rainbow-road-v1,1.map 2F06E09C 15378396 262144 809d2dbcbfa55b25315c70a69bc24260377f0bb4 halonet:rainbow-road-v1,1.zip +rainbow-road-v2,1.map C5D22869 30360391 262144 280802652c668c7dd8f2fb25e074ee021fc301d8 halonet:rainbow-road-v2,1.zip +rainbow-road-v2.map 75225E82 30525005 262144 af96d9da08dbed3617dfc892034862ba467face3 halomaps:2859 +rainbow-road-v3.map E311A1A4 28870489 262144 d08eee73b0063bb1e7e2b0f7c05e3a1c10e224bd halomaps:3355 +rainbow-road-v4.map 81038764 35707767 262144 2091394f9921f4ad10ae636e33c2c8a8a383c972 halomaps:3765 +rainbow-road-v5.map 20253DF1 27978115 262144 8244e280f01667cc58212cc44a263a5be3c640ab halomaps:3920 +rainbow-road.map 12C0EF7F 16419488 262144 9b3767b5612ccc0bdbab73caeedc79aef79da573 halomaps:2505 +rainwash0.5.map 85E6C0E5 13031268 262144 d978db6a7f6a6c9e1d5e5e60d326d340886a23ae halomaps:2582 +rainy_nationalpark.map 6C883CFD 44833778 262144 4f299295dea2aa99538b91f31e1c68d0220c0483 halomaps:3648 +Rampage.map D981C231 54730789 262144 f147fb6886a28bbf595dbdced0f3a8136ccb852a halomaps:6767 +rampin.map FE166FE7 68757682 262144 0ab9069d7287e5b0c7e79f527672c28db42967e2 halomaps:6154 +randombattle_v2_beta.map 9071CDDD 76727261 262144 25cf00a5a6e36c3b06ef04021bfd4e69fdd5c5e1 halomaps:5691 +range.map E708405A 14852912 262144 bc88b7ffb38c570a4ac5c050a113ba9101a0bb1b halomaps:584 +rankin2_multiplayer.map B80B495D 47427599 262144 e7a200e77082173d16751cec7175cd8a7ee595f7 halomaps:4076 +Ratmaze.map 7D19EA46 12971108 262144 0756a53920c62716eb6c0a65873f172e35c23f87 halomaps:1135 +ratrace.map F7F8E14C 12762436 262144 5aa4bc7b6306fc5c02333faeb8149d2adc1ba523 halomaps:4787 +ratrace2507.map 918DD9F1 131994274 262144 187301b4baec43d1c2690b95d410c0f5c7f82e2c halomaps:6418 +ratrace_pp edition.map 7E706156 15409800 262144 112e446fb18c3a033e8a7e8df74056289e2de862 halonet:ratrace_pp edition.zip +ratrace_rm.map F7F8E14C 310398628 262144 e02203e7f79dcacc6a6aca172cb9d4261b1339e4 halonet:ratrace_rm.zip +ratrace_tmcc.map E51FCD4E 39528140 262144 972d5701b1518f75d139fcb5826bac356281836e halonet:ratrace_tmcc.zip +ratraceaibeta.map 36BE94EF 52951519 262144 c536465668a45296973b106af951be0d7066e4fd halomaps:3618 +ratraces.map CA3BCE8A 22044592 262144 835b6b8c4046cc11b8543fbf0cecf0986e55bb4a halomaps:3502 +rave_fight.map 3A227B59 102381941 262144 8a23d317a3fc191a7c66a6235784d74b537c672c halomaps:6398 +ravine.map D1F8B9EA 35312092 262144 815fbbddb16b4d430a206263acfc99282c6486fb halomaps:552 +Razoredge_canyon.map 6B757976 23990531 262144 a54c6525a255b07b6949339e0eeddc527d04f0e0 halomaps:3619 +RE-Storage.map C8BF6EC9 17179124 262144 4134a917ba7df9bbe6104ceaad39c1089b4d75b4 halomaps:618 +Reach mountain.map 4EA4D411 258475368 262144 78fa167e05dd2d20e4a25f0b130b28fa5f6a3ed7 halonet:Reach mountain.zip +reach_ARtest.map 2C4FFF9D 59579647 262144 d6527826e7b1f4454854a6e8ff95b933bab68e9b halomaps:5473 +reach_battlefield.map 9A159316 132258956 262144 02310a0124c71667697e8e9e61591e65e2fd95c7 halomaps:5809 +Reach_Battlefield_V2.map A32D5D29 130058929 262144 414920be05d96c427b1587705ce279230b3062e3 halomaps:5817 +reach_beta.map 534C5F35 112869526 262144 54885461120342a8729a3457e3b4a9105f3784e0 halomaps:5569 +reach_beta_2.map 0E2535CC 84598380 262144 2f571465273fbdf8a2db90e7040c7251e53d9174 halomaps:5810 +reach_Canyon.map C49276AD 13668792 262144 36de07e2d1006a51b4c6f3e8d9cf0a382e1da986 halomaps:4945 +REACH_City.map 2BD4374F 45346455 262144 69f371d53b653a713bc5c4af3d4d1a85f78a9680 halomaps:1612 +reach_damnation_ai.map 82BFEAF5 161282011 262144 9d4dff5a8ead5a022be9f9afc1562882fe4801eb halomaps:6303 +reach_hangemhigh.map C52222D1 37546624 262144 3d63ab7e2bf0e32bfd9060d10a2c9709703a8706 halomaps:5734 +reach_hangemhigh_final.map A5B9F92E 63873499 262144 5d5ec062e53375c9586ec5a3d4463d521c401095 halomaps:5966 +reach_mod_cov.map 9204CEDE 390731681 262144 e13d6a10c00885e2a4d7fcb453ccf6ddf600dda4 halonet:reach_mod_cov.zip +reach_mod_human.map 8DA04676 388539748 262144 9619c43d84837cca5fb86764c0ef6c19a4840d6e halonet:reach_mod_human.zip +reach_poa_mod_multi.map DD54CF04 114287558 262144 b4a2cb23739e23184388fb57dda7f5c8040eb624 halomaps:5744 +reachsucks.map 6D7FDE53 169324907 262144 72cc885f42d5d3e74c278f8118f18941023c85fd halonet:reachsucks.zip +reactor.map B34B1CC2 13519704 262144 d75b6c8af9085583a612d5e5222eb189dc0be491 halomaps:7062 +Reactor_Team-Slayer.map 6C742BAD 20097808 262144 d172cd27af7782eb5fac8e8fc384cc274b220b5a halonet:Reactor_Team-Slayer.zip +Realcanyon.map B628E9B7 30729519 262144 ad48436d02ec802480ddfa8d54926a8664a8fcc6 halomaps:3150 +realgulch.map 446ED552 28790772 262144 ace11d1eed4a75014c52051b1e567bbf83712c60 halomaps:2994 +Realnation.map 1CF3B30D 36534054 262144 24a5594bf08b790510e70d214fceb24496c5d65e halomaps:3151 +realwinder.map 2EEA02E6 39412652 262144 6ebbeb4572913533456ec666522050c077488203 halomaps:2972 +rebound.map 9EE2BDD5 13832409 262144 267657dbe95e52d906360314cd6547e3420ea42e halomaps:2373 +recharge.map 3B80EE25 13690804 262144 26ccf0021114b2b71c0fd68d04ce94ad80e62670 halomaps:310 +ReconRace.map 742575A5 53759760 262144 d679dbea3a7f208b9f0c45487c383346f7d5111a halomaps:5160 +red vs blue 2.map B864A0A3 115529006 262144 9968979bffb515c3c44118c690bf0b8e12893d6f halonet:red vs blue 2.zip +red vs blue.map 542F519A 31340118 262144 2903a89d144f114b4931f31ff73e331c315b80ec halonet:red vs blue.zip +Red_Feather_Ranch.map FC5214E6 45115761 262144 054fa26fa78314a001017ddfa20291d1f76b909b halomaps:619 +Red_vs_blue.map 5E15D11F 15560437 262144 8373cd21cc90f32a79e948435e5ccc2d6520a1ee halomaps:6429 +Red_vs_blue_v2.map 7A76688F 15580777 262144 086d5951c2d0e256218182c42b8e3e67ba48293f halomaps:6430 +redemption.map 61F6CE1C 18110033 262144 5cbec99d2c7749dc217f67aee6797c3daf22fd63 halomaps:929 +redmountain_beta.map C361BB67 16809140 262144 816aede6c4c313baebed62207c317f5ced46eada halomaps:1816 +refusal.map 32E27E54 19101408 262144 51aa06754e080653907523b4d6fa15367dabf2b6 halomaps:3620 +regret.map 0470BEC1 44205943 262144 75aef92e9be94d41c25d9b1041d7e15c29cf1df4 halomaps:1227 +reilight.map 5B7B3C8E 40257452 262144 8e02d14c1d79c72d24241ec8d458f15d4cac0ce0 halomaps:7036 +Relax_beta.map FDD46FAE 31881837 262144 bf52b0cdf2a1ee748d2f2cdb67e906d3fb449bbc halomaps:3296 +relaxe1.map 885CC5C7 25432342 262144 2b7eced26717622d021fe3121c1b9a196e8fa66f halomaps:4433 +released.map E0581BD8 24155844 262144 07a74af2a0a00e90edbe23faedd45f9b70bd5c67 halonet:Released.zip +Relic_H2_v2.map 41C0E417 57221935 262144 5a6454e79d63abc2ae613d639673695661dbb815 halomaps:2583 +Relic_v0.6 alpha.map 23A04706 60109753 262144 ba2f7218c5a8dec89be42a0b9c64b4017cf96074 halomaps:3416 +remains.map 9CFC0277 30856084 262144 7ee298c1fd2fc99c611d4912ca781f9507fd9e1d halomaps:4811 +remnants.map 9EF7A0D9 44654140 262144 d50193bf3059c8cd194124d460f820bb8c5553d6 halomaps:1070 +remnants_INSATIABLE.map 4AAB3FB3 89131807 262144 8d43b8e299220c2a8b52a5f0214628afa8268f0a halomaps:5048 +remote.map C6288C06 13265476 262144 e770b4fc4d341e197f079a2ae131bf560b36aad7 halomaps:1552 +renaissance.map B8712640 58609833 262144 b05b1a9ec69497a0ed64fb6352a62b7004ac795e halonet:renaissance.zip +render_test.map C8C3ECBD 30889728 262144 c30c551307c1370c92d9dc9af7aea3358c681551 halonet:render_test.zip +repression-firefight.map D793B4E1 296158546 262144 70842c08413de34d4e066ef8d252de1e08adc3c4 halomaps:6931 +repression.map 63A5AEC8 26060568 262144 3f45f7ed5ef8a8621331076ee0030d5b1c848c3a halomaps:4232 +requiem.map 9F409185 55512544 262144 78452a6c9f5a5d2545ee73a038826b59c0e4e609 halomaps:6155 +rescate_de_johnson.map 745FBB70 80667584 262144 278463eb1b328ecf4a2202763b42e534720df627 halonet:rescate_de_johnson.zip +reserection.map 22C16FDF 105419560 262144 e770bdac5cf5c5af6e4d41a8b0eb4b7c8c4396c9 halomaps:5709 +residentevilhalo.map 124013DC 19642241 262144 ba8fe580f133d0f1df4095a37eb338eed7ba67a1 halomaps:3297 +resistance.map 37155C73 156479536 262144 d074f63e6c2c57b97a011d0d5863b2682fc3335c halomaps:5625 +Resortv2.map 849940C5 81822342 262144 38e73b4e69a8078d4b26c8e8da1de93523ac6f2f halomaps:3039 +restless.map 8868C3ED 37573335 262144 81ff29613f1fb2d8acafa40ead5d7ff90cf6bcb2 halomaps:2550 +resurrection.map 25253DAA 30566868 262144 49c6f828d1023f6e02738016f45fa5c31c311647 halomaps:1030 +resurrection_mp.map 7CCF6411 30918920 262144 1a54165591ecad3343ea0b2e83ae20d0c7e00acf halomaps:1031 +retribution.map D9E5A1B9 75987337 262144 a8e6f38f514268b230093e75b5db3ab7f890878f halomaps:2093 +retribution1.1.map AFD436B1 76048649 262144 da8dca030061b23d4cacf8f8069b4245065b3c72 halomaps:2130 +return_of_the_covenant_c1.map BC64626B 49407943 262144 09f2fb8e340b067ac418e08ab80f74d9ecb0bd93 halomaps:2561 +return_of_the_covenant_c2.map E7C70F40 103476043 262144 e2af62a87aca9354e7b5096eb44c180af26f57ff halomaps:2094 +reus_ai.map 146ED312 271342167 262144 22b0b1e6beecb15ea58d747f589a65b2d25ae1e4 halonet:reus_ai.zip +rev_beavercreek_cavebeta.map 284C532B 244813030 262144 014fb641c39568608fe9387935d09d636f9dfbfd halonet:rev_beavercreek_cavebeta.zip +rev_carousel_cavebeta.map 5C12B5E7 229722652 262144 10a9e87b15390e2fcf4faaf1986bd3656294f884 halonet:rev_carousel_cavebeta.zip +rev_damnation_delta_cavebeta.map 072A0C62 248819990 262144 30a6dd2a2b216c8a82ab4ab11e65bdfac95da6c9 halonet:rev_damnation_delta_cavebeta.zip +rev_delta_station_cavebeta.map 5B16494C 243649424 262144 c48d7c91bb43d0bf2b19f555ceb38784ba8e2404 halonet:rev_delta_station_cavebeta.zip +rev_deltaruins_cavebeta.map 96CAA71F 296318562 262144 3f8eb5a8f6144c81a0a686eab2668ad5881dbf7f halonet:rev_deltaruins_cavebeta.zip +rev_dichotomy_cavebeta.map 90C4523F 200119049 262144 99b0795c28f80101db02fb60ce95475058218e64 halonet:rev_dichotomy_cavebeta.zip +rev_downrush_cavebeta.map 69D39D1D 231463746 262144 be64090bf6c6ec47e74f89a550bd665dcbdf954b halonet:rev_downrush_cavebeta.zip +rev_fortress_cavebeta.map 81690F91 213837313 262144 c2ca73cf0840346bb56ace94548e5c89d6de0696 halonet:rev_fortress_cavebeta.zip +rev_gridiron_cavebeta.map CC3BE29D 228714199 262144 ee08f731ad176c60c90f56731136ba072519d9ea halonet:rev_gridiron_cavebeta.zip +rev_hangemhigh_cavebeta.map EF9452D8 231244833 262144 b09af133f33e6c51f58f1fe76c937d6fdefac985 halonet:rev_hangemhigh_cavebeta.zip +rev_icefields_cavebeta.map 33A57F99 242315954 262144 e2e67cba4b72579e35b14c93c09aab23e944b444 halonet:rev_icefields_cavebeta.zip +rev_immure_cavebeta.map 438A0219 238776541 262144 07635a35036259e6eed29363a497c91c16543041 halonet:rev_immure_cavebeta.zip +rev_lockout_cavebeta.map 92AB758A 227403257 262144 a18deb45c85d26f7537648a8f4b45cb4556d9972 halonet:rev_lockout_cavebeta.zip +rev_midship_cavebeta.map C13A86C8 243680494 262144 67cdc1354c38f50facb5c2b7697c9db64ca668b7 halonet:rev_midship_cavebeta.zip +rev_paradox_cavebeta.map D8ED5249 234089463 262144 3e9a04656bc1769cb2b11648640d46dbe17dc69b halonet:rev_paradox_cavebeta.zip +rev_portent_cavebeta.map C6869835 275078087 262144 b532569ce2874fce1a0f7b8196459e0bfa0f05cc halonet:rev_portent_cavebeta.zip +rev_prisoner_cavebeta.map 2AD4C033 214937293 262144 4ca53f0d76999ad3f953e892a88036ce02795876 halonet:rev_prisoner_cavebeta.zip +rev_ratrace_cavebeta.map 60B52617 239266574 262144 c905e4130d8e50dbe8bc874c2eda84f1551c6c5e halonet:rev_ratrace_cavebeta.zip +rev_sanctuary_cavebeta.map 73D1619F 265189418 262144 e24ef1f091a8e5490965c5127c37fbbeedfc20f0 halonet:rev_sanctuary_cavebeta.zip +rev_savior_cave_prerelease.map D11D0F9E 236428296 262144 5a7a093f4e61644b19efe28af1a4f29f3635e040 halonet:rev_savior_cave_prerelease.zip +rev_shockwave_cavebeta.map E85E88CA 213709021 262144 7c1f4fb1ce8c73a5b05309abab7cd6dfb518f307 halonet:rev_shockwave_cavebeta.zip +rev_snowcast_cavebeta.map ED7663A9 231511233 262144 1ea131e1c2af978c8bb13a1b67bd91da86951bb2 halonet:rev_snowcast_cavebeta.zip +rev_snowed_in_cavebeta.map 21C838FC 254463249 262144 b0c42f39bf52c02f24aa5539e4ad63a424064d8d halonet:rev_snowed_in_cavebeta.zip +rev_tensity_cavebeta.map 5FC5C68D 249419425 262144 e540d49ea20674be95a4c68872179f67de96c4d6 halonet:rev_tensity_cavebeta.zip +rev_trench_cavebeta.map 072959DA 231886662 262144 3306a86b486c49e8cad4dd7ced2086ed33df6a7b halonet:rev_trench_cavebeta.zip +rev_valhalla_cavebeta.map C6F01EED 260587012 262144 137d52f707e2fc6ed578d10949fdd108b2937c02 halonet:rev_valhalla_cavebeta.zip +rev_wizard_cavebeta.map C0A0B2CA 198227924 262144 36feed1aa3324e31a7304722abcc1f40e0a4a9fa halonet:rev_wizard_cavebeta.zip +revelations.map 3735450B 107649486 262144 59fb7323a963922d9d8079b2c5bc96ee79fe6498 halomaps:4992 +revenant.map 8CA6C57C 24229992 262144 0519de5165f6f60515775feaf1ceaf82f8d14f57 halomaps:622 +revoltijo.map C742B51C 49743592 262144 2d78f319f0741c93e663f3aed6a41cb681aa5183 halomaps:6399 +revolucion_mexicana.map 49E27A2D 123888558 262144 1b7bd1ab1f555b3a2abc974c62855eca7f479e39 halomaps:5028 +revolution.map 264E6061 37449051 262144 0298ae995c8c54b50fda776feeb15cd96bbaad8a halomaps:1745 +revolutions.map 7F0EAD65 41142460 262144 18bb1290c16142f20fdf7bb7ca85703a0015d5b1 halomaps:1758 +Revolved.map 97D13093 18046766 262144 22f37d70cebad9fdc327fa347326432557e723c9 halomaps:270 +revolver.map F19563D5 14723552 262144 9d9985897363ba9cf6c0aaac51a0fc2dcec17b29 halomaps:756 +rez.map F2752437 18887773 262144 8721df5f0bc817298ed63e8e41b329372456af4f halomaps:1493 +RG-Battle-Buggy.map F87A7A03 29413818 262144 673092e7400ebc6558fef2fcb08a3e8562729235 halonet:RG-Battle-Buggy.zip +RG-Desert-Storm.map 9CA6C830 129995545 262144 e9b57313a6ba549b3d6106f7b7a1143020c35f16 halonet:RG-Desert-Storm.zip +RG-Isolation.map 976CD880 52853357 262144 75ece3534328606fdda0363b47ccab3496cb11c7 halonet:RG-Isolation.zip +RG.map 077A5AD8 84534982 262144 fb1a563477868b66cfa4d015b88d9619fb31e541 halomaps:6069 +RG_Amnesty.map 569B04D9 142886276 262144 cc8df3fc78325438cf8d4bb147ddd60102fb8cd3 halonet:RG_Amnesty.zip +RG_Battle_Creek.map 122DD3AF 102734805 262144 eef03b1b561d0b34b2fef6f0d9515ebad8763897 halonet:RG_Battle_Creek.zip +RG_Bleakness.map 6CE8F319 355753465 262144 5eb10e3ba13adeb54f719ee61135cfc5afb65f6f halonet:RG_Bleakness.zip +RG_Boardingaction.map CDB3D299 147747871 262144 93078b38e0492484f0ba3137451d33016a7b7ca2 halonet:RG_Boardingaction.zip +RG_Coagulation.map 28424D94 190962227 262144 7aa3825030bc4df69d13a80c38619e51db2e95be halonet:RG_Coagulation.zip +RG_Double_Gulch.map 01E97CED 138610021 262144 c91875104a32f4da3b75b49bb74c6f23ba78669c halonet:RG_Double_Gulch.zip +RG_Double_Gulch2.map 97805C36 141461177 262144 d671b5399d1982d50234a8f17df2aedf5e7d091c halonet:RG_Double_Gulch2.zip +RG_Immure.map 00000000 161781141 262144 2a01ccd2a56fa8576c3b988017a2a69182f2d008 halonet:RG_Immure.zip +RG_Intensity.map BDCA6D1B 392923167 262144 291d263f745f2052652c603873e32cda8615558f halonet:RG_Intensity.zip +rider.map 00214396 14520424 262144 b8bb86e250f6cc44596ba77dafa64a9983fdca35 halomaps:2442 +rio_firefight.map 3408602A 160133766 262144 ac8e63f4072576cb292621bb7fff770cf7d070a7 halomaps:4693 +Riot.map 25F493C3 219626671 262144 170befb7b398cb56f1eb6cbd5d13e43e37ae1877 halonet:Riot.zip +Riotsgulch.map 7B309554 13936092 262144 51bde2f78e9467da2c43460f2514b219224d54cb halomaps:1274 +RIP_Blood.map E08AF3D0 52764594 262144 b47f700d3ac745b7ea77f51fa1d8a230bd8ddc54 halonet:RIP_Blood.zip +ripking.map 7FA9ECC9 23367096 262144 cc6ed2d94ec0962aa7abadf87f7f4ee0c0c409dd halomaps:2697 +rivalwars.map 96A93DE6 82491068 262144 624828e583e4ef69c12d1ec876d7943f9c4b8dff halomaps:4369 +river.map 8EAE06F3 28541241 262144 2338d1e290245e09665863716d7be9884c133ea1 halomaps:2860 +River_Madness.map 5C043349 170612887 262144 0faf1a9cd4cd9e1ebc6721ee67ab1f663ce90efc halonet:River_Madness.zip +river_nuevo.map 9E0DF5DA 73994869 262144 5362b3b5e1f5854b6a3ccdf94b4e4aedcacfe23c halonet:river_nuevo.zip +river_rage.map 2984FE9E 56900813 262144 457c665f10e5c9976f7f043f9499ec9eebd4639e halomaps:3040 +RiverBlast1_Ang88.map FA04C871 17378276 262144 3ba43d9373f88ee6971c82db6138f9185b151b24 halomaps:271 +riverside.map 63EB778C 15590751 262144 b7d8f41764da8fa43af1c357279edbd21bb7f118 halomaps:3795 +RM_vengeance.map B20BADF4 34957230 262144 b0d0947480f1390b545874393f744f819ff55868 halomaps:4991 +rmt_gulch.map 67CC18F5 90616548 262144 bb3a5c35461604428fa9908ae0b353e887ba8945 halomaps:5492 +RMT_hog_run_beta.map 148ACB5B 113699183 262144 d972010601ea2f4c961f15d142d643aaba411436 halomaps:5505 +RNDM_Ascension.map 8D9F2EF3 83387093 262144 bd371ddbf40615afc18354d7263d51eed84f115a halomaps:2821 +RNDM_Forerunner_Waste_Storage.map 35E9518A 71355819 262144 2f4f4fd4c43ecb1da8f6a2270186f2965d040cc9 halomaps:2822 +RNDM_lockdown.map A2B63545 18058993 262144 e04dd8cf885ffa422350d78dac4fe0ef45517c9e halomaps:2812 +roadv1a.map 22C7C7B6 95268992 262144 0148562d6f6aaa17d2fe43b9c654ecc51e42ea26 halomaps:6679 +Roblox_Challenge.map 066E28EA 148128225 262144 a939368cc7696586126a90ae70ee7851fb869dcf halonet:Roblox_Challenge.zip +rock fields.map 96D2BFFF 32097819 262144 2747effcc83840acc6b195db76ebd33bdc0f0353 halomaps:5967 +rocket_arena.map 0E8E955E 49144940 262144 6d6ab717d70a900d6584cb00c9f00f38bb5a42e9 halomaps:4097 +rocketgulch.map AB391244 36110228 262144 b0dcb8f07c0e02038462c91ff0aeb1ca3dd96216 halomaps:2927 +rocketwinder.map A3098C45 35951960 262144 c11fa196d056b4ab6476639c14d5f044d8d1b588 halomaps:4412 +rockfall.map 3AA8837E 86573375 262144 cd2161af6070802c80ecb7aba0ae9175f3697f8f halomaps:2959 +rockslide.map 6F0A1833 33446099 262144 c833a94234dfe8ae29a65caae8437fbeeec04631 halomaps:2995 +rocky.map 2BC0DDDB 13817844 262144 5fa918fdc58ef034335d39e73d1466c8b1eee5f7 halomaps:329 +rockycreekAI.map D541DA45 47623546 262144 160e70fc037d51daa0d6421c27d95c216f9f2a84 halomaps:3602 +Rojos-vs-Azules.map 67AB571F 270444415 262144 5464a77ebee371939927b47e5d463e3c5b596ca6 halonet:Rojos-vs-Azules.zip +rollingonwards.map 9C410971 18467600 262144 b81dd8a69c7897a4770faec58991231ab74c1cce halomaps:330 +room.map 09C65F43 13954596 262144 cb6650c871319d19267f10ecf24a29f808c57af7 halomaps:342 +room_final.map 69D86D63 18572996 262144 982a293e37d2a8787d5511b956228e13fb3662a5 halomaps:511 +roomsofdeath.map 587ED686 13655516 262144 0ca486e5b98aeb5d2ba7c350bf6da2e6a86c22a9 halomaps:2042 +rp_gamma_build20.map 049E58DF 179191246 262144 ed9dfbfa3d8bb75521e74b99bd501a459dee92e0 halomaps:5512 +rp_gamma_build22.map 5543D2C1 179913162 262144 5e2bd3cb04c622824d5f5022b9d2758a698dd146 halonet:rp_gamma_build22.zip +rp_gamma_eva.map 93CB5571 154495762 262144 79f84eb24a8f5d11f3336bf30166722bdfea8ff2 halomaps:5513 +rp_gamma_marine.map 20EDC5A1 178630374 262144 55c79878a6753b91ce781afba907f990ede76bad halomaps:5514 +rp_sealab.map 25990692 39686404 262144 259229e353e0d388c978657b845ec238624588d4 halomaps:3554 +rpg 4 test alpha4.map 3647D088 132713286 262144 e9242e59b8b4a5aacdb4c09c8aa21f9133b1ecc7 halomaps:4203 +RPG-campsite.map D9C3F817 40407719 262144 d921b2b74a729aa9e0b747932a12ff4fc1712490 halomaps:4098 +RPG-west.map 863585F4 58920971 262144 6f7248920c8fcfce46b1a063f7c972a6f0ffddff halomaps:4434 +RPG_6_Mod.map DE1BEA3F 120847077 262144 f943d6e620e1b6eb278160121c68aecc624fd3ff halomaps:5735 +RPG_6_Mod_Final.map 3EF88192 132225528 262144 1622d8b3e65835f598697b17aacdff7259cfe373 halomaps:5818 +RPG_AI_Beta4_v1.map C1B2F29B 132639426 262144 e230183e9cd6a0a99da7a40b2db588b7b19235a7 halomaps:3428 +RPG_beta.map 55953287 60901028 262144 2aa4836cdbab647bbefe94a0e04376d38eb877c1 halomaps:1935 +rpg_beta3.map 505804AF 68543540 262144 08c203583e6f8667d029400413bf0b2c5a3d01d8 halomaps:1963 +RPG_beta4-3.map 93776EF6 119925827 262144 f9c22880f9d123c22c894fde862235063696eb36 halomaps:3240 +rpg_beta4-4.map CE4D5054 125877747 262144 3b90970674b36167710b70e48333ba16f27170fc halomaps:3322 +rpg_beta4.2.map DF803B4C 75176134 262144 d0395ef05222c912d900e91b94839b59a91d705c halomaps:3209 +rpg_beta4.map 74F4DD7E 63039950 262144 ed9d03f674bb73ecf070c2cea28a419e3c8f9068 halomaps:2443 +RPG_Beta5.map 6F715A50 97577174 262144 bb9a566f14d624887b942a8467cb8e01887e2754 halomaps:3926 +rpg_beta5_odst.map E1091291 125399514 262144 c9f62e67f3e676bfd02e89f08507fb3e05ff2eb3 halomaps:5189 +RPG_Beta6.map 37CA8226 63887384 262144 121fbae81bb97b3ce8be0f2f78d3fef736198f61 halomaps:4476 +rpg_beta6_2.map 073077D3 154026138 262144 eb080f13926d775dc5665d8d52c3892802c3a30f halomaps:5250 +RPG_Beta7.map 06BC7C9A 148659639 262144 bf98ab0515d73f298ab61aadadeea067d987797d halomaps:6599 +rpg_beta_4-5_snow_assault_alpha.map 8F8056AB 126528447 262144 ee1b2f4e5b1b735ac1ba3d99a3c2677140b70b3d halomaps:3483 +rpg_beta_44mod.map 18A51A8E 109122046 262144 9eb7a3759d26788ebc0b3ec807e82cf71f12936b halomaps:3796 +rpg_beta_5_final_version.map 37100D7E 113379893 262144 9bdf2b8d80e4bd15c808cb66f69756ef8110779c halomaps:5736 +RPG_beta_6.2_Frostbite.map 662AA155 131203899 262144 3191c29307c594bdbe13b5e34fc8e33f571b021d halomaps:6306 +RPG_BETA_AI.map DA5A5EE7 117538030 262144 49585dbd9640f544348d6468ad183ab60621d740 halomaps:3084 +Rpg_beta_AI_V2.map EADD2D93 105840946 262144 ffcaf3cbccb009bffffe49e235fa36b060c08df3 halomaps:3100 +RPG_BETA_AI_V3.map ABE07883 124692992 262144 3142fd700c5afaf2f94a9c7b07af3901d2503ef6 halomaps:3101 +RPG_BETA_NO_AI_V3.map D980394C 87717278 262144 efe583abf92f9c32fb63c755fa76b73ce238e51c halomaps:3102 +RPG_BETA_NO_AI_V4.map 68844F95 127957127 262144 ff5332d7df4df4ed7101d9680fc5e1930117d105 halomaps:3199 +rpg_beta_trick.map CFACBC0B 65919258 262144 8ceb1b7ecc1fd486cc5de3d869a3ee7045c0b32d halomaps:3537 +rpg_forest.map 61E42FB2 134646052 262144 8b70d2b39deb09211e9f34825627b74c07ce8524 halomaps:5864 +rpg_islands_np.map 91CC7B32 129915313 262144 953a5f0b5c83399b6396468a2895c15091781abf halomaps:5758 +rpg_memorial_base.map 07824E7E 111750931 262144 e5ede2ccf2f2a0d2495eced17a545470d3079bb2 halomaps:5930 +rpg_open5.map E548F0CB 71574548 262144 cbdbcdc4f61c0ac5f809b6b479bd75eee4762f9c halomaps:4623 +rpg_open5_AssaultV1.map E43CE5EB 132384389 262144 7dceca311bded50aea98502b3f4d70c4907b3d4d halomaps:4768 +rpg_open5_war_ai.map FF102879 133300665 262144 8cbca5174c0ccdb7031aa0d05d15b328ead1cf5b halomaps:5746 +rpg_open6.map 87F9DD24 60122974 262144 8e9c369f567ef3b6bba6e7303b4a0e192c00bb67 halomaps:5523 +RPG_Sandy.map A7FCD125 137155117 262144 8f8b1dc2bae75f588efc828708372c9a262c8bf1 halomaps:5900 +RPG_Snowy.map 30C93AF5 130193019 262144 d3f1570ce83d793feeafc4a2e4a132eea6b1bb25 halomaps:5793 +RPG_Snowy_V2.map F2C75336 152880207 262144 91b6a00836c0928947c8a062ec278a9d4fc64503 halomaps:5931 +rpg_vally_alpha_1.map F828B93E 19398296 262144 a1e66d66901ac53282638805e4e2ed545f4a99b4 halomaps:3517 +rpg_zulu.map ECBB5F3F 107933121 262144 e9b681d324e3beb7318d98ffd725bf83927b95e5 halomaps:5692 +rpg_zulu_mod.map B37CCB12 132546630 262144 1c7d7794ba9a5db3d6508239fbd6cb45b22270ae halomaps:5594 +rpgbeta6.2open.map D10ADBB1 120688318 262144 d37887d1a388ad7a39b6d7391c140c98299672b7 halomaps:5710 +rping.map FCA60D7F 45262592 262144 fa9fd22584c374db21ca9a926a43bb6b57b839c1 halomaps:4847 +rpsp_s10.map 77952F1A 148096405 262144 2ad95885efb117dca6229fd2bbbc84e58e234f34 halomaps:5904 +rpsp_s30.map D98A0445 209153827 262144 0ba3164d42e4ca718038cc6e7e25a46c5df68274 halomaps:5905 +rpsp_s50.map 7A09BD4D 212575302 262144 2b98417e91381e40d91db48f8b802f736724616e halomaps:5902 +rr11.map 41EA6839 12796904 262144 c7f346abfe4226cf4f629e232c772547666c137b halomaps:2351 +rsfg.map 3876534D 56101323 262144 273dffe32494b936a629d8d65e56802b49de08dd halomaps:5452 +RT_Coliseo.map E4600D2A 17408384 262144 aa4698de281f18b6739cd4fb6ce6a5266b793ab0 halomaps:6558 +RT_Coliseo_Final.map A18DB802 32999181 262144 63a746139ceba2ca06b9a9920c5907aec2304ce3 halomaps:6598 +RT_StarWars.map C3FDAA29 204193538 262144 e730e4b3ede48275ab5d413715e5bb3af1a61d53 halomaps:6710 +rt_starwars_complete.map 55F3509E 125164066 262144 5969c5deeb040b995aa71b69d73652713b712b01 halomaps:7063 +RT_StarWars_m1.map 6FA7368E 83161676 262144 c9e41355c0eba5676b2d60a5867351a4f7a52405 halomaps:6723 +rubberducky_alpha1.map 1086887A 30021248 262144 bbcdd3efba41f79e7774d76f35efe09197142bc0 halomaps:4812 +ruin.map 1EC867B8 31702884 262144 6d637b69f556cfe2c113331b4695360e422aaff5 halomaps:5437 +ruinas.map E6A5817E 273584597 262144 6b88f0f987d2147cf97af329af2231a7d2e80450 halomaps:5355 +ruined_pain.map 8EE07F05 40496364 262144 ba3bcd63a169acda3f053aab9a54694cdaea24cb halomaps:1034 +ruined_pain_te.map 9317077F 41856784 262144 c041a4656cdf463605f103ba770c3f05691b8907 halomaps:1037 +ruinedpain_final.map 0225F5A6 43071040 262144 cdfe68342ab292f4c4af3d23d32dce20eb9543b8 halomaps:1044 +Ruins_of_alph.map 1D44DED9 125231920 262144 d0742fdf6b95ab26fe988b53334e45795572602a halonet:Ruins_of_alph.zip +runway-mod.map 1F3BDE65 56111478 262144 55015890daefe0548aaa99339cb56f0c0f3dbdf1 halomaps:5292 +runway.map 83F5363A 57147042 262144 4f36894280d9b929087cbea897e871e4e11cc21c halomaps:2327 +rupture.map 2966D7FE 54510190 262144 94ad384fe1f3fd5996f171e3b57b0ba2ac2352b7 halomaps:7078 +Rura_Penthe.map 00000000 149337604 262144 8737e067875dacf793cc76eec5a28293cd11a1dd halonet:Rura_Penthe.zip +RvB-WinterGulch.map 3A8948AA 38373696 262144 89d6e688faa340f9b2c1c84b8e78c5b34f10f3ea halomaps:5077 +rvb_test.map 0F187A16 29297300 262144 5f8c17193e0641f1430ff2645711ab20a860c977 halomaps:6292 +rvsb.map D27BBE9F 13057164 262144 7a3c954e34e681f23eab93e02aba73ac9abd185b halomaps:4986 +RW-G3-Augur.map 1FE45F18 188717103 262144 a6301f6af7404981a5343abfd5f962b19677c5a0 halonet:RW-G3-Augur.zip +RW-Harbinger.map FAF3D4BE 216940941 262144 8ab064f5573ea7f1dda4e33643ff297cef0669c4 halonet:RW-Harbinger.zip +rwg_desolation.map DD8273DE 34709997 262144 f456af577244eaf97727379c314cf92e79635756 halonet:rwg_desolation.zip +rwg_fragment.map A742B7AD 100397450 262144 cedb91a53645189157555cda8e8e01a0c5efe4f3 halonet:rwg_fragment.zip +rzf_beta34.5.map CC43645E 219791759 262144 177ef317b71a6dd341b715c50d83e5b9d7370474 halonet:rzf_beta34.5.zip +rzf_beta35,1.map CA60B6FB 219795938 262144 1526f7ce8701ca5a60ae0b735923ff4ca9987aa3 halonet:rzf_beta35,1.zip +rzf_beta_33.map E1FC1631 193838372 262144 617bae37b7a014b9cd7949f1e3a420a7e4e85d37 halonet:rzf_beta_33.zip +s-m-e_beta-V10.map D9BB7753 46091028 262144 5dfa2a9ce03331a3efa451cab187221f65b7fd39 halomaps:1798 +s-m-e_beta-V11.map F4A5F9A2 44580750 262144 47069c7edd9e7e512eac0fcc6e080d08991a32d9 halomaps:1929 +saber_mod .map 064893CE 14683748 262144 81d35071444de72ae2c06db9673bad51597f3897 halonet:saber_mod .zip halomaps:377 +saberarena.map 064893CE 14683748 262144 a609ea496c6c35fd1f77644993b1d4f2e6619a65 halomaps:355 +saberpit.map 96A9D093 34817910 262144 ebbfc88bd3acef1c4f3c74840a1c76254d98b1b1 halomaps:4531 +saberpit_v2beta.map 2E5B33A8 37906586 262144 2896a98e3ab79b039d198219501926bb1e40aa13 halomaps:5907 +sacred_forest.map 883ACCBB 18693108 262144 aacd0288ce33ad26d2848d6138bcdd213ae11e8f halomaps:2792 +safecanyon.map 8C31F8DC 13212776 262144 9fc7d302197bdbf7670027b789acd4eff7036639 halomaps:4605 +saffroncity.map 20944C83 102152855 262144 474c9d4e076bb5095792897000431a5b4e899f23 halomaps:6623 +sage.map BFCEA47C 14957528 262144 ccb52e78ada02483f1dd365f33a094c9fd53226a halomaps:1451 +sali_creek.map 98311FD3 29188566 262144 2dfbbf94e23db08706b6b7d60c17f2718ef60e58 halomaps:4918 +sali_creek_v2.map 73ED7BA9 63621290 262144 4a8a3ece7659015a8781dabaa78f33220fe024e6 halomaps:4946 +salisp.map 35C49DCE 80052930 262144 9e54d850f993137c9fac388beed3bb2172c2e7dd halomaps:4675 +sanctified.map 4509C1A2 15242488 262144 256aca0ea21ab1bde5f77283079e679423c9837e halomaps:3361 +sanctuary.map 6CC93BE7 86916428 262144 6c0cd1471f7736d4d68eba4c8094cce3047d10ba halomaps:2444 +sanctuary_final.map 537875F7 118399888 262144 9f6953348d70ad0fa7d9d8e20eb15310eb552d7e halomaps:5241 +sanctuary_mrp.map E413F6F5 124809426 262144 512fca4c761a5cbc7c0b51f110e193b966696eef halomaps:5541 +Sanctuary_revamped.map 526B9900 131611031 262144 95f8eb3fc98aba8d92f96c1dd07620991526aeae halomaps:7087 +sanctum.map 8E631454 20366800 262144 aa57e3278afb2871e729fc12e1109865893bd10e halomaps:2445 +sand_infection.map 059390D0 79930855 262144 7590a9d84d0c0423a3462d85ca7ff0b82036760b halomaps:5811 +sandbox.map 94B143FF 13386176 262144 8dd58ad5cc3395502cf04eb4bf2ad2a615f6ca2e halomaps:5161 +sandstorm.map 964F8CA0 58928600 262144 dbb8973e48308fd62f8925e7209d8b741daed0dd halomaps:4126 +Sandtrap.map 37CB97C2 21709040 262144 018bcafc5714b528662cda88aa72242c1ce57fcd halomaps:5358 +sandtrap_ai.map BC05AD87 94677293 262144 1ea3e289023fad0274400d1646329bd7cb520894 halomaps:5376 +sandwinder.map 2CEFC069 17680420 262144 de356f1325aa9ffc779aba43f3d9ca757e25af6a halomaps:2275 +santius.map 86F88E87 30969466 262144 ca7ae36fc235dffdef30b56c76ead7d935a62cc3 halomaps:1277 +savior.map 3C9D5F28 301951027 262144 fedf664dff6f8b8fc261e819fa05324190b2650b halonet:savior.zip +sbx.map 63EC26B5 28842024 262144 be96373fa61273b177067c08f86d60e46c650abb halomaps:3386 +Scarab.map 59354A73 29197077 262144 6680d040f77a1bdc4bbe0a79fd47b86e2d8d953f halomaps:4299 +scarab_arena.map 5E559E71 50153561 262144 bb969212db4b33a08143e77b47e92832e1050a8c halomaps:4624 +scarab_assault_v1.map E9AA4A30 30857056 262144 10b492b3a08253fdf3fe306926dc1ea3f09df30c halomaps:3825 +Scarab_Assualt.map 76901BE9 50786007 262144 10b6998e4f28824e4837d8d8e25a5c75923b7d7e halomaps:5130 +scarab_guns_test-2.0.map 7026DD18 47819240 262144 0e81aad87f0c2aecd35d83c6f658910bdf8d6671 halomaps:6478 +scarab_guns_test.map 7D6DC52E 28051022 262144 1b26fea7a7eee56303f4a05eab067fb0e6ca8ec1 halomaps:6464 +school.map 709F3122 14760816 262144 94f0b50a2bd7ebab5bb4704fb181db720487dfc8 halomaps:2243 +schoolinfected.map FEA81831 91876600 262144 0d38fbbcffad9f4cb5873acd42818bf3a8209650 halomaps:5474 +schwinnzno1_alpha01a.map 50B4CF15 15052876 262144 3b44564a7326c000ff11cf727a84245667118d72 halomaps:272 +sciophobia-5.map C3075788 96620862 262144 a2699675ac334b53c7c6e8528dc336381c210ed5 halomaps:4908 +sciophobia.map 37F209EE 37023532 262144 d6275466defcd229a3e6fd346db1749a00541c58 halomaps:4204 +sciophobia_beta.map CAA10F66 32127580 262144 5f05092fe54c1a60a0457a3eff030fe7eff02806 halomaps:2324 +sciophobiav2.map DB0ABB4D 40972176 262144 2defe3f0e44f53891697dfa6a2513b11fb262625 halomaps:4875 +scipio_alpha.map B83254BE 13019908 262144 912d9e19a466fc120f884a126d0a8f78f892640b halonet:scipio_alpha.zip +SCP1convD.map B0B5D8D1 87039934 262144 9112119bf8f8262dc0ef7ad2ff66141c613065d8 halomaps:1421 +screamer.map D1CFBD8D 72074010 262144 a7d69368e6a064d5f2278c72d1cac045c556c5a6 halomaps:3103 +seaside_hill.map 09304A82 16713230 262144 77063d57a51cf776cdbafef11d851135641f0d79 halomaps:5331 +Seasonal.map 71503A28 22853269 262144 119b990cbd8d5e06da37c59097abbbf55a6821e2 halomaps:4205 +Seclusion.map E884D8B7 61737892 262144 eb9001908df3beb90b18562ad76f3c5b4172dc94 halomaps:3969 +seclusion_modded.map FF514156 102681268 262144 5cb8dc0db38e5984e3f23c7478d498c90804d589 halomaps:3994 +Seclusion_Redux.map A07244D7 67379162 262144 a6fe7d1c475fe6cfb5e6d8b7f8d8d271bd9dc808 halomaps:5168 +secret_mision.map C684387A 108511462 262144 2b11f3f4a2446faa87d768f36811eb01c924d250 halomaps:5611 +secret_mision_1.map 50E066FE 212988748 262144 9836d24e71ab2c0d6602af3d0f2ff42fe79575cc halomaps:5800 +secret_mision_2.map 03B0D3C3 163251382 262144 e2759ea9900744170c74d033f266b7eb3431974b halomaps:5801 +secret_mision_3.map 74AFC02C 169064115 262144 db11f13e8b68d1dd2aa2d96060a08ecaf89da4e6 halomaps:5812 +secret_mision_4.map FDD748F2 199004454 262144 602761b1d5dc456ac83a0233b2598c1459823952 halomaps:5821 +secrets_of_egypt.map B085A788 42552124 262144 370bba65161801664d22f76f0037e8d48b7e1e18 halomaps:2698 +sector_1.map 348CD4EF 93568189 262144 e44a2c403ba55531d2329d438c5cac07d2ffb382 halomaps:5968 +sector_2.map 7142F3BB 84050876 262144 444b02715a81413d179fef2a6fbd2ea09f775a40 halomaps:5969 +Security Alpha.map B4A441D5 59217118 262144 9d61dde64e1af9f5df5ff464cdc1c006534a18a1 halomaps:4625 +seigeofhih.map 15E11C91 24982290 262144 bf91f0483b45ba936539ba48cfe8b30aa095d19d halomaps:1586 +selective.map 4C7825CD 67412234 262144 638f7e2e6dc6aa46de27e9eda038f5a004ceb50e halomaps:2333 +semi.map 6B40518B 16028808 262144 556aeed5eb684366ee62e8e5ae0c44cd458ecf4e halomaps:3718 +semi_h3.map F31E23EA 78344299 262144 dd962286b07348fdf2c1e2171ad22ea0c8e19c2f halomaps:4161 +senti.map 04708398 47779624 262144 457c87c4730f60ef777390b0c98a6e968acb6964 halomaps:6909 +sentinel_beta.map 4A217371 24696060 262144 f5a50fe758bf4d33d4d221fe0b7d501c3c8f58cc halomaps:3356 +sentineldefensive.map EF24E666 51883460 262144 58306cbb9d869626d838fb3688b46e4a1a663c62 halomaps:5676 +sentinels-library.map D3AA2D83 32010377 262144 dd887110e9705c4033ce7a12c31fb7fc28410745 halomaps:1452 +sentinelvalley.map 6EBD0FE4 17991788 262144 8e3b5ad18d1f29c5d9b3806e9f72186b7d5503d4 halomaps:3568 +Separated.map 44F71556 53214586 262144 6434e7ab2fbe1d59cf90fe86bbf565386a40937f halomaps:1902 +Seperated.map 3827B369 48585230 262144 fa7f06b018e28a1e0a55ee926e302f386b00cc0b halomaps:1870 +septic_exodus.map 5CE6F155 16587323 262144 7c8489d60c9af7d0b00884439f56dc14516861b2 halomaps:2973 +Seqovia.map CF8E68CB 345474346 262144 69581e099385d3b3a4fe545a3eb60720db095915 halonet:Seqovia.zip +Serenity(ADB).map 5046D2A8 19769088 262144 3c24f868be99f8c0ba06821d6de7579d08a6a49c halomaps:2095 +serenity.map E1C872EB 30874856 262144 8740a2cd9cd7e3b4a25039f83fded3a094ac2b32 halomaps:4876 +sereny.map 8C835326 12620516 262144 59550129fb9097c781518078f37303516223010d halomaps:3733 +seriousfear.map 4D9ECD11 16939060 262144 3ed7179500b57d76393da20f50ddf19bf8758d2c halomaps:4459 +setinelgulch.map 39D1EAA8 18001372 262144 c45ff254b7ce5c550b0907c8cba58220cfe51a96 halomaps:1443 +severe_canyon.map 07C4F115 16751624 262144 694c1a83480cebdfd3491f9c26ebd46057fc925c halomaps:499 +sewage-facility.map 185E35EC 62980969 262144 9f17a0e680d54ef6758e1014c7e342ed150a3763 halomaps:6755 +sewer.map 11E7DA7F 13218600 262144 499b88328c711a835bb757ab12c5ba0d3ff476eb halomaps:437 +Sexy_Sidewinder.map 919519C0 14805356 262144 023b3c19f98dbc4f06490c86b19b0731089485e0 halonet:Sexy_Sidewinder.zip +Sfear.map 920CA6B0 12316616 262144 3843e63d37b564c366e40f6ee00cbbf2f4c2f225 halomaps:273 +SFI_Insatiable.map E5D9B44B 132294565 262144 837640948927973646d6f9b328be8a0935eda46b halomaps:5049 +SG_Forerunner_Facility-330.map E60E44AD 15009420 262144 736d0dbdfbe9ecf5078ffa82e7d365a5c5967cb0 halomaps:4947 +SG_Hidden_Control.map F91AAEA6 14368632 262144 2db182c58ba2493791889bc7a88e4c29d51d109b halomaps:4921 +sg_highground.map 9DA98A35 45394302 262144 0271be6d18b126a9b63a03a0c005156018567e6e halomaps:6248 +SG_Kill_Zone.map 5B69BF35 16605100 262144 bf34b63704413d293fe37e32b2a2164b007e70db halomaps:4922 +SG_sniper_canyon.map C984A607 17402424 262144 a2fd1947d9ffd45c356663fe44351f06d9b48649 halomaps:4948 +SH_BH_Danger_Canyon_Mod.map 812B1147 54419104 262144 e3d87b8be9c19f297c679de3a09b9587323f4ee9 halomaps:3121 +Shadow's_Gulch.map 651F483C 29540655 262144 a7b775c165d1f7f9abdfe18ae9e986f75242abfc halomaps:2844 +shadowisland.map 3A08972F 49446497 262144 d4b45815277446393fef75f296e703a034be8329 halomaps:1553 +shakuras.map 983B4CB8 15619576 262144 76523ba9e5187897701a68e029af0583e27e539e halomaps:4105 +sharkinthedark.map 0888BE6B 12624636 262144 977629707ab2789238e033c8d1b35c47c3e3b146 halomaps:3826 +sharkinthedark2.map 6FF3C7DC 18595338 262144 f3fe5d1fa0391f9868c7d7fb24d24c6f0cfba0e5 halomaps:3881 +Sheer_Cold.map 864712AB 15049900 262144 0e0d843ab3c6b75c400927e0a447a44a49312800 halomaps:4179 +shellshock.map 13CB6878 13616008 262144 33db5778d693512e4f5b8e102a0407176f63c2d7 halomaps:819 +shellshock_alpha.map 18980A8B 35793620 262144 b3c20633d51171038875372d22d5efb5104ec1b8 halomaps:1788 +shinzo.map A82846BD 13976448 262144 8b22650641f333f14bb2af26f91f526f471704c1 halomaps:961 +ship_invasion.map 2F1E6141 67552077 262144 d5f8a3993e8cc9ff297c31b7b8fd14645a048b15 halomaps:3734 +shipment 2552.map B64BBFC7 42479665 262144 49161174efde1097770e0ce558a803fc246d8de0 halonet:shipment 2552.zip +shipment-cod4.map 6897CC15 227555996 262144 a8dd7c580ea4a28762d59bb7b618d283c2377213 halomaps:5970 +shipwreck.map 4D1AEF1A 29379072 262144 3145c6074adc65b67a6d21b0442ac63afc15fd5b halomaps:2985 +shithole.map 0BDAC5A5 28045550 262144 7cc1f4be4a526d5470b1889fb4030567d5e4cea0 halomaps:5971 +shlong.map A644EE9B 15346938 262144 f4727436e7a5e4b0c356d615b1e61f3c7a02944b halomaps:7064 +shnoogins.map E8808D5F 12499604 262144 78e2ed78161479811e3259e6f17ae9c0e6f83d3f halomaps:453 +Shockwave.map 4D58C8B0 18538236 262144 2b4da7730fc6cefc63e22aa1ad16ed7ea7032b23 halomaps:1908 +shoot_or_die.map E892A700 16965542 262144 78947346213de26161af42b9dd2c81ed3042c78c halomaps:3210 +shooting_rangev2.map A53DC4D7 35753385 262144 25df8fe2d1583fbb7af263b9749c73a936d0fa11 halomaps:4413 +shore.map 2888E6EF 107631108 262144 3238cf20d9bfaf34e5fd6dc3639e70c796d95219 halonet:shore.zip +shortest.map 646F6F64 18289772 262144 1fea40446abae53ae97db816ea4b28863971345c halonet:shortest.zip +shotguncreek.map 26D43B1C 71043422 262144 54ef18119af6e256e7d9912a08d037da02dae3f4 halonet:shotguncreek.zip +showcase_beta.map 56A52D1E 25482469 262144 920d76df6195d230ec7b93413cacded2e3e45f83 halomaps:1183 +Shrooms_pb1.map 0A955532 195234212 262144 fb614d9803f85d9cc563e3d105382c157f0e53ab halonet:Shrooms_pb1.zip +shut_down.map B3D62358 48162690 262144 4333bcde022335d65620709772b001ea27b37f4b halomaps:3085 +Sh°!_Battleground.map 53280095 20069380 262144 6ecc69667fe6b68582a7fa6ba238a553bbbdf20e halomaps:5190 +sidetracker.map B81DE64B 79172322 262144 d5efef121b6feeb391483990057aa8a087edbf06 halomaps:2640 +sidewinder.map BD95CF55 14840596 262144 847d012f82460706c3b95c1b32340387b7c8de63 halomaps:4788 +sidewinder2.map 0F8871FB 35922155 262144 558abf190b2730dab376ad86346ee61a91696e5c halomaps:4206 +sidewinder2507.map 27D73DEF 125813140 262144 3eaad1fe60ecf4b1993adc78c95ce344c5eda9f5 halomaps:6431 +sidewinder_AI#3.map B05C0B02 75998302 262144 cc376416d334c2976fefb26e199b65a20909394c halomaps:2907 +sidewinder_ai.map BC8A2B9F 46643874 262144 b54ffd7dc840fa6ed01d75375df998444c3f69c6 halomaps:6202 +sidewinder_bamf.map 8F07D93F 68067379 262144 19c07c68b0474be4baa8968f92516cd5584c88d0 halomaps:4103 +sidewinder_basemod_alpha_test.map D395C2B9 15913116 262144 ae62078e2fdbe3474195e84bc31b04d9c1942578 halomaps:4588 +sidewinder_destructible.map 14F1EECE 18422794 262144 caf1557aed147a5a58d4f7e57c6afb7c7e81642c halonet:sidewinder_destructible.zip +Sidewinder_Final.map CBAA77EE 14789080 262144 627ab79a3fed9db2b0bd1c54cbe02470ab152e7d halonet:Sidewinder_Final.zip +Sidewinder_ME_FtD.map FC905ABE 101375328 262144 4d6285042994930d135a7aa61062a82bb68a340a halomaps:4694 +sidewinder_mod.map 25D0E236 68322133 262144 a621ed9e9e182a702a7055499e685c1a7042514f halomaps:2374 +sidewinder_night.map B3EE1679 21204952 262144 a9a3b10eab46bd81372cd2897b52457c786cfaa2 halomaps:5819 +sidewinder_rm.map BD95CF55 302779084 262144 c0c1d7a46e9305fab011773d0d73ee6d5bc710fb halonet:sidewinder_rm.zip +sidewinder_tmcc.map 4FF0E195 42091628 262144 e32217c5c52851d15a043584cdf25b2047c5802c halonet:sidewinder_tmcc.zip +sidewinder_ts2_siberia.map 0F8FC2EF 26383532 262144 878ad2a0f6a3b8df82dcced6c003b099a93a25e4 halomaps:5266 +sidewinder_v2.map 0A0A0999 48321774 262144 814e1e74ea7d2a9788e4d9202a4077c37e223c89 halomaps:6559 +sidewinder_warzone.map C0C06685 77734997 262144 452d8ff18c3baf92aa9fc0419d26ac58dd5e2db4 halomaps:3735 +sidewinder_warzone_mp.map 990731A5 100591675 262144 f0787607cc211dfbd90a7da1f8c9c4d4f69ba405 halomaps:4059 +sidewinder_warzone_v2.map F98D13DE 87902219 262144 8dc723a9382f5e9cd2efa9a26b71d559ca0fd5f4 halomaps:3736 +sidewinder_warzone_v3.map 37ABA249 95198947 262144 20d873eaae1b46b25f0b6f658a19c51af3435735 halomaps:4038 +sidewinderadvanced.map C62AE516 43499375 262144 1c9f52c89a0e1da75e274c8657211a5aaca17d28 halomaps:4345 +sidewinderedit.map 93EAE28F 15361196 262144 aa4de2131fb00b335e2573d3906ad778ba2643ef halomaps:3484 +sidewinderimproved.map D83DD0BB 133429369 262144 dcef443e5f85ff90120708c4c626e2defb1aa6ec halomaps:5672 +sidewindermod.map D37798CE 78192667 262144 7ea08839cc09c80bbbee171041c8f44d0d538239 halonet:sidewindermod.zip +sidewinderODST.map 88E77AC2 116919044 262144 9f2d7a41f42d998e3d7ace5de25dcbe5069fe509 halomaps:5377 +siege.map F92C3E58 35373448 262144 b4b01f049c98bb6b81dc63037743462cd6a8e6f2 halomaps:558 +siege_assault.map FCA41404 70110722 262144 637346b23381d976d93909ec8bd4d24e62f7eca3 halomaps:5738 +siege_speed.map EACD6756 37578920 262144 480c03ce64973bed06a30d0367e454fc46e7ddae halonet:siege_speed.zip +siegeai.map AFCE24B4 41709182 262144 392404d69d93513a97820c32b79ca61c60ec5e36 halomaps:4813 +sierra.map 0CDEDA2E 13609339 262144 9a8c22750456d4fa1f6a8b01b0d1dda8be417e0d halomaps:5318 +signs.map 438BEB76 16601497 262144 528705e5fe2e7830fb2b1fd009d17f9a3993adb1 halomaps:274 +silence.map 99280619 27443948 262144 256276f1526ab0387a8c0e39ee27158989882bcb halomaps:2781 +silent_canyon.map 38C9DA7C 20881320 262144 68bd77a81ae88a5db6cf08f55ad4bc403ad2e068 halomaps:385 +silent_lexicon.map 4CCB8D97 27038456 262144 4c63c61f136c1c3de222a613a4630c2ceb27ca16 halomaps:5281 +silentgulchv3.map 3A2249D2 18495606 262144 f7d6e490ba83f22723e11d223d6fe62c56962518 halomaps:1773 +silentrecon.map B72066EC 31906666 262144 da647f80157229faa6d85ac23af0c0c6ad4de545 halomaps:4723 +silo_surprise.map 4D610166 35498049 262144 e9c5e306dd1e420bfe8f37a60c36881cb281546e halomaps:2244 +sim.map C8E097EB 15648084 262144 db133b9bab175a09d1c89df22d8e2c5a4c6ab26f halomaps:820 +simple.map 351FF187 12776128 262144 3d949e4172c9927393cb638ccda2b912f1786870 halomaps:1909 +simplicity.map 446B1769 13872384 262144 253acb3d044cb3b6086220dd95b3d3149f0402c0 halomaps:807 +Sin_City.map DEA68B85 323959850 262144 11c2f710f2eb39430a1334c079af6eeaced5c55f halonet:Sin_City.zip +sinkhole_final.map 8B0AFCCA 18321122 262144 14c39b7da208e3654f84fbca0f9e2d547eda7ced halomaps:3446 +six.map E688A5CD 26374937 262144 7ff01f580429f7641e716e10acf0d000a210d50c halomaps:5282 +skarn.map A5187EA2 66648698 262144 d5d7bbf3a27218ceb798c731ad08c9ac335e286b halomaps:7079 +Skedar.map 16ABB08C 56466314 262144 46017ed26e5d787ddb16ce0c7336134382c25605 halonet:Skedar.zip +SKN_Canyon.map 75B1AFC7 14015400 262144 1bc5a5829a3a037dfcac35826194635b9406e316 halomaps:4539 +skullcanyon.map 31FFBEFE 14700024 262144 cc183152ebd813bcbc896b94afe1c980b43cdd6a halonet:skullcanyon.zip +Sky Twins.map F4BDD30B 19273056 262144 e014c2aeb2d38eb438343000166def37ee3af7ae halomaps:331 +Sky View.map 018B8007 319174162 262144 85de50a34a3cd867a916e69e7e255bf3fd11ead2 halonet:Sky View.zip +sky_rail_beta.map AC61D100 20657270 262144 fd199622752a0f84953564a1769e33137de573c5 halomaps:2307 +sky_wars.map 850E3BEC 33941150 262144 d69da1e89e4a8025fe323150cd38d8de34b0d7f8 halomaps:3798 +skydeck_beta.map F971B5D6 13752556 262144 6ee3315b10cf08b496be7822928556453aed0515 halomaps:1817 +skydive_heaven.map FCDFB92E 45726419 262144 8840c5a71b0bc102dd607eec46c332279a47873f halomaps:3797 +skydive_hell.map 16E71A43 114389001 262144 4f568a6df91bd2381906043cee765f739ba73576 halomaps:4039 +SkyHarbor [FINAL].map 7B309554 13936092 262144 5eb5d105f16a5eb50085758a8b141b7200d6621a halomaps:1094 +skyhigh.map 3EFDA89A 13768572 262144 9e311a1c3a5e087952da4df6f31a34455d50929d halomaps:4695 +skyhigh_v2.map EF271FBC 17708264 262144 4369992d3a2cc7cc19a0898409dc210dbe9b6415 halomaps:4724 +skytower.map 6F717BD5 15120852 262144 cd448879d997a3b5e0533f163ce9c4434aff054e halomaps:1203 +Slaughterhouse_5.map 11200652 157117353 262144 96a9865b4711108861c81f10b1c4ce0ba65dcd8d halonet:Slaughterhouse_5.zip +Slayd'z cliffs.map BE434EEC 106658035 262144 4aeae77ff92c664845c986c668a8563889390641 halomaps:5078 +slayer_box.map 6FDE31E4 13402536 262144 baf131cb959293c18923c03d1970f5f5c9340ea9 halomaps:4725 +slayer_cañon.map 1069F7B0 145147420 262144 accfb1463a78dc9c6087095826dea6f4179f7cff halomaps:6680 +slayhouse_010.map 7601AC2D 121873135 262144 e6d707c918e103a71e67ffc54b1d5b539f8d0ade halonet:slayhouse_010.zip +Sledding02.map 0A036370 109868368 262144 66bce468c1078b6306918d7ce291470b49695abd halomaps:5669 +sleden.map 5856C12F 38389496 262144 5019f5fb67ffba5f873b6f324a3f40fe0decfdca halomaps:5079 +slightly_less_lame_box.map 870E637B 19144384 262144 cc74fded4be4dcfd28fde0843bbad18fd5e77d0e halomaps:3621 +sliverland.map 040AF203 67294215 262144 890c09ef2aeb5678a5e42d62c8ba242e1dc12ac5 halomaps:3921 +sliverland2.map 34E4E0D8 46587884 262144 9ed4f0fa3e1be121fca6a34984e2637143713756 halomaps:3943 +small_battle_fields.map 3E7E2DE0 17714276 262144 b1400331ee5804db5602538c7b0253b30d0dfd6d halomaps:5029 +small_giant.map CDBF3891 31729855 262144 bdc12c7587abf10366b40111178543d333a001e2 halomaps:3800 +smaller_than_loc.map 3B79FEF3 391628 262144 20100746c5e11b0b649967f186bafd1a31b885e4 halonet:smaller_than_loc.zip +smallprawn.map 13878BA0 17858680 262144 333ffcb8ab5da753df81e6a75fd5511d79ea45a6 halomaps:3899 +smash.map 591C2E2C 24730395 262144 f726fd98a58ecd6a043b2b3fd971aaf6db43013d halomaps:2960 +smm_ransom.map 97E4309A 13000360 262144 11ce220394826dca3f41e8f22c58dbe0d160177a halomaps:3766 +snake_canyon.map 8663A6EB 13212588 262144 3dac9c5a05b57ace0a3e24c7c2fb0691d0b065d8 halomaps:275 +snake_fun_island.map 3FED9117 119674678 262144 2adf775b22cb3c421ce320f5db54b93833ae0d77 halomaps:3345 +snakemovie2.map ED4A4436 77845866 262144 312fdd31378cd14b3e1d8d0f14dd4c38781bb8f4 halomaps:3323 +snakemovieset.map 09F15B2E 87106668 262144 353d7a2c69e90baec21b196d5ea4be2de61d5e56 halomaps:3324 +snakemovieset2.map 2FC9D88A 126874553 262144 4eb94a70feacf92ee1538c416c7480be6f9ca07c halomaps:3344 +snakewinder.map 10C4A6EE 21998012 262144 8f4a154975d47f488c41cbff8c24425bb9d51075 halomaps:1299 +sneak.beta.map D4E0F5D4 19332924 262144 b1dd85e137b118bb1ba2635f83b1e7aaaacf8620 halomaps:455 +Sneak.map 4F8D6F69 15522412 262144 b8c5bd29a7626a27f4696c1c8a8d28daf57ef796 halomaps:1243 +sneakybeakylike.map 79728B35 17827880 262144 af20f44d54f44a731087b68790dcb70eed5eec9d halomaps:7096 +snipaphobia.map 79B6BA61 16374384 262144 8bb93c2a0578f5089d4c87603916fd88299092c8 halomaps:4060 +snipe.map 650496D4 21068844 262144 00ed64f459464bac499be63766c75e7037fd4d9b halomaps:1508 +snipeaway.map 5F91C118 12391404 262144 da8f4ebb8a9cbde333f4422ef4d48b1cd4366426 halomaps:4848 +Sniper Island.map 0447D280 150173624 262144 a50ab31500bb67bfe03973163e8341e9a7dc81c7 halonet:Sniper Island.zip +sniper-war.map B2FA8D3B 117761325 262144 187b99e67e024a3b22105c3bb7d5e15cc809e666 halonet:sniper-war.zip +sniper_canyon_ver3.map 00000000 225497676 262144 778e39d3e4d637fa3ac7c29e4ff5beba6943d36a halonet:sniper_canyon_ver3.zip +sniper_heaven.map 23530346 22145164 262144 e05bf714cd95ffc7fca6e302470e1ac697a11547 halomaps:1338 +Sniper_Training.map 535BD415 14245128 262144 5a74c3f8f6a50138a9b2317e561e86a6df42800a halomaps:343 +sniperbluff.map D7D1CD41 42676241 262144 d81eb52ef3bdfc6db4cf3e75cc550ef63241b65e halomaps:1971 +snipercanyon.map 2A3236CA 13959404 262144 d9a12cd91b0f0d53b4e002e698bcba70c14aef7b halomaps:276 +snipercanyon_race_enhanced.map 5F6C1F09 23186170 262144 b8de13471b72a4285f903cd0438a1912930d3967 halonet:snipercanyon_race_enhanced.zip +snipercanyonredux.map 0D473637 23422332 262144 4521422895ff90b8db0885ffccc0bab37b994bf0 halomaps:1042 +sniperfear.map 2E4BC172 17324456 262144 a20940d0d2195fdca2fffb56b10dfde450771349 halomaps:4477 +SniperGulch.map 52901D04 85772396 262144 23274fdfe64b9571d0c58080ddd6800f94980972 halomaps:3737 +sniperhills.map EA04C454 17150568 262144 ed41a2e58af776b69afdc5fa18770b35e5d38f58 halomaps:4293 +Sniperwinder.map EA84952C 26851846 262144 306f5566f3508131ad000c34cca969c6c28f37ce halomaps:2182 +snipewinder.map 2A03EBEB 26727979 262144 0e0d12fe9ac56ca89de4c816383ad47bc6712334 halomaps:2142 +snow nature.map 897A3FE4 147477141 262144 c24c5ac6c889d22fc01a73d01fd532e5fc1d38b3 halonet:snow nature.zip +snow.map 44590CD1 23040246 262144 b93a6c8ec36b97742f8cc3fc3069522c25a0259f halomaps:2908 +snow_archive.map 556D3C3C 16292744 262144 f4c0c20135feb9b7f5f477a5d7dc2fd4a6a1a25d halomaps:3417 +snow_camp.map 8847001D 21009817 262144 0f2a5aca689fd8ff39dc221ff43cf2577b1d7bc8 halomaps:3799 +Snow_Canyon.map 8899D25C 50959148 262144 308a3cefbe200adf5c7bff9559128c70841d8e3c halomaps:1089 +snow_death.map 5A5183FE 13157860 262144 6d99e91f4363ac49235a36e396e7a4fea13bdb7a halomaps:314 +Snow_Dreams.map 516CBC4A 215083021 262144 c658fcf6b973c690eb0d4b6652818b1dd54e1831 halonet:Snow_Dreams.zip +snow_grotto.map 012250E1 14212364 262144 140608fa9a036952f3e0cbf266982eddc4aa51a6 halomaps:3418 +snow_grove_evolved.map 8D2E5057 133425775 262144 2e10725b6bef6ac5c01302c25a2594b5232090db halonet:snow_grove_evolved.zip +Snow_Rats.map 5C80F6F6 51412482 262144 2be001494af9f1bb5f41635c492ab92264accb5f halomaps:4370 +snow_rush.map 6EFBF185 74429961 262144 d5f10d4ab80b2b4ad785be6160b91da960846cd0 halomaps:1657 +snowberland.map 09D982FB 14685344 262144 6aa250ceade8b4d4663f7b21621ba7dbd471da65 halonet:snowberland.zip +snowbind-pb.map 087F76E2 125564868 262144 cf1e26866b442199be4e19484f949ec5065fa615 halonet:snowbind-pb.zip +snowbound.map 81AA603D 13152300 262144 5a53315d345c68759993adba1c5b82ddaabcccc0 halomaps:4106 +snowcast.map FCA0FC3D 25276995 262144 5e69f893b42887a2faf142e94d40d4fa4b2f2f3c halomaps:4162 +snowcreek.map 29599F95 205951302 262144 e70a71e9c6ad9dcb89d31be09d0d5848f8eb1b17 halonet:snowcreek.zip +snowddaymkfour.map 2B8D31A4 160917659 262144 6aab41c94ec6c40671fe38cf2101a16eb4fbe919 halomaps:5268 +snowdrop.map 5C808CC9 56050756 262144 7cd75bdb00032598cbbaeb5b0ebff1b2955fe947 halomaps:6400 +snowed.map DD8A9494 14651272 262144 5c7b8c8563dcf64167ee245513c8589c2dd04425 halomaps:4180 +Snowed_In.map CE59A113 28070016 262144 c2fd18aaafd0598a6a335e5a220afc36818a4b58 halomaps:5050 +snowfall.map E962C790 31012528 262144 1a8484f0c5b0fbfb896f37cfc780c50238c55bc7 halonet:snowfall.zip +snowfight_xtreme_ai.map 1824692E 55656864 262144 0206c028d428a897b4696107a064713fc26b1837 halomaps:5067 +snowgorgev2.map 1753224C 17280788 262144 beb71109125a93cd1e05a12a086772516092acdf halomaps:2928 +snowgrove_1.map 61B1C859 131379109 262144 c200755a0986765ad207c63508b3c3ac7ee061b1 halomaps:6932 +snowgulch.map 04CFF447 16271544 262144 9f62ef3f9fe20e4a42b8d06d0db58b65d11379f7 halomaps:4909 +snowland.map 1F6A7931 13445712 262144 1a0307d3bdf4fbecd4f4bc0f7a363549f2d3a63f halomaps:4606 +snowledge.map AB8715FF 106954167 262144 3a5a369d5d31b9d83eb3e51e95abad3ad855e8ac halomaps:3724 +snowstorm.map 797BEAC2 19497946 262144 d6c2b690afdbf7712ccfcbe7a7561581985e9a94 halomaps:1858 +SnowStorm_Classic.map 479537F5 15652314 262144 7e3d4b59ebc5dac8ad7a0ebe197b78987a0f3069 halomaps:2070 +snowtorn-oasis.map 4BAF225B 171757902 262144 5c39cef7b8c7e69784b8c9d4e31d44e29a68533e halonet:snowtorn-oasis.zip +snowtorn_beta.map E5D9BA2C 20931952 262144 223b007c6c90725908548480d7f86275f39290b5 halomaps:1789 +snowtorn_cove.map B2C9D9EE 38234432 262144 9b4004db254a5bf3a2167b4030281385ee75927d halomaps:2194 +snowtorn_cove_v2.map 76A345B8 62168471 262144 926d5d9f03dfa39d553c2497e7d1a53fd15c220a halomaps:2845 +snowtorn_grove.map 8DF2E09C 34661099 262144 99ded33d562c94bf122174cc7e0ad2f91ac074f3 halomaps:4877 +snowtorn_infestation.map 49E5A858 163552015 262144 37f7b70357fa3c3950d0322c7af6d03dfff0631b halomaps:5439 +snowtorngrove_ai.map B4608075 58166945 262144 5f73a935c475127e815b98c9a0616280ee72093b halomaps:5131 +snowtrap_pb2_do_not_leak_fags.map B9B0D452 57928672 262144 a48c84a84d230803e9076a2375c5dce80a2ca7e7 halomaps:4660 +snowvalley.map 897D5312 20381100 262144 52a8c5e1c932533ada8855ef90582542165f637c halomaps:3767 +snowy_assault.map 7F117C75 21413684 262144 5f42d99673e8a7393bed793f88d99f231a2f31c9 halomaps:585 +snowy_canyon.map 40E6EFB6 20260528 262144 435a0c42ac014713752046bfd0025ffc4518a691 halomaps:3263 +snowy_deathmatch.map 727C4511 16378868 262144 b280940d25d0dcd16a02a827791ec0257668f67c halomaps:529 +snowy_deathmatch2.map 8FAB72BA 16391972 262144 09120425ace06f74112ab2853b7f04fa4747c77e halomaps:530 +snowy_forest.map C25F46BB 13404524 262144 19b267f6d583e1f92c04f7bf9d54d174906f8677 halomaps:4099 +snowy_grave.map 29B683AC 26167257 262144 54e2323feec9a5fc5db68eb1605926cf145ac92b halomaps:3827 +snowycreekV04.map 53AE72C2 71256394 262144 e306a32b9c0d260abdd27fa02c63f8cb4b2ab453 halomaps:7037 +snowzone.map 55E85641 34665557 262144 b6817766caf2a382036f3ead79ac3b9cd3c23387 halomaps:2641 +Snow Assault.map A8FA819E 70432016 262144 415b25a9a05d4e1ce10aa0788f7baf84f0844d3e halomaps:3054 +socialistic.map EB4267DA 29114444 262144 5466ae84504107e42b3822fb3c56ba95668e8fb0 halomaps:3346 +sod.map 3066C66E 14295704 262144 5e3a1603ec1ac499ed61c63ea17017102ae5c60e halomaps:2996 +sodamachinegulch.map EB02001A 14869351 262144 25bc7f5c80ece33881c6246d933a95973f2447f6 halomaps:5493 +sofoc_desert.map 68308B3A 58655771 262144 9ef08606c3c4dd31c0237e0b757cb970135ccff2 halomaps:4061 +Sola Scriptura.map B3C132F7 32936444 262144 3e1ac9c7f67aaa6e99400db609b5b3ff95263743 halomaps:616 +sola_gratia_beta_b.map 7C2E9597 21672404 262144 b961d82d4d9b206ebc9bfd52175789f266da1279 halomaps:3104 +Soldier_Road.map D83BF28C 13516872 262144 314f22f16dac39d2c62ea088678e364ce93755c9 halomaps:2000 +soli_deo_gloria.map FB1880EF 29230360 262144 003a6038e7ebfc8358534dde67c5694b6387fe0f halomaps:1204 +solitude-firefight.map 099A1CB3 157574781 262144 efa5f79b7c091103e64b4f3e093c379b00f6e371 halomaps:5564 +Solitude.map 7B062E70 21967952 262144 45dd61de7854aac3d8e76dbf22eb2b46edae59d1 halomaps:1562 +solo_dangercanyon_j.map A81F64BE 99293756 262144 9ca6380c0315cd5f16ba380f2cd0bf0ec0bf100d halomaps:2183 +solo_dangercanyon_l.map C4EB1D6D 116399425 262144 3272eb77c556d522fdf63169f61aaf1b4f96aea7 halomaps:3076 +solo_dangercanyon_m.map 9C0219EB 117796409 262144 b55e29875fd7a412754253e6c577796b03d853a7 halomaps:3243 +solstice.map 18920733 37169546 262144 c252dede94c16d38ec743b7f59d7cd86220213f7 halomaps:4736 +Solus.map BD626C5E 13121312 262144 7ba34ab197fa7830468cc7304b938387340c3254 halomaps:1554 +solus_alpha_christus_b.map 9278A0CB 19646216 262144 6b25e7ad0098efa9e11575e74f8b58dccef9b08d halomaps:2986 +soluswar.map DD195E5E 113859166 262144 d93f7693418dfb1f08e2148ef0a2a1a47adb25cd halomaps:5641 +something_canyon_beta1.map 92FBE959 44731792 262144 81e582759b3c9f4ee8164e2d15591b83c0ac2d31 halomaps:2328 +something_canyon_beta2.map D95AF82A 29812080 262144 4da83d74e9cb5d66c49a897e0d7ea4df8712fb6b halomaps:2387 +sonic!sland.map 7F4BBDA4 18606844 262144 ca51de0dada81afa603fe464f7d05d9a02b18c67 halomaps:1753 +Sonic-BattleGround.map 6C25BAD2 40426457 262144 01797bc0f176375dfdca66b87eff615b2ef4138a halomaps:6756 +sonic-mario-ect.map CAB6CB71 10695300 262144 46135bf69b3054e41ab860debad8b01c5da35dea halomaps:1726 +sonic-mario-ect_beta-V2.map FC120B75 13137868 262144 2cd0dcf12d3dc137e37eb964a5ab36b5f370e2be halomaps:1754 +sonic-mario-ect_beta-V3.map 8758B5BC 26180893 262144 5b822dffe077c38006ed0c3920ed5910dbfc1629 halomaps:1755 +sonic-mario-ect_beta-V4.map 4E59103E 27303585 262144 b41e90957ee4dda3c7ec20b37572a8ce63e355df halomaps:1756 +sonic-mario-ect_beta-V5.map 91D6D5D5 28206149 262144 3c2e0dca35ff511b7a254e2139ce7e1fddc17521 halomaps:1757 +sonic-mario-ect_beta-V6.map 145EFC8C 31370034 262144 f314516610ede6e529d55fdc9caf171708eba4ae halomaps:1774 +sonic-mario-ect_beta-V7.map 5D3F8492 31604562 262144 806a87f959ed2aa5e52bf0a74b8e01668aed986f halomaps:1775 +sonic-mario-ect_beta-V8.map 242E1087 63460804 262144 554699c20312d5273b41a0a84693fc97d2e47ed4 halomaps:1776 +sonic_gulch.map B1FC4803 21977460 262144 01dd6da1817afcfd3e923a7d64aa1bf0e106626a halomaps:1026 +sonic_island_publicbeta.map 43A1E78A 17784132 262144 863f595e1782f5c549596a492b0961793dab5f7d halomaps:1633 +sorfea TF.map 0A036370 109868368 262144 492abfd3e9f996a21d9e83447ec2b8f169a6a6ca halomaps:6562 +sounds.map 00000000 41718640 262144 8ddbc7cdb19488c940764f612bd426b34fd87bab +SP AI fusion icefields.map 812D27BC 68221711 262144 427ac6d59c3a2b99c8c08f104b24086ef1137966 halomaps:3157 +sp_falls_of_reach_p1.map A98FF4F0 118774448 262144 bd5946171b0e4303c99d1d8c7a7d234eca44b8d7 halomaps:5496 +sp_falls_of_reach_p2.map 3C7B1726 118774560 262144 f22e46ef7823695d09ff7e6f1060c40d62719bd7 halomaps:5497 +sp_falls_of_reach_p3.map DC7CFACA 121024276 262144 73b22e3db02bf0ba309bb2c1405fb6021ce0b1bd halomaps:5498 +sp_falls_of_reach_p4.map 0D24E43D 127477904 262144 661d03e44d8597693bbbc2ee1e8a7df342317f6b halomaps:5506 +Space Demons.map 5F55400A 234102370 262144 71915513e0788d8a4e0c45702cc7a0de1a07014f halonet:Space Demons.zip +space'em'high.map 4736CC2F 18553357 262144 15416d69c52d9fc51cf27a2fe07cc4adae774858 halomaps:3662 +space.map 94CDF2D0 34598390 262144 6bbfaeb5ce47ce53fa15f97f19082ad1310ec12a halomaps:2446 +space_2.map AF6780F8 45989146 262144 7ef370c4e96e340e13963ddbb45d56d363dcdf61 halomaps:3211 +space_dock.map A918450A 24672515 262144 5c3ed81b979c34413be5dc30c6e5afacd96f6c2d halomaps:4233 +space_fight.map 61833EA3 13003612 262144 8fe7cfce8310143ea9a1b97f2f5eafca75074d0d halomaps:4268 +Space_Seed.map E1986B8A 235050508 262144 8df034bf2a989dc3b3164f2c016556a43274b63d halonet:Space_Seed.zip +spaceneedle.map CD2C7EA8 12417796 262144 42dc7114597a77ce9453893fb48b594d11efd489 halomaps:315 +spaceneedle_outpost.map F2B15919 18192268 262144 131aa7b188023d2f602d1a35e7b63815eb2c835f halomaps:4478 +spacexl.map 89AD26BE 16039304 262144 e07fbc4e88ced50330fd84df035ccfb82cd831a4 halomaps:277 +Spark's_Blood_Gulch.map A9D6759E 47266762 262144 cfdd0311139c0e0e91857c7a71c4f3d40a3082c6 halomaps:4949 +sparklegulchZERO.map 2C392D23 67109224 262144 5a38f5badb53f4183ba700c6c367a88f1f841b91 halomaps:3768 +spartacivilwarz.map F67B0469 32814310 262144 2e2547969167fd27854ca83bc8043227dae259e4 halomaps:4569 +spartan3.map C99CF796 108294613 262144 6681b1cb3ba0416b34191f8cf21c9e5780bb5995 halomaps:7127 +spartan7.map C223968E 103490113 262144 f7ee0451e7153de0f56a23d85053793e00349ed4 halomaps:7128 +Spartan_Arena.map DD447A0E 70273847 262144 22af7e92ac66e5616fb316fdfa04a2e70dda15a9 halomaps:5162 +Spartan_canyon.map FC908DAC 134298532 262144 e964c9a8d331eb6fed7bd07744d74428886849ad halomaps:5332 +Spartan_Playground.map C9872595 88687473 262144 0f9198c00b3769360345abe65bb470412cf45419 halomaps:5693 +spartan_wars.map DDFF46CE 127910048 262144 47cae892e4033cc5bb2e6bc19581e93c978a4092 halomaps:7038 +Spartans-VS-Odst.map 34D3FEF3 324762792 262144 be13a6391dd2a542e040fbc4eba211db9d1586a7 halonet:Spartans-VS-Odst.zip +SpartanWarz.map 8E69CF3B 82584990 262144 e6d4a13251cb7849d106cff59ec4d6573d81a1ae halomaps:3055 +spartns_vs_marines.map 7F9A463F 75743112 262144 6da022a579bae149483510f8308acbc3dea2045e halomaps:4973 +spatial.map 1DB477EF 27305236 262144 fe356adf60a5a0dac43f40c85d9f620314085926 halonet:spatial.zip +Spatial_Anomaly.map 476F001D 116628449 262144 ab00e83277a8d8f3338c2c350efe4437df6e7f2e halonet:Spatial_Anomaly.zip +Spatial_v2,0.map 786D0A91 27830996 262144 1f0bc21840a6ec758c4d19903858a430bf20d030 halonet:Spatial_v2,0.zip +Spatial_v3,0.map 5A58BD46 39842920 262144 fc242141e90a0f61b55f0027a71109a91a8f17fb halonet:Spatial_v3,0.zip +spawn_beta.map 276006CD 36865725 262144 024ee3c98b2c45b25ccc4104a805fb50dc134e13 halomaps:5080 +spawndewinder.map 8D3E6B4B 131464653 262144 19bc7097cca0cd86eaec1095b0bd37b46c618389 halomaps:6283 +spd49.map D2052C7B 19402824 262144 72a2d7cebeef24343844b00e50be55ec500b4c7f halomaps:1035 +Special Weapons Map.map 7B309554 13936092 262144 8c01715746559d353784354fb057282a326a03d7 halomaps:6540 +speedball.map 30428B48 14577236 262144 d44c50584c9ac7c4afa53c07bef0dd8fa8a8aa80 halomaps:2447 +SPI_Gulch.map 1A2D5944 16586612 262144 2a8e5399f4692aa6fc355d51e80cf39194751c1f halomaps:7097 +spider_canyon.map A6E9C632 15544512 262144 55901bb05cdd5a77d29ef828b288df500da41386 halomaps:2846 +spider_squadron_camp_alpha_0.map 0D91C46C 22576292 262144 fd8562430fff5c4ec283cd1577b48cf2b879db6a halomaps:3485 +spider_squadron_camp_alpha_1.map 8DBE768E 22984104 262144 2f7cb449ebe3caa4af7a4ec17c4dfe8663b54e42 halomaps:3486 +spiral.map 460BC14B 36528573 262144 d9dc485a45445f23a10eaa8096a2655c2e90ab3c halomaps:5901 +spiral_mountian_beta.map 1EAB8E38 20137396 262144 938acb4c3fe00f2555bc567727c1ee87c5e8e29e halomaps:2751 +spiral_mountian_v2.map 85978F85 33564212 262144 d71903c87c5723d41b66e263802bf3f8609777e3 halomaps:2800 +spirit_crash_site.map E5EF2826 121649896 262144 7b804500f2b10c7f42d06076ccff30ea57532948 halomaps:6401 +splinter.map D2C6180B 13245496 262144 d54120aa2071862177e705e8a18051e8a2cf18dd halomaps:278 +splinter2.map 392C3B1A 15026438 262144 74d068d87a5b422dd588fe2cb199d7baac2c224f halomaps:1045 +splitter.map 5B82D0A8 13487120 262144 a6a41f5da836ba64d59e11012f0071f30a930d04 halomaps:344 +spooder.map 8C2C6D0B 75983171 262144 33fee3b78f96e93dd1bff2bbb27d46dd0c10f42a halomaps:7080 +Spring_Gulch.map 71E7999E 63996014 262144 dc6fd6e05960733bc02bfc2593b19cdfd8d69197 halomaps:4626 +springfield.map D032901D 65641378 262144 fe4ed78acf775c6c6da7e6e753e47a72b5062ca6 halomaps:1509 +sprint_track.map 4D9A1261 28403382 262144 020fff11c0acd53b6660ab8384675836b7ed6e9d halonet:sprint_track.zip +sprocket.map A7DE1F8A 13676252 262144 185013691302697c769214447028091b107efe23 halomaps:2043 +sptest.map A59A99BD 218119209 262144 8cfcc1f81a595e4d9270f5b669ab9d6ccfc97be4 halonet:sptest.zip +spv2_bloodgulch.map 9B428DC4 75046891 262144 d1ab2fb774dc83057634ffefcbe5474f8da98135 halomaps:5030 +spv2_canyon.map B14272D0 115296893 262144 39245501a6e65924d0a6bb065043a7e4b004ceee halomaps:5677 +spv2_sidewinder.map 08D07342 100545269 262144 489a193c7744235553a9c442f59a6ace58fb5d3d halomaps:5031 +squad_aphla.map 4F936DCD 27473832 262144 25dbfd51b4628788727a241b67fdd2da769deff0 halomaps:3447 +sr-25_weapon_set_trials.map EAE5A612 17100666 262144 befeb5a67d4fcb0af10d0218ea310a747bb2432d halomaps:4332 +ss»bloodskill.map BB81D801 32947924 262144 79f9db0dedf85373b40a715aeb2392e2a1ebc080 halomaps:2909 +st_caverns_beta1.map 754A4A6E 15477900 262144 0dbe66da022f5d67ae1602cd28eaaf768e0ff13d halomaps:5191 +stack-of-dead.map 0A280FA0 185674626 262144 2657a944fd387403f79ac9473b9817573d1276a4 halomaps:5570 +stack.map FEA47D8E 16984784 262144 78eac8d16e7df92369e35dbb30faded47604f0e4 halomaps:316 +stackergulch.map BE73EBDD 24703152 262144 6e56ccfb047c46c66643eddff8c6244d80e676cf halomaps:6203 +stagnant.map 0591DECF 148854490 262144 69a5419f08102025e7e1c99a3ced7ec389dcf911 halonet:stagnant.zip +standoff.map 2A9B521A 53076702 262144 0d02905aada53589603bee21fb8ee5d5b7622a9f halomaps:4627 +Star_Gate.map 3F2C8668 61961902 262144 28ec13c3b0fc1d742aafadcf2ec1b9b59da272ed halomaps:3419 +Star_Gate2.map 1605C338 70614628 262144 cc38c0468812e4dbe595b61d8bbdb40a60b151d9 halomaps:3473 +starcanyon.map 460391A8 27126327 262144 91561768e5e83b6c3e543982cebb55a4f055db96 halomaps:4346 +starclasic_beta01.map 6D11DD2A 22402700 262144 d0586133596555b4f2b4febb4bd50db2153459c5 halonet:starclasic_beta01.zip +Stargate_Infinity.map 3CBD3C19 200853438 262144 1652891f844638e65237e78f15a1f0e086562264 halonet:Stargate_Infinity.zip +starlight_2.map 8F6E2801 61327772 262144 c02c8769ef5905689f4a832ef10742a9ce5573d8 halonet:starlight_2.zip +starwars-beta_904.map C494B345 133897250 262144 8c5e02c4a519eec4747a44772dfb4724bb6b0a81 halomaps:6745 +starwars-beta_97.map C85692AF 122878451 262144 4668f28225dddf9a9e3141fa54c6b67ba1ae4cf0 halonet:starwars-beta_97.zip +starwars-beta_9732.map 06D42684 122876371 262144 a448da5af43699d421bcf8ec7cbc99c729335410 halonet:starwars-beta_9732.zip +starwars-beta_981.map 96638AA1 119328198 262144 9d230e50f76ba5255b332b568f622fc38892d181 halonet:starwars-beta_981.zip +starwars-beta_9844.map 052E3C64 110604454 262144 dbc58d25d4642384083be52a889d1ddefff25c8f halonet:starwars-beta_9844.zip +starwars-beta_985.map 8E841652 111492478 262144 b348803bb37eeae52b292f7eb0c87c82b4b594da halonet:starwars-beta_985.zip +starwars_99.map 15027848 104952094 262144 e05a53069fddd4696f20ae24008a62441b852f58 halonet:starwars_99.zip +Station_X.map 72FE58ED 22725953 262144 bb964a6f982fd8f4b06cc0367aae2d044f48d5d6 halomaps:4234 +stealing-your-flags.map AB55240F 12825344 262144 bbf684ab7fac7877c82bdd85457052892174ebb2 halonet:stealing-your-flags.zip +stealth!.map 7C0C3397 133596382 262144 c3d044f1573eb6896bbe5be6360a1692541b0e37 halomaps:6432 +stealth!_v2.map 85CD5B56 129905214 262144 bce52916ac04a5287eeb35d1c3c8916c61c06df5 halomaps:6480 +SteeP_Holm.map 6EDF1B5A 31968531 262144 d3fa5dab6c5dfb9b05f9bf3683442e49c06c17d5 halomaps:1032 +steepcanyon.map ADAAF238 24534148 262144 0795b8385ad85cda573f07094805b0c59c0d3cce halomaps:4062 +STG_Beta.map A51A72A0 40499435 262144 860c1ae404d8faaf73e9093a8cf064931aaaf95c halomaps:2001 +stgulch.map E9378992 14820808 262144 65926b14e955bddc465eb8a49e5278d76cf57449 halomaps:3634 +STH_DeadLand.map 225FF237 128668305 262144 e4e64d2f0d075a20d8ba032aa66ad84a0df64cd7 halomaps:3362 +sticky.map 9E2FED37 24871462 262144 5e2f351dffdf4974737336d369efd6f8ddb7e948 halomaps:4570 +stinger.map ADBCB26C 20128453 262144 cf66060f467ded7825dae6dca456a1f2ffec8563 halomaps:1111 +stinger_3.map 00000000 246747137 262144 1caa5d81d88376e056536d6515ebb58bdcca017a halonet:stinger_3.zip +Stinger_Final.map 2C3BE531 133114065 262144 e57b5cbc8bc457895450750c72ac7f493b474c42 halonet:Stinger_Final.zip +stinger_v2.map 463D049B 25260749 262144 646ab18381c70d4eb61ba9d41cb37c279be4dddf halomaps:1121 +StKft.map 502B4237 190544189 262144 609970e0da10c95a390afbec77b683de32b32e7d halomaps:5576 +stkft_v1.map 42E2E53B 201129407 262144 e3900cd8894eba98ec09a3fd8b802fa742c3d34b halomaps:6486 +stonehenge.map F161ADBC 13285600 262144 98fdbe1bf97cb7afb029a1eb9caf83aa3db9c3e2 halomaps:476 +storage_war.map CF773D3E 55857113 262144 2ec94aec616249574f60bb046a60e3a605acf7c5 halomaps:3072 +storm.map 4B10BA60 20267580 262144 512e291591fb7eed69b7f1fcf646eb8cd4df4010 halomaps:4532 +storm_assault.map 06AB3DFF 65808578 262144 e347fe6e09406ae73b5cd72c6aa1615eddd341b8 halomaps:3325 +stranded_at_hangemhigh.map BC0277F9 61355776 262144 ef4926eb51ce46d31b41d5a2edb47f4b51d98057 halomaps:4589 +Stranded_beta.map DDEF0CA3 20182177 262144 16edb008f9de1b5a87a2503a623442e9f84cf65e halomaps:1007 +strategy.map 6F0AED87 210579971 262144 607e7705651c1b812c449d06f57670224b9370a7 halomaps:6844 +strategy_gulch_beta2.map F723B8EB 26254283 262144 def25c54e574213b4e508adc34c12ec21f57f203 halomaps:2308 +strategy_gulch_beta3.map 27506A41 45546369 262144 5ee15b2b7ea5a95396c0265681ee60406923e889 halomaps:2309 +strategy_gulch_beta5.map 59C33B95 44638751 262144 546d302871b59f58831e402784b5669ca5928355 halomaps:2448 +strategy_gulch_beta6.map A95EA1AF 68054001 262144 63fca91b55913947c286cb46f4aa8aca5b5b1d06 halomaps:2890 +strategydemo-01.map D0C7770E 76117096 262144 4115d8102b3dc38d589d92903ad140f0b86b6673 halonet:strategydemo-01.zip +Stratosphere-English.map 6FE948AB 327346363 262144 4cca621e4393d719e7676bedc66b7d82cbdd8139 halonet:Stratosphere-English.zip +Stratosphere-Spanish.map C916E71C 353266424 262144 81015c63624c49bfbfa7fd9accd9d45115e42a8d halonet:Stratosphere-Spanish.zip +streets_of_earth_city.map D41E6FE1 18370324 262144 324cf79b0a6c21de6e329dc568aa424823d950e9 halomaps:301 +stuntgulch.map AEB7EFA0 18714944 262144 623c04ad0de5d7b76bc2a61c2b159c2809231b05 halomaps:4769 +stuntz.map 0F87E262 12735328 262144 a2febc2c40bdf1c5af0b75b75a53d458b88dad3e halomaps:1110 +STW_Quizical.map BFFD5E54 70286883 262144 8cc880b1390faa3297d0966b3799567f6ed9e48b halomaps:3387 +STW_Quizical_Futuristic.map 2A0F3D50 41516891 262144 fffd54991d24de8968bfd24a47ba6532dbae1d1f halomaps:3389 +STW_Quizical_musicless.map 3D8CD5BD 35517813 262144 9fff36401e0f92c71700fe48d58518e74412b386 halomaps:3474 +Sub_Zero.map 70C4CC4C 324161802 262144 52721bc30aefb259b07b5c94e566978923ae561b halonet:Sub_Zero.zip +submerged.map F09F38C7 24001962 262144 8ef1b93bd51b64f2f9b97b87ed239f82887d87bf halomaps:6724 +subterrene.map E9707D38 46774408 262144 2d8118c902024c7f08d123323988fd520e281a32 halomaps:2699 +subzero.map 0F42BD11 18329880 262144 b652ef55d06fd9560079e25a2cf37cff190eda66 halomaps:1600 +sudden_conflict.map A389B74F 242982713 262144 1c92c1d4fd583a4e5ff67ad904589f445e0a388c halomaps:6287 +Sudden_Death.map 369CBEB6 296936879 262144 e6d83c0dc4644c33c6e2f34e2e42a3e8c453bebd halomaps:6977 +sufication_canyon.map 94FA4AE7 15399200 262144 0578d85e2ddc4f7c3b090abb1770d1a749de7d6c halomaps:2143 +suicidemod.map 7B309554 13936092 262144 f93a5c7457f7de6de8944d97babe8f0c0bea4db1 halomaps:427 +summer.map 4EE57D39 14006204 262144 43da52be733925b7100be1aee7fb02dd2c71f3e6 halomaps:2449 +summerwinder.map 67540A22 53654345 262144 058a762cb0784bb04b37db11639b41ec1c52cc22 halomaps:3979 +Summit.map DD6CD595 20526060 262144 32ac5b282bb0093a57195bedd52c5cd2f632ed04 halomaps:4163 +sunny_medow.map 5D6106A2 17930380 262144 0eb3828a1f27356d90d07750e5a5a5a4b0b77db6 halomaps:6035 +super-relic.map E7743E71 36969683 262144 c051b6b2db337544b6d0a0ac7f9d2d66cb8ce2ff halomaps:3274 +Super_Stunt_Track.map 3ABE3C75 20168112 262144 78275581c465df1d387cce81ba7bcbe19f349f1b halomaps:279 +superai.map 2E1AB619 28467735 262144 4a6b203024f3d919cabf2abfcf06ee76fac91994 halomaps:4878 +SuperArena.map 4A382BFA 21447112 262144 58fcbda3a820dbdd5a06074c8f746bc43a8fec76 halomaps:4661 +supercity.map 4A2897B7 22645904 262144 da7eaad86d2f619213ed2e3173ecf42496e9b13c halomaps:1766 +supergrunts.map A5C5CCD5 73384114 262144 3bbdbf18b883deb9fb121d6e878fb43ead6b7616 halomaps:7121 +supergulch.map 03DCD868 64861901 262144 35fe080f94ba6196983db6bb1a4f4f06c1e57f68 halomaps:3041 +superisland.map 6B3FFB5F 23354113 262144 e955636d5621ad84901e2ca4736dea890d793bf9 halomaps:3812 +SuperMarioceBetaV2.map CD555E65 26656792 262144 0a9314e633576ad3aad8b5b67cf6b26994402916 halomaps:2376 +Supersniper.map B25D0FC2 23440300 262144 0c8e89939cf6717f4aed219b1a088ff2ce6391a5 halomaps:4814 +supertoygulch.map 6E2330EE 20869726 262144 3a8659c21fb60d98544714cf7a8469775a5d6019 halomaps:1184 +supertoyicefields.map 96354EEF 22516694 262144 c98a20a1f5ec55c05e8d659a36e97f84c962a7bb halomaps:1192 +supremacy.map F0A86E17 14137604 262144 4b664c963e9eba26e3184d2f8fa0e6bde9c91169 halomaps:5356 +supwoofer.map 7E99C00E 31450658 262144 3edb7a848d72bacc4839e87d6f078abf6448fc82 halomaps:5311 +surf_beta_e3po.map 0663DF72 12214116 262144 1cd2848e0f3c600e1d2c9269376f7d7d88eb7e0d halomaps:4077 +Surf_HalloWeen.map 88393AF7 26830456 262144 e0b990687b027fc1618e51b25fd8460f102baf18 halomaps:4181 +surfsup.map 6F5117E8 12690896 262144 26cb174ca297b516dbff97f3d96b03186a0c36d9 halonet:surfsup.zip +Survival 1.map 936DF28F 133741191 262144 545a579efc1f8e9cb27d9a28ec8b2acc006ae4b3 halomaps:6542 +survival-canyon.map 19E07478 55053231 262144 2330eb242110edeb2638743cac02eb3fe60adaa2 halomaps:5802 +survival.map 00BC30C7 59310623 262144 d582693231b577bf5813ddd122cefdeb1ea5d58e halomaps:4167 +survival_is_not_garenteed.map 868BF621 31097022 262144 33614a09e1a2b1e03c34b7456428cd122b45551b halomaps:5378 +Survive.map A9EBFCB3 16838792 262144 8b9b17c976d3e34e883b7c5f48a5c7ccce214472 halomaps:4306 +survivor.map 0F22E554 48158739 262144 62c84ef8b760cdc69d590ff66d11dc6a94a2ece1 halomaps:3922 +svsm1.map 7C373128 103683992 262144 187d59e36a35ad8024d56fb55485d0dbaf213796 halomaps:6070 +Swamp-Gulch.map 1B0F063D 29922631 262144 b8ebc5f9793cd91bf7ca42b2a61df17ed291f7d1 halomaps:2551 +Swamp_Landing.map D4576703 177366787 262144 c286e0d4e0e495310e4bb0efb2f2b7fa093b7481 halonet:Swamp_Landing.zip +Swamp_Zombiez.map 7AB12F53 82424177 262144 07476181c421c944d2210165ebd045ffdf5125b0 halonet:Swamp_Zombiez.zip +swampgrounds.map 5F03F28A 38609452 262144 a64346afe34bb523341ed9ce4bff0dc2ba2a7192 halomaps:3200 +swamps.map 6173F268 16734720 262144 60feef75dd7e05f1109be8ddcbc3e9f82222c686 halomaps:456 +Swarm.map F228BB42 73381859 262144 a9654bd05ca7ed7b99057db5a13f203c7f485507 halomaps:2352 +Sweet.map 0221C609 28220904 262144 c2b34427a793d8921dabbfeb5b7d02278d9450f5 halomaps:2538 +swevoid.map F5E02AA9 53953572 262144 2edc22a5c6fe17dc3457fc937d85b9ed438f8351 halonet:swevoid.zip +swisher.map F09803AB 31169799 262144 5f8c8c3fcc1d008eb9dacdb23684a1bbd3d28251 halonet:swisher.zip +switchblade.map 2D43F6C1 15456348 262144 923d445a6ae0c02f3ee698c59833a166996e0e6f halomaps:2045 +sword-vs-gravity-hammer.map 5B12DEE3 162240041 262144 f838629ceb51163f7b6a5c0ebc071016be84458e halonet:sword-vs-gravity-hammer.zip +sword_gulch_ai_test.map 7EFC784D 34443510 262144 089bed68625279e9c5d7d20c1d0881f29b1d482b halomaps:3299 +swordfight.map 5B07454F 37241295 262144 94a495a22c61a85ff4ebdede0fbd78d6d24858df halomaps:5132 +swordfight_fixed.map 6C6BF8B3 189109550 262144 b3ae5da53994b46f11ac07fc3830a47ee097186f halonet:swordfight_fixed.zip +Syde-Winder.map 86D381C6 188756366 262144 f1f87ed6549104d195adbf9c7cf12f1513dc2405 halonet:Syde-Winder.zip +Sydewinder.map D1ED139E 151225187 262144 2ab1a6d18a3b7aa5739055e1c98b9c890b22a05a halonet:Sydewinder.zip +sygon.map FD9C8543 13141104 262144 4ccf5d483396e9b696b12d22cf637628c54849de halomaps:317 +sympathy_mp.map 17B51CD6 63165480 262144 df1f657f74da4131e837ca8c02408fb2c0c7b22e halomaps:3588 +sync_test.map C7E696F6 25188236 262144 5927f2741d5ff6a1a4b672faac4959394fe1a1aa halomaps:5992 +T1_Tachikoma_Shutdown.map 39D75C17 109873102 262144 f2875877147415909ff7e199f0d303b112a9912f halomaps:6099 +T2_Tachikoma_Overload.map 0B290987 88639910 262144 9c23d1050c160f2cfb7a5f84f6ce4ee7144e9632 halomaps:6100 +T3_Tachikoma_Blackout.map CE3E9EB7 87748411 262144 9ce40ae66f4c20d0cbbf4c33b88aa6fdd0301ed4 halomaps:6101 +t3h 1337.map 00E6C0CB 16537736 262144 2127b929d23b9385556d258961bc3829073d0deb halomaps:280 +t3h_1337.map 00E6C0CB 16537736 262144 a0461642463de04f9244ebce4217cd16d75832b0 halonet:t3h_1337.zip +T4_Tachikoma_Rogue.map 8CEDA655 120991605 262144 ef5bfe7ba7f467a69843369670d8e0d98e2c3cb2 halomaps:6102 +T_Canyon.map 6CEC8CC2 26087336 262144 dafafb3efaccac1636d12fda7caa31bcd17befde halomaps:1910 +tac-creek.map 03FFBCFA 64457214 262144 8d564f44c521cb35e293fd5e63ddc66e2e81241d halomaps:5269 +Tachikoma_Land.map 5E0415A6 27866952 262144 d8fb497d511c5e182a87c87402b88a5035fa0b29 halomaps:4479 +tactical-assault.map A6D23FD0 273390902 262144 d740e249d999d6aa293c5d507d8399ac73dd14cd halomaps:5542 +tactics.map 5FDB4EBD 35870678 262144 e34173bf3fb099cee43f1014f22f80ee264abd6b halomaps:3152 +tailslab_beta.map 85C1F572 13080392 262144 070d0b426dc2d15bb86bb68c7504ae57506285a9 halomaps:1818 +taiwanbloodgulch.map 2440BB10 129966093 262144 6b4b26ca75b4bd9322e6ad2dc9afbe6252b89def halomaps:5494 +take_your_weapons.map AC2EF65A 51615968 262144 5e0082bad57826072e423cafc1ae709eea14dea0 halonet:take_your_weapons.zip +Takeback.map 7388F05C 328588571 262144 b56126886ad32742be1e3d18e988182af2e33ad1 halomaps:6545 +takedown.map 3C799B70 138566839 262144 489288fe56679b0bba31407cd39d33b08d4236af halomaps:4815 +takedown_projectlawson.map 4218BE23 395514372 524288 2cce186d1d48f834e01f80f95e61abf7ee880ae0 halomaps:7089 +takedown_projectlawson_p2.map 9AABA1E5 399929737 524288 e183b4ca378831f48229c8c8b3e49240f2249aa3 halomaps:7089 +takedown_theintroduction.map 61088EA8 365659824 262144 8b20d2cb0e6a4ad7a53ad2e990c75ccb60ef8874 halomaps:6789 +tall_mountains.map 3202DE64 16295596 262144 33eb538d66d3de1bad62b142fbdb63b71599076e halomaps:1819 +tallon_overworld.map 69092660 32650423 262144 e25c4f8f888f537241f2d1bea6393563dffedade halomaps:4294 +tallon_war.map 69286E3A 37474196 262144 e70f8812128772ad8787d9afe6e53c610b96ce91 halomaps:3944 +TallonIV Overworld RC1.map BCBA3D4F 37875269 262144 42c50e80b6f72e072088b3fc4308a51d1bebcf50 halomaps:3357 +TallonIV.map B32706DF 54269288 262144 2fc7cff313a03c04c1c9af075fb735831abd0079 halomaps:1930 +TallonIV_Overworld_beta.map 1883E13C 38318233 262144 6ece16dfe50f9f463e914638ab97d1ba6013fb14 halomaps:4300 +talltree_beta.map 057F67AD 15635038 262144 b36020411075d29a1da962ebcd364df37ef17b51 halomaps:1797 +Talus_IV.map C084C59D 232324315 262144 b06bacf459db73d149e242fcb5f0649f172251db halonet:Talus_IV.zip +taos_fantasmas.map 5BBFE92D 94698062 262144 43cca190bbd40655f705c0cb42fce6730c3c054f halonet:taos_fantasmas.zip +taos_fantasmas_v2.map 52AE8AEB 118175160 262144 6005df9677f525c362b309f2f12ca16846a168cb halonet:taos_fantasmas_v2.zip +Tape_City_Gulch2.map 65837C8E 96225300 262144 128d3532273fc08c468feb9b11701926eb8c9d4a halomaps:6541 +Tape_City_gulch_v3!.map 3828E2A0 133087912 262144 5829dc838f9889813a43b1742b477489c3cbbfcd halomaps:6783 +TapeCitygulch.map D5E8E9DE 68483519 262144 4e750881dbf333485460a5c8608009f892fe0288 halomaps:6497 +targetpractice.map 5D62C4ED 27981522 262144 6f94313e996c43b933d400ac5ab5620983eb162e halomaps:3264 +targus.map CA7AEBBD 19056071 262144 98d033f57189e29ee133be56036cdb9287baab81 halomaps:2552 +tazlandgulch.map 7816D4DD 43299353 262144 d5d6e9522ac8875c8d199140deb0eb3adc45cd31 halomaps:3086 +TCBL_Bacons_Race_Track.map E0C48483 33768189 262144 9e989776d5ad1f6806ba92888ab7d7285cbdc351 halomaps:2672 +TCBL_Bloodislands.map B651CCB3 45806880 262144 f921f077ae659138157485751ff3d754fb51e4d9 halomaps:2673 +TCBL_Coagulation.map 9AE4C7AB 53688090 262144 7cac4aaf8870ff3d2d6a3652c3c4e8e567b9813c halomaps:2642 +tcbl_zanzibar.map 9EDBB74B 57434326 262144 e5b9f0984db7ab7366d8ae8ec068540f8931f203 halomaps:2674 +Tche.map 9B9AB3D4 29170470 262144 2adb00bb54483cbfd0b5df6f241155946f4b885d halomaps:3105 +td_echo_sbb.map 2933D4DE 388095255 262144 7a98d3f9ab6abf240fd9a7a269a242207f5455f8 halonet:td_echo_sbb.zip +Team-Paintball.map 00000000 74181168 262144 c0b6f1cc1548c42a6cdea2272cb6c5bb84a5f457 halonet:Team-Paintball.zip +teamslayerAI.map 306D697D 74477757 262144 57de28304be5a97d384c8b9d79160a5575d1329c halomaps:5455 +teamslayerai2.map 13895DDA 84501291 262144 59bf98b00719b54cd2095cd65b91a9c817874d5b halomaps:5458 +teaser.map D50C8853 14343172 262144 80453239fee88d3a38f767d199814d7e0c36f075 halomaps:2782 +teh_map.map 35365BB7 12124860 262144 197137ebb861d75bd48b211a48676930688c67dc halomaps:2353 +teh_map_final.map A8178422 13577402 262144 3af4217bb0033a81de406b95763e75d2522a17f1 halomaps:2377 +Teh_path_beta.map EE80A7C5 21824132 262144 47c51f4a20cb7b055f0b0728e44e422d6afeaacc halomaps:3475 +teletubbies.map 070D5193 19090840 262144 fa4d0a58783cf944c8fb79f633dec9b34fc4a7c1 halomaps:2002 +teletubbies_v2.map 1B343A1F 41037922 262144 7d05137cd380d5acf4115066ac65a7e686fbf813 halomaps:5794 +Teletubbies_war.map 4BBE95B2 260907072 262144 c1def0fd1a5885447b76d4eac75ba8ca9548e818 halonet:Teletubbies_war.zip +temper.map 333B2B0B 17440080 262144 da7417e2c7d7be21950a9b4b21dfbf0fe307aa18 halomaps:4533 +temperate.map 033A9032 43180818 262144 5d9f1acb240815df3b79af6f1e431bbea5bc710c halomaps:6543 +Tempest.map 5C044071 66877212 262144 0f05f3eee0c529feec49f4687d49569bd94a64e9 halomaps:5203 +temple.map 739A5492 13861260 262144 56f3e9c3965de180a613635148bc6fa87ead142f halomaps:318 +temple_assualt.map 6E9903FC 102330124 262144 f71b89ae91013f72c231d8985678bfe2c30de604 halomaps:1471 +tempo.map B0C85892 24738610 262144 a36d1d184f7143687991d5fa9a0cacbd9f11ae03 halomaps:3603 +tension.map CAE9338A 17124473 262144 e107b3ae613d89c199362117171eb6ea4e17bb50 halomaps:1076 +terminal.map B4E0A8DD 24722328 262144 fb53d7f08583f94d98a94e41730fd1fa71fab2d8 halomaps:5795 +Terminal_Velocity.map 523CBBFB 381781868 262144 ba892c45b4074f4902abd79b1f432eef164042d5 halonet:Terminal_Velocity.zip +terminus.map B747885C 34639096 262144 1f63efe1bbbe76f1d8a8a47643e94f9fff922fa7 halomaps:3056 +Terralan.map C21EEFAE 21532608 262144 7ee49548b82d61f230e37c4bcc82ff481c135686 halomaps:319 +territory.map DFCF9CE0 27541256 262144 c033061b975f0851e1540e89446a887d9e947f9f halomaps:2378 +test.map 16E6C389 28543672 262144 96309bab2936d5d00cbcc684bc0d208bd652fd33 halomaps:5431 +test2.map 1EEAD2E2 33002005 262144 9b03c9d4045d7a8b1681b49ca8b6941d14d46dfc halomaps:5908 +test_1-1_demo.map C9DB9D2D 11561568 262144 2d40735a6d5822e6aaaadfff394bf83f12fec6e7 halonet:test_1-1_demo.zip +test_battlefield.map D772ECF5 26890792 262144 10e78c6cbbe9f8d598c5189570d968c1b7450f05 halomaps:4144 +test_gulch.map 05A34C23 115845449 262144 7084003ff09ff9bb139a500327b2ec0f7894c3fd halomaps:6156 +testament_beta.map 7DF8A106 46328834 262144 992196b825c59112224a8a84f0ebc044b9ec5bff halonet:testament_beta.zip +testament_beta_ce32016.map B252BD92 44924594 262144 15cb629810be352fd21d1a2b3247d7bae70fff79 halonet:testament_beta_ce32016.zip +testbox.map 8A23BB45 22624008 262144 4c921f18263fe74217814ce16ad380936c7dcb4f halomaps:5249 +testing_room.map 258E3FE4 12747716 262144 8a0a7271b056f5f1c8cec55a13c728a63061d3c0 halomaps:745 +testingground.map 6AEA7129 40173500 262144 8688ed4e28db855c579597b8b6a63421e25fcd28 halomaps:5141 +testingmap.map 325052B7 18118873 262144 17ae1dc8bcf739be692416805583594bdb33d3b1 halomaps:1013 +testingmap_weapons.map AE0861E0 70827706 262144 f29dfb8140dc3da91152828c930b9733b1d35782 halomaps:6597 +testmap.map 7AE404A2 14408012 262144 2fff4d8c4db0194933a53bec537764cc124cfa0c halomaps:876 +testmap01.map 1424ADF8 19214580 262144 d0ad621611bf512b6129b2a5a598eacecef73036 halomaps:2071 +testmap4.map C01F6284 168560968 262144 da0ea6d9ee100a731e8ed13cf6813c870ec40afe halonet:testmap4.zip +testrun v0.15.map 7FC3C107 17874786 262144 7a5d1e3c69c44a6243d0dc61aca31b30ea319624 halonet:testrun v0.15.zip +testrun v0.5.map 38D2CF1B 11655596 262144 402a3fd2f040c3eef030c52176dc4e743ac63e2a halomaps:5571 +testrun_v0.25.map 16934EDA 22393891 262144 4e3548245ff2817908e1922317021837c30e3f9c halonet:testrun_v0.25.zip +testrun_v0.5.map 38D2CF1B 11655596 262144 2f3cb86375db4bb6d6825a289a358914c24cf74d halonet:testrun_v0.5.zip +tetris.map 44B91011 18043505 262144 9fd15155eee4ef3b639edea153e260ff4ad2af28 halomaps:1429 +teufel_hunden.map EDA6F06C 49350738 262144 f195acea33da01d53513f8b18c5ff1f599704913 halomaps:5114 +tfr_icetrap.map 88143D96 26713610 262144 edb63bc349f51ae822e475209c2fa9f8037b5a47 halomaps:3241 +TG_asterisk.map 186EB864 23381783 262144 bd80f1292200aadc9485072888dd4c5f4528509d halonet:TG_asterisk.zip +TG_Basis.map 75676C92 19069184 262144 131de786482e7a59d70f4ed2b099b0ebec692ce3 halonet:TG_Basis.zip +TG_eclipse.map 6144EC44 42100341 262144 5f370fedbab9a0d8caedb50d4d5ab8344254bdda halonet:TG_eclipse.zip +tg_forerunner_dwelling.map 07ED58EF 12879548 262144 39cb7919d8910ad080dee03b64d32f622246d7b2 halonet:tg_forerunner_dwelling.zip +TG_leviathon.map 4EFA1DC4 14955917 262144 e51d7162052417922bec91cd5ecf1cee6036aa2c halonet:TG_leviathon.zip +TG_YOYO.map D0729320 79479365 262144 a2875eb113a4a54d031f36a4ab6d281b6133638c halomaps:4100 +TG_YOYO2.map CB24B86E 85625732 262144 373ab58afdf4e6a8f39fc72cb33ffabc37eb1c5c halomaps:4164 +TG_YOYO3.map 6639BD74 86024631 262144 ca4df1befc3c1dcfaa6b64418ad2a58b4b6a59c5 halomaps:4235 +ThanesDeathIsland.map 034FCA9F 44809113 262144 a8029c9557b43f2878301b739edfed6089541349 halomaps:7122 +The Bomb.map F948C051 18526615 262144 71af4bc167b1a787b60cbb2576d3dedf926ff892 halomaps:4816 +The Johnlex Experience.map 7F1C9E16 23598016 262144 1937e77dbf0d0a2e8bb4e35a2e573236d1882d6f halonet:The Johnlex Experience.zip +The Lost Control Room.map 82A1059E 34828523 262144 12616ac9986fb004133b7360c696ee4cf58bd7bd halomaps:784 +the war of three.map B25CE5A1 31884245 262144 90c83e2a69180abd4f8c8cd6f70ebb79f802494e halomaps:5032 +the-bridge.map 41EBA411 69895711 262144 40591e70e03ec92594886be150a3207cffe8a0c0 halomaps:2450 +the-city-of-blood-gulch-fix.map EBC8443A 78250558 262144 93c47b2fe6a2606666e12d2878eb5373995999c7 halomaps:3242 +The-city-of-blood-gulch..map 55310F1B 80485598 262144 1b8242118bdc77df8f445e28467f130da501c052 halomaps:3225 +the-great-valley.map B234BA42 91927052 262144 8e555d1cc165447798c98e22d61bf5971108b0ab halomaps:3120 +the-maw-hanger-v2.map 06B77510 94552307 262144 bce5022851167e9757d9d3ae394b07e8e055560a halomaps:1671 +the-maw-hanger.map B92B8785 53893004 262144 eb68d3d2c195f46f95c633b7149b599dd7bd5951 halomaps:1666 +the-maw-muster.map 90527CC8 50096200 262144 a3e6e8d66323716f3aca2ee34a689bdc7f53d3f5 halomaps:1670 +The-Quick-the-Dead.map F946B370 56163685 262144 17fd965047d49d25a5ca5b5a1401feae445ee9ba halomaps:5033 +The-Rat-Patrol.map 45419E4A 134057875 262144 6509db6476543d9d0afe8ef19853c41d648b68a8 halonet:The-Rat-Patrol.zip +The-Right-of-Passage_a30.map 504B11E9 95505011 262144 5ccc238b8bdde999b72d87be7e484c85651b7f8f halomaps:5133 +The-X-Factor.map 0908FA7D 99762015 262144 86bc5ba078036f200c54161f5c28134beb843af4 halomaps:3153 +the_abyss_3.map 00000000 258911428 262144 180d95f4deead67437dd8a382dc9dd828bad6c0c halonet:the_abyss_3.zip +The_Abyss_4.map 8459F6FC 130839564 262144 72c4dd13d049640276b6f42cd6e8bb9468742c44 halonet:The_Abyss_4.zip +the_alamo.map CC023B57 123891887 262144 de44dd6478e15302076f6e9d9f61b307c45e7c8e halomaps:6403 +The_Ant_Colony.map 1D8B526F 322272255 262144 2a4902822630c53f803a3ae91b4fa22d0f756650 halonet:The_Ant_Colony.zip +the_bay_of_pigs.map ABBC38A2 42097793 262144 2dea0057bc28085a01578ed26a960d5c8946190d halomaps:4590 +The_Bee_Hive.map 1B27B1A5 241038969 262144 785e52ff1244eaa9a3d95a16a7a603a34be02d4f halonet:The_Bee_Hive.zip +the_bidding.map FA5D1E5F 49620644 262144 f6be65b493df873a17cf7edee6a58e65b46df5d3 halonet:the_bidding.zip +The_Big_Hill.map 43363F2C 19731348 262144 2630e73382980df2b02da1efcebc7e27ae77a358 halomaps:3924 +the_big_hill_v2.map A5D4BF86 24331584 262144 8bc713090eba3f9e4cbb7b1b35182797b8ded43d halomaps:3925 +The_BloodGulch.map 4CC5629F 93622575 262144 5d9a8e8f3bda9512116939a7517a9636b193283d halonet:The_BloodGulch.zip +the_bridge.map 36231353 58167737 262144 3d2c94b2bfc33d08303a847891ce88b758a69a00 halonet:the_bridge.zip +the_Cage.map F54E5002 346460481 262144 c5587eb773e6d03eabe221ee427dad6663d8a65a halomaps:6784 +the_cage_un.map F54E5002 346365069 262144 a96b2057ce70e913c9a9f30a86a8068c8c02422a halomaps:7012 +the_covenant.map C77CA195 127865122 262144 2b95d76e51020e40a8a87052569e6d8b320aa40c halomaps:5432 +the_dangercanyonv0,4.map CAF36E15 93960991 262144 99a840d129bcf7c9bb5ef387fa26b782b1a2deba halonet:the_dangercanyonv0,4.zip +the_devil_fight.map 161D7337 14691124 262144 c14c34c3b91da904637a7d5651d0ec039cb1ea21 halomaps:4236 +the_end.map DE469830 217299376 262144 2f016ad7e89517d52a1ff8ddbb23954dffbaf3ae halomaps:6681 +the_engine_room-2.0.map 46AF7527 81319140 262144 ee7eaf2817e9470cd6da32518d0cfb2abaf7c5ab halomaps:1992 +the_epic_war3.map 71D36BFF 30910801 262144 e4cdad9b9f8cba1dd4f7524a354351d619eaf56f halomaps:4571 +The_Facility.map AA90073E 311946310 262144 4e6604552ca0da37c490d3d16b6bd1e30d4461a4 halonet:The_Facility.zip +The_Fall_of_The_Resistance.map 4F3031F1 191062917 262144 48e40a9bebe0c37362fce7399d82f6002c95c146 halomaps:5577 +the_floods.map 520F347B 83697843 262144 380119818eaa220b2758ab2a4227d8c5090fbc0d halomaps:3074 +the_floods_legendary.map DB47D5E0 83983726 262144 cbbaffea5f491f9bcc80855d6cb87cda8a7d9406 halomaps:3132 +the_floods_part2.map 072C02F5 89129976 262144 b69ed7b48e1fb65c2766ad28fe48ddc57bbca2f6 halomaps:3106 +the_floods_part3.map 6292CE7E 94195515 262144 bf89da99d711f69d088db9a9d77feb33c3046e9b halomaps:3663 +the_floods_part4..map 6546C7FB 59048482 262144 b13c44370a6bd6cc59651e27dd96d6438941ad49 halonet:the_floods_part4..zip +the_forgotten_market.map 79F43D3D 56055946 262144 303b79a49716128e64ffbaba0d4ad3ff99ede3f8 halomaps:5936 +The_Glacial_Baron.map 08E8356E 44108978 262144 ba314383c029a6c7a519cb640d0a11ff2cdb53ed halomaps:3420 +The_Great_Battle_of_Asis.map 7CE60B10 84132829 262144 1d8916c8db947c8de306ed57dfe3d5ebbcf088ce halomaps:3327 +the_great_battle_of_asis_v2.map F3A2CE13 124868890 262144 cb837b5064a43c9968026dec36566778c41a5c76 halomaps:3901 +the_great_battle_of_asis_v3.map B4F36ACD 131673043 262144 16ca61c9a4d5fa65777963c915fa87b69f1896bd halomaps:3970 +the_great_battle_of_asis_v3_pb2.map 22B5109B 130984901 262144 ccbab0e4792c587855cdc12b4bf5daf3db2439bb halomaps:4063 +the_great_battle_of_asis_v3_pb3.map 8DEF9139 132817580 262144 18363f7a6252105594ae5106131b53088f558bb1 halomaps:4910 +the_great_flood.map 0F7013DC 66340393 262144 48fd99d148dd32c50973457e03671d124fbb94b6 halomaps:3154 +The_Great_Infestation.map 9898723E 242780688 262144 7cdd6ea73fce64f7148d477118d3539e1ed661d1 halomaps:6344 +the_great_war.map 4C5587A5 72230481 262144 832386b1c241c7fcb6b9a6dc8829d6230f99cad7 halomaps:2184 +the_great_war_2.map 4E667E44 80069387 262144 e03ead6cfb49b2cca34033ef6151ed28e05dabec halomaps:3538 +the_great_war_3.map FED1C560 300586653 262144 4ab02652b93855c969dc592e95840005751d84d4 halomaps:6071 +The_Hall_of_Heroes.map 7F05D3FA 16246148 262144 c9323216477e82c93642068e67edecbde1e13442 halomaps:591 +the_halo_hq.map AD768577 26247956 262144 164add117423f13d99f5648ea51f83908b97b31e halomaps:1832 +The_Hollow.map 1BB3E06D 35483735 262144 f10dc1b8ccf33dd1652145e299614fd645be153c halomaps:2417 +The_Honeycomb.map 2727F567 287854742 262144 f725962d61904e896b2e1ce3c164982c8bd1cef0 halonet:The_Honeycomb.zip +The_Hovering_Highway_BETA.map F50D38D3 81481871 262144 9d83e6fa55fc98f9abbec167e372bc5ea3ebbf44 halomaps:6313 +the_hunted.map 85741624 22056982 262144 653427526e4b597f8844bc4789ae494385d0a02e halomaps:2276 +the_jungle.map 8B1CD189 51161870 262144 10d7e00512635cad293f6a227d4ca22229673b13 halomaps:5174 +the_land_of_hyrule_v0.2.1.map 94234781 48346387 262144 651e5b8efbd9cd2ffed665b2852595b9fabced91 halomaps:5034 +The_Land_of_Hyrule_V0.2.map 0F2A4D3D 46868030 262144 3656312f02451f508c9a9494457227303a7e4a45 halomaps:4540 +The_Last_Capital_Ship.map E00377F7 207059719 262144 f2797007a464483d02ca94a9c9092aa2ff491bfb halomaps:6158 +The_Last_Stand.map 00000000 398558853 524288 68e6bdaa2b3279e24faf883dc2e4a181e035a1d4 halonet:The_Last_Stand.zip +The_Library.map E1C1E2D2 131790279 262144 9a5124e825dbbb4113f0c90675b776950aad9777 halomaps:5475 +the_maw_hallways.map C91276EF 38884492 262144 839ee4ceb2f759ddce4183284aecd1f3acb2f1b4 halomaps:4817 +the_maze.map E8DD637C 19360604 262144 b2bd95c2d7cb3d3f6bde428d2ee57de365e51e12 halomaps:3589 +the_moon_hotel.map DB9AF845 46009465 262144 13ac472e527608a924d82b0bc7b344d61b9eca52 halomaps:5916 +The_mummy.map E4FA9A60 46936108 262144 6e451dfa3c967a87406884aaed8f7bf1f97bb591 halomaps:2766 +the_mummy_3.map 473EEECB 69331939 262144 bb7716a2bcc030775776ed91406806902f979a96 halomaps:3097 +the_mummy_4.map F00C6873 63521073 262144 dd384d1022a6b29d1581382daecd3da3b3f3defa halomaps:3265 +the_mummy_5.5.map D27A270E 80772026 262144 3e66704b77d39f03d04be314a226e817467b6922 halomaps:3719 +the_mummy_5.map 12BBE9C2 78165771 262144 9aa93d5250fa6e94dd6145e8afb93a5b45e24d80 halomaps:3518 +the_mummy_6.map 98FF2FFB 80891626 262144 d0375ad06ce1d8002ec84dd24262d5d123f0d974 halomaps:4269 +the_mummy_7.map A8B82AB8 101202845 262144 e1462561a98a3e864e30c2d1e05cda7ed1949a97 halomaps:4541 +The_mummy_returns.map 1F4C2FA8 78666422 262144 797730cd654ef02409d0e0e5785c69bf5b647966 halomaps:2783 +the_narrows.map 11F8152D 29074420 262144 6af6baf0c43c6d61eb5cc30e18dd5efdd6822990 halomaps:1053 +The_Old_Forest[Build1].map 358E15FD 365863459 262144 da2771248380054ae9db4147264939baead18681 halonet:The_Old_Forest[Build1].zip +the_omen.map 9A19F62E 17579068 262144 79d46c4fa34afe0f0bbeadbd524703473b00facc halomaps:1587 +the_pharohs_death.map 3B75F237 76302430 262144 46711af220e48835904ec71f63a2a99627b166b8 halomaps:4078 +The_Retrosic.map 9ECC3373 37168602 262144 1f61338724e50249ce6eddfbff33e32df61adf5b halomaps:3087 +the_retrosic_v1.0.map 8A81F7BB 60962197 262144 ead2cffe4af25545abdb0bf6732ac401410a26a6 halomaps:3155 +the_rise_of_asis.map 28BB51E0 89796456 262144 47fc5b894f7cd163befae9cec084eb6e9ef0b564 halomaps:4572 +the_rush.map EA3D85AD 33493097 262144 8c3e866167dcdde183a5732dc29753faf43ca68f halomaps:2003 +the_sidewinder.map 392F570D 397502440 524288 d106f56fb0d3c770900ce5e164b6c6ebe43a5aaf halonet:the_sidewinder.zip +the_sidewinderv0,9.map 18AE19C2 98253621 262144 156048ab9c1fadf92860ccfd599637f48d238e7c halonet:the_sidewinderv0,9.zip +the_spartan_coliseum.map 74DA66C4 33473663 262144 124dbea908e03b5c66efcfdb11b94bc4f1b697cf halomaps:4333 +The_System.map 85E3C83F 14051640 262144 8902f98157410ffeddc562ed3629a96f4c80b562 halomaps:2847 +The_Warehouse.map FB86B995 132231441 262144 36dbdbfdceb75bf203581ce6a3d4d5c426008491 halonet:The_Warehouse.zip +TheBestBloodgulch.map 8D1CA87C 57537508 262144 9bf51bb947b5fae0cebb161bf2d985d3605fb3be halomaps:3032 +thebestbloodgulchv2.map A5772F5F 53240228 262144 a62add9bf6da1ce9cca756c1c75ebe5dc7f78c86 halomaps:3073 +thecity.map 275E48A3 17648776 262144 f01b3a770ab87b0be7ba32bc306dea89887ac8da halomaps:1556 +theclearing.map 0BB10F91 13513276 262144 f8cca211db4dd1a3d3a0b170189eaa732a971b8d halomaps:320 +thecovenantatwar.map 42E4BB04 34572012 262144 f5a1a3452ff777f763fad69dd0a0bdf2d00143f2 halomaps:3900 +thecross.map 94194929 13846228 262144 b173c3589b81dbd6b21a38bc5c23e32f54c5ee1f halomaps:2752 +thecrossing.map 867DE98C 35218584 262144 dd42e36f84fe867b3fcd4b121d4092125c32832b halomaps:2997 +theditch.map 08182395 24013143 262144 e1e9166c21a4b08b0802c47892bfda80cc3bec0c halomaps:4414 +theend.map D64D0C28 61789731 262144 d33abb8562f9e02e067a6f42ca69052e01fbe235 halomaps:6051 +thefacility.map 803C0303 38946920 262144 263dc39766f27e47988eb58e7cec7710b8cfd511 halomaps:363 +theflood!.map 3319F4ED 69943483 262144 6a0a06adca464422f73e1ed5abaa8aeb31c8f451 halomaps:5796 +theflood!v2.map 595D767C 114202806 262144 4440387ba047fee95c84d4716ad30723fad27a47 halomaps:6157 +thefloodwar_battle_final.map AA30DA2F 311381877 262144 4718a1427f0cd1ff991988e999e30c48a2ef4650 halonet:thefloodwar_battle_final.zip +theghost'sbloodgulch.map 5DE6F6AD 22534390 262144 e9db4670791607dcd4efc417ace3cd7cea73ad24 halomaps:2262 +TheHangarClassic.map CC9A4B42 28486760 262144 01da875072370b9c93c821b9b3acdd0efe4adae6 halomaps:1205 +theisland.map 32C8E7B9 12615424 262144 727c68686f7724be079563a45b8a270a08cb85ac halomaps:2072 +TheMotherlands_BattleRoyale.map D3E18270 118069226 262144 3af31f66a6f182b7be42ac9e6acf4795aa088723 halomaps:6402 +thepillarofautumnspace.map 0B0854F3 56418452 262144 46c75ed926649ac58fd47028ca0735a373854663 halomaps:1055 +thetrack.map 0346D526 15203828 262144 952ae626f4eee17a0d7780e3abf64b193023f459 halomaps:786 +thetrack2.map B912456C 15411470 262144 749082172a487b6c1ed65910b3a577bff573cc8a halomaps:787 +theunderground.map 7D2AC0DF 20438840 262144 e65d2f28c67392046a837138c2465574920f3429 halomaps:3882 +thevalley.map 4F025E62 12961256 262144 73de8a7d4d2aff33b14479f742c29963e5731d7b halomaps:5242 +thevillage.map 07B3876A 13097000 262144 2c9f1f72c072e2c882af24fd81a76e6672ba3207 halomaps:1000 +they_hunger.map BA0FD59C 40702005 262144 0118822120fcad25c4f5eb737cec50ab9413acd0 halomaps:5379 +think_green.map 02E0D2AF 67476390 262144 851d2683618110a136b3c7d00056f7a3583943a4 halomaps:4950 +ThIs_Is_WaR.map 02BA05F0 81185032 262144 c57a795172928dd325d25eacbcf4175b085548c5 halomaps:5694 +thunderdome.map 008D3F8E 27543868 262144 2b48aa9be8b8c30c3eddf2303bb41a47f6e558af halomaps:5163 +thunderdome_fixed.map A9641914 21213245 262144 7d068d3e6d3b1e8a877fcf299cdfadf816e13f70 halomaps:5572 +thunderdometestmap_release.map BEB4CA65 23429543 262144 eacb56d6c5fd6fb0e3939dd50f3a5bd63f170028 halomaps:4951 +tianguis.map BC640E18 75523101 262144 28329d8583a614854363ff1e742059356416f5bf halomaps:6735 +tianguis_v2.map 4F77FD08 123260353 262144 4e8dbe23ec998cf77a3dcf99afaa7be3c91d1381 halonet:tianguis_v2.zip +TightFit.map 11AAB143 12376116 262144 f7cc9282889ee0a87c1a49548b6bc290b58fbc70 halomaps:1093 +tiki_attack.map C8519DF6 64578685 262144 aec9d1e8338869928368015f5635478b7009f4c4 halomaps:3720 +timber_river_defence.map E3D28EF8 101217915 262144 89220ff3f4d548bbaa6a21f1272e2f66da89d29e halomaps:4628 +timberland-ai[unfinished].map 08985F78 96275844 262144 ecb29e94c5536e2c6716b02f45033da9cf37500f halomaps:5711 +timberland.map 54446470 14690920 262144 7ea6d181ade586c93b675aff44a0b3af007db4f2 halomaps:4789 +timberland_defence_beta1.map 0D0EF6D3 45927787 262144 2489762e30119ea0aaaef892539ee60e6b8ec5d7 halomaps:3503 +timberland_ME.map F873E086 51388294 262144 3eecab92395b9efd8eb65aec7784efb38ad95d30 halomaps:1883 +timberland_rm.map 54446470 305828116 262144 4faa7903746eb8b38612dd4407fb5308eed10ec8 halonet:timberland_rm.zip +timberland_snow,v2.map 28D5BD1A 138429001 262144 7561f8f716bfe9f42991f0cc61125a14af74c414 halonet:timberland_snow,v2.zip +timberland_snow.map 28D5BD1A 138429001 262144 6d4c700a26e88ad2ea41ebddd3a72b4263ee1a81 halonet:timberland_snow.zip +timberland_tmcc.map 51873846 38883872 262144 2e74f87372ec4460199e5eaa10ce3150f5005c7b halonet:timberland_tmcc.zip +timberlandCTFvehiclesmartai.map 890BD7C4 14789204 262144 f229780c3aaad8794eb60b4a3490cb63b5105516 halomaps:4879 +TimberlandFirefight.map 556BEF98 75280184 262144 d4e8b7daf91d69e24226a70f7c637418f92035bc halomaps:5107 +timberlandmod.map 28D5BD1A 73841676 262144 8744b921df221fb3a9d55e473f7de0154a9b237f halonet:timberlandmod.zip +timberlord.map C611566A 64739882 262144 c55ce5e5342e0c2cf411e509391609998ed819b2 halomaps:6115 +timbermod.map 8E7B2813 45301161 262144 727a932bad8eb224a4880a482a502b8585b02daa halomaps:2596 +Timbernight.map 513522D9 46179334 262144 783735146fa0fb5b0c863aca6f62f6fe4e5dca59 halomaps:6358 +timdareffik.map 96861476 101451175 262144 6a6b93935e606f898039055efae6b2edc8383c6e halomaps:6711 +Time Shift.map B3CACB3E 331021321 262144 a58621720762d453db6e434aed6103d673646cae halonet:Time Shift.zip +time-out.map 3089A7C0 97056325 262144 adbef0323ac89045f867da764c68ddafcd045437 halomaps:5192 +Tiny-ass.map 1DA82C16 15384172 262144 553dcf84ee38711d96dc6ea5cc1ce47121ffb1fb halomaps:2046 +tiroteo-island.map 58A80205 379571605 262144 36a00ee6a226f442406ce12c43f064e41b67e1d7 halomaps:6785 +tj.map DED165E3 13870752 262144 9a011435e552b60a1dfcf030bbd90c11bae18ce8 halomaps:2929 +tks_crazycanyon.map 17C35906 33147793 262144 535d8ecda4ef5dabf98b25bb4f11f00d66fc80c7 halomaps:4952 +tl_test.map EBDA3DB3 24250749 262144 0cc052830dd5ad6ace8e4d9efc12ada2e1846e5d halomaps:5856 +TLMP-Amplitude.map 5D56BB15 55639043 262144 021e99fff96b68782380444f8ac637de599ddb33 halomaps:5251 +TLMP-Circle Pit.map 56363A0D 51522402 262144 0d24c060e49fef4161eb94a4ec125f0a49d25a18 halomaps:5252 +TLMP-Dismal.map 0D8AE14D 67409396 262144 38f694c01a0b59e90225f282acb18c0d3460445e halonet:TLMP-Dismal.zip +TLMP-Harbinger.map ED6A71E8 76747288 262144 13e2bb9249a9f6aa091b4761c4b9f4dfe60c4a8e halomaps:5253 +TLMP-Highground.map CC8597C4 61754060 262144 75b3ecf884863c44fd266f9417d0af36914d9b28 halomaps:5254 +TLMP-Lefty.map D9299CC6 47842828 262144 e1dd13c187ebd0be9de773e88fc75f024c916ad4 halomaps:5255 +TLMP-Mindfuck.map 6C5152CF 15642576 262144 32c80cbe35e80fa691682db0d3b7c85fc3bd85ae halonet:TLMP-Mindfuck.zip +TLMP-Pipeline.map EE07AB63 51057032 262144 c06ee51835a30118760db93a78dcd75c2ae63f7b halomaps:5256 +TLMP-Snowtrap.map AE258C8B 101558802 262144 d9e78e0a43c0c370127bc461fa82c5c87141a38e halomaps:5257 +TLMP-Station Omega.map F1F39F95 63082378 262144 4dc564d236d062914ebd7f8c4d95ced25a429fc2 halomaps:5258 +TLMP-Substation.map 8B2D6B68 55032856 262144 fa81897f4c92345e79ee6895562667c76bf2182c halomaps:5259 +TLMP-Vertigo.map DEF6CFFF 51358492 262144 6baff0b1e04e74a8cb0da17b205de4b737cf3fc0 halomaps:5260 +TLS_Devils_Drop.map 52B6341A 19659644 262144 f867eb90996add613a6033182e0c1f6a8efc761f halomaps:2245 +TLSstronghold.map 256D4D47 17009128 262144 c0ac386f809a81de99b7b056bc109148774eeb67 halomaps:3201 +tlv2_test.map 31BD42B5 24250417 262144 379b76861f5a0bd524fa1041af3b5b846bffb050 halomaps:5980 +TM_Fracture.map 9DD528E9 128967003 262144 56a42e7b6db215b3be1c74e3e6bb4c24a2ed69d2 halomaps:4629 +TM_Immolate.map 2D306851 79688202 262144 9543ea010d8b4190f4bdb0453f3aa765f358d5ba halomaps:4880 +tmc_a.map 6D1948E7 276449025 262144 278e0417c584b6ce8c38061f5fefd06f72f7bac0 halomaps:5631 +tmc_A_fixed.map 92177F7B 279199529 262144 63bf3970135f1cb7872d50e7621271f3bb5ed2e7 halomaps:5909 +tml_hr_cla_ink_fissurefall.map DE8DBDCB 230861865 262144 fe73678b87278bf0439e65fb7d39cebd052940fd halomaps:6786 +togentiana.map D9745E80 15813156 262144 c5a0ebd44d12b1ed47e06c2cfeea42c4b19eba43 halomaps:3300 +tomorrowland.map 8E3BD8CB 225551391 262144 7947b21cad4f5279f971304f9efa6b5b10c36c1b halonet:tomorrowland.zip +Tomorrowland_v3.map 00000000 277243677 262144 decb2445913cce7388951fa276f78e858cb483b7 halonet:Tomorrowland_v3.zip +toolbeta.map BE43AE61 41988810 262144 2555d0ac564a0eba121307ebee0091dd82bf1b61 halomaps:2512 +top.map EE43A9EA 12632648 262144 a088f3901c956c32dc3df018686b489b08f72b2d halomaps:5380 +topv2.map D8B57DD1 13751912 262144 e2725a47f15ce26b6e043012b5f560db117f0317 halomaps:5433 +TormentX.map FA08CD31 24558592 262144 55fb99ff17f17dc2f8c347c596f8eec1715cf927 halomaps:2004 +torn2x.map ACA62A97 14373916 262144 acc6763de989a81b62743716700f72230e6dc0d1 halomaps:3180 +tornadogulch.map 82C202B7 67031333 262144 bc4875658d207abc0e2439ee2fffd549b64a8614 halomaps:3182 +torus.map E59FA823 13542604 262144 37b86a794d9ddcad0900d87953f2627c96724601 halomaps:281 +totalchaosAI.map 31B67EF1 13970588 262144 ef6b95e7f72b33330418a4ea59e1a036b7cf51ee halomaps:4165 +totalwar.map 290D3AF1 16645750 262144 fe2f30daa6ab76b055dfb0693c09933e51b237b5 halomaps:1686 +tower.map 2DDB8CDF 50792411 262144 2b43894798d19c946b5ecfd7c89bf8c792400964 halomaps:5430 +towergulchxl.map D401C593 19516424 262144 fc521866e542f8d30173c02eb316ebe46d77cc5b halomaps:484 +towers.map 40B3761C 13412752 262144 8ee8ce8b89653ea85fc95c5886202b88242302f6 halomaps:282 +toxicwasteland.map 1DF8C97F 18153284 262144 edefb8b29a2501afbe2f55b63a0df6e71d2fdcdb halomaps:2616 +Toys_In_The_Warehouse.map 225904F7 17141721 262144 2f6fa4ed18b3418a64a65cc13bc05bdd82803b94 halomaps:1226 +tp_kakariko_alpha.map F6CD1765 39149478 262144 66f814c55cc1a80734d2c415a80ab840cf51aa21 halomaps:6271 +tp}dangercanyon.map 0BBA0EC8 64097205 262144 978e2824e944c4cc60bb8aacd735232f837cc1dc halomaps:5630 +tracer.map DFE846AE 13677148 262144 eca3693f07323e9e11e1244c36fcce40bc6d1aca halomaps:2701 +Train.Station.map A7A8FD64 30099808 262144 38921393f5dab9c95dd303fcfc850c043600041b halomaps:2702 +Training_Compound.map E3F73850 176240760 262144 747411d13bcbc15b0e5bd33460c3f11db567f38e halonet:Training_Compound.zip +training_ground_zero.map 4C663108 36876896 262144 325aba910f8ad93efc97cb07857939f3f533b88c halomaps:5164 +training_grounds.map ADF51885 39540823 262144 07b347ced2817b1bb3c76ea84e55826fdff0746f halomaps:2861 +training_jump.map C9212097 12529480 262144 ca9129d6b56afeb3b337d9af6bee97f3e45378c6 halomaps:2005 +TrainingDay.map C8350C15 13944608 262144 36e4eee3520f3bf2f95c128cc77e0a007c7b8475 halomaps:1217 +TrainStation.map A7A8FD64 30099808 262144 09ec910bdf20a4aca94dfc4aefebe55eae9cfa1d halonet:TrainStation.zip +trainz.map E8E44FDA 20893671 262144 8110a64c8d25f0f894d0a7e7546f3696c1712a60 halomaps:6843 +Tranquility.map F95D7BC9 12898112 262144 2264e513621c8025e616db1ae69b86179b38d839 halomaps:2161 +Tranquility_V2.map 5F65320C 14951648 262144 77e494ffbfdf4b26e3ce52e71f1759ff94456e9b halomaps:4993 +Transfer.map F454B92C 17948263 262144 09c20a640ddb619b1bd8acaf412f7584dc854b6d halomaps:283 +Trapped.map 3F148989 15067548 262144 b4f301c48ea072fdf928f653a0f720ab0e505153 halomaps:2144 +trapsion.map 18EB4F61 29004718 262144 931af7de3c20bd0676dae8898098bce2b43cdad5 halomaps:2174 +treacherous_ground.map 627CB83C 37663376 262144 60aee06370f0736cb90696911063b521e9c43064 halomaps:5642 +tree_base.map C8BEF660 24109597 262144 23f03785ae821ac621b7cff13985c90705970240 halomaps:3539 +tree_of_life.map BEAF809A 14713596 262144 4c29afe7b6c75ae46dc3b89a9bd0292e7e401ec7 halomaps:2369 +treehouse.map 4E3BEA93 50922058 262144 961449ac4c2024a6094d17e4b3869722c716fc9a halomaps:6025 +Trek.map 219906EC 14276528 262144 0b067a635a9b294caf720ee4861c2c2dce879835 halomaps:7065 +trench.map 78189FAF 64244092 262144 98e6650ccd403f0f8059d6a9a515deb1b0753a87 halomaps:7013 +trench_wars_by_colin-blood.map 3BF7EE48 81382329 262144 9ed38a936e326ff779353f1ceda93cce2728519b halomaps:4770 +trench_wars_maxed-colin_m_blood.map 3BDC3B0F 131614911 262144 d07ff82298476f00097d070860a3703450b3c09f halomaps:4818 +trenches.map E0FF495F 14317618 262144 e5fe5a7272da7438c22e96ebdd16c126304f8a0d halonet:trenches.zip +trenchpart2.map 269F510E 82064903 262144 bebae911546b4f86d40a4efd6f481df5fc0abf9b halomaps:7013 +trenchwarfare.map E289C231 31478231 262144 56791b3f56ccf93a48425299f558b108a52f86e0 halomaps:4558 +trepfull.map 47A6A6B9 47851598 262144 3f09d442555d3fe3bc1ad8b99fc167c7d2f61a78 halomaps:1494 +Trepidation.map 161F3929 25993872 262144 21e9c119d4a0fa9cbc081db59c36ab6b93f09c8c halomaps:3273 +trestle.map D44098A2 42693971 262144 d13d60712ddeaeef525c3231f67dcda616cdad8a halomaps:2767 +trialgulch.map 00000000 35600048 262144 54c49b8460ad2418c5d87c2fc8fbc2d2bf96d671 halonet:trialgulch.zip +Triangular_Conflict.map E173061C 80202317 262144 e911e871807225abcef19dded014c5ed4f15fa29 halomaps:4534 +triangulated_eight.map 61308CD5 14029908 262144 1d7f53d5cbdac8d502ff2ef982f7dfb524363347 halomaps:4849 +tribulation.map AC551493 56463500 262144 a10c7e12ae674dd2494c98d7c96a93f80ceea341 halomaps:4347 +Tributary_of_Lost_Souls.map 228438E8 22036655 262144 d8a74662fcb017351151d354bc5c376a6510f100 halomaps:1043 +tributary_of_lost_souls_tourney.map 9AAC8A85 30144446 262144 4b22804c27052d0f2ffa65d283b81eb9648be0d5 halomaps:2513 +triduct.map DC8244DD 28474404 262144 45eb588af954ca3f333dfa01b3ec43afbbbd4a7a halomaps:2998 +triggerhappy.map 213E7885 22359941 262144 a1ad067a06010ad7348ee69142731f2bd8afa9f8 halomaps:757 +Triskelion.map 8135E1E7 176222488 262144 ee8afda087ae7ecf905dbc1fe814016c461fcbd1 halonet:Triskelion.zip +tritower.map FAEA421D 25433068 262144 94589b7ba7b6c89bb0101a2bd104e2155a21c958 halomaps:3604 +tron.map 869EA31B 12409400 262144 042af6eb8d71abd5af8825c119587ee080ee8540 halomaps:2730 +Tropical__Forest+.map D135F4CB 15134172 262144 cd222d5b0deb636147b5cea3298042ce03135863 halomaps:5381 +tropical_grave.map 9C05CC36 19950672 262144 4d766f41909b2f82dbfb0594edca3218ca523d9c halomaps:3828 +troski.map 073B71B9 14194948 262144 12584d4438a33b91d07b153ee242b0e925dc59b8 halomaps:6459 +truth_island1.1.map 21637629 28149643 262144 a1cae516f453e10fabeac19784448499b6ab9516 halomaps:2388 +truthandrecon.map 61DCC0D0 51101366 262144 00c56b2590369a71f2fdf1ec107fa4cc659f5eb6 halomaps:2961 +truthandreconciliation.map CF89E80E 40702175 262144 2c4004210e24c2f2b87e630d982c270b799d6777 halomaps:858 +truthislandsp_partone.map 468362B4 83984951 262144 aca12eaa849eedc260bac3e9707f59f12d0921d0 halomaps:2452 +truthislandsp_parttwo.map FE8A6870 85062463 262144 17305338f7f07fab6a6e7a3e10c48e840401bd1f halomaps:2453 +tsc.map A576CE45 42065519 262144 394a28a1c4e85c61d8746c7e669efa7ded1ad84e halomaps:871 +TSCE-BK-Multiplayer.map 00000000 334386166 262144 6d9bc99ed80320b7776dcccb66db2b685d2ea432 halonet:TSCE-BK-Multiplayer.zip +tsce_mp_v1.map 21589081 257968828 262144 0886b98c223758dd21c577b9e25d6ef403ddb0ee halonet:tsce_mp_v1.zip +tsce_multiplayerv1.map 2FDF02B8 304954960 262144 e9e880b5a19b3cbb39275bcdea001df3eb996142 halonet:tsce_multiplayerv1.zip +tube.map 6F96071E 11984676 262144 be59da7a13216efb21ae38724a5544ed810a0516 halomaps:284 +Tum[H3].map A191D4E0 102363862 262144 506e7446608122aebf098ebeff684f5af87691b9 halomaps:6624 +tumulus.map FBA02D76 130524124 262144 497f546f84fffc2cf607fcddbe41e08a8614cc99 halonet:tumulus.zip +tunnel.map C5992A12 23796689 262144 1e313abbfc5cd1d186bc7f139b0b67d17c0f85b8 halomaps:6787 +turbotin.map DB4424F1 16123620 262144 27b1ae3cb8a94a806881cd55c36f7e3f4f5d1554 halomaps:2703 +Turf.map E82F9D3B 29568708 262144 b0b59eb29056a9e57cec1061ed65c182c3f63fff halomaps:5270 +turf_zambies0,3.map 0904264A 69813944 262144 524464088a202de26d9cc1d0eecd9d0bae89f793 halonet:turf_zambies0,3.zip +turf_zambies0,4.map 912CEA52 36619109 262144 a877c671a700d6aae866dbf19f4472ed0dad97df halonet:turf_zambies0,4.zip +turfrevampedCMT.map 43728A16 51028184 262144 6e27ece75fb280c15d92b7c9f0347cb9e70e4f59 halomaps:2597 +turretfight.map B29A0124 45680672 262144 1041bf72f9eeb44e103f1ca2e472abb6db89981f halomaps:6596 +turretmap_beta0.6.map 12B4EC08 71942930 262144 b7a4d720833d682d992dd8943234a32bf7e79bf2 halomaps:2506 +Tusken_Raid.map 905D7E6F 42499004 262144 b3d57d2cb90c0254e116b39e9ec103ac0d33f094 halomaps:4435 +tut2.map 17577A9C 50436407 262144 a09fb8b32cef38042c459b3a867005c844774162 halomaps:5382 +Tuto.map E399814B 14037080 262144 1b921c29ae7322c88a0df77618e69e10c7c6b8dd halomaps:5937 +tutorial.map EBEF3E0B 13947716 262144 c6a3934b9045908846f487d2861900731152c4c1 halonet:tutorial.zip +tutorial2floodb2.map B0082137 55882632 262144 a961489071675b805c33a6860ddcdd7361afbb0c halomaps:4559 +tutorial_ancientcombat.map 20F43801 16963324 262144 e5631af6307ff63090cc90ac66f4b5502481132e halonet:tutorial_ancientcombat.zip +tutorial_map.map 037A7132 22100416 262144 15845f9f9033c15caadd4f8cc99ccc954aa9f313 halomaps:2096 +Tutorial_Mod_Alpha.map E114E411 32979705 262144 47ad1c6c7f352b18782b54b3138b7ebe0f3c0589 halomaps:3555 +tutorial_mod_beta1.map B6F86612 97399240 262144 f351072ae19495b6035fd079125a01c580e43541 halomaps:2974 +tutorialai.map 4E1DDE0D 15123468 262144 f3c47869a7909a5d451e9fb4c82d4c773ffb6031 halomaps:932 +tutorialcvm.map 21AA10CA 67600357 262144 4a2d35eb4c88cf54c98ae6520fe8c3c98fffcb7f halomaps:3813 +tutwithfighting.map 4E7E6316 55623075 262144 650c95bbb905a5ea0d562474a845b1408dafddc0 halomaps:3540 +twingroves.map F5D5B351 25807016 262144 0ea5ca98fb79a79673708912ccb9fbc2c89aa692 halomaps:401 +twist_beta.map BFDA91DF 27341928 262144 7c365bdbad19f854832eee4a489db00c4ebd0457 halomaps:2987 +twisted_canyon.map 00000000 89068708 262144 5c9cf927a165bc98db0d7efdfbeb23f41fae6c6f halonet:twisted_canyon.zip +twisted_metal.map 7BEF9F43 81790718 262144 733b78f261213b2ad7ac655c219cbb9ee835db19 halomaps:5713 +twister_canyon.map 2B0128DC 14839992 262144 cd8a4b1ea2155538e51beb4d85f12fdc95ff8dbb halomaps:286 +tybo.map 98CA3896 14358324 262144 8b2d5b10d5dc59653b0947e6c4b43df566c80b08 halomaps:4445 +u_turn.map 910C6480 13796060 262144 329af724c371646a6ece1d1660c932a87b867dec halomaps:2356 +uber_red_verse_blue.map CB7AD547 20092188 262144 4fb9bd864676ec6cd4598475975c8d25f7d6c6fe halomaps:5035 +uc_hq.map 7285A0F7 19675436 262144 f96e765c40881ff7408cc08fe3085765df562124 halomaps:1164 +ui.map 73EE7229 2561000 262144 d03d3e2caaafe2c32be3ebb74279b590c4359550 +UI.map 8F73041F 65792570 262144 e750091bcc572be37db0edb91707b349a251eb64 halomaps:6952 +UltiGulch.map 852AF447 18396450 262144 981837617a870953d618f277cf4aa8a2f82a1bb6 halomaps:4207 +Ultimate.map 7DEC79F5 38506526 262144 8970d15d1a2ad2a6b7b825666120e59a410208bb halomaps:4953 +Ultimate_beta.map 7AACC2C4 177986637 262144 caf2f1ed624d59a1f83dd3adba5b7cbba8d91e80 halonet:Ultimate_beta.zip +ultimatefight.map 06B754D7 64419140 262144 4e9dc0f018b00230d196440a09c4b01c0f80e199 halomaps:2097 +ultrawar.map 696F936F 78739029 262144 0a6a5c054b574c69f6ee3d375a8e31cb7b80a133 halomaps:4371 +UMP-Advantage.map D1DFD285 76425647 262144 0c41cc1a60baffc54ceb3851d15ea85ce501bebc halonet:UMP-Advantage.zip +ump-assault.map E5DAF7B2 86403455 262144 ac70a44b678e325afb878e376d6fede847b25326 halonet:ump-assault.zip +ump-divide.map FE73D325 75289779 262144 a39d7a63c942a7475519f87bc1cb6f83c792b0a2 halonet:ump-divide.zip +ump-legend.map 0008C3F6 83878239 262144 40abc6dcae4b2bf20251c2ea47911ee19de6c885 halonet:ump-legend.zip +ump-mirror.map 3F9CC0EE 77500775 262144 8a39dc0c9fb5d0c004999ed98fc0f03ed017114c halonet:ump-mirror.zip +UMP-Purity.map 6B7D551B 80738631 262144 a3520d80c38c8dfe06dd488319206c4a16a45416 halonet:UMP-Purity.zip +ump-sanctity.map 33D593B8 81129991 262144 5820d70ecf7af4d51180b548534c3e4b3b3059b3 halonet:ump-sanctity.zip +umt2_metal.map A787087E 55225965 262144 b889c530354589f879fc54c88d78c38b18eb8925 halomaps:4270 +umt2_skydive_heaven.map 2675062F 64404881 262144 895840ca4aa34b0c53a9d2ab28ebcbc7840bba85 halomaps:4498 +UMT_Archive.map 8B7D4CB8 23360510 262144 6b407986908f4f445d970587a27dfee9b3ffd32a halomaps:3119 +umt_pwnage.map 30DBBC5C 39059540 262144 699073ead246afdc6a75908eca895e67da5cd19a halomaps:3172 +UMT_Snow_Grove.map 2A577820 52383010 262144 9684fee5bb1712cdd2b29e96c5829995d34d90c5 halomaps:3118 +UMT_Swamp_grove.map 1158B3AD 51324770 262144 2817d0fba1be11f81c79ba301360d43996faeb34 halomaps:3117 +Undead_bloodgulch_x3.map 25935E3D 277563111 262144 4b22c76fff30254b08f4841e18564b70fac23135 halonet:Undead_bloodgulch_x3.zip +under-new-management.map 1F7B2AA8 92806417 262144 ff9a0db3f58c953b8d661bf893b6bf9e33bd52bf halomaps:5515 +underground.map 20DA71E4 16124288 262144 0d0dcbf8988505af7b6fc625e1e536a805753853 halomaps:3388 +underoad.map 926B1DE6 31079500 262144 467253115277057f2345135fc7165440b3468687 halomaps:3033 +underpass.map A0EC1EBE 16722388 262144 a2498e84a9294d8ba1d76a753ad04508ba1a9ef9 halomaps:3421 +underpass_npb1.map 07A2D1F8 15762816 262144 9493b02df007fa6805a7ff8adc472b6233e999a5 halomaps:2975 +Undersiege.map D1A00E03 14209216 262144 ef87c7e3752a7f9d2a1ac280d672f3ef4f1aa40f halomaps:1142 +Underworld.map 1049EC89 284679781 262144 9c10f668102351c03aa5985703478821760b86bd halonet:Underworld.zip +Underworld_2.map CC58ADCB 284680245 262144 9a7f4d1782dae84fa49bdd1305544941ec405cb0 halonet:Underworld_2.zip +Undisclosed.map 246DE182 31679721 262144 3f4e299436df2f9a5524b439ae6eff55b6124ad5 halonet:Undisclosed.zip +Undisclosed_v2,0.map 1D88A297 63262124 262144 01bea147b471acc6b135b60f26701bf6c958961d halonet:Undisclosed_v2,0.zip +unfaithful.map 95FF41E1 19530345 262144 8d31316062ab937af8346bfcdebe17bb5cb1cccb halonet:unfaithful.zip +Unimatrix_1.map ED321BB6 266257889 262144 09eec61ce35eccb01208d46bd4747c7fb59ce993 halonet:Unimatrix_1.zip +Union_For_World.map 4E629F8D 87736165 262144 c784c1d0b035ec4d11bccd14540e30ee114ea308 halomaps:6907 +unreal.map 14331888 44103356 262144 06102529abd1be63e93cc141951cc4a14370ed42 halomaps:2891 +unsc.map DC14D69B 13390472 262144 d2f09d4e28049cd73c4d52c538172b7bae4fbf56 halomaps:7066 +UNSCfort.map 6D1562D3 14143650 262144 afc5109a837879dc9243384de2740fad339c1807 halomaps:1092 +up_dustyle.map BB4E6990 26427172 262144 352aaf902a001a77e611b703ed6a3c80863d2d60 halomaps:4107 +uplift_071817.map AE237DC4 12604580 262144 126dc8bd5832863b4fbd60929e07ba0873fb089f halonet:uplift_071817.zip +uppercut.map C2F3F8C5 114362889 262144 e6389ad71bbd872505ba4998a3ae441bc0aa0843 halomaps:2211 +uppon-a-slinky.map 6113585F 15854208 262144 3d000e6ac03e40d9dc7ad684f13f70d063557f57 halomaps:3075 +uprising.map 9D5557C9 247271555 262144 9ccf80805fb449ddfa4650234d364e8c6c3e4029 halomaps:5857 +urban-beta-v3.map CC395BF6 75979625 262144 40dcb45e6609ff301f553855520433480e49bb2f halomaps:3202 +urban_1.1.map 3DBAD5A8 178106129 262144 dc938dd76bd6ffed97ec9b0ba02d94d543787dad halonet:urban_1.1.zip +urban_warfare_beta.map 923A82D7 20142924 262144 47c1aca4e8e788de93af039d3bbe4b37ba380739 halomaps:974 +urbanchaos.map 2D09756B 23568614 262144 fae3d5c34bf0233139e8df5c8a3ff7422462d650 halomaps:1200 +us_vs_mx_snow_gulch.map 00000000 101886598 262144 010223e1ace0e8aee50ebb6473ea43a192044f07 halonet:us_vs_mx_snow_gulch.zip +ut2k4_beavercreek.map 5B89880D 20370844 262144 60bf23f34f585d08bafa19be42d75aea3a68f54d halomaps:4372 +ut2k4_bloodgulch.map 65F3D690 21966748 262144 61c4c5056c662f2a7f67e58abc3af0a54fe6f2f8 halomaps:4373 +ut2k4_boardingaction.map A8229DD6 21233736 262144 0fe425016e0ff0a0cabf01290fe8d4b646cee630 halomaps:4374 +ut2k4_chillout.map 275C7253 19482968 262144 72a1663a02d9c3570295063586187289c5d56a31 halomaps:4375 +ut2k4_chiron_tl-34.map 7279ABE3 21446796 262144 b0381e619063cea486a132d4f3e896ac94a29207 halomaps:4376 +ut2k4_damnation.map 5D6292B8 21926608 262144 a971e385c513a089b25c6aa5f884fa56db6015d2 halomaps:4377 +ut2k4_dangercanyon.map 57DEBE3B 22831728 262144 1b723b90cb145cc2c81cc20dd710575f0a659548 halomaps:4378 +ut2k4_deathisland.map F200FBA6 25427464 262144 c6c0888a58c3252d39ffb32f013e9e2f63155815 halomaps:4379 +ut2k4_deck.map ECA77362 23161837 262144 e7e0853fd59825063a55c33a1a296f88cf22236a halomaps:4391 +ut2k4_derelict.map 415F2ECE 19917960 262144 cffbd9c4a379f0fae36e9afbd2aa8dff71a533ec halomaps:4380 +ut2k4_gephyrophobia.map 9DE3A791 25238844 262144 b1eb1b9c50a05612e9aab4fced4b6e230b08ad24 halomaps:4381 +ut2k4_hangemhigh.map 26F93FED 20001012 262144 09365c9457d75bc43d4e3417a73a6444f141e7f8 halomaps:4382 +ut2k4_icefields.map 3D096092 24484560 262144 7c7068fdfb3b743ff919e0772e09a67689f37590 halomaps:4383 +ut2k4_infinity.map 8DEF48C8 25606912 262144 5c25be97941ec44be1810bd2d7716bb26354cf05 halomaps:4384 +ut2k4_longest.map 7CA58E6F 19807680 262144 0ab153f678911865e4487eb4e1e0ae5745af39e8 halomaps:4385 +ut2k4_prisoner.map 3A552B16 21199360 262144 41ac8ad1c5ebbdfb841980c5409779162a6bb17e halomaps:4386 +ut2k4_ratrace.map 49CFF829 20794244 262144 fd5884736f2dfe2cc6c2d79f6bdafdd5feabd5ee halomaps:4387 +ut2k4_sidewinder.map 082A4DF3 22870624 262144 0c0751982dc160286ac8d6d8b2363e05c7043da3 halomaps:4388 +ut2k4_timberland.map 682154C9 21964192 262144 7ae75a93f4a701d8492e08320eb2a9041c6fa1cc halomaps:4389 +ut2k4_wizard.map A42ED205 20760840 262144 c1f011dfc2f017fe11ad4a49f922a78dbb7c010c halomaps:4390 +UXSTrapped.map 8D0C995C 80727245 262144 c82de2e411ebd93c73ed777ca95e580a99b5c837 halomaps:4994 +v3.map 7ED55171 324610649 262144 585b4fde48d3ae0aba6e01a07e2bd359a9c7b821 halomaps:6369 +V993_Down.map 2BAFED66 67821372 262144 ffbd7c4c55bff2bbb49d398863c0e3ec5839d61a halomaps:1979 +Valhalla.map 2A8E153C 96410353 262144 54f99dd053dd70653dca1e1a798eccc09c64dfc3 halomaps:4954 +valhalla_remake_v1.map 9364A6E1 65569633 262144 32183345c5f09ee7c4c62e8e03bf649b99b806ea halomaps:6072 +valhalla_varient.map 0BAD8AAB 106062828 262144 9045bf7ffce1a25e0329d71a9daa1100110e40fd halomaps:3448 +VALIS.map BE1873CD 42118467 262144 a7c98876e477a49cbabc15a58c6269e184dc9933 halomaps:1476 +VALIS_swords.map 577790C9 37587606 262144 00f373af379d9cc090470e03e348257ba86ecdae halomaps:2354 +valis_tourney.map 046AAE8D 51716718 262144 d804d2229dfba2294b26f0c9134ba7ee4ac47a07 halomaps:2514 +Valkryie_Beta.map CEDCF292 34072804 262144 6bfce9ce59daac52e4cb776f753878a22ac94ddf halomaps:2784 +Valkryie_Beta2.map 8270EE9B 67183142 262144 b5a0fe152ec23ba3db9dd3cf49db43afb5434309 halomaps:3429 +Valkryie_RC2.map 4C66BCCB 50311836 262144 bcd7f8f4094045066a0348c625421422ca4df733 halomaps:3650 +vall.map 420B305A 357272095 262144 a47c2c9afa0db264e1dabcd301b7bc4ec4caab22 halonet:vall.zip +valle_invasión.map B2D20C11 122493803 262144 aaaa7d27291e41ffed86f97d14689c8eed9e349a halomaps:6746 +Valley Lake.map 3097909F 52629279 262144 e22d9a27052dc71c618b60faaa6ac109a47a459a halomaps:3995 +Valley_alpha.map 24FD6818 19771960 262144 9c7b95f14604f0cadc58300536e37b2301c3416d halomaps:1741 +valley_alpha_race.map D0215D30 37038834 262144 fe5db3c28028f132ce1be0edce5b5814511a85d5 halonet:valley_alpha_race.zip +valleyofdeath.map 3BDE8106 25021700 262144 2e09aeb5819ddcfda3457c707deb3af1430822f5 halomaps:2185 +valleyofruin.map 9EB6FF00 13534692 262144 0651b2fa5fc44bed28f6ecb50e85949987283180 halomaps:4064 +valleyofwar.map B3FA058B 32360690 262144 6e5fb9b1e54eb481283812f734aec37c508a872f halomaps:4079 +varjatopetlart.map FCD28D8B 15093772 262144 e9a98cb4bed00aa59a10756829248fc42f852e33 halomaps:3326 +vastland.map BC073179 17160440 262144 ba492cc6f8e3215accd1085b87b8f8d6927c0da9 halomaps:5383 +vector.map A891DC64 14743900 262144 d00c26c683092bc59b04c8aca432557dce914f18 halomaps:2617 +vehemoth_valley_beta.map E654B357 36656068 262144 ee7858aee00ecf3b3c403eb566f9cad6236cbee0 halomaps:5339 +vendetta.map 3243328A 15809468 262144 6e8f80e753515178d708da1476b36bc9a665d65a halomaps:596 +vengeance_test.map 9C4D24B7 14418800 262144 fffdbf897a762cf1ac6aecdfe2d5995a6c02ce9c halomaps:1027 +verdant.map 62FBA743 17898784 262144 6d3e1bcf9fd0f1ec6ff5f646505aef3ca7a575cc halomaps:3721 +verlassen_final.map D211A757 27254502 262144 5d7e03fd58cb2a45e11f2262a351e7231e0464c2 halomaps:2999 +vertigo.map A95BB2FC 16664212 262144 730884eb6a2e1dccc034bca46160a1eb165c4ddc halomaps:386 +vertigo_city_original-beta2.map A9650A08 38969732 262144 b9dc0bf3370b03dd05298ad079bb7c15c71d9979 halomaps:1859 +vertigo_city_original-bv4p5.map 5FB50064 58020106 262144 25fd1de6df2cb268fb3c59f4cbfd53a744a20760 halomaps:2054 +vertigo_city_race.map 6973783E 44429362 262144 c2c85d45d784496015edb0a55d4978aec381ab5b halonet:vertigo_city_race.zip +vertimad.map 589D5FAF 80400014 262144 8eb8dd8eae5bc63a80aa6ce8bcc83a52bc9e205a halomaps:2451 +vestige.map 3245A4A1 40185568 262144 767fa36b38ce24b3d65092231fc84981e3940e59 halomaps:3590 +VHMT_a50.map C25D04C2 28741678 262144 775047b2befa0816bfbb2bfa1895b4cf084f30cc halomaps:4591 +vhmt_invasion_h3.map 8E7A6245 113797369 262144 a53d1193b77a12f223c2d7f31a555508b863618e halomaps:4674 +victima_x.map 980E0218 39822435 262144 666646207dcfc813383bf34091052624a50959ee halomaps:6293 +victory_island.map F8D8EF2F 15194044 262144 ed19616d76035bd9b64e9373a875ca00e4ba2aba halomaps:297 +vietnam.map EEDD95D6 20458588 262144 dfb210f4b92fad35c37a151b571b88c6c4da5239 halomaps:854 +virus_island.map CAC0AE1E 36973118 262144 b33f0b09a37720107b5c33be2aedb4743e651365 halomaps:2668 +vista.map 05742A07 18646844 262144 0fc75fa45cd1179aae20b2583aefff24f49b8f4d halomaps:2553 +Viva_Mexico.map 5B2F2416 263002083 262144 3e29d4659783e6ad56a32db2910ff7b8d7dcff1a halonet:Viva_Mexico.zip +vizio.map 316D2EB3 37310192 262144 187f151105f637f70f4a4b5bcab94f27eb8d8bb9 halomaps:4630 +volcan.map C1091529 18448792 262144 11cb7693ff50e6f3e6396db88c9f4a2cd2263052 halomaps:2930 +volcano.map 1739B205 18638716 262144 77e969cb85b097984e492bba82c12c5ef56dc597 halomaps:336 +volcano_enhanced.map FA6E9ED3 23251848 262144 d4bbcb2e3037f77288881c50794c02948d226d00 halomaps:2643 +Volcanus.map B15752D4 377361434 262144 a93114bdf731551d4b38dc38e9b0c021f4375f50 halonet:Volcanus.zip +volcanus_beta.map D02855ED 18973693 262144 469be54f9ba1e391deb8b87fd24a29c47572f5b4 halomaps:3622 +VON_STEGEN.map B808F0E7 389986881 262144 eced26e349c5f0bc0ff389ed04bd9f4e86859f3c halonet:VON_STEGEN.zip +vxa30_mp.map AB88D533 30445508 262144 92c4a204088ed71bc3b8bc3e350343bcfedc9bdf halomaps:5903 +w40k_sidewinder.map A5FF1D62 25992534 262144 fdbb6ee91fd97799a3ea09d09cffa4f705a62da5 halomaps:2539 +w40k_test.map 960FA448 23959249 262144 214b31f0c702f4e99e266f10bcb119e3f778bad2 halomaps:2540 +w40k_test_v2.map 9C492151 25490140 262144 2600574c5e5082e5d2f95779b48be06e09b233b6 halomaps:2541 +w4rtorn_cove.map CE4A952E 34447798 262144 54d8892b8b4a926a174298629c235bb6b723b0e3 halomaps:857 +w5.map C6ADCB9F 102820522 262144 8aa4b5f546cefde9feec853541303b21856ff961 halonet:w5.zip +w5rtorn_cove.map CE4A952E 34447798 262144 51b6f8dbed585bac0a6cbc492a4c2a112ebfacfc halomaps:946 +w@r.map 1087020B 20950233 262144 bb15c85c12d945f720c878ca8660d12973e94d30 halomaps:6404 +wacky-gulch.map BC485D35 26039414 262144 6851169bc3ebe16a8e7de92ab68c8d022005d50f halomaps:2869 +walls_beta.map 4E3442CF 17915372 262144 6a88e34ff081282367227f5c9ea2d61afd2d095d halomaps:2050 +war.map 3699E710 82165012 262144 6533d258c76c6bc5620c9068a63942f828d73a09 halomaps:3884 +war2.map ED3ED841 19550070 262144 803bb759124ea1a5afe70e28e92711da47502a3d halomaps:5797 +war_ahead.map 1073851E 47062719 262144 b80b35545aae76748e5d2da02a0b394e00325f77 halomaps:4238 +War_Canyon_v1.0.map FC1E0E7A 20647456 262144 f457f4a2fd34a1a94dfacd7fb22c592732e2cb53 halomaps:3801 +war_field.map 1BE45C54 37145858 262144 2b10d358bbc4548b8f3f3a31046f4ed07cacdb33 halomaps:5333 +war_of_ice.map 30978CFB 86828512 262144 7a423039dbcbd37b5be6edffee2f30b656e648b9 halomaps:2931 +war_of_sidewinder.map 017BB81D 28091695 262144 d2b43df1b68454b77d1a8eb8c92a15b995f8c814 halomaps:3266 +war_of_sidewinder_v2.map 47693743 30397984 262144 cf1d6d9b467f971ff38a2d1b472f56bc8d07f103 halomaps:3363 +war_of_sidewinder_v2_beta.map 11A909EE 31705252 262144 454b7f0c46bb14192180bfb2862149afb96c738f halomaps:3371 +war_of_variety.map EDA27F3F 31514012 262144 3a1d734318ab27fa0bc29b45bbcebfa20b8a4f5e halomaps:4447 +warbeta.map 42936D9C 27968722 262144 83083df7c43fc3c77047a1100c5935c79ebb1b28 halomaps:4237 +Warehouse_Toys.map 542B5595 16148257 262144 7c4cbf960628f0fbba5ffcbb3d1d01571b27f059 halonet:Warehouse_Toys.zip +warfield.map C090493D 56805612 262144 595b6180c6d27c51bdcaa9c728dce596d69fa853 halomaps:3541 +warfront_day.map 870FEDC9 73239883 262144 438ce8e04c00b4406832b17d6f16d38fe2abc2e7 halomaps:2976 +warfront_night.map B97E81EE 73065703 262144 cb67ddfb8ac400c97e0eed660b226ae9c36adcc4 halomaps:2977 +wargrounds_v4.map BB7A4E3B 98330213 262144 0d019e2989c92c983025d526ab662b5f60aafbbb halomaps:5759 +wargulch.map D5885D81 33051515 262144 4bdfc89cf87925340b45dacb8a0826a412ec5f2d halomaps:1498 +warisland.map 49E11CB1 36426595 262144 98ccc92365aa674a9ab44926fbe0bded64e7484a halomaps:7039 +warlocks.map 8587FBBF 15747615 262144 218c051c6cffb05d2c2534a6de271729f24ba9ad halomaps:3769 +warofbeavercreek.map 8EA5B1D6 125501604 262144 dc0814c27c234a37457289cfae842bb076b48bd6 halomaps:6585 +warofhog.map A917EFFE 23180585 262144 cb5dcd41a2294d4b899e799cddf49d755a0cbd2e halomaps:1245 +warofhog2.map 34A2BB82 26091539 262144 6f9c43089139ac32880a7a80adc340274cd49731 halomaps:1273 +warofthehelots.map 614F2BCD 27269092 262144 8c2b0646f3065edd2738f4e63e38d570a207fa0a halomaps:378 +warren.map 890A3B93 48896429 262144 cd179dd80c472d6826faff09c45ea1faae7d1229 halonet:warren.zip +warren_beta.map F8F7827A 25309372 262144 f209f51be81e5fc835e48dbb9bd606b60cd81acf halonet:warren_beta.zip +warriors-fight.map 06C34FDA 53444984 262144 275964ba40e8f434aeb60c9bcc886c4e1b08c94c halomaps:6939 +warstation.map E3B088E1 15153496 262144 332c8eda504c99d9377f4e109ae4c60cb8379ee5 halomaps:1911 +Warthog-Wars-final.map C23A9EFF 31377557 262144 7e9272d2840d82bab789a5ff5d4960a124bd93e3 halomaps:2669 +Warthog-Wars.map 6C99B963 23880052 262144 5261271265ce3538a6a7f5170f9d08642a57f828 halomaps:2662 +warthog_gulch.map B8CCB737 22173738 262144 4d8933671fa8d101e8ca07a9bc4c9ece7f164e03 halomaps:5384 +warthog_race.map 62C32132 27713848 262144 6e5508fa37a1d7101aab890ee30b246f6037a368 halomaps:4446 +Warthog_Run.map 008EE065 60573863 262144 ee0b6435f7ba8bfe72d9008938b96298e472a23a halomaps:1931 +Warthog_Run_final.map 5D0234C9 66255707 262144 e25078a1d2eb8f6c8113e192562977ebbd8da374 halomaps:2010 +warthog_wars.map BAF86491 39581428 262144 cc2246b8abaab22fa66c1462c54342d0f302ecd6 halomaps:5798 +warthog_wars_rpmt.map 1A82E776 39581432 262144 4ab74fb2d250c7e6e74881b22c217bf8798e419a halomaps:5799 +warthogexplore.map A2DBBE65 14130592 262144 21c758d6ada1a3373557ee617cef6329f8702de1 halomaps:287 +warthogrally_beta.map AF5B0E47 21189188 262144 e0c5c78d63a41c6b471ef7f84b2bcdbead8b278f halomaps:288 +warthogrumble.map A7B17FAA 13493396 262144 59e0ef16f0f13a3a772fb1afe47b8a5ab6833556 halomaps:4955 +Warthong-fantasy.map F920BBC6 173228438 262144 b0b4234f660f995f2c3ac6816c0508aa050db1a0 halonet:Warthong-fantasy.zip +WartornCov3.map 467A9761 19874000 262144 bcde05d8968e81de921e982350d884c1421cf632 halomaps:414 +WartornCove-SVC_Edition.map 5F1011CB 29272388 262144 32633567cb6d0d31c8888c38253eacd603ff3250 halomaps:1588 +WartornCove.map 467A9761 19874000 262144 db1536c56e449dc962a87360b9dfcdf426a4e3ff halomaps:289 +wartorncove2.map DE9266DA 19873640 262144 3f36bea53c97f354ec9c1df80f264bd40690438d halomaps:351 +warzone.map B4906C46 35207213 262144 4ee4b25940db5371407b34c1941354a2db3c4789 halomaps:5105 +warzone_v2.map C4C1E863 38207649 262144 5a7dc87720c9d0da5ec7a9ba9e3b6ab241c12324 halomaps:5106 +warzone_v3.map 4475A03D 44849073 262144 7560c0299ab6fa3d6905cd2e6439b0c205e42bb0 halomaps:5115 +warzone_v4.map FC95DE93 60601629 262144 9b095d22194451cd5c2aa2486ff15944f1e0c56b halomaps:5134 +warzone_v5_FINAL.map DCE3669A 59756709 262144 7032e3a1b206c83c7f8a1ee4a2c210c7bcc47549 halomaps:5136 +warzonegulch.map EC912F75 80795100 262144 5fe4339c3da5bb4511916619ec14e17bf9ac7de4 halomaps:5283 +waspmania.map E79767E0 16514996 262144 6512fc01e058d1fd7a0b697d880f94dbde8ed2dd halomaps:5193 +waste.map 3A8CC0FD 16132124 262144 85f183745c34b3577143cd778fbbc8eefaf36c44 halomaps:400 +wastegulch.map 4A8C6EDD 15035692 262144 b460eb19a41d616549c22e97c95880437cf5f25f halomaps:3651 +Wasteland.map 16E9C794 34819388 262144 14398630be64920835c619d6ec7c728058ee5d11 halonet:Wasteland.zip +wastelands.map AEFF784B 32937516 262144 53b62dc21595999e95e63af1c9ed0ebf68ca09bb halomaps:1143 +watch.map A7957531 16277096 262144 dac4a87d3e5fb39edc0ccb94c07af3b698aad5fa halomaps:428 +water way.map BED58F3C 130714612 262144 4c7bcf97eeedace8d547d23cd1884eda326b3de7 halomaps:6544 +water_gulch.map 04997F7E 20382413 262144 fa9dc3465662c7cb541586426bef27b936456344 halomaps:2246 +water_in-a_well.map B28D7B46 32715786 262144 d1d60fd8c00183057d1af6cf34c3b258ee6612e0 halomaps:4480 +waterfall.map 5174A628 18584488 262144 1119569cae2b4c5b0b5562d01debc6c6ad5e6aab halomaps:2379 +waterloo_waterpark.map 85204BA9 23931744 262144 36d79366c59cd3c6fe771e9692ad3a1169bfee40 halomaps:2892 +WaterWayBETA.map BB8A52B4 20860981 262144 ef1cba7f6aca500b10bc39cd2cbbc703327d322d halomaps:5385 +Waterworks.map 694FAC08 68304825 262144 a3a0196df74b418f0cbf9800151a91e2cb3db6b5 halomaps:6682 +waterworksbeta1.map 556333FA 65607458 262144 b4c095ba011fa27078ca16c53bf31c7c7025f09a halomaps:2053 +Watery-Grave.map 19535184 15951044 262144 d400fff181c8791a37b6f3ac06da5485719827e1 halomaps:3802 +Watery_Grave_pb1.map 0D9F0D55 294149868 262144 c549b7e28c031b20a6ee7a865f6325c50cba002b halonet:Watery_Grave_pb1.zip +Weaklings_vs_Weaklings.map 2D0AC17D 67557247 262144 bee28da06d8be89dd33557a8b751f7468bd13dec halomaps:4182 +weapon.map 287EA874 13982964 262144 a7cc353dd7e47364a25bd6803c8e8972f16c07e3 halonet:weapon.zip +Weapons_forestV1.map A6EA0680 44557257 262144 7d97ba208ae94653c24c6349538bcee16ec6472c halomaps:2618 +weapons_room.map 3D1BB946 295948033 262144 659d6766b5788e84a731dece013d79fe2ea5848e halonet:weapons_room.zip +weapons_training.map 27552BEF 72633432 262144 c60ab48b8bc5174482739fd78ea6c13b0e6452ca halomaps:4348 +weaponwarsv6MEAIv3.map 161EE9FE 41002981 262144 7446ade413365c85176e42097c17215be03279a8 halomaps:4145 +Weckenmannland.map E4F345A4 54132549 262144 f6e69f16a3b98a69132ccd73d85c171425d74dbe halomaps:4631 +wehrlite.map 2509F069 53794616 262144 0e05a7df0af76dfc935e2bf8155fd5fbe611031e halomaps:6908 +weld.map A68BFD5B 23816021 262144 4c765c3ceb54263e60b4fcc441dfd485730faa03 halomaps:4696 +Wet Dunes.map 4CB8320A 52638421 262144 9001972d9615edefb42fc30d8c7e803b4b194b26 halomaps:4256 +wet_forest.map 01ABDB17 22903584 262144 02e116e07c9628d3cc444671e45536c6f4a349bc halomaps:5386 +when_spartans_attack.map 7807A008 71793498 262144 7936c13c032112caf827511f64f861a3e92f45ff halomaps:2785 +whenhootersfly2.map 10BC3D21 22848604 262144 5a896d36d6ead2e5e0fd96e8c7694ca1ef0e3da1 halomaps:510 +Which_Way.map BAB35D0C 100167791 262144 37823bdcb733c1fd75c414a512a17c1ff4c9fcaf halonet:Which_Way.zip +Which_Way_2.map 6EA6FCBA 44535717 262144 4a0da5bbcb475a29e53caaf4e37716dc50667b46 halonet:Which_Way_2.zip +Whiteout.map 7D87FCF7 175651448 262144 02ccf19670cbd2af7d4afc0eeb1016f24dd5d6ed halomaps:6103 +whiz_bang.map 00000000 89051917 262144 514dcf101daeb3eb09d662bce827c84d29f3631d halonet:whiz_bang.zip +Whomp Castle.map DB77045B 360410781 262144 525e74121faf6f80bd2bd2c459ee209ce9ba2b8f halonet:Whomp Castle.zip +whomps_fortress.map A4F7549A 207843369 262144 408b3841d8efb192e8b2650c5351c5c14bbc5d41 halonet:whomps_fortress.zip +wicked-sidewinder.map 127AC51D 192228418 262144 3f4f6a2209eda487aab7473e8f57b8dc6f681a4a halonet:wicked-sidewinder.zip +wild_race.map 7397A031 24556809 262144 11293a3f53db8521be4551e63151d8fb2cede09b halonet:wild_race.zip +Wild_west.map 65DA501D 37233515 262144 be6a8dee72da8bea93d89497f1424c703ba166ca halomaps:3883 +Wild_west_V2.map 763EE14A 51686067 262144 fd120bc614c9a52f7e3a416620f2f9353656fc66 halomaps:3885 +will-to-hope.map 4B492CFC 68725835 262144 f49619a8dc0a6bd8f4ccb5570db5e4e4badd8524 halomaps:4101 +winder_pass.map 2B1F1ED7 37777811 262144 b3b0d911c415ee12ed02a056ce9765986e589f87 halomaps:6204 +windfall_island.map DB31507F 27758240 262144 bb4a0a182ca624be4c4ebfb9c7e821306f5cebed halomaps:6254 +windfall_island_v.2.20130707.map E98917B2 39886140 262144 24d1bd1c02f56ac81e607b97eaba9cacff4fca78 halonet:windfall_island_v.2.20130707.zip +windfall_island_v.2.map EB89BB7B 59042701 262144 683f6a44f8ffab68bfa3b210c75a202d63c9c69b halonet:windfall_island_v.2.zip +windisland-mod.map D917BB55 18853472 262144 0f34c04d2fcb3eacc13198761a4049a259a007d8 halomaps:2932 +Windisland.map EDA1F615 18974404 262144 653905d103c0f59aa1d02c3df9872c0fcc48be69 halomaps:332 +Windwaker_False.map B5A86B94 244558122 262144 dcc9b712b38a57bfcf161fbe2fa9d2394455fa91 halonet:Windwaker_False.zip +Windwaker_True.map CCCA0BCE 53059105 262144 ea8c1da883765ada5650b0fcdd36f21ea93cf3e6 halonet:Windwaker_True.zip +wing.map 88BC048D 30344324 262144 4cc31282d89f2d1d1b8fa6a632fd35d9f4581b53 halomaps:1799 +wingzero.map ED2862A3 105942049 262144 b93ccf1fe266dc45b8fb172088c4d318158a6680 halomaps:1453 +winter-area55.map 8D474500 78672565 262144 1a62af58a4358e8f47db7bdb2f041d5b71166c0a halomaps:4208 +Winter_Ablation.map 2DAFF058 401210055 524288 05013057d4fe5e2526c7058fbc97d270f3c4d4b3 halonet:Winter_Ablation.zip +winter_hills.map 34E0CB0E 41232892 262144 f76dd2df19cf9e9fe332271cf72d3eff48d48089 halomaps:4726 +Winter_Kills.map 2FFA9C20 267656889 262144 09dcb49b1624adc0946c5bf032ec397494c0aa80 halonet:Winter_Kills.zip +winter_snow.map 5C001C87 25777690 262144 5b3a1bb5c27c555d250af21a8fdd6b08074d83ba halomaps:3814 +wintercanyon.map C5F62B31 30983042 262144 083dc9837646ca880d5e5a0e0353b82fd433719a halomaps:4040 +winterfrost.map A237A6D9 109895732 262144 316d5b10efab1b36947089ac8aeef29f3d005d9d halomaps:4519 +wintersmith.map 4AC4198B 73975488 262144 c2553ae51beebc549f242e23b6be9a64f664e15a halomaps:7013 +wintersmith3.map 3C3D4B59 75884773 262144 01789e93214b1609b97470246ad6a1bc8fb388e6 halomaps:7013 +wintersmith4.map D126F284 102959894 262144 507272b27c43591158c1c36fd997290c2c48b2b3 halomaps:7013 +wintersmith5.map B908C519 75985878 262144 e08bd23923131a7e9984bd2c24275b3dee94043f halomaps:7013 +wintersmith6.map B6E0DF65 76117561 262144 fa1c57160eb5eb9b85dde20d8caa6a91195b4a12 halomaps:7013 +wintersmith7.map FAB83EB4 73153338 262144 c7a3bef2a3e3938c59d0492f9e5d5ff6f225a0e0 halomaps:7013 +WipeOut.map CE536C90 37155325 262144 77596c9fbd5cf7f712f3800669eb9798f8058bcd halomaps:3635 +wishbone_beta.map 3CC8FC86 18076535 262144 ef201d2849cb18b6fbf2cc638a015f9921451788 halomaps:977 +witch.map EA3BE632 65631250 262144 1da6fdab5c415e1444457583dac52eecd82b7fe2 halomaps:2418 +witch_tourney.map 529DB9FF 28253040 262144 c428097e36364ccdf951977533b6e93638ff634b halomaps:2515 +With_Whiteness.map E36D2C76 796558564 1048576 f635e2677fe87b98c5c277e40a902acd48649052 halomaps:6683 +wizard.map CF3359B1 12731464 262144 a3c8d73e2d78d49cdc0243a0a882805a44be1be5 halomaps:4790 +wizard_rm.map CF3359B1 284609488 262144 0e3f2f87a383f7a1b73f774aea27c6c676596b5a halonet:wizard_rm.zip +wizard_swords.map 507C4412 16611482 262144 48399ada70b6368c944fcbffd949b2f9a27acda5 halomaps:2334 +wizard_tmcc.map AB9495C7 36044848 262144 d2ca2377819579bae41c5f8c8952664fb4ecb60a halonet:wizard_tmcc.zip +wizardswords.map ADC4E0AA 14392930 262144 a40cfb9b8f75c3c361fcdbbc2222a46aeb852164 halomaps:3519 +wizz_pb_0150209.map 50D78B40 23536984 262144 f6510eb2bf9a8f1a48e1c8e3d097d66a48192ec1 halonet:wizz_pb_0150209.zip +wizz_test.map 34F31860 20371008 262144 d2f0791fa4ac26194c95d6587705cedfa59cad5d halomaps:4334 +wm_combo.map FA8F6FF5 105817824 262144 47d7a159f589d7a04b9b52751b4f093e3a4f82c0 halomaps:3636 +wmp_dismal.map 5CA012CD 47711886 262144 abf8ec6bd54a5c08dc2f00c3bc1a9248b36c657e halomaps:3423 +wolves-ambush.map 53647CEC 199497183 262144 89076e8fd6ae707ba950ed61804b2567aa48f4e2 halonet:wolves-ambush.zip +wolves_ambush.map 399264DD 182198613 262144 75953cb17d47378888e64854b4a0ea5635b8ef9b halonet:wolves_ambush.zip +wonderland.map D5424691 15621320 262144 028fef3bbd2fb2c706c9a96923a527850cfad74b halomaps:3116 +woodland_arena.map 2531B2BD 25300621 262144 208db8680d583dee64e83d035e4d78f3fc376530 halomaps:4697 +world_1-1.map 6511DB17 13399532 262144 1fd559e1fb3b192d9c1961a4aeb1ccb10c42bc53 halomaps:6316 +worldtanks.map 7EABB823 39028760 262144 108fd36acf38d32cd2ea390322bf21c3b50c437d halonet:worldtanks.zip +worm-born.map 38096F64 29805665 262144 a6b36593cef94224e605cbae6a5b11a8bba650dd halomaps:4481 +worm.map B355CB3E 29963321 262144 4b04471ad3527bb53fd4950e9858362e1638b910 halomaps:2507 +wowee.map D8F43419 69454877 262144 4518eee5dd500ca89ac27532787958d2e74b9c89 halomaps:4041 +wowee_v2.map 2810734B 81364631 262144 b45699f75125234acd4fca846eaf8501b456af52 halomaps:4632 +wpitest1.map F5E19F1D 25693916 262144 7ac1ce91e6eaf80ec030a269e1af29527cf45c61 halomaps:1833 +wpitest1_race.map 3F3588A4 25689216 262144 b7cffb406bc715619a8d9fd503f5578c53e91335 halomaps:2562 +wrath.map 83F0B8BA 34865227 262144 24dac98f66df217bbb9da9c3dc235ac308726e73 halomaps:2310 +wraths-dojo.map 01EBCE1C 26842990 262144 3c1a558a1db17bbf25cff9a96cdf8490a5d215e6 halomaps:5949 +wreck_island.map E8B3E028 91821795 262144 5695cef65b24e821d2b295f3997e1829976e9c90 halomaps:6284 +wtc.map 63EEEE9C 13265424 262144 9dbf22e20332efe11e635885d23fab410398dbb4 halomaps:2098 +wtcmod.map 8570BA4B 17873304 262144 9b1175125b52c0885b42be23b232bd9c3f82a3ea halomaps:2157 +wtcmod2.map FE4A988F 23648188 262144 13f6312505ce8e0c21e4e2fdbf27424be76ecd9f halomaps:2175 +wtcmod3.map AA1CCEBC 47528801 262144 5ff6a19090f7bd31045cc57e4f95c8681943b5ca halomaps:2663 +wtcmod4.map F556C6ED 31414248 262144 f82cfb0a20995edd8a4847629041043c1533fe68 halomaps:2740 +WTF.map DBE4B3DD 228269093 262144 cc6f7175369b5e75ccf2a6c818cc751850148241 halonet:WTF.zip +wtf_AI.map 24D42B40 27203562 262144 1a5d3ae8b0918ae2293e0d8695d2f6df2c243192 halomaps:1851 +wtf_NO_AI.map 2520A890 27200022 262144 829ad06d6240f0ba2212391bdd0a98a6f4fa7d2e halomaps:333 +Wuhan-China.map 2E38945D 133793692 262144 dbe8cb568d8edd9727352288337863698e0cadf2 halonet:Wuhan-China.zip +WuPh.map C6E5DEE9 39476118 262144 c09427e384b63b1402b4f305f1119621899b122a halomaps:2870 +ww1_beta.map CC550FF8 17825264 262144 1978fb233bf188a507e63605e7f0235a5f665321 halomaps:467 +WW_battlefield.map 84599EBB 33082413 262144 88b251a10e5f36d450780b1a15a3313c97993034 halomaps:3212 +X-66D.map FFD78248 18722085 262144 671d1721ce4feffbfca4a3cee1ff80bcd86e0828 halomaps:3637 +X-68.map 70531DC1 62576522 262144 b1e244b602e4b07b9f10624944ba830ee23cd65b halomaps:3107 +x-ball_public_beta.map BE7FEA0E 15723340 262144 0aefc4b399e8d4e437d027bdda6ed9c911266122 halomaps:1501 +x-chromo_alpha.map 982276DE 36487651 262144 5b3b6d1653fe51ce1bed40b343245b6ebe419776 halomaps:2123 +x-tinction-v3.map 3DB397DA 167843513 262144 5f1df9ab9ccf8e58c7ba3cbaa52a4c752cc685e9 halonet:x-tinction-v3.zip +X.map 18B22906 33232109 262144 573b5e92e7bfaed74c4d9194ac0e93f1f9fe32e7 halomaps:962 +X13.map BD4A3897 71481751 262144 50ef7dfca27c6ba4353af96c8e163ce7d650de16 halomaps:5434 +x2_mudslide.map 4B286687 23465784 262144 b935627c4cb449dfb345625a8f8a70ebafaf16e4 halomaps:528 +xaniel.map 635DC0FC 18338388 262144 b02019614e68d4d4219c67f0b14d64f215fe40e0 halomaps:1442 +xbox_atlas.map 88F01B10 15987196 262144 d5d5a74aad0119da9c2e5aecb0d37d9d981850cd halonet:xbox_atlas.zip +xbox_beavercreek.map B0CEC2F6 13218560 262144 749426ef78e430226920d1422f9b2fb5fa1ccc1f halonet:xbox_beavercreek.zip +xbox_beavercreek_rc_final.map 5494D853 14723912 262144 100e95c2b20eb2fcb560fa7056ae30634b3170ab halonet:xbox_beavercreek_rc_final.zip +xbox_bloodgulch.map C1406345 14170896 262144 2473dbedbae56f6dfaf285fe69278f4c68ed259a halonet:xbox_bloodgulch.zip +xbox_boardingaction.map 4EF25396 14893632 262144 e01fdae6fb80138a1da7e79c1ee67f0b4fdc5774 halonet:xbox_boardingaction.zip +xbox_calamity.map AEE80F1F 14851516 262144 4fe338d10617bb534a6fb2f55e1abcc7093b39ae halonet:xbox_calamity.zip +xbox_carousel.map 96D43C86 12996668 262144 cc304d79bccf52d1e6bc403bbcf2006c85e56e0b halonet:xbox_carousel.zip +xbox_carousel_rc_final.map C2A900A9 14502168 262144 4a2a1ae5ed411ea229a9a17c99d14ec42cfe0eff halonet:xbox_carousel_rc_final.zip +xbox_chillout.map DF8E52B0 12966096 262144 d3d26eb54d559423d9adcd551cfd01a9a3cd55fb halonet:xbox_chillout.zip +xbox_chillout_rc_final.map 37A666D4 14496900 262144 a1ce5e4b612041c91921f08085ba4dbd4f917b43 halonet:xbox_chillout_rc_final.zip +xbox_damnation.map A235C2DB 14322116 262144 b3ed9cfb44373ee2f2ff7feacc403b3b37b97948 halonet:xbox_damnation.zip +xbox_damnation_rc_final.map 63C549B2 15845368 262144 4a0b898e693eb5e74156ea935e664f6ef02fbce9 halonet:xbox_damnation_rc_final.zip +xbox_decidia.map B59FBA59 12991868 262144 46f2e51fc318272e939e5506d068ba16f359d669 halonet:xbox_decidia.zip +xbox_decidia_h1.5_rc_final.map 50DDFEA3 17353368 262144 119348e3236332996fb69b7d3b4656b4c56b501e halonet:xbox_decidia_h1.5_rc_final.zip +xbox_doubletake.map 80FAD067 13873308 262144 648a3e938257b8eefc1c7424e2b1059ceec68d9a halonet:xbox_doubletake.zip +xbox_doubletake_h1.5_rc_final.map B682AB13 15389660 262144 9e5805c1cdced82b210566d33827adf7428b2f3d halonet:xbox_doubletake_h1.5_rc_final.zip +xbox_downrush.map CD36AAD4 14259284 262144 60db6bfaac776e4a9cd5aaaebc8e80b11baa706d halonet:xbox_downrush.zip +xbox_downrush_h1.5_rc_final.map 3847D3E6 14391244 262144 a8676e3181f2f21857375d7d7c6ae78fb39e4825 halonet:xbox_downrush_h1.5_rc_final.zip +xbox_exhibit.map 1C6C0ACC 14890428 262144 dc11cb3b95fc63516ae30121883326a2f79c9cd7 halonet:xbox_exhibit.zip +xbox_exhibit_h1.5_rc_final.map 0E4EB085 15382841 262144 8834476071aa7bdc99d3499148e32de42f830d49 halonet:xbox_exhibit_h1.5_rc_final.zip +xbox_hangemhigh.map 45B34D8E 13390020 262144 6009bcf08d7f474c0a68fab371d2ace2df141527 halonet:xbox_hangemhigh.zip +xbox_hangemhigh_rc_final.map 58189459 14933772 262144 66f6938182b6c15a8f78fbb57063a96762eb939d halonet:xbox_hangemhigh_rc_final.zip +xbox_hotbox.map A3512AF1 17472052 262144 4f0efa9b19f65421a79da5e116f9a420b64a136c halonet:xbox_hotbox.zip +xbox_hotbox_h1.5_rc_final.map 84C708A8 15844220 262144 db95961e9cc5604fdb39f00a30e917115820f03a halonet:xbox_hotbox_h1.5_rc_final.zip +xbox_imminent.map 0656239A 14422900 262144 6367f76e16126ad08e4f7718a36a3147f5d53a2d halonet:xbox_imminent.zip +xbox_imminent_h1.5_rc_final.map 190F36FD 15210364 262144 a199c5a72aa8e2eea35050bbc5455e0a47f6e974 halonet:xbox_imminent_h1.5_rc_final.zip +xbox_levee_h1.5_rc_final.map 132AA691 17751272 262144 1143c51799dcc735e19539807d56a8eb907fce2f halonet:xbox_levee_h1.5_rc_final.zip +xbox_longest.map E4F16FD1 12664340 262144 d4d3bc8e1fc45d7024c142c8781151cd24845e6d halonet:xbox_longest.zip +xbox_longest_rc_final.map F8B54E80 14078928 262144 23f99ad57eb4cb8c4ec7081144741f9145887d65 halonet:xbox_longest_rc_final.zip +xbox_madhouse.map 8D570E24 13641244 262144 bc3a0c886f8328f94131e4109b6dbf0f90135f0e halonet:xbox_madhouse.zip +xbox_outbound.map 009883C8 15246084 262144 9f50a3c1cc10170e056693f298763a3c3d68db27 halonet:xbox_outbound.zip +xbox_overflow.map 00CEF761 16757676 262144 2680edfebc07813df9078fd655c61549cce86d33 halonet:xbox_overflow.zip +xbox_overflow_fix.map E3501E41 16745616 262144 af017383c3f19a2e17773d3a88879aeba95b47cc halonet:xbox_overflow_fix.zip +xbox_prisoner.map E9033FBB 13432072 262144 96d5bd60d59e978f16cd96d510c63f86d946c0f9 halonet:xbox_prisoner.zip +xbox_prisoner_rc_final.map FEA2F53C 14715476 262144 b1471d7b9a9a3cd339d36d6dbc73033033f1129a halonet:xbox_prisoner_rc_final.zip +xbox_putput.map E2DE4FCC 14434328 262144 f3e507c3fca1bbacaf1121d0d359c08916dc466e halonet:xbox_putput.zip +xbox_ratrace.map CF575AFE 12998928 262144 d2d36c5398fd50d3253ac8500ae2dae5e6dee30d halonet:xbox_ratrace.zip +xbox_ratrace_rc_final.map 2DDB6798 14557992 262144 e844172d2efc0a30b6ef7f9890f70c104e74fb3c halonet:xbox_ratrace_rc_final.zip +xbox_redshift.map BD26105F 19541488 262144 9ad02950b077131abe0b8d1e5ac72c557784afc6 halonet:xbox_redshift.zip +xbox_sidewinder.map B20B0884 15443864 262144 0852f141030e24130ec5ef135046cd12ed4cfe3c halonet:xbox_sidewinder.zip +xbox_tinker.map 92595BC8 12537496 262144 6aea9e5601b86461b33b03a4933c5bf095d8ab86 halonet:xbox_tinker.zip +xbox_wizard.map 8E276DEC 12865924 262144 357c80623982dc46267abc5df1849a387e0efb11 halonet:xbox_wizard.zip +xbox_wizard_rc_final.map F0ABB555 14384316 262144 668a57e9175f7ef62ee199e70015bf630ec54ec7 halonet:xbox_wizard_rc_final.zip +xbox_zerohour.map 38173ED4 19448136 262144 33464b9eede0dc741dd1f709dda492de516c7fa0 halonet:xbox_zerohour.zip +xbox_zerohour_h1.5_rc_final.map 4E158366 20769524 262144 03fb9a60d6e3cf69dfce43dde40d86234767a512 halonet:xbox_zerohour_h1.5_rc_final.zip +xf01.map 2126ECA1 20806340 262144 e4e288e5097446442e186830f757e322e6ffa0c1 halomaps:2355 +xf_box.map 798B0ED9 12066576 262144 a3070d70d815e22ac1ff037dfa10eb6e4f7672d2 halomaps:2129 +xf_box_v2.map 827E5BD5 12084580 262144 500d6eab5c85ee063bda82692a553224bbe7abba halomaps:2145 +XH Sentinals.map D9C4A443 15456640 262144 91afda414124dbdf1583cf9243a7f38b3e2220ce halomaps:4239 +Xmas_Bigass.map D8D60174 215383535 262144 af1e33569008ce7a428125c107b889e509f0a1e3 halonet:Xmas_Bigass.zip +Xmas_Halo_Remix.map 1FA5F8CF 83360319 262144 7ac019875b8434f5a5ac7900fac6b719a05f8066 halonet:Xmas_Halo_Remix.zip +XMT-creek.map 0C5405F8 33803161 262144 4133c8cbbcbf17dbe718210bd7843cb679ea0504 halomaps:3449 +xmt_frigid-Beta.map 6D358BAB 23071532 262144 e87569eca51c71132f5cbcc0434e3b94a60fabf0 halomaps:3422 +xmt_landslide.map 79F3D384 14765740 262144 518dafffd667c713135ee7251ec0ad4d0208b4bd halomaps:4134 +xmt_landslide_v2.map DF8063FA 19410100 262144 f9622f4f3a0ef9306c874a57150b943537693c4d halomaps:4166 +xmt_wing.map AC4F3E6D 12844472 262144 c562e54f13cfdcce96dd4395ceffe6ebde32a20c halomaps:3815 +xmtstunt.map A2895E04 13903864 262144 40fc4e72edb8eb3d5fd84475b76782de68db41d7 halomaps:3487 +xsnoderv2.map ED9DE84D 18719043 262144 751ea6db88e366fe9e97740f718e24e26802639b halomaps:4542 +xsnoderv3.map B7B0F29A 56851970 262144 d2b882e06716a6fa96871d966eb2825be976eb37 halomaps:4573 +xsnoderv3_revised.map 2245B9FE 72208026 262144 c1b545507373579b1f82cc60ed57793d7632c7b9 halomaps:4607 +xXx-Bloodaction.map 9FA24401 16317904 262144 4bc764866c7b38bfb6ff62b570e1931fa420a17a halomaps:4535 +xXx-Covenant_Attack.map F0455A76 134147555 262144 2839afd0ca22202daede67c85bd6a164d4befa7c halomaps:4415 +xXx-Covenant_Cityscape.map C48421F8 108154764 262144 cd9507dcff0b90b131877b1102264b8845ac0fe9 halomaps:4543 +xXx-Delta_Cliffs.map 98D43F70 86006136 262144 22c8f5a3aa8650ace26d63a490e4af32b9dd45c5 halomaps:4663 +xXx-Headlong.map 813DD22F 330514701 262144 31b7156bfbca0a1ba0329aa8f6f4a0448febdd9b halomaps:5714 +xXx-HLB_Snow_Grove.map F2EC4347 164829842 262144 a2a2d884826ceee8f78742e56329e2ae71f68e19 halomaps:5036 +xXx-New_Mombasa.map 40C163A3 77663057 262144 94ecec1363ba24bb3d9c69a697638206d2b5822b halomaps:4349 +xXx-Peril.map D11A6ED8 89668065 262144 05ff67c6d3fc5ee69c35b35bb0a77fd1eb491932 halomaps:4544 +xXx-Sandtrap.map 71F10050 199919041 262144 f1186dcfb2aeec72f7e6d65ae2922a76d2abe8ed halomaps:5194 +xXx-the-jajoma_battle.map 90DD923D 99027233 262144 96a83644515107b8f510531aa3301c13faf29d84 halomaps:4416 +xXx-The_Final_Challenge.map 8FBEF52F 134201553 262144 a40dd9c884c16ef8d3822c991d8d89daa0ccff76 halomaps:4545 +xXx-Trainer.map F95A3EDC 15531296 262144 0da2e3019b862913747e1a4382d642319559d2fb halomaps:4335 +xXx-Valhalla.map 7FCF1319 81132237 262144 9c1ca3e413d0e78b8c25d094a92a8b30dc2ee92f halomaps:4664 +xXx-Valhalla_v2.map 091D70F1 145297552 262144 9190aba0c21477e140fa15119103e087b6eec1ef halomaps:5098 +xXx-Zanzibar.map BD017CAB 83160759 262144 ee728b342c6325e9ce814bba02df79c48291074a halomaps:4350 +xXxIcedanger.map 94C87C30 23973516 262144 d49023eb7b6b5f52784cdda190568ae2da76a097 halomaps:4560 +xz_infinity.map 2C9CA32E 48156627 262144 48c2fa6f413504aeac60e92c4eccf04876766ccd halomaps:3328 +y-chromo.map 8444FB4C 47078758 262144 a67e879a14aa23680675422a937c4f198086f565 halomaps:2073 +y-ghost_test_gulch.map 656FD86B 19181928 262144 9cf24a57924ec6a8b3ba862c14f508d4e70b141b halomaps:2644 +ye_olde_halo.map 41F7382F 23258487 262144 0e06aeeec724b8c295af68211f10505fbb9c67f2 halomaps:5820 +yin_and_yang.map E46CC2BA 30973632 262144 c7b0fa1041b07885da5d4eabd5ac541b5abf168d halomaps:3803 +Yoyo_Emerald_Dream.map 484F0206 58758038 262144 9a1be1a8da7c43ac7d66350a65fe33ff90496216 halomaps:4698 +Yoyodance.map 06503AFC 63437732 262144 d0f186899c0ea24926489815af9962cba790c495 halomaps:4307 +yoyomod.map 3F7F4276 56732073 262144 07c20e2aa7c00035726929f72f8fbc222b8b285c halomaps:2563 +yoyomod2.map 5C7E785A 63753326 262144 e969ac9b7e642f0f31b0d47794ebb08da2f4d3eb halomaps:2704 +Yoyorast Island V2.map 125AD8FB 100451441 262144 f71eca4f586218e930f49807b5c53842a3fc05e9 halomaps:4957 +Yoyorast_Island.map 0E5D57DE 30052492 262144 24cca91e6ee7e574ae59174ac463376bb2641ee8 halomaps:1144 +Yoyorast_Island_KV.map 31C8D80B 76895826 262144 934c8e15d880b7592e464d835b85e52fd2f7ecc3 halomaps:4084 +Yoyorast_Island_KV2.map C66CA110 78412879 262144 57c6eeb11d58cd6a892d8df3c6980b7d3f44d460 halomaps:4085 +Yoyorast_island_KV3.map 7C09B07C 101526143 262144 a64da556e1f9e541fd1038e418dd9c8413c7fb48 halomaps:4460 +Yoyorast_Islandv2_public_beta.map C77A9565 19910208 262144 ca927f7196ee380fa931c4a1a77e10f468f72e0a halomaps:2325 +Yuldamas_base_house2v3.map E27283A8 133861619 262144 c99e75b530d47761eb68ce76e48c9273a82d1e34 halomaps:7098 +Yuldamas_war.map FFE9C673 122353794 262144 aaaf190080362798dd6f22305dec40c858adfd46 halomaps:7123 +Yuricoman_Map.map 46DA91F8 79621997 262144 2660fb03c6d8d02d8a7f023add5d842adc1cccbe halomaps:6239 +z-sec.map DFC96678 29349948 262144 dc5ad2a7b3851d800e80c910138553b055fea237 halomaps:821 +z_coagulation_h2_pb1.map 17E7F995 111715927 262144 73d2a2fa395b353974581da22b37e548857c4e18 halomaps:2753 +z_coagulation_h2_pb2.map 393DA418 107519327 262144 052b7b1170826e3f5f0b4695f2ec721f16f9c92a halomaps:3108 +z_sanctuary_h2_pb2.map 6FDD2ACC 112030615 262144 93d9a1b7ffd465d4e319f77060ef5cebe5c48e40 halomaps:2768 +Zanzibar-AI-MP.map 19A41206 57403060 262144 bcb4acb4cd97b040845b3d7d4835236805e7b021 halomaps:6460 +Zanzibar.map EC651927 62484486 262144 610ac86c363768fe46601402ffc62440d2a68c76 halomaps:586 +zanzibar_assualt.map AB8B3DDC 112445731 262144 067fe1cef95ae866d2d6b32faa0786d0f5738874 halomaps:4915 +Zanzibar_Classic.map A3B3E9FF 44580362 262144 5830a7bd4c9030022c7adb49ba482df89c1f4f91 halomaps:826 +Zanzibar_H2_v2.map 33960B74 88514145 262144 ae06d120ce1e12269f3778f262f426039d5aa758 halomaps:2584 +zanzibar_INTENSE.map C40A9D52 82653560 262144 a11ec5dd48ae8cbf5549872cb687663591e678e6 halomaps:4146 +zanzibar_ME.map 122E63BC 103827723 262144 545abf170861ccd08eabb7f9415f3c4429d23614 halomaps:2186 +zanzibarhalo3.map F3310500 115842442 262144 81dad9d8dd53aae5836f736e783bad9582912d81 halomaps:4417 +zelot2.map 3B73AC65 316576170 262144 97ddc9a6b4ff387571ef16d68963fe3ada02a034 halomaps:6485 +zendicon.map DEDCFDFA 31384317 262144 ba8e56205004bd756d39303d17c0759b5d00b833 halomaps:5438 +zenith.map 1928A536 15558344 262144 1282b2ad3d040241685f5d31a06dc4c72eb4f26c halomaps:392 +zenith_no_ai.map 6AE2CFF0 19032968 262144 b21c69b64ac61b505787b5116fcf3404d991af82 halomaps:454 +zerohour_h1.5.map 971C0632 20184628 262144 d0e6f3428a5c452e367bcb7da26e336fdd2d98f2 halomaps:7021 +zerowing.map 201B692D 111692454 262144 948313f1129cbbef6cb80ce69a0f0a5dc1d82a31 halomaps:1441 +ziwill_beta.map BEBAA669 14079604 262144 c79a12282a889f9f4a07a84bd164db2a37ca8fd0 halomaps:960 +zmm_battle_grounds.map 8B76478A 64750994 262144 70b3d9993e87eb83d0b3bc544a0853d6f9e4978d halomaps:4956 +zmm_grove_fixed.map FDF1B054 107151469 262144 7d24d85b027a294f92242d6618772cd8307de000 halomaps:5442 +ZMP_A50.map 7BBE4011 61676597 262144 795b9082688361440d4a277325d1772be1fd5a17 halonet:ZMP_A50.zip +ZMP_Beavercreek.map 36B52057 40106751 262144 ee4e7190b4f20f86f07e294c0409360c1f12df71 halonet:ZMP_Beavercreek.zip +ZMP_Boardingaction.map C4B8ACBC 41258467 262144 b6950191f8a2a93a0751d839b9dec842f85582f7 halonet:ZMP_Boardingaction.zip +ZMP_Carousel.map 0500C5A4 39923499 262144 77fce329dd12ce35f9b1bcdfeb955580cebb6479 halonet:ZMP_Carousel.zip +ZMP_Chillout.map 16720F68 40000975 262144 4d1f1baea4fc43d817b633cf3e192c9e359933ab halonet:ZMP_Chillout.zip +ZMP_Chilron_TL34.map 5B665B9C 40311743 262144 54b171a4f88a865c10f2394f956d8dff530f4bcd halonet:ZMP_Chilron_TL34.zip +ZMP_Damnation.map 15B79D15 41291855 262144 abf8b7abaffd012e2ab5effb7ff47ed530452fea halonet:ZMP_Damnation.zip +ZMP_Falujah_pb.map 88F4FB83 51285229 262144 6c45a35e7359011781e4245d318609833158e226 halonet:ZMP_Falujah_pb.zip +ZMP_Hangemhigh.map FA5FBB51 40424943 262144 b2ab82fdc7a7316d152d3f2cdb43e8d72030150c halonet:ZMP_Hangemhigh.zip +ZMP_Prisoner.map E6D1A47D 41546363 262144 65d430d6a960d0955dfdafe185bcaa50e8b8d6de halonet:ZMP_Prisoner.zip +ZMP_Rat_Race.map 1C84142C 39457383 262144 73636f79fa7a1798a0bb567e4425a672ebe9256a halonet:ZMP_Rat_Race.zip +ZMP_Sierra_PB.map DE73A216 72131455 262144 99428a5d0e3a7a1cb8f1835368de778dcc2edace halonet:ZMP_Sierra_PB.zip +ZMP_Turf_Zombiez.map 0904264A 69813944 262144 2992165c6e905468a42cd8e7a642eb3072272d05 halonet:ZMP_Turf_Zombiez.zip +ZMP_Wizard.map 0DD73629 52197098 262144 2cce6e84add750284ad1e722db37037eba30e994 halonet:ZMP_Wizard.zip +ZO_Spirit_Temple.map 0E17EEEF 27392163 262144 b52135ce22c4d3a63ad68d26bb5e12dc605a7d92 halomaps:3971 +Zombie_Aquarium.map 71D67527 111654767 262144 1d263c390213eda04b6fcebfa2e4e164724311b8 halonet:Zombie_Aquarium.zip +Zombie_Carousel.map D7FF1918 91111090 262144 87d3660ea275159d4f78690a96da06074ef82802 halonet:Zombie_Carousel.zip +Zombie_Chillout.map 968C08E7 62329645 262144 7aabe9920daf06a75582cd6476b2d702ad469b93 halonet:Zombie_Chillout.zip +Zombie_Church.map D84B02BD 180323241 262144 40ac51a99cf20736c5b0eb19e58611de7870e1de halonet:Zombie_Church.zip +Zombie_Creek.map 590EA715 71858415 262144 5e9525e9285d47b366996ac532a2fa9eb47b52fd halonet:Zombie_Creek.zip +Zombie_Dormitory.map 944AD8C4 101801818 262144 4c0bdc06486863274cb0c21af480f8e522df1560 halonet:Zombie_Dormitory.zip +Zombie_Down_Town.map F9C94648 115070288 262144 1679b1b33add0e5cda6663d1e71b864b9bd3fe4f halonet:Zombie_Down_Town.zip +Zombie_Graveyard.map 3B1268FF 196428212 262144 005084fb8a00d1d3757c5775139dec58911dc141 halonet:Zombie_Graveyard.zip +Zombie_Hangem_Dead.map 02FDBC44 63816973 262144 8d4cf9c1316de34fc0be0124175704568674d9c6 halonet:Zombie_Hangem_Dead.zip +Zombie_High_School.map D1BFCD5F 75010468 262144 7ae34df4744e6237885f7e9e4978a485dc01fad2 halonet:Zombie_High_School.zip +Zombie_Intensity.map 0DBC3862 131956046 262144 a38037abf8e2f68c09f28e5fb73742deceb810ff halonet:Zombie_Intensity.zip +Zombie_Morgue.map 971F07F0 100432659 262144 351f5d2102620a07865b38b3dd00f480cd4e0c56 halonet:Zombie_Morgue.zip +Zombie_Nation_pb1.map FDBAED06 226289199 262144 aa925de585f28e233861b7d4937d906f17c8130a halonet:Zombie_Nation_pb1.zip +Zombie_Ratrace.map 6F554862 65834885 262144 59cdeacdf575b9c1c2d0a332fca6a85886b4f7ee halonet:Zombie_Ratrace.zip +Zombie_Spooky_Hollow.map BBBBF017 130674502 262144 c4f04e504078c751de685391c8cf80edea817b45 halonet:Zombie_Spooky_Hollow.zip +zombiegulch.map B20BAEE3 30361668 262144 18b48fcbd4029981cb4f38c0a0affc2191760e5d halomaps:3156 +Zombies Low Internet.map 7B1219B7 33412941 262144 3325abbaf592cc4eecf464bd7602208e47947580 halomaps:6036 +zombies.map 0C6FE198 21964173 262144 771bec00a45a1d45d965da1dc29147fa07a9acab halomaps:3520 +zombiesv2pb1.map 6D5BB93A 16587145 262144 a29b83514d620d8f50c1b99995a278766548625f halomaps:3542 +Zone-delta.map 2A7748D1 32446762 262144 b598e9b1534344cf528400650524ecced2682c20 halomaps:2705 +Zoombiipanda.map 81602478 200302153 262144 bcfbc235cb1b2bd6de9209a62920c9cb0f3c3700 halonet:Zoombiipanda.zip +zxgulch.map 9465BD76 32202557 262144 ee1b2ce687c1048bacc8feb88d469ab43307ec44 halomaps:4482 +zyclone.map E3EEC41D 20279358 262144 fa2d93d849f29cd6a703e2f228c9a007016e28dd halomaps:1300 +zyone.map CE0A33DA 14836328 262144 95c9b8e98936a286bf36b718b3afc6c4c3a6c3c9 halomaps:1477 +zz.map 633B2766 21829619 262144 3f546f4b4d3b6b9b61b6c0b42c5b4afe7a263cfc halomaps:1023 +{]H3[}Trench_Final.map 743655B4 248957582 262144 676b99b5192d7fba35f19ad627c10733d421d27a halomaps:5863 +{add}clanmap.map 772A25BA 15192340 262144 7c0f9edde5df4ac0d1ca7d43daaef1c17de4a14b halomaps:2047 +{ADD}icegulch.map B36CA474 13120128 262144 02c7a1365645f51dd905bf3283c959ea4b6765f3 halomaps:2048 +{ADD}tutorial.map C02CD27A 14249072 262144 c0bec335d5b73e45610e4e1f7598f13fe739d45d halomaps:2014 +{ADD}y-chromo_beta.map ABE727F9 14191004 262144 7df5d12f3101688549bcea179d7b2aad23f32d5f halomaps:2049 +{DT} Covenant Sky Dive.map A2465FFB 41730944 262144 4e0cb1b25a95dc48da9d2475ecbbf13d155c3f64 halomaps:3996 +{DT} Death Swamp.map 3CE1572E 54998475 262144 266044d8afff995926eccc3f589a47559dd519de halomaps:3997 +{DT} Sky Dive.map B602177D 32437600 262144 755b59ef05c1280def70eaca439c82e81b656dda halomaps:3998 +{DxA}creek_beta2.map 0F5A0CF9 48368649 262144 335a3b5bd6f8b08571cfa01bae282b2e95e4df62 halomaps:2247 +{DxA}school_movie_edition.map CDB79D33 116055420 262144 5927ae3d6a967e0c28d71e80214b19734e6ec884 halomaps:2311 +{fck}valley.map B0D476A1 188709873 262144 aed32dd5d988655e2ba2eb1dceeff036ec78e405 halomaps:5862 +{H3}[bloodgulch].map 47CBEF79 179478951 262144 fcaac2254e59ef26e78a8086aa21c635bf06f86b halomaps:6528 +{H3}brutalgulch.map 08EDE522 101346674 262144 42a09fa1a8d7b325a2c53a60d8f6b1596a93320f halomaps:6053 +{H3}deltaruins.map 0892B52F 119115570 262144 c1640bb6cfd2667481fa4a1764ec72778b6032ca halomaps:6077 +{neo}bigass.map 9C75E879 384977152 262144 516dd16097068d2a5a2373e86a58d8db471ee6b2 halonet:{neo}bigass.zip +{neo}excavation.map 8D9F9E95 283065944 262144 7f0eaac9c95de0fff2e8b85e3e25bb03f5087f79 halonet:{neo}excavation.zip +{PRP}V@$H'sGulch.map 22F459A7 22798596 262144 30ea629a6265c1dc364989552d605177c76fbe06 halomaps:1727 +{ss}-[umt]creek.map B6707B83 274431269 262144 04b2e5b19a4b2b2cb6e736d2f4b8040fbbc96b8a halonet:{ss}-[umt]creek.zip +{ss}creek_rb_003.map 2D247E73 43177498 262144 d15990dba8ae3cc2f40fad92fc20838ac5a64c6a halonet:{ss}creek_rb_003.zip +{ss}snowcreek.map 9C07884B 105322231 262144 581efd78227e575671f688a1fe087b91e580c418 halonet:{ss}snowcreek.zip +{SS}Tribute by T5.map 68221CCA 18172644 262144 0e0c40fc804ff1f672c376538bc4bbd7fd89a0d4 halomaps:6482 +«Gç» Foundations.map 1BAB1780 29231599 262144 a44c492de6ba69e43997cb202753ad5527bfaa04 halomaps:1646 diff --git a/port/linux/NETCODE.md b/port/linux/NETCODE.md index 69f1214517..c8a37cb120 100644 --- a/port/linux/NETCODE.md +++ b/port/linux/NETCODE.md @@ -341,10 +341,13 @@ a pregame keep-alive every five seconds from the host A client may join a game on a Custom Edition map it does not have (`port/linux/game/map_share.c`, `map_share_files.c`). Every map in the custom_maps folder is named for its contents: once the map lists (or a host -picking it) find it, `hugeass.map` is renamed `hugeass_<8 hex digits>.map`, -the first digits of its hash, with its picture and description, so a game's -level name (`custom_maps\hugeass_0e2b3ee4`) says which version of the map it -is, and two versions never meet. A file's hash is BLAKE2b's (32 bytes) of a +picking it) find `hugeass.map`, it is hashed, and a game on it is on the +level `custom_maps\hugeass_<8 hex digits>`, the first digits of its hash, so +the level name says which version of the map it is, and two versions never +meet. The file keeps its name (no map is renamed: other programs and +installs use the folder too); the level finds it by the hash +(`custom_edition_cache.c`), and a map downloaded is written under the level's +name, beside any other version. A file's hash is BLAKE2b's (32 bytes) of a label, its size and the BLAKE2b hashes of its pieces (256 KiB each). The menus show a map without its hash, unless two versions are listed. @@ -383,6 +386,14 @@ menus show a map without its hash, unless two versions are listed. its connections a 16 KiB block at a time, so that the game's own traffic keeps the rest of the upload; `network.map_seed = false` sends none. A player that has downloaded the map sends it on at once. +- **Web seeds.** A file of the download that the index of the maps has (by + its name and version, at the offer's size: `port/linux/src/map_downloads.c`) + is also asked of a web seed (`maps.web_seeds`, a folder of the maps on a + web server) over HTTPS, 16 pieces at a time (an HTTP range, on a thread of + its own), pieces no player has been asked for. Each is checked against + its hash as a player's is; one that is not the file's ends the web seed + for that file, and three failed asks for the download. Nothing of it goes + over the game's connections. Linux and Windows (`maps.downloads`). - **Internet play.** The players of an internet game reach its host alone. A player that shares answers the holders of the invite it joined with as its host does (`p2p_set_answering_players`), and a downloading client asks diff --git a/port/linux/README.md b/port/linux/README.md index 3c3f117735..d458065cb8 100644 --- a/port/linux/README.md +++ b/port/linux/README.md @@ -174,7 +174,8 @@ These files are in the data root: The settings are in `config.toml` next to the executable. Refer to "Settings". Internet play's MQTT brokers are in `brokers.txt` next to it -(`network.brokers_file`). +(`network.brokers_file`). The index of the Custom Edition maps is in +`map_index.txt` next to it (`maps.index`; refer to "Map downloads"). If the game stops because of a fatal signal, it writes the address and a backtrace to the standard error. To find the function at the address, enter @@ -398,6 +399,11 @@ the setting for one start of the game. It has priority over the file. | `network.map_seed` | `true` | `HALO_NET_MAP_SEED` | When you play in the game of another machine: help send its map to players who join without it. HELP SEND MAPS in Settings > Network Setup > Map Sharing. | | `network.map_seed_upload` | `256` | `HALO_NET_MAP_SEED_UPLOAD` | When you play in the game of another machine: the most kilobytes per second that the game sends of maps to other players (`16` to `65536`). UPLOAD LIMIT in Settings > Network Setup > Map Sharing. | | `network.map_download` | `true` | `HALO_NET_MAP_DOWNLOAD` | When you join a game on a Custom Edition map that you do not have: download it from the players of the game. `false`: leave the game and show which map is missing. DOWNLOAD MAPS in Settings > Network Setup > Map Sharing. | +| `maps.downloads` | `true` | `HALO_MAP_DOWNLOADS` | When the host does not send a Custom Edition map that you do not have: download it from the community's archives. `false`: never. Refer to "Map downloads". | +| `maps.download_screen` | `true` | `HALO_MAP_DOWNLOAD_SCREEN` | `true`: Halo's loading screen covers the menus while a map downloads (B stops the download). `false`: the menus stay up, and the status line of the games list shows the download. | +| `maps.archives` | `"halonet,halomaps"` | `HALO_MAP_ARCHIVES` | Linux and Windows. The archives that a missing map is taken from first, out of the zip that holds it, in this order: `halonet` (maps.halonet.net), `halomaps` (halomaps.org). Empty: none. | +| `maps.web_seeds` | `"https://halomaps.fractumseraph.net/maps/"` | `HALO_MAP_WEB_SEEDS` | Linux and Windows. The `https://` folders (with commas between them) that hold the maps under their file names: tried after the archives, and asked for pieces beside the players when map sharing downloads a map. Empty: none. | +| `maps.index` | `"map_index.txt"` | `HALO_MAP_INDEX` | The index of the Custom Edition maps that downloads are checked against: next to `config.toml`, unless a full path. | | `network.coop_public` | `false` | `HALO_NET_COOP_PUBLIC` | `true`: an online co-op game (Create Game > Internet, a SINGLEPLAYER map) starts as PUBLIC. `false`: it starts as PRIVATE. LISTING in co-op's Server Setup writes its choice here. Refer to "Server browser". | | `network.brokers_file` | `"brokers.txt"` | `HALO_NET_BROKERS_FILE` | The file of the public MQTT brokers that let the machines of an invite find each other, and that carry the listings of the server browser: next to `config.toml`, unless a full path. One `host:port` on each line, up to 4; `#` starts a comment. | | `network.stun_servers` | Google and Cloudflare | `HALO_NET_STUN` | The public STUN servers (`host:port`, with commas between them) that give the internet address of a machine. | @@ -792,14 +798,20 @@ UPLOAD LIMIT in Settings > Network Setup > Map Sharing). Set these lower on a slow connection. DOWNLOAD MAPS there (`network.map_download`) turns downloading off: you then leave a game whose map you do not have. -The name of each map in `custom_maps` ends with the start of its hash: when -the map lists find `hugeass.map`, the game renames it `hugeass_0e2b3ee4.map` -(and its picture and description). Thus two versions of a map have different -names, and a game always loads the version of the host. The menus show the +A game names each map in `custom_maps` with the start of its hash: when it +hosts `hugeass.map`, the game is on `hugeass_0e2b3ee4`. The game works the +hash out from the file, which keeps its name (no map is renamed), once: +it keeps the hash in `map_hashes.txt` in the save root until the file +changes. Thus two versions of a map have different names, and a game always +loads the version of the host. A downloaded map is written as `hugeass_0e2b3ee4.map`, +beside any other version you have, which stays as it is. The menus show the map without the hash, and with it only when you have two versions of the -map. The downloaded map has the same name. A download that stops leaves a +map. A download that stops leaves a `.part` file in `custom_maps`; the next download of that map continues from -it. Maps in the folder of a Halo Custom Edition install +it. When the index of the maps has the host's map (see "Map downloads"), a +web seed (`maps.web_seeds`) sends pieces of it too, beside the players: a +host with a slow upload does not hold the download up. Each piece is checked +against its hash, as a player's is. Maps in the folder of a Halo Custom Edition install (`paths.custom_edition`) keep their names, and the host does not share them. Copy a map to `custom_maps` to share it. @@ -809,6 +821,24 @@ its invite) as the host does, and a player who downloads connects to them in the same way that it connected to the host. Map sharing uses port 5153 for its connections. Refer to `NETCODE.md`, "Map sharing". +### Map downloads + +When a host does not send its map (SHARE MAPS off, or a build that names +its maps without their hash), the game downloads the map from the +community's archives: the zips of HaloNet's map repository and of HaloMaps +(`maps.archives`), else a web seed (`maps.web_seeds`). Halo's loading +screen shows the download, and B stops it. Each map is checked against the +index of the maps (`map_index.txt` next to the executable, `maps.index`) +before it is used, and is written as `_.map`, the name that map +sharing gives it, beside any other version: no map is replaced or renamed. + +When you join a game from the games list whose map is named without its +hash and you do not have it, the map is downloaded first, and the join goes +ahead once it is there. When a host declines to send its map after you join, you +leave the game, and you join again once the map is there. The Linux and +Windows builds download from the archives. Refer to +[docs/map_downloads.md](../../docs/map_downloads.md). + ### Security Only machines with the invite can find the game: diff --git a/port/linux/game/custom_edition_cache.c b/port/linux/game/custom_edition_cache.c index 1dc4159572..6f6f587874 100644 --- a/port/linux/game/custom_edition_cache.c +++ b/port/linux/game/custom_edition_cache.c @@ -211,8 +211,8 @@ static boolean maps_folder_has( /* The custom_maps folder's one map named _.map, for a name without the hash its file has: its file name (without the extension) in -`hashed` (MAP_PATH_SIZE characters). Maps there are named for their hash as -the map lists find them (map_share_name_map), so a level name of before (a +`hashed` (MAP_PATH_SIZE characters). Downloaded maps are named so, and +earlier builds renamed every map so, so a level name without the hash (a saved last map, a test's) still finds its map; FALSE if there are more. */ static boolean maps_folder_hashed_name( char const *name, @@ -258,9 +258,128 @@ static boolean maps_folder_hashed_name( return count == 1; } +/* a map file of the folder whose name starts with base (a name cut short +to fit a level name with its hash: map_share_level_name_hash) and whose +hash's digits are digits, into path */ +static boolean maps_folder_digits_find( + char const *folder, + char const *base, + char const *digits, + char *path) +{ + char pattern[MAP_PATH_SIZE]; + char found_digits[MAP_SHARE_NAME_DIGITS + 1]; + WIN32_FIND_DATAA data; + HANDLE find; + boolean found = FALSE; + + /* (no install: its folder not looked in, which would be made) */ + if ((folder == maps_folder(1) && !custom_edition_install_present()) || strchr(base, '*') || strchr(base, '?') || + strlen(folder) + strlen(base) + 2 + 4 >= MAP_PATH_SIZE) + { + return FALSE; + } + sprintf(pattern, "%s%s*%s", folder, base, MAP_FILE_EXTENSION); + find = FindFirstFileA(pattern, &data); + if (find == INVALID_HANDLE_VALUE) + return FALSE; + do + { + char file[sizeof(data.cFileName) + 1]; + size_t length; + + memcpy(file, data.cFileName, sizeof(data.cFileName)); + file[sizeof(data.cFileName)] = 0; + length = strlen(file); + if ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || length <= strlen(MAP_FILE_EXTENSION) || + length - strlen(MAP_FILE_EXTENSION) <= strlen(base)) + { + continue; + } + file[length - strlen(MAP_FILE_EXTENSION)] = 0; + if (!map_share_name_hashed(file) && map_share_name_digits(folder, file, found_digits) && + !_stricmp(found_digits, digits) && maps_folder_has(folder, file, MAP_FILE_EXTENSION, path)) + { + found = TRUE; + break; + } + } while (FindNextFileA(find, &data)); + CloseHandle(find); + + return found; +} + +/* the version of a map a network game's client plays when it is not the +one of the map's name: another version beside it in custom_maps, the +host's (_.map: custom_edition_cache_present), until the client +leaves (custom_edition_map_version_forget) */ +static struct +{ + char name[MAP_PATH_SIZE]; + char path[MAP_PATH_SIZE]; +} custom_edition_version; + +/* the checksum of a map file's header: its version; 0 if it is not a +Custom Edition cache */ +static unsigned long map_file_checksum( + char const *path); + +/* custom_maps' _.map of the version `checksum`, for a name +without the hash, into path: a version beside the map of its name (map +sharing's and the map downloads' name for one, map_downloads.c) */ +static boolean maps_folder_version( + char const *name, + unsigned long checksum, + char *path) +{ + char pattern[MAP_PATH_SIZE]; + WIN32_FIND_DATAA data; + HANDLE find; + boolean found = FALSE; + + if (!checksum || map_share_name_hashed(name) || strchr(name, '*') || strchr(name, '?') || + strlen(CUSTOM_EDITION_MAP_DIRECTORY) + strlen(name) + 1 + MAP_SHARE_NAME_DIGITS + 4 >= MAP_PATH_SIZE) + { + return FALSE; + } + sprintf(pattern, "%s%s_*%s", CUSTOM_EDITION_MAP_DIRECTORY, name, MAP_FILE_EXTENSION); + find = FindFirstFileA(pattern, &data); + if (find == INVALID_HANDLE_VALUE) + return FALSE; + do + { + char file[sizeof(data.cFileName) + 1]; + size_t length; + + memcpy(file, data.cFileName, sizeof(data.cFileName)); + file[sizeof(data.cFileName)] = 0; + length = strlen(file); + if ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || length <= strlen(MAP_FILE_EXTENSION)) + continue; + file[length - strlen(MAP_FILE_EXTENSION)] = 0; + if (!map_share_name_hashed(file) || (size_t)map_share_name_base_length(file) != strlen(name) || + _strnicmp(file, name, strlen(name)) || + !maps_folder_has(maps_folder(0), file, MAP_FILE_EXTENSION, path)) + { + continue; + } + if (map_file_checksum(path) == checksum) + { + found = TRUE; + break; + } + } while (FindNextFileA(find, &data)); + CloseHandle(find); + + return found; +} + /* the file that holds the map `map_name` names (a level name or a file name): \.map (custom_maps' _.map for -a name without the hash, if it has one map of that name) */ +a name without the hash, if it has one map of that name; for a name with +the hash, .map without it whose hash it is, as no map is renamed for +its hash: map_share_name_digits, or for a name cut short to fit the hash, +.map that starts with it) */ static boolean custom_edition_map_path( char const *map_name, char *path) @@ -269,6 +388,13 @@ static boolean custom_edition_map_path( char hashed[MAP_PATH_SIZE]; short folder; + /* (the host's version a client chose, for this game) */ + if (custom_edition_version.name[0] && !_stricmp(custom_edition_version.name, name) && + file_path_exists(custom_edition_version.path)) + { + strcpy(path, custom_edition_version.path); + return TRUE; + } for (folder = 0; folder < NUMBER_OF_MAPS_FOLDERS; folder++) { if (maps_folder_has(maps_folder(folder), name, MAP_FILE_EXTENSION, path)) @@ -276,6 +402,36 @@ static boolean custom_edition_map_path( return TRUE; } } + if (map_share_name_hashed(name)) + { + short base_length = map_share_name_base_length(name); + char digits[MAP_SHARE_NAME_DIGITS + 1]; + + if (base_length <= 0 || base_length >= MAP_PATH_SIZE) + return FALSE; + memcpy(hashed, name, (size_t)base_length); + hashed[base_length] = 0; + for (folder = 0; folder < NUMBER_OF_MAPS_FOLDERS; folder++) + { + if (maps_folder_has(maps_folder(folder), hashed, MAP_FILE_EXTENSION, path) && + map_share_name_digits(maps_folder(folder), hashed, digits) && + !_stricmp(digits, name + base_length + 1)) + { + return TRUE; + } + } + /* (a name cut short to fit the level name: map_share_level_name_hash) */ + if (base_length == CUSTOM_EDITION_MAXIMUM_LEVEL_NAME_LENGTH - (short)(sizeof(CUSTOM_EDITION_LEVEL_NAME_PREFIX) - 1) - + MAP_SHARE_NAME_DIGITS - 1) + { + for (folder = 0; folder < NUMBER_OF_MAPS_FOLDERS; folder++) + { + if (maps_folder_digits_find(maps_folder(folder), hashed, name + base_length + 1, path)) + return TRUE; + } + } + return FALSE; + } return maps_folder_hashed_name(name, hashed) && maps_folder_has(maps_folder(0), hashed, MAP_FILE_EXTENSION, path); @@ -682,6 +838,95 @@ boolean custom_edition_map_file_present( return custom_edition_map_path(map_name, path); } +static unsigned long map_file_checksum( + char const *path) +{ + struct custom_edition_file file; + struct cache_file_identity identity; + unsigned long checksum = 0; + + if (custom_edition_file_open(&file, path)) + { + if (cache_file_identify(&file.source, &identity) == _cache_file_status_ok && + identity.format == _cache_file_format_custom_edition_cache) + { + checksum = identity.checksum; + } + custom_edition_file_close(&file); + } + return checksum; +} + +void custom_edition_map_version_forget( + void) +{ + custom_edition_version.name[0] = 0; + custom_edition_version.path[0] = 0; +} + +/* a file name added to a tab-separated list (some maps' names have commas) */ +static void file_list_add( + char *names, + long names_size, + char const *name) +{ + size_t used = strlen(names); + + if (used + (used ? 1 : 0) + strlen(name) + 1 > (size_t)names_size) + return; + if (used) + names[used++] = '\t'; + strcpy(names + used, name); +} + +short custom_edition_cache_files_missing( + char const *level_name, + unsigned long checksum, + char *names, + long names_size) +{ + char const *name = tag_name_strip_path(level_name); + char path[MAP_PATH_SIZE]; + char file_name[MAP_PATH_SIZE]; + short count = 0; + short type; + + names[0] = 0; + if (!halo_custom_edition_tag_cache()) + return -1; + /* the map: absent, or another version (and none of the host's version + beside it) */ + if (!custom_edition_map_path(level_name, path) || (checksum && map_file_checksum(path) != checksum)) + { + if (!maps_folder_version(name, checksum, path)) + { + snprintf(file_name, sizeof(file_name), "%s%s", name, MAP_FILE_EXTENSION); + file_list_add(names, names_size, file_name); + count++; + } + } + /* the resource maps, in no maps folder */ + for (type = _resource_map_bitmaps; type < NUMBER_OF_RESOURCE_MAP_TYPES; type++) + { + char const *resource_name = resource_map_type_describe((enum resource_map_type)type); + short folder; + + for (folder = 0; folder < NUMBER_OF_MAPS_FOLDERS; folder++) + { + if (maps_folder_has(maps_folder(folder), resource_name, MAP_FILE_EXTENSION, path)) + break; + } + if (folder == NUMBER_OF_MAPS_FOLDERS) + { + snprintf(file_name, sizeof(file_name), "%s%s", resource_name, MAP_FILE_EXTENSION); + file_list_add(names, names_size, file_name); + count++; + } + } + + return count; +} + unsigned long custom_edition_map_checksum( char const *level_name) { @@ -718,6 +963,26 @@ boolean custom_edition_cache_present( short folder; short type; + /* (a version chosen for an earlier map of this game that is not this + one's: the host changed to another version) */ + if (custom_edition_version.name[0] && !_stricmp(custom_edition_version.name, name) && + map_file_checksum(custom_edition_version.path) != checksum) + { + custom_edition_map_version_forget(); + } + /* (a level named without the hash whose map under its name is another + version, or is not there to tell (two versions beside it, named for + their hashes): the host's beside it, if it has it, is played for this + game) */ + if (checksum && !map_share_name_hashed(name) && strlen(name) < MAP_PATH_SIZE && + (!custom_edition_map_path(level_name, path) || map_file_checksum(path) != checksum) && + maps_folder_version(name, checksum, path)) + { + strcpy(custom_edition_version.name, name); + strcpy(custom_edition_version.path, path); + error(_error_silent, "custom edition: %s is played as %s, the host's version (%08lX)", level_name, path, + checksum); + } if (!custom_edition_map_path(level_name, path)) { snprintf(message, message_size, "You don't have the map %.*s.map. If you have it, copy it into custom_maps.", diff --git a/port/linux/game/custom_edition_cache.h b/port/linux/game/custom_edition_cache.h index c2bfc3eb0c..3241299b97 100644 --- a/port/linux/game/custom_edition_cache.h +++ b/port/linux/game/custom_edition_cache.h @@ -86,9 +86,11 @@ cache. */ unsigned long custom_edition_map_checksum( char const *level_name); /* The file of the map `map_name` (a level name or a file name) in the -Custom Edition maps folders, into `path` (256 characters): the custom_maps -folder's map named for its hash (_.map, map_share.h) for a name -without it, if there is one map of that name. FALSE if none. */ +Custom Edition maps folders, into `path` (256 characters). A name with its +map's hash (_, map_share.h) finds _.map, or the +.map whose hash it is (maps are not renamed for their hash); a name +without it, the custom_maps folder's _.map if there is one map +of that name. FALSE if none. */ boolean custom_edition_map_file_path( char const *map_name, char *path); @@ -118,6 +120,25 @@ boolean custom_edition_cache_present( char *message, long message_size); +/* The files this machine lacks to play the level as a network game's +client (custom_edition_cache_present's conditions): its map, when absent, +not a Custom Edition cache or not the host's version (`checksum`; 0 for +any) with none of that version beside it, and each resource map absent, as +file names, tab-separated (".map\tbitmaps.map") in `names` +(`names_size` characters). Returns how many, 0 when nothing is missing, or +-1 when Custom Edition maps cannot run at all. The map downloads +(port/linux/src/map_downloads.c) fetch what is named. */ +short custom_edition_cache_files_missing( + char const *level_name, + unsigned long checksum, + char *names, + long names_size); +/* The map a network game's client plays is again the one of its name, not +the host's version beside it that custom_edition_cache_present chose (the +client gone: network_game_client_dispose). */ +void custom_edition_map_version_forget( + void); + /* Whether the file `file_name` (custom_maps\.map) is a Custom Edition cache of a campaign map (a solo scenario, played alone or as network co-op), or of a multiplayer map (custom_edition_maps.c). */ diff --git a/port/linux/game/custom_edition_maps.c b/port/linux/game/custom_edition_maps.c index 85253e5db0..3163a4cc13 100644 --- a/port/linux/game/custom_edition_maps.c +++ b/port/linux/game/custom_edition_maps.c @@ -15,10 +15,11 @@ A map's level name is custom_maps\ (CUSTOM_EDITION_LEVEL_NAME_PREFIX), which the cache loader reads from the custom maps folders alone: a map named as one of the game's own levels (a30.map, bloodgulch.map) is listed and played as itself. The game engine keeps 63 characters of a level name, so a -map whose name is longer than 51 is skipped. A map in the custom_maps folder -is named for its hash (_.map) once it has been found: a network -game's level name then says which version of the map it is on, and a player -without it can download it (map_share.h). The menus show the name without +map whose name is longer than 51 is skipped. A network game's level name +has the first digits of its map's hash after the name (custom_maps\_, +map_share.h), worked out from the file, which keeps its name: it then says +which version of the map the game is on, and a player without it can +download it (written as _.map). The menus show the name without the hash, unless two versions of a map are listed. Each map can have, beside it in its folder: @@ -389,7 +390,7 @@ static void custom_edition_map_add( csprintf(map->level_name, "%s%s", CUSTOM_EDITION_LEVEL_NAME_PREFIX, name); display_name_make(name, FALSE, map->display_name); custom_edition_map_description_read(map); - /* (named for its hash, renamed: map_share_files.c) */ + /* (its hash worked out, once, for a game's level name: map_share_files.c) */ if (!map_share_name_hashed(name)) map_share_name_map(folder, name); @@ -400,13 +401,25 @@ static int custom_edition_map_compare( void const *first, void const *second) { - return (int)csstrcasecmp( - ((struct custom_edition_map const *)first)->name, - ((struct custom_edition_map const *)second)->name); + char const *first_name = ((struct custom_edition_map const *)first)->name; + char const *second_name = ((struct custom_edition_map const *)second)->name; + short first_length = map_share_name_base_length(first_name); + short second_length = map_share_name_base_length(second_name); + int result; + + /* (by the name without its hash first, so that the versions of a map are + side by side: custom_edition_maps_tell_versions_apart) */ + result = _strnicmp(first_name, second_name, (size_t)MIN(first_length, second_length)); + if (result) + return result; + if (first_length != second_length) + return first_length < second_length ? -1 : 1; + return (int)csstrcasecmp(first_name, second_name); } /* Two versions of a map (its name the same but for its hash) listed: each -shown with its hash, to tell them apart. The maps are sorted by name. */ +shown with its hash, to tell them apart. The maps are sorted by their names +without the hash (custom_edition_map_compare), so versions are side by side. */ static void custom_edition_maps_tell_versions_apart( struct custom_edition_map *maps, short count) diff --git a/port/linux/game/download_screen.c b/port/linux/game/download_screen.c new file mode 100644 index 0000000000..c96fe5be85 --- /dev/null +++ b/port/linux/game/download_screen.c @@ -0,0 +1,173 @@ +/* +DOWNLOAD_SCREEN.C + +The screen a map's download shows over the menus: Halo's loading screen +(source/interface/progress_bar.c), its light sweeping from left to right as +the map comes (map_downloads.h: from the community's archives), with the map's name, how +the download goes and B to stop it under it, in the menus' fonts. The menus +behind it go on, so that the join waiting for the map follows once it is +there (menu_functions.c: map_fetch_update), but +they take no presses while it is up: B stops the download, and the join +with it. maps.download_screen = false leaves the menus up instead (the +games' list's status line says how the download goes). +*/ + +#include "cseries.h" +#include "cseries/cseries_windows.h" +#include "input/input.h" +#include "interface/event_manager.h" +#include "interface/progress_bar.h" +#include "interface/ui_widget.h" +#include "rasterizer/rasterizer.h" +#include "tag_files/tag_groups.h" +#include "text/draw_string.h" +#include "text/font_group.h" + +/* ---------- constants */ + +enum +{ + /* (event_manager.c's event type of a button, which it keeps to itself) */ + DOWNLOAD_EVENT_BUTTON = 3, + /* (draw_string.c's justifications, which it keeps to itself) */ + DOWNLOAD_TEXT_LEFT = 0, + DOWNLOAD_TEXT_CENTERED = 2, +}; + +/* ---------- prototypes */ + +/* port/linux/src (map_downloads.h, port_config.c) */ +int map_downloads_progress(float *fraction, char *name, int size); +int map_downloads_fetching(char *status, int size); +int config_boolean(char const *name); +/* menu_functions.c */ +void ui_widget_port_map_fetch_cancel(void); +/* ui_widget.c */ +boolean main_menu_is_active(void); + +/* ---------- globals */ + +static struct +{ + /* drawn last frame (the screen is let go of when it ends) */ + boolean shown; + /* the share done, as last drawn: the light never goes back */ + real progress; +} download_screen; + +/* ---------- private code */ + +/* a line of text centered at y in the menus' 640x480, in a menu font */ +static void download_screen_line( + char const *font, + short y, + real_argb_color const *color, + char const *text) +{ + rectangle2d bounds; + + bounds.x0 = 0; + bounds.x1 = 640; + bounds.y0 = y; + bounds.y1 = (short)(y + 40); + draw_string_set_draw_mode(tag_loaded(FONT_GROUP_TAG, font), NONE, DOWNLOAD_TEXT_CENTERED, 0, color); + rasterizer_draw_string(&bounds, NULL, NULL, 0, text); +} + +/* ---------- public code */ + +/* whether the screen is up: a map's download under way, at the menus */ +boolean download_screen_active( + void) +{ + float fraction; + char name[64]; + + return main_menu_is_active() && config_boolean("maps.download_screen") && + map_downloads_progress(&fraction, name, sizeof(name)); +} + +/* each frame the menus run while the screen is up (ui_widget.c's +process_ui_widgets): the presses are the screen's, and B stops the download */ +void download_screen_process( + void) +{ + struct event_record event; + + while (get_next_event(&event, NONE)) + { + if (event.type == DOWNLOAD_EVENT_BUTTON && event.data.button.index == _gamepad_analog_button_b) + { + ui_widget_port_map_fetch_cancel(); + break; + } + } + /* (the menus behind take nothing) */ + event_manager_flush(); +} + +/* each frame, after the menus are drawn (ui_widget.c's render_ui_widgets, +the first player's) */ +void download_screen_render( + void) +{ + real_argb_color const title_color = { 1.0f, 0.9f, 0.93f, 0.99f }; + real_argb_color const status_color = { 1.0f, 0.56f, 0.65f, 0.78f }; + real_argb_color const legend_color = { 1.0f, 1.0f, 1.0f, 1.0f }; + float fraction; + char name[64]; + char text[256]; + real progress; + rectangle2d bounds; + short index; + + /* (nothing drawn without a renderer, debug.null_renderer: the menus' + high-res button icons, which the legend draws, need OpenGL; B still + stops the download, download_screen_process) */ + if (!download_screen_active() || config_boolean("debug.null_renderer") || + !map_downloads_progress(&fraction, name, sizeof(name))) + { + if (download_screen.shown) + { + download_screen.shown = FALSE; + progress_bar_download_end(); + } + return; + } + if (!download_screen.shown) + { + download_screen.shown = TRUE; + download_screen.progress = 0.0f; + } + /* (the screen draws from a share above 0, and only forward: a share + falls back as the next file's size is learned) */ + progress = PIN(fraction, 0.001f, 1.0f); + if (progress < download_screen.progress) + progress = download_screen.progress; + download_screen.progress = progress; + progress_bar_download_display(progress); + + snprintf(text, sizeof(text), "DOWNLOADING %s", name); + for (index = 0; text[index]; index++) + { + if (text[index] >= 'a' && text[index] <= 'z') + text[index] = (char)(text[index] - 'a' + 'A'); + } + download_screen_line("ui\\large_ui", 300, &title_color, text); + /* (the status line's numbers: "Downloading : " is the title's) */ + if (map_downloads_fetching(text, sizeof(text))) + { + char const *numbers = strstr(text, ": "); + + download_screen_line("ui\\small_ui", 334, &status_color, numbers ? numbers + 2 : text); + } + /* (the B button's icon, as the menus' legends draw it: from the left, as + the icon and the words after it are each placed after the one before) */ + bounds.x0 = 290; + bounds.x1 = 640; + bounds.y0 = 362; + bounds.y1 = 402; + draw_string_set_draw_mode(tag_loaded(FONT_GROUP_TAG, "ui\\small_ui"), NONE, DOWNLOAD_TEXT_LEFT, 0, + &legend_color); + draw_string_and_hack_in_icons(&bounds, NULL, NULL, 0, L"%b-button=STOP", FALSE); +} diff --git a/port/linux/game/map_share.c b/port/linux/game/map_share.c index 505da4fc02..1bd18f8a1c 100644 --- a/port/linux/game/map_share.c +++ b/port/linux/game/map_share.c @@ -64,6 +64,7 @@ done. The host does not drop a machine that says it is downloading. #include "custom_edition_maps.h" #include "map_share.h" #include "../src/p2p.h" +#include "../src/map_downloads.h" #include #include @@ -133,6 +134,17 @@ enum RATE_WINDOW = 2000, LOG_INTERVAL = 10000, + /* the pieces asked of a web seed at once (4 MiB), and the failed asks + after which none is asked again this download */ + WEB_SEED_PIECES = 16, + WEB_SEED_FAILURES = 3, + /* milliseconds before asking again after a failed ask, or one that + could not start (another fetch under way) */ + WEB_SEED_RETRY_INTERVAL = 5000, + WEB_SEED_START_RETRY_INTERVAL = 1000, + /* a web seed's URL (maps.web_seeds' folder and the file's name) */ + WEB_SEED_URL_BYTES = 1024, + /* the largest file of each kind the cache loader takes (custom_edition_cache.c's combined offset space), so that a host cannot have its players fill their disks */ @@ -327,6 +339,11 @@ struct download_file char part_path[MAP_SHARE_PATH_SIZE]; char final_path[MAP_SHARE_PATH_SIZE]; FILE *stream; + /* the file on a web seed (the index's file of its name, version and + size: port/linux/src/map_downloads.c), "" for none; and whether it sent + a piece that is not this file's */ + char web_url[WEB_SEED_URL_BYTES]; + boolean web_off; }; /* a machine the host named */ @@ -374,6 +391,16 @@ struct download unsigned long last_window_bytes; unsigned long last_window_time; unsigned long logged_at; + /* the pieces asked of the web seed: whether any are, the file's, the + first and how many (a run of them); the asks failed, and the bytes it + brought */ + boolean web_active; + short web_file; + long web_first; + long web_count; + short web_failures; + unsigned long web_bytes; + unsigned long web_retry_at; }; /* a piece asked of a connection */ @@ -1106,6 +1133,8 @@ static void listener_update( static void download_report( byte state); +static void download_web_seeds_find( + char const *name); static void request_remove( struct connection *connection, short index); @@ -1140,6 +1169,8 @@ static void download_end( for (file = 0; file < MAXIMUM_FILES; file++) connection->download_file[file] = NONE; } + if (download->web_active) + map_downloads_range_stop(); for (index = 0; index < download->file_count; index++) { struct download_file *file = &download->files[index]; @@ -1365,14 +1396,22 @@ static void download_offered( if (download->state != _download_asking || csstrcmp(offer->level_name, download->level_name)) return; - if (offer->result == _offer_off) - { - download_fail("The host does not share its maps."); - return; - } if (offer->result != _offer_ok || !offer->file_count || offer->file_count > MAXIMUM_FILES) { - download_fail("The host cannot share this map."); + char files[256]; + + /* (from the community's archives instead, when the index of the maps + has it: port/linux/src/map_downloads.c; the player joins again once + it is there) */ + if (custom_edition_cache_files_missing(download->level_name, download->version, files, sizeof(files)) > 0 && + map_downloads_fetch(download->level_name, download->version, files)) + { + download_fail("The host does not send this map, so it is being downloaded from the map archives " + "(Join Game shows how it goes). Join again when it is there."); + return; + } + download_fail(offer->result == _offer_off ? "The host does not share its maps." : + "The host cannot share this map."); return; } download->in_progress = TEST_FLAG(offer->flags, _offer_in_progress_bit); @@ -1425,6 +1464,7 @@ static void download_offered( /* (the hashes come first: no piece can be checked without them) */ for (index = 0; index < download->file_count; index++) download->files[index].state = _file_awaiting_hashes; + download_web_seeds_find(name); download->state = _download_transferring; download->progress_at = system_milliseconds(); error(_error_silent, "map sharing: downloading %s, %d files, %lu bytes", download->level_name, @@ -2520,6 +2560,168 @@ static void connections_update( /* ---------- the client's download, each frame */ +/* ---------- the web seeds + +A web seed (maps.web_seeds: a folder of the maps by file name, on a web +server) is one more source of the pieces, beside the players: a file of +the download that the index of the maps has (its name and version, and +the offer's size: port/linux/src/map_downloads.c) is asked of it a run of +pieces at a time (an HTTP range, on a thread of its own), pieces no player +has been asked for, and each piece is checked against its hash as a +player's is. One that is not the file's is the end of the web seed for +that file. None on Android and the web (no HTTPS there), or with +maps.downloads off. */ + +/* each file's web seed, once the offer is known (name: the level's map +file, without .map) */ +static void download_web_seeds_find( + char const *name) +{ + struct download *download = &map_share_globals.download; + short index; + + for (index = 0; index < download->file_count; index++) + { + struct download_file *file = &download->files[index]; + char file_name[MAP_SHARE_PATH_SIZE]; + + file->web_url[0] = 0; + if (file->kind == _map_share_file_map) + csprintf(file_name, "%s.map", name); + else + csprintf(file_name, "%s.map", resource_map_type_describe((enum resource_map_type)file->kind)); + if (map_downloads_web_seed(file_name, file->kind == _map_share_file_map ? download->version : 0, file->size, + 0, file->web_url, sizeof(file->web_url))) + { + error(_error_silent, "map sharing: %s comes from the web seed too (%s)", file_name, file->web_url); + } + } +} + +/* the web seed's pieces, as they come (each checked), and the next run of +them asked for */ +static void download_web_seed_update( + void) +{ + struct download *download = &map_share_globals.download; + char reason[192]; + short index; + + if (download->web_active) + { + struct download_file *file = &download->files[download->web_file]; + int state = map_downloads_range_poll(reason, sizeof(reason)); + long piece; + + if (state == 1) + return; + download->web_active = FALSE; + if (state == 2) + { + byte *buffer = malloc(MAP_SHARE_PIECE_BYTES); + + for (piece = download->web_first; buffer && piece < download->web_first + download->web_count; piece++) + { + unsigned long offset = (unsigned long)(piece - download->web_first) * MAP_SHARE_PIECE_BYTES; + unsigned long bytes = MIN(MAP_SHARE_PIECE_BYTES, file->size - (unsigned long)piece * MAP_SHARE_PIECE_BYTES); + byte hash[MAP_SHARE_HASH_BYTES]; + + if (file->have[piece >> 3] & (1 << (piece & 7))) + continue; + if (!map_downloads_range_read(offset, buffer, bytes)) + { + download->web_failures++; + download->web_retry_at = system_milliseconds() + WEB_SEED_RETRY_INTERVAL; + break; + } + p2p_blake2b_256(buffer, bytes, hash); + if (csmemcmp(hash, file->piece_hashes + piece * MAP_SHARE_HASH_BYTES, MAP_SHARE_HASH_BYTES)) + { + error(_error_silent, "map sharing: the web seed's piece %ld of %s is not the map's: not asked again", + piece, file->final_path); + file->web_off = TRUE; + break; + } + download->web_bytes += bytes; + download_piece_had(download->web_file, piece, buffer); + /* (the download may have ended: a file that could not be + written) */ + if (download->state != _download_transferring) + { + free(buffer); + map_downloads_range_stop(); + return; + } + } + free(buffer); + } + else + { + download->web_failures++; + download->web_retry_at = system_milliseconds() + WEB_SEED_RETRY_INTERVAL; + error(_error_silent, "map sharing: the web seed did not send pieces %ld to %ld of %s: %s", + download->web_first, download->web_first + download->web_count - 1, file->final_path, reason); + } + for (piece = download->web_first; piece < download->web_first + download->web_count; piece++) + { + if (file->asked[piece]) + file->asked[piece]--; + } + map_downloads_range_stop(); + } + if (download->web_failures >= WEB_SEED_FAILURES || + (download->web_retry_at && (long)(system_milliseconds() - download->web_retry_at) < 0)) + { + return; + } + /* the next run: the first pieces no one has been asked for, of a file + whose pieces' hashes are known */ + for (index = 0; index < download->file_count; index++) + { + struct download_file *file = &download->files[index]; + long first; + long count; + + if (file->state != _file_transferring || !file->piece_hashes || !file->web_url[0] || file->web_off) + continue; + for (first = 0; first < file->piece_count; first++) + { + if (!(file->have[first >> 3] & (1 << (first & 7))) && !file->asked[first]) + break; + } + if (first == file->piece_count) + continue; + for (count = 1; count < WEB_SEED_PIECES && first + count < file->piece_count; count++) + { + long piece = first + count; + + if ((file->have[piece >> 3] & (1 << (piece & 7))) || file->asked[piece]) + break; + } + /* (a fetch stopped may still be ending, or the archives' under way: + asked again in a moment) */ + if (!map_downloads_range_start(file->web_url, (unsigned long long)first * MAP_SHARE_PIECE_BYTES, + MIN((unsigned long)count * MAP_SHARE_PIECE_BYTES, file->size - (unsigned long)first * MAP_SHARE_PIECE_BYTES))) + { + download->web_retry_at = system_milliseconds() + WEB_SEED_START_RETRY_INTERVAL; + return; + } + for (count = 0; count < WEB_SEED_PIECES && first + count < file->piece_count; count++) + { + long piece = first + count; + + if ((file->have[piece >> 3] & (1 << (piece & 7))) || (count && file->asked[piece])) + break; + file->asked[piece]++; + } + download->web_active = TRUE; + download->web_file = index; + download->web_first = first; + download->web_count = count; + return; + } +} + static void download_update( void) { @@ -2605,6 +2807,9 @@ static void download_update( return; } download_reach_sources(); + download_web_seed_update(); + if (download->state != _download_transferring) + return; if (elapsed(download->reported_at, now, PROGRESS_INTERVAL)) download_report(_progress_downloading); if (elapsed(download->logged_at, now, LOG_INTERVAL)) @@ -2617,9 +2822,10 @@ static void download_update( map_share_globals.connections[index].state == _connection_open; } download->logged_at = now; - error(_error_silent, "map sharing: %lu of %lu bytes, %d connections, %lu bytes a second", + error(_error_silent, "map sharing: %lu of %lu bytes, %d connections, %lu bytes a second (%lu from the web seed)", download->done_bytes, download->total_bytes, (int)connections, - download->last_window_time ? download->last_window_bytes * 1000 / download->last_window_time : 0); + download->last_window_time ? download->last_window_bytes * 1000 / download->last_window_time : 0, + download->web_bytes); } if (elapsed(download->window_at, now, RATE_WINDOW)) { diff --git a/port/linux/game/map_share.h b/port/linux/game/map_share.h index 6c26df8d7a..02e0af4da4 100644 --- a/port/linux/game/map_share.h +++ b/port/linux/game/map_share.h @@ -61,19 +61,25 @@ short map_share_name_base_length( /* The map lists found the map file .map, a Custom Edition map, whose name is not its hash's: in the custom_maps folder it is hashed, -on a thread of its own, and renamed _.map, with its picture and -description beside it (.bmp, .txt); the map lists are scanned -again once it has been (custom_edition_maps_look_again). Not while the map -is loaded (a file in use is not renamed on Windows): it is asked for again. */ +on a thread of its own, and the digits it is named by remembered while the +file stays the same. No file is renamed (map_share_name_digits). */ void map_share_name_map( char const *folder, char const *name); +/* The digits of the hash the map file .map is named by (a +level of it is custom_maps\_), into digits +(MAP_SHARE_NAME_DIGITS + 1 characters): remembered, or hashed now (a +fraction of a second); FALSE if it cannot be read. */ +boolean map_share_name_digits( + char const *folder, + char const *name, + char *digits); /* A host's game is on the level `level_name` (a buffer of `size`): a Custom Edition map's named without its hash (custom_maps\hugeass, a saved -last map's or a test's) is named with it (custom_maps\hugeass_1a2b3c4d), the -map's file renamed for its hash first if it has not been yet, so that the -players can download it (network_server_manager.c). */ +last map's or a test's) is named with it (custom_maps\hugeass_1a2b3c4d), its +file hashed where it is and never renamed, so that the players can download +it (network_server_manager.c). */ void map_share_level_name_hash( char *level_name, long size); diff --git a/port/linux/game/map_share_files.c b/port/linux/game/map_share_files.c index ff299483f0..336c8c0fa7 100644 --- a/port/linux/game/map_share_files.c +++ b/port/linux/game/map_share_files.c @@ -44,10 +44,12 @@ enum /* the files hashed for sharing at once: a game's map and its three resource maps, a download's, and the last few games' */ MAXIMUM_SHARE_FILES = 16, - /* the maps waiting to be named, and those named or given up on this - run (not looked at again) */ + /* the maps waiting to be hashed for their names, and those hashed or + given up on (not hashed again while their files stay the same; those + hashed kept in NAMED_FILE for the next runs) */ MAXIMUM_NAMING_QUEUE = 64, - MAXIMUM_NAMED = 1024, + /* (every map the map lists hold) */ + MAXIMUM_NAMED = CUSTOM_EDITION_MAPS_MAXIMUM, /* the longest map file name the map lists take (custom_edition_maps.c: the level name, custom_maps\ and it, kept whole by the game engine) */ MAXIMUM_MAP_NAME_LENGTH = CUSTOM_EDITION_MAXIMUM_LEVEL_NAME_LENGTH - (sizeof(CUSTOM_EDITION_LEVEL_NAME_PREFIX) - 1), @@ -56,6 +58,13 @@ enum MAXIMUM_FILE_BYTES = 0x7FFFFFFF, }; +/* the maps hashed for their names, kept from one run to the next (in the +save root: a line a file, its naming_key, size, time and digits, in hexadecimal +and decimal), so that a map is hashed once as long as its file stays the +same, as when the maps were renamed for their hash */ +#define NAMED_FILE "z:\\map_hashes.txt" +#define NAMED_FILE_FORMAT "# OpenCE map hashes 1" + /* what a hash is of: these bytes, the file's size (4 bytes, little-endian) and its pieces' hashes */ static char const file_hash_label[] = "OpenCE map 1"; @@ -90,6 +99,22 @@ struct naming { char folder[MAP_SHARE_PATH_SIZE]; char name[MAP_SHARE_PATH_SIZE]; + /* the file's size and time before it was hashed: its digits are kept + only if they are the same after (a file being copied over is hashed + again once it is whole) */ + unsigned long size; + unsigned long modified; +}; + +/* a map file hashed for its name: by its folder and name (naming_key), its +size and when it was written then, and the digits it is named by (none: +it could not be read) */ +struct named +{ + unsigned long key; + unsigned long size; + unsigned long modified; + char digits[MAP_SHARE_NAME_DIGITS + 1]; }; struct map_share_files_globals @@ -110,7 +135,13 @@ struct map_share_files_globals short naming_count; struct naming naming_queue[MAXIMUM_NAMING_QUEUE]; long named_count; - unsigned long named_hashes[MAXIMUM_NAMED]; + struct named named[MAXIMUM_NAMED]; + boolean named_loaded; + /* digits worked out since NAMED_FILE was written */ + boolean named_dirty; + /* a map the queue had no room for: the map lists offer theirs again + once it is empty */ + boolean naming_overflowed; /* the pieces asked for, and what was found for their owner */ boolean pieces_wanted; @@ -457,27 +488,149 @@ static unsigned long naming_key( return key; } -static boolean naming_known( - unsigned long key) +/* the maps hashed in earlier runs (NAMED_FILE), once */ +static void named_load( + void) { struct map_share_files_globals *globals = &map_share_files_globals; + char line[128]; + FILE *stream; + + if (globals->named_loaded) + return; + globals->named_loaded = TRUE; + stream = fopen(NAMED_FILE, "rb"); + if (!stream) + return; + if (fgets(line, sizeof(line), stream) && !csstrncmp(line, NAMED_FILE_FORMAT, csstrlen(NAMED_FILE_FORMAT))) + { + while (globals->named_count < MAXIMUM_NAMED && fgets(line, sizeof(line), stream)) + { + struct named *named = &globals->named[globals->named_count]; + char digits[16]; + short index; + + csmemset(named, 0, sizeof(*named)); + if (sscanf(line, "%lx %lu %lu %15s", &named->key, &named->size, &named->modified, digits) != 4 || + csstrlen(digits) != MAP_SHARE_NAME_DIGITS) + { + continue; + } + for (index = 0; index < MAP_SHARE_NAME_DIGITS; index++) + { + if (!((digits[index] >= '0' && digits[index] <= '9') || (digits[index] >= 'a' && digits[index] <= 'f'))) + break; + } + if (index < MAP_SHARE_NAME_DIGITS) + continue; + csstrcpy(named->digits, digits); + globals->named_count++; + } + } + fclose(stream); +} + +/* the maps hashed kept for the next runs (NAMED_FILE): those given up on +are tried again then */ +static void named_save( + void) +{ + struct map_share_files_globals *globals = &map_share_files_globals; + FILE *stream = fopen(NAMED_FILE, "wb"); long index; + if (!stream) + return; + fprintf(stream, "%s\n", NAMED_FILE_FORMAT); for (index = 0; index < globals->named_count; index++) { - if (globals->named_hashes[index] == key) - return TRUE; + struct named const *named = &globals->named[index]; + + if (named->digits[0]) + fprintf(stream, "%08lx %lu %lu %s\n", named->key, named->size, named->modified, named->digits); } - return FALSE; + fclose(stream); } +/* the map file's entry, if it was hashed (or given up on) as it is now +(its size and time the same) */ +static struct named *naming_find( + char const *folder, + char const *name) +{ + struct map_share_files_globals *globals = &map_share_files_globals; + unsigned long key = naming_key(folder, name); + char path[MAP_SHARE_PATH_SIZE]; + unsigned long size, modified; + long index; + + named_load(); + if (csstrlen(folder) + csstrlen(name) + 4 >= MAP_SHARE_PATH_SIZE) + return NULL; + csprintf(path, "%s%s.map", folder, name); + if (!file_stamp(path, &size, &modified)) + return NULL; + for (index = 0; index < globals->named_count; index++) + { + struct named *named = &globals->named[index]; + + if (named->key == key && named->size == size && named->modified == modified) + return named; + } + return NULL; +} + +/* the hash's digits of the map file .map remembered (none: +it could not be read), as the file was when hashed (size, modified): its +entry of before (another version) replaced */ static void naming_remember( - unsigned long key) + char const *folder, + char const *name, + unsigned long size, + unsigned long modified, + char const *digits) { struct map_share_files_globals *globals = &map_share_files_globals; + unsigned long key = naming_key(folder, name); + struct named *named = NULL; + long index; - if (globals->named_count < MAXIMUM_NAMED) - globals->named_hashes[globals->named_count++] = key; + named_load(); + for (index = 0; index < globals->named_count && !named; index++) + { + if (globals->named[index].key == key) + named = &globals->named[index]; + } + if (!named) + { + /* (when full, the oldest goes) */ + if (globals->named_count == MAXIMUM_NAMED) + { + csmemmove(&globals->named[0], &globals->named[1], (MAXIMUM_NAMED - 1) * sizeof(globals->named[0])); + globals->named_count--; + } + named = &globals->named[globals->named_count++]; + csmemset(named, 0, sizeof(*named)); + named->key = key; + } + named->size = size; + named->modified = modified; + csstrncpy(named->digits, digits, MAP_SHARE_NAME_DIGITS); + named->digits[MAP_SHARE_NAME_DIGITS] = 0; + if (named->digits[0]) + globals->named_dirty = TRUE; +} + +/* the naming's file's size and time now, into it; FALSE if it is not there */ +static boolean naming_stamp( + struct naming *naming) +{ + char path[MAP_SHARE_PATH_SIZE]; + + if (csstrlen(naming->folder) + csstrlen(naming->name) + 4 >= MAP_SHARE_PATH_SIZE) + return FALSE; + csprintf(path, "%s%s.map", naming->folder, naming->name); + return file_stamp(path, &naming->size, &naming->modified); } void map_share_name_map( @@ -485,13 +638,15 @@ void map_share_name_map( char const *name) { struct map_share_files_globals *globals = &map_share_files_globals; - unsigned long key = naming_key(folder, name); short index; - /* (the custom_maps folder's alone: an install of Custom Edition is - left as it is, for Custom Edition) */ - if (csstrcasecmp(folder, CUSTOM_EDITION_MAP_DIRECTORY) || map_share_name_hashed(name) || naming_known(key)) + /* (the maps folders': a game's level name finds an install of Custom + Edition's maps by their hash too, though they are not shared) */ + if ((csstrcasecmp(folder, CUSTOM_EDITION_MAP_DIRECTORY) && csstrcasecmp(folder, CUSTOM_EDITION_INSTALL_MAP_DIRECTORY)) || + map_share_name_hashed(name) || naming_find(folder, name)) + { return; + } for (index = 0; index < globals->naming_count; index++) { if (!csstrcasecmp(globals->naming_queue[index].name, name) && @@ -506,116 +661,123 @@ void map_share_name_map( return; } if (globals->naming_count == MAXIMUM_NAMING_QUEUE) + { + globals->naming_overflowed = TRUE; return; + } + csmemset(&globals->naming_queue[globals->naming_count], 0, sizeof(globals->naming_queue[0])); csstrncpy(globals->naming_queue[globals->naming_count].folder, folder, MAP_SHARE_PATH_SIZE - 1); csstrncpy(globals->naming_queue[globals->naming_count].name, name, MAP_SHARE_PATH_SIZE - 1); - globals->naming_count++; -} - -/* renamed , if it is there -and that is not */ -static boolean rename_beside( - char const *folder, - char const *from, - char const *to, - char const *extension) -{ - char from_path[MAP_SHARE_PATH_SIZE]; - char to_path[MAP_SHARE_PATH_SIZE]; - - if (csstrlen(folder) + csstrlen(from) + csstrlen(extension) >= MAP_SHARE_PATH_SIZE || - csstrlen(folder) + csstrlen(to) + csstrlen(extension) >= MAP_SHARE_PATH_SIZE) - { - return FALSE; - } - csprintf(from_path, "%s%s%s", folder, from, extension); - csprintf(to_path, "%s%s%s", folder, to, extension); - return MoveFileA(from_path, to_path) != 0; + if (naming_stamp(&globals->naming_queue[globals->naming_count])) + globals->naming_count++; } -/* a map hashed: renamed _.map (the name cut short to fit the -map lists), with its picture and description */ +/* a map hashed: the digits it is named by remembered (its file is not +renamed: a player's maps are theirs, and other programs use them) */ static void naming_finish( struct naming const *naming, struct hash_job const *job) { char digits[MAP_SHARE_NAME_DIGITS + 1]; - char hashed[MAP_SHARE_PATH_SIZE]; - char path[MAP_SHARE_PATH_SIZE]; - short base_length = (short)csstrlen(naming->name); - char const *loaded = custom_edition_cache_loaded_path(); + struct naming now = *naming; - csprintf(path, "%s%s.map", naming->folder, naming->name); - /* (in use: named another time) */ - if (loaded && !csstrcasecmp(loaded, path)) - return; - naming_remember(naming_key(naming->folder, naming->name)); if (job->failed) { - error(_error_silent, "map sharing: '%s' could not be read to name it for its hash", path); + error(_error_silent, "map sharing: '%s%s.map' could not be read to name it for its hash", naming->folder, + naming->name); + naming_remember(naming->folder, naming->name, naming->size, naming->modified, ""); return; } - map_share_hash_digits(job->hash, digits); - base_length = (short)MIN(base_length, MAXIMUM_MAP_NAME_LENGTH - MAP_SHARE_NAME_DIGITS - 1); - csmemcpy(hashed, naming->name, base_length); - csprintf(hashed + base_length, "_%s", digits); - if (!rename_beside(naming->folder, naming->name, hashed, ".map")) + /* (changed while it was hashed: hashed again when it is next asked for) */ + if (!naming_stamp(&now) || now.size != naming->size || now.modified != naming->modified) { - error(_error_silent, "map sharing: '%s' was not renamed %s.map (that file exists, or this one is in use)", - path, hashed); + error(_error_silent, "map sharing: '%s%s.map' changed while it was hashed", naming->folder, naming->name); return; } - rename_beside(naming->folder, naming->name, hashed, ".bmp"); - rename_beside(naming->folder, naming->name, hashed, ".txt"); - error(_error_silent, "map sharing: %s.map is now %s.map, named for its hash", naming->name, hashed); - custom_edition_maps_look_again(); + map_share_hash_digits(job->hash, digits); + naming_remember(naming->folder, naming->name, naming->size, naming->modified, digits); +} + +boolean map_share_name_digits( + char const *folder, + char const *name, + char *digits) +{ + struct named *named = naming_find(folder, name); + struct naming naming; + struct hash_job job; + + if (!named) + { + /* (hashed here: a map's hash takes a fraction of a second) */ + if (csstrlen(folder) + csstrlen(name) + 4 >= MAP_SHARE_PATH_SIZE) + return FALSE; + csmemset(&naming, 0, sizeof(naming)); + csmemset(&job, 0, sizeof(job)); + csstrncpy(naming.folder, folder, sizeof(naming.folder) - 1); + csstrncpy(naming.name, name, sizeof(naming.name) - 1); + if (!naming_stamp(&naming)) + return FALSE; + csprintf(job.path, "%s%s.map", folder, name); + hash_job_run(&job); + naming_finish(&naming, &job); + free(job.piece_hashes); + named = naming_find(folder, name); + } + if (!named || !named->digits[0]) + return FALSE; + csstrcpy(digits, named->digits); + return TRUE; } void map_share_level_name_hash( char *level_name, long size) { - struct naming naming; - struct hash_job job; char path[MAP_SHARE_PATH_SIZE]; + char file[MAP_SHARE_PATH_SIZE]; + char digits[MAP_SHARE_NAME_DIGITS + 1]; char const *name; - char const *hashed; + size_t length; if (!level_name || !custom_edition_level_name(level_name)) return; name = tag_name_strip_path(level_name); if (map_share_name_hashed(name) || !custom_edition_map_file_path(level_name, path)) return; - /* (the file's own name, which may have its hash already) */ - hashed = tag_name_strip_path(path); + /* (the custom_maps folder's alone: an install of Custom Edition's maps + are not shared) */ if (_strnicmp(path, CUSTOM_EDITION_MAP_DIRECTORY, csstrlen(CUSTOM_EDITION_MAP_DIRECTORY)) || strchr(path + csstrlen(CUSTOM_EDITION_MAP_DIRECTORY), '\\')) { return; } - if (!map_share_name_hashed(name) && csstrlen(hashed) > 4 && csstrlen(hashed) - 4 == csstrlen(name) && - !_strnicmp(hashed, name, csstrlen(name))) + /* the file's own name, which may have its hash already (a map downloaded, + or renamed by an earlier build) */ + length = csstrlen(path + csstrlen(CUSTOM_EDITION_MAP_DIRECTORY)); + if (length <= 4 || length - 4 >= sizeof(file)) + return; + csprintf(file, "%.*s", (int)(length - 4), path + csstrlen(CUSTOM_EDITION_MAP_DIRECTORY)); + if (map_share_name_hashed(file)) { - /* named now: hashed here (a map's hash takes a fraction of a second - to work out) and renamed, unless it is loaded */ - csmemset(&naming, 0, sizeof(naming)); - csmemset(&job, 0, sizeof(job)); - csstrncpy(naming.folder, CUSTOM_EDITION_MAP_DIRECTORY, sizeof(naming.folder) - 1); - csstrncpy(naming.name, name, sizeof(naming.name) - 1); - csstrncpy(job.path, path, sizeof(job.path) - 1); - hash_job_run(&job); - naming_finish(&naming, &job); - free(job.piece_hashes); - if (!custom_edition_map_file_path(level_name, path)) + if (csstrlen(CUSTOM_EDITION_LEVEL_NAME_PREFIX) + csstrlen(file) < (unsigned long)size) + csprintf(level_name, "%s%s", CUSTOM_EDITION_LEVEL_NAME_PREFIX, file); + } + else + { + /* named for its hash, the file as it is (custom_edition_cache.c finds + .map for _ by the hash); a name too long to be kept + whole with the hash cut short to fit, as the maps were renamed before + (custom_edition_cache.c finds the file whose name starts so) */ + short base_length = (short)MIN(csstrlen(file), MAXIMUM_MAP_NAME_LENGTH - MAP_SHARE_NAME_DIGITS - 1); + + if (csstrlen(CUSTOM_EDITION_LEVEL_NAME_PREFIX) + base_length + 1 + MAP_SHARE_NAME_DIGITS >= (unsigned long)size || + !map_share_name_digits(CUSTOM_EDITION_MAP_DIRECTORY, file, digits)) + { return; - hashed = tag_name_strip_path(path); + } + csprintf(level_name, "%s%.*s_%s", CUSTOM_EDITION_LEVEL_NAME_PREFIX, (int)base_length, file, digits); } - /* the level name of the file found: custom_maps\_ */ - if (csstrlen(hashed) <= 4 || csstrlen(CUSTOM_EDITION_LEVEL_NAME_PREFIX) + csstrlen(hashed) - 4 >= (unsigned long)size) - return; - csprintf(level_name, "%s%.*s", CUSTOM_EDITION_LEVEL_NAME_PREFIX, (int)(csstrlen(hashed) - 4), hashed); - if (!map_share_name_hashed(tag_name_strip_path(level_name))) - return; error(_error_silent, "map sharing: the game's map is %s", level_name); } @@ -627,6 +789,22 @@ void map_share_files_update( struct map_share_files_globals *globals = &map_share_files_globals; short index; + /* (the maps hashed kept once no more are waiting, not after each; and + the map lists asked for the maps there was no room for) */ + if (!globals->naming_count && globals->job_type != _hash_job_name) + { + if (globals->named_dirty) + { + named_save(); + globals->named_dirty = FALSE; + } + if (globals->naming_overflowed) + { + globals->naming_overflowed = FALSE; + custom_edition_maps_look_again(); + } + } + if (globals->thread) { if (!thread_has_exited(globals->thread)) diff --git a/port/linux/game/menu_functions.c b/port/linux/game/menu_functions.c index 8bf724b8d4..62f7904246 100644 --- a/port/linux/game/menu_functions.c +++ b/port/linux/game/menu_functions.c @@ -81,6 +81,8 @@ their handlers open opens. #include "halo_menus.h" #include "custom_edition_cache.h" #include "custom_edition_maps.h" +#include "map_share.h" +#include "tag_files/tag_files.h" #include "network_voice.h" #include "text/draw_string.h" /* (internet play's server browser: the platform layer's) */ @@ -2274,6 +2276,22 @@ void platform_clipboard_set(char const *text); void platform_text_field(int typing, int password); int config_boolean(char const *name); void ui_widget_port_post_button(short controller_index, short button_index); +/* the map downloads (port/linux/src/map_downloads.c) */ +int map_downloads_fetch(char const *level_name, unsigned long version, char const *files); +int map_downloads_fetching(char *status, int size); +int map_downloads_take_ready(char *level_name, int size); +void map_downloads_cancel(void); + +/* a Custom Edition map being downloaded before its game is joined +(ui_widget_port_join_map_fetch, map_fetch_update) */ +static struct +{ + boolean pending; + /* the game's host (its XNADDR's abEnet) */ + unsigned char identifier[6]; + /* whose press is posted again once the map is there */ + short controller; +} map_fetch; static wchar_t const *const engine_names[] = { L"", L"CTF", L"SLAYER", L"ODDBALL", L"KING OF THE HILL", L"RACE" }; static short const maximum_players[] = { 2, 4, 8, 12, 16, 24, 32, 48, 64, 96, 128 }; @@ -3218,6 +3236,7 @@ static void browser_focus(struct widget_instance *list) /* (the server browser's: below) */ static void lobby_browser_begin(void); static void lobby_browser_update(struct widget_instance *list); +static void map_fetch_update(struct widget_instance *list); static boolean lobby_browser_select(struct widget_instance *widget, short controller, short row, boolean *widget_deleted); @@ -3491,6 +3510,7 @@ static void lobby_browser_update(struct widget_instance *list) lobby_browser.count = lobby_browser_valid_games(lobby_browser.games, (short)p2p_lobby_games(lobby_browser.games, LOBBY_BROWSER_GAMES)); + map_fetch_update(list); if (focused == BROWSER_ROWS - 1 && lobby_browser.first + BROWSER_ROWS < lobby_browser.count && list_scrolls_at_end()) { lobby_browser.first++; @@ -3600,7 +3620,11 @@ static void lobby_browser_update(struct widget_instance *list) { wchar_t name[P2P_LISTING_NAME_SIZE + 1]; - if (!config_boolean("network.online")) + char status[256]; + + if (map_downloads_fetching(status, sizeof(status))) + text_to_wide(status, text, (short)NUMBEROF(text)); + else if (!config_boolean("network.online")) usnprintf(text, NUMBEROF(text) - 1, L"Internet play is off (Settings)"); else if (!config_boolean("network.public_lobby")) usnprintf(text, NUMBEROF(text) - 1, L"The server browser is off (network.public_lobby)"); @@ -3670,6 +3694,7 @@ static boolean lobby_browser_join(struct p2p_listing const *game, short controll lobby_browser.ready = FALSE; lobby_browser.join_time = system_milliseconds(); lobby_browser.controller = controller; + map_fetch.controller = controller; ui_play_audio_feedback_sound(SOUND_FORWARD); return TRUE; } @@ -3839,6 +3864,83 @@ static boolean password_screen_edit(struct widget_instance *row, boolean *widget /* "gamespy screen update": the games' rows (name, map, gametype, players), the one chosen's line, the counts over the titles (the PC version's: its players, page, servers) */ +/* ---- a Custom Edition map downloaded before joining, from the +community's archives (port/linux/src/map_downloads.c), when its host does +not send it: the join (ui_widget_port_join) waits for the map, and is +posted again (an A press on the game's row) once it is there (map_fetch, +declared with the browser's state) */ + +boolean ui_widget_port_join_map_fetch(void *advertised_game) +{ + struct advertised_game *game = advertised_game; + char files[256]; + + /* (a map named for its hash is the host's to send, by map sharing, + map_share.c, once joined: the archives are for the hosts that do not) */ + if (!custom_edition_level_name(game->map_name) || map_share_name_hashed(tag_name_strip_path(game->map_name))) + return FALSE; + if (custom_edition_cache_files_missing(game->map_name, (unsigned long)game->map_version, files, sizeof(files)) <= 0) + return FALSE; + if (!map_downloads_fetch(game->map_name, (unsigned long)game->map_version, files)) + return FALSE; + csmemcpy(map_fetch.identifier, game->xnaddr + 2, sizeof(map_fetch.identifier)); + map_fetch.pending = TRUE; + /* (the server browser's join, which reached the host: not pressed + again until the map is there) */ + lobby_browser.joining = lobby_browser.ready = FALSE; + platform_log("menus: joining %s waits for its map's download", game->map_name); + return TRUE; +} + +/* the download stopped by its screen's B (download_screen.c), and the join +that waited for it let go */ +void ui_widget_port_map_fetch_cancel(void) +{ + map_fetch.pending = FALSE; + map_downloads_cancel(); + platform_log("menus: the map's download is stopped (B)"); +} + +/* the download done: the game's row focused and its join posted, if it is +still listed */ +static void map_fetch_update(struct widget_instance *list) +{ + char level_name[0x80]; + short index; + + if (!map_fetch.pending || !map_downloads_take_ready(level_name, sizeof(level_name))) + return; + map_fetch.pending = FALSE; + if (multiplayer.mode == _multiplayer_mode_server_browser) + { + for (index = 0; index < lobby_browser.count; index++) + { + if (!csmemcmp(lobby_browser.games[index].identifier, map_fetch.identifier, sizeof(map_fetch.identifier))) + { + if (index < lobby_browser.first || index >= lobby_browser.first + BROWSER_ROWS) + lobby_browser.first = index; + lobby_browser_focus_row(list, (short)(index - lobby_browser.first)); + ui_widget_port_post_button(map_fetch.controller, BUTTON_A); + return; + } + } + } + else + { + for (index = 0; index < multiplayer.game_count; index++) + { + if (!csmemcmp(multiplayer.games[index]->xnaddr + 2, map_fetch.identifier, sizeof(map_fetch.identifier))) + { + multiplayer.game_chosen = index; + lobby_browser_focus_row(list, index); + ui_widget_port_post_button(map_fetch.controller, BUTTON_A); + return; + } + } + } + platform_log("menus: the map %s is there, but its game is no longer listed", level_name); +} + static void browser_update(struct widget_instance *list) { struct widget_instance *row; @@ -3853,6 +3955,9 @@ static void browser_update(struct widget_instance *list) browser_games_read(); if (focused != NONE && focused < multiplayer.game_count) multiplayer.game_chosen = focused; + /* (after the focused row's game is taken: a map downloaded focuses its + game's row, and chooses it) */ + map_fetch_update(list); for (row = list->child; row; row = row->next) { short index = browser_row_index(row); @@ -3881,8 +3986,12 @@ static void browser_update(struct widget_instance *list) { wchar_t text[ROW_TEXT_LENGTH * 2]; + char status[256]; + if (multiplayer.mode == _multiplayer_mode_server_browser) text[0] = 0; + else if (map_downloads_fetching(status, sizeof(status))) + text_to_wide(status, text, (short)NUMBEROF(text)); else if (!multiplayer.game_count) { usnprintf(text, NUMBEROF(text) - 1, L"%s", multiplayer.mode == _multiplayer_mode_direct_link ? @@ -3952,6 +4061,8 @@ static boolean browser_join(struct widget_instance *widget, short controller, bo return campaign_fail(); if (!multiplayer_player(controller)) return FALSE; + /* (the controller whose press is posted again once a map downloaded) */ + map_fetch.controller = controller; return ui_widget_port_join(widget, multiplayer.games[multiplayer.game_chosen], LOBBY_NAME, widget_deleted); } diff --git a/port/linux/include/halo_linux_source_fixups.h b/port/linux/include/halo_linux_source_fixups.h index feb6789b3f..b1e2b4559d 100644 --- a/port/linux/include/halo_linux_source_fixups.h +++ b/port/linux/include/halo_linux_source_fixups.h @@ -68,4 +68,12 @@ void halo_screen_anti_alias(short x0, short y0, short x1, short y1); /* the mouse in the menus (source/interface/ui_widget.c) */ #include "halo_ui_pointer.h" +/* Custom Edition maps downloaded from the community's archives before a +join (port/linux/src/map_downloads.c: cache_files.c, main.c's loop), and the +host's version of a map forgotten as a client leaves +(port/linux/game/custom_edition_cache.c) */ +int map_downloads_fetch(const char *level_name, unsigned long version, const char *files); +void map_downloads_poll(void); +void custom_edition_map_version_forget(void); + #endif diff --git a/port/linux/src/d3d8_gl.c b/port/linux/src/d3d8_gl.c index 9e260d75d8..0862959c0a 100644 --- a/port/linux/src/d3d8_gl.c +++ b/port/linux/src/d3d8_gl.c @@ -500,6 +500,12 @@ struct gl_device { D3DPRESENT_PARAMETERS presentation; D3DSurface back_buffer; + /* the frame shown last, as the loading screen reads it (GetBackBuffer + with -1: front_buffer_ready); the frame it was last asked for in, and + the frame its picture was last taken in (front_buffer_take), each + 1 */ + D3DSurface front_buffer; + unsigned long front_buffer_asked; + unsigned long front_buffer_taken; D3DSurface depth_buffer; D3DSurface *render_target; D3DSurface *depth_stencil; @@ -510,6 +516,9 @@ struct gl_device D3DSHADERCONSTANTMODE shader_constant_mode; struct vertex_shader_object *vertex_shader; + /* SetVertexShader chose the fixed-function pipeline (with 0): the + loading screen's draws (fixed_function_program) */ + BOOL fixed_function; struct vertex_shader_object *program_slots[VERTEX_PROGRAM_SLOTS]; unsigned long program_address; float constants[XGPU_VERTEX_CONSTANT_COUNT][4]; @@ -1164,10 +1173,16 @@ void WINAPI D3DDevice_SetVerticalBlankCallback(D3DCALLBACK callback) vertical_blank_start(); } +static void front_buffer_take(void); + void WINAPI D3DDevice_BlockUntilVerticalBlank(void) { unsigned long count; + /* (the loading screen's last call: its frame, for the next frame's + trails) */ + front_buffer_take(); + vertical_blank_start(); pthread_mutex_lock(&vertical_blank_lock); count = vertical_blank_count; @@ -2124,10 +2139,19 @@ void WINAPI D3DDevice_GetDeviceCaps(D3DCAPS8 *caps) caps->MaxPixelShaderValue = 1.0f; } +static BOOL front_buffer_ready(void); + void WINAPI D3DDevice_GetBackBuffer(INT back_buffer, D3DBACKBUFFER_TYPE type, D3DSurface **result) { - (void)back_buffer; (void)type; + /* -1: the front buffer, the frame shown last, which the loading screen + blurs into its light's trails (progress_bar.c) */ + if (back_buffer == -1 && front_buffer_ready()) + { + device.front_buffer.Common++; + *result = &device.front_buffer; + return; + } /* like Direct3D, the caller gets a reference it must release */ device.back_buffer.Common++; *result = &device.back_buffer; @@ -2660,7 +2684,13 @@ void WINAPI D3DDevice_SetVertexShader(DWORD handle) device.vertex_shader = object; device.program_address = 0; device.program_slots[0] = object; + device.fixed_function = FALSE; } + /* 0: the fixed-function pipeline, which only the loading screen uses + (progress_bar.c). Another handle that is no shader (NONE, of a shader + that could not be made) changes nothing, as before */ + else if (!handle) + device.fixed_function = TRUE; } void WINAPI D3DDevice_LoadVertexShader(DWORD handle, DWORD address) @@ -2673,6 +2703,9 @@ void WINAPI D3DDevice_SelectVertexShader(DWORD handle, DWORD address) { struct vertex_shader_object *object = vertex_shader_from_handle(handle); + /* (a program, loaded or packed at the address: never the fixed-function + pipeline, which SetVertexShader with 0 sets) */ + device.fixed_function = FALSE; if (object) device.vertex_shader = object; if (address < VERTEX_PROGRAM_SLOTS) @@ -2706,6 +2739,51 @@ static struct vertex_shader_object *current_program(void) return program ? program : device.vertex_shader; } +/* the fixed-function pipeline as a program (SetVertexShader with 0): its +immediate-mode draws only, whose positions D3DDevice_End +transforms by the world, view and projection matrices (nv2a_fixed_function_glsl). +Draws from vertex buffers have no declaration to read them by, and are not +drawn (no game draw makes one). */ +static struct vertex_shader_object *fixed_function_program(void) +{ + static struct vertex_shader_object program; + static DWORD no_instructions[4]; + + if (!program.instructions) + { + char *source = nv2a_fixed_function_glsl(); + + program.signature = VERTEX_SHADER_SIGNATURE; + program.instructions = no_instructions; + program.shader[1] = xgpu_compile_shader(GL_VERTEX_SHADER, source, "fixed-function vertex"); + /* (vertex_shader_get: neither variant compiled from instructions) */ + program.shaders_tried = 1 | 2; + free(source); + } + return &program; +} + +/* a position in immediate mode by the fixed-function pipeline's transforms: +Direct3D's row vectors, times world, view, then projection */ +static void fixed_function_transform(float *position) +{ + static const D3DTRANSFORMSTATETYPE order[3] = { D3DTS_WORLD, D3DTS_VIEW, D3DTS_PROJECTION }; + int which, column; + + for (which = 0; which < 3; which++) + { + const D3DMATRIX *matrix = &device.transforms[order[which]]; + float in[4]; + + memcpy(in, position, sizeof(in)); + for (column = 0; column < 4; column++) + { + position[column] = in[0] * matrix->m[0][column] + in[1] * matrix->m[1][column] + + in[2] * matrix->m[2][column] + in[3] * matrix->m[3][column]; + } + } +} + /* ---------- program cache */ /* size is a multiple of 4 */ @@ -3737,14 +3815,19 @@ static unsigned long model_light_register(int light) static struct program_entry *prepare_draw(BOOL immediate) { - struct vertex_shader_object *program = current_program(); + /* (the fixed-function program compiled only with OpenGL there: not by + the null renderer) */ + struct vertex_shader_object *program = !device.gl_ready ? NULL : + device.fixed_function ? fixed_function_program() : current_program(); struct nv2a_pixel_shader_key key; struct program_entry *entry; struct draw_uniforms uniforms; BOOL has_depth = FALSE; int stage; - if (!device.gl_ready || !program || !device.vertex_shader || !program->instructions) + /* (the fixed-function pipeline's draws: immediate mode's only) */ + if (!device.gl_ready || !program || !(device.vertex_shader || device.fixed_function) || !program->instructions || + (device.fixed_function && !immediate)) { stats.skipped_no_program++; return NULL; @@ -5313,6 +5396,12 @@ void WINAPI D3DDevice_End(void) device.immediate_active = FALSE; if (!count || !prepare_draw(TRUE)) return; + /* (the fixed-function pipeline's: positions into clip space) */ + if (device.fixed_function) + { + for (index = 0; index < count; index++) + fixed_function_transform(device.immediate_vertices + index * XGPU_VERTEX_ATTRIBUTE_COUNT * 4); + } trace_draw("immediate", type, count, device.immediate_vertices); #ifdef HALO_WEB vertex_array_cache_bind(NULL); @@ -5830,6 +5919,103 @@ static void visibility_copy_batch(void) } #endif +/* ---------- the front buffer + +The Xbox's front buffer is the frame on the screen, which the loading screen +reads back (GetBackBuffer with -1, progress_bar.c) and draws again blurred, +a little larger and fainter, under each new frame: the trails of its light. +Here it is a render target of the menus' 640x480, which takes the 640 +columns in the middle of the frame (where the loading screen draws, as the +menus do on a wide screen) once the loading screen has drawn it, while the +screen asks for it: at its BlockUntilVerticalBlank, its last call, so that +what is drawn over it after (the download screen's words) leaves no trail. */ + +enum +{ + FRONT_BUFFER_WIDTH = 640, + FRONT_BUFFER_HEIGHT = 480, +}; + +/* the front buffer, made the first time it is asked for, and black when the +frame before did not take its picture (a loading screen's first frame) */ +static BOOL front_buffer_ready(void) +{ + /* (its memory could not be had: not asked for again each frame) */ + static BOOL failed; + struct render_target_entry *front; + + if (!device.gl_ready || failed) + return FALSE; + if (!device.front_buffer.Data) + { + d3d8_surface_initialize(&device.front_buffer, D3DFMT_LIN_A8R8G8B8, FRONT_BUFFER_WIDTH, FRONT_BUFFER_HEIGHT); + if (!device.front_buffer.Data) + { + failed = TRUE; + return FALSE; + } + } + front = render_target_get(&device.front_buffer); + if (!front) + return FALSE; + if (device.front_buffer_taken != device.frame) + { + GLuint framebuffer; + + draw_flush(); + framebuffer = framebuffer_get(front->target.texture, 0); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer); + glDisable(GL_SCISSOR_TEST); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + gl_check_errors("front buffer clear"); + xgpu_gl_state_invalidate(); + /* (drawn into, as a draw marks a target: the latest of its memory's) */ + front->last_rendered = device.frame + 1; + front->target.written = ++render_target_write_serial; + } + device.front_buffer_asked = device.frame + 1; + return TRUE; +} + +/* the frame as the loading screen has drawn it into the front buffer, when +this frame asked for it (D3DDevice_BlockUntilVerticalBlank) */ +static void front_buffer_take(void) +{ + struct render_target_entry *back_buffer, *front; + GLuint read, draw; + GLint width, left; + + if (!device.gl_ready || !device.front_buffer.Data || device.front_buffer_asked != device.frame + 1) + return; + back_buffer = render_target_get(&device.back_buffer); + front = render_target_get(&device.front_buffer); + if (!back_buffer || !front) + return; + draw_flush(); + render_target_resolve(&back_buffer->target); + read = framebuffer_get(back_buffer->target.texture, 0); + draw = framebuffer_get(front->target.texture, 0); + width = (GLint)(FRONT_BUFFER_WIDTH * back_buffer->target.scale[0] + 0.5f); + left = ((GLint)back_buffer->target.gl_width - width) / 2; + if (left < 0) + { + left = 0; + width = (GLint)back_buffer->target.gl_width; + } + glBindFramebuffer(GL_READ_FRAMEBUFFER, read); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, draw); + glDisable(GL_SCISSOR_TEST); + glBlitFramebuffer(left, 0, left + width, (GLint)back_buffer->target.gl_height, 0, 0, + (GLint)front->target.gl_width, (GLint)front->target.gl_height, GL_COLOR_BUFFER_BIT, GL_LINEAR); + gl_check_errors("front buffer copy"); + xgpu_gl_state_invalidate(); + front->last_rendered = device.frame + 1; + front->target.written = ++render_target_write_serial; + device.front_buffer_taken = device.frame + 1; +} + void WINAPI D3DDevice_Present(CONST RECT *source_rectangle, CONST RECT *destination_rectangle, void *unused, void *unused2) { diff --git a/port/linux/src/map_archives.c b/port/linux/src/map_archives.c new file mode 100644 index 0000000000..0579706800 --- /dev/null +++ b/port/linux/src/map_archives.c @@ -0,0 +1,762 @@ +/* +MAP_ARCHIVES.C + +A Custom Edition map fetched from where the community keeps them +(map_archives.h), for map_downloads.c: the index of the maps +(port/assets/network/map_index.txt) names, for most maps, the zips of the +community's archives that hold them (tools/map_index.py sources), and +maps.archives the archives to try, in order; then the web seeds +(maps.web_seeds), folders that hold every map of the index under its file +name: + +- "halonet": HaloNet's map repository, a zip a map at + https://maps.halonet.net/maps/; +- "halomaps": HaloMaps (halomaps.org), whose files are fetched as its page's + Download button fetches them: the file's page + (https://halomaps.org/hce/detail.cfm?fid=) gives a token, which a + POST of the page's form sends back for the zip; +- a web seed: the map itself, . + +All over HTTPS, with the self-updater's download (update.h: Mbed TLS on +Linux, WinHTTP on Windows), which checks the servers' certificates. A zip +is written beside the map's download (.zip), and the map, the zip's +file of its name and size in any folder, taken out of it +(map_archives_unzip, map_archives_zip.c) into .part; a web seed's map +is written there itself. It becomes the path given once whole and checked +against the index's info hash (map_archives_verify, map_archives_zip.c); +one that is not the index's is deleted, and the next source tried. The zip +is deleted after. + +One fetch at a time, on a thread of its own, which the game's thread polls +and can stop (map_archives_stop: the download stops at its next block, and +the thread deletes what it wrote; the game's thread does not wait for it). +Android has no HTTPS download in its platform layer, and the web build +plays no Custom Edition maps: neither fetches from the archives (the web +build leaves this file out). +*/ + +#include "platform.h" +#include "posix.h" +#include "port_config.h" +#include "map_archives.h" + +#include +#include +#include +#include +#include +#include + +#ifndef HALO_ANDROID +#include "update.h" +#endif + +#define USER_AGENT "OpenCE (Halo; Custom Edition map downloads)" +#define HALONET_URL "https://maps.halonet.net/maps/" +#define HALOMAPS_PAGE_URL "https://halomaps.org/hce/detail.cfm?fid=" +#define HALOMAPS_FORM_URL "https://halomaps.org/hce/detail.cfm" +/* (a page is tens of kilobytes) */ +#define MAXIMUM_PAGE_SIZE (1024 * 1024) + +static const struct +{ + const char *key; + const char *name; +} archives[] = +{ + { "halonet", "HaloNet" }, + { "halomaps", "HaloMaps" }, + /* (maps.web_seeds': every map of the index, by its file name) */ + { "web", "the web seed" }, +}; +#define WEB_SEED_ARCHIVE 2 +#define ARCHIVE_COUNT ((int)(sizeof(archives) / sizeof(archives[0]))) + +/* ---------- names */ + +static int same_name(const char *a, const char *b, size_t length) +{ + size_t index; + + for (index = 0; index < length; index++) + { + char ca = a[index], cb = b[index]; + + if (ca >= 'A' && ca <= 'Z') + ca = (char)(ca - 'A' + 'a'); + if (cb >= 'A' && cb <= 'Z') + cb = (char)(cb - 'A' + 'a'); + if (ca != cb) + return 0; + if (!ca) + return 1; + } + return 1; +} + +/* whether maps.archives names the archive (a comma-separated list) */ +static int archive_enabled(int archive) +{ + const char *list = config_string("maps.archives"); + size_t length = strlen(archives[archive].key); + + /* (the web seeds': whether there are any) */ + if (archive == WEB_SEED_ARCHIVE) + { + const char *seeds = config_string("maps.web_seeds"); + + return seeds && strstr(seeds, "https://") != NULL; + } + + while (*list) + { + const char *comma = strchr(list, ','); + size_t item = comma ? (size_t)(comma - list) : strlen(list); + + while (item && *list == ' ') + list++, item--; + while (item && list[item - 1] == ' ') + item--; + if (item == length && same_name(list, archives[archive].key, length)) + return 1; + if (!comma) + break; + list = comma + 1; + } + return 0; +} + +/* the archive's id of the file in sources (tab-separated ":"), in +id (id_size characters); 1 if sources names the archive (a web seed has +every file: its id is the file name, set by the fetch) */ +static int archive_source(const char *sources, int archive, char *id, int id_size) +{ + size_t key_length = strlen(archives[archive].key); + const char *source = sources; + + if (archive == WEB_SEED_ARCHIVE) + { + if (id_size > 0) + id[0] = 0; + return 1; + } + + while (source && *source) + { + const char *tab = strchr(source, '\t'); + size_t length = tab ? (size_t)(tab - source) : strlen(source); + + if (length > key_length + 1 && source[key_length] == ':' && same_name(source, archives[archive].key, key_length)) + { + if (length - key_length - 1 >= (size_t)id_size) + return 0; + memcpy(id, source + key_length + 1, length - key_length - 1); + id[length - key_length - 1] = 0; + return 1; + } + source = tab ? tab + 1 : NULL; + } + return 0; +} + +#ifndef HALO_ANDROID + +/* ---------- the fetch's thread */ + +static struct +{ + pthread_mutex_t lock; + int lock_made; + /* set by map_archives_stop: the download ends at its next block */ + volatile int stop; + enum map_archives_state state; + unsigned long long received, total; + int archive; + char file_name[256]; + unsigned long long size; + unsigned long piece_length; + char info_hash[41]; + char sources[1024]; + char path[1024]; +} fetch; + +static void fetch_progress(void *context, unsigned long long received, unsigned long long total) +{ + (void)context; + pthread_mutex_lock(&fetch.lock); + fetch.received = received; + fetch.total = total; + pthread_mutex_unlock(&fetch.lock); +} + +/* text percent-encoded for a URL's path or a form's value */ +static void url_encode(const char *text, char *encoded, size_t size) +{ + static const char hex[] = "0123456789ABCDEF"; + size_t used = 0; + + for (; *text && used + 4 < size; text++) + { + unsigned char c = (unsigned char)*text; + + if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || strchr("-._~", c)) + { + encoded[used++] = (char)c; + } + else + { + encoded[used++] = '%'; + encoded[used++] = hex[c >> 4]; + encoded[used++] = hex[c & 15]; + } + } + encoded[used] = 0; +} + +/* HaloMaps's token for the file's download, out of its page (the form's +"hash" field: hexadecimal digits); 1 if found */ +static int halomaps_token(const char *page_path, char *token, int token_size) +{ + static const char marker[] = "name=\"hash\" value=\""; + struct posix_file_information information; + char *page, *found; + int file = open(page_path, O_RDONLY | O_CLOEXEC), ok = 0; + unsigned long size; + + if (file < 0) + return 0; + if (posix_fstat(file, &information) != 0 || information.size_high || information.size_low > MAXIMUM_PAGE_SIZE) + { + close(file); + return 0; + } + size = information.size_low; + page = malloc(size + 1); + if (page && map_archives_read_at(file, 0, page, size)) + { + page[size] = 0; + found = strstr(page, marker); + if (found) + { + int length = 0; + + found += sizeof(marker) - 1; + while (length < token_size - 1 && ((found[length] >= '0' && found[length] <= '9') || + (found[length] >= 'A' && found[length] <= 'F') || (found[length] >= 'a' && found[length] <= 'f'))) + { + token[length] = found[length]; + length++; + } + token[length] = 0; + ok = length > 0 && found[length] == '"'; + } + } + free(page); + close(file); + return ok; +} + +/* the zip of the file's id from the archive, into zip_path; 1 on success */ +static int fetch_zip(int archive, const char *id, const char *zip_path, char *error, int error_size) +{ + char url[2048]; + char encoded[1024]; + + if (!strcmp(archives[archive].key, "halonet")) + { + url_encode(id, encoded, sizeof(encoded)); + snprintf(url, sizeof(url), HALONET_URL "%s", encoded); + return update_request(url, NULL, USER_AGENT, &fetch.stop, zip_path, fetch_progress, NULL, error, error_size); + } + else + { + char page_path[1100]; + char token[64]; + char form[256]; + int got_token; + const char *digit; + + /* (a file's id is a number) */ + for (digit = id; *digit; digit++) + { + if (*digit < '0' || *digit > '9') + { + snprintf(error, (size_t)error_size, "a bad file id %s", id); + return 0; + } + } + snprintf(page_path, sizeof(page_path), "%s.html", fetch.path); + unlink(page_path); + snprintf(url, sizeof(url), HALOMAPS_PAGE_URL "%s", id); + if (!update_request(url, NULL, USER_AGENT, &fetch.stop, page_path, NULL, NULL, error, error_size)) + return 0; + got_token = halomaps_token(page_path, token, sizeof(token)); + unlink(page_path); + if (!got_token) + { + snprintf(error, (size_t)error_size, "its page has no download"); + return 0; + } + snprintf(form, sizeof(form), "fid=%s&action=dl&hash=%s&submit=download", id, token); + return update_request(HALOMAPS_FORM_URL, form, USER_AGENT, &fetch.stop, zip_path, fetch_progress, NULL, error, + error_size); + } +} + +/* the map from the first web seed (maps.web_seeds: folders, separated by +commas) that has it whole, into part_path; 1 on success */ +static int fetch_web_seeds(const char *part_path) +{ + const char *list = config_string("maps.web_seeds"); + char encoded[1024]; + + url_encode(fetch.file_name, encoded, sizeof(encoded)); + while (list && *list && !fetch.stop) + { + const char *comma = strchr(list, ','); + size_t length = comma ? (size_t)(comma - list) : strlen(list); + char folder[1024]; + char url[2100]; + char error[192]; + struct posix_file_information information; + + while (length && (*list == ' ' || *list == '\t')) + { + list++; + length--; + } + while (length && (list[length - 1] == ' ' || list[length - 1] == '\t')) + length--; + if (length && length < sizeof(folder) && !strncmp(list, "https://", 8)) + { + memcpy(folder, list, length); + folder[length] = 0; + snprintf(url, sizeof(url), "%s%s%s", folder, folder[length - 1] == '/' ? "" : "/", encoded); + pthread_mutex_lock(&fetch.lock); + fetch.received = fetch.total = 0; + pthread_mutex_unlock(&fetch.lock); + platform_log("map archives: fetching %s from %s", fetch.file_name, folder); + error[0] = 0; + unlink(part_path); + if (update_request(url, NULL, USER_AGENT, &fetch.stop, part_path, fetch_progress, NULL, error, + sizeof(error)) && + posix_stat(part_path, &information) == 0 && + (((unsigned long long)information.size_high << 32) | information.size_low) == fetch.size && + map_archives_verify(part_path, fetch.file_name, fetch.size, fetch.piece_length, fetch.info_hash, error, + sizeof(error))) + { + platform_log("map archives: %s came from %s", fetch.file_name, folder); + return 1; + } + platform_log("map archives: %s did not come from %s: %s", fetch.file_name, folder, + fetch.stop ? "stopped" : error[0] ? error : "another size"); + unlink(part_path); + } + list = comma ? comma + 1 : NULL; + } + return 0; +} + +static void *fetch_thread(void *unused) +{ + char zip_path[1100]; + char part_path[1100]; + int archive; + enum map_archives_state result = _map_archives_failed; + + (void)unused; + snprintf(zip_path, sizeof(zip_path), "%s.zip", fetch.path); + snprintf(part_path, sizeof(part_path), "%s.part", fetch.path); + for (archive = 0; archive < ARCHIVE_COUNT && !fetch.stop; archive++) + { + char id[512]; + char error[192]; + + if (!archive_enabled(archive) || !archive_source(fetch.sources, archive, id, sizeof(id))) + continue; + if (archive == WEB_SEED_ARCHIVE) + { + pthread_mutex_lock(&fetch.lock); + fetch.archive = archive; + pthread_mutex_unlock(&fetch.lock); + if (fetch_web_seeds(part_path)) + { + if (fetch.stop) + break; + unlink(fetch.path); + if (rename(part_path, fetch.path) != 0) + { + platform_log("map archives: %s could not be put in place", fetch.file_name); + break; + } + result = _map_archives_done; + } + break; + } + pthread_mutex_lock(&fetch.lock); + fetch.archive = archive; + fetch.received = fetch.total = 0; + pthread_mutex_unlock(&fetch.lock); + platform_log("map archives: fetching %s from %s (%s)", fetch.file_name, archives[archive].name, id); + error[0] = 0; + if (!fetch_zip(archive, id, zip_path, error, sizeof(error))) + { + platform_log("map archives: %s's zip did not come from %s: %s", fetch.file_name, archives[archive].name, + fetch.stop ? "stopped" : error); + unlink(zip_path); + continue; + } + if (!map_archives_unzip(zip_path, fetch.file_name, fetch.size, part_path, error, sizeof(error))) + { + platform_log("map archives: %s could not be taken out of %s's zip: %s", fetch.file_name, + archives[archive].name, error); + unlink(zip_path); + continue; + } + unlink(zip_path); + /* (another version than the index's, say: the next source) */ + if (!map_archives_verify(part_path, fetch.file_name, fetch.size, fetch.piece_length, fetch.info_hash, error, + sizeof(error))) + { + platform_log("map archives: %s from %s is not the index's: %s", fetch.file_name, archives[archive].name, + error); + unlink(part_path); + continue; + } + /* (in place of what an earlier download of it left in the downloads + folder, never of a map: the path is the downloads folder's) */ + if (fetch.stop) + break; + unlink(fetch.path); + if (rename(part_path, fetch.path) != 0) + { + platform_log("map archives: %s could not be put in place", fetch.file_name); + break; + } + platform_log("map archives: %s came from %s", fetch.file_name, archives[archive].name); + result = _map_archives_done; + break; + } + if (result != _map_archives_done) + unlink(part_path); + pthread_mutex_lock(&fetch.lock); + fetch.state = fetch.stop ? _map_archives_failed : result; + pthread_mutex_unlock(&fetch.lock); + return NULL; +} + +/* the fetch's state, read under its lock */ +static enum map_archives_state map_archives_poll_state(void) +{ + enum map_archives_state state; + + pthread_mutex_lock(&fetch.lock); + state = fetch.state; + pthread_mutex_unlock(&fetch.lock); + return state; +} + +int map_archives_available(const char *sources) +{ + char id[512]; + int archive; + + for (archive = 0; archive < ARCHIVE_COUNT; archive++) + { + if (archive_enabled(archive) && archive_source(sources, archive, id, sizeof(id))) + return 1; + } + return 0; +} + +int map_archives_start(const char *file_name, unsigned long long size, unsigned long piece_length, + const char *info_hash, const char *sources, const char *path) +{ + pthread_t thread; + + if (!fetch.lock_made) + { + pthread_mutex_init(&fetch.lock, NULL); + fetch.lock_made = 1; + } + /* (a stopped fetch's thread may still be ending) */ + if (map_archives_poll_state() == _map_archives_running || !sources || !map_archives_available(sources) || + strlen(file_name) >= sizeof(fetch.file_name) || strlen(sources) >= sizeof(fetch.sources) || + strlen(path) + 8 >= sizeof(fetch.path) || !piece_length || strlen(info_hash) != 40) + { + return 0; + } + if (fetch.stop) + { + /* (a stopped fetch's thread has ended: what it left deleted) */ + char other_path[1100]; + + snprintf(other_path, sizeof(other_path), "%s.zip", fetch.path); + unlink(other_path); + snprintf(other_path, sizeof(other_path), "%s.html", fetch.path); + unlink(other_path); + } + snprintf(fetch.file_name, sizeof(fetch.file_name), "%s", file_name); + snprintf(fetch.sources, sizeof(fetch.sources), "%s", sources); + snprintf(fetch.path, sizeof(fetch.path), "%s", path); + fetch.size = size; + fetch.piece_length = piece_length; + snprintf(fetch.info_hash, sizeof(fetch.info_hash), "%s", info_hash); + fetch.stop = 0; + fetch.received = fetch.total = 0; + /* (the first source that will be tried, for the screen meanwhile) */ + for (fetch.archive = 0; fetch.archive < ARCHIVE_COUNT - 1; fetch.archive++) + { + char id[512]; + + if (archive_enabled(fetch.archive) && archive_source(sources, fetch.archive, id, sizeof(id))) + break; + } + fetch.state = _map_archives_running; + /* (detached: it touches nothing of the fetch once its state, under the + lock, says it ended, so that another can start then) */ + if (pthread_create(&thread, NULL, fetch_thread, NULL) != 0) + { + fetch.state = _map_archives_idle; + return 0; + } + pthread_detach(thread); + return 1; +} + +enum map_archives_state map_archives_poll(unsigned long long *received, unsigned long long *total, char *archive, + int archive_size) +{ + enum map_archives_state state; + + if (!fetch.lock_made) + return _map_archives_idle; + pthread_mutex_lock(&fetch.lock); + state = fetch.state; + *received = fetch.received; + *total = fetch.total; + snprintf(archive, (size_t)archive_size, "%s", archives[fetch.archive].name); + pthread_mutex_unlock(&fetch.lock); + return state; +} + +void map_archives_stop(void) +{ + enum map_archives_state state; + + if (!fetch.lock_made) + return; + pthread_mutex_lock(&fetch.lock); + state = fetch.state; + pthread_mutex_unlock(&fetch.lock); + /* (one under way ends by itself, at its download's next block, and is + idle once map_archives_start finds it ended) */ + if (state == _map_archives_running) + { + fetch.stop = 1; + return; + } + fetch.state = _map_archives_idle; +} + +/* ---------- map sharing's web seeds: a range of a file */ + +int map_archives_web_seed_url(const char *file_name, int which, char *url, int url_size) +{ + const char *list = config_string("maps.web_seeds"); + char encoded[1024]; + + url_encode(file_name, encoded, sizeof(encoded)); + while (list && *list) + { + const char *comma = strchr(list, ','); + size_t length = comma ? (size_t)(comma - list) : strlen(list); + + while (length && (*list == ' ' || *list == '\t')) + { + list++; + length--; + } + while (length && (list[length - 1] == ' ' || list[length - 1] == '\t')) + length--; + if (length > 8 && !strncmp(list, "https://", 8) && which-- == 0) + { + if (length + strlen(encoded) + 2 > (size_t)url_size) + return 0; + snprintf(url, (size_t)url_size, "%.*s%s%s", (int)length, list, list[length - 1] == '/' ? "" : "/", + encoded); + return 1; + } + list = comma ? comma + 1 : NULL; + } + return 0; +} + +static struct +{ + pthread_mutex_t lock; + int lock_made; + volatile int stop; + enum map_archives_state state; + char url[2100]; + unsigned long long offset; + unsigned long length; + char path[1024]; + char error[192]; +} range_fetch; + +static void *range_thread(void *unused) +{ + char error[192]; + int ok; + + (void)unused; + error[0] = 0; + ok = update_request_range(range_fetch.url, USER_AGENT, &range_fetch.stop, range_fetch.offset, range_fetch.length, + range_fetch.path, error, sizeof(error)); + if (!ok || range_fetch.stop) + unlink(range_fetch.path); + pthread_mutex_lock(&range_fetch.lock); + snprintf(range_fetch.error, sizeof(range_fetch.error), "%s", range_fetch.stop ? "stopped" : error); + range_fetch.state = ok && !range_fetch.stop ? _map_archives_done : _map_archives_failed; + pthread_mutex_unlock(&range_fetch.lock); + return NULL; +} + +static enum map_archives_state range_state(void) +{ + enum map_archives_state state; + + if (!range_fetch.lock_made) + return _map_archives_idle; + pthread_mutex_lock(&range_fetch.lock); + state = range_fetch.state; + pthread_mutex_unlock(&range_fetch.lock); + return state; +} + +int map_archives_range_start(const char *url, unsigned long long offset, unsigned long length, const char *path) +{ + pthread_t thread; + + if (!range_fetch.lock_made) + { + pthread_mutex_init(&range_fetch.lock, NULL); + range_fetch.lock_made = 1; + } + if (range_state() == _map_archives_running || !length || strlen(url) >= sizeof(range_fetch.url) || + strlen(path) >= sizeof(range_fetch.path)) + { + return 0; + } + snprintf(range_fetch.url, sizeof(range_fetch.url), "%s", url); + snprintf(range_fetch.path, sizeof(range_fetch.path), "%s", path); + range_fetch.offset = offset; + range_fetch.length = length; + range_fetch.stop = 0; + range_fetch.error[0] = 0; + range_fetch.state = _map_archives_running; + if (pthread_create(&thread, NULL, range_thread, NULL) != 0) + { + range_fetch.state = _map_archives_idle; + return 0; + } + pthread_detach(thread); + return 1; +} + +enum map_archives_state map_archives_range_poll(char *error, int error_size) +{ + enum map_archives_state state; + + if (!range_fetch.lock_made) + return _map_archives_idle; + pthread_mutex_lock(&range_fetch.lock); + state = range_fetch.state; + if (error && error_size > 0) + snprintf(error, (size_t)error_size, "%s", range_fetch.error); + pthread_mutex_unlock(&range_fetch.lock); + return state; +} + +void map_archives_range_stop(void) +{ + if (range_state() == _map_archives_running) + { + /* (it ends by itself at its download's next block, deleting what it + wrote; map_archives_range_start waits for that) */ + range_fetch.stop = 1; + return; + } + if (range_fetch.lock_made) + range_fetch.state = _map_archives_idle; +} + +#else + +/* Android: no HTTPS download in its platform layer (update.h is the +desktop updater's), so no fetch from the archives */ + +int map_archives_available(const char *sources) +{ + (void)sources; + (void)archive_source; + (void)archive_enabled; + return 0; +} + +int map_archives_start(const char *file_name, unsigned long long size, unsigned long piece_length, + const char *info_hash, const char *sources, const char *path) +{ + (void)piece_length; + (void)info_hash; + (void)file_name; + (void)size; + (void)sources; + (void)path; + return 0; +} + +enum map_archives_state map_archives_poll(unsigned long long *received, unsigned long long *total, char *archive, + int archive_size) +{ + *received = *total = 0; + if (archive_size > 0) + archive[0] = 0; + return _map_archives_idle; +} + +void map_archives_stop(void) +{ +} + +int map_archives_web_seed_url(const char *file_name, int which, char *url, int url_size) +{ + (void)file_name; + (void)which; + (void)url; + (void)url_size; + return 0; +} + +int map_archives_range_start(const char *url, unsigned long long offset, unsigned long length, const char *path) +{ + (void)url; + (void)offset; + (void)length; + (void)path; + return 0; +} + +enum map_archives_state map_archives_range_poll(char *error, int error_size) +{ + if (error && error_size > 0) + error[0] = 0; + return _map_archives_idle; +} + +void map_archives_range_stop(void) +{ +} + +#endif diff --git a/port/linux/src/map_archives.h b/port/linux/src/map_archives.h new file mode 100644 index 0000000000..c21a91adfc --- /dev/null +++ b/port/linux/src/map_archives.h @@ -0,0 +1,87 @@ +/* +MAP_ARCHIVES.H + +A Custom Edition map fetched from where the community keeps it +(map_archives.c): out of the zip HaloNet (maps.halonet.net) or HaloMaps +(halomaps.org) keeps it in, or from a web seed (maps.web_seeds), for +map_downloads.c; each checked against the index's hash of it. One at a +time, on a thread of its own. +*/ + +#ifndef __HALO_LINUX_MAP_ARCHIVES_H +#define __HALO_LINUX_MAP_ARCHIVES_H + +enum map_archives_state +{ + _map_archives_idle, + /* fetching a zip, or taking the map out of it */ + _map_archives_running, + /* the map is at the path given, and is the index's (its info hash the + index's: map_archives_verify) */ + _map_archives_done, + /* no archive gave it */ + _map_archives_failed, +}; + +/* Starts fetching the file named ( bytes) out of one of the zips that +sources names (the index's, tab-separated: "halonet:", +"halomaps:"), the archives tried in maps.archives's order, then +from the web seeds, into path (with path.zip, path.part and path.html beside +it meanwhile). What a source gives that is not the index's (info_hash, of +pieces of piece_length) is let go, and the next source tried. 1 if +started; 0 if no source has it, the build has none (Android, the web), or a +fetch is under way. */ +int map_archives_start(const char *file_name, unsigned long long size, unsigned long piece_length, + const char *info_hash, const char *sources, const char *path); + +/* How the fetch goes: its state, the bytes of the zip come so far and of +the whole (0 when not known), and the archive's name ("HaloNet") */ +enum map_archives_state map_archives_poll(unsigned long long *received, unsigned long long *total, char *archive, + int archive_size); + +/* Stops a fetch under way (its files deleted), or lets go of a finished +one, so that another can start */ +void map_archives_stop(void); + +/* Whether sources (as map_archives_start's) names an archive of +maps.archives this build can fetch from */ +int map_archives_available(const char *sources); + +/* Map sharing's web seeds (port/linux/game/map_share.c): the URL of the +file named on the which-th web seed of maps.web_seeds (from 0); 0 if there +is none, or this build fetches nothing (Android, the web) */ +int map_archives_web_seed_url(const char *file_name, int which, char *url, int url_size); + +/* Starts fetching length bytes of the file at url from offset (an HTTP +range) into the file at path, on a thread of its own, beside the archives' +fetch: 1 if started; 0 if one is under way or this build fetches nothing. +Map sharing checks each piece of it against the piece's hash. */ +int map_archives_range_start(const char *url, unsigned long long offset, unsigned long length, const char *path); + +/* How the range fetch goes (done: the bytes are in its file; failed: why, +in error) */ +enum map_archives_state map_archives_range_poll(char *error, int error_size); + +/* Stops a range fetch under way (its file deleted), or lets go of a +finished one */ +void map_archives_range_stop(void); + +/* Takes the file named ( bytes, the first of the name and size in any +folder) out of the zip at zip_path into path: stored or deflated, its CRC +checked (map_archives_zip.c). 1 on success; else 0 and why in error. +(tools/map_download_check.c's "unzip", for the tests.) */ +int map_archives_unzip(const char *zip_path, const char *file_name, unsigned long long size, const char *path, + char *error, int error_size); + +/* size bytes of the open file at offset into buffer; 1 if all were read */ +int map_archives_read_at(int file, unsigned long long offset, void *buffer, unsigned long size); + +/* Whether the file at path is the index's file named ( bytes): its +BitTorrent info hash (40 hexadecimal digits, of the single-file torrent +{length, name, piece length, pieces} with pieces of piece_length) is +info_hash. 1 if it is; else 0 and why in error. (tools/map_download_check.c +"verify", for the tests.) */ +int map_archives_verify(const char *path, const char *file_name, unsigned long long size, unsigned long piece_length, + const char *info_hash, char *error, int error_size); + +#endif diff --git a/port/linux/src/map_archives_zip.c b/port/linux/src/map_archives_zip.c new file mode 100644 index 0000000000..f6b570798b --- /dev/null +++ b/port/linux/src/map_archives_zip.c @@ -0,0 +1,410 @@ +/* +MAP_ARCHIVES_ZIP.C + +A map taken out of a map archive's zip (map_archives_unzip, map_archives.h): +the zip's file of the map's name and size, in any folder, stored or +deflated (the port's zlib), its CRC checked. Nothing here trusts the zip: +its end record and directory are read with every offset and size checked +against the file (APPNOTE.TXT 4.3; no Zip64, which no map's zip needs), and +the map is written no larger than the size asked for. And a map checked +against the index's hash of it (map_archives_verify). Apart from +map_archives.c, which fetches the zips, so that tools/map_download_check.c +(its "unzip" and "verify") and Android, which fetches none, have them +alone. +*/ + +#include "platform.h" +#include "posix.h" +#include "map_archives.h" +#include "map_sha1.h" + +#include +#include +#include +#include +#include + +#include "zlib_prefixed.h" + +/* the zip's end of central directory record, its directory's entries and +local headers (APPNOTE.TXT 4.3) */ +#define ZIP_END_SIGNATURE 0x06054B50UL +#define ZIP_END_SIZE 22 +#define ZIP_MAXIMUM_COMMENT 0xFFFF +#define ZIP_ENTRY_SIGNATURE 0x02014B50UL +#define ZIP_ENTRY_SIZE 46 +#define ZIP_LOCAL_SIGNATURE 0x04034B50UL +#define ZIP_LOCAL_SIZE 30 +#define ZIP_MAXIMUM_DIRECTORY (8 * 1024 * 1024) +#define ZIP_STORED 0 +#define ZIP_DEFLATED 8 + +static int same_name(const char *a, const char *b, size_t length) +{ + size_t index; + + for (index = 0; index < length; index++) + { + char ca = a[index], cb = b[index]; + + if (ca >= 'A' && ca <= 'Z') + ca = (char)(ca - 'A' + 'a'); + if (cb >= 'A' && cb <= 'Z') + cb = (char)(cb - 'A' + 'a'); + if (ca != cb) + return 0; + if (!ca) + return 1; + } + return 1; +} + +static unsigned long zip_u16(const unsigned char *bytes) +{ + return (unsigned long)bytes[0] | (unsigned long)bytes[1] << 8; +} + +static unsigned long zip_u32(const unsigned char *bytes) +{ + return (unsigned long)bytes[0] | (unsigned long)bytes[1] << 8 | (unsigned long)bytes[2] << 16 | + (unsigned long)bytes[3] << 24; +} + +int map_archives_read_at(int file, unsigned long long offset, void *buffer, unsigned long size) +{ + unsigned char *bytes = buffer; + posix_ulong low, high; + + if (posix_seek(file, (posix_long)(offset & 0xFFFFFFFFUL), (posix_long)(offset >> 32), SEEK_SET, &low, &high) != 0) + return 0; + while (size) + { + int count = (int)read(file, bytes, size > 65536 ? 65536u : (unsigned)size); + + if (count <= 0) + return 0; + bytes += count; + size -= (unsigned long)count; + } + return 1; +} + +static int write_all(int file, const unsigned char *bytes, unsigned long size) +{ + while (size) + { + int count = (int)write(file, bytes, size > 65536 ? 65536u : (unsigned)size); + + if (count <= 0) + return 0; + bytes += count; + size -= (unsigned long)count; + } + return 1; +} + +/* the file's data, stored or deflated, from offset in the zip into output */ +static int unzip_data(int zip, unsigned long long offset, unsigned long long zip_size, int method, + unsigned long long packed_size, unsigned long long size, unsigned long crc, int output, char *error, + int error_size) +{ + static unsigned char in[65536], out[65536]; + unsigned long long read_so_far = 0, written = 0; + unsigned long computed = crc32(0L, Z_NULL, 0); + z_stream stream; + int status = Z_OK; + + if (offset > zip_size || packed_size > zip_size - offset || (method == ZIP_STORED && packed_size != size)) + { + snprintf(error, (size_t)error_size, "the zip's file runs past its end"); + return 0; + } + memset(&stream, 0, sizeof(stream)); + if (method == ZIP_DEFLATED && inflateInit2(&stream, -MAX_WBITS) != Z_OK) + { + snprintf(error, (size_t)error_size, "zlib could not start"); + return 0; + } + while (read_so_far < packed_size && status != Z_STREAM_END) + { + unsigned long chunk = packed_size - read_so_far > sizeof(in) ? (unsigned long)sizeof(in) : + (unsigned long)(packed_size - read_so_far); + + if (!map_archives_read_at(zip, offset + read_so_far, in, chunk)) + { + snprintf(error, (size_t)error_size, "the zip cannot be read"); + break; + } + read_so_far += chunk; + if (method == ZIP_STORED) + { + if (!write_all(output, in, chunk)) + { + snprintf(error, (size_t)error_size, "the map cannot be written"); + break; + } + computed = crc32(computed, in, (uInt)chunk); + written += chunk; + continue; + } + stream.next_in = in; + stream.avail_in = (uInt)chunk; + while (stream.avail_in && status != Z_STREAM_END) + { + unsigned long count; + + stream.next_out = out; + stream.avail_out = sizeof(out); + status = inflate(&stream, Z_NO_FLUSH); + if (status != Z_OK && status != Z_STREAM_END) + { + snprintf(error, (size_t)error_size, "the zip's data is damaged (zlib %d)", status); + break; + } + count = (unsigned long)(sizeof(out) - stream.avail_out); + if (written + count > size || !write_all(output, out, count)) + { + snprintf(error, (size_t)error_size, written + count > size ? "the map is larger than the zip says" : + "the map cannot be written"); + status = Z_DATA_ERROR; + break; + } + computed = crc32(computed, out, (uInt)count); + written += count; + } + if (status != Z_OK && status != Z_STREAM_END) + break; + } + if (method == ZIP_DEFLATED) + inflateEnd(&stream); + if (written != size || (method == ZIP_DEFLATED && status != Z_STREAM_END)) + { + if (!error[0]) + snprintf(error, (size_t)error_size, "the map in the zip is cut short"); + return 0; + } + if (computed != crc) + { + snprintf(error, (size_t)error_size, "the map's CRC is not the zip's"); + return 0; + } + return 1; +} + +int map_archives_unzip(const char *zip_path, const char *file_name, unsigned long long size, const char *path, + char *error, int error_size) +{ + struct posix_file_information information; + unsigned char tail[ZIP_END_SIZE + ZIP_MAXIMUM_COMMENT]; + unsigned char *directory = NULL; + unsigned long long zip_size, tail_size, directory_offset; + unsigned long directory_size, entries, entry; + unsigned long at; + size_t name_length = strlen(file_name); + int zip, output = -1, found = 0, done = 0; + long end; + + error[0] = 0; + zip = open(zip_path, O_RDONLY | O_CLOEXEC); + if (zip < 0 || posix_fstat(zip, &information) != 0) + { + snprintf(error, (size_t)error_size, "the zip cannot be opened"); + if (zip >= 0) + close(zip); + return 0; + } + zip_size = (unsigned long long)information.size_high << 32 | information.size_low; + /* the end of central directory record: the last of its signature in + the file's last 64 KB, which it and the zip's comment fill */ + tail_size = zip_size < sizeof(tail) ? zip_size : sizeof(tail); + if (tail_size < ZIP_END_SIZE || !map_archives_read_at(zip, zip_size - tail_size, tail, (unsigned long)tail_size)) + { + snprintf(error, (size_t)error_size, "it is not a zip"); + goto finish; + } + for (end = (long)tail_size - ZIP_END_SIZE; end >= 0; end--) + { + if (zip_u32(tail + end) == ZIP_END_SIGNATURE && + (unsigned long long)end + ZIP_END_SIZE + zip_u16(tail + end + 20) <= tail_size) + { + break; + } + } + if (end < 0) + { + snprintf(error, (size_t)error_size, "it is not a zip"); + goto finish; + } + entries = zip_u16(tail + end + 10); + directory_size = zip_u32(tail + end + 12); + directory_offset = zip_u32(tail + end + 16); + /* (a Zip64 archive, over 4 GB, is no map's) */ + if (directory_size > ZIP_MAXIMUM_DIRECTORY || directory_offset > zip_size || + directory_size > zip_size - directory_offset) + { + snprintf(error, (size_t)error_size, "the zip's directory is damaged"); + goto finish; + } + directory = malloc(directory_size ? directory_size : 1); + if (!directory || !map_archives_read_at(zip, directory_offset, directory, directory_size)) + { + snprintf(error, (size_t)error_size, "the zip's directory cannot be read"); + goto finish; + } + for (entry = 0, at = 0; entry < entries && !found; entry++) + { + unsigned long entry_name_length, extra_length, comment_length; + const char *name; + const char *base; + unsigned long index; + + if (at + ZIP_ENTRY_SIZE > directory_size || zip_u32(directory + at) != ZIP_ENTRY_SIGNATURE) + { + snprintf(error, (size_t)error_size, "the zip's directory is damaged"); + goto finish; + } + entry_name_length = zip_u16(directory + at + 28); + extra_length = zip_u16(directory + at + 30); + comment_length = zip_u16(directory + at + 32); + if (at + ZIP_ENTRY_SIZE + entry_name_length + extra_length + comment_length > directory_size) + { + snprintf(error, (size_t)error_size, "the zip's directory is damaged"); + goto finish; + } + /* (the name's last part, after any folders) */ + name = (const char *)directory + at + ZIP_ENTRY_SIZE; + base = name; + for (index = 0; index < entry_name_length; index++) + { + if (name[index] == '/' || name[index] == '\\') + base = name + index + 1; + } + if ((size_t)(name + entry_name_length - base) == name_length && same_name(base, file_name, name_length) && + zip_u32(directory + at + 24) == size) + { + unsigned char local[ZIP_LOCAL_SIZE]; + unsigned long long header = zip_u32(directory + at + 42); + int method = (int)zip_u16(directory + at + 10); + + found = 1; + if ((zip_u16(directory + at + 8) & 1) || (method != ZIP_STORED && method != ZIP_DEFLATED)) + { + snprintf(error, (size_t)error_size, "the map is %s in the zip", + (zip_u16(directory + at + 8) & 1) ? "encrypted" : "compressed in a way not read here"); + goto finish; + } + if (header + ZIP_LOCAL_SIZE > zip_size || !map_archives_read_at(zip, header, local, ZIP_LOCAL_SIZE) || + zip_u32(local) != ZIP_LOCAL_SIGNATURE) + { + snprintf(error, (size_t)error_size, "the zip's file header is damaged"); + goto finish; + } + output = open(path, O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, 0644); + if (output < 0) + { + snprintf(error, (size_t)error_size, "the map cannot be written"); + goto finish; + } + done = unzip_data(zip, header + ZIP_LOCAL_SIZE + zip_u16(local + 26) + zip_u16(local + 28), zip_size, method, + zip_u32(directory + at + 20), size, zip_u32(directory + at + 16), output, error, error_size); + } + at += ZIP_ENTRY_SIZE + entry_name_length + extra_length + comment_length; + } + if (!found) + snprintf(error, (size_t)error_size, "the zip has no %s of %llu bytes", file_name, size); + +finish: + if (output >= 0) + { + if (close(output) != 0) + done = 0; + if (!done) + unlink(path); + } + free(directory); + close(zip); + return done; +} + +/* ---------- checking */ + +int map_archives_verify(const char *path, const char *file_name, unsigned long long size, unsigned long piece_length, + const char *info_hash, char *error, int error_size) +{ + static const char hex[] = "0123456789abcdef"; + unsigned long long pieces = piece_length ? (size + piece_length - 1) / piece_length : 0; + unsigned char *hashes = NULL; + unsigned char *piece = NULL; + unsigned char digest[SHA1_DIGEST_SIZE]; + struct sha1_state state; + char prefix[512]; + char found[41]; + unsigned long long index; + int file; + int ok = 0; + + /* (a piece's hash is 20 bytes: a few MB of them for any map there is) */ + if (!size || !pieces || pieces > (16ULL << 20) / SHA1_DIGEST_SIZE || strlen(info_hash) != 40) + { + snprintf(error, (size_t)error_size, "the index's size or piece length is bad"); + return 0; + } + file = open(path, O_RDONLY | O_CLOEXEC); + if (file < 0) + { + snprintf(error, (size_t)error_size, "it cannot be read"); + return 0; + } + hashes = malloc((size_t)pieces * SHA1_DIGEST_SIZE); + piece = malloc(piece_length); + if (!hashes || !piece) + { + snprintf(error, (size_t)error_size, "no memory to check it"); + goto done; + } + for (index = 0; index < pieces; index++) + { + unsigned long length = index + 1 < pieces ? piece_length : (unsigned long)(size - index * piece_length); + + if (!map_archives_read_at(file, index * piece_length, piece, length)) + { + snprintf(error, (size_t)error_size, "it is shorter than the index's"); + goto done; + } + sha1_bytes(piece, length, hashes + index * SHA1_DIGEST_SIZE); + } + /* (the info dictionary as BitTorrent encodes it, its keys in order: + the index's maker made it so, tools/map_index.py) */ + snprintf(prefix, sizeof(prefix), "d6:lengthi%llue4:name%lu:%s12:piece lengthi%lue6:pieces%llu:", size, + (unsigned long)strlen(file_name), file_name, piece_length, pieces * SHA1_DIGEST_SIZE); + sha1_start(&state); + sha1_update(&state, prefix, (unsigned long)strlen(prefix)); + sha1_update(&state, hashes, (unsigned long)(pieces * SHA1_DIGEST_SIZE)); + sha1_update(&state, "e", 1); + sha1_finish(&state, digest); + for (index = 0; index < SHA1_DIGEST_SIZE; index++) + { + found[index * 2] = hex[digest[index] >> 4]; + found[index * 2 + 1] = hex[digest[index] & 15]; + } + found[40] = 0; + /* (the index's digits in either case) */ + ok = 1; + for (index = 0; index < 40; index++) + { + char wanted = info_hash[index]; + + if (wanted >= 'A' && wanted <= 'F') + wanted = (char)(wanted - 'A' + 'a'); + if (found[index] != wanted) + ok = 0; + } + if (!ok) + snprintf(error, (size_t)error_size, "its hash is %s, the index's %s", found, info_hash); + +done: + free(piece); + free(hashes); + close(file); + return ok; +} diff --git a/port/linux/src/map_downloads.c b/port/linux/src/map_downloads.c new file mode 100644 index 0000000000..7fb644ec9f --- /dev/null +++ b/port/linux/src/map_downloads.c @@ -0,0 +1,843 @@ +/* +MAP_DOWNLOADS.C + +Custom Edition maps downloaded from where the community keeps them +(map_downloads.h). + +A machine joining a game on a Custom Edition map it lacks, or has another +version of, whose host does not send it (map sharing does when the host +shares and names the map for its hash: port/linux/game/map_share.c), asks +here for it before it joins (ui_widget_port_join_map_fetch in +menu_functions.c; cache_files_map_present, when the host changes map after +the join; map_share.c, when the host turns the request down), with Custom +Edition's bitmaps.map, sounds.map and loc.map when they are missing. Each is +looked up in the index of the maps (maps.index: the file name and, for the +map, the header checksum the host sent, which is the game's map version) +and fetched by map_archives.c into custom_maps\downloads: out of HaloNet's +or HaloMaps's zip that holds it (maps.archives), else from a web seed +(maps.web_seeds), each checked against the index's hash before it is +taken. One file at a time, on map_archives.c's thread. + +A file that arrives is moved into custom_maps: a map as +_.map, the name map sharing gives a version of it +(map_share_name_digits), beside any other version there; a resource map +under its own name, only when there is none. No file already there is ever +replaced, renamed or changed. Once every file is there the menus try the +join again (map_downloads_take_ready). The menus show how it goes +(map_downloads_fetching, map_downloads_progress). +*/ + +#include "platform.h" +#include "posix.h" +#include "port_config.h" +#include "map_archives.h" +#include "map_downloads.h" + +#include +#include +#include +#include +#ifndef _WIN32 +#include +#endif + +#ifdef _WIN32 +#define PATH_SEPARATOR "\\" +#else +#define PATH_SEPARATOR "/" +#endif + +#define INDEX_FORMAT "# halo map index v1" +/* the Custom Edition maps' folders (custom_edition_cache.h's +CUSTOM_EDITION_MAP_DIRECTORY and CUSTOM_EDITION_INSTALL_MAP_DIRECTORY): +downloads go into the first */ +#define CUSTOM_MAPS_XBOX_PATH "d:\\custom_maps\\" +#define INSTALL_MAPS_XBOX_PATH "h:\\maps\\" +/* a Custom Edition map's level name (CUSTOM_EDITION_LEVEL_NAME_PREFIX) */ +#define LEVEL_NAME_PREFIX "custom_maps\\" +#define DOWNLOADS_FOLDER "downloads" +#define MAP_FILE_EXTENSION ".map" +/* the digits a map's name ends in after _ (map_share.h's +MAP_SHARE_NAME_DIGITS) */ +#define NAME_DIGITS 8 +#define FETCH_MAXIMUM_FILES 4 +#define FAILURE_SHOWN_MILLISECONDS 15000 +#define NAME_SIZE 128 + +/* (port/linux/game/map_share_files.c's: the digits a map file is named by, +.map's hash) */ +unsigned char map_share_name_digits(const char *folder, const char *name, char *digits); + +/* ---------- the index */ + +struct index_entry +{ + /* into maps_index.names */ + unsigned long name; + unsigned long checksum; + unsigned long long size; + unsigned long piece_length; + char info_hash[41]; + /* into maps_index.names: the archives' zips that hold it, as the + index's columns after the info hash (tab-separated "halonet:", + "halomaps:"; map_archives.h), "" for none */ + unsigned long sources; +}; + +static struct +{ + int loaded; + struct index_entry *entries; + int count; + char *names; + unsigned long names_size; + char path[1024]; +} maps_index; + +static int same_name(const char *a, const char *b) +{ + for (;; a++, b++) + { + char ca = *a, cb = *b; + + if (ca >= 'A' && ca <= 'Z') + ca = (char)(ca - 'A' + 'a'); + if (cb >= 'A' && cb <= 'Z') + cb = (char)(cb - 'A' + 'a'); + if (ca != cb) + return 0; + if (!ca) + return 1; + } +} + +static void index_path(char *path, int size) +{ + const char *name = config_string("maps.index"); + + if (name[0] == '/' || name[0] == '\\' || (name[0] && name[1] == ':')) + { + snprintf(path, (size_t)size, "%s", name); + return; + } + config_folder(path, (unsigned long)size); + snprintf(path + strlen(path), (size_t)size - strlen(path), "%s", name); +} + +/* reads the index once: each line a map's file name, header checksum, +size, piece length and info hash, and the archives' zips that hold it, +tab-separated (tools/map_index.py) */ +static void index_load(void) +{ + char *file; + size_t file_size = 0; + char *line; + char *next; + int capacity = 0; + int number = 0; + + if (maps_index.loaded) + return; + maps_index.loaded = 1; + index_path(maps_index.path, sizeof(maps_index.path)); + file = config_file_read(maps_index.path, &file_size); + if (!file) + { + platform_log("map downloads: the index %s cannot be read (maps.index)", maps_index.path); + return; + } + if (strncmp(file, INDEX_FORMAT, strlen(INDEX_FORMAT))) + { + platform_log("map downloads: %s is not a map index (its first line is not \"%s\")", maps_index.path, + INDEX_FORMAT); + free(file); + return; + } + maps_index.names = malloc(file_size + 1); + if (!maps_index.names) + { + free(file); + return; + } + for (line = file; line && *line; line = next) + { + char *fields[5]; + char *sources; + int field; + char *end; + struct index_entry *entry; + size_t name_length; + + number++; + next = strchr(line, '\n'); + if (next) + *next++ = 0; + end = line + strlen(line); + while (end > line && (end[-1] == '\r' || end[-1] == ' ')) + *--end = 0; + if (!line[0] || line[0] == '#') + continue; + fields[0] = line; + for (field = 1; field < 5; field++) + { + char *tab = strchr(fields[field - 1], '\t'); + + if (!tab) + break; + *tab = 0; + fields[field] = tab + 1; + } + sources = field == 5 ? strchr(fields[4], '\t') : NULL; + if (sources) + *sources++ = 0; + if (field < 5 || strlen(fields[4]) != 40) + { + platform_log("map downloads: %s line %d is not an entry (left out)", maps_index.path, number); + continue; + } + if (maps_index.count == capacity) + { + struct index_entry *grown; + + capacity = capacity ? capacity * 2 : 1024; + grown = realloc(maps_index.entries, (size_t)capacity * sizeof(*grown)); + if (!grown) + break; + maps_index.entries = grown; + } + entry = &maps_index.entries[maps_index.count]; + name_length = strlen(fields[0]); + entry->name = maps_index.names_size; + memcpy(maps_index.names + maps_index.names_size, fields[0], name_length + 1); + maps_index.names_size += (unsigned long)name_length + 1; + entry->checksum = strtoul(fields[1], NULL, 16); + entry->size = strtoull(fields[2], NULL, 10); + entry->piece_length = strtoul(fields[3], NULL, 10); + memcpy(entry->info_hash, fields[4], 41); + /* (the names and sources together are shorter than the file) */ + entry->sources = maps_index.names_size; + name_length = sources ? strlen(sources) : 0; + memcpy(maps_index.names + maps_index.names_size, sources ? sources : "", name_length + 1); + maps_index.names_size += (unsigned long)name_length + 1; + name_length = strlen(maps_index.names + entry->name); + if (!name_length || !entry->size || !entry->piece_length) + { + platform_log("map downloads: %s line %d has a bad size or piece length (left out)", maps_index.path, + number); + continue; + } + maps_index.count++; + } + free(file); + platform_log("map downloads: %d maps indexed in %s", maps_index.count, maps_index.path); +} + +/* the entry of the file named, of the checksum (0: any; an entry's 0 is +its own version's, as some maps' headers have, not any) */ +static const struct index_entry *index_find(const char *file_name, unsigned long checksum) +{ + int which; + + index_load(); + for (which = 0; which < maps_index.count; which++) + { + const struct index_entry *entry = &maps_index.entries[which]; + + if (same_name(maps_index.names + entry->name, file_name) && (!checksum || entry->checksum == checksum)) + return entry; + } + return NULL; +} + +/* the length of a name without the _ and hash digits it ends in (a map +named for its hash, map sharing's _); 0 if it ends in none */ +static size_t hashed_base_length(const char *name, size_t length) +{ + size_t index; + + if (length <= NAME_DIGITS + 1 || name[length - NAME_DIGITS - 1] != '_') + return 0; + for (index = length - NAME_DIGITS; index < length; index++) + { + char c = name[index]; + + if (!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'))) + return 0; + } + return length - NAME_DIGITS - 1; +} + +/* the entry of the file named (.map) or, for a level named for the +map's hash (_.map), of the name without the hash; of the +checksum (0: any) */ +static const struct index_entry *index_find_file(const char *file_name, unsigned long checksum) +{ + const struct index_entry *entry = index_find(file_name, checksum); + size_t length = strlen(file_name); + size_t base; + char name[NAME_SIZE]; + + if (entry || length <= strlen(MAP_FILE_EXTENSION) || length >= sizeof(name)) + return entry; + base = hashed_base_length(file_name, length - strlen(MAP_FILE_EXTENSION)); + if (!base) + return NULL; + snprintf(name, sizeof(name), "%.*s" MAP_FILE_EXTENSION, (int)base, file_name); + return index_find(name, checksum); +} + +/* ---------- map sharing's web seeds */ + +static int downloads_folder(char *path, int size); + +int map_downloads_web_seed(const char *file_name, unsigned long checksum, unsigned long long size, int which, + char *url, int url_size) +{ + const struct index_entry *entry; + + if (!config_boolean("maps.downloads") || !config_boolean("game.custom_edition") || !file_name) + return 0; + entry = index_find_file(file_name, checksum); + if (!entry || entry->size != size) + return 0; + return map_archives_web_seed_url(maps_index.names + entry->name, which, url, url_size); +} + +/* the range fetch's file (custom_maps/downloads/web_seed_range.part), set +when one starts */ +static char range_path[1100]; + +int map_downloads_range_start(const char *url, unsigned long long offset, unsigned long length) +{ + char folder[1024]; + unsigned long long received, total; + char archive[64]; + + /* (not while a map comes from the archives: one HTTPS request goes at a + time, posix_update.c, and that one may take minutes) */ + if (map_archives_poll(&received, &total, archive, sizeof(archive)) == _map_archives_running || + !downloads_folder(folder, sizeof(folder))) + { + return 0; + } + snprintf(range_path, sizeof(range_path), "%sweb_seed_range.part", folder); + return map_archives_range_start(url, offset, length, range_path); +} + +int map_downloads_range_read(unsigned long offset, void *buffer, unsigned long size) +{ + FILE *file; + int ok; + + if (!range_path[0] || map_archives_range_poll(NULL, 0) != _map_archives_done) + return 0; + file = fopen(range_path, "rb"); + if (!file) + return 0; + ok = fseek(file, (long)offset, SEEK_SET) == 0 && fread(buffer, 1, size, file) == size; + fclose(file); + return ok; +} + +int map_downloads_range_poll(char *error, int error_size) +{ + switch (map_archives_range_poll(error, error_size)) + { + case _map_archives_running: + return 1; + case _map_archives_done: + return 2; + case _map_archives_failed: + return 3; + default: + return 0; + } +} + +void map_downloads_range_stop(void) +{ + /* (one under way deletes its file as it ends) */ + if (map_archives_range_poll(NULL, 0) != _map_archives_running && range_path[0]) + unlink(range_path); + map_archives_range_stop(); +} + +/* ---------- paths */ + +static int file_present(const char *path) +{ + struct posix_file_information information; + + return posix_stat(path, &information) == 0 && !(information.flags & _posix_file_is_directory); +} + +/* a file moved to a name no file has: never in place of one (POSIX's +rename would replace it, so the name is taken first; Windows's fails) */ +static int move_to_new_name(const char *from, const char *to) +{ +#ifndef _WIN32 + int taken = open(to, O_WRONLY | O_CREAT | O_EXCL | O_CLOEXEC, 0644); + + if (taken < 0) + return 0; + close(taken); + if (rename(from, to) != 0) + { + unlink(to); + return 0; + } + return 1; +#else + return rename(from, to) == 0; +#endif +} + +/* the folder made if missing; 1 if it is there */ +static int folder_made(const char *path) +{ + struct posix_file_information information; + + if (posix_make_directory(path)) + return 1; + return posix_stat(path, &information) == 0 && (information.flags & _posix_file_is_directory); +} + +/* the custom_maps folder (made if missing), with its separator */ +static int custom_maps_folder(char *path, int size) +{ + size_t length; + + platform_translate_path(CUSTOM_MAPS_XBOX_PATH, path, (unsigned long)size); + length = strlen(path); + while (length && (path[length - 1] == '/' || path[length - 1] == '\\')) + path[--length] = 0; + if (!folder_made(path)) + { + platform_log("map downloads: the folder %s cannot be made", path); + return 0; + } + snprintf(path + length, (size_t)size - length, PATH_SEPARATOR); + return 1; +} + +/* custom_maps\downloads (made if missing), with its separator */ +static int downloads_folder(char *path, int size) +{ + size_t length; + + if (!custom_maps_folder(path, size)) + return 0; + length = strlen(path); + snprintf(path + length, (size_t)size - length, "%s", DOWNLOADS_FOLDER); + if (!folder_made(path)) + { + platform_log("map downloads: the folder %s cannot be made", path); + return 0; + } + length = strlen(path); + snprintf(path + length, (size_t)size - length, PATH_SEPARATOR); + return 1; +} + +/* the map's file name from its level name: custom_maps\ (or the +file's name alone) is .map; "" for any other (the game's own maps) */ +static void level_file_name(const char *level_name, char *file_name, int size) +{ + const char *file = level_name; + size_t prefix = strlen(LEVEL_NAME_PREFIX); + + if (!strncmp(level_name, LEVEL_NAME_PREFIX, prefix) || !strncmp(level_name, "custom_maps/", prefix)) + file = level_name + prefix; + else if (strpbrk(level_name, "\\/:")) + file = ""; + /* (a name with no folder, as the folders' files have) */ + if (!file[0] || strpbrk(file, "\\/:*?") || file[0] == '.' || + strlen(file) + strlen(MAP_FILE_EXTENSION) >= NAME_SIZE) + { + file_name[0] = 0; + return; + } + snprintf(file_name, (size_t)size, "%s" MAP_FILE_EXTENSION, file); +} + +/* whether a resource map is in a Custom Edition maps folder (custom_maps, +then a Custom Edition install's) */ +static int resource_map_present(const char *file_name) +{ + static const char *const folders[] = { CUSTOM_MAPS_XBOX_PATH, INSTALL_MAPS_XBOX_PATH }; + char xbox_path[256]; + char path[1024]; + int folder; + + for (folder = 0; folder < (int)(sizeof(folders) / sizeof(folders[0])); folder++) + { + /* (a Custom Edition install's folder only when paths.custom_edition names one) */ + if (folder == 1 && !config_string("paths.custom_edition")[0]) + continue; + snprintf(xbox_path, sizeof(xbox_path), "%s%s", folders[folder], file_name); + platform_translate_path(xbox_path, path, sizeof(path)); + if (file_present(path)) + return 1; + } + return 0; +} + +static int resource_map_name(const char *file_name) +{ + return same_name(file_name, "bitmaps.map") || same_name(file_name, "sounds.map") || same_name(file_name, "loc.map"); +} + +/* ---------- downloading */ + +/* how a file of a fetch is coming */ +enum +{ + /* waiting for the archives (one file at a time) */ + _fetch_waiting, + /* from an archive or a web seed (map_archives.c) */ + _fetch_running, +}; + +static struct +{ + int active; + char level_name[NAME_SIZE]; + unsigned long version; + struct + { + char name[NAME_SIZE]; + int done; + int phase; + const struct index_entry *entry; + /* where it is downloaded (custom_maps\downloads) */ + char path[1200]; + } files[FETCH_MAXIMUM_FILES]; + int count; + unsigned long started; + int ready; + char failure[192]; + unsigned long failed_time; +} fetch; + +static void fetch_stop(void) +{ + int which; + + for (which = 0; which < fetch.count; which++) + { + if (!fetch.files[which].done && fetch.files[which].phase == _fetch_running) + map_archives_stop(); + } + fetch.active = 0; + fetch.count = 0; +} + +static void fetch_fail(const char *name, const char *reason) +{ + snprintf(fetch.failure, sizeof(fetch.failure), "Could not download %s: %s", name, reason); + fetch.failed_time = GetTickCount() ? GetTickCount() : 1; + platform_log("map downloads: %s", fetch.failure); + fetch_stop(); +} + +int map_downloads_fetch(const char *level_name, unsigned long version, const char *files) +{ + char map_file[NAME_SIZE]; + char folder[1024]; + const char *text = files; + int count = 0; + const struct index_entry *wanted[FETCH_MAXIMUM_FILES]; + int which; + + /* (none while Custom Edition maps cannot be played: game.custom_edition) */ + if (!config_boolean("maps.downloads") || !config_boolean("game.custom_edition") || !level_name || !files || + !files[0]) + { + return 0; + } + if (fetch.active) + { + if (same_name(fetch.level_name, level_name) && fetch.version == version) + return 1; + platform_log("map downloads: the download of %s's files gives way to %s's", fetch.level_name, level_name); + fetch_stop(); + } + level_file_name(level_name, map_file, sizeof(map_file)); + while (*text) + { + /* (tab-separated: some maps' names have commas, none a tab) */ + const char *tab = strchr(text, '\t'); + int length = tab ? (int)(tab - text) : (int)strlen(text); + char name[NAME_SIZE]; + unsigned long checksum; + + if (length > 0 && length < NAME_SIZE && count < FETCH_MAXIMUM_FILES) + { + memcpy(name, text, (size_t)length); + name[length] = 0; + /* (the map is the host's version; a resource map any) */ + checksum = same_name(name, map_file) ? version : 0; + wanted[count] = index_find_file(name, checksum); + if (!wanted[count]) + { + platform_log("map downloads: %s (checksum %08lX) is not in the index: not downloaded", name, checksum); + return 0; + } + /* (one no source this build fetches from has: not started) */ + if (!map_archives_available(maps_index.names + wanted[count]->sources)) + { + platform_log("map downloads: no source of maps.archives or maps.web_seeds has %s", name); + return 0; + } + count++; + } + text = tab ? tab + 1 : text + length; + } + if (!count || !downloads_folder(folder, sizeof(folder))) + return 0; + memset(&fetch, 0, sizeof(fetch)); + for (which = 0; which < count; which++) + { + const struct index_entry *entry = wanted[which]; + + snprintf(fetch.files[which].path, sizeof(fetch.files[which].path), "%s%s", folder, + maps_index.names + entry->name); + snprintf(fetch.files[which].name, sizeof(fetch.files[which].name), "%s", maps_index.names + entry->name); + fetch.files[which].entry = entry; + fetch.files[which].phase = _fetch_waiting; + fetch.count++; + } + snprintf(fetch.level_name, sizeof(fetch.level_name), "%s", level_name); + fetch.version = version; + fetch.active = 1; + fetch.started = GetTickCount(); + platform_log("map downloads: downloading %d file(s) for %s: %s", count, level_name, files); + return 1; +} + +/* a file that arrived: into custom_maps, never in place of a file there. +A map as _.map, map sharing's name of its version, beside any +other version; a resource map under its name, when none is there yet */ +static int fetch_file_done(int which) +{ + char folder[1024]; + char destination[1200]; + const char *name = fetch.files[which].name; + size_t length = strlen(name); + + if (!custom_maps_folder(folder, sizeof(folder))) + return 0; + if (resource_map_name(name)) + { + snprintf(destination, sizeof(destination), "%s%s", folder, name); + } + else + { + char base[NAME_SIZE]; + char xbox_folder[64]; + char digits[NAME_DIGITS + 1]; + + if (length <= strlen(MAP_FILE_EXTENSION) || length >= sizeof(base)) + return 0; + snprintf(base, sizeof(base), "%.*s", (int)(length - strlen(MAP_FILE_EXTENSION)), name); + snprintf(xbox_folder, sizeof(xbox_folder), "%s%s\\", CUSTOM_MAPS_XBOX_PATH, DOWNLOADS_FOLDER); + if (!map_share_name_digits(xbox_folder, base, digits)) + { + platform_log("map downloads: %s could not be hashed for its name", name); + return 0; + } + snprintf(destination, sizeof(destination), "%s%s_%s" MAP_FILE_EXTENSION, folder, base, digits); + } + if (file_present(destination)) + { + /* (the same version: its name is its hash's, or a resource map + that came meanwhile) */ + platform_log("map downloads: %s is there already", destination); + unlink(fetch.files[which].path); + } + else if (!move_to_new_name(fetch.files[which].path, destination)) + { + platform_log("map downloads: %s could not be moved into %s", name, folder); + return 0; + } + fetch.files[which].done = 1; + platform_log("map downloads: %s is %s", name, destination); + return 1; +} + +static void fetch_poll(void) +{ + int which; + int done = 0; + + if (!fetch.active) + return; + for (which = 0; which < fetch.count; which++) + { + const struct index_entry *entry = fetch.files[which].entry; + unsigned long long received, total; + char archive[64]; + enum map_archives_state state; + + if (fetch.files[which].done) + { + done++; + continue; + } + if (fetch.files[which].phase == _fetch_waiting) + { + int other; + + /* (one at a time: the next file waits while another's fetch is + under way or its result not yet taken) */ + for (other = 0; other < fetch.count && (fetch.files[other].done || fetch.files[other].phase != _fetch_running); + other++) + { + } + if (other < fetch.count || + map_archives_poll(&received, &total, archive, sizeof(archive)) == _map_archives_running) + { + continue; + } + map_archives_stop(); + if (!map_archives_start(fetch.files[which].name, entry->size, entry->piece_length, entry->info_hash, + maps_index.names + entry->sources, fetch.files[which].path)) + { + fetch_fail(fetch.files[which].name, "it could not be started"); + return; + } + fetch.files[which].phase = _fetch_running; + continue; + } + state = map_archives_poll(&received, &total, archive, sizeof(archive)); + if (state == _map_archives_running) + continue; + map_archives_stop(); + if (state != _map_archives_done) + { + fetch_fail(fetch.files[which].name, "no archive or web seed gave it (debug.txt says why)"); + return; + } + if (!fetch_file_done(which)) + { + fetch_fail(fetch.files[which].name, "it could not be put in place"); + return; + } + done++; + } + if (done == fetch.count) + { + platform_log("map downloads: every file of %s is there (%lu s)", fetch.level_name, + (GetTickCount() - fetch.started) / 1000); + fetch.active = 0; + fetch.ready = 1; + } +} + +static void size_text(unsigned long long bytes, char *text, int size) +{ + if (bytes >= 100ULL << 20) + snprintf(text, (size_t)size, "%llu MB", bytes >> 20); + else if (bytes >= 1ULL << 20) + snprintf(text, (size_t)size, "%.1f MB", (double)bytes / (double)(1 << 20)); + else + snprintf(text, (size_t)size, "%llu KB", bytes >> 10); +} + +int map_downloads_fetching(char *status, int size) +{ + int which; + + if (fetch.active) + { + for (which = 0; which < fetch.count; which++) + { + unsigned long long received, total; + char archive[64]; + char which_text[24] = ""; + char have[32], all[32]; + + if (fetch.files[which].done || fetch.files[which].phase != _fetch_running) + continue; + if (fetch.count > 1) + snprintf(which_text, sizeof(which_text), " (%d of %d)", which + 1, fetch.count); + map_archives_poll(&received, &total, archive, sizeof(archive)); + size_text(received, have, sizeof(have)); + size_text(total, all, sizeof(all)); + if (total) + { + snprintf(status, (size_t)size, "Downloading %s%s from %s: %s of %s", fetch.files[which].name, + which_text, archive, have, all); + } + else + { + snprintf(status, (size_t)size, "Downloading %s%s from %s", fetch.files[which].name, which_text, + archive); + } + return 1; + } + snprintf(status, (size_t)size, "Downloading..."); + return 1; + } + if (fetch.failed_time && GetTickCount() - fetch.failed_time < FAILURE_SHOWN_MILLISECONDS) + { + snprintf(status, (size_t)size, "%s", fetch.failure); + return 1; + } + return 0; +} + +int map_downloads_progress(float *fraction, char *name, int size) +{ + float done = 0.0f; + int which; + + if (!fetch.active) + return 0; + /* (each file an equal share: the size of one not begun is not known) */ + for (which = 0; which < fetch.count; which++) + { + if (fetch.files[which].done) + { + done += 1.0f; + } + else if (fetch.files[which].phase == _fetch_running) + { + unsigned long long received, total; + char archive[64]; + + map_archives_poll(&received, &total, archive, sizeof(archive)); + if (total) + done += (float)((double)received / (double)total); + } + } + *fraction = fetch.count ? done / (float)fetch.count : 0.0f; + /* (the map's name: its file's, the fetch's first, without .map) */ + snprintf(name, (size_t)size, "%.*s", (int)(strlen(fetch.files[0].name) > strlen(MAP_FILE_EXTENSION) ? + strlen(fetch.files[0].name) - strlen(MAP_FILE_EXTENSION) : strlen(fetch.files[0].name)), fetch.files[0].name); + return 1; +} + +int map_downloads_take_ready(char *level_name, int size) +{ + if (!fetch.ready) + return 0; + fetch.ready = 0; + snprintf(level_name, (size_t)size, "%s", fetch.level_name); + return 1; +} + +void map_downloads_cancel(void) +{ + if (fetch.active) + { + platform_log("map downloads: the download of %s's files is stopped", fetch.level_name); + fetch_stop(); + } + fetch.ready = 0; +} + +void map_downloads_poll(void) +{ + fetch_poll(); +} diff --git a/port/linux/src/map_downloads.h b/port/linux/src/map_downloads.h new file mode 100644 index 0000000000..ce39c87d27 --- /dev/null +++ b/port/linux/src/map_downloads.h @@ -0,0 +1,63 @@ +/* +MAP_DOWNLOADS.H + +Custom Edition maps downloaded from where the community keeps them +(map_downloads.c): a map a machine lacks when joining a game whose host does +not send it (map sharing, port/linux/game/map_share.c: a host of another +build, or one that does not share) comes from HaloNet's or HaloMaps's +archives or a web seed, as the index of the maps +(maps.index, port/assets/network/map_index.txt) names it, checked against +the index's hash. + +Only integers and strings cross here: the game's units call these. +*/ + +#ifndef __HALO_LINUX_MAP_DOWNLOADS_H +#define __HALO_LINUX_MAP_DOWNLOADS_H + +/* every frame, on the game's thread, a window or not (main.c's loop) */ +void map_downloads_poll(void); + +/* Map sharing's web seeds (port/linux/game/map_share.c): the URL, on the +which-th web seed (from 0), of the index's file that map sharing downloads +as file_name (.map, or _.map for a level named for its +hash; bitmaps.map and the other resource maps), of the header checksum +(the host's version; 0 for a resource map) and size size. 1 if there is one +(maps.downloads on, the index has the file at that size, and maps.web_seeds +that many https:// folders); else 0, as always on Android and the web. */ +int map_downloads_web_seed(const char *file_name, unsigned long checksum, unsigned long long size, int which, + char *url, int url_size); +/* starts fetching length bytes of the file at url from offset, on a thread +of its own, into a file of custom_maps/downloads: 1 if started */ +int map_downloads_range_start(const char *url, unsigned long long offset, unsigned long length); +/* the range fetch's state: 0 idle, 1 under way, 2 done, 3 failed (why in +error) */ +int map_downloads_range_poll(char *error, int error_size); +/* size bytes of a range fetched, from offset in it, into buffer: 1 if read */ +int map_downloads_range_read(unsigned long offset, void *buffer, unsigned long size); +/* stops the range fetch, or lets go of a finished one (its file deleted) */ +void map_downloads_range_stop(void); + +/* the files a joining machine lacks for the host's map: level_name the +map's (custom_maps\, or custom_maps\_), version its +header checksum as the host sent it (0: any), files their names, +tab-separated (".map\tbitmaps.map"; custom_edition_cache_files_missing). +Starts downloading them, if the index has them all and maps.downloads is on: +returns 1, and the join is to be tried again once map_downloads_take_ready +says they are there. 0 when nothing was started */ +int map_downloads_fetch(const char *level_name, unsigned long version, const char *files); +/* what the download is doing, for the menus' status line: 1 and the text +while one is under way (or just failed), else 0 */ +int map_downloads_fetching(char *status, int size); +/* how a download under way goes, for the screen it shows over the menus +(port/linux/game/download_screen.c): 1 while one is, with its share done (0 +to 1; 0 while its size is not known yet) and the map's name (its file's, +without .map), else 0 */ +int map_downloads_progress(float *fraction, char *name, int size); +/* once, when a download's files are all in place: 1 and the level name +whose join is to be tried again */ +int map_downloads_take_ready(char *level_name, int size); +/* stops a download */ +void map_downloads_cancel(void); + +#endif diff --git a/port/linux/src/map_sha1.c b/port/linux/src/map_sha1.c new file mode 100644 index 0000000000..960b7e2999 --- /dev/null +++ b/port/linux/src/map_sha1.c @@ -0,0 +1,140 @@ +/* +MAP_SHA1.C + +SHA-1 (map_sha1.h), the straightforward way: a block at a time, with +the words of each block read big-endian, as the standard writes them. +*/ + +#include "map_sha1.h" + +#include + +#define ROTATE_LEFT(value, bits) ((((value) << (bits)) | ((value) >> (32 - (bits)))) & 0xFFFFFFFFUL) + +static void sha1_block(struct sha1_state *state, const unsigned char *block) +{ + unsigned long words[80]; + unsigned long a = state->state[0], b = state->state[1], c = state->state[2], d = state->state[3], + e = state->state[4]; + int index; + + for (index = 0; index < 16; index++) + { + words[index] = (unsigned long)block[index * 4] << 24 | (unsigned long)block[index * 4 + 1] << 16 | + (unsigned long)block[index * 4 + 2] << 8 | (unsigned long)block[index * 4 + 3]; + } + for (; index < 80; index++) + { + words[index] = ROTATE_LEFT(words[index - 3] ^ words[index - 8] ^ words[index - 14] ^ words[index - 16], 1); + } + for (index = 0; index < 80; index++) + { + unsigned long f, k, temporary; + + if (index < 20) + { + f = (b & c) | (~b & d); + k = 0x5A827999UL; + } + else if (index < 40) + { + f = b ^ c ^ d; + k = 0x6ED9EBA1UL; + } + else if (index < 60) + { + f = (b & c) | (b & d) | (c & d); + k = 0x8F1BBCDCUL; + } + else + { + f = b ^ c ^ d; + k = 0xCA62C1D6UL; + } + temporary = (ROTATE_LEFT(a, 5) + (f & 0xFFFFFFFFUL) + e + k + words[index]) & 0xFFFFFFFFUL; + e = d; + d = c; + c = ROTATE_LEFT(b, 30); + b = a; + a = temporary; + } + state->state[0] = (state->state[0] + a) & 0xFFFFFFFFUL; + state->state[1] = (state->state[1] + b) & 0xFFFFFFFFUL; + state->state[2] = (state->state[2] + c) & 0xFFFFFFFFUL; + state->state[3] = (state->state[3] + d) & 0xFFFFFFFFUL; + state->state[4] = (state->state[4] + e) & 0xFFFFFFFFUL; +} + +void sha1_start(struct sha1_state *state) +{ + state->state[0] = 0x67452301UL; + state->state[1] = 0xEFCDAB89UL; + state->state[2] = 0x98BADCFEUL; + state->state[3] = 0x10325476UL; + state->state[4] = 0xC3D2E1F0UL; + state->length = 0; + state->buffered = 0; +} + +void sha1_update(struct sha1_state *state, const void *bytes, unsigned long size) +{ + const unsigned char *input = bytes; + + state->length += size; + if (state->buffered) + { + unsigned long take = 64 - (unsigned long)state->buffered; + + if (take > size) + take = size; + memcpy(state->buffer + state->buffered, input, take); + state->buffered += (int)take; + input += take; + size -= take; + if (state->buffered < 64) + return; + sha1_block(state, state->buffer); + state->buffered = 0; + } + while (size >= 64) + { + sha1_block(state, input); + input += 64; + size -= 64; + } + if (size) + { + memcpy(state->buffer, input, size); + state->buffered = (int)size; + } +} + +void sha1_finish(struct sha1_state *state, unsigned char digest[SHA1_DIGEST_SIZE]) +{ + unsigned long long bits = state->length * 8; + unsigned char padding[72]; + int padding_size = (state->buffered < 56 ? 56 : 120) - state->buffered; + int index; + + memset(padding, 0, sizeof(padding)); + padding[0] = 0x80; + for (index = 0; index < 8; index++) + padding[padding_size + index] = (unsigned char)(bits >> (56 - index * 8)); + sha1_update(state, padding, (unsigned long)(padding_size + 8)); + for (index = 0; index < 5; index++) + { + digest[index * 4] = (unsigned char)(state->state[index] >> 24); + digest[index * 4 + 1] = (unsigned char)(state->state[index] >> 16); + digest[index * 4 + 2] = (unsigned char)(state->state[index] >> 8); + digest[index * 4 + 3] = (unsigned char)state->state[index]; + } +} + +void sha1_bytes(const void *bytes, unsigned long size, unsigned char digest[SHA1_DIGEST_SIZE]) +{ + struct sha1_state state; + + sha1_start(&state); + sha1_update(&state, bytes, size); + sha1_finish(&state, digest); +} diff --git a/port/linux/src/map_sha1.h b/port/linux/src/map_sha1.h new file mode 100644 index 0000000000..3eb55bdd1c --- /dev/null +++ b/port/linux/src/map_sha1.h @@ -0,0 +1,30 @@ +/* +MAP_SHA1.H + +SHA-1 (FIPS 180-4), which a map's BitTorrent info hash is made with: the +index of the maps (port/assets/network/map_index.txt) names each map by it, +and a map downloaded is checked against it (map_archives.c). Not a +cryptographic use: the hashes are checked against those the index's maker +computed, and the index ships with the game. +*/ + +#ifndef __HALO_LINUX_MAP_SHA1_H +#define __HALO_LINUX_MAP_SHA1_H + +#define SHA1_DIGEST_SIZE 20 + +struct sha1_state +{ + unsigned long state[5]; + unsigned long long length; + unsigned char buffer[64]; + int buffered; +}; + +void sha1_start(struct sha1_state *state); +void sha1_update(struct sha1_state *state, const void *bytes, unsigned long size); +void sha1_finish(struct sha1_state *state, unsigned char digest[SHA1_DIGEST_SIZE]); +/* the digest of one buffer */ +void sha1_bytes(const void *bytes, unsigned long size, unsigned char digest[SHA1_DIGEST_SIZE]); + +#endif diff --git a/port/linux/src/nv2a_vsh.c b/port/linux/src/nv2a_vsh.c index 20df75e047..99a2c58a9c 100644 --- a/port/linux/src/nv2a_vsh.c +++ b/port/linux/src/nv2a_vsh.c @@ -586,3 +586,41 @@ char *nv2a_vertex_shader_to_glsl(const DWORD *instructions, unsigned long instru ); return text.buffer; } + +/* The fixed-function pipeline's vertex shader, for the draws that select it +(SetVertexShader with 0): only the loading screen's +(progress_bar.c), which gives each vertex its position, diffuse color and +up to four texture coordinates in immediate mode. d3d8_gl.c transforms the +positions by the world, view and projection matrices before the draw, so the +position here is already in Direct3D's clip space. */ +char *nv2a_fixed_function_glsl(void) +{ + struct xgpu_text text = { 0 }; + unsigned long index; + +#ifdef HALO_GLES + xgpu_text_append(&text, "#version %s\n", xgpu_capabilities.shading_language); +#endif + xgpu_text_append(&text, "%s", shader_prologue); + for (index = 0; index < XGPU_VERTEX_ATTRIBUTE_COUNT; index++) + xgpu_text_append(&text, "layout(location = %lu) in vec4 v%lu_in;\n", index, index); + xgpu_text_append(&text, + "void main()\n{\n" + "\tgl_Position = v0_in;\n" +#ifdef HALO_GLES + "\tgl_Position.y = -gl_Position.y;\n" + "\tgl_Position.z = 2.0 * gl_Position.z - gl_Position.w;\n" +#endif + "\tgl_PointSize = 1.0;\n" + "\txD0 = clamp(v3_in, 0.0, 1.0);\n" + "\txD1 = clamp(v4_in, 0.0, 1.0);\n" + "\txB0 = vec4(0.0, 0.0, 0.0, 1.0);\n" + "\txB1 = vec4(0.0, 0.0, 0.0, 1.0);\n" + "\txT0 = v9_in;\n" + "\txT1 = v10_in;\n" + "\txT2 = v11_in;\n" + "\txT3 = v12_in;\n" + "\txFog = 1.0;\n" + "}\n"); + return text.buffer; +} diff --git a/port/linux/src/port_config.c b/port/linux/src/port_config.c index 94e390a5df..34675a5a47 100644 --- a/port/linux/src/port_config.c +++ b/port/linux/src/port_config.c @@ -419,6 +419,34 @@ static const struct config_setting config_settings[] = "download it (and the resource maps it needs) from the game's players\n" "into custom_maps, if its host shares it (network.map_share); false\n" "leaves the game, saying which map is missing." }, + { "maps.downloads", _config_boolean, "true", "HALO_MAP_DOWNLOADS", _environment_value, _platform_all, + "Download a Custom Edition map this machine lacks when joining a game\n" + "whose host does not send it (a host of another build, or one that\n" + "does not share: network.map_share), from the community's map\n" + "archives (archives, web_seeds), when the index of the maps (index)\n" + "has it; false never downloads from them." }, + { "maps.download_screen", _config_boolean, "true", "HALO_MAP_DOWNLOAD_SCREEN", _environment_value, + _platform_all, + "While a map downloads before its game is joined, show Halo's loading\n" + "screen over the menus, its light sweeping across as the map comes (B\n" + "stops the download); false leaves the menus up, their status line\n" + "saying how the download goes." }, + { "maps.archives", _config_string, "\"halonet,halomaps\"", "HALO_MAP_ARCHIVES", _environment_value, + _platform_desktop, + "The community's map archives a missing map is taken from, out of the\n" + "zip that holds it, in this order (comma-separated): halonet\n" + "(maps.halonet.net), halomaps (halomaps.org); then the web seeds.\n" + "Each map is checked against the index's hash before it is used." }, + { "maps.web_seeds", _config_string, "\"https://halomaps.fractumseraph.net/maps/\"", "HALO_MAP_WEB_SEEDS", + _environment_value, _platform_desktop, + "Comma-separated https:// folders holding every map of the index under\n" + "its file name (the maps' seed boxes), tried after the archives, and\n" + "asked for pieces beside the players when map sharing downloads a map;\n" + "empty for none (docs/map_downloads.md)." }, + { "maps.index", _config_string, "\"map_index.txt\"", "HALO_MAP_INDEX", _environment_value, _platform_all, + "The index of the maps (tools/map_index.py), beside this file unless\n" + "a full path: port/assets/network/map_index.txt, which the builds put\n" + "there." }, { "network.coop_public", _config_boolean, "false", "HALO_NET_COOP_PUBLIC", _environment_value, _platform_all, "Whether an online co-op game (Create Game > Internet, a SINGLEPLAYER\n" "map) starts as PUBLIC or, false, PRIVATE: Server Setup's LISTING in\n" diff --git a/port/linux/src/posix_update.c b/port/linux/src/posix_update.c index ca411c8ed2..dd3767e0dc 100644 --- a/port/linux/src/posix_update.c +++ b/port/linux/src/posix_update.c @@ -52,6 +52,11 @@ static const char *const certificate_bundles[] = }; static pthread_once_t certificates_once = PTHREAD_ONCE_INIT; +/* one request at a time: the self-updater's thread and the map archives' +(map_archives.c) both ask, and Mbed TLS is built without its threading +support (its PSA crypto, and https_get's one connection, are for one thread +at a time) */ +static pthread_mutex_t request_lock = PTHREAD_MUTEX_INITIALIZER; static mbedtls_x509_crt certificates; static int certificates_loaded; static int crypto_ready; @@ -312,14 +317,17 @@ struct download update_progress_proc progress; void *context; unsigned long long received, total; + /* (update_request's: the download stops once it is not 0) */ + const volatile int *stop; }; -/* (a release is tens of megabytes: a body past this fills no disk) */ -#define MAXIMUM_DOWNLOAD_SIZE (512ull * 1024 * 1024) +/* (a release is tens of megabytes, and the largest map of the index (a web +seed's file, map_archives.c) about 760: a body past this fills no disk) */ +#define MAXIMUM_DOWNLOAD_SIZE (1024ull * 1024 * 1024) static int body_write(struct download *download, const unsigned char *data, size_t size) { - if (download->received + size > MAXIMUM_DOWNLOAD_SIZE) + if (download->received + size > MAXIMUM_DOWNLOAD_SIZE || (download->stop && *download->stop)) return 0; if (fwrite(data, 1, size, download->file) != size) return 0; @@ -391,18 +399,21 @@ static int read_body(struct connection *connection, struct download *download, i } } -/* one GET: the body into download on 200, the Location on a redirect; -the status, or 0 on failure */ -static int https_get(const char *url, struct download *download, char *location, size_t location_size, char *error, - int error_size) +/* one GET (or a POST of form, or a GET of range, "bytes=-"): +the body into download on 200 (206 for a range), the Location on a +redirect; the status, or 0 on failure */ +static int https_get(const char *url, const char *form, const char *range, const char *agent, + struct download *download, char *location, size_t location_size, char *error, int error_size) { static struct connection connection; char host[256], port[16], path[2048]; char request[3072]; char line[MAXIMUM_HEADER_SIZE]; + char content_range[128]; unsigned long long length = 0; int have_length = 0, chunked = 0, status = 0; + content_range[0] = 0; if (!parse_url(url, host, sizeof(host), port, sizeof(port), path, sizeof(path))) { snprintf(error, (size_t)error_size, "not an https:// address: %s", url); @@ -413,10 +424,25 @@ static int https_get(const char *url, struct download *download, char *location, connection_free(&connection); return 0; } - snprintf(request, sizeof(request), - "GET %s HTTP/1.1\r\nHost: %s\r\nUser-Agent: " UPDATE_USER_AGENT "\r\n" - "Accept: */*\r\nConnection: close\r\n\r\n", - path, host); + if (form) + { + snprintf(request, sizeof(request), + "POST %s HTTP/1.1\r\nHost: %s\r\nUser-Agent: %s\r\nAccept: */*\r\nConnection: close\r\n" + "Content-Type: application/x-www-form-urlencoded\r\nContent-Length: %lu\r\n\r\n%s", + path, host, agent, (unsigned long)strlen(form), form); + } + else + { + snprintf(request, sizeof(request), + "GET %s HTTP/1.1\r\nHost: %s\r\nUser-Agent: %s\r\nAccept: */*\r\n%s%s%sConnection: close\r\n\r\n", + path, host, agent, range ? "Range: " : "", range ? range : "", range ? "\r\n" : ""); + } + if (strlen(request) >= sizeof(request) - 1) + { + snprintf(error, (size_t)error_size, "the request to %s is too long", host); + connection_free(&connection); + return 0; + } if (!connection_write(&connection, request, strlen(request)) || !connection_read_line(&connection, line, sizeof(line)) || sscanf(line, "HTTP/%*d.%*d %d", &status) != 1) @@ -463,8 +489,25 @@ static int https_get(const char *url, struct download *download, char *location, { snprintf(location, location_size, "%s", value); } + else if (!strcasecmp(line, "Content-Range")) + { + snprintf(content_range, sizeof(content_range), "%s", value); + } } - if (status == 200) + /* (a range's answer must be that range: "bytes -/") */ + if (range && status == 206) + { + char expected[96]; + + snprintf(expected, sizeof(expected), "bytes %s/", range + strlen("bytes=")); + if (strncmp(content_range, expected, strlen(expected)) != 0) + { + snprintf(error, (size_t)error_size, "the server sent another part of the file (%s)", content_range); + connection_free(&connection); + return 0; + } + } + if (status == (range ? 206 : 200)) { download->total = have_length && !chunked ? length : 0; if (!read_body(&connection, download, chunked, length, have_length && !chunked)) @@ -479,6 +522,67 @@ static int https_get(const char *url, struct download *download, char *location, int update_download(const char *url, const char *path, update_progress_proc progress, void *context, char *error, int error_size) +{ + return update_request(url, NULL, NULL, NULL, path, progress, context, error, error_size); +} + +static int request_locked(const char *url, const char *form, const char *range, const char *agent, + const volatile int *stop, const char *path, update_progress_proc progress, void *context, char *error, + int error_size); + +int update_request(const char *url, const char *form, const char *agent, const volatile int *stop, + const char *path, update_progress_proc progress, void *context, char *error, int error_size) +{ + int result; + + pthread_mutex_lock(&request_lock); + result = request_locked(url, form, NULL, agent, stop, path, progress, context, error, error_size); + pthread_mutex_unlock(&request_lock); + return result; +} + +/* (what the body brought, for update_request_range's check) */ +static void range_progress(void *context, unsigned long long received, unsigned long long total) +{ + (void)total; + *(unsigned long long *)context = received; +} + +int update_request_range(const char *url, const char *agent, const volatile int *stop, unsigned long long offset, + unsigned long long length, const char *path, char *error, int error_size) +{ + char range[64]; + unsigned long long received = 0; + int result; + + if (!length) + { + snprintf(error, (size_t)error_size, "an empty range"); + return 0; + } + snprintf(range, sizeof(range), "bytes=%llu-%llu", offset, offset + length - 1); + pthread_mutex_lock(&request_lock); + /* (stopped while another request held the lock: not asked) */ + if (stop && *stop) + { + pthread_mutex_unlock(&request_lock); + snprintf(error, (size_t)error_size, "stopped"); + return 0; + } + result = request_locked(url, NULL, range, agent, stop, path, range_progress, &received, error, error_size); + pthread_mutex_unlock(&request_lock); + if (result && received != length) + { + snprintf(error, (size_t)error_size, "the server sent %llu bytes of the %llu asked for", received, length); + unlink(path); + return 0; + } + return result; +} + +static int request_locked(const char *url, const char *form, const char *range, const char *agent, + const volatile int *stop, const char *path, update_progress_proc progress, void *context, char *error, + int error_size) { char current[2048]; char location[2048]; @@ -500,6 +604,7 @@ int update_download(const char *url, const char *path, update_progress_proc prog memset(&download, 0, sizeof(download)); download.progress = progress; download.context = context; + download.stop = stop; download.file = fopen(path, "wb"); if (!download.file) { @@ -509,9 +614,10 @@ int update_download(const char *url, const char *path, update_progress_proc prog snprintf(current, sizeof(current), "%s", url); for (redirect = 0; redirect <= MAXIMUM_REDIRECTS; redirect++) { - int status = https_get(current, &download, location, sizeof(location), error, error_size); + int status = https_get(current, form, range, agent ? agent : UPDATE_USER_AGENT, &download, location, + sizeof(location), error, error_size); - if (status == 200) + if (status == (range ? 206 : 200)) { if (fclose(download.file) != 0) { @@ -535,9 +641,13 @@ int update_download(const char *url, const char *path, update_progress_proc prog { snprintf(current, sizeof(current), "%s", location); } + /* (what a form's answer redirects to is fetched) */ + form = NULL; continue; } - if (status) + if (status == 200 && range) + snprintf(error, (size_t)error_size, "the server sends no part of a file, only the whole"); + else if (status) snprintf(error, (size_t)error_size, "the server answered %d", status); break; } diff --git a/port/linux/src/update.h b/port/linux/src/update.h index 1a479499a6..5a3e1caaec 100644 --- a/port/linux/src/update.h +++ b/port/linux/src/update.h @@ -3,7 +3,8 @@ UPDATE.H What the desktop self-updater (updater.c) needs of the system: a download over HTTPS, and putting files in place of the running game's and starting -it again. posix_update.c does it on Linux (Mbed TLS, the system's +it again. The map archives (map_archives.c) download over HTTPS with it +too. posix_update.c does it on Linux (Mbed TLS, the system's certificate authorities), win32_update.c on Windows (WinHTTP). The Android app updates itself in Java (port/android). @@ -23,6 +24,20 @@ error */ int update_download(const char *url, const char *path, update_progress_proc progress, void *context, char *error, int error_size); +/* update_download's request with more of it given: form, when not NULL, is +POSTed (application/x-www-form-urlencoded, a redirect after it followed with +a GET); agent, when not NULL, is the User-Agent; and the download stops, +failing, once *stop (when stop is not NULL) is not 0 */ +int update_request(const char *url, const char *form, const char *agent, const volatile int *stop, + const char *path, update_progress_proc progress, void *context, char *error, int error_size); + +/* update_request's GET of length bytes of the file at url from offset (a +Range request) into the file at path: 1 when the server sent those bytes +(206), else 0 and why in error (a server that sends the whole file instead +is refused, unread) */ +int update_request_range(const char *url, const char *agent, const volatile int *stop, unsigned long long offset, + unsigned long long length, const char *path, char *error, int error_size); + /* the full path of this executable; 1 on success */ int update_executable_path(char *path, int size); diff --git a/port/linux/src/xgpu.h b/port/linux/src/xgpu.h index 6e5058ea0c..b617dd2cab 100644 --- a/port/linux/src/xgpu.h +++ b/port/linux/src/xgpu.h @@ -99,6 +99,9 @@ lights the diffuse color for each pixel (nv2a_pixel_shader_key per_pixel_lighting). Returns a malloc'd string. */ char *nv2a_vertex_shader_to_glsl(const DWORD *instructions, unsigned long instruction_count, unsigned long packed_attribute_mask, const struct nv2a_vertex_lighting *lighting); +/* the fixed-function pipeline's vertex shader (the loading screen's draws): +positions already in clip space. Returns a malloc'd string. */ +char *nv2a_fixed_function_glsl(void); /* ---------- pixel shaders */ diff --git a/port/linux/src/xiso.c b/port/linux/src/xiso.c index 84fae910c9..29a08f3a3b 100644 --- a/port/linux/src/xiso.c +++ b/port/linux/src/xiso.c @@ -316,11 +316,102 @@ static int copy_file(struct xiso_image *image, const struct xiso_file *file, con return 1; } +/* The loading screen's picture (source/interface/progress_bar.c reads it as +maps/loading.tga). The retail game has no such file: its default.xbe holds +the picture, 320 by 240, as runs of 4-bit greys (a byte each: the grey's +high four bits in its low nibble, the run's length in its high one) after +the width and height as 32-bit numbers, and its loading screen decodes them +into the texture. Found by those two numbers followed by runs that fill the +picture exactly, and written into the maps folder as the uncompressed 24-bit +TGA progress_bar.c reads (port/web/site/xiso-worker.js does the same). Nothing is +written when it is not found: the loading screen then makes its own. */ +static void write_loading_picture(struct xiso_image *image, const struct xiso_file *xbe, const char *folder) +{ + enum + { + WIDTH = 320, + HEIGHT = 240, + PIXELS = WIDTH * HEIGHT, + TGA_HEADER_SIZE = 18, + MAXIMUM_XBE_SIZE = 64 << 20, + }; + unsigned char *data = NULL, *greys = NULL, *tga = NULL; + unsigned long at, next, pixel = 0; + char path[1300]; + int output, y, x; + + if (!xbe->size || xbe->size > MAXIMUM_XBE_SIZE) + return; + data = malloc(xbe->size); + greys = malloc(PIXELS); + tga = malloc(TGA_HEADER_SIZE + PIXELS * 3); + if (!data || !greys || !tga || + !read_at(image, image->partition + (unsigned long long)xbe->sector * SECTOR_SIZE, data, xbe->size)) + { + goto done; + } + for (at = 0; at + 8 <= xbe->size && pixel != PIXELS; at++) + { + if (read_u32(data + at) != WIDTH || read_u32(data + at + 4) != HEIGHT) + continue; + for (pixel = 0, next = at + 8; next < xbe->size && pixel < PIXELS; next++) + { + unsigned long run = data[next] >> 4; + + if (!run || pixel + run > PIXELS) + break; + memset(greys + pixel, (data[next] & 0x0F) << 4, run); + pixel += run; + } + } + if (pixel != PIXELS) + goto done; + memset(tga, 0, TGA_HEADER_SIZE); + tga[2] = 2; + tga[12] = WIDTH & 0xFF; + tga[13] = WIDTH >> 8; + tga[14] = HEIGHT & 0xFF; + tga[15] = HEIGHT >> 8; + tga[16] = 24; + /* (rows from the bottom; blue, green and red each the grey) */ + for (y = 0; y < HEIGHT; y++) + { + for (x = 0; x < WIDTH; x++) + { + unsigned char *out = tga + TGA_HEADER_SIZE + ((unsigned long)y * WIDTH + x) * 3; + + out[0] = out[1] = out[2] = greys[(unsigned long)(HEIGHT - 1 - y) * WIDTH + x]; + } + } + snprintf(path, sizeof(path), "%s/loading.tga", folder); + output = open(path, O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC | O_NOFOLLOW, 0644); + if (output >= 0) + { + int whole = write(output, tga, TGA_HEADER_SIZE + PIXELS * 3) == TGA_HEADER_SIZE + PIXELS * 3; + + if (close(output) != 0) + whole = 0; + /* (none rather than one cut short, which the loading screen would + read past) */ + if (whole) + platform_log("extracting maps/loading.tga (the loading screen's picture, from default.xbe)"); + else + unlink(path); + } + +done: + free(data); + free(greys); + free(tga); +} + int xiso_extract_maps(const char *image_path, const char *destination, xiso_progress_proc progress, void *context, char *error, int error_size) { struct xiso_image image; struct xiso_file *entries = NULL; + /* the root's default.xbe (the loading screen's picture) */ + struct xiso_file xbe; unsigned char *table = NULL; unsigned char *buffer = NULL; unsigned long root_sector, root_size; @@ -351,6 +442,17 @@ int xiso_extract_maps(const char *image_path, const char *destination, xiso_prog fail(&image, "The disc image's file system is damaged.%s", NULL); goto done; } + memset(&xbe, 0, sizeof(xbe)); + { + struct directory_walk walk = { table, root_size, entries, 0, MAXIMUM_FILES, 0, 0 }; + + walk_directory(&walk, 0, 0); + for (index = 0; index < walk.entry_count; index++) + { + if (names_match(entries[index].name, "default.xbe")) + xbe = entries[index]; + } + } { struct directory_walk walk = { table, root_size, entries, 0, MAXIMUM_FILES, 0, 1 }; @@ -375,13 +477,14 @@ int xiso_extract_maps(const char *image_path, const char *destination, xiso_prog /* its files */ { struct directory_walk walk = { table, root_size, entries, 0, MAXIMUM_FILES, 0, 0 }; - int has_ui = 0; + int has_ui = 0, has_loading = 0; walk_directory(&walk, 0, 0); for (index = 0; index < walk.entry_count; index++) { total += entries[index].size; has_ui |= names_match(entries[index].name, "ui.map"); + has_loading |= names_match(entries[index].name, "loading.tga"); } if (!has_ui) { @@ -398,6 +501,8 @@ int xiso_extract_maps(const char *image_path, const char *destination, xiso_prog if (!copy_file(&image, &entries[index], path, buffer, &done, total, progress, context)) goto done; } + if (!has_loading) + write_loading_picture(&image, &xbe, partial); if (rename(partial, final) != 0) { fail(&image, "Could not create %s.", final); diff --git a/port/web/site/xiso-worker.js b/port/web/site/xiso-worker.js index 4aaaa49f53..c64a50a50c 100644 --- a/port/web/site/xiso-worker.js +++ b/port/web/site/xiso-worker.js @@ -25,6 +25,11 @@ Each map is checked as the game checks it when it loads it (cache_files.c): "head" and "foot" signatures, the Xbox's cache version, and the build of a retail disc (01.10.12.2276) or of this decompilation's (01.01.14.2342). +The loading screen's picture, which the retail disc has no file of, is +taken out of the image's default.xbe and written beside the maps as the +loading.tga the game reads (loadingPicture; xiso.c's write_loading_picture +does the same). Without it the loading screen makes clouds of its own. + Messages from the page: { type: 'image', file } or { type: 'folder', files } (a maps folder's File objects). To the page: { type: 'progress', file, done, total }, then { type: 'done', files, bytes } or { type: 'error', message }. @@ -45,6 +50,11 @@ const COPY_CHUNK = 4 * 1024 * 1024; const MAP_HEADER_SIZE = 0x800; const CACHE_VERSION = 5; const BUILDS = ['01.10.12.2276', '01.01.14.2342']; +// the loading screen's picture (source/interface/progress_bar.c) +const LOADING_WIDTH = 320; +const LOADING_HEIGHT = 240; +const TGA_HEADER_SIZE = 18; +const MAXIMUM_XBE_SIZE = 64 * 1024 * 1024; // written last: the page starts the game only when it is there const COMPLETE_MARKER = '.complete'; @@ -156,22 +166,77 @@ async function checkedFiles(candidates) { return files; } +// The loading screen's picture out of a default.xbe, as the TGA the game +// reads (uncompressed, 24 bits, rows from the bottom), or null. The +// executable holds it, 320 by 240, as runs of 4-bit greys (a byte each: the +// grey's high four bits in its low nibble, the run's length in its high one) +// after the width and height as 32-bit numbers: found by those two numbers +// followed by runs that fill the picture exactly. +function loadingPicture(xbe) { + const pixels = LOADING_WIDTH * LOADING_HEIGHT; + const greys = new Uint8Array(pixels); + let found = false; + for (let at = 0; at + 8 <= xbe.length && !found; at++) { + if (u32(xbe, at) !== LOADING_WIDTH || u32(xbe, at + 4) !== LOADING_HEIGHT) continue; + let pixel = 0; + for (let next = at + 8; next < xbe.length && pixel < pixels; next++) { + const run = xbe[next] >> 4; + if (!run || pixel + run > pixels) break; + greys.fill((xbe[next] & 0x0F) << 4, pixel, pixel + run); + pixel += run; + } + found = pixel === pixels; + } + if (!found) return null; + const tga = new Uint8Array(TGA_HEADER_SIZE + pixels * 3); + tga[2] = 2; + tga[12] = LOADING_WIDTH & 0xFF; + tga[13] = LOADING_WIDTH >> 8; + tga[14] = LOADING_HEIGHT & 0xFF; + tga[15] = LOADING_HEIGHT >> 8; + tga[16] = 24; + for (let y = 0; y < LOADING_HEIGHT; y++) { + const row = greys.subarray((LOADING_HEIGHT - 1 - y) * LOADING_WIDTH, (LOADING_HEIGHT - y) * LOADING_WIDTH); + for (let x = 0; x < LOADING_WIDTH; x++) { + const out = TGA_HEADER_SIZE + (y * LOADING_WIDTH + x) * 3; + tga[out] = tga[out + 1] = tga[out + 2] = row[x]; + } + } + return tga; +} + +// the root's default.xbe's loading picture, as a file to copy, or null +async function loadingPictureFile(file, volume, rootEntries) { + const xbe = rootEntries.find((entry) => !entry.directory && entry.name.toLowerCase() === 'default.xbe'); + if (!xbe || !xbe.size || xbe.size > MAXIMUM_XBE_SIZE) return null; + const offset = volume.partition + xbe.sector * SECTOR_SIZE; + if (offset + xbe.size > file.size) return null; + const tga = loadingPicture(await readAt(file, offset, xbe.size)); + return tga && { name: 'loading.tga', size: tga.length, read: async (at, size) => tga.subarray(at, at + size) }; +} + async function imageFiles(file) { const volume = await findVolume(file); if (!volume) throw new Error('This file is not an Xbox disc image (no XDVDFS volume was found).'); const root = await readDirectory(file, volume, volume.rootSector, volume.rootSize); if (!root) throw new Error("The disc image's file system is damaged."); - const maps = walkDirectory(root).find((entry) => entry.directory && entry.name.toLowerCase() === 'maps'); + const rootEntries = walkDirectory(root); + const maps = rootEntries.find((entry) => entry.directory && entry.name.toLowerCase() === 'maps'); if (!maps) throw new Error('The disc image has no maps folder: it is not a Halo disc.'); const table = await readDirectory(file, volume, maps.sector, maps.size); if (!table) throw new Error("The disc image's maps folder is damaged."); - return checkedFiles(walkDirectory(table).filter((entry) => !entry.directory).map((entry) => { + const files = await checkedFiles(walkDirectory(table).filter((entry) => !entry.directory).map((entry) => { const offset = volume.partition + entry.sector * SECTOR_SIZE; if (offset + entry.size > file.size) { throw new Error(`The disc image ends before ${entry.name} does: is it complete?`); } return { name: entry.name, size: entry.size, read: (at, size) => readAt(file, offset + at, Math.min(size, entry.size - at)) }; })); + if (!files.some((entry) => entry.name.toLowerCase() === 'loading.tga')) { + const picture = await loadingPictureFile(file, volume, rootEntries); + if (picture) files.push(picture); + } + return files; } async function folderFiles(list) { @@ -250,5 +315,5 @@ if (typeof onmessage !== 'undefined' || typeof WorkerGlobalScope !== 'undefined' // (for the tests: port/web/tests) if (typeof module !== 'undefined') { - module.exports = { findVolume, walkDirectory, mapProblem, imageFiles, folderFiles, plainName }; + module.exports = { findVolume, walkDirectory, mapProblem, imageFiles, folderFiles, plainName, loadingPicture }; } diff --git a/port/web/src/web_map_downloads.c b/port/web/src/web_map_downloads.c new file mode 100644 index 0000000000..3b345439aa --- /dev/null +++ b/port/web/src/web_map_downloads.c @@ -0,0 +1,85 @@ +/* Custom Edition maps downloaded from the community's archives + * (port/linux/src/map_downloads.h) for the web build: there are none. The + * page fetches what it plays itself, and has no HTTPS download of the + * platform layer's (update.h), so map_downloads.c and map_archives*.c are + * left out of the build (tools/web_build.py, WEB_EXCLUDE). These stand in for + * the game's calls: nothing is downloaded, as with maps.downloads off. */ + +#include "map_downloads.h" + +void map_downloads_poll(void) +{ +} + +int map_downloads_fetch(const char *level_name, unsigned long version, const char *files) +{ + (void)level_name; + (void)version; + (void)files; + return 0; +} + +int map_downloads_fetching(char *status, int size) +{ + (void)status; + (void)size; + return 0; +} + +int map_downloads_progress(float *fraction, char *name, int size) +{ + (void)fraction; + (void)name; + (void)size; + return 0; +} + +int map_downloads_take_ready(char *level_name, int size) +{ + (void)level_name; + (void)size; + return 0; +} + +void map_downloads_cancel(void) +{ +} + +int map_downloads_web_seed(const char *file_name, unsigned long checksum, unsigned long long size, int which, + char *url, int url_size) +{ + (void)file_name; + (void)checksum; + (void)size; + (void)which; + (void)url; + (void)url_size; + return 0; +} + +int map_downloads_range_start(const char *url, unsigned long long offset, unsigned long length) +{ + (void)url; + (void)offset; + (void)length; + return 0; +} + +int map_downloads_range_read(unsigned long offset, void *buffer, unsigned long size) +{ + (void)offset; + (void)buffer; + (void)size; + return 0; +} + +int map_downloads_range_poll(char *error, int error_size) +{ + if (error && error_size > 0) + error[0] = 0; + return 0; +} + +void map_downloads_range_stop(void) +{ +} diff --git a/port/web/tests/xiso.test.js b/port/web/tests/xiso.test.js index 5d22e1cd15..f20b4d4e28 100644 --- a/port/web/tests/xiso.test.js +++ b/port/web/tests/xiso.test.js @@ -61,9 +61,9 @@ function directoryTable(entries) { return table; } -// an image: its maps folder's files, where its game partition starts, and -// other entries of its root -function image({ maps, partition = 0, rootEntries = [] }) { +// an image: its maps folder's files, where its game partition starts, its +// default.xbe and other entries of its root +function image({ maps, partition = 0, rootEntries = [], xbe = new Uint8Array(100) }) { const chunks = new Map(); let nextSector = 0x30; const allocate = (bytes) => { @@ -76,7 +76,7 @@ function image({ maps, partition = 0, rootEntries = [] }) { const mapsTable = directoryTable(mapEntries); const mapsSector = allocate(mapsTable); const root = directoryTable([{ name: 'maps', directory: true, sector: mapsSector, size: mapsTable.length }, - { name: 'default.xbe', sector: allocate(new Uint8Array(100)), size: 100 }, ...rootEntries]); + { name: 'default.xbe', sector: allocate(xbe), size: xbe.length }, ...rootEntries]); const rootSector = allocate(root); const size = partition + nextSector * SECTOR; const bytes = new Uint8Array(size); @@ -168,3 +168,82 @@ test('a maps folder chosen as files is checked as an image is', async () => { assert.deepStrictEqual(result.map((file) => file.name).sort(), ['a10.map', 'bloodgulch.map', 'loading.tga', 'ui.map']); await assert.rejects(xiso.folderFiles(files.filter((file) => file.name !== 'ui.map')), /no ui\.map/); }); + +// the loading screen's picture (xiso-worker.js's loadingPicture): made-up +// executables holding a picture of grey bands as the retail one holds its own +const LOADING_WIDTH = 320; +const LOADING_HEIGHT = 240; +const loadingSizes = new Uint8Array([64, 1, 0, 0, 240, 0, 0, 0]); +const loadingGreys = Uint8Array.from({ length: LOADING_WIDTH * LOADING_HEIGHT }, + (_, pixel) => ((Math.floor(pixel / LOADING_WIDTH / 15) % 16) << 4)); + +// greys (multiples of 16) as the executable's runs: a byte each, the run's +// length in the high nibble, the grey's high bits in the low one +function loadingRuns(greys) { + const out = []; + for (let at = 0; at < greys.length;) { + let length = 1; + while (at + length < greys.length && greys[at + length] === greys[at] && length < 15) length++; + out.push(length << 4 | greys[at] >> 4); + at += length; + } + return Uint8Array.from(out); +} + +function concatenate(...parts) { + const out = new Uint8Array(parts.reduce((sum, part) => sum + part.length, 0)); + let at = 0; + for (const part of parts) { + out.set(part, at); + at += part.length; + } + return out; +} + +// (another 320, 240 before it, whose runs do not fill a picture) +const loadingXbe = concatenate(new Uint8Array(1000).fill(0xCC), loadingSizes, new Uint8Array([0x10, 0x00]), + new Uint8Array(64).fill(0x90), loadingSizes, loadingRuns(loadingGreys), new Uint8Array(1000).fill(0xCC)); + +test("the loading screen's picture is found in default.xbe and written as the TGA the game reads", () => { + const tga = xiso.loadingPicture(loadingXbe); + assert.ok(tga); + // (progress_bar.c: an uncompressed 24-bit picture of 320 by 240) + assert.strictEqual(tga[2], 2); + assert.strictEqual(tga[16], 24); + assert.strictEqual(tga[12] | tga[13] << 8, LOADING_WIDTH); + assert.strictEqual(tga[14] | tga[15] << 8, LOADING_HEIGHT); + assert.strictEqual(tga.length, 18 + LOADING_WIDTH * LOADING_HEIGHT * 3); + // (rows from the bottom, the grey in each channel) + for (const y of [0, 100, LOADING_HEIGHT - 1]) { + const row = tga.subarray(18 + (LOADING_HEIGHT - 1 - y) * LOADING_WIDTH * 3, 18 + (LOADING_HEIGHT - y) * LOADING_WIDTH * 3); + for (let x = 0; x < LOADING_WIDTH; x += 37) { + const grey = loadingGreys[y * LOADING_WIDTH + x]; + assert.deepStrictEqual([...row.subarray(x * 3, x * 3 + 3)], [grey, grey, grey]); + } + } +}); + +test('runs that do not fill the picture exactly are not it', () => { + const runs = loadingRuns(loadingGreys); + assert.strictEqual(xiso.loadingPicture(new Uint8Array(100).fill(0xCC)), null); + assert.strictEqual(xiso.loadingPicture(concatenate(loadingSizes, runs.subarray(0, -1))), null); + // (a run past the picture's end: its last 15 pixels as 14 and then 2) + assert.strictEqual(xiso.loadingPicture(concatenate(loadingSizes, runs.subarray(0, -1), new Uint8Array([0xE0, 0x20]))), null); + // (a run of none) + assert.strictEqual(xiso.loadingPicture(concatenate(loadingSizes, runs.subarray(0, -1), new Uint8Array([0x00, 0xF0]))), null); +}); + +test("an image whose maps folder has no loading.tga gets one from its default.xbe; one that has one keeps it", async () => { + const maps = goodMaps.filter((map) => map.name !== 'loading.tga'); + const files = await xiso.imageFiles(image({ maps, xbe: loadingXbe })); + const picture = files.find((file) => file.name === 'loading.tga'); + assert.ok(picture); + assert.strictEqual(picture.size, 18 + LOADING_WIDTH * LOADING_HEIGHT * 3); + assert.deepStrictEqual([...(await picture.read(0, 18))], [...xiso.loadingPicture(loadingXbe).subarray(0, 18)]); + const kept = await xiso.imageFiles(image({ maps: goodMaps, xbe: loadingXbe })); + assert.strictEqual(kept.filter((file) => file.name === 'loading.tga').length, 1); + assert.strictEqual(kept.find((file) => file.name === 'loading.tga').size, 50); + // (no picture in the executable: none, and the game makes clouds) + const none = await xiso.imageFiles(image({ maps })); + assert.ok(!none.some((file) => file.name === 'loading.tga')); +}); diff --git a/port/windows/src/win32_update.c b/port/windows/src/win32_update.c index b245830dee..9b39c16fbf 100644 --- a/port/windows/src/win32_update.c +++ b/port/windows/src/win32_update.c @@ -20,6 +20,9 @@ Paths are UTF-8, as SDL gives them. #define UPDATE_USER_AGENT L"halo-ce-universal-updater" #define TIMEOUT_MILLISECONDS 20000 +/* (posix_update.c's: a release is tens of megabytes, and the largest map of +the index about 760: a body past this fills no disk) */ +#define MAXIMUM_DOWNLOAD_SIZE (1024ull * 1024 * 1024) /* (WinHTTP's TLS 1.3 flag, missing from older SDKs) */ #ifndef WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3 @@ -42,9 +45,62 @@ static void set_error(char *error, int error_size, const char *what) int update_download(const char *url, const char *path, update_progress_proc progress, void *context, char *error, int error_size) { - wchar_t wide_url[2048], wide_path[MAX_PATH * 2], host[256], url_path[2048]; + return update_request(url, NULL, NULL, NULL, path, progress, context, error, error_size); +} + +static int request(const char *url, const char *form, const char *range, const char *agent, + const volatile int *stop, const char *path, update_progress_proc progress, void *context, char *error, + int error_size); + +int update_request(const char *url, const char *form, const char *agent, const volatile int *stop, + const char *path, update_progress_proc progress, void *context, char *error, int error_size) +{ + return request(url, form, NULL, agent, stop, path, progress, context, error, error_size); +} + +/* (what the body brought, for update_request_range's check) */ +static void range_progress(void *context, unsigned long long received, unsigned long long total) +{ + (void)total; + *(unsigned long long *)context = received; +} + +int update_request_range(const char *url, const char *agent, const volatile int *stop, unsigned long long offset, + unsigned long long length, const char *path, char *error, int error_size) +{ + char range[64]; + unsigned long long received = 0; + + if (!length) + { + snprintf(error, (size_t)error_size, "an empty range"); + return 0; + } + snprintf(range, sizeof(range), "bytes=%llu-%llu", offset, offset + length - 1); + if (!request(url, NULL, range, agent, stop, path, range_progress, &received, error, error_size)) + return 0; + if (received != length) + { + wchar_t wide_path[MAX_PATH * 2]; + + snprintf(error, (size_t)error_size, "the server sent %llu bytes of the %llu asked for", received, length); + if (wide_from_utf8(path, wide_path, MAX_PATH * 2)) + DeleteFileW(wide_path); + return 0; + } + return 1; +} + +/* one GET (or a POST of form, or a GET of range, "bytes=-", +whose answer must be 206 and the range's length) into the file at path */ +static int request(const char *url, const char *form, const char *range, const char *agent, + const volatile int *stop, const char *path, update_progress_proc progress, void *context, char *error, + int error_size) +{ + wchar_t wide_url[2048], wide_path[MAX_PATH * 2], host[256], url_path[2048], wide_agent[256]; + wchar_t range_header[96] = { 0 }; URL_COMPONENTS components; - HINTERNET session = NULL, connection = NULL, request = NULL; + HINTERNET session = NULL, connection = NULL, http = NULL; HANDLE file = INVALID_HANDLE_VALUE; DWORD status = 0, status_size = sizeof(status); DWORD length = 0, length_size = sizeof(length); @@ -68,7 +124,9 @@ int update_download(const char *url, const char *path, update_progress_proc prog snprintf(error, (size_t)error_size, "not an https:// address: %s", url); return 0; } - session = WinHttpOpen(UPDATE_USER_AGENT, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, + if (!agent || !wide_from_utf8(agent, wide_agent, 256)) + wcscpy(wide_agent, UPDATE_USER_AGENT); + session = WinHttpOpen(wide_agent, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); if (!session) { @@ -87,22 +145,52 @@ int update_download(const char *url, const char *path, update_progress_proc prog connection = WinHttpConnect(session, host, components.nPort, 0); if (connection) { - request = WinHttpOpenRequest(connection, L"GET", url_path, NULL, WINHTTP_NO_REFERER, + http = WinHttpOpenRequest(connection, form ? L"POST" : L"GET", url_path, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE); } - if (!request || !WinHttpSendRequest(request, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0) || - !WinHttpReceiveResponse(request, NULL)) + if (range) + _snwprintf(range_header, sizeof(range_header) / sizeof(*range_header) - 1, L"Range: %hs\r\n", range); + /* (a form's answer, redirected, is fetched with a GET: WinHTTP's own + redirect policy) */ + if (!http || + !WinHttpSendRequest(http, + form ? L"Content-Type: application/x-www-form-urlencoded\r\n" : range ? range_header : + WINHTTP_NO_ADDITIONAL_HEADERS, + form || range ? (DWORD)-1L : 0, form ? (LPVOID)form : WINHTTP_NO_REQUEST_DATA, + form ? (DWORD)strlen(form) : 0, form ? (DWORD)strlen(form) : 0, 0) || + !WinHttpReceiveResponse(http, NULL)) { set_error(error, error_size, "could not reach the server"); goto done; } - if (!WinHttpQueryHeaders(request, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, - WINHTTP_HEADER_NAME_BY_INDEX, &status, &status_size, WINHTTP_NO_HEADER_INDEX) || status != 200) + if (!WinHttpQueryHeaders(http, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, + WINHTTP_HEADER_NAME_BY_INDEX, &status, &status_size, WINHTTP_NO_HEADER_INDEX) || + status != (range ? 206u : 200u)) { - snprintf(error, (size_t)error_size, "the server answered %lu", (unsigned long)status); + if (range && status == 200) + snprintf(error, (size_t)error_size, "the server sends no part of a file, only the whole"); + else + snprintf(error, (size_t)error_size, "the server answered %lu", (unsigned long)status); goto done; } - if (!WinHttpQueryHeaders(request, WINHTTP_QUERY_CONTENT_LENGTH | WINHTTP_QUERY_FLAG_NUMBER, + /* (a range's answer must be that range: "bytes -/") */ + if (range) + { + wchar_t content_range[128]; + DWORD content_range_size = sizeof(content_range); + char expected[96], got[128]; + + snprintf(expected, sizeof(expected), "bytes %s/", range + strlen("bytes=")); + if (!WinHttpQueryHeaders(http, WINHTTP_QUERY_CONTENT_RANGE, WINHTTP_HEADER_NAME_BY_INDEX, content_range, + &content_range_size, WINHTTP_NO_HEADER_INDEX) || + WideCharToMultiByte(CP_UTF8, 0, content_range, -1, got, (int)sizeof(got), NULL, NULL) <= 0 || + strncmp(got, expected, strlen(expected)) != 0) + { + snprintf(error, (size_t)error_size, "the server sent another part of the file"); + goto done; + } + } + if (!WinHttpQueryHeaders(http, WINHTTP_QUERY_CONTENT_LENGTH | WINHTTP_QUERY_FLAG_NUMBER, WINHTTP_HEADER_NAME_BY_INDEX, &length, &length_size, WINHTTP_NO_HEADER_INDEX)) { length = 0; @@ -118,7 +206,12 @@ int update_download(const char *url, const char *path, update_progress_proc prog char buffer[16384]; DWORD count = 0, written = 0; - if (!WinHttpReadData(request, buffer, sizeof(buffer), &count)) + if (stop && *stop) + { + snprintf(error, (size_t)error_size, "stopped"); + goto done; + } + if (!WinHttpReadData(http, buffer, sizeof(buffer), &count)) { set_error(error, error_size, "the download broke off"); goto done; @@ -131,6 +224,11 @@ int update_download(const char *url, const char *path, update_progress_proc prog goto done; } received += count; + if (received > MAXIMUM_DOWNLOAD_SIZE) + { + snprintf(error, (size_t)error_size, "the download is too large"); + goto done; + } if (progress) progress(context, received, length); } @@ -148,8 +246,8 @@ int update_download(const char *url, const char *path, update_progress_proc prog if (!succeeded) DeleteFileW(wide_path); } - if (request) - WinHttpCloseHandle(request); + if (http) + WinHttpCloseHandle(http); if (connection) WinHttpCloseHandle(connection); if (session) diff --git a/source/cache/cache_files.c b/source/cache/cache_files.c index 134890bb75..7ce97d8d6c 100644 --- a/source/cache/cache_files.c +++ b/source/cache/cache_files.c @@ -1081,11 +1081,24 @@ boolean cache_files_map_present( return TRUE; if (custom_edition_level_name(map_name)) { + char files[256]; + if (custom_edition_cache_present(map_name, version, message, sizeof(message)) || map_share_download_begin(map_name, version, message)) { return TRUE; } + /* port: a map the host does not send (it is not named for its hash: + a host of another build) downloaded from the community's archives, + if the index of the maps has it (port/linux/src/map_downloads.c): the + player told to join again once it is there */ + if (custom_edition_cache_files_missing(map_name, version, files, sizeof(files)) > 0 && + map_downloads_fetch(map_name, version, files)) + { + snprintf(message, sizeof(message), + "The host's map %.64s is being downloaded from the map archives (Join Game shows how it goes). Join " + "again when it is there.", name); + } } else { diff --git a/source/interface/progress_bar.c b/source/interface/progress_bar.c index 1e0a3ac934..48adecafc8 100644 --- a/source/interface/progress_bar.c +++ b/source/interface/progress_bar.c @@ -302,6 +302,9 @@ static void this_is_awful( static void progress_bar_render( real progress); +/* port: progress_bar_eachframe's release, a function of its own */ +static void progress_bar_let_go( + void); void tgaLoadHeader( FILE *file, @@ -313,11 +316,18 @@ void tgaLoadImageData( /* ---------- globals */ +/* port: rasterizer_xbox.c's (rasterizer_xbox_internal.h, which this file +does not include) */ +void rasterizer_forget_hardware_state( + void); + extern struct pixel_shader_definition blur_shader; extern struct pixel_shader_definition regular_shader; extern unsigned long current_time; static boolean progress_bar_rendering_enabled= TRUE; +/* port: a map's download shows the screen (progress_bar_download_display) */ +static boolean progress_bar_downloading= FALSE; /* the compressed monk chant played behind the loading screen */ byte compressed_monk_tone[18396]= @@ -1774,7 +1784,6 @@ void progress_bar_eachframe( void) { unsigned long time= GetTickCount(); - long sound_index; if (progress_bar_restart) { @@ -1783,50 +1792,85 @@ void progress_bar_eachframe( progress_bar_mode.state= 1; } - if (time - progress_bar_globals.start_time>1000) + /* port: (not while a map's download shows the screen over the menus, + whose frames come here) */ + if (time - progress_bar_globals.start_time>1000 && !progress_bar_downloading) + progress_bar_let_go(); + + return; +} + +/* port: the textures and sounds the screen made, let go of (as +progress_bar_eachframe did once a load was over; the original released +texture0 twice there, the second time already NULL: left out) */ +static void progress_bar_let_go( + void) +{ + long sound_index; + + last_t= 0; + if (progress_bar_mode.texture0) { - last_t= 0; - if (progress_bar_mode.texture0) - { - IDirect3DTexture8_Release(progress_bar_mode.texture0); - progress_bar_mode.texture0= NULL; - } - if (progress_bar_mode.texture1) - { - IDirect3DTexture8_Release(progress_bar_mode.texture1); - progress_bar_mode.texture1= NULL; - } - if (progress_bar_mode.texture0) + IDirect3DTexture8_Release(progress_bar_mode.texture0); + progress_bar_mode.texture0= NULL; + } + if (progress_bar_mode.texture1) + { + IDirect3DTexture8_Release(progress_bar_mode.texture1); + progress_bar_mode.texture1= NULL; + } + for (sound_index= 0; sound_index=0.f) && (progress<=1.f)); - if (progress_bar_mode.active && progress>0.f) + if ((progress_bar_mode.active || progress_bar_downloading) && progress>0.f) { if (!progress_bar_mode.texture0) { progress_bar_make_stuff_ready(); - progress_bar_globals.initial_progress= progress; + /* port: a download's screen sweeps from its start, 0 (it may + first be drawn at 1, its files there and being checked: 0/0) */ + progress_bar_globals.initial_progress= progress_bar_downloading ? 0.f : progress; } if (progress_bar_rendering_enabled) @@ -2029,7 +2073,15 @@ static void progress_bar_render( IDirect3DDevice8_GetTransform(global_d3d_device, D3DTS_PROJECTION, &progress_bar_globals.saved_projection); IDirect3DDevice8_SetTransform(global_d3d_device, D3DTS_WORLD, &progress_bar_globals.world); IDirect3DDevice8_SetTransform(global_d3d_device, D3DTS_VIEW, &progress_bar_globals.view); - IDirect3DDevice8_SetTransform(global_d3d_device, D3DTS_PROJECTION, &progress_bar_globals.projection); + /* port: on a wide screen, the 640 columns in its middle, as the menus are + drawn (the frame before, which the trails are, is those columns: + d3d8_gl.c's front buffer) */ + { + D3DXMATRIX projection= progress_bar_globals.projection; + + projection._11*= 640.f/(real)halo_screen_width(); + IDirect3DDevice8_SetTransform(global_d3d_device, D3DTS_PROJECTION, &projection); + } IDirect3DDevice8_SetRenderState(global_d3d_device, D3DRS_ALPHABLENDENABLE, TRUE); IDirect3DDevice8_SetRenderState(global_d3d_device, D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); IDirect3DDevice8_SetRenderState(global_d3d_device, D3DRS_DESTBLEND, D3DBLEND_ONE); @@ -2087,6 +2139,9 @@ static void progress_bar_render( IDirect3DDevice8_SetTransform(global_d3d_device, D3DTS_VIEW, &progress_bar_globals.saved_view); IDirect3DDevice8_SetTransform(global_d3d_device, D3DTS_PROJECTION, &progress_bar_globals.saved_projection); IDirect3DDevice8_BlockUntilVerticalBlank(global_d3d_device); + /* port: the rasterizer's caches of the device's states learn what was + set here */ + rasterizer_forget_hardware_state(); return; } @@ -2232,6 +2287,66 @@ static void progress_bar_make_stuff_ready( return; } +/* port: a value of the clouds' lattice, 0 to 1, the same at every run */ +static real progress_bar_cloud_lattice( + long x, + long y) +{ + unsigned long hash= (unsigned long)x*374761393u + (unsigned long)y*668265263u; + + hash= (hash ^ (hash>>13))*1274126177u; + hash^= hash>>16; + + return (real)(hash & 0xffff)/65535.f; +} + +/* port: soft clouds, four octaves of smoothed value noise that wrap at the +picture's edges, as loading.tga intensities (tgaLoadImageData's tint) */ +static void progress_bar_make_clouds( + unsigned long *pixels, + long width, + long height) +{ + long x, y; + + for (y= 0; y1.f) + value= 1.f; + intensity= (unsigned long)(value*255.f); + pixels[y*width + x]= ((intensity<<9) | (intensity & ~1))<<7 | intensity>>2; + } + } + + return; +} + static void progress_bar_load_loading_texture( IDirect3DTexture8 **texture) { @@ -2241,6 +2356,8 @@ static void progress_bar_load_loading_texture( struct tga_image image; D3DLOCKED_RECT locked_rect; unsigned long *pixels; + /* port: whether a picture was read (else the clouds, below) */ + boolean loaded= FALSE; FILE *file; IDirect3DDevice8_CreateTexture(global_d3d_device, 320, 240, 1, 0, D3DFMT_LIN_A8B8G8R8, 0, texture); @@ -2263,9 +2380,17 @@ static void progress_bar_load_loading_texture( { image.pixels= pixels; tgaLoadImageData(file, &image); + loaded= TRUE; } fclose(file); } + /* port: no loading.tga (no disc has one as a file: the retail + default.xbe holds the picture, which importing a disc writes as + loading.tga, port/linux/src/xiso.c and port/web/site/xiso-worker.js): the + picture the light sweeps over is made here, clouds, tinted as a + loading.tga's grey would be */ + if (!loaded) + progress_bar_make_clouds(pixels, 320, 240); IDirect3DTexture8_UnlockRect(*texture, 0); return; diff --git a/source/interface/progress_bar.h b/source/interface/progress_bar.h index 819f508fa7..d8470eed52 100644 --- a/source/interface/progress_bar.h +++ b/source/interface/progress_bar.h @@ -39,6 +39,12 @@ void progress_bar_display( real progress); boolean progress_bar_is_stuff_ready( void); +/* port: the screen of a map's download over the menus +(port/linux/game/download_screen.c) */ +void progress_bar_download_display( + real progress); +void progress_bar_download_end( + void); /* ---------- globals */ diff --git a/source/interface/ui_widget.c b/source/interface/ui_widget.c index 33d925152f..7afc44f5e2 100644 --- a/source/interface/ui_widget.c +++ b/source/interface/ui_widget.c @@ -679,6 +679,10 @@ struct widget_instance; #include "text/text_group.h" #include "text/unicode.h" #include "ui_widget.h" +/* port: a map's download screen over the menus (port/linux/game/download_screen.c) */ +boolean download_screen_active(void); +void download_screen_process(void); +void download_screen_render(void); /* ---------- constants */ @@ -6798,7 +6802,9 @@ static void ui_widgets_process_mouse( if (ui_debug_targets_enabled()) ui_debug_log_keyboard_tap(pointer.click_x, pointer.click_y, hit); } - if (!pointer_active || keyboard_active) + if (!pointer_active || keyboard_active + /* port: (nor under a map's download screen, which hides the menus) */ + || download_screen_active()) { ui_mouse_press_count = 0; ui_mouse_hover_pending = FALSE; @@ -7418,6 +7424,9 @@ void render_ui_widgets( { virtual_keyboard_render(); } + /* port: a map's download screen, over the menus */ + if (first_players_render) + download_screen_render(); ui_debug_draw_targets(first_players_render); return; @@ -8486,7 +8495,13 @@ void process_ui_widgets( return; } - if (attract_mode_should_start()) + /* port: a map's download screen over the menus + (port/linux/game/download_screen.c): the menus go on behind it, so that + the join waiting for the map follows, but its presses are its own, and + the attract mode does not start while it is up */ + if (download_screen_active()) + download_screen_process(); + else if (attract_mode_should_start()) { attract_mode_start(); diff --git a/source/interface/ui_widget_event_handler_functions.c b/source/interface/ui_widget_event_handler_functions.c index 252c4a4563..fb98fd6459 100644 --- a/source/interface/ui_widget_event_handler_functions.c +++ b/source/interface/ui_widget_event_handler_functions.c @@ -6121,6 +6121,11 @@ boolean ui_widget_port_browse( return global_network_game_client_get() || network_game_server_list_initialize(widget, event, widget_deleted); } +/* port: whether the advertised game's Custom Edition map is being +downloaded first (port/linux/game/menu_functions.c), the join to wait */ +boolean ui_widget_port_join_map_fetch( + void *advertised_game); + /* joining a found game (as network_game_join_game_from_server_list), then the lobby (by name) in place of the widget's screen */ boolean ui_widget_port_join( @@ -6147,6 +6152,12 @@ boolean ui_widget_port_join( { return FALSE; } + /* port: a Custom Edition map this machine lacks (or has another version + of), under a name map sharing does not download, is downloaded first from + the community's archives (port/linux/game/menu_functions.c, + port/linux/src/map_downloads.c): the join is tried again once it is there */ + if (ui_widget_port_join_map_fetch(server)) + return FALSE; transport_client_start(server + 0x18, server + 8, server, 0x141E, &address); if (!address.address.long_words[0] || !address.port) { diff --git a/source/main/main.c b/source/main/main.c index 9af8e6a87d..428fa9a393 100644 --- a/source/main/main.c +++ b/source/main/main.c @@ -3522,6 +3522,9 @@ static boolean main_loop_iteration( network_voice_update(); /* port: map sharing, in the lobby and in game (port/linux/game/map_share.c) */ map_share_update(); + /* port: Custom Edition maps downloaded from the community's archives, + in the menus too (port/linux/src/map_downloads.c) */ + map_downloads_poll(); profile_scope_enter(main_network_start_frame_section) connection = main_globals.connection; if (connection==_game_connection_network_client) diff --git a/source/networking/network_client_manager.c b/source/networking/network_client_manager.c index e959778f1b..e144b78e3b 100644 --- a/source/networking/network_client_manager.c +++ b/source/networking/network_client_manager.c @@ -902,6 +902,9 @@ void network_game_client_dispose( { if (client) { + /* port: the map played again the one of its name, not the host's + version beside it (port/linux/game/custom_edition_cache.c) */ + custom_edition_map_version_forget(); if (client->connection) network_connection_delete(client->connection); diff --git a/source/rasterizer/xbox/rasterizer_xbox.c b/source/rasterizer/xbox/rasterizer_xbox.c index 30ac278eaf..2af3c5a676 100644 --- a/source/rasterizer/xbox/rasterizer_xbox.c +++ b/source/rasterizer/xbox/rasterizer_xbox.c @@ -2868,6 +2868,21 @@ void rasterizer_set_vertex_shader( return; } +/* port: the loading screen (progress_bar.c) sets the device's vertex shader +(the fixed-function pipeline), render states and texture stage states +itself, not through these caches: after it, the next draw sets its vertex +shader again, and the smart states' shadows are the device's (on the Xbox +only a map's load followed it; the screen of a map's download is drawn +over the menus, every frame) */ +void rasterizer_forget_hardware_state( + void) +{ + rasterizer_state_cache.vertex_shader_index = INVALID_RASTERIZER_HARDWARE_STATE; + rasterizer_vertex_shader_runtime_forget(); + SetupSmartStates(); + return; +} + typedef char verify_rasterizer_xbox_push_buffer_size_offset[ diff --git a/source/rasterizer/xbox/rasterizer_xbox_internal.h b/source/rasterizer/xbox/rasterizer_xbox_internal.h index 25726def0d..4617bd9129 100644 --- a/source/rasterizer/xbox/rasterizer_xbox_internal.h +++ b/source/rasterizer/xbox/rasterizer_xbox_internal.h @@ -70,6 +70,13 @@ void rasterizer_set_frustum_z( real z_far); void rasterizer_set_vertex_shader( short vertex_shader_index); +/* port: after the loading screen's own device states (progress_bar.c) */ +void rasterizer_forget_hardware_state( + void); +/* port: rasterizer_xbox_vertex_shaders_runtime.c's selected shader +forgotten, with it */ +void rasterizer_vertex_shader_runtime_forget( + void); void *rasterizer_get_bitmap_default_hardware_format( struct bitmap_data const *bitmap); void rasterizer_filthy_bitmap_default_initialize( diff --git a/source/rasterizer/xbox/rasterizer_xbox_vertex_shaders_runtime.c b/source/rasterizer/xbox/rasterizer_xbox_vertex_shaders_runtime.c index 35fb1da509..2f4aea98ae 100644 --- a/source/rasterizer/xbox/rasterizer_xbox_vertex_shaders_runtime.c +++ b/source/rasterizer/xbox/rasterizer_xbox_vertex_shaders_runtime.c @@ -159,6 +159,17 @@ static struct rasterizer_vertex_shader_runtime_globals vertex_shader_runtime_glo /* ---------- public code */ +/* port: the vertex shader the device has is no longer known (the loading +screen set the fixed-function pipeline itself: progress_bar.c, +rasterizer_forget_hardware_state); the next permutation set is selected */ +void rasterizer_vertex_shader_runtime_forget( + void) +{ + vertex_shader_runtime_globals.current_vertex_shader_index = NONE; + + return; +} + void rasterizer_set_vertex_shader_permutation( short vertex_shader_index, short vertex_type, diff --git a/tools/ci_build.py b/tools/ci_build.py index cae5ec7148..6c45c9578e 100644 --- a/tools/ci_build.py +++ b/tools/ci_build.py @@ -144,6 +144,10 @@ def main() -> int: # Android's APK has its own copy) if args.platform != "android": shutil.copy2(ROOT / "port/assets/network/brokers.txt", dist / "brokers.txt") + # the index of the Custom Edition maps, likewise (maps.index; the web's + # page fetches what it plays itself) + if args.platform != "web": + shutil.copy2(ROOT / "port/assets/network/map_index.txt", dist / "map_index.txt") return 0 diff --git a/tools/linux_build.py b/tools/linux_build.py index 19892f1a52..5c0b98f868 100644 --- a/tools/linux_build.py +++ b/tools/linux_build.py @@ -48,6 +48,12 @@ def game_defines_and_includes(config: Dict[str, Any]) -> str: ) +# the platform layer's units the map downloads' file handling is built with +# alone (tools/map_download_check.c): the map archives' zips and the hash +# check, and the files they use +MAP_DOWNLOAD_CHECK_PLATFORM_SOURCES = ("map_archives_zip.c", "map_sha1.c", "posix_files.c") + + def compile_launcher(sln: Any) -> str: """what the native ports' compile commands start with: the --compiler-launcher (ccache, say) and a space, or nothing""" @@ -511,9 +517,11 @@ def generate_linux_build(n: Writer, sln: Any) -> None: libs = " ".join(f"-l{lib}" for lib in config.get("libraries", [])) def emit(obj_dir: Path, output: Path, extra_cflags: List[str], extra_ldflags: List[str], - implicit_inputs: List[Path], validator: Optional[Path] = None) -> None: + implicit_inputs: List[Path], validator: Optional[Path] = None, + map_download_check: Optional[Path] = None) -> None: """the objects and the executable, with the given extra flags (and - the tag validator alone, tools/map_validate.c, as validator)""" + the tag validator alone, tools/map_validate.c, as validator; the map + downloads' file handling alone, tools/map_download_check.c, as map_download_check)""" extra = " ".join(extra_cflags) # the posix_* units have glibc's 32-bit wchar_t, and LLVM will not # optimise them together with code that has a 16-bit one: they stay @@ -673,6 +681,43 @@ def add_object(source: Path, cflags: str, posix: bool = False) -> None: *extra_ldflags])}, ) + # the map downloads' zips and hash check (port/linux/src/map_archives_zip.c) + # alone, outside the game: the game's objects of them and of the + # platform layer's files, and a program that runs them + # (tools/map_download_check.c; tools/test_map_download_check.py) + if map_download_check is not None: + tool = Path("tools/map_download_check.c") + tool_object = obj_dir / tool.with_suffix(".o") + n.build( + outputs=tool_object, + rule="linux_cc", + inputs=tool, + implicit=[*xdk_headers(), prefix_header, platform_semantics_header, *sysroot_inputs], + variables={"cflags": f"{platform_cflags} {extra}"}, + ) + # (and stand-ins for the renderer, which the Xbox headers' inline + # functions in every platform unit refer to: tools/map_download_check_xbox.c) + stand_ins = Path("tools/map_download_check_xbox.c") + stand_ins_object = obj_dir / stand_ins.with_suffix(".o") + n.build( + outputs=stand_ins_object, + rule="linux_cc", + inputs=stand_ins, + implicit=sysroot_inputs, + variables={"cflags": f"{posix_cflags} {posix_extra}"}, + ) + tool_objects = [tool_object, stand_ins_object, + *(obj_dir / (platform_dir / name).with_suffix(".o") + for name in MAP_DOWNLOAD_CHECK_PLATFORM_SOURCES), + *(obj_dir / (ZLIB_DIR / name).with_suffix(".o") for name in ZLIB_SOURCES)] + n.build( + outputs=map_download_check, + rule="linux_tool_link", + inputs=tool_objects, + variables={"ldflags": " ".join(["--target=i686-linux-gnu", "-m32", "-no-pie", "-g", *sysroot_ldflags, + *extra_ldflags, "-lpthread"])}, + ) + # Profile-guided optimisation: with the committed profile, or with # --pgo=train one that an instrumented build records while playing # (tools/pgo_train.py). A profile is trained once: code changed since @@ -694,10 +739,14 @@ def add_object(source: Path, cflags: str, posix: bool = False) -> None: cflags, ldflags = lto_flags(sln, build_dir / "thinlto-cache") cflags += profile_use_flags(profile) validator = build_dir / "map_validate" - emit(obj_dir, output, cflags, ldflags, [profile] if profile else [], validator) + map_download_check = build_dir / "map_download_check" + emit(obj_dir, output, cflags, ldflags, [profile] if profile else [], validator, map_download_check) # internet play's MQTT brokers, a file beside the game (network.brokers_file) brokers = build_dir / "brokers.txt" n.build(outputs=brokers, rule="linux_copy", inputs=Path("port/assets/network/brokers.txt")) + # the index of the Custom Edition maps, a file beside the game (maps.index) + map_index = build_dir / "map_index.txt" + n.build(outputs=map_index, rule="linux_copy", inputs=Path("port/assets/network/map_index.txt")) n.build(outputs="linux", rule="phony", - inputs=[output, brokers, validator, *sdl_outputs]) + inputs=[output, brokers, map_index, validator, map_download_check, *sdl_outputs]) n.newline() diff --git a/tools/map_download_check.c b/tools/map_download_check.c new file mode 100644 index 0000000000..2c00084ef0 --- /dev/null +++ b/tools/map_download_check.c @@ -0,0 +1,68 @@ +/* +MAP_DOWNLOAD_CHECK.C + +A check of the map downloads' file handling (port/linux/src/map_archives_zip.c) +outside the game (tools/test_map_download_check.py): + + map_download_check unzip + map_download_check verify + +"unzip" takes a map out of a map archive's zip, as the game does after +fetching it; "verify" checks a file against the index's info hash, as the +game does before using it (map_archives_verify). + +Built with those units, the platform layer's POSIX files and this file's own +stand-in for the platform (platform_log): tools/linux_build.py. +*/ + +#include "platform.h" +#include "posix.h" +#include "map_archives.h" + +#include +#include +#include +#include + +/* the platform layer's, for the units */ +void platform_log(const char *format, ...) +{ + va_list arguments; + + va_start(arguments, format); + fprintf(stderr, "map_download_check: "); + vfprintf(stderr, format, arguments); + fprintf(stderr, "\n"); + va_end(arguments); +} + +int main(int argc, char **argv) +{ + char error[192]; + + if (argc == 6 && !strcmp(argv[1], "unzip")) + { + if (!map_archives_unzip(argv[2], argv[3], strtoull(argv[4], NULL, 10), argv[5], error, sizeof(error))) + { + printf("failed: %s\n", error); + return 1; + } + printf("unzipped\n"); + return 0; + } + if (argc == 7 && !strcmp(argv[1], "verify")) + { + if (!map_archives_verify(argv[2], argv[3], strtoull(argv[4], NULL, 10), strtoul(argv[5], NULL, 10), argv[6], + error, sizeof(error))) + { + printf("failed: %s\n", error); + return 1; + } + printf("verified\n"); + return 0; + } + fprintf(stderr, + "usage: map_download_check unzip \n" + " map_download_check verify \n"); + return 2; +} diff --git a/tools/map_download_check_xbox.c b/tools/map_download_check_xbox.c new file mode 100644 index 0000000000..ceb3dfe0d1 --- /dev/null +++ b/tools/map_download_check_xbox.c @@ -0,0 +1,48 @@ +/* +MAP_DOWNLOAD_CHECK_XBOX.C + +Stand-ins for tools/map_download_check.c's link (tools/linux_build.py). Every +platform unit carries the Xbox headers' D3DDevice_SetRenderState +(port/include/xdk/xdk_d3d8.h) as a weak inline function, which the map +downloads' units never call but which refers to the renderer's functions +and state table (port/linux/src/d3d8_gl.c). Without link-time optimisation, +which drops it, the tool links against these instead of the renderer. Built +with the platform layer's POSIX flags, so none of the headers' declarations +are seen; none of these is ever called. +*/ + +#define STAND_IN(name) void name(void) {} + +STAND_IN(D3DDevice_SetRenderState_BackFillMode) +STAND_IN(D3DDevice_SetRenderState_CullMode) +STAND_IN(D3DDevice_SetRenderState_Deferred) +STAND_IN(D3DDevice_SetRenderState_DoNotCullUncompressed) +STAND_IN(D3DDevice_SetRenderState_Dxt1NoiseEnable) +STAND_IN(D3DDevice_SetRenderState_EdgeAntiAlias) +STAND_IN(D3DDevice_SetRenderState_FillMode) +STAND_IN(D3DDevice_SetRenderState_FogColor) +STAND_IN(D3DDevice_SetRenderState_FrontFace) +STAND_IN(D3DDevice_SetRenderState_LineWidth) +STAND_IN(D3DDevice_SetRenderState_LogicOp) +STAND_IN(D3DDevice_SetRenderState_MultiSampleAntiAlias) +STAND_IN(D3DDevice_SetRenderState_MultiSampleMask) +STAND_IN(D3DDevice_SetRenderState_MultiSampleType) +STAND_IN(D3DDevice_SetRenderState_NormalizeNormals) +STAND_IN(D3DDevice_SetRenderState_OcclusionCullEnable) +STAND_IN(D3DDevice_SetRenderState_PSTextureModes) +STAND_IN(D3DDevice_SetRenderState_RopZCmpAlwaysRead) +STAND_IN(D3DDevice_SetRenderState_RopZRead) +STAND_IN(D3DDevice_SetRenderState_ShadowFunc) +STAND_IN(D3DDevice_SetRenderState_Simple) +STAND_IN(D3DDevice_SetRenderState_StencilCullEnable) +STAND_IN(D3DDevice_SetRenderState_StencilEnable) +STAND_IN(D3DDevice_SetRenderState_StencilFail) +STAND_IN(D3DDevice_SetRenderState_TextureFactor) +STAND_IN(D3DDevice_SetRenderState_TwoSidedLighting) +STAND_IN(D3DDevice_SetRenderState_VertexBlend) +STAND_IN(D3DDevice_SetRenderState_YuvEnable) +STAND_IN(D3DDevice_SetRenderState_ZBias) +STAND_IN(D3DDevice_SetRenderState_ZEnable) + +/* (the render states' table: D3DRS_MAX entries is far fewer than this) */ +unsigned long D3D__RenderState[1024]; diff --git a/tools/map_index.py b/tools/map_index.py new file mode 100644 index 0000000000..25a6fbb099 --- /dev/null +++ b/tools/map_index.py @@ -0,0 +1,585 @@ +#!/usr/bin/env python3 +"""The index of the Custom Edition maps (port/assets/network/map_index.txt), +which the game reads to download a map it lacks when joining a game on it +(port/linux/src/map_downloads.c), and the maps' torrents, which name them: +a map is checked against its torrent's info hash, and seed boxes seed the +torrents. + + python tools/map_index.py make --maps [--maps ...] + [--resource-maps ] --torrents [--index ] + +walks the folders, keeps every Halo Custom Edition cache (as the game +identifies one: cache_file_formats.c), writes a single-file v1 torrent for +each into the torrents folder, and writes (or merges into) the index. The +resource maps folder gives bitmaps.map, sounds.map and loc.map, which every +Custom Edition map needs, listed with a checksum of 0. + +A map is known by its file name and its header checksum (the game record's +map version a host sends), so two versions of a map with one name are two +entries. A second file of the same name and checksum is left out. The +torrents are trackerless: the game adds the trackers and web seeds of its +settings, which does not change an info hash, and a torrent a seed box is +given can have them added by any client. + +Each torrent's info dictionary is exactly {length, name, piece length, +pieces}, so a machine that has the file can make the torrent again from the +index line alone: the game checks a download that way (map_archives_verify, +port/linux/src/map_archives_zip.c), with no torrent file. + + python tools/map_index.py check --index [--torrents ] + +checks an index (and that each torrent file matches its line). + + python tools/map_index.py sources [--halonet ] [--halomaps ] + [--index ] + +notes, on each map's line, the community archives' zips that hold it, which +the game downloads a map from before its web seeds (port/linux/src/map_archives.c): +a column "halonet:" for each zip of HaloNet's repository +(https://maps.halonet.net/maps/; the folder holds copies of +them under those names) and "halomaps:" for each of HaloMaps's +(https://halomaps.org/hce/detail.cfm?fid=; the folder's copies are +named "-.zip"). A zip holds a map when one of its files +has the map's name (in any folder), size and header checksum. The archives +given have their columns made again; the others' are kept. + +The work of a run is remembered in /.map_torrents_cache.json by +path, size and modification time, so a rerun hashes only new files. +""" + +import argparse +import hashlib +import json +import os +import re +import struct +import sys +import time +import zipfile +from concurrent.futures import ProcessPoolExecutor +from pathlib import Path + +INDEX_FORMAT = "halo map index v1" +DEFAULT_INDEX = Path(__file__).resolve().parents[1] / "port/assets/network/map_index.txt" +RESOURCE_MAP_NAMES = ("bitmaps.map", "sounds.map", "loc.map") + +# cache_file_formats.c +HEADER_BYTES = 0x800 +HEADER_SIGNATURE = struct.unpack(">I", b"head")[0] +FOOTER_SIGNATURE = struct.unpack(">I", b"foot")[0] +OPENSAUCE_SIGNATURE = struct.unpack(">I", b"yelo")[0] +VERSION_CUSTOM_EDITION = 609 +VERSION_OFFSET = 0x04 +FILE_LENGTH_OFFSET = 0x08 +COMPRESSED_LENGTH_OFFSET = 0x0C +TAG_DATA_OFFSET_OFFSET = 0x10 +TAG_DATA_SIZE_OFFSET = 0x14 +NAME_OFFSET = 0x20 +BUILD_OFFSET = 0x40 +SCENARIO_TYPE_OFFSET = 0x60 +CHECKSUM_OFFSET = 0x64 +OPENSAUCE_OFFSET = 0x70 +OPENSAUCE_FLAGS_OFFSET = 0x06 +FOOTER_OFFSET = 0x7FC +STRING_BYTES = 32 +TAG_INDEX_BYTES = 0x28 +TAG_CACHE_BYTES = 0x01700000 +CACHE_FILE_MAXIMUM_BYTES = 0x30000000 + +READ_BYTES = 4 << 20 + + +class MapError(Exception): + pass + + +# ---------- identifying a map, as the game does + + +def read_u32(data, offset): + return struct.unpack_from(" CACHE_FILE_MAXIMUM_BYTES or file_length > size: + raise MapError(f"a bad file length ({file_length})") + tag_data_offset = read_u32(header, TAG_DATA_OFFSET_OFFSET) + tag_data_size = read_u32(header, TAG_DATA_SIZE_OFFSET) + if tag_data_offset < HEADER_BYTES or tag_data_size < TAG_INDEX_BYTES or tag_data_size > TAG_CACHE_BYTES or \ + tag_data_offset + tag_data_size > file_length: + raise MapError("a bad tag data range") + return { + "name": name, + "build": build, + "scenario_type": struct.unpack_from(" 1500: + length <<= 1 + return length + + +def hash_pieces(path, piece_length): + """The SHA-1 of each piece of the file, concatenated.""" + pieces = [] + with open(path, "rb") as f: + while True: + piece = f.read(piece_length) + if not piece: + break + pieces.append(hashlib.sha1(piece).digest()) + return b"".join(pieces) + + +def info_dictionary(name, size, piece_length, pieces): + return {"length": size, "name": name, "piece length": piece_length, "pieces": pieces} + + +def info_hash(info): + return hashlib.sha1(bencode(info)).hexdigest() + + +def torrent_bytes(info, comment): + return bencode({ + "comment": comment, + "created by": "OpenCE tools/map_index.py", + "creation date": int(time.time()), + "info": info, + }) + + +# ---------- the index + +# a map archive's zip that holds a map: ":" +ARCHIVES = ("halonet", "halomaps") +SOURCE_PATTERN = re.compile(r"^(halonet|halomaps):[^\t\r\n]+$") + + +class Entry: + __slots__ = ("file_name", "checksum", "size", "piece_length", "info_hash", "sources") + + def __init__(self, file_name, checksum, size, piece_length, info_hash, sources=()): + self.file_name = file_name + self.checksum = checksum + self.size = size + self.piece_length = piece_length + self.info_hash = info_hash + self.sources = list(sources) + + @property + def key(self): + return (self.file_name.lower(), self.checksum) + + def line(self): + return "\t".join([self.file_name, f"{self.checksum:08X}", str(self.size), str(self.piece_length), + self.info_hash, *self.sources]) + + +def read_index(path): + entries = {} + if not path.is_file(): + return entries + with open(path, "r", encoding="utf-8") as f: + first = f.readline() + if first.strip() != f"# {INDEX_FORMAT}": + raise SystemExit(f"{path}: not a map torrent index (its first line is not '# {INDEX_FORMAT}')") + for number, line in enumerate(f, 2): + line = line.rstrip("\r\n") + if not line or line.startswith("#"): + continue + fields = line.split("\t") + if len(fields) < 5: + raise SystemExit(f"{path}:{number}: {len(fields)} fields, not 5 or more") + try: + entry = Entry(fields[0], int(fields[1], 16), int(fields[2]), int(fields[3]), fields[4].lower(), + fields[5:]) + except ValueError as error: + raise SystemExit(f"{path}:{number}: {error}") + if any(not SOURCE_PATTERN.match(source) for source in entry.sources): + raise SystemExit(f"{path}:{number}: a bad archive source") + if len(entry.info_hash) != 40 or any(c not in "0123456789abcdef" for c in entry.info_hash): + raise SystemExit(f"{path}:{number}: a bad info hash") + entries[entry.key] = entry + return entries + + +def write_index(path, entries): + path.parent.mkdir(parents=True, exist_ok=True) + lines = [ + f"# {INDEX_FORMAT}", + "# The Custom Edition maps (tools/map_index.py): each line a map,", + "# tab-separated: file name, header checksum (the map version a host sends; 0 for", + "# the resource maps, matched by name alone), size in bytes, piece length, info hash,", + "# then the map archives' zips that hold it (halonet:, halomaps:).", + "# A map's single-file torrent has info = {length, name, piece length, pieces}: a", + "# download is checked against its info hash (port/linux/src/map_archives.c).", + ] + for entry in sorted(entries.values(), key=lambda e: (e.file_name.lower(), e.checksum)): + lines.append(entry.line()) + with open(path, "w", encoding="utf-8", newline="\n") as f: + f.write("\n".join(lines) + "\n") + + +# ---------- making + +def map_files(folders): + for folder in folders: + folder = Path(folder) + if not folder.is_dir(): + raise SystemExit(f"{folder}: not a folder") + for path in sorted(folder.iterdir()): + if path.is_file() and path.suffix.lower() == ".map": + yield path + + +def file_stamp(path): + stat = path.stat() + return [stat.st_size, int(stat.st_mtime)] + + +def make_one(arguments): + """Hashes one file (in a worker process): its index line's fields, or + the reason it was left out.""" + path, resource = arguments + path = Path(path) + try: + if resource: + checksum = 0 + size = path.stat().st_size + if size < HEADER_BYTES: + raise MapError("too small") + else: + identity = identify(path) + checksum = identity["checksum"] + size = identity["size"] + piece_length = piece_length_for(size) + pieces = hash_pieces(path, piece_length) + info = info_dictionary(path.name, size, piece_length, pieces) + return { + "file_name": path.name, + "checksum": checksum, + "size": size, + "piece_length": piece_length, + "info_hash": info_hash(info), + "pieces": pieces.hex(), + } + except (MapError, OSError) as error: + return {"file_name": path.name, "error": str(error)} + + +def make(args): + torrents = Path(args.torrents) + torrents.mkdir(parents=True, exist_ok=True) + index_path = Path(args.index) + entries = read_index(index_path) + cache_path = torrents / ".map_torrents_cache.json" + cache = {} + if cache_path.is_file(): + with open(cache_path, "r", encoding="utf-8") as f: + cache = json.load(f) + work = [] + remembered_left_out = [] + skipped = 0 + for resource, folders in ((False, args.maps), (True, [args.resource_maps] if args.resource_maps else [])): + for path in map_files(folders): + # (the resource maps are not caches: only the resource maps pass + # takes them) + if resource != (path.name.lower() in RESOURCE_MAP_NAMES): + continue + key = str(path.resolve()) + remembered = cache.get(key) + if remembered and remembered.get("stamp") == file_stamp(path): + # (a file as it was: its entry, or why it was left out) + if "error" in remembered: + remembered_left_out.append((path, remembered["error"])) + else: + result = remembered["result"] + entry = Entry(result["file_name"], result["checksum"], result["size"], result["piece_length"], + result["info_hash"]) + if entry.key not in entries: + entries[entry.key] = entry + skipped += 1 + continue + work.append((key, path, resource)) + print(f"{len(work)} files to hash ({skipped} remembered from an earlier run)", flush=True) + total_bytes = sum(path.stat().st_size for _, path, _ in work) + done_bytes = 0 + started = time.time() + left_out = list(remembered_left_out) + with ProcessPoolExecutor(max_workers=args.jobs) as pool: + results = pool.map(make_one, [(str(path), resource) for _, path, resource in work]) + for (key, path, resource), result in zip(work, results): + done_bytes += path.stat().st_size + cache[key] = {"stamp": file_stamp(path), "result": {k: v for k, v in result.items() if k != "pieces"}} + if "error" in result: + cache[key]["error"] = result["error"] + left_out.append((path, result["error"])) + else: + entry = Entry(result["file_name"], result["checksum"], result["size"], result["piece_length"], + result["info_hash"]) + duplicate = entry.key in entries + if not duplicate: + entries[entry.key] = entry + torrent_path = torrents / f"{entry.info_hash}.torrent" + if not torrent_path.is_file(): + info = info_dictionary(entry.file_name, entry.size, entry.piece_length, + bytes.fromhex(result["pieces"])) + torrent_path.write_bytes(torrent_bytes(info, f"Halo Custom Edition map {entry.file_name}")) + if duplicate: + left_out.append((path, "the same name and checksum as another file")) + elapsed = time.time() - started + rate = done_bytes / elapsed if elapsed > 0 else 0 + remaining = (total_bytes - done_bytes) / rate if rate > 0 else 0 + print(f"[{done_bytes >> 20:,} of {total_bytes >> 20:,} MB, {rate / (1 << 20):.0f} MB/s, " + f"{remaining / 60:.0f} min left] {path.name}" + + (f": {result['error']}" if "error" in result else ""), flush=True) + if done_bytes and (done_bytes >> 30) != ((done_bytes - path.stat().st_size) >> 30): + # (the cache and the index are saved as the run goes, so an + # interrupted one keeps its work) + with open(cache_path, "w", encoding="utf-8") as f: + json.dump(cache, f) + write_index(index_path, entries) + with open(cache_path, "w", encoding="utf-8") as f: + json.dump(cache, f) + write_index(index_path, entries) + print(f"\n{len(entries)} maps in {index_path}; {len(left_out)} files left out", flush=True) + for path, reason in left_out: + print(f" {path.name}: {reason}") + + +# ---------- the archives' zips + +def zip_maps(path): + """(name, size, checksum) of each map in the zip at path (checksum 0 for + one too short to have a header); nothing for a zip that cannot be read""" + found = [] + try: + with zipfile.ZipFile(path) as archive: + for member in archive.infolist(): + name = member.filename.replace("\\", "/").rsplit("/", 1)[-1] + if not name.lower().endswith(".map") or member.is_dir(): + continue + checksum = 0 + if member.file_size >= HEADER_BYTES: + try: + with archive.open(member) as f: + checksum = read_u32(f.read(HEADER_BYTES), CHECKSUM_OFFSET) + except Exception: + continue + found.append((name, member.file_size, checksum)) + except (zipfile.BadZipFile, OSError, NotImplementedError, ValueError): + pass + return found + + +def archive_zips(archive, folder): + """(id, path) of the archive's zips in folder: HaloNet's by file name, + HaloMaps's by the file id their name starts with""" + for path in sorted(Path(folder).iterdir()): + if not path.is_file() or path.suffix.lower() != ".zip" or "\t" in path.name: + continue + if archive == "halonet": + yield path.name, path + else: + match = re.match(r"^(\d+)-", path.name) + if match: + yield match.group(1), path + + +def sources(args): + index_path = Path(args.index) + entries = read_index(index_path) + by_name = {} + for entry in entries.values(): + by_name.setdefault(entry.file_name.lower(), []).append(entry) + given = [(archive, folder) for archive, folder in (("halonet", args.halonet), ("halomaps", args.halomaps)) + if folder] + if not given: + raise SystemExit("give --halonet or --halomaps (or both)") + found = {entry.key: {archive: [] for archive, _ in given} for entry in entries.values()} + for archive, folder in given: + zips = list(archive_zips(archive, folder)) + print(f"{archive}: {len(zips)} zips in {folder}", flush=True) + for number, (zip_id, path) in enumerate(zips, 1): + for name, size, checksum in zip_maps(path): + for entry in by_name.get(name.lower(), []): + # (a resource map's checksum is 0 in the index: its size says) + if entry.size == size and entry.checksum in (checksum, 0): + ids = found[entry.key][archive] + if zip_id not in ids: + ids.append(zip_id) + if number % 500 == 0: + print(f" {number} of {len(zips)}", flush=True) + counts = {archive: 0 for archive, _ in given} + for entry in entries.values(): + kept = [source for source in entry.sources if source.split(":", 1)[0] not in found[entry.key]] + made = [f"{archive}:{zip_id}" for archive in ARCHIVES if archive in found[entry.key] + for zip_id in found[entry.key][archive]] + for archive in found[entry.key]: + counts[archive] += bool(found[entry.key][archive]) + # (in the archives' order: the game tries them in maps.archives's) + entry.sources = sorted(kept + made, key=lambda source: ARCHIVES.index(source.split(":", 1)[0])) + write_index(index_path, entries) + for archive, count in counts.items(): + print(f"{count} of {len(entries)} maps in a zip of {archive}") + return 0 + + +# ---------- checking + +def check(args): + index_path = Path(args.index) + entries = read_index(index_path) + failures = 0 + torrents = Path(args.torrents) if args.torrents else None + for entry in entries.values(): + if entry.size < HEADER_BYTES or entry.piece_length < 16384 or entry.piece_length & (entry.piece_length - 1): + print(f"{entry.file_name}: a bad size or piece length") + failures += 1 + if torrents: + path = torrents / f"{entry.info_hash}.torrent" + if not path.is_file(): + print(f"{entry.file_name}: no torrent file {path.name}") + failures += 1 + continue + torrent = bdecode(path.read_bytes()) + info = torrent[b"info"] + expected = info_dictionary(entry.file_name, entry.size, entry.piece_length, info[b"pieces"]) + if hashlib.sha1(bencode(info)).hexdigest() != entry.info_hash or \ + hashlib.sha1(bencode(expected)).hexdigest() != entry.info_hash: + print(f"{entry.file_name}: the torrent file does not match its line") + failures += 1 + pieces = (entry.size + entry.piece_length - 1) // entry.piece_length + if len(info[b"pieces"]) != 20 * pieces: + print(f"{entry.file_name}: {len(info[b'pieces']) // 20} piece hashes, not {pieces}") + failures += 1 + print(f"{len(entries)} entries, {failures} problems") + return 1 if failures else 0 + + +def main(): + parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + commands = parser.add_subparsers(dest="command", required=True) + make_parser = commands.add_parser("make", help="make torrents and the index from map folders") + make_parser.add_argument("--maps", action="append", default=[], metavar="FOLDER", required=True, + help="a folder of Custom Edition maps (may be given several times)") + make_parser.add_argument("--resource-maps", metavar="FOLDER", + help="a folder with Custom Edition's bitmaps.map, sounds.map and loc.map") + make_parser.add_argument("--torrents", metavar="FOLDER", required=True, + help="where the .torrent files go (named by info hash)") + make_parser.add_argument("--index", metavar="FILE", default=str(DEFAULT_INDEX), + help=f"the index to write or merge into (default: {DEFAULT_INDEX})") + make_parser.add_argument("--jobs", type=int, default=max(2, min(8, (os.cpu_count() or 2) // 2)), + help="files hashed at once") + make_parser.set_defaults(run=make) + check_parser = commands.add_parser("check", help="check an index and its torrent files") + check_parser.add_argument("--index", metavar="FILE", default=str(DEFAULT_INDEX)) + check_parser.add_argument("--torrents", metavar="FOLDER") + check_parser.set_defaults(run=check) + sources_parser = commands.add_parser("sources", help="note the map archives' zips that hold each map") + sources_parser.add_argument("--halonet", metavar="FOLDER", help="copies of HaloNet's zips, under their names") + sources_parser.add_argument("--halomaps", metavar="FOLDER", + help="copies of HaloMaps's zips, named -.zip") + sources_parser.add_argument("--index", metavar="FILE", default=str(DEFAULT_INDEX)) + sources_parser.set_defaults(run=sources) + args = parser.parse_args() + sys.exit(args.run(args) or 0) + + +if __name__ == "__main__": + main() diff --git a/tools/test_map_download_check.py b/tools/test_map_download_check.py new file mode 100644 index 0000000000..2c35fc4273 --- /dev/null +++ b/tools/test_map_download_check.py @@ -0,0 +1,109 @@ +"""The map downloads' file handling (port/linux/src/map_archives_zip.c) alone, +as tools/map_download_check.c runs it outside the game (ninja linux builds it +as build/linux/map_download_check): a map taken out of made-up zips, damaged +ones refused, and a file checked against the info hash the index tool +(tools/map_index.py) gives it, another file refused. No game data and no +network. +""" +import hashlib +import random +import subprocess +import sys +import zipfile +from pathlib import Path + +import pytest + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / "tools")) + +import map_index # noqa: E402 + +CHECK = ROOT / "build/linux/map_download_check" +# (a few pieces of 256 KB, the last a short one) +FILE_SIZE = 3 * 256 * 1024 + 12345 +PIECE_LENGTH = 256 * 1024 + +needs_check = pytest.mark.skipif(not CHECK.exists(), reason="needs ninja linux's build/linux/map_download_check") + + +def run(*arguments): + return subprocess.run([str(CHECK), *map(str, arguments)], capture_output=True, text=True, timeout=60) + + +def info_hash(name, data, piece_length): + pieces = b"".join(hashlib.sha1(data[offset:offset + piece_length]).digest() + for offset in range(0, len(data), piece_length)) + return hashlib.sha1(map_index.bencode(map_index.info_dictionary(name, len(data), piece_length, pieces))).hexdigest() + + +@needs_check +def test_a_map_is_taken_out_of_an_archives_zip(tmp_path): + """the game's unzip: the file of the name and size in any folder, + deflated or stored; anything else refused""" + data = random.Random(9).randbytes(FILE_SIZE) + for method in (zipfile.ZIP_DEFLATED, zipfile.ZIP_STORED): + archive_path = tmp_path / f"pack{method}.zip" + with zipfile.ZipFile(archive_path, "w", method) as archive: + archive.writestr("readme.txt", "a map") + # (one of the name but another size first: not it) + archive.writestr("old/Made_Up.map", data[:1000]) + archive.writestr("maps/Made_Up.map", data) + out = tmp_path / f"out{method}.map" + result = run("unzip", archive_path, "made_up.map", FILE_SIZE, out) + assert result.returncode == 0, result.stdout + result.stderr + assert out.read_bytes() == data + # no such file, a damaged zip, a zip cut short: nothing written + whole = (tmp_path / f"pack{zipfile.ZIP_DEFLATED}.zip").read_bytes() + out = tmp_path / "bad.map" + for label, zip_bytes, size in (("no file of that size", whole, FILE_SIZE + 1), + ("damaged data", whole[:2000] + bytes(len(whole) - 4000) + whole[-2000:], FILE_SIZE), + ("cut short", whole[:len(whole) // 2], FILE_SIZE), + ("not a zip", b"junk" * 100, FILE_SIZE)): + bad = tmp_path / "bad.zip" + bad.write_bytes(zip_bytes) + result = run("unzip", bad, "made_up.map", size, out) + assert result.returncode != 0, label + assert "failed" in result.stdout, label + assert not out.exists(), label + + +@needs_check +def test_a_download_is_checked_against_the_index(tmp_path): + """the game's check (map_archives_verify): a file is the index's when its + info hash, as tools/map_index.py makes it, is the index's; another + version of it, one cut short, or the hash of another name are not""" + data = random.Random(11).randbytes(FILE_SIZE) + good = tmp_path / "Made_Up.map" + good.write_bytes(data) + expected = info_hash("Made_Up.map", data, PIECE_LENGTH) + result = run("verify", good, "Made_Up.map", FILE_SIZE, PIECE_LENGTH, expected) + assert result.returncode == 0, result.stdout + result.stderr + assert "verified" in result.stdout + # (the hash's case does not matter) + assert run("verify", good, "Made_Up.map", FILE_SIZE, PIECE_LENGTH, expected.upper()).returncode == 0 + other = bytearray(data) + other[FILE_SIZE // 2] ^= 1 + changed = tmp_path / "changed.map" + changed.write_bytes(bytes(other)) + short = tmp_path / "short.map" + short.write_bytes(data[:-1]) + for label, path, name in (("another version", changed, "Made_Up.map"), + ("cut short", short, "Made_Up.map"), + ("another name", good, "made_up.map")): + result = run("verify", path, name, FILE_SIZE, PIECE_LENGTH, expected) + assert result.returncode != 0, label + assert "failed" in result.stdout, label + + +def test_the_index_is_read_by_the_game(): + """the committed index starts as map_downloads.c reads it (INDEX_FORMAT), + and each entry has the columns it reads""" + text = (ROOT / "port/assets/network/map_index.txt").read_text(encoding="utf-8") + assert text.startswith("# halo map index v1\n") + source = (ROOT / "port/linux/src/map_downloads.c").read_text(encoding="utf-8") + assert '#define INDEX_FORMAT "# halo map index v1"' in source + entries = [line.split("\t") for line in text.splitlines() if line and not line.startswith("#")] + assert len(entries) > 5000 + for fields in entries: + assert len(fields) >= 5 and len(fields[4]) == 40, fields[0] diff --git a/tools/test_map_index.py b/tools/test_map_index.py new file mode 100644 index 0000000000..05ba2d9ae0 --- /dev/null +++ b/tools/test_map_index.py @@ -0,0 +1,183 @@ +"""Tests of the maps' index tool (tools/map_index.py): the torrents and +the index it makes of a folder of Custom Edition maps, what it leaves out, +and the index it checks. + +The tests build tiny Custom Edition caches in memory (a valid header and +random tag data), so no game data is needed. +""" +import hashlib +import random +import struct +import subprocess +import zipfile +import sys +from pathlib import Path + +import pytest + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / "tools")) + +import map_index # noqa: E402 + +TOOL = ROOT / "tools/map_index.py" + + +def code(text): + return struct.unpack(">I", text.encode("latin-1"))[0] + + +def cache_bytes(name, size=300_000, checksum=0x12345678, version=609, opensauce=False, seed=1): + """A Custom Edition cache of size bytes: its header, then random data.""" + data = bytearray(random.Random(seed).randbytes(size)) + header = bytearray(0x800) + struct.pack_into(" 5000 + for (name, checksum), entry in entries.items(): + assert name.endswith(".map") + assert entry.piece_length >= 262144 and entry.piece_length & (entry.piece_length - 1) == 0 + assert entry.size > 0x800 + assert ("bitmaps.map", 0) in entries and ("sounds.map", 0) in entries and ("loc.map", 0) in entries + + +def test_sources_notes_the_archives_zips_that_hold_each_map(tmp_path): + """The archives' zips (halonet: by name, halomaps: -...) are + matched to the index by a file's name, size and header checksum; a zip + with another version of the map is not one of its sources.""" + maps = tmp_path / "maps" + maps.mkdir() + alpha = cache_bytes("alpha", size=400_000, checksum=0x11111111, seed=1) + (maps / "alpha.map").write_bytes(alpha) + (maps / "beta.map").write_bytes(cache_bytes("beta", size=300_000, checksum=0x22222222, seed=2)) + index = tmp_path / "index.txt" + result = run("make", "--maps", str(maps), "--torrents", str(tmp_path / "torrents"), "--index", str(index), + "--jobs", "2") + assert result.returncode == 0, result.stdout + result.stderr + halonet = tmp_path / "halonet" + halomaps = tmp_path / "halomaps" + halonet.mkdir() + halomaps.mkdir() + with zipfile.ZipFile(halonet / "alpha pack.zip", "w", zipfile.ZIP_DEFLATED) as archive: + archive.writestr("maps/Alpha.map", alpha) + archive.writestr("readme.txt", "alpha") + with zipfile.ZipFile(halomaps / "1234-alpha.zip", "w", zipfile.ZIP_DEFLATED) as archive: + archive.writestr("alpha.map", alpha) + # (another version of beta: not beta's source) + with zipfile.ZipFile(halomaps / "77-beta.zip", "w", zipfile.ZIP_DEFLATED) as archive: + archive.writestr("beta.map", cache_bytes("beta", size=300_000, checksum=0x99999999, seed=2)) + (halomaps / "not-a-zip.zip").write_bytes(b"junk") + result = run("sources", "--halonet", str(halonet), "--halomaps", str(halomaps), "--index", str(index)) + assert result.returncode == 0, result.stdout + result.stderr + entries = map_index.read_index(index) + assert entries[("alpha.map", 0x11111111)].sources == ["halonet:alpha pack.zip", "halomaps:1234"] + assert entries[("beta.map", 0x22222222)].sources == [] + # the line the game reads: the sources after the info hash + line = next(line for line in index.read_text(encoding="utf-8").splitlines() if line.startswith("alpha.map")) + assert line.split("\t")[5:] == ["halonet:alpha pack.zip", "halomaps:1234"] + # an archive not given keeps its columns; a rerun gives the same + result = run("sources", "--halomaps", str(halomaps), "--index", str(index)) + assert result.returncode == 0, result.stdout + result.stderr + assert map_index.read_index(index)[("alpha.map", 0x11111111)].sources == ["halonet:alpha pack.zip", + "halomaps:1234"] + # and the check takes the columns + assert run("check", "--index", str(index)).returncode == 0 + + +def test_the_committed_index_names_the_archives_zips(): + entries = map_index.read_index(map_index.DEFAULT_INDEX) + with_sources = [entry for entry in entries.values() if entry.sources] + assert len(with_sources) > 5000 + for entry in with_sources: + assert all(map_index.SOURCE_PATTERN.match(source) for source in entry.sources) diff --git a/tools/web_build.py b/tools/web_build.py index fe1de07695..03e9eb4280 100644 --- a/tools/web_build.py +++ b/tools/web_build.py @@ -128,6 +128,14 @@ "posix_trace_marker.c", # a Linux GPU driver's trace markers "posix_dtls.c", # internet play's WebRTC: the browser's own "p2p_webrtc.c", # (port/web/src/web_p2p.c) + # The Custom Edition maps' downloads from the community's archives + # (docs/map_downloads.md): the page fetches what it plays itself, with no + # HTTPS download of the platform layer's (port/web/src/web_map_downloads.c + # stands in for map_downloads.h) + "map_archives.c", + "map_archives_zip.c", + "map_downloads.c", + "map_sha1.c", } # the web runtime's units that, like posix_*.c, are the C library's side of diff --git a/tools/windows_build.py b/tools/windows_build.py index 89307c8b9d..bd4c4bbea0 100644 --- a/tools/windows_build.py +++ b/tools/windows_build.py @@ -545,5 +545,8 @@ def add_object(source: Path, cflags: str) -> None: # internet play's MQTT brokers, a file beside the game (network.brokers_file) brokers = BUILD / "brokers.txt" n.build(outputs=brokers, rule="windows_copy", inputs=Path("port/assets/network/brokers.txt")) - n.build(outputs="windows", rule="phony", inputs=[output, sdl_dll, brokers]) + # the index of the Custom Edition maps, a file beside the game (maps.index) + map_index = BUILD / "map_index.txt" + n.build(outputs=map_index, rule="windows_copy", inputs=Path("port/assets/network/map_index.txt")) + n.build(outputs="windows", rule="phony", inputs=[output, sdl_dll, brokers, map_index]) n.newline()