Full Code of soarqin/D2RMH for AI

master 32d55b8ab9a3 cached
210 files
5.0 MB
1.3M tokens
5895 symbols
1 requests
Download .txt
Showing preview only (5,301K chars total). Download the full file or copy to clipboard to get everything.
Repository: soarqin/D2RMH
Branch: master
Commit: 32d55b8ab9a3
Files: 210
Total size: 5.0 MB

Directory structure:
gitextract_68bzuhg8/

├── .github/
│   └── workflows/
│       └── build.yml
├── .gitignore
├── CMakeLists.txt
├── LICENSE
├── README.md
├── bin/
│   ├── D2RMH.ini
│   ├── D2RMH_gamedata.ini
│   ├── D2RMH_item.ini
│   └── plugins/
│       ├── chicken_life.lua
│       ├── hotkey.lua
│       └── town_portal_check.lua
├── build_msvc2019.bat
├── build_msvc2022.bat
├── build_msys2_clang.bat
├── build_msys2_mingw.bat
├── cmake/
│   ├── CustomCompilerOptions.cmake
│   └── GetVersion.cmake
├── contrib/
│   └── zhCN/
│       ├── D2RMH.ini
│       ├── README.md
│       └── plugins/
│           ├── chicken_life.lua
│           └── town_portal_check.lua
├── copy_dist.bat
├── d2mapapi/
│   ├── .gitignore
│   ├── .gitrepo
│   ├── CMakeLists.txt
│   ├── LICENSE
│   ├── README.md
│   ├── cmake/
│   │   └── CustomCompilerOptions.cmake
│   ├── collisionmap.cpp
│   ├── collisionmap.h
│   ├── crc32.h
│   ├── d2map.cpp
│   ├── d2map.h
│   ├── d2ptrs.h
│   ├── d2structs.h
│   ├── genimage.cpp
│   ├── host.cpp
│   ├── httpd.cpp
│   ├── json/
│   │   ├── LICENSE.MIT
│   │   ├── README.md
│   │   └── json.hpp
│   ├── mapdata.cpp
│   ├── mapdata.h
│   ├── offset.cpp
│   ├── offset.h
│   ├── pathfinder.cpp
│   ├── pathfinder.h
│   ├── piped.cpp
│   ├── pipehost.cpp
│   ├── pipehost.h
│   ├── session.cpp
│   ├── session.h
│   ├── simphttp/
│   │   ├── CMakeLists.txt
│   │   ├── cmake/
│   │   │   └── FindLibUV.cmake
│   │   ├── llhttp/
│   │   │   ├── CMakeLists.txt
│   │   │   ├── api.c
│   │   │   ├── api.h
│   │   │   ├── http.c
│   │   │   ├── llhttp.c
│   │   │   └── llhttp.h
│   │   ├── simphttp.cpp
│   │   ├── simphttp.h
│   │   └── uri.h
│   └── stb/
│       └── stb_image_write.h
├── deps/
│   ├── CMakeLists.txt
│   ├── CascLib/
│   │   ├── CMakeLists.txt
│   │   ├── LICENSE
│   │   ├── README.md
│   │   └── src/
│   │       ├── CascCommon.h
│   │       ├── CascDecompress.cpp
│   │       ├── CascDecrypt.cpp
│   │       ├── CascDumpData.cpp
│   │       ├── CascFiles.cpp
│   │       ├── CascFindFile.cpp
│   │       ├── CascIndexFiles.cpp
│   │       ├── CascLib.h
│   │       ├── CascOpenFile.cpp
│   │       ├── CascOpenStorage.cpp
│   │       ├── CascPort.h
│   │       ├── CascReadFile.cpp
│   │       ├── CascRootFile_Diablo3.cpp
│   │       ├── CascRootFile_Install.cpp
│   │       ├── CascRootFile_MNDX.cpp
│   │       ├── CascRootFile_OW.cpp
│   │       ├── CascRootFile_TVFS.cpp
│   │       ├── CascRootFile_Text.cpp
│   │       ├── CascRootFile_WoW.cpp
│   │       ├── CascStructs.h
│   │       ├── DllMain.c
│   │       ├── DllMain.def
│   │       ├── DllMain.rc
│   │       ├── common/
│   │       │   ├── Array.h
│   │       │   ├── Common.cpp
│   │       │   ├── Common.h
│   │       │   ├── Csv.cpp
│   │       │   ├── Csv.h
│   │       │   ├── Directory.cpp
│   │       │   ├── Directory.h
│   │       │   ├── FileStream.cpp
│   │       │   ├── FileStream.h
│   │       │   ├── FileTree.cpp
│   │       │   ├── FileTree.h
│   │       │   ├── IndexMap.h
│   │       │   ├── ListFile.cpp
│   │       │   ├── ListFile.h
│   │       │   ├── Map.h
│   │       │   ├── Mime.cpp
│   │       │   ├── Mime.h
│   │       │   ├── Path.h
│   │       │   ├── RootHandler.cpp
│   │       │   ├── RootHandler.h
│   │       │   ├── Sockets.cpp
│   │       │   └── Sockets.h
│   │       ├── jenkins/
│   │       │   ├── lookup.h
│   │       │   └── lookup3.c
│   │       ├── md5/
│   │       │   ├── md5.cpp
│   │       │   └── md5.h
│   │       ├── resource.h
│   │       └── zlib/
│   │           ├── adler32.c
│   │           ├── crc32.c
│   │           ├── crc32.h
│   │           ├── deflate.c
│   │           ├── deflate.h
│   │           ├── gzguts.h
│   │           ├── inffast.c
│   │           ├── inffast.h
│   │           ├── inffixed.h
│   │           ├── inflate.c
│   │           ├── inflate.h
│   │           ├── inftrees.c
│   │           ├── inftrees.h
│   │           ├── trees.c
│   │           ├── trees.h
│   │           ├── zconf.h
│   │           ├── zlib.h
│   │           ├── zutil.c
│   │           └── zutil.h
│   ├── glad/
│   │   ├── CMakeLists.txt
│   │   ├── include/
│   │   │   ├── KHR/
│   │   │   │   └── khrplatform.h
│   │   │   └── glad/
│   │   │       ├── glad.h
│   │   │       └── glad_wgl.h
│   │   └── src/
│   │       ├── glad.c
│   │       └── glad_wgl.c
│   ├── inih/
│   │   ├── CMakeLists.txt
│   │   ├── LICENSE.txt
│   │   ├── README.md
│   │   ├── ini.c
│   │   └── ini.h
│   ├── sol3/
│   │   ├── CMakeLists.txt
│   │   ├── CONTRIBUTORS.md
│   │   ├── LICENSE.txt
│   │   ├── README.md
│   │   └── include/
│   │       └── sol/
│   │           ├── config.hpp
│   │           ├── forward.hpp
│   │           └── sol.hpp
│   └── stb/
│       ├── CMakeLists.txt
│       ├── stb_rect_pack.h
│       └── stb_truetype.h
├── doc/
│   ├── ChangeLog.md
│   ├── ItemDesc.md
│   ├── KeyMapping.md
│   ├── LICENSE.lua54
│   ├── Plugin.md
│   ├── Skill.md
│   └── TODO.md
└── src/
    ├── CMakeLists.txt
    ├── cfg.cpp
    ├── cfg.h
    ├── d2r/
    │   ├── d2rdefs.h
    │   ├── mapstructs.h
    │   ├── processdata.cpp
    │   ├── processdata.h
    │   ├── processmanager.cpp
    │   ├── processmanager.h
    │   ├── storage.cpp
    │   ├── storage.h
    │   └── stringdefs.inl
    ├── data/
    │   ├── d2txt.cpp
    │   ├── d2txt.h
    │   ├── gamedata.cpp
    │   ├── gamedata.h
    │   └── viewstream.h
    ├── main.cpp
    ├── plugin/
    │   ├── plugin.cpp
    │   └── plugin.h
    ├── render/
    │   ├── HandmadeMath.h
    │   ├── d2font.cpp
    │   ├── d2font.h
    │   ├── font.cpp
    │   ├── font.h
    │   ├── fontrenderimpl.h
    │   ├── renderer.cpp
    │   ├── renderer.h
    │   ├── ttf.cpp
    │   ├── ttf.h
    │   ├── ttfgl.cpp
    │   └── ttfgl.h
    ├── res/
    │   ├── D2RMH.manifest
    │   ├── manifest.rc
    │   └── res.rc
    ├── ui/
    │   ├── maprenderer.cpp
    │   ├── maprenderer.h
    │   ├── window.cpp
    │   └── window.h
    └── util/
        ├── ntprocess.cpp
        ├── ntprocess.h
        ├── os_structs.cpp
        ├── os_structs.h
        ├── util.cpp
        └── util.h

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/workflows/build.yml
================================================
name: CMake

on:
  push:
    branches: [ master ]
    paths: [ ".github/workflows/build.yml", CMakeLists.txt, 'src/**', 'd2mapapi/**', 'tools/**', 'inih/**' ]
  pull_request:
    branches: [ master ]
    paths: [ ".github/workflows/build.yml", CMakeLists.txt, 'src/**', 'd2mapapi/**', 'tools/**', 'inih/**' ]

env:
  BUILD_TYPE: Release

jobs:
  build:
    runs-on: windows-latest

    strategy:
      matrix:
        compiler: ["msys2_mingw", "msvc2022"]

    steps:
      - name: Install MSYS2/MinGW
        if: matrix.compiler == 'msys2_mingw'
        uses: msys2/setup-msys2@v2
        with:
          location: D:\
          update: true
          install: >-
            mingw-w64-x86_64-binutils
            mingw-w64-i686-binutils
            mingw-w64-x86_64-gcc
            mingw-w64-i686-gcc
            mingw-w64-x86_64-make
            mingw-w64-i686-make

      - name: Checkout Repository
        uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: CMake Configure and Build
        shell: cmd
        working-directory: ${{github.workspace}}
        run: build_${{matrix.compiler}}.bat D:\msys64

      - uses: actions/upload-artifact@v2
        with:
          name: D2RMH-snapshot-${{matrix.compiler}}
          path: |
            ${{github.workspace}}/build/${{matrix.compiler}}/dist/D2RMH-snapshot.zip
          retention-days: 7

================================================
FILE: .gitignore
================================================
# Prerequisites
*.d

# Compiled Object files
*.slo
*.lo
*.o
*.obj

# Precompiled Headers
*.gch
*.pch

# Compiled Dynamic libraries
*.so
*.dylib
*.dll

# Fortran module files
*.mod
*.smod

# Compiled Static libraries
*.lai
*.la
*.a
*.lib
*.ilk
*.pdb

# Executables
*.exe
*.out
*.app

# additional exclusions
*.tlog
*.log
.vs
Debug
Release
*.user

# Jetbrains generated files
/.idea/
/cmake-*/

# Build directory(ies)
**/build/


================================================
FILE: CMakeLists.txt
================================================
cmake_minimum_required(VERSION 3.13)
project(D2RMH C CXX)

if(MSVC)
    set(CMAKE_CXX_STANDARD 20)
else()
    set(CMAKE_CXX_STANDARD 17)
endif()

list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
include(CustomCompilerOptions)
fix_compile_flags()
fix_release_flags()
add_static_runtime_option()

add_subdirectory(deps)
add_subdirectory(d2mapapi)
add_subdirectory(src)


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2021-2022 Soar Qin, and contributors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
**README in other languages: [中文说明](contrib/zhCN/README.md)**

# D2RMH
Diablo II Resurrected map revealing tool.

# Disclaimer
**D2RMH is only reading process memory from D2R, without injects, hooks or memory writes,  
but I do not guarentee that it is totally ban-free, use at your own risk.**

# What's New
Check [ChangeLog](doc/ChangeLog.md)

# Prerequisite
* Diablo II 1.11, 1.11b, 1.12, 1.13c or 1.13d is required. You can get a minimal subset of v1.13c files [HERE](https://archive.org/details/diablo-ii-1.13c-minimal.-7z)

# Usage
0. Virus/Malware detection WARNING:
   * If you are using Windows Defender, disable it or add D2RMH to whitelist to avoid misreporting of malware.
   * D2RMH can pass most Anti-Virus software detections, but not all of them, you can compile it your self if worry about it, check `How to build` section below
1. Download from `Releases` section, or any snapshot packs from `Actions` section(You need to log-in to GitHub). 
2. Edit D2RMH.ini, set `d2_path` to path of your Diablo II folder,
   or just put extracted `D2RMH.exe` and all `.ini` files to D2 v1.13c folder.
3. Run D2RMH.exe, enjoy!

# Screenshots
![Screenshot 1](screenshots/screenshot_0.png)
![Screenshot 2](screenshots/screenshot_1.png)
![Screenshot 3](screenshots/screenshot_2.png)

# Plugin system
* Plugins are `.lua` scripts loaded from `plugins` folder
* Read [document](doc/Plugin.md) if you want to write your own plugin

# TODO
Check [TODO](doc/TODO.md)

# How to build
## Quick instruction
* Install [cmake](https://www.cmake.org/) and add `cmake\bin` to your `PATH` environment variable so that you can type `cmake` in command line to call it directly
* Run `build_msvc2019.bat`, `build_msvc2022.bat`, `build_msys2_clang.bat` or `build_msys2_mingw.bat` to build.  
  Note: You should have certain compilers intalled. For msys2 builds, install required packages as instructions below.
## Detailed instruction without .bat scripts 
### MinGW GCC
* Install MSYS2(https://www.msys2.org), type `pacman -Syu --noconfirm && pacman -S --noconfirm --needed make git mingw-w64-i686-toolchain mingw-w64-i686-cmake mingw-w64-ucrt-x86_64-toolchain mingw-w64-ucrt-x86_64-cmake` in MSYS2 command line to install required components
* Build D2RMH(64bit):
  * Open new Shell using ucrt64.exe
  * Clone D2RMH source by type `git clone https://github.com/soarqin/D2RMH`
  * Type `cd D2RMH && cmake -Bbuild -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DUSE_STATIC_CRT=ON`
  * Then `make -Cbuild D2RMH` to get the compiled binary in `build/bin` folder
* Build d2mapapi-piped(32bit):
  * Open new Shell using mingw32.exe
  * Change current directory to D2RMH source
  * Type `cmake -Bbuild_d2mapapi -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DUSE_STATIC_CRT=ON d2mapapi`
  * Then `make -Cbuild_d2mapapi d2mapapi-piped` to get the compiled binary in `build_d2mapapi/bin` folder
### MSYS2 Clang
* Mostly same as MinGW GCC, with following changes:
  * `mingw-w64-i686-toolchain`->`mingw-w64-clang-i686-toolchain`
  * `mingw-w64-i686-cmake`->`mingw-w64-clang-i686-cmake`
  * `mingw-w64-ucrt-x86_64-toolchain`->`mingw-w64-clang-x86_64-toolchain`
  * `mingw-w64-ucrt-x86_64-cmake`->`mingw-w64-clang-x86_64-cmake`
  * `ucrt64.exe`->`clang64.exe`
  * `mingw32.exe`->`clang32.exe`
### Microsoft Visual Studio 2019/2022
* Install Visual Studio 2019 or 2022 Community Edition(or Pro/Ent if you have)
* Unpack downloaded source code file, or you can use git to Clone D2RMH source by type: `git clone https://github.com/soarqin/D2RMH`. Note: Using git requires [Git for windows](https://git-scm.com/download/win) installed
* Build D2RMH(64bit):
  * (Visual Studio 2019) Type `cmake -Bbuild -G "Visual Studio 16 2019" -A x64 -DUSE_STATIC_CRT=ON`  
    (Visual Studio 2022) Type `cmake -Bbuild -G "Visual Studio 17 2022" -A x64 -DUSE_STATIC_CRT=ON`
  * Now you can either:
    * Type `cmake --build build --config Release --target D2RMH`
    * Open generated `build\D2RMH.sln` and build `D2RMH` target
  * Compiled binaries are located in `build\bin` folder
* Build d2mapapi-piped(32bit):
  * (Visual Studio 2019) Type `cmake -Bbuild_d2mapapi -G "Visual Studio 16 2019" -A Win32 -DUSE_STATIC_CRT=ON d2mapapi`  
    (Visual Studio 2022) Type `cmake -Bbuild_d2mapapi -G "Visual Studio 17 2022" -A Win32 -DUSE_STATIC_CRT=ON d2mapapi`
  * Now you can either:
    * Type `cmake --build build_d2mapapi --config Release --target d2mapapi_piped`
    * Open generated `build_d2mapapi\d2mapapi.sln` and build `d2mapapi_piped` target
  * Compiled binaries are located in `build_d2mapapi\bin` folder

# Credits
* [d2mapapi_mod](https://github.com/soarqin/d2mapapi_mod) modified from [d2mapapi](https://github.com/jcageman/d2mapapi).
* Idea and memory offsets from [MapAssist](https://github.com/misterokaygo/MapAssist).
* [Handmade Math](https://github.com/HandmadeMath/Handmade-Math) for matrix calculations.
* [glad](https://glad.dav1d.de) for loading OpenGL(Core)/WGL functions.
* [inih](https://github.com/benhoyt/inih) for reading INI files.
* [JSON for Modern C++](https://github.com/nlohmann/json) for processing JSON files.
* [CascLib](https://github.com/ladislav-zezula/CascLib) for reading Casc Storage from Diablo II Resurrected.
* [stb](https://github.com/nothings/stb), stb_truetype and stb_rect_pack are used.


================================================
FILE: bin/D2RMH.ini
================================================
[main]
; path to your Diablo II LOD.
; if not found in this path, D2RMH will fallback to read installation path from registry.
d2_path = .
; font settings, you can:
; 1. use TTF inside D2R Casc Storage, supported fonts:
;    All languages (especially koKR, ruRU, zhCN):
;      blizzardglobal-v5_81.ttf(default)
;    zhTW:
;      blizzardglobaltcunicode.ttf(default), arfangxinshuh7c95b5_eb_t.ttf
;    jaJP:
;      bljap_v8_3.ttf(default), ik4ll3.ttf, tbgdb_0pp.ttf
;    enUS, deDE, plPL and other latin languages:
;      formal436bt.ttf(default), exocetblizzardot-medium.otf, irisl.ttf, kodia.ttf, philosopher-bolditalic.ttf
;    leave empty to use default font
; 2. use external TTF(with .ttf or .ttc extension), or TBL/DC6 from D2/D2R
;    a) for TTF font, just put full path in `font_file_path`
;    b) for TBL/DC6 font, you should put 3 files: base.dc6, base.tbl, base.pal(you can get it from data\global\palette\fechar\pal.dat and rename it),
;       and put the full path of any of the file in `font_file_path`, you can also append original font size separated by `|` if it does not match `msg_font_size`.
;       for example: font_file_path = font24.dc6|24
font_file_path =
font_size = 14
; font size for message list
msg_font_size = 24
; can be: enUS,deDE,esES,frFR,itIT,koKR,plPL,esMX,jaJP,ptBR,ruRU,zhTW,zhCN
; leave empty to use D2R language settings
language =

[ui]
; Positive value will limit FPS to certain value, negative value will change OpenGL context swap interval:
;   0=No limit and Disable VSync
;  -1=Enable VSync(aka equal to video adapter fps),
;  -2=VSync with 2 frames per swap(aka video adapter fps/2), etc.
; Note: D2's logic is running at 25 frames per second, so this value is set to 25 by default
fps = 25
; 0-show map layer when in-game map is off
; 1-show map layer when in-game map is on
; 2-show map layer always
show = 0
; set this to 0 if you don't wanna map drawn on bottom game bar
draw_on_game_bar = 1
; hide map layer when certain panels are opened, 0x1FF=all panels
;  0x01-inventory panel
;  0x02-character panel
;  0x04-skill-tree panel
;  0x08-system menu
;  0x10-quest panel
;  0x20-party panel
;  0x40-mercenary panel
;  0x80-waypoint panel
; 0x100-skill selection popup
panel_mask = 0x1FF
; style for guide line
;  0-draw a short line with dot ahead to target (d2hackmap style)
;  1-draw a full line to target
;  2-draw walk-path to target in lines(more CPU usage)
line_style = 0
; 0-top left
; 1-top right
; 2-center
; Note: check `map_area` entry for more info when you set position to 0 or 1
position = 2
; restricted map_area ratio relative to D2R window(width,height)
; each value should be between 0.0 and 1.0, while 0.0 means
; adaptive size, aka suite current map size.
; you can set only one value so that width/height will both use it.
; the map will be drawn in the center of this area if map_centered=0
map_area = 0.0
; map scaling, can be 1.0-4.0
; cut when map_area is not set to adaptive size, or map size is larger than
; D2R game window
scale = 2.0
; 0-static map
; 1-keep player in map center
map_centered = 1
; Alpha channel(aka opacity) for whole layer (0-255)
;  0 is completely transparent, 255 is not tranparent at all
; this is stacked with other color settings, for exampe:
;   while color = 128,128,128,128(alpha channel is 128), alpha = 160,
;   the drawn color alpha channel is: 128*160/255=80
alpha = 255
; bounds(in piexls) for neighbour maps
; can be set to negative to indicate recursive depth,
;   e.g. -1 for show only nearby level maps
;        -2 for show maps around nearby maps also
; set to 0 to disable neighbour maps show
; note: this costs CPU/VRAM a bit if is set to a large value, or nearby maps
;       are large while set to negative(=2048 costs ~64MB VRAM at max),
;       disable it if you get performance impact
neighbour_map_bounds = -1
; walkable area color (R,G,B) 0-255 for each channel, 0,0,0,0 = transparent
walkable_color = 20,20,20,50
; map edge color, set 0,0,0,0 to hide edge
edge_color = 128,128,128,240
; text color
text_color = 255,255,255,180
; colors for player pointer (inner/outer)
player_inner_color = 255,128,128,80
player_outer_color = 51,255,255,180
non_party_player_inner_color = 255,128,128,80
non_party_player_outer_color = 255,20,20,180
; color for guide lines
line_color = 204,204,204,144
; colors for waypoints/portals/chests/quests/wells
waypoint_color = 153,153,255,200
portal_color = 255,255,102,160
chest_color = 255,102,102,160
quest_color = 102,102,255,160
shrine_color = 255,51,178,160
well_color = 51,51,255,160
; colors for monsters/unique monsters(including champions)/npcs
monster_color = 255,0,0,128
unique_monster_color = 192,166,130,204
npc_color = 160,160,160,160
; color for doors
door_color = 80,255,80,180
; message list background color
msg_bg_color = 1,1,1,128
; message position (x,y,align)
; range of x and is [0.0,1.0], align can be 0(left), 1(centered), 2(right)
msg_position = 0.95,0.25,2
; show a text panel (updated every second), leave empty to disable
; usable patterns:
;   {newline}/{n} start a newline here
;   {duration}    current game duration, shown as hh:mm:ss
;   {time}        current system time in 24h clock format: hh:mm:ss
;   {timea}       current system time in locale's 12h clock format
;   {difficulty}  current difficulty name
;   {act}         current act name ('ACT I' to 'ACT V')
;   {mapname}     current map name
;   {gamename}    current game name
;   {gamepass}    current game password
;   {region}      region code of the server which current game creates on
;   {season}      current battle.net season string
text_panel_pattern =
;text_panel_pattern = {duration}
;text_panel_pattern = {difficulty}{n}{act}-{mapname}{n}{time}{n}{duration}
;text_panel_pattern = {gamename}{n}{gamepass}{n}{region} {season}{n}{difficulty}{n}{act}-{mapname}{n}{time}{n}{duration}

; text panel position, same as `msg_position`
text_panel_position = 0.93,0.015,2

; show player names
show_player_names = 1
; show npc's name
show_npc_names = 1
; show in-memory nearby objects(currently only shrines)
show_objects = 1
; minimal size of objects in pixels (except doors)
object_size_minimal = 6
; show in-memory nearby items on ground, check D2RMH_item.ini for filter settings
show_items = 1
; show in-memory nearby monsters
;  0 - not shown
;  1 - only NPCs/super-uniques/bosses/champions are shown
;  2 - common monsters and minions are also shown
show_monsters = 2
; show monster's name, monsters must be shown in `show_monsters`
;  0 - not shown
;  1 - only NPCs/super-uniques/bosses/champions are shown
;  2 - common monsters and minions are also shown
show_monster_names = 1
; show monster's enchant including aura, check [enchants] section below, monsters must be shown in `show_monsters`
;  0 - not shown
;  1 - only NPCs/super-uniques/bosses/champions are shown
;  2 - common monsters and minions are also shown
show_monster_enchants = 1
; show monster's resist(immunity), check [enchants] section below, monsters must be shown in `show_monsters`
;  0 - not shown
;  1 - only NPCs/super-uniques/bosses/champions are shown
;  2 - common monsters and minions are also shown
show_monster_immunities = 2

[enchants]
; strings can be tagged with color, in form '{n}', while n is taken from d2hackmap:
;  0-text color 1-red 2-green 3-blue 4-gold 5-gray 6-black 7-gold2
;  8-orange 9-yellow 10-green2 11-purple 12-green3 13~15-white
; if no color is set, white is selected by default.
extra_strong = S
extra_fast = F
cursed = {2}C
magic_resistant = M
fire_enchanted = {1}FE
ligntning_enchanted = {9}LE
cold_enchanted = {3}CE
mana_burn = {3}MB
teleportation = T
spectral_hit = H
stone_skin = {4}SS
multiple_shots = {12}MS
fanatic = {11}F
berserker = {4}B
; auras
might_aura = {4}A
holyFire_aura = {1}A
blessedAim_aura = A
holyFreeze_aura = {3}A
holyShock_aura = {9}A
conviction_aura = {11}A
fanaticism_aura = {5}A
; immnuties
physical_immunity = {4}i
magic_immunity = {8}i
fire_immunity = {1}i
lightning_immunity = {9}i
cold_immunity = {3}i
poison_immunity = {2}i

[sound]
; sound files used by various functions
; support WAVE files, filename with without '.wav' ext will be treated as system event sounds.
; commonly used system event sounds:
;   SystemAsterisk, SystemDefault, SystemExclamation, SystemHand
; you can also check registry 'HKEY_CURRENT_USER\AppEvents\Schemes\Apps\.Default' for more
; event sounds.
sound[1] = SystemDefault
sound[2] = SystemAsterisk
; sound[3] = Beep.wav


================================================
FILE: bin/D2RMH_gamedata.ini
================================================
[guides]
; "string" = Map Name
; "+number" = Object with certain ID
; "-number" = Npc(Monster) with certain ID
;Act1:
guide[Blood Moor][Den of Evil]                              =1
guide[Cold Plains][Burial Grounds]                          =1
guide[Stony Field][+61]                                     =1
guide[Underground Passage Level 1][Dark Wood]               =1
guide[Dark Wood][+30]                                       =1
guide[Black Marsh][Forgotten Tower]                         =1
guide[Tower Cellar Level 1][Tower Cellar Level 2]           =1
guide[Tower Cellar Level 2][Tower Cellar Level 3]           =1
guide[Tower Cellar Level 3][Tower Cellar Level 4]           =1
guide[Tower Cellar Level 4][Tower Cellar Level 5]           =1
guide[Tamoe Highland][Pit Level 1]                          =1
guide[Pit Level 1][Pit Level 2]                             =1
guide[Barracks][+108]                                       =1
guide[Jail Level 1][Jail Level 2]                           =1
guide[Jail Level 2][Jail Level 3]                           =1
guide[Jail Level 3][Inner Cloister]                         =1
guide[Cathedral][Catacombs Level 1]                         =1
guide[Catacombs Level 1][Catacombs Level 2]                 =1
guide[Catacombs Level 2][Catacombs Level 3]                 =1
guide[Catacombs Level 3][Catacombs Level 4]                 =1
;Act2:
guide[47][48]                                               =1
guide[48][49]                                               =1
guide[Dry Hills][Halls of the Dead Level 1]                 =1
guide[Halls of the Dead Level 1][Halls of the Dead Level 2] =1
guide[Halls of the Dead Level 2][Halls of the Dead Level 3] =1
guide[Far Oasis][Maggot Lair Level 1]                       =1
guide[Maggot Lair Level 1][Maggot Lair Level 2]             =1
guide[Maggot Lair Level 2][Maggot Lair Level 3]             =1
guide[Valley of Snakes][Claw Viper Temple Level 1]          =1
guide[Claw Viper Temple Level 1][Claw Viper Temple Level 2] =1
guide[Lost City][Ancient Tunnels]                           =1
guide[Harem Level 1][Harem Level 2]                         =1
guide[Harem Level 2][Palace Cellar Level 1]                 =1
guide[Palace Cellar Level 1][Palace Cellar Level 2]         =1
guide[Palace Cellar Level 2][Palace Cellar Level 3]         =1
guide[Arcane Sanctuary][+357]                               =1
guide[66][+152]                                             =1
guide[67][+152]                                             =1
guide[68][+152]                                             =1
guide[69][+152]                                             =1
guide[70][+152]                                             =1
guide[71][+152]                                             =1
guide[72][+152]                                             =1
;Act3:
guide[Spider Forest][Spider Cavern]                         =1
guide[Flayer Jungle][+252]                                  =1
;guide[Flayer Jungle][Flayer Dungeon Level 1]               =1   Flayer Dungeon is nearby Gidbinn, no need to tip it
guide[Flayer Dungeon Level 1][Flayer Dungeon Level 2]       =1
guide[Flayer Dungeon Level 2][Flayer Dungeon Level 3]       =1
guide[Kurast Bazaar][Ruined Temple]                         =1
guide[92][93]                                               =1
guide[Travincal][Durance of Hate Level 1]                   =1
guide[Durance of Hate Level 1][Durance of Hate Level 2]     =1
guide[Durance of Hate Level 2][Durance of Hate Level 3]     =1
;Act4:
guide[Outer Steppes][Plains of Despair]                     =1
guide[Plains of Despair][-256]                              =1
guide[City of the Damned][River of Flame]                   =1
guide[River of Flame][+376]                                 =1
;Act5:
guide[Arreat Plateau][Crystalline Passage]                  =1
guide[Crystalline Passage][Frozen River]                    =1
guide[Frozen River][+460]                                   =1
guide[Glacial Trail][Frozen Tundra]                         =1
guide[Nihlathak's Temple][Halls of Anguish]                 =1
guide[Halls of Anguish][Halls of Pain]                      =1
guide[Halls of Pain][Halls of Vaught]                       =1
guide[Halls of Vaught][+462]                                =1
guide[Frozen Tundra][The Ancients' Way]                     =1
guide[The Ancients' Way][Arreat Summit]                     =1
guide[Worldstone Keep Level 1][Worldstone Keep Level 2]     =1
guide[Worldstone Keep Level 2][Worldstone Keep Level 3]     =1
guide[Worldstone Keep Level 3][Throne of Destruction]       =1

[useful_object_op]
2=Shrine
10=Quest                 ;Gibbet of Cairn
12=Quest                 ;Tree of Inifuss
15=Portal                ;Player's Portal, or Permanent Portal by shrines
21=Quest                 ;Malus
22=Well,well
23=Waypoint
24=Quest                 ;Tainted Sun Altar
25=Quest                 ;Where you place the Horadric staff
28=Quest                 ;Lam Esen's Tome
31=Quest                 ;Gidbinn
34=Portal                ;Arcane Sanctuary portal
39=Chest,box             ;Horadric Cube Chest
40=Chest,tr1             ;Horadric Scroll Chest
41=Chest,Staff of Kings  ;Staff Of Kings Chest
42=Quest                 ;Horazon's Journal
43=Portal                ;Portal to Duriel's Lair
46=Portal                ;Hellgate
49=Quest                 ;Hellforge
57=Chest,qhr             ;Khalim's Heart
58=Chest,qey             ;Khalim's Eye
59=Chest,qbr             ;Khalim's Brain
69=Chest                 ;Evil Urn

[useful_objects]
61=Quest,StoneAlpha  ;Cairn Stones
397=Chest            ;Sparky Chest
460=Quest,Drehya     ;Anya
462=Quest,Nihlathak  ;Nihlathak
473=Quest            ;Caged Barbarian
580=Chest,chest      ;Unique Chest

[useful_npcs]
256=Quest  ;Izual


================================================
FILE: bin/D2RMH_item.ini
================================================
[items]
; format:
;  <ID or Code>[+quality][*sockets][#ethereal]=style[,color,[sound]]
;  ID or Code: check `ID` and `code` in doc/ItemDesc.md
;  quality: 0-low 1-normal 2-superior 3-magic 4-set 5-rare 6-unique 7-crafted
;  ethereal: 0 or 1
;  all other fields can be single value or range/list
;    you can use `642` or `r33` for Zod Rune
;            use `640,642` or `r31,r33` for both Jah and Zod Rune
;            use `640-642` or `r31-r33` for Jah, Cham and Zod Rune
;       mix them `634,636-638,640-642` or `r24,r26-r29,r31-r33`
;  style: 0-don't show  1-show on minimap  2-show on a separate message list  3-show both
;  color: 0-default 1-red 2-green 3-blue 4-gold 5-gray 6-black 7-gold2
;         8-orange 9-yellow 10-green2 11-purple 12-green3 13~15-white
;         use quality color by default if set to 0 or absent:
;            low/normal=15, superior=5, magic=3, set=2, rare=9, unique=4, crafted=8
;  sound: index for sound playing on drop, check `[sound]` section in D2RMH.ini. 0 for mute, as default.
; full example: `crs+2,3*0,4,6=1,0,1` shows "Normal/Superior 0/4/6 Sockets Crystal Sword" on minimap
;               with default color and play sound[1] in `[sound]` section in D2RMH.ini.

; Items for Charsi's imbue
; Dimensional Shard
300+1,2*0#0 = 0
; Diadem
421+1,2*0#0 = 0

; Items for crafting
; Vampirefang Belt
461+3 = 0
; Gloves
334-338,380-384,450-454+3 = 0
; Monarch Shield
447+3#0 = 0
; Circlet, Coronet, Tiara, Diadem
418-421+3#0 = 0
; Amulet, Ring
520,522+3 = 0
; Elite Light Armors
429-432,436,443+3#0 = 0
; Assa Claws
182-188,189-195+3 = 0
; Sorc Orbs
276-280,286-290,296-300+3 = 0
; Ancient Armor
326+3#0 = 0
; Embossed Plate
370+3#0 = 0
; Ornate Plate
372+3#0 = 0
; Elite Medium Armors
433,435,437,439,440,442+3#0 = 0
; Battle Boots, Mirrored Boots
388,458+3 = 0
; Druid Helmets
; Alpha Helm, Griffon Headdress, Hunter's Guise, Sacred Feathers, Totemic Mask, Blood Spirit, Sun Spirit, Earth Spirit, Sky Spirit, Dream Spirit
468-472,488-492+3#0 = 0
; Bar Helmets
403-407,473-477,493-497+3#0 = 0

; Potential good rare items
; Short Sword, Falchion
; Gladius, Tulwar
; Falcata, Hydra Edge
25,28,118,121,221,224+5#1 = 0
; Crystal Sword, Dimensional Blade
29,122+5#1 = 0
; Broad Sword, War Sword
; Battle Sword, Ancient Sword
; Conquest Sword, Mythical Sword
30,32,123,125,226,228+5#1 = 0
; Axe, Double Axe, Military Pick, War Axe
; Cleaver, Twin Axe, Crowbill, Naga
; Small Crescent, Ettin Axe, War Spike, Berserker Axe
1-4,94-97,197-200+5#1 = 0
; Morning Star, War Hammer
; Jagged Star, Battle Hammer
; Devil Star, Legendary Mallet
20,22,113,115,216,218+5#1 = 0
; Grand Scepter, War Scepter
; Holy Water Sprinkler, Divine Scepter
; Seraph Rod, Caduceus
16-17,109-110,212-213+5#1 = 0
; Large Axe, Broad Axe, Battle Axe, Great Axe, Giant Axe
; Military Axe, Bearded Axe, Tabar, Gothic Axe, Ancient Axe
; Feral Axe, Silver-edged Axe, Decapitator, Champion Axe, Glorious Axe
5-9,98-102,201-205+5#1 = 0
; Maul, Great Maul
; War Club, Martel de Fer
; Ogre Maul, Thunder Maul
23-24,116-117,219-220+5#1 = 0
; Two-Handed Sword, Claymore, Giant Sword, Bastard Sword, Flamberge, Great Sword
; Espandon, Dacian Falx, Tusk Sword, Gothic Sword, Zweihander, Executioner Sword
; Legend Sword, Highland Blade, Balrog Blade, Champion Sword, Colossus Sword, Colossus Blade
33-38,126-131,229-234+5#1 = 0
; Spear, Trident
; War Spear, Fuscina
; Hyperion Spear, Stygian Pike
52-53,145-146,248-249+5#1 = 0
; Spetum, Pike, Bardiche, Voulge, Scythe, Poleaxe, Halberd, War Scythe
; Yari, Lance, Lochaber Axe, Bill, Battle Scythe, Partizan, Bec-de-Corbin, Grim Scythe
; Ghost Spear, War Pike, Ogre Axe, Colossus Voulge, Thresher, Cryptic Axe, Great Poleaxe, Giant Thresher
55-62,148-155,251-258+5#1 = 0
; Maiden Spear, Maiden Pike
; Ceremonial Spear, Ceremonial Pike
; Matriarchal Spear, Matriarchal Pike
283-284,293-294,303-304+5#1 = 0
; Maiden Javelin, Ceremonial Javelin, Matriarchal Javelin
285,295,305+5 = 0
; Short Staff, Long Staff, Gnarled Staff, Battle Staff, War Staff
; Jo Staff, Quarterstaff, Cedar Staff, Gothic Staff, Rune Staff
; Walking Stick, Stalagmite, Elder Staff, Shillelagh, Archon Staff
63-67,156-160,259-263+5#1 = 0
; Throwing Knife, Throwing Axe, Balanced Knife, Balanced Axe, Javelin, Pilum, Short Spear, Glaive, Throwing Spear
; Battle Dart, Francisca, War Dart, Hurlbat, War Javelin, Great Pilum, Simbilan, Spiculum, Harpoon
; Flying Knife, Flying Axe, Winged Knife, Winged Axe, Hyperion Javelin, Stygian Pilum, Balrog Spear, Ghost Glaive, Winged Harpoon
43-51,136-144,239-247+5#1 = 0
; Maiden Javelin, Ceremonial Javelin, Matriarchal Javelin
285,295,305+5#1 = 0
; Short Bow, Hunter's Bow, Long Bow, Composite Bow, Short Battle Bow, Long Battle Bow, Short War Bow, Long War Bow
; Edge Bow, Razor Bow, Cedar Bow, Double Bow, Short Siege Bow, Large Siege Bow, Rune Bow, Gothic Bow
; Spider Bow, Blade Bow, Shadow Bow, Great Bow, Diamond Bow, Crusader Bow, Ward Bow, Hydra Bow
68-75,161-168,264-271+5 = 0
; Stag Bow, Reflex Bow
; Ashwood Bow, Ceremonial Bow
; Matriarchal Bow, Grand Matron Bow
281-282,291-292,301-302+5 = 0
; Light Crossbow, Crossbow, Heavy Crossbow, Repeating Crossbow
; Arbalest, Siege Crossbow, Ballista, Chu-Ko-Nu
; Pellet Bow, Gorgon Crossbow, Colossus Crossbow, Demon Crossbow
76-79,169-172,272-275+5 = 0
; Boots
340-343,385-389,455-459+5 = 0
; Gloves
334-338,380-384,450-454+5 = 0
; Claws
175-195+5 = 0
; Circlet, Coronet, Tiara, Diadem
418-421+5 = 0
; Sorc Orbs
276-280,286-290,296-300+5 = 0
; Necro Shields
413-417,483-487,503-507+5 = 0
; Amulet, Ring
520,522+5 = 0
; Necro Wands
103-106,206-209+5 = 0

; Set Items
; Winged Helm = Guillaume's Face
356+4 = 3
; Diadem = M'avina's True Sight
421+4 = 3
; Lacquered Plate = Tal Rasha's Guardianship
440+4 = 3
; Mesh Belt = Tal Rasha's Fine-Spun Cloth
392+4 = 3
; Amulet = Tal Rasha's Adjudication or other set amulets
520+4 = 3
; Shadow Plate = Aldur's Deception
441+4 = 3
; Sacred Armor = Immortal King's Soul Cage
442+4 = 3
; Troll Belt = Trang-Oul's Girth
463+4 = 3
; Bone Visage = Trang-Oul's Guise
465+4 = 3
; Chaos Armor = Trang-Oul's Scales
371+4 = 3
; Heavy Bracers = Trang-Oul's Claws
382+4 = 3
; Cantor Trophy = Trang-Oul's Wing
486+4 = 3
; Corona = Griswold's Valor
427+4 = 3
; Vortex Shield = Griswold's Honor
502+4 = 3
; Caduceus = Griswold's Redemption
213+4 = 3
; Scissors Suwayyah = Natalya's Mark
195+4 = 3
; Colossus Blade = Bul-Kathos' Sacred Charge
234+4 = 3
; Mythical Sword = Bul-Kathos' Tribal Guardian
228+4 = 3

; Unique Items
; Chain Gloves = Chance Guards
336+6 = 3
; Light Gauntlets = Magefist
337+6 = 3
; Vampirebone Gloves = Dracul's Grasp
451+6 = 3
; Ogre Gauntlets = Steelrend
454+6 = 3
; Serpentskin Armor = Skin of the Vipermagi
360+6 = 3
; Mesh Armor = Shaftstop
365+6 = 3
; Cuirass = Duriel's Shell
366+6#1 = 3
; Russet Armor = Skullder's Ire
367+6 = 3
; Templar Coat = Guardian Angel
368+6 = 3
; Dusk Shroud = Ormus' Robes
429+6 = 3
; Wire Fleece = The Gladiator's Bane
432+6 = 3
; Balrog Skin = Arkain's Valor
437+6 = 3
; Kraken Shell = Leviathan
439+6 = 3
; Sacred Armor = Templar's Might, Tyrael's Might
442+6 = 3
; Sharkskin Boots = Waterwalk
386+6 = 3
; Mesh Boots = Silkweave
387+6 = 3
; Battle Boots = Wartraveler
388+6 = 3
; War Boots = Gorerider
389+6 = 3
; Scarabshell Boots = Sandstorm Trek
456+6 = 3
; Boneweave Boots = Marrowwalk
457+6 = 3
; Myrmidon Greaves = Shadowdancer
459+6 = 3
; Sharkskin Belt = Razortail
391+6 = 3
; War Belt = Thundergold's Vigor
394+6 = 3
; Spiderweb Sash = Archnid Mesh
460+6 = 3
; Vampirefang Belt = Nosferatu's Coil
461+6 = 3
; Mithril Coil = Verdugo's Hearty Cord
462+6 = 3
; Monarch = Stormshield
447+6 = 3
; Gilded Shield = Herald of Zakarum
481+6 = 3
; Hierophant Trophy = Homunculus
487+6 = 3
; Succubus Skull = Boneflame
506+6 = 3
; Bloodlord Skull = Darkforce Spawn
507+6 = 3
; Sallet = Rockstopper
353+6#1 = 3
; Casque = Stealskull
354+6 = 3
; Grand Crown = Crown of Thieves
357+6#1 = 3
; Grim Helm = Vampiregaze
395+6#1 = 3
; Tiara = Kira's Guardian
420+6 = 3
; Shako = Harlequin Crest
422+6 = 3
; Spired Helm = Veil of Steel
426+6 = 3
; Demonhead = Andariel's Visage
428+6 = 3
; Totemic Mask = Jalal's Mane
472+6 = 3
; Slayer Guard = Arreat's Face
477+6 = 3
; Corona = Crown of Ages
427+6 = 3
; Diadem = Griffon's Eye
421+6 = 3
; Tomb Wand = Arm of King Leoric
105+6 = 3
; Battle Sword = Headstriker
123+6#1 = 3
; Fuscina = Kelpie Snare
146+6#1 = 3
; Yari = Hone Sundan
148+6#1 = 3
; Ballista = Buriza-Do Kyanon
171+6 = 3
; Greater Talons = Bartuc's Cut-Throat
187+6 = 3
; Lich Wand = Boneshade
208+6 = 3
; Mighty Scepter = Heaven's Light
211+6 = 3
; Scourge = Horizon's Tornado
217+6 = 3
; Phase Blade = Lightsabre, Azurewrath
225+6 = 3
; Champion Sword = Doombringer
232+6 = 3
; Winged Knife = Warshrike
241+6#1 = 3
; Winged Axe = Lacerator
242+6#1 = 3
; Hyperion Spear = Arioc's Needle
248+6#1 = 3
; Ogre Axe = Bonehew
253+6#1 = 3
; Thresher = The Reaper's Toll
255+6 = 3
; Cryptic Axe = Tomb Reaver
256+6 = 3
; Elder Staff = Ondal's Wisdom
261+6 = 3
; Crusader Bow = Eaglehorn
269+6 = 3
; Ward Bow = Widowmaker
270+6 = 3
; Swirling Crystal = The Oculus
290+6 = 3
; Eldritch Orb = Eschuta's Temper
297+6 = 3
; Ceremonial Javelin = Titan's Revenge
295+6 = 3
; Unearthed Wand = Death's Web
209+6 = 3
; Caduceus = Astreon's Iron Ward
213+6 = 3
; Archon Staff = Mang Song's Lesson
263+6 = 3
; Dimensional Shard = Death's Fathom
300+6 = 3
; Colossus Blade = Godfather
234+6 = 3
; Legend Spike = Ghostflame
238+6 = 3
; Berserker Axe = Death Cleaver
200+6 = 3
; Glorious Axe = Executioner's Justice
205+6 = 3
; Giant Thresher = Stormspire
258+6 = 3
; War Pike = Steel Pillar
252+6 = 3
; Hydra Bow = Windforce
271+6 = 3
; Winged Harpoon = Gargoyle's Bite
247+6 = 3
; Thunder Maul = Earth Shifter, The Cranium Basher
220+6 = 3
; Unique Amulet, Ring
520,522+6 = 3
; Unique Small Charm, Large Charm, Grand Charm
603-605+6 = 3

; Jewels
643 = 3
; Rare Jewel
643+5 = 3
; Unique Jewel
643+6 = 3
; Small Charm, Grand Charm
603,605 = 3
; Large Charm
604 = 0

; Items for Runewords
; Grand Crown, Corona
357,427+2*0#0 = 3
; Grand Crown, Corona
357,427+2*3#0 = 3
; Zweihander
130+1,2*0#0 = 3
; Zweihander
130+1,2*5#0 = 3
; Colossus Blade
234+2*0#1 = 3
; Colossus Blade
234+2*4#0 = 3
; Colossus Blade
234+2*4,5,6#1 = 3
; Colossus Sword
233+2*4#1 = 3
; Berserker Axe
200+1,2*0,4,5,6#1 = 3
; Berserker Axe
200+2*4,5#0 = 3
; Berserker Axe
200+1*0#0 = 3
; Berserker Axe
200+1*5#0 = 3
; Ghost Spear, War Pike
251,252+2*0,6#1 = 3
; Matriarchal Spear, Matriarchal Pike
303,304+2*0,6#1 = 3
; Scythe
59+1*0#0 = 0
59+1*0#1 = 0
59+1,2*4 = 0
; Gnarled Staff, Battle Staff
; Cedar Staff, Gothic Staff
; Elder Staff, Shillelagh
65-66,158-159,261-262+1,2*0#0 = 0
65-66,158-159,261-262+1,2*0#1 = 0
65-66,158-159,261-262+1,2*4 = 0
; War Staff, Rune Staff, Archon Staff
67,160,263+1*0#0 = 0
67,160,263+1*0#1 = 0
67,160,263+1,2*4 = 0
; Thresher, Cryptic Axe
255,256+1,2*0,4,5#1 = 0
; Great Poleaxe
257+1*0,4,5#1 = 3
257+2*0,4,5,6#1 = 3
; Giant Thresher
258+1*0,4,5#1 = 3
258+2*4,5#1 = 3
; Crystal Sword
29+1,2*6 = 0
29+1*0#0 = 3
29+1*0#1 = 3
29+1,2*3,5 = 3
; Phase Blade
225+1,2*0#0 = 3
225+1,2*3,5#0 = 3
225+1,2*6#0 = 0
; Flail
21+1*0#0 = 3
; Flail
21+1*0#1 = 3
21+1,2*4 = 3

; War Scepter, Divine Scepter, Caduceus
17,110,213+1,2*0#0 = 0
17,110,213+1,2*0#1 = 0
17,110,213+1,2*5 = 0

; Great Bow
267+2*0#0 = 3
267+2*4#0 = 3
; Shadow Bow
266+2*4#0 = 3
; Grand Matron Bow
302+2*4#0 = 3

; Suwayyah, Scissors Suwayyah, Runic Talons, Feral Claws
189,195,194,193+1,2*0#0 = 3
189,195,194,193+1,2*3#0 = 3
; Sacred Targe, Sacred Rondache, Kurast Shield, Zakarum Shield, Vortex Shield
498-502+1,2*0#0 = 3
498-502+1,2*3,4#0 = 3
498-502+1,2*0,4#1 = 3
; Monarch
447+1,2*0#0 = 3
447+1,2*4#0 = 3
; Troll Nest
466+1,2*0#0 = 3
466+1,2*3#0 = 3
; Mage Plate
373+2*0#0 = 3
373+2*3#0 = 3
; Lacquered Plate
440+1*0#1 = 3
; Sacred Armor
442+2*0#0 = 3
; Sacred Armor
442+1*0#1 = 3
; Sacred Armor
442+2*3,4#0 = 3
; Shadow Plate
441+1*0#1 = 3
; Archon Plate
443+2*0#0 = 3
; Archon Plate
443+1*0#1 = 3
; Archon Plate
443+2*3,4#0 = 3
; Dusk Shroud
429+2*0,3,4#0 = 0
; Great Hauberk
436+2*0,3,4#0 = 0
; Bone Wand, Grim Wand, Petrified Wand, Tomb Wand, Grave Wand, Polished Wand, Ghost Wand, Lich Wand, Unearthed Wand
12,13,104-106,206-209+1,2*0#0 = 0
12,13,104-106,206-209+1,2*2#0 = 0
12,13,104-106,206-209+1,2*0,2#1 = 0
; Preserved Head, Zombie Head, Unraveller Head, Gargoyle Head, Demon Head
; Mummified Trophy, Fetish Trophy, Sexton Trophy, Cantor Trophy, Hierophant Trophy
; Minion Skull, Hellspawn Skull, Overseer Skull, Succubus Skull, Bloodlord Skull
413-417,483-487,503-507+1,2*0#0 = 0
413-417,483-487,503-507+1,2*2#0 = 0

; Key of Destruction
649 = 3
; Key of Hate
648 = 3
; Key of Terror
647 = 3
; Mephisto's Brain
652 = 3
; Baal's Eye
651 = 3
; Diablo's Horn
650 = 3
; Token of Absolution
653 = 3
; Twisted Essence of Suffering
654 = 0
; Charged Essence of Hatred
655 = 0
; Burning Essence of Terror
656 = 0
; Festering Essence of Destruction
657 = 0
; Wirt's Leg
88 = 0

; Act1
; Scroll of Inifuss, Key to the Cairn Stones, Horadric Malus
524,525,89 = 0

; Act2
; Horadric Scroll, Book of Skill, Horadric Cube, Shaft of the Horadric Staff, Top of the Horadric Staff, Horadric Staff
550,552,549,92,521,91 = 0

; Act3
; The Gidbinn, Potion of Life, A Jade Figurine, The Golden Bird, Lam Esen's Tome, Khalim's Eye, Khalim's Heart, Khalim's Brain, Khalim's Flail, Khalim's Will
87,545-548,553-555,173-174 = 0

; Act4
; Mephisto's Soulstone, Hell Forge Hammer
551,90 = 0

; Act5
; Malah's Potion, Scroll of Resistance
644,646 = 0

; Arrows
526 = 0

; Bolts
528 = 0

; Key
543 = 0

; Minor Healing Potion, Light Healing Potion, Healing Potion, Greater Healing Potion, Super Healing Potion
587-591 = 0
; Minor Mana Potion, Light Mana Potion, Mana Potion, Greater Mana Potion, Super Mana Potion
592-596 = 0

; Tome of Town Portal, Tome of Identify
518-519 = 0

; Scroll of Town Portal, Scroll of Identify
529-530 = 0

; Rejuvenation Potion
515 = 0
; Full Rejuvenation Potion
516 = 3

; Flawed Emerald, Flawed Ruby, Flawed Diamond, Diamond
573,578,583,584 = 0
; Amethyst, Topaz, Sapphire, Emerald, Ruby
559,564,569,574,579 = 0
; Flawless Amethyst, Perfect Amethyst
560-561 = 3
; Flawless Topaz, Perfect Topaz
565-566 = 3
; Flawless Sapphire, Perfect Sapphire
570-571 = 3
; Flawless Emerald, Perfect Emerald
575-576 = 3
; Flawless Ruby, Perfect Ruby
580-581 = 3
; Flawless Diamond, Perfect Diamond
585-586 = 3
; Flawless Skull, Perfect Skull
600-601 = 3

; Runes
r01-r13 = 3
r14-r33 = 3,0,1


================================================
FILE: bin/plugins/chicken_life.lua
================================================
local text = create_text_list("default")

local chicken_life = function()
    local player = get_player()
    if player and player.map ~= 1 and player.map ~= 40 and player.map ~= 75 and player.map ~= 103 and player.map ~= 109 then
        if player.stats[7] < player.stats[8] * 0.3 then
            kill_process()
        end
    end
end

function chicken_life_toggle(on)
    if on then
        text:add('Chicken life enabled. Toggle hotkey: \'Ctrl+/\'', 5000, -1)
    else
        text:add('Chicken life disabled. Toggle hotkey: \'Ctrl+/\'', 5000, -1)
    end
end

register_plugin("Ctrl+/", false, 250, chicken_life, chicken_life_toggle)


================================================
FILE: bin/plugins/hotkey.lua
================================================
local toggle_show = function()
    local conf = get_config()
    conf.show = conf.show + 1
    if conf.show > 2 then
        conf.show = 0
    end
end

local zoom_in = function()
    local conf = get_config()
    if conf.scale < 4.0 then
        conf.scale = conf.scale + 0.5
        if conf.scale > 4.0 then
            conf.scale = 4.0
        end
        flush_overlay()
    end
end

local zoom_out = function()
    local conf = get_config()
    if conf.scale > 1.0 then
        conf.scale = conf.scale - 0.5
        if conf.scale < 1.0 then
            conf.scale = 1.0
        end
        flush_overlay()
    end
end

register_hotkey('\\', toggle_show)
register_hotkey('OEM_PLUS', zoom_in)
register_hotkey('OEM_MINUS', zoom_out)


================================================
FILE: bin/plugins/town_portal_check.lua
================================================
local text = create_text_list("default")

local town_portal_check = function()
    -- game fully loaded?
    if not get_skill(0) then
        return
    end

    local quantity
    local portal_book = get_skill(220)
    if portal_book then
        quantity = portal_book.quantity
    else
        quantity = 0
    end
    if quantity < 3 then
        text:add(string.format("\x0BWARNING! Town portal scrolls quantity low: %d", quantity), 1500, 0)
    end
end
register_plugin(1000, town_portal_check)


================================================
FILE: build_msvc2019.bat
================================================
@echo off

setlocal
set BUILD_DIR=msvc2019

setlocal
set PATH=%MSYS2_BASE_PATH%\mingw64\bin;%PATH%
cmake -Bbuild/%BUILD_DIR%/main -G "Visual Studio 16 2019" -A x64 -DUSE_STATIC_CRT=ON .
cmake --build build/%BUILD_DIR%/main --config Release --target D2RMH -j
endlocal

setlocal
set PATH=%MSYS2_BASE_PATH%\mingw32\bin;%PATH%
cmake -Bbuild/%BUILD_DIR%/d2mapapi -G "Visual Studio 16 2019" -A Win32 -DUSE_STATIC_CRT=ON d2mapapi
cmake --build build/%BUILD_DIR%/d2mapapi --config Release --target d2mapapi_piped -j
endlocal

cmake -E make_directory build/%BUILD_DIR%/dist
cmake -E copy_if_different build\%BUILD_DIR%\main\bin\Release\D2RMH.exe build\%BUILD_DIR%\d2mapapi\bin\Release\d2mapapi_piped.exe build\%BUILD_DIR%\dist\

call copy_dist.bat

endlocal


================================================
FILE: build_msvc2022.bat
================================================
@echo off

setlocal
set BUILD_DIR=msvc2022

setlocal
set PATH=%MSYS2_BASE_PATH%\mingw64\bin;%PATH%
cmake -Bbuild/%BUILD_DIR%/main -G "Visual Studio 17 2022" -A x64 -DUSE_STATIC_CRT=ON .
cmake --build build/%BUILD_DIR%/main --config Release --target D2RMH -j
endlocal

setlocal
set PATH=%MSYS2_BASE_PATH%\mingw32\bin;%PATH%
cmake -Bbuild/%BUILD_DIR%/d2mapapi -G "Visual Studio 17 2022" -A Win32 -DUSE_STATIC_CRT=ON d2mapapi
cmake --build build/%BUILD_DIR%/d2mapapi --config Release --target d2mapapi_piped -j
endlocal

cmake -E make_directory build/%BUILD_DIR%/dist
cmake -E copy_if_different build\%BUILD_DIR%\main\bin\Release\D2RMH.exe build\%BUILD_DIR%\d2mapapi\bin\Release\d2mapapi_piped.exe build\%BUILD_DIR%\dist\

call copy_dist.bat

endlocal


================================================
FILE: build_msys2_clang.bat
================================================
@echo off

setlocal
set BUILD_DIR=msys2_clang

setlocal
set MSYS2_BASE_PATH=%~1
if "%~1" == "" set MSYS2_BASE_PATH=C:\msys64

setlocal
set PATH=%MSYS2_BASE_PATH%\clang64\bin;%PATH%
cmake -Bbuild/%BUILD_DIR%/main -G "MinGW Makefiles" -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Release -DUSE_STATIC_CRT=ON .
cmake --build build/%BUILD_DIR%/main --target D2RMH -j
endlocal

setlocal
set PATH=%MSYS2_BASE_PATH%\clang32\bin;%PATH%
cmake -Bbuild/%BUILD_DIR%/d2mapapi -G "MinGW Makefiles" -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Release -DUSE_STATIC_CRT=ON d2mapapi
cmake --build build/%BUILD_DIR%/d2mapapi --target d2mapapi_piped -j
endlocal

endlocal

cmake -E make_directory build/%BUILD_DIR%/dist
cmake -E copy_if_different build\%BUILD_DIR%\main\bin\D2RMH.exe build\%BUILD_DIR%\d2mapapi\bin\d2mapapi_piped.exe build\%BUILD_DIR%\dist\

call copy_dist.bat

endlocal

================================================
FILE: build_msys2_mingw.bat
================================================
@echo off

setlocal
set BUILD_DIR=msys2_mingw

setlocal
set MSYS2_BASE_PATH=%~1
if "%~1" == "" set MSYS2_BASE_PATH=C:\msys64

setlocal
set PATH=%MSYS2_BASE_PATH%\mingw64\bin;%PATH%
cmake -Bbuild/%BUILD_DIR%/main -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release -DUSE_STATIC_CRT=ON .
cmake --build build/%BUILD_DIR%/main --target D2RMH -j
endlocal

setlocal
set PATH=%MSYS2_BASE_PATH%\mingw32\bin;%PATH%
cmake -Bbuild/%BUILD_DIR%/d2mapapi -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release -DUSE_STATIC_CRT=ON d2mapapi
cmake --build build/%BUILD_DIR%/d2mapapi --target d2mapapi_piped -j
endlocal

endlocal

cmake -E make_directory build/%BUILD_DIR%/dist
cmake -E copy_if_different build\%BUILD_DIR%\main\bin\D2RMH.exe build\%BUILD_DIR%\d2mapapi\bin\d2mapapi_piped.exe build\%BUILD_DIR%\dist\

call copy_dist.bat

endlocal


================================================
FILE: cmake/CustomCompilerOptions.cmake
================================================
macro(fix_compile_flags)
    if(MSVC)
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /utf-8")
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8")
    endif()
endmacro()

macro(fix_release_flags)
    if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
        set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -s -flto")
        set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL} -s -flto")
        set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} -s -flto")
        set(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "${CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL} -s -flto")
        set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -flto")
        set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -flto")
    endif()
    if(MSVC)
        add_compile_options(
            $<$<CONFIG:Release>:/GL>
            $<$<CONFIG:MinSizeRel>:/GL>
        )
        add_link_options(
            $<$<CONFIG:Release>:/LTCG>
            $<$<CONFIG:MinSizeRel>:/LTCG>
        )
    endif()
endmacro()

macro(add_static_runtime_option)
    option(USE_STATIC_CRT "Use static C runtime" OFF)

    if(USE_STATIC_CRT)
        if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
            set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static -static-libgcc -static-libstdc++")
            set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -static -static-libgcc -static-libstdc++")
        elseif(MSVC)
            set(CompilerFlags
                CMAKE_CXX_FLAGS
                CMAKE_CXX_FLAGS_DEBUG
                CMAKE_CXX_FLAGS_RELEASE
                CMAKE_CXX_FLAGS_MINSIZEREL
                CMAKE_CXX_FLAGS_RELWITHDEBINFO
                CMAKE_C_FLAGS
                CMAKE_C_FLAGS_DEBUG
                CMAKE_C_FLAGS_RELEASE
                CMAKE_C_FLAGS_MINSIZEREL
                CMAKE_C_FLAGS_RELWITHDEBINFO
                )
            foreach(CompilerFlag ${CompilerFlags})
                string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
                set(${CompilerFlag} "${${CompilerFlag}}" CACHE STRING "msvc compiler flags" FORCE)
            endforeach()
            add_compile_options(
                $<$<CONFIG:>:/MT>
                $<$<CONFIG:Debug>:/MTd>
                $<$<CONFIG:Release>:/MT>
                $<$<CONFIG:MinSizeRel>:/MT>
                $<$<CONFIG:RelWithDebInfo>:/MT>
            )
        endif()
    endif()
endmacro()


================================================
FILE: cmake/GetVersion.cmake
================================================
macro(get_project_version VER_PROJ_NAME)
    find_package(Git QUIET)

    # Check if git is found...
    if (GIT_FOUND)

        # Get last tag from git
        execute_process(COMMAND ${GIT_EXECUTABLE} describe --abbrev=0 --tags
            WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
            OUTPUT_VARIABLE ${VER_PROJ_NAME}_VERSION_STRING
            OUTPUT_STRIP_TRAILING_WHITESPACE)

        # Get name of current branch
        execute_process(COMMAND ${GIT_EXECUTABLE} symbolic-ref --short HEAD
            WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
            OUTPUT_VARIABLE ${VER_PROJ_NAME}_BRANCH_NAME
            OUTPUT_STRIP_TRAILING_WHITESPACE)

        #How many commits since last tag
        execute_process(COMMAND ${GIT_EXECUTABLE} rev-list ${${VER_PROJ_NAME}_BRANCH_NAME} ${${VER_PROJ_NAME}_VERSION_STRING}..HEAD --count
            WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
            OUTPUT_VARIABLE ${VER_PROJ_NAME}_VERSION_AHEAD
            OUTPUT_STRIP_TRAILING_WHITESPACE)

        # Get current commit SHA from git
        execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
            WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
            OUTPUT_VARIABLE ${VER_PROJ_NAME}_VERSION_GIT_SHA
            OUTPUT_STRIP_TRAILING_WHITESPACE)

        # Get partial versions into a list
        string(REGEX MATCHALL "-.*$|[0-9]+" ${VER_PROJ_NAME}_PARTIAL_VERSION_LIST
            ${${VER_PROJ_NAME}_VERSION_STRING})

        # Set the version numbers
        list(GET ${VER_PROJ_NAME}_PARTIAL_VERSION_LIST
            0 ${VER_PROJ_NAME}_VERSION_MAJOR)
        list(GET ${VER_PROJ_NAME}_PARTIAL_VERSION_LIST
            1 ${VER_PROJ_NAME}_VERSION_MINOR)
        list(GET ${VER_PROJ_NAME}_PARTIAL_VERSION_LIST
            2 ${VER_PROJ_NAME}_VERSION_PATCH)

        # The tweak part is optional, so check if the list contains it
        list(LENGTH ${VER_PROJ_NAME}_PARTIAL_VERSION_LIST
            ${VER_PROJ_NAME}_PARTIAL_VERSION_LIST_LEN)
        if (${VER_PROJ_NAME}_PARTIAL_VERSION_LIST_LEN GREATER 3)
            list(GET ${VER_PROJ_NAME}_PARTIAL_VERSION_LIST 3 ${VER_PROJ_NAME}_VERSION_TWEAK)
            string(SUBSTRING ${${VER_PROJ_NAME}_VERSION_TWEAK} 1 -1 ${VER_PROJ_NAME}_VERSION_TWEAK)
        endif()

        # Unset the list
        unset(${VER_PROJ_NAME}_PARTIAL_VERSION_LIST)

        # Save version to file (which will be used when Git is not available
        # or VERSION_UPDATE_FROM_GIT is disabled)
        file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/version_generated ${${VER_PROJ_NAME}_VERSION_STRING}
            "*" ${${VER_PROJ_NAME}_VERSION_MAJOR}
            "*" ${${VER_PROJ_NAME}_VERSION_MINOR}
            "*" ${${VER_PROJ_NAME}_VERSION_PATCH}
            "*" ${${VER_PROJ_NAME}_VERSION_TWEAK}
            "*" ${${VER_PROJ_NAME}_VERSION_AHEAD}
            "*" ${${VER_PROJ_NAME}_VERSION_GIT_SHA})

    else()

        # Git not available, get version from file
        file(STRINGS ${CMAKE_CURRENT_BINARY_DIR}/version_generated ${VER_PROJ_NAME}_VERSION_LIST)
        string(REPLACE "*" ";" ${VER_PROJ_NAME}_VERSION_LIST "${${VER_PROJ_NAME}_VERSION_LIST}")
        # Set partial versions
        list(GET ${VER_PROJ_NAME}_VERSION_LIST 0 ${VER_PROJ_NAME}_VERSION_STRING)
        list(GET ${VER_PROJ_NAME}_VERSION_LIST 1 ${VER_PROJ_NAME}_VERSION_MAJOR)
        list(GET ${VER_PROJ_NAME}_VERSION_LIST 2 ${VER_PROJ_NAME}_VERSION_MINOR)
        list(GET ${VER_PROJ_NAME}_VERSION_LIST 3 ${VER_PROJ_NAME}_VERSION_PATCH)
        list(GET ${VER_PROJ_NAME}_VERSION_LIST 4 ${VER_PROJ_NAME}_VERSION_TWEAK)
        list(GET ${VER_PROJ_NAME}_VERSION_LIST 5 ${VER_PROJ_NAME}_VERSION_AHEAD)
        list(GET ${VER_PROJ_NAME}_VERSION_LIST 6 ${VER_PROJ_NAME}_VERSION_GIT_SHA)

    endif()

    # Set full project version string
    if (${VER_PROJ_NAME}_VERSION_AHEAD GREATER 0)
        set(${VER_PROJ_NAME}_VERSION_STRING_FULL
            ${${VER_PROJ_NAME}_VERSION_STRING}+${${VER_PROJ_NAME}_VERSION_AHEAD}.${${VER_PROJ_NAME}_VERSION_GIT_SHA})
    else()
        set(${VER_PROJ_NAME}_VERSION_STRING_FULL
            ${${VER_PROJ_NAME}_VERSION_STRING}.${${VER_PROJ_NAME}_VERSION_GIT_SHA})
    endif()

    # Set project version (without the preceding 'v')
    set(${VER_PROJ_NAME}_VERSION ${${VER_PROJ_NAME}_VERSION_MAJOR}.${${VER_PROJ_NAME}_VERSION_MINOR}.${${VER_PROJ_NAME}_VERSION_PATCH})
    if (${VER_PROJ_NAME}_VERSION_TWEAK)
        set(${VER_PROJ_NAME}_VERSION ${${VER_PROJ_NAME}_VERSION}-${${VER_PROJ_NAME}_VERSION_TWEAK})
    endif()

    target_compile_definitions(${VER_PROJ_NAME} PRIVATE
        VERSION_STRING_FULL="${${VER_PROJ_NAME}_VERSION_STRING_FULL}"
        VERSION_STRING="${${VER_PROJ_NAME}_VERSION_STRING}"
        VERSION_MAJOR=${${VER_PROJ_NAME}_VERSION_MAJOR}
        VERSION_MINOR=${${VER_PROJ_NAME}_VERSION_MINOR}
        VERSION_PATCH=${${VER_PROJ_NAME}_VERSION_PATCH}
        VERSION_TWEAK="${${VER_PROJ_NAME}_VERSION_TWEAK}"
        VERSION_AHEAD="${${VER_PROJ_NAME}_VERSION_AHEAD}"
        VERSION_GIT_SHA="${${VER_PROJ_NAME}_VERSION_GIT_SHA}"
        )
endmacro()


================================================
FILE: contrib/zhCN/D2RMH.ini
================================================
[main]
; D2LOD 路径
; 如果该路径不包含游戏,则D2RMH会尝试从注册表读取安装目录
d2_path = .
; 字体路径
font_file_path = C:\Windows\Fonts\SimHei.ttf
; 文字字体大小,你可以:
; 1. 使用D2R自带的TTF,支持以下字体:
;    所有语言 (尤其是 koKR, ruRU, zhCN):
;      blizzardglobal-v5_81.ttf(默认)
;    zhTW:
;      blizzardglobaltcunicode.ttf(默认), arfangxinshuh7c95b5_eb_t.ttf
;    jaJP:
;      bljap_v8_3.ttf(默认), ik4ll3.ttf, tbgdb_0pp.ttf
;    enUS, deDE, plPL 以及其他拉丁语系语言:
;      formal436bt.ttf(默认), exocetblizzardot-medium.otf, irisl.ttf, kodia.ttf, philosopher-bolditalic.ttf
;    留空会使用默认字体
; 2. 使用TTF(扩展名为.ttf或.ttc), 以及D2/D2R的TBL/DC6字体
;    a. 对于TTF字体,在 `font_file_path` 里放路径
;    b. 对于TBL/DC6字体, 你需要放3个文件: base.dc6, base.tbl, base.pal(将data\global\palette\fechar\pal.dat复制出来改名),
;       并将任何一个文件的路径设置在 `font_file_path` 里, 你还可以在后面用 `|` 分隔追加原字体大小,如果和 `msg_font_size` 不一致
;       举例: font_file_path = font24.dc6|24
font_size = 14
; 消息列表字体大小
msg_font_size = 24
; 可选语言: enUS,deDE,esES,frFR,itIT,koKR,plPL,esMX,jpJP,ptBR,ruRU,zhTW,zhCN
; 留空则使用 D2R 当前语言设置
language =

[ui]
; 帧数限制,正数表示限制帧率,负数表示垂直同步交换间隔:
;   0=无限制并关闭垂直同步
;  -1=开启垂直同步,帧率和显示器刷新率相同
;  -2=开启垂直同步,帧率为显示器刷新率一半,依此类推
; 注意:D2的逻辑是每秒25帧,所以这个值默认设为25
fps = 25
; 0-游戏内小地图关闭时显示
; 1-游戏内小地图打开时显示
; 2-总是显示
show = 0
; 如果不想地图覆盖到底部游戏UI条请设为0
draw_on_game_bar = 0
; 当特定面板打开时隐藏本地图, 0x1FF=所有面板
;  0x01-物品面板
;  0x02-角色面板
;  0x04-技能树面板
;  0x08-系统菜单
;  0x10-任务面板
;  0x20-组队面板
;  0x40-雇佣兵面板
;  0x80-传送站面板
; 0x100-技能选择列表
panel_mask = 0x1FF
; 路线指示画线方式
; 0-显示一条短线和一个点(d2hackmap的方式)
; 1-直接连接到目的地
; 2-通向目的地的行走路径(消耗更多CPU资源)
line_style = 0
; 0-左上
; 1-右上
; 2-正中
; 注意: 如果设置为0或者1请认真阅读`map_area`的说明
position = 2
; 限制显示范围(宽,高),相对于D2R窗口的大小,范围在0.0到1.0之间
; 如果设为0.0则为动态大小,随当前地图大小改变
; 可以只设置一个值,表示宽高都使用这个值
; 如果map_centered为0则整个地图会在指定区域居中显示
map_area = 0.0
; 地图缩放,范围为[1.0,4.0]
; 如果map_area不是动态大小,则超出显示范围的部分会被切去
; 超出D2R窗口的部分也会被切去
scale = 2.0
; 0-静态地图
; 1-保持玩家显示在正中的动态地图
map_centered = 1
; 整个地图层的透明通道(0-255) 0为完全透明 255为完全不透明
; 和其他颜色的透明通道叠加,例如:
;   当颜色为 128,128,128,128(透明通道是128), alpha设为160时,
;   绘制颜色的透明通道就是: 128*160/255=80
alpha = 255
; 相邻地图边界(点阵为单位)
; 可以设为负数表示寻找相邻地图循环深度
;   例如 -1 表示只显示相邻地图
;        -2 还显示相邻地图的相邻地图
; 设为0不显示相邻地图
; 注意:设置较大的值,或设为负数但地图较大时会额外消耗一定的CPU和显存(2048最多大约消耗64M显存)
;       请关闭此选项如果感受到较大的系统性能损失
neighbour_map_bounds = -1
; 可行走部分的颜色 (R,G,B) 每个颜色范围是0-255, 0,0,0,0表示透明
walkable_color = 20,20,20,50
; 地图边缘的颜色 设为0,0,0,0隐藏边缘
edge_color = 128,128,128,240
; 文字颜色
text_color = 255,255,255,180
; 玩家方块的内外侧颜色
player_inner_color = 255,128,128,80
player_outer_color = 51,255,255,180
; 指示线颜色
line_color = 204,204,204,144
; 路点/传送门/箱子/任务/神殿/井的颜色
waypoint_color = 153,153,255,160
portal_color = 255,255,102,160
chest_color = 255,102,102,160
quest_color = 102,102,255,160
shrine_color = 255,51,178,160
well_color = 51,51,255,160
; 怪物/金怪/npc的颜色
monster_color = 255,0,0,128
unique_monster_color = 192,166,130,204
npc_color = 160,160,160,160
; 门的颜色
door_color = 80,255,80,180
; 消息列表背景色
msg_bg_color = 1,1,1,128
; 消息列表位置 (x,y,对齐)
; x和y的范围是[0.0,1.0], 对齐可以是0(左), 1(中), 2(右)
msg_position = 0.95,0.25,2
; 显示文字面板 (每秒更新),留空则不显示
; 支持模板:
;   {newline}/{n} 换行
;   {duration}    当前游戏持续时间,显示为hh:mm:ss
;   {time}        当前系统时间: hh:mm:ss
;   {difficulty}  当前难度
;   {act}         当前ACT ('ACT I' 到 'ACT V')
;   {mapname}     当前地图名
;   {gamename}    当前游戏房间名
;   {gamepass}    当前游戏房间密码
;   {region}      游戏服务器所处区域代码
;   {season}      当前游戏赛季
text_panel_pattern =
;text_panel_pattern = {duration}
;text_panel_pattern = {difficulty}{n}{act}-{mapname}{n}{time}{n}{duration}
;text_panel_pattern = {gamename}{n}{gamepass}{n}{region} {season}{n}{difficulty}{n}{act}-{mapname}{n}{time}{n}{duration}

; 面板位置, 同 `msg_position`
text_panel_position = 0.93,0.015,2

; 显示玩家名
show_player_names = 1
; 显示NPC名
show_npc_name = 1
; 显示附近物件(目前显示神殿和井)
show_objects = 1
; 地图上物件(门除外)的最小尺寸(按点阵)
object_size_minimal = 6
; 显示附近的物品掉落,可以修改D2RMH_item.ini设定自己的掉落过滤表
show_items = 1
; 显示附近的怪物
;  0 - 不显示
;  1 - 只有NPC/金怪/Boss会显示
;  2 - 普通和仆从怪也显示
show_monsters = 2
; 显示怪物名,怪物需要先在`show_monsters`中设置显示
;  0 - 不显示
;  1 - 只有NPC/金怪/Boss会显示
;  2 - 普通和仆从怪也显示
show_monster_names = 1
; 显示怪物强化类型,包括光环,更多配置请看[enchants]部分,怪物需要先在`show_monsters`中设置显示
;  0 - 不显示
;  1 - 只有NPC/金怪/Boss会显示
;  2 - 普通和仆从怪也显示
show_monster_enchants = 1
; 显示怪物的免疫,更多配置请看[enchants]部分,怪物需要先在`show_monsters`中设置显示
;  0 - 不显示
;  1 - 只有NPC/金怪/Boss会显示
;  2 - 普通和仆从怪也显示
show_monster_immunities = 2

[enchants]
; 各种强化对应显示的字符串
; 字符串可以用颜色来标识,写成'{n}'的形式, n和d2hackmap中一致:
;  0-文本颜色 1-红 2-绿 3-蓝 4-金 5-灰 6-黑 7-金2
;  8-橙 9-黄 10-绿2 11-紫 12-绿3 13~15-白
; 如果不设置默认为白色
extra_strong = 強壯
extra_fast = 快速
cursed = {2}詛咒
magic_resistant = 魔抗
fire_enchanted = {1}火強
ligntning_enchanted = {9}電強
cold_enchanted = {3}冰強
mana_burn = {3}法燃
teleportation = 傳送
spectral_hit = 幽靈
stone_skin = {4}石膚
multiple_shots = {12}多重
fanatic = {11}癲狂
berserker = {4}狂暴
; 光环
might_aura = {4}力量
holyFire_aura = {1}聖火
blessedAim_aura = 瞄準
holyFreeze_aura = {3}聖冰
holyShock_aura = {9}聖雷
conviction_aura = {11}信念
fanaticism_aura = {5}狂熱
; 免疫
physical_immunity = {4}物
magic_immunity = {8}魔
fire_immunity = {1}火
lightning_immunity = {9}電
cold_immunity = {3}冰
poison_immunity = {2}毒

[sound]
; 其他功能要用的声音文件设置
; 支持WAVE文件,不以为.wav为扩展名的文件名将被视为系统事件声音
; 常用系统事件声音:
;   SystemAsterisk, SystemDefault, SystemExclamation, SystemHand
; 可以查看注册表项 'HKEY_CURRENT_USER\AppEvents\Schemes\Apps\.Default' 获取其他事件声音名
sound[1] = SystemDefault
sound[2] = SystemAsterisk
; sound[3] = Beep.wav


================================================
FILE: contrib/zhCN/README.md
================================================
**README in other languages: [English](../../README.md)**

# D2RMH
Diablo II Resurrected 开图工具

# 免责声明
**D2RMH只从D2R读取内存,并没有注入代码、使用代码钩子以及写入内存,  
但并不保证完全不会被封号,使用中出现任何问题概不负责。**  

# 版本更新
请看 [ChangeLog](../../doc/ChangeLog.md)

# 需求依赖
* 本工具需要暗黑2 1.11, 1.11b, 1.12, 1.13c或1.13d版本,你可以[由此](https://archive.org/details/diablo-ii-1.13c-minimal.-7z)下载最精简版的1.13c

# 使用
0. 病毒/木马检测警告:
  * Windows Defender容易误报,建议禁用或者加入白名单
  * 虽然D2RMH可以通过大多数杀毒软件的检测,但也容易被误报,如果担心预编译文件有问题,那么可以参考下面的`如何编译`部分自行编译
1. 从 `Releases` 里下载最新发布版,或从 `Actions` 里下载最新的快照编译版(你需要登录GitHub) 
2. 修改 D2RMH.ini(中文用户可以使用contrib/D2RMH_CN.ini的内容作为默认设置), 设置 `d2_path` 为你的D2 1.13c目录,也可以直接把`D2MRH.exe`和所有`*.ini`放到D2 1.13c目录里去
3. 运行 D2RMH.exe

# Screenshots
![Screenshot 1](screenshots/screenshot_0.png)
![Screenshot 2](screenshots/screenshot_1.png)
![Screenshot 3](screenshots/screenshot_2.png)

# 插件系统
* 插件加载自 `plugins` 目录里的所有 `.lua` 文件
* 如果想自己写插件请阅读 [文档](../../doc/Plugin.md)

# TODO
请看 [TODO](../../doc/TODO.md)

# 如何编译
## 快速指引
* 安装 [cmake](https://www.cmake.org/) 并将 `cmake\bin` 路径添加到你的的环境变量 `PATH` 中,使得命令行下可以直接输入 `cmake` 使用
* 运行 `build_msvc2019.bat`, `build_msvc2022.bat`, `build_msys2_clang.bat` 或 `build_msys2_mingw.bat` 调用对应的编译器进行编译  
  注意: 你需要安装对应的编译器,如果是msys2编译,请参照下面的说明安装必要组件
## 详细教程
### MinGW GCC
* 安装MSYS2(https://www.msys2.org), 打开MSYS2.exe,输入`pacman -Syu --noconfirm && pacman -S --noconfirm --needed make git mingw-w64-i686-toolchain mingw-w64-i686-cmake mingw-w64-ucrt-x86_64-toolchain mingw-w64-ucrt-x86_64-cmake`安装必须的依赖组件
* 编译 D2RMH(64位):
  * 用 ucrt64.exe 打开命令行
  * 克隆D2RMH的源代码: `git clone https://github.com/soarqin/D2RMH`
  * 输入 `cd D2RMH && cmake -Bbuild -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DUSE_STATIC_CRT=ON`
  * 然后 `make -Cbuild D2RMH` 就能在 `build/bin` 里生成编译好的exe
* 编译 d2mapapi-piped(32位):
  * 用 mingw32.exe 打开命令行
  * 进入 D2RMH 所在目录
  * 输入 `cmake -Bbuild_d2mapapi -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DUSE_STATIC_CRT=ON d2mapapi`
  * 然后 `make -Cbuild_d2mapapi d2mapapi-piped` 就能在 `build/bin` 里生成编译好的exe
### MSYS2 Clang
* 和 MinGW GCC 大致相同,除了以下改变:
  * `mingw-w64-i686-toolchain`->`mingw-w64-clang-i686-toolchain`
  * `mingw-w64-i686-cmake`->`mingw-w64-clang-i686-cmake`
  * `mingw-w64-ucrt-x86_64-toolchain`->`mingw-w64-clang-x86_64-toolchain`
  * `mingw-w64-ucrt-x86_64-cmake`->`mingw-w64-clang-x86_64-cmake`
  * `ucrt64.exe`->`clang64.exe`
  * `mingw32.exe`->`clang32.exe`
### Microsoft Visual Studio 2019/2022
* 安装Visual Studio 2019或2022社区版(或者你有专业/企业版也可以)
* 解压下载的源代码文件,或者用git来clone仓库: `git clone https://github.com/soarqin/D2RMH` 注意: 你需要 [Git for windows](https://git-scm.com/download/win)
* 编译 D2RMH(64位):
  * (Visual Studio 2019) 输入 `cmake -Bbuild -G "Visual Studio 16 2019" -A x64 -DUSE_STATIC_CRT=ON`  
    (Visual Studio 2022) 输入 `cmake -Bbuild -G "Visual Studio 17 2022" -A x64 -DUSE_STATIC_CRT=ON`
  * 然后你可以选择:
    * 输入 `cmake --build build --config Release --target D2RMH`
    * 打开 `build\D2RMH.sln` 编译目标 `D2RMH`
  * 编译好的exe在 `build\bin` 目录
* 编译 d2mapapi-piped(32位):
  * (Visual Studio 2019) 输入 `cmake -Bbuild_d2mapapi -G "Visual Studio 16 2019" -A Win32 -DUSE_STATIC_CRT=ON d2mapapi`  
    (Visual Studio 2022) 输入 `cmake -Bbuild_d2mapapi -G "Visual Studio 17 2022" -A Win32 -DUSE_STATIC_CRT=ON d2mapapi`
  * 然后你可以选择:
    * 打开 `cmake --build build_d2mapapi --config Release --target d2mapapi_piped`
    * 打开 `build_d2mapapi\d2mapapi.sln` 编译目标 `d2mapapi_piped`
  * 编译好的exe在 `build_d2mapapi\bin` 目录

# 鸣谢
* [d2mapapi_mod](https://github.com/soarqin/d2mapapi_mod) 修改自 [d2mapapi](https://github.com/jcageman/d2mapapi).
* 想法以及内存地址来自 [MapAssist](https://github.com/misterokaygo/MapAssist).
* [Handmade Math](https://github.com/HandmadeMath/Handmade-Math) 处理向量和矩阵运算
* [glad](https://glad.dav1d.de) 加载 OpenGL(Core)/WGL 函数
* [inih](https://github.com/benhoyt/inih) 读取 ini 文件
* [JSON for Modern C++](https://github.com/nlohmann/json) 读取 JSON 文件
* [CascLib](https://github.com/ladislav-zezula/CascLib) 从D2R读取Casc存储
* [stb](https://github.com/nothings/stb), 使用了stb_truetype和stb_rect_pack


================================================
FILE: contrib/zhCN/plugins/chicken_life.lua
================================================
local text = create_text_list("default")

local chicken_life = function()
    local player = get_player()
    if player and player.map ~= 1 and player.map ~= 40 and player.map ~= 75 and player.map ~= 103 and player.map ~= 109 then
        if player.stats[7] < player.stats[8] * 0.3 then
            kill_process()
        end
    end
end

function chicken_life_toggle(on)
    if on then
        text:add('生命安全线保护功能已开启  开关热键: \'Ctrl+/\'', 5000, -1)
    else
        text:add('生命安全线保护功能已关闭  开关热键: \'Ctrl+/\'', 5000, -1)
    end
end

register_plugin("Ctrl+/", false, 250, chicken_life, chicken_life_toggle)


================================================
FILE: contrib/zhCN/plugins/town_portal_check.lua
================================================
local text = create_text_list("default")

local town_portal_check = function()
    -- game fully loaded?
    if not get_skill(0) then
        return
    end

    local quantity
    local portal_book = get_skill(220)
    if portal_book then
        quantity = portalbook.quantity
    else
        quantity = 0
    end
    if quantity < 3 then
        text:add(string.format("\x0B警告!回城卷轴数量不足: %d", quantity), 1500, 0)
    end
end
register_plugin(1000, town_portal_check)


================================================
FILE: copy_dist.bat
================================================
@echo off

cmake -E copy_if_different bin\D2RMH.ini bin\D2RMH_gamedata.ini bin\D2RMH_item.ini build\%BUILD_DIR%\dist\
cmake -E copy_directory bin\plugins build\%BUILD_DIR%\dist\plugins
cmake -E copy_directory doc build\%BUILD_DIR%\dist\doc
cmake -E copy_if_different README.md LICENSE build\%BUILD_DIR%\dist\
cmake -E copy_if_different doc\LICENSE.lua54 build\%BUILD_DIR%\dist\doc\
cmake -E copy_if_different deps\CascLib\LICENSE build\%BUILD_DIR%\dist\doc\LICENSE.CascLib
cmake -E copy_if_different deps\inih\LICENSE.txt build\%BUILD_DIR%\dist\doc\LICENSE.inih
cmake -E copy_if_different deps\sol3\LICENSE.txt build\%BUILD_DIR%\dist\doc\LICENSE.sol3
cmake -E copy_if_different d2mapapi\LICENSE build\%BUILD_DIR%\dist\doc\LICENSE.d2mapapi_mod
cmake -E copy_if_different d2mapapi\json\LICENSE.MIT build\%BUILD_DIR%\dist\doc\LICENSE.nlohmann_json

pushd build\%BUILD_DIR%\dist >NUL
cmake -E tar cf D2RMH-snapshot.zip --format=zip D2RMH.exe d2mapapi_piped.exe D2RMH.ini D2RMH_gamedata.ini D2RMH_item.ini README.md LICENSE doc plugins
popd >NUL


================================================
FILE: d2mapapi/.gitignore
================================================
# Prerequisites
*.d

# Compiled Object files
*.slo
*.lo
*.o
*.obj

# Precompiled Headers
*.gch
*.pch

# Compiled Dynamic libraries
*.so
*.dylib
*.dll

# Fortran module files
*.mod
*.smod

# Compiled Static libraries
*.lai
*.la
*.a
*.lib

# Executables
*.exe
*.out
*.app


================================================
FILE: d2mapapi/.gitrepo
================================================
; DO NOT EDIT (unless you know what you are doing)
;
; This subdirectory is a git "subrepo", and this file is maintained by the
; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme
;
[subrepo]
	remote = git@github.com:soarqin/d2mapapi_mod.git
	branch = master
	commit = f61d05244f323409aa48b326033639326d7c285c
	parent = 5ae01c80237b531a6a17de30e7c55907f6d30339
	method = rebase
	cmdver = 0.4.3


================================================
FILE: d2mapapi/CMakeLists.txt
================================================
cmake_minimum_required(VERSION 3.13)

project(d2mapapi VERSION 1.3.0)

if(MSVC)
    set(CMAKE_CXX_STANDARD 20)
else()
    set(CMAKE_CXX_STANDARD 17)
endif()

if ("${CMAKE_SOURCE_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}")
    list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
    include(CustomCompilerOptions)
    fix_compile_flags()
    fix_release_flags()
    add_static_runtime_option()
endif()

if(CMAKE_SIZEOF_VOID_P EQUAL 4)
    add_subdirectory(simphttp)
    add_library(d2mapapi STATIC EXCLUDE_FROM_ALL
        crc32.h
        collisionmap.cpp collisionmap.h
        mapdata.cpp mapdata.h
        pathfinder.cpp pathfinder.h
        d2map.cpp d2map.h
        d2ptrs.h d2structs.h
        offset.cpp offset.cpp
        session.cpp session.h)
    target_include_directories(d2mapapi PUBLIC . PRIVATE json)
    set_target_properties(d2mapapi PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)

    add_executable(d2mapapi_gen_image EXCLUDE_FROM_ALL genimage.cpp)
    target_compile_definitions(d2mapapi_gen_image PRIVATE D2MAPAPI_VERSION="${PROJECT_VERSION}")
    target_link_libraries(d2mapapi_gen_image d2mapapi shlwapi)
    if(MSVC)
        target_link_options(d2mapapi_gen_image PRIVATE /ENTRY:wmainCRTStartup)
    else()
        target_link_options(d2mapapi_gen_image PRIVATE -municode)
    endif()
    set_target_properties(d2mapapi_gen_image PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

    add_executable(d2mapapi_httpd EXCLUDE_FROM_ALL httpd.cpp)
    target_compile_definitions(d2mapapi_httpd PRIVATE D2MAPAPI_VERSION="${PROJECT_VERSION}")
    target_link_libraries(d2mapapi_httpd d2mapapi simphttp)
    if(MSVC)
        target_link_options(d2mapapi_httpd PRIVATE /ENTRY:wmainCRTStartup)
    else()
        target_link_options(d2mapapi_httpd PRIVATE -municode)
    endif()
    set_target_properties(d2mapapi_httpd PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

    add_executable(d2mapapi_piped WIN32 EXCLUDE_FROM_ALL piped.cpp)
    target_compile_definitions(d2mapapi_piped PRIVATE D2MAPAPI_VERSION="${PROJECT_VERSION}")
    target_include_directories(d2mapapi_piped PRIVATE json)
    target_link_libraries(d2mapapi_piped d2mapapi)
    if(MSVC)
        target_link_options(d2mapapi_piped PRIVATE /ENTRY:wmainCRTStartup)
    else()
        target_link_options(d2mapapi_piped PRIVATE -municode)
    endif()
    set_target_properties(d2mapapi_piped PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
endif()

add_library(d2mapapi_pipehost STATIC EXCLUDE_FROM_ALL
    collisionmap.cpp collisionmap.h
    pathfinder.cpp pathfinder.h
    pipehost.cpp pipehost.h)
target_include_directories(d2mapapi_pipehost PUBLIC . PRIVATE json)
set_target_properties(d2mapapi_pipehost PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)

# this is a test program for d2mapapi_pipehost functions
add_executable(d2mapapi_host EXCLUDE_FROM_ALL host.cpp)
target_link_libraries(d2mapapi_host d2mapapi_pipehost)
set_target_properties(d2mapapi_host PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)


================================================
FILE: d2mapapi/LICENSE
================================================
MIT License

Copyright (c) 2020 jcageman
Copyright (c) 2021-2022 Soar Qin

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: d2mapapi/README.md
================================================
# d2mapapi_mod
**d2mapapi mod, original from [jcageman/d2mapapi](https://github.com/jcageman/d2mapapi)**

# Projects
* `d2mapapi`: basic library for generating map data
* `d2mapapi_gen_image`: generate map into image files (support PNG, BMP, TGA and JPG)
* `d2mapapi_httpd`: httpd server, depends on `d2mapapi`
* `d2mapapi_piped`: pipe query server, depends on `d2mapapi`
* `d2mapapi_pipehost`: pipe querying library for communicating with `d2mapapi_piped`
* `d2mapapi_host`: example and test project for do pipe query using `d2mapapi_pipehost`

# Usage for `d2mapapi_gen_image`
* command line: `d2mapapi_gen_image [d2_path] <seed> <difficulty> <map> <image filename>`
  * `d2_path` is an optional parameter, which set legacy Diablo II installation path, `d2mapapi_httpd` will search registry for installation path if this parameter is absent or does not point to a correct installed game path.
    * supported Diablo II Legacy client version: `1.11`, `1.11b`, `1.12`, `1.13c`, `1.13d`
  * `seed`, `difficulty`, `map`: d2 map seed, game difficualty and map area id
  * `image filename`: image filename, format is determined by file extension, supported: `.png`, `.tga`, `.bmp` and `.jpg`

# Usage for `d2mapapi_httpd`
* command line: `d2mapapi_httpd [d2_path]`
  * `d2_path` is an optional parameter, which set legacy Diablo II installation path, `d2mapapi_httpd` will search registry for installation path if this parameter is absent or does not point to a correct installed game path.
    * supported Diablo II Legacy client version: `1.11`, `1.11b`, `1.12`, `1.13c`, `1.13d`
* http server is listen on port `8000`
* http url is in RESTful form:
  * `http://localhost:8000/{seed}/{difficulty}/{map}/{indentation}`
    * `{seed}`: d2 map seed
    * `{difficulty}`: game difficulty
      * 0: normal
      * 1: nightmare
      * 2: hell
    * `{map}`: map area id
    * `{indentation}`: optional field, JSON indentation spaces. JSON will be compactly encoded if this is not set
* returns the JSON data described below

# Usage for `d2mapapi_piped`
* command line: `d2mapapi_httpd [d2_path]`
  * `d2_path` is an optional parameter, which set legacy Diablo II installation path, `d2mapapi_httpd` will search registry for installation path if this parameter is absent or does not point to a correct installed game path.
    * supported Diablo II Legacy client version: `1.11`, `1.11b`, `1.12`, `1.13c`, `1.13d`
* use `PipedChildProcess::start()` to run the child process, you can pass `d2_path` as its second parameter, or pass `nullptr` for reading from registry.
* use `PipedChildProcess::queryMapRaw()` to get the encoded JSON(described below) for map data.
* use `PipedChildProcess::queryMap()` to get the decoded map data.
  * Note: you should delete the returned `CollisionMap*` pointer while it is no more needed.

# JSON structure for map data
* encoded JSON data are generated by `d2mapapi::CollisionMap::encode()` and returned by `d2mapapi_httpd` and `d2mapapi_piped`
* use `d2mapapi::CollisionMap::CollisionMap(const std::string&)` to build map data from encoded JSON
* ```
  {
    # map id
    "id": 1,
    # map offset in whole act
    "offset": ["x": 5520, "y": 5880],
    # map size
    "size": ["width": 280, "height": 200],
    # crop area of map data
    "crop": ["x0": 0, "x1": 280, "y0": 0, "y1": 200],
    # mapData is an encoded array with area in [x0, y0]-[x1, y1]
    # check description below to see how are map data encoded
    "mapData": [1,5,1,-1,
                2,3,2,-1,
                1,5,1,-1],
    # map exits
    "exits": {
      # exit to map id 2
      "2": {
        # this is not a portal (so that you can walk between the map areas)
        "isPortal": false,
        # exit offsets in list, sometimes there can be multiple exits to another map area
        # note: the offsets are not always correct while `isPortal` is false, because they are calculated by an inaccurate algorithm
        "offsets": [{"x": 5672, "y": 5880}]
      }
    },
    # npcs on map
    "npcs": {
      # npc id is 147, with offset list so that there can be multiple npcs in the same id
      "147": [{"x": 5615, "y": 5967}]
    },
    # objects on map
    "objects": {
      # object id is 147, with offset list so that there can be multiple objects in the same id
      "119": [{"x": 5634, "y": 5889}]
    }
  }
  ```
* map data are encoded using a simple run length encoding to save memory space  
  -1 ends of a row  
  Given this small map:  
  ```
  [1,5,1,-1,
   2,3,2,-1,
   1,5,1,-1]
  ```

  Generates the following map where `X` is collision and `.` is open space
  ```
  X.....X
  XX...XX
  X.....X
  ```

# Build
* Just use [cmake](https://cmake.org) to build
  * Note: `d2mapapi`, `d2mapapi_httpd`, `d2mapapi_piped` and `d2mapapi_gen_image` can only be compiled in 32-bit.

# Credits
* Core functions modified from [d2mapapi](https://github.com/jcageman/d2mapapi).
* [JSON for Modern C++](https://github.com/nlohmann/json) for processing JSON files.
* [libuv](https://github.com/libuv/libuv) and [llhttp](https://github.com/nodejs/llhttp), for httpd server.
* [stb](https://github.com/nothings/stb), stb_image_write is used to write to image files.


================================================
FILE: d2mapapi/cmake/CustomCompilerOptions.cmake
================================================
macro(fix_compile_flags)
    if(MSVC)
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /utf-8")
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8")
    endif()
endmacro()

macro(fix_release_flags)
    if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
        set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -s -flto")
        set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL} -s -flto")
        set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} -s -flto")
        set(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "${CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL} -s -flto")
        set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -flto")
        set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -flto")
    endif()
    if(MSVC)
        add_compile_options(
            $<$<CONFIG:Release>:/GL>
            $<$<CONFIG:MinSizeRel>:/GL>
        )
        add_link_options(
            $<$<CONFIG:Release>:/LTCG>
            $<$<CONFIG:MinSizeRel>:/LTCG>
        )
    endif()
endmacro()

macro(add_static_runtime_option)
    option(USE_STATIC_CRT "Use static C runtime" OFF)

    if(USE_STATIC_CRT)
        if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
            set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static -static-libgcc -static-libstdc++")
            set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -static -static-libgcc -static-libstdc++")
        elseif(MSVC)
            set(CompilerFlags
                CMAKE_CXX_FLAGS
                CMAKE_CXX_FLAGS_DEBUG
                CMAKE_CXX_FLAGS_RELEASE
                CMAKE_CXX_FLAGS_MINSIZEREL
                CMAKE_CXX_FLAGS_RELWITHDEBINFO
                CMAKE_C_FLAGS
                CMAKE_C_FLAGS_DEBUG
                CMAKE_C_FLAGS_RELEASE
                CMAKE_C_FLAGS_MINSIZEREL
                CMAKE_C_FLAGS_RELWITHDEBINFO
                )
            foreach(CompilerFlag ${CompilerFlags})
                string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
                set(${CompilerFlag} "${${CompilerFlag}}" CACHE STRING "msvc compiler flags" FORCE)
            endforeach()
            add_compile_options(
                $<$<CONFIG:>:/MT>
                $<$<CONFIG:Debug>:/MTd>
                $<$<CONFIG:Release>:/MT>
                $<$<CONFIG:MinSizeRel>:/MT>
                $<$<CONFIG:RelWithDebInfo>:/MT>
            )
        endif()
    endif()
endmacro()


================================================
FILE: d2mapapi/collisionmap.cpp
================================================
#include "collisionmap.h"

#include <json.hpp>

#include <sstream>

namespace d2mapapi {

CollisionMap::CollisionMap(std::string_view str) {
    decode(str);
}

NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Point, x, y)
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Size, width, height)
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Rect, x0, y0, x1, y1)
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Exit, offsets, isPortal)
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(CollisionMap, id, offset, size, crop, mapData, exits, npcs, objects, pathData)

template<typename T>
void to_json(nlohmann::json &j, const std::map<uint32_t, T> &objs) {
    for (auto &p: objs) {
        j[std::to_string(p.first)] = p.second;
    }
}

template<typename T>
void from_json(const nlohmann::json &j, std::map<uint32_t, T> &objs) {
    for (auto &[key, value]: j.items()) {
        nlohmann::adl_serializer<T>::from_json(value, objs[uint32_t(strtoul(key.c_str(), nullptr, 0))]);
    }
}

std::string CollisionMap::encode(bool encPathData, int indentation) const {
    if (!built) { return {}; }
    nlohmann::json j = *this;
    if (!encPathData) { j["pathData"].clear(); }
    return j.dump(indentation > 0 ? indentation : -1);
}

void CollisionMap::decode(std::string_view str) {
    auto j = nlohmann::json::parse(str, nullptr, false);
    if (j.empty()) {
        built = false;
        errorString = "Wrong input.";
        return;
    }
    auto ite = j.find("error");
    if (ite != j.end()) {
        built = false;
        errorString = ite->get<std::string>();
        return;
    }

    try {
        from_json(j, *this);
    } catch (const std::exception &e) {
        built = false;
        errorString = e.what();
        return;
    }
    built = true;
    errorString.clear();
    if (pathData.empty()) { return; }
    auto sz = pathData.size();
    size_t currSize = 0;
    path.clear();
    path.reserve(((crop.x1 - crop.x0) / 5) * ((crop.y1 - crop.y0) / 5));
    for (size_t i = 1; i < sz; i += 2) {
        currSize += pathData[i];
        path.resize(currSize, pathData[i - 1]);
    }
}

}


================================================
FILE: d2mapapi/collisionmap.h
================================================
#pragma once

#include <map>
#include <vector>
#include <string>
#include <string_view>

namespace d2mapapi {

struct Point {
    int x = 0;
    int y = 0;
};

struct Size {
    int width = 0;
    int height = 0;
};

struct Rect {
    int x0, y0, x1, y1;
};

struct Exit {
    std::vector<Point> offsets;
    bool isPortal = false;
};

class CollisionMap {
public:
    explicit CollisionMap(unsigned int areaId): id(areaId) {}
    explicit CollisionMap(std::string_view str);
    virtual ~CollisionMap() = default;

    [[nodiscard]] std::string encode(bool encPathData = false, int indentation = 0) const;
    void decode(std::string_view str);

    template<typename T>
    inline bool extractCellData(T *output, int width, int height, int originX, int originY, T nonwalkableVal, T walkableVal, T edgeVal = T()) const {
        auto w = std::max(crop.x1 - crop.x0, 0);
        auto h = std::max(crop.y1 - crop.y0, 0);
        if (originX + w > width || originY + h > height) {
            return false;
        }
        int x = 0, y = 0;
        int index = originY * width + originX;
        bool walkable = false;
        bool hasEdge = edgeVal != T();
        for (int v: mapData) {
            if (v < 0) {
                if (++y >= h) { break; }
                x = 0;
                index = (originY + y) * width + originX;
                walkable = false;
                continue;
            }
            v = std::min(int(v), w - x);
            if (!walkable) {
                std::fill_n(output + index, v, nonwalkableVal);
                if (hasEdge && y > 0) {
                    T *ptr = output + index - width;
                    for (int z = v; z; z--, ptr++) {
                        if (*ptr == walkableVal) {
                            *ptr = edgeVal;
                        }
                    }
                }
                index += v;
            } else {
                if (hasEdge && y + 1 == crop.y1 && crop.y1 < height) {
                    std::fill_n(output + index, v, edgeVal);
                    index += v;
                } else {
                    int z = v;
                    if (hasEdge) {
                        *(output + index) = x > 0 ? edgeVal : walkableVal;
                        index++;
                        z -= 2;
                    }
                    if (z >= 0) {
                        if (hasEdge && y > 0) {
                            for (; z; z--) {
                                *(output + index) = *(output + index - width) == nonwalkableVal ? edgeVal : walkableVal;
                                index++;
                            }
                        } else {
                            std::fill_n(output + index, z, walkableVal);
                            index += z;
                        }
                        if (hasEdge) {
                            *(output + index) = x + v < w ? edgeVal : walkableVal;
                            index++;
                        }
                    }
                }
            }
            x += v;
            walkable = !walkable;
        }
        return true;
    }

    bool built = false;
    std::string errorString;

    unsigned int id = 0;

    Point offset = {0, 0};
    Size size = {0, 0};

    /* Collission maps are cropped in rect [crop.x0, crop.y0] to [crop.x1, crop.y1] relative to [offset.x, offset.y] */
    Rect crop = {-1, -1, -1, -1};

    /* Collision maps are encoded using a simple run length encoding to save memory space
     *  -1 ends of a row
     * Given this small map:
     *  [1,5,1,-1,
     *   2,3,2,-1,
     *   1,5,1,-1]
     * It would generate the following map where `X` is collision and `.` is open space
     *   X.....X
     *   XX...XX
     *   X.....X
     */
    std::vector<int16_t> mapData;
    std::map<uint32_t, Exit> exits;
    std::map<uint32_t, std::vector<Point>> npcs;
    std::map<uint32_t, std::vector<Point>> objects;

    std::vector<uint8_t> path;
    std::vector<uint8_t> pathData;
};

}


================================================
FILE: d2mapapi/crc32.h
================================================
#include <cstdint>
#include <cstddef>

namespace crc {

// Small implementation of std::array, needed until constexpr
// is added to the function 'reference operator[](size_type)'
template <typename T, std::size_t N>
struct array {
    T m_data[N];

    using value_type = T;
    using reference = value_type &;
    using const_reference = const value_type &;
    using size_type = std::size_t;

    // This is NOT constexpr in std::array until C++17
    constexpr reference operator[](size_type i) noexcept {
        return m_data[i];
    }

    constexpr const_reference operator[](size_type i) const noexcept {
        return m_data[i];
    }

    constexpr size_type size() const noexcept {
        return N;
    }
};


// Generates CRC-32 table, algorithm based from this link:
// http://www.hackersdelight.org/hdcodetxt/crc.c.txt
constexpr auto gen_crc32_table() {
    constexpr auto num_bytes = 256;
    constexpr auto num_iterations = 8;
    constexpr auto polynomial = 0xEDB88320;

    auto crc32_table = array<uint32_t, num_bytes>{};

    for (auto byte = 0u; byte < num_bytes; ++byte) {
        auto crc = byte;

        for (auto i = 0; i < num_iterations; ++i) {
            auto mask = -(crc & 1);
            crc = (crc >> 1) ^ (polynomial & mask);
        }

        crc32_table[byte] = crc;
    }

    return crc32_table;
}

// Stores CRC-32 table and softly validates it.
static constexpr auto crc32_table = gen_crc32_table();
static_assert(
    crc32_table.size() == 256 &&
        crc32_table[1] == 0x77073096 &&
        crc32_table[255] == 0x2D02EF8D,
    "gen_crc32_table generated unexpected result."
);

constexpr auto crc32(const void *in, std::size_t sz) {
    const auto *data = static_cast<const uint8_t*>(in);
    auto crc = 0xFFFFFFFFu;
    for (size_t i = 0; i < sz; ++i) {
        crc = crc32_table[(crc ^ data[i]) & 0xFFu] ^ (crc >> 8);
    }

    return ~crc;
}

}


================================================
FILE: d2mapapi/d2map.cpp
================================================
#include "d2map.h"

#include "d2ptrs.h"
#include "offset.h"

#include <iostream>
#include <windows.h>

namespace d2mapapi {

d2client_struct D2Client;

const char *d2Init(const wchar_t *dir) {
    wchar_t szPath[MAX_PATH] = {0};
    GetCurrentDirectoryW(MAX_PATH, szPath);
    if (dir[0] != 0 && dir[lstrlenW(dir) - 1] != '\\') {
        wchar_t dira[MAX_PATH];
        lstrcpyW(dira, dir);
        lstrcatW(dira, L"\\");
        SetCurrentDirectoryW(dira);
    } else {
        SetCurrentDirectoryW(dir);
    }

    memset(&D2Client, 0, sizeof(d2client_struct));
    if (!defineOffsets()) {
        return "Diablo II Legacy: Failed to load DLLs!";
    }
    auto version = getD2Version();

    *p_STORM_MPQHashTable = 0;
    if (version < D2_113c) {
        D2Client.u112.dwInit = 1;
        D2Client.u112.fpInit = (uint32_t)D2ClientInterface;
    } else {
        D2Client.u113.dwInit = 1;
        D2Client.u113.fpInit = (uint32_t)D2ClientInterface;
    }

    FOG_10021("D2");
    FOG_10101(1, 0);
    FOG_10089(1);

    if (!FOG_10218()) {
        return "Diablo II Legacy: Initialize Failed!";
    }

    if (!D2WIN_10086() || !D2WIN_10005(0, 0, 0, &D2Client)) {
        return "Diablo II Legacy: Couldn't load MPQ files.\nPlease make sure you have a full install of Diablo II and copy the D2XMUSIC.MPQ and D2XVIDEO.MPQ from the Expansion CD";
    }

    D2LANG_Init(0, "ENG", 0);

    if (!D2COMMON_InitDataTables(0, 0, 0)) {
        return "Diablo II Legacy: Couldn't initialize sqptDataTable!";
    }

    D2CLIENT_InitGameMisc();

    SetCurrentDirectoryW(szPath);
    return nullptr;
}

Level *__fastcall getLevel(Act *act, uint32_t levelno) {
    auto d2Ver = getD2Version();
    for (Level *pLevel = act->pMisc(d2Ver)->pLevelFirst(d2Ver); pLevel; pLevel = pLevel->pNextLevel(d2Ver))
        if (pLevel->dwLevelNo(d2Ver) == levelno)
            return (Level*)pLevel;
    return D2COMMON_GetLevel(act->pMisc(d2Ver), levelno);
}

#if defined(_MSC_VER)
void __declspec(naked) D2CLIENT_InitGameMisc(void)
{
    __asm
    {
        PUSH ECX
        PUSH EBP
        PUSH ESI
        PUSH EDI
        JMP D2CLIENT_InitGameMisc_I
        RETN
    }
}
#else
void __attribute__((naked)) D2CLIENT_InitGameMisc() {
    asm volatile (
    "push %%ecx\n"
    "push %%ebp\n"
    "push %%esi\n"
    "push %%edi\n"
    "jmp *%0\n"
    "ret"
    :
    : "r"(D2CLIENT_InitGameMisc_I)
    );
}
#endif

uint32_t D2ClientInterface() {
    if (getD2Version() < D2_113c) {
        return D2Client.u112.dwInit;
    }
    return D2Client.u113.dwInit;
}

}


================================================
FILE: d2mapapi/d2map.h
================================================
#pragma once

#include "d2structs.h"

namespace d2mapapi {

#define ArraySize(x) (sizeof(x) / sizeof(x[0]))

/* return NULL if no error,
 * otherwise return error message */
const char *d2Init(const wchar_t *dir);

Level *__fastcall getLevel(Act *act, uint32_t levelno);
void D2CLIENT_InitGameMisc();
uint32_t D2ClientInterface();

}


================================================
FILE: d2mapapi/d2ptrs.h
================================================
#pragma once

#include "d2structs.h"

#if defined(_DEFINE_VARS)
#define D2EXTERN
#else
#define D2EXTERN extern
#endif

namespace d2mapapi {

D2EXTERN uint32_t *p_STORM_MPQHashTable;
D2EXTERN uint32_t D2CLIENT_LoadAct_1;
D2EXTERN uint32_t D2CLIENT_LoadAct_2;
D2EXTERN void (__stdcall* D2CLIENT_InitGameMisc_I)(uint32_t Dummy1, uint32_t Dummy2, uint32_t Dummy3);
D2EXTERN void (__stdcall* D2COMMON_AddRoomData)(Act * ptAct, int LevelId, int Xpos, int Ypos, Room1 *pRoom);
D2EXTERN void (__stdcall* D2COMMON_RemoveRoomData)(Act * ptAct, int LevelId, int Xpos, int Ypos, Room1 *pRoom);
D2EXTERN Level * (__fastcall* D2COMMON_GetLevel)(ActMisc * pMisc, uint32_t dwLevelNo);

D2EXTERN void (__stdcall* D2COMMON_InitLevel)(Level * pLevel);
D2EXTERN Act* (__stdcall* D2COMMON_LoadAct)(uint32_t ActNumber, uint32_t Seed, uint32_t Unk, void *pGame, uint32_t Difficulty, void *pMempool, uint32_t TownLevelId, uint32_t Func_1, uint32_t Func_2);
D2EXTERN void (__stdcall* D2COMMON_UnloadAct)(Act * pAct);

D2EXTERN void (__fastcall* FOG_10021)(const char *szProg);
D2EXTERN uint32_t (__fastcall* FOG_10101)(uint32_t Dummy1, uint32_t Dummy2);
D2EXTERN uint32_t (__fastcall* FOG_10089)(uint32_t Dummy1);
D2EXTERN uint32_t (__fastcall* FOG_10218)(void);

D2EXTERN uint32_t (__fastcall* D2WIN_10086)(void);
D2EXTERN uint32_t (__fastcall* D2WIN_10005)(uint32_t Dummy1, uint32_t Dummy2, uint32_t Dummy3, d2client_struct * pD2Client);

D2EXTERN uint32_t (__fastcall* D2LANG_Init)(uint32_t Dummy1, const char *_2, uint32_t Dummy3);
D2EXTERN uint32_t (__stdcall* D2COMMON_InitDataTables)(uint32_t Dummy1, uint32_t Dummy2, uint32_t Dummy3);

}


================================================
FILE: d2mapapi/d2structs.h
================================================
#pragma once

#include "offset.h"
#include <cstdint>

namespace d2mapapi {

struct UnitAny;
struct Room1_111;
struct Room1_112;
struct Room1_113;
struct Room2_111;
struct Room2_112;
struct Room2_113;
struct Level111;
struct Level112;
struct Level113;
struct Act111;
struct Act112;
struct Act113;
struct ActMisc111;
struct ActMisc112;
struct ActMisc113;

union RoomTile;
union PresetUnit;
union Room1;
union Room2;
union Level;
union Act;
union ActMisc;

#pragma pack(push)
#pragma pack(1)

struct d2client_struct_112 {
    uint32_t dwInit;                    //0x00
    uint8_t _1[0x20C-4];                //0x04
    uint32_t fpInit;                    //0x20C
};

struct d2client_struct_113 {
    uint32_t dwInit;                    //0x00
    uint8_t _1[0x20D - 4];              //0x04
    uint32_t fpInit;                    //0x20D
};

struct CollMap {
    uint32_t dwPosGameX;                //0x00
    uint32_t dwPosGameY;                //0x04
    uint32_t dwSizeGameX;               //0x08
    uint32_t dwSizeGameY;               //0x0C
    uint32_t dwPosRoomX;                //0x10
    uint32_t dwPosRoomY;                //0x14
    uint32_t dwSizeRoomX;               //0x18
    uint32_t dwSizeRoomY;               //0x1C
    uint16_t *pMapStart;                //0x20
    uint16_t *pMapEnd;                  //0x24
};

struct RoomTile111 {
    uint32_t _1;
    Room2 *pRoom2; //+04
    RoomTile *pNext; //+08
    uint32_t *nNum; //+0c
};

struct RoomTile112 {
    uint32_t *nNum;                     //0x00
    Room2 *pRoom2;                      //0x04
    uint32_t _1[2];                     //0x08
    RoomTile *pNext;                    //0x10
};

struct RoomTile113 {
    Room2 *pRoom2;                      //0x00
    RoomTile *pNext;                    //0x04
    uint32_t _2[2];                     //0x08
    uint32_t *nNum;                     //0x10
};

struct PresetUnit111 {
    uint32_t _1[2];
    uint32_t dwPosY; //+08
    uint32_t dwTxtFileNo; //+0c
    uint32_t _2[1];
    PresetUnit *pPresetNext; //+1c
    uint32_t dwPosX; //+20
    uint32_t dwType; //+24
};

struct PresetUnit112 {
    uint32_t dwTxtFileNo;               //0x00
    uint32_t _1[2];                     //0x04
    uint32_t dwPosX;                    //0x0C
    uint32_t _2;                        //0x10
    uint32_t dwPosY;                    //0x14
    PresetUnit *pPresetNext;            //0x18
    uint32_t dwType;                    //0x1C
};

struct PresetUnit113 {
    uint32_t _1;                        //0x00
    uint32_t dwTxtFileNo;               //0x04
    uint32_t dwPosX;                    //0x08
    PresetUnit *pPresetNext;            //0x0C
    uint32_t _3;                        //0x10
    uint32_t dwType;                    //0x14
    uint32_t dwPosY;                    //0x18
};

struct Level111 {
    uint32_t _1;
    uint32_t dwPosX;
    uint32_t dwPosY;
    uint32_t dwSizeX;
    uint32_t dwSizeY;
    uint32_t dwLevelNo; //+14
    uint32_t _1a[120];
    uint32_t dwSeed[2]; //+1f8
    uint32_t _2[1];
    Room2 *pRoom2First; //+204
    ActMisc *pMisc; //+208
    uint32_t _3[8];
    Level *pNextLevel; //+22c
};

struct Level112 {
    uint8_t _1[0x50];                   //0x00
    uint32_t dwSeed[2];                 //0x50
    uint32_t _2;                        //0x58
    Level *pNextLevel;                  //0x5C
    uint32_t _56;                       //0x60
    ActMisc *pMisc;                     //0x64
    uint32_t _3;                        //0x68
    uint32_t dwPosX;                    //0x6C
    uint32_t dwPosY;                    //0x70
    uint32_t dwSizeX;                   //0x74
    uint32_t dwSizeY;                   //0x78
    uint32_t _4[6];                     //0x7C
    uint32_t dwLevelNo;                 //0x94
    uint32_t _5[0x61];                  //0x98
    Room2 *pRoom2First;                 //0x21C
};

struct Level113 {
    uint32_t _1[4];                     //0x00
    Room2 *pRoom2First;                 //0x10
    uint32_t _2[2];                     //0x14
    uint32_t dwPosX;                    //0x1C
    uint32_t dwPosY;                    //0x20
    uint32_t dwSizeX;                   //0x24
    uint32_t dwSizeY;                   //0x28
    uint32_t _3[96];                    //0x2C
    Level *pNextLevel;                  //0x1AC
    uint32_t _4;                        //0x1B0
    ActMisc *pMisc;                     //0x1B4
    uint32_t _5[6];                     //0x1BC
    uint32_t dwLevelNo;                 //0x1D0
};

struct Room2_111 {
    RoomTile *pRoomTiles; //
    uint32_t _1[1];
    uint32_t dwPresetType; //+8
    uint32_t _2[1];
    uint32_t dwRoomsNear; //+10
    uint32_t _2a[2];
    Level *pLevel; //+1c
    uint32_t dwPosX; //+20
    uint32_t dwPosY; //+24
    uint32_t dwSizeX; //+28
    uint32_t dwSizeY; //+2c
    Room2 **pRoom2Near; //+30
    PresetUnit *pPreset; //+34
    Room2 *pRoom2Next; //+38
    uint32_t _4[38];
    uint32_t dwSeed[2]; //+d4
    uint32_t *pType2Info; //+dc
    uint32_t _5[2];
    Room1 *pRoom1; //+e8
};

struct Room2_112 {
    Level *pLevel;                      //0x00
    uint32_t _1;                        //0x04
    uint32_t dwRoomsNear;               //0x08
    RoomTile *pRoomTiles;               //0x0C
    Room2 **pRoom2Near;                 //0x10
    uint32_t _3[6];                     //0x14
    uint32_t dwPosX;                    //0x2C
    uint32_t dwPosY;                    //0x30
    uint32_t dwSizeX;                   //0x34
    uint32_t dwSizeY;                   //0x38
    uint32_t *pType2Info;               //0x3C
    uint32_t _4[0x20];                  //0x40
    uint32_t dwPresetType;              //0xC0
    PresetUnit *pPreset;                //0xC4
    uint32_t _5[0x3];                   //0xC8
    Room2 *pRoom2Next;                  //0xD4
    Room1 *pRoom1;                      //0xD8
};

struct Room2_113 {
    uint32_t _1[2];                     //0x00
    Room2 **pRoom2Near;                 //0x08
    uint32_t _2[6];                     //0x0C
    Room2 *pRoom2Next;                  //0x24
    uint32_t dwRoomFlags;               //0x28
    uint32_t dwRoomsNear;               //0x2C
    Room1 *pRoom1;                      //0x30
    uint32_t dwPosX;                    //0x34
    uint32_t dwPosY;                    //0x38
    uint32_t dwSizeX;                   //0x3C
    uint32_t dwSizeY;                   //0x40
    uint32_t _3;                        //0x44
    uint32_t dwPresetType;              //0x48
    RoomTile *pRoomTiles;               //0x4C
    uint32_t _4[2];                     //0x50
    Level *pLevel;                      //0x58
    PresetUnit *pPreset;                //0x5C
};

struct Room1_111 {
    uint32_t dwSeed[2]; //+00
    uint32_t dwXStart; //+08
    uint32_t dwYStart; //+0c
    uint32_t dwXSize; //+10
    uint32_t dwYSize; //+14
    uint32_t dwXStart2; //+18
    uint32_t dwYStart2; //+1c
    uint32_t dwXSize2; //+20
    uint32_t dwYSize2; //+24
    uint32_t _2[3];
    Room1 **pRoomsNear; //+34
    Room2 *pRoom2; //+38
    UnitAny *pUnitFirst; //+3c
    uint32_t _3[8];
    CollMap *Coll;
    uint32_t _4[4];
    Room1 *pRoomNext; // +74
    uint32_t _5;
    uint32_t dwRoomsNear; //+7c
};

struct Room1_112 {
    Room1 **pRoomsNear;                 //0x00
    uint32_t _1[2];                     //0x04
    uint32_t dwSeed[2];                 //0x0C
    uint32_t _2;                        //0x14
    uint32_t dwXStart;                  //0x18
    uint32_t dwYStart;                  //0x1C
    uint32_t dwXSize;                   //0x20
    uint32_t dwYSize;                   //0x24
    uint32_t _3[0x4];                   //0x28
    Room1 *pRoomNext;                   //0x38
    uint32_t _4;                        //0x3C
    UnitAny *pUnitFirst;                //0x40
    uint32_t _5[3];                     //0x44
    CollMap *Coll;                      //0x50
    uint32_t _6[0x7];                   //0x54
    Room2 *pRoom2;                      //0x70
    uint32_t _7;                        //0x74
    uint32_t dwRoomsNear;               //0x78
};

struct Room1_113 {
    Room1 **pRoomsNear;                 //0x00
    uint32_t _1[3];                     //0x04
    Room2 *pRoom2;                      //0x10
    uint32_t _2[3];                     //0x14
    CollMap *Coll;                      //0x20
    uint32_t dwRoomsNear;               //0x24
    uint32_t _3[9];                     //0x28
    uint32_t dwPosX;                    //0x4C
    uint32_t dwPosY;                    //0x50
    uint32_t dwSizeX;                   //0x54
    uint32_t dwSizeY;                   //0x58
    uint32_t _4[6];                     //0x5C
    UnitAny *pUnitFirst;                //0x74
    uint32_t _5;                        //0x78
    Room1 *pRoomNext;                   //0x7C
};

struct ActMisc111 {
    uint32_t _1[33];
    Act *pAct; //+84
    uint32_t dwBossTombLvl; //+88
    uint32_t _2[248];
    Level *pLevelFirst; //+46c
    uint32_t _3[2];
    uint32_t dwStaffTombLevel; // +478
};

struct ActMisc112 {
    uint32_t _1;                        //0x00
    Act *pAct;                          //0x04
    uint32_t _2[238];                   //0x3BC
    uint32_t dwStaffTombLevel;          //0x3C0
    uint32_t _3[43];                    //0x470
    Level *pLevelFirst;
};

struct ActMisc113 {
    uint32_t _1[37];                    //0x00
    uint32_t dwStaffTombLevel;          //0x94
    uint32_t _2[245];                   //0x98
    Act *pAct;                          //0x46C
    uint32_t _3[3];                     //0x470
    Level *pLevelFirst;                 //0x47C
};

struct Act111 {
    uint32_t _1[2];
    ActMisc *pMisc; //+08
};

struct Act112 {
    uint8_t _1[0x34];                   //0x00
    Room1 *pRoom1;                      //0x34
    ActMisc *pMisc;                     //0x38
    uint32_t _2[2];                     //0x40
    uint32_t dwAct;                     //0x44
};

struct Act113 {
    uint32_t _1[3];                     //0x00
    uint32_t dwMapSeed;                 //0x0C
    Room1 *pRoom1;                      //0x10
    uint32_t dwAct;                     //0x14
    uint32_t _2[12];                    //0x18
    ActMisc *pMisc;                     //0x48
};

#define GETTER_BY_VER(n) \
inline decltype(u113.n) n(D2Version ver) { switch(ver) { case D2_111a: case D2_111b: return u111.n; case D2_112a: return u112.n; default: return u113.n; } }

union d2client_struct {
    d2client_struct_112 u112;
    d2client_struct_113 u113;
};

union RoomTile {
    RoomTile111 u111;
    RoomTile112 u112;
    RoomTile113 u113;

    GETTER_BY_VER(pNext)
    GETTER_BY_VER(nNum)
    GETTER_BY_VER(pRoom2)
};

union PresetUnit {
    PresetUnit111 u111;
    PresetUnit112 u112;
    PresetUnit113 u113;

    GETTER_BY_VER(pPresetNext)
    GETTER_BY_VER(dwType)
    GETTER_BY_VER(dwTxtFileNo)
    GETTER_BY_VER(dwPosX)
    GETTER_BY_VER(dwPosY)
};

union Room1 {
    Room1_111 u111;
    Room1_112 u112;
    Room1_113 u113;

    GETTER_BY_VER(Coll)
};

union Room2 {
    Room2_111 u111;
    Room2_112 u112;
    Room2_113 u113;

    GETTER_BY_VER(pRoom2Next)
    GETTER_BY_VER(pRoom1)
    GETTER_BY_VER(dwPosX)
    GETTER_BY_VER(dwPosY)
    GETTER_BY_VER(dwRoomsNear)
    GETTER_BY_VER(pRoom2Near)
    GETTER_BY_VER(pLevel)
    GETTER_BY_VER(dwSizeX)
    GETTER_BY_VER(dwSizeY)
    GETTER_BY_VER(pPreset)
    GETTER_BY_VER(pRoomTiles)
};

union Level {
    Level111 u111;
    Level112 u112;
    Level113 u113;
    GETTER_BY_VER(pRoom2First)
    GETTER_BY_VER(dwLevelNo)
    GETTER_BY_VER(dwPosX)
    GETTER_BY_VER(dwPosY)
    GETTER_BY_VER(dwSizeX)
    GETTER_BY_VER(dwSizeY)
    GETTER_BY_VER(pNextLevel)
};

union ActMisc {
    ActMisc111 u111;
    ActMisc112 u112;
    ActMisc113 u113;
    GETTER_BY_VER(pLevelFirst)
};

union Act {
    Act111 u111;
    Act112 u112;
    Act113 u113;
    GETTER_BY_VER(pMisc)
};

#pragma pack(pop)

}


================================================
FILE: d2mapapi/genimage.cpp
================================================
/*
 * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>
 *
 * Use of this source code is governed by an MIT-style
 * license that can be found in the LICENSE file or at
 * https://opensource.org/licenses/MIT.
 */

#include "d2map.h"
#include "session.h"
#include "pathfinder.h"

#define STBIW_WINDOWS_UTF8
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb/stb_image_write.h"

#include <windows.h>
#include <shlwapi.h>
#include <cstdio>
#include <cstdint>
#include <cwchar>

int wmain(int argc, wchar_t *argv[]) {
    if (argc < 5) {
        fprintf(stderr, "Usage: d2mapapi_gen_image [D2 Game Path] <seed> <difficulty> <map_id> <image filename>\n");
        return -1;
    }
    const wchar_t *wfilename = argv[argc > 5 ? 5 : 4];
    const wchar_t *ext = StrRChrW(wfilename, nullptr, L'.');
    int filetype = -1;
    if (ext) {
        if (!StrCmpIW(ext, L".png")) {
            filetype = 0;
        } else if (!StrCmpIW(ext, L".bmp")) {
            filetype = 1;
        } else if (!StrCmpIW(ext, L".tga")) {
            filetype = 2;
        } else if (!StrCmpIW(ext, L".jpg")) {
            filetype = 3;
        }
    }
    if (filetype < 0) {
        fprintf(stderr, "Supported file extension: png, bmp, tga, jpg\n");
        return -1;
    }
    const auto *errstr = argc > 5 ? d2mapapi::d2Init(argv[1]) : nullptr;
    if (errstr) {
        do {
            HKEY key;
            if (RegOpenKeyExW(HKEY_CURRENT_USER, L"SOFTWARE\\Blizzard Entertainment\\Diablo II", 0, KEY_READ, &key)
                == ERROR_SUCCESS) {
                wchar_t path[MAX_PATH];
                DWORD pathSize = sizeof(path);
                if (RegQueryValueExW(key, L"InstallPath", nullptr, nullptr, LPBYTE(path), &pathSize) == ERROR_SUCCESS) {
                    errstr = d2mapapi::d2Init(path);
                    if (!errstr) {
                        RegCloseKey(key);
                        break;
                    }
                }
                RegCloseKey(key);
            }
            fprintf(stderr, "[d2mapapi_gen_image v" D2MAPAPI_VERSION "] %s\n", errstr);
            return -1;
        } while (false);
    }
    std::uint32_t seed, difficulty, mapId;
    seed = std::uint32_t(wcstoul(argv[argc > 5 ? 2 : 1], nullptr, 0));
    difficulty = std::uint32_t(wcstoul(argv[argc > 5 ? 3 : 2], nullptr, 0));
    mapId = std::uint32_t(wcstoul(argv[argc > 5 ? 4 : 3], nullptr, 0));
    auto sess = std::make_unique<d2mapapi::Session>();
    sess->update(seed, difficulty);
    auto *map = sess->getMap(mapId);
    auto str = map->encode();
    auto *collmap = new d2mapapi::CollisionMap(str);

    auto [x0, y0, x1, y1] = collmap->crop;
    auto w = collmap->size.width;
    auto h = collmap->size.height;
    std::vector<uint8_t> vec(w * h);
    collmap->extractCellData<uint8_t>(vec.data(), w, h, x0,y0, 0, 80, 160);
    for (auto &e: collmap->exits) {
        for (auto &o: e.second.offsets) {
            auto ex = o.x - collmap->offset.x, ey = o.y - collmap->offset.y;
            for (int j = -2; j < 3; ++j) {
                for (int i = -2; i < 3; ++i) {
                    vec[(ey + j) * w + ex + i] = 255;
                }
            }
        }
    }

    stbi_write_png_compression_level = 9;
    char filename[1024];
    stbiw_convert_wchar_to_utf8(filename, 1024, wfilename);
    switch (filetype) {
    case 0:
        stbi_write_png(filename, w, h, 1, vec.data(), w);
        break;
    case 1:
        stbi_write_bmp(filename, w, h, 1, vec.data());
        break;
    case 2:
        stbi_write_tga(filename, w, h, 1, vec.data());
        break;
    case 3:
        stbi_write_jpg(filename, w, h, 1, vec.data(), 90);
        break;
    default:
        break;
    }
    return 0;
}


================================================
FILE: d2mapapi/host.cpp
================================================
#include "pipehost.h"

#include <windows.h>

int main(int argc, char *argv[]) {
    d2mapapi::PipedChildProcess pcp;
    if (!pcp.start(L"d2mapapi_piped.exe", nullptr)) {
        MessageBoxA(nullptr, pcp.errMsg().c_str(), nullptr, 0);
        return -1;
    }
    for (int i = 1; i < argc; i += 3) {
        auto *map = pcp.queryMap(strtoul(argv[i], nullptr, 0),
                     strtoul(argv[i + 1], nullptr, 0),
                     strtoul(argv[i + 2], nullptr, 0));
        if (!map->built) {
            MessageBoxA(nullptr, map->errorString.c_str(), nullptr, 0);
        }
        delete map;
    }
    return 0;
}


================================================
FILE: d2mapapi/httpd.cpp
================================================
/*
 * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>
 *
 * Use of this source code is governed by an MIT-style
 * license that can be found in the LICENSE file or at
 * https://opensource.org/licenses/MIT.
 */

#include "simphttp.h"

#include "d2map.h"
#include "session.h"

#include <windows.h>
#include <unordered_map>
#include <memory>

enum {
    SessionsCacheSize = 8,
};

int wmain(int argc, wchar_t *argv[]) {
    const auto *errstr = argc > 1 ? d2mapapi::d2Init(argv[1]) : "Usage: d2mapapi_piped <D2 Game Path>";
    if (errstr) {
        do {
            HKEY key;
            if (RegOpenKeyExW(HKEY_CURRENT_USER, L"SOFTWARE\\Blizzard Entertainment\\Diablo II", 0, KEY_READ, &key) == ERROR_SUCCESS) {
                wchar_t path[MAX_PATH];
                DWORD pathSize = sizeof(path);
                if (RegQueryValueExW(key, L"InstallPath", nullptr, nullptr, LPBYTE(path), &pathSize) == ERROR_SUCCESS) {
                    errstr = d2mapapi::d2Init(path);
                    if (!errstr) {
                        RegCloseKey(key);
                        break;
                    }
                }
                RegCloseKey(key);
            }
            fprintf(stderr, "[d2mapapi_mod v" D2MAPAPI_VERSION "] %s\n", errstr);
            return -1;
        } while (false);
    }

    fprintf(stdout, "[d2mapapi_mod v" D2MAPAPI_VERSION "] HTTP server is listening at localhost:8000\n");

    std::unordered_map<uint64_t, std::unique_ptr<d2mapapi::Session>> sessions;
    std::vector<uint64_t> sessionsOrder;
    simphttp::Server server([&sessions, &sessionsOrder](auto &req, auto &res) {
        uint32_t seed = 0;
        uint8_t difficulty = 0;
        uint32_t levelId = 0;
        int indentation = 0;
        bool success = false;
        const char *url = req.url.c_str();
        do {
            if (*url != '/') break;
            ++url;
            char *next;
            seed = uint32_t(strtoul(url, &next, 0));
            if (url == next || *next != '/') break;

            url = next + 1;
            difficulty = uint32_t(strtoul(url, &next, 0));
            if (url == next || *next != '/') break;

            url = next + 1;
            levelId = uint32_t(strtoul(url, &next, 0));
            if (url == next || (*next != '/' && *next != 0)) break;

            if (*next == '/') {
                url = next + 1;
                indentation = int(strtoul(url, &next, 0));
                if (url == next && (*next == '/' || *next == 0)) {
                    indentation = 0;
                } else if (*next != '/' && *next != 0) {
                    break;
                }
            }
            success = true;
        } while (false);
        res.setStatus(200);
        res.setHeader("Connection", "keep-alive");
        res.setHeader("Content-Type", "application/json");
        if (!success) {
            const std::string errstr = R"({"error":"Invalid parameters!")";
            res.setHeader("Content-Length", std::to_string(errstr.size()));
            res.end(errstr);
            return;
        }
        auto key = uint64_t(seed) | (uint64_t(difficulty) << 32);
        auto &session = sessions[key];
        if (!session) {
            sessionsOrder.emplace_back(key);
            session = std::make_unique<d2mapapi::Session>();
            session->update(seed, difficulty);
            if (sessionsOrder.size() > SessionsCacheSize) {
                auto oldKey = sessionsOrder[0];
                sessionsOrder.erase(sessionsOrder.begin());
                sessions.erase(oldKey);
            }
        }
        const auto *map = session->getMap(levelId);
        if (map) {
            auto str = map->encode(false, indentation);
            res.setHeader("Content-Length", std::to_string(str.size()));
            res.end(str);
        } else {
            const std::string errstr = R"({"error":"Invalid map id!"})";
            res.setHeader("Content-Length", std::to_string(errstr.size()));
            res.end(errstr);
        }
    });
    server.listen("::", 8000);
    return 0;
}


================================================
FILE: d2mapapi/json/LICENSE.MIT
================================================
MIT License 

Copyright (c) 2013-2021 Niels Lohmann

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: d2mapapi/json/README.md
================================================
[![JSON for Modern C++](https://raw.githubusercontent.com/nlohmann/json/master/doc/json.gif)](https://github.com/nlohmann/json/releases)

[![Build Status](https://app.travis-ci.com/nlohmann/json.svg?branch=develop)](https://app.travis-ci.com/nlohmann/json)
[![Build Status](https://ci.appveyor.com/api/projects/status/1acb366xfyg3qybk/branch/develop?svg=true)](https://ci.appveyor.com/project/nlohmann/json)
[![Ubuntu](https://github.com/nlohmann/json/workflows/Ubuntu/badge.svg)](https://github.com/nlohmann/json/actions?query=workflow%3AUbuntu)
[![macOS](https://github.com/nlohmann/json/workflows/macOS/badge.svg)](https://github.com/nlohmann/json/actions?query=workflow%3AmacOS)
[![Windows](https://github.com/nlohmann/json/workflows/Windows/badge.svg)](https://github.com/nlohmann/json/actions?query=workflow%3AWindows)
[![Coverage Status](https://coveralls.io/repos/github/nlohmann/json/badge.svg?branch=develop)](https://coveralls.io/github/nlohmann/json?branch=develop)
[![Coverity Scan Build Status](https://scan.coverity.com/projects/5550/badge.svg)](https://scan.coverity.com/projects/nlohmann-json)
[![Codacy Badge](https://app.codacy.com/project/badge/Grade/e0d1a9d5d6fd46fcb655c4cb930bb3e8)](https://www.codacy.com/gh/nlohmann/json/dashboard?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=nlohmann/json&amp;utm_campaign=Badge_Grade)
[![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/nlohmann/json.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/nlohmann/json/context:cpp)
[![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/json.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:json)
[![Try online](https://img.shields.io/badge/try-online-blue.svg)](https://wandbox.org/permlink/1mp10JbaANo6FUc7)
[![Documentation](https://img.shields.io/badge/docs-doxygen-blue.svg)](https://nlohmann.github.io/json/doxygen/index.html)
[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/nlohmann/json/master/LICENSE.MIT)
[![GitHub Releases](https://img.shields.io/github/release/nlohmann/json.svg)](https://github.com/nlohmann/json/releases)
[![GitHub Downloads](https://img.shields.io/github/downloads/nlohmann/json/total)](https://github.com/nlohmann/json/releases)
[![GitHub Issues](https://img.shields.io/github/issues/nlohmann/json.svg)](https://github.com/nlohmann/json/issues)
[![Average time to resolve an issue](https://isitmaintained.com/badge/resolution/nlohmann/json.svg)](https://isitmaintained.com/project/nlohmann/json "Average time to resolve an issue")
[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/289/badge)](https://bestpractices.coreinfrastructure.org/projects/289)
[![GitHub Sponsors](https://img.shields.io/badge/GitHub-Sponsors-ff69b4)](https://github.com/sponsors/nlohmann)

- [Design goals](#design-goals)
- [Sponsors](#sponsors)
- [Support](#support) ([documentation](https://json.nlohmann.me), [FAQ](http://127.0.0.1:8000/home/faq/), [discussions](https://github.com/nlohmann/json/discussions), [API](https://json.nlohmann.me/api/basic_json/), [bug issues](https://github.com/nlohmann/json/issues))
- [Examples](#examples)
  - [JSON as first-class data type](#json-as-first-class-data-type)
  - [Serialization / Deserialization](#serialization--deserialization)
  - [STL-like access](#stl-like-access)
  - [Conversion from STL containers](#conversion-from-stl-containers)
  - [JSON Pointer and JSON Patch](#json-pointer-and-json-patch)
  - [JSON Merge Patch](#json-merge-patch)
  - [Implicit conversions](#implicit-conversions)
  - [Conversions to/from arbitrary types](#arbitrary-types-conversions)
  - [Specializing enum conversion](#specializing-enum-conversion)
  - [Binary formats (BSON, CBOR, MessagePack, and UBJSON)](#binary-formats-bson-cbor-messagepack-and-ubjson)
- [Supported compilers](#supported-compilers)
- [Integration](#integration)
  - [CMake](#cmake)
  - [Package Managers](#package-managers)
  - [Pkg-config](#pkg-config)
- [License](#license)
- [Contact](#contact)
- [Thanks](#thanks)
- [Used third-party tools](#used-third-party-tools)
- [Projects using JSON for Modern C++](#projects-using-json-for-modern-c)
- [Notes](#notes)
- [Execute unit tests](#execute-unit-tests)

## Design goals

There are myriads of [JSON](https://json.org) libraries out there, and each may even have its reason to exist. Our class had these design goals:

- **Intuitive syntax**. In languages such as Python, JSON feels like a first class data type. We used all the operator magic of modern C++ to achieve the same feeling in your code. Check out the [examples below](#examples) and you'll know what I mean.

- **Trivial integration**. Our whole code consists of a single header file [`json.hpp`](https://github.com/nlohmann/json/blob/develop/single_include/nlohmann/json.hpp). That's it. No library, no subproject, no dependencies, no complex build system. The class is written in vanilla C++11. All in all, everything should require no adjustment of your compiler flags or project settings.

- **Serious testing**. Our class is heavily [unit-tested](https://github.com/nlohmann/json/tree/develop/test/src) and covers [100%](https://coveralls.io/r/nlohmann/json) of the code, including all exceptional behavior. Furthermore, we checked with [Valgrind](https://valgrind.org) and the [Clang Sanitizers](https://clang.llvm.org/docs/index.html) that there are no memory leaks. [Google OSS-Fuzz](https://github.com/google/oss-fuzz/tree/master/projects/json) additionally runs fuzz tests against all parsers 24/7, effectively executing billions of tests so far. To maintain high quality, the project is following the [Core Infrastructure Initiative (CII) best practices](https://bestpractices.coreinfrastructure.org/projects/289).

Other aspects were not so important to us:

- **Memory efficiency**. Each JSON object has an overhead of one pointer (the maximal size of a union) and one enumeration element (1 byte). The default generalization uses the following C++ data types: `std::string` for strings, `int64_t`, `uint64_t` or `double` for numbers, `std::map` for objects, `std::vector` for arrays, and `bool` for Booleans. However, you can template the generalized class `basic_json` to your needs.

- **Speed**. There are certainly [faster JSON libraries](https://github.com/miloyip/nativejson-benchmark#parsing-time) out there. However, if your goal is to speed up your development by adding JSON support with a single header, then this library is the way to go. If you know how to use a `std::vector` or `std::map`, you are already set.

See the [contribution guidelines](https://github.com/nlohmann/json/blob/master/.github/CONTRIBUTING.md#please-dont) for more information.


## Sponsors

You can sponsor this library at [GitHub Sponsors](https://github.com/sponsors/nlohmann).

### :label: Named Sponsors

- [Michael Hartmann](https://github.com/reFX-Mike)
- [Stefan Hagen](https://github.com/sthagen)
- [Steve Sperandeo](https://github.com/homer6)
- [Robert Jefe Lindstädt](https://github.com/eljefedelrodeodeljefe)
- [Steve Wagner](https://github.com/ciroque)

Thanks everyone!

## Support

:question: If you have a **question**, please check if it is already answered in the [**FAQ**](https://json.nlohmann.me/home/faq/) or the [**Q&A**](https://github.com/nlohmann/json/discussions/categories/q-a) section. If not, please [**ask a new question**](https://github.com/nlohmann/json/discussions/new) there.

:books: If you want to **learn more** about how to use the library, check out the rest of the [**README**](#examples), have a look at [**code examples**](https://github.com/nlohmann/json/tree/develop/doc/examples), or browse through the [**help pages**](https://json.nlohmann.me).

:construction: If you want to understand the **API** better, check out the [**API Reference**](https://json.nlohmann.me/api/basic_json/) or the [**Doxygen documentation**](https://json.nlohmann.me/doxygen/index.html).

:bug: If you found a **bug**, please check the [**FAQ**](https://json.nlohmann.me/home/faq/) if it is a known issue or the result of a design decision. Please also have a look at the [**issue list**](https://github.com/nlohmann/json/issues) before you [**create a new issue**](https://github.com/nlohmann/json/issues/new/choose). Please provide as many information as possible to help us understand and reproduce your issue.

There is also a [**docset**](https://github.com/Kapeli/Dash-User-Contributions/tree/master/docsets/JSON_for_Modern_C%2B%2B) for the documentation browsers [Dash](https://kapeli.com/dash), [Velocity](https://velocity.silverlakesoftware.com), and [Zeal](https://zealdocs.org) that contains the full [documentation](https://json.nlohmann.me) as offline resource.

## Examples

Beside the examples below, you may want to check the [documentation](https://nlohmann.github.io/json/) where each function contains a separate code example (e.g., check out [`emplace()`](https://nlohmann.github.io/json/api/basic_json/emplace/)). All [example files](https://github.com/nlohmann/json/tree/develop/doc/examples) can be compiled and executed on their own (e.g., file [emplace.cpp](https://github.com/nlohmann/json/blob/develop/doc/examples/emplace.cpp)).

### JSON as first-class data type

Here are some examples to give you an idea how to use the class.

Assume you want to create the JSON object

```json
{
  "pi": 3.141,
  "happy": true,
  "name": "Niels",
  "nothing": null,
  "answer": {
    "everything": 42
  },
  "list": [1, 0, 2],
  "object": {
    "currency": "USD",
    "value": 42.99
  }
}
```

With this library, you could write:

```cpp
// create an empty structure (null)
json j;

// add a number that is stored as double (note the implicit conversion of j to an object)
j["pi"] = 3.141;

// add a Boolean that is stored as bool
j["happy"] = true;

// add a string that is stored as std::string
j["name"] = "Niels";

// add another null object by passing nullptr
j["nothing"] = nullptr;

// add an object inside the object
j["answer"]["everything"] = 42;

// add an array that is stored as std::vector (using an initializer list)
j["list"] = { 1, 0, 2 };

// add another object (using an initializer list of pairs)
j["object"] = { {"currency", "USD"}, {"value", 42.99} };

// instead, you could also write (which looks very similar to the JSON above)
json j2 = {
  {"pi", 3.141},
  {"happy", true},
  {"name", "Niels"},
  {"nothing", nullptr},
  {"answer", {
    {"everything", 42}
  }},
  {"list", {1, 0, 2}},
  {"object", {
    {"currency", "USD"},
    {"value", 42.99}
  }}
};
```

Note that in all these cases, you never need to "tell" the compiler which JSON value type you want to use. If you want to be explicit or express some edge cases, the functions [`json::array()`](https://nlohmann.github.io/json/api/basic_json/array/) and [`json::object()`](https://nlohmann.github.io/json/api/basic_json/object/) will help:

```cpp
// a way to express the empty array []
json empty_array_explicit = json::array();

// ways to express the empty object {}
json empty_object_implicit = json({});
json empty_object_explicit = json::object();

// a way to express an _array_ of key/value pairs [["currency", "USD"], ["value", 42.99]]
json array_not_object = json::array({ {"currency", "USD"}, {"value", 42.99} });
```

### Serialization / Deserialization

#### To/from strings

You can create a JSON value (deserialization) by appending `_json` to a string literal:

```cpp
// create object from string literal
json j = "{ \"happy\": true, \"pi\": 3.141 }"_json;

// or even nicer with a raw string literal
auto j2 = R"(
  {
    "happy": true,
    "pi": 3.141
  }
)"_json;
```

Note that without appending the `_json` suffix, the passed string literal is not parsed, but just used as JSON string value. That is, `json j = "{ \"happy\": true, \"pi\": 3.141 }"` would just store the string `"{ "happy": true, "pi": 3.141 }"` rather than parsing the actual object.

The above example can also be expressed explicitly using [`json::parse()`](https://nlohmann.github.io/json/api/basic_json/parse/):

```cpp
// parse explicitly
auto j3 = json::parse(R"({"happy": true, "pi": 3.141})");
```

You can also get a string representation of a JSON value (serialize):

```cpp
// explicit conversion to string
std::string s = j.dump();    // {"happy":true,"pi":3.141}

// serialization with pretty printing
// pass in the amount of spaces to indent
std::cout << j.dump(4) << std::endl;
// {
//     "happy": true,
//     "pi": 3.141
// }
```

Note the difference between serialization and assignment:

```cpp
// store a string in a JSON value
json j_string = "this is a string";

// retrieve the string value
auto cpp_string = j_string.get<std::string>();
// retrieve the string value (alternative when an variable already exists)
std::string cpp_string2;
j_string.get_to(cpp_string2);

// retrieve the serialized value (explicit JSON serialization)
std::string serialized_string = j_string.dump();

// output of original string
std::cout << cpp_string << " == " << cpp_string2 << " == " << j_string.get<std::string>() << '\n';
// output of serialized value
std::cout << j_string << " == " << serialized_string << std::endl;
```

[`.dump()`](https://nlohmann.github.io/json/api/basic_json/dump/) returns the originally stored string value.

Note the library only supports UTF-8. When you store strings with different encodings in the library, calling [`dump()`](https://nlohmann.github.io/json/api/basic_json/dump/) may throw an exception unless `json::error_handler_t::replace` or `json::error_handler_t::ignore` are used as error handlers.

#### To/from streams (e.g. files, string streams)

You can also use streams to serialize and deserialize:

```cpp
// deserialize from standard input
json j;
std::cin >> j;

// serialize to standard output
std::cout << j;

// the setw manipulator was overloaded to set the indentation for pretty printing
std::cout << std::setw(4) << j << std::endl;
```

These operators work for any subclasses of `std::istream` or `std::ostream`. Here is the same example with files:

```cpp
// read a JSON file
std::ifstream i("file.json");
json j;
i >> j;

// write prettified JSON to another file
std::ofstream o("pretty.json");
o << std::setw(4) << j << std::endl;
```

Please note that setting the exception bit for `failbit` is inappropriate for this use case. It will result in program termination due to the `noexcept` specifier in use.

#### Read from iterator range

You can also parse JSON from an iterator range; that is, from any container accessible by iterators whose `value_type` is an integral type of 1, 2 or 4 bytes, which will be interpreted as UTF-8, UTF-16 and UTF-32 respectively. For instance, a `std::vector<std::uint8_t>`, or a `std::list<std::uint16_t>`:

```cpp
std::vector<std::uint8_t> v = {'t', 'r', 'u', 'e'};
json j = json::parse(v.begin(), v.end());
```

You may leave the iterators for the range [begin, end):

```cpp
std::vector<std::uint8_t> v = {'t', 'r', 'u', 'e'};
json j = json::parse(v);
```

#### Custom data source

Since the parse function accepts arbitrary iterator ranges, you can provide your own data sources by implementing the `LegacyInputIterator` concept.

```cpp
struct MyContainer {
  void advance();
  const char& get_current();
};

struct MyIterator {
    using difference_type = std::ptrdiff_t;
    using value_type = char;
    using pointer = const char*;
    using reference = const char&;
    using iterator_category = std::input_iterator_tag;

    MyIterator& operator++() {
        MyContainer.advance();
        return *this;
    }

    bool operator!=(const MyIterator& rhs) const {
        return rhs.target != target;
    }

    reference operator*() const {
        return target.get_current();
    }

    MyContainer* target = nullptr;
};

MyIterator begin(MyContainer& tgt) {
    return MyIterator{&tgt};
}

MyIterator end(const MyContainer&) {
    return {};
}

void foo() {
    MyContainer c;
    json j = json::parse(c);
}
```

#### SAX interface

The library uses a SAX-like interface with the following functions:

```cpp
// called when null is parsed
bool null();

// called when a boolean is parsed; value is passed
bool boolean(bool val);

// called when a signed or unsigned integer number is parsed; value is passed
bool number_integer(number_integer_t val);
bool number_unsigned(number_unsigned_t val);

// called when a floating-point number is parsed; value and original string is passed
bool number_float(number_float_t val, const string_t& s);

// called when a string is parsed; value is passed and can be safely moved away
bool string(string_t& val);
// called when a binary value is parsed; value is passed and can be safely moved away
bool binary(binary_t& val);

// called when an object or array begins or ends, resp. The number of elements is passed (or -1 if not known)
bool start_object(std::size_t elements);
bool end_object();
bool start_array(std::size_t elements);
bool end_array();
// called when an object key is parsed; value is passed and can be safely moved away
bool key(string_t& val);

// called when a parse error occurs; byte position, the last token, and an exception is passed
bool parse_error(std::size_t position, const std::string& last_token, const detail::exception& ex);
```

The return value of each function determines whether parsing should proceed.

To implement your own SAX handler, proceed as follows:

1. Implement the SAX interface in a class. You can use class `nlohmann::json_sax<json>` as base class, but you can also use any class where the functions described above are implemented and public.
2. Create an object of your SAX interface class, e.g. `my_sax`.
3. Call `bool json::sax_parse(input, &my_sax)`; where the first parameter can be any input like a string or an input stream and the second parameter is a pointer to your SAX interface.

Note the `sax_parse` function only returns a `bool` indicating the result of the last executed SAX event. It does not return a  `json` value - it is up to you to decide what to do with the SAX events. Furthermore, no exceptions are thrown in case of a parse error - it is up to you what to do with the exception object passed to your `parse_error` implementation. Internally, the SAX interface is used for the DOM parser (class `json_sax_dom_parser`) as well as the acceptor (`json_sax_acceptor`), see file [`json_sax.hpp`](https://github.com/nlohmann/json/blob/develop/include/nlohmann/detail/input/json_sax.hpp).

### STL-like access

We designed the JSON class to behave just like an STL container. In fact, it satisfies the [**ReversibleContainer**](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer) requirement.

```cpp
// create an array using push_back
json j;
j.push_back("foo");
j.push_back(1);
j.push_back(true);

// also use emplace_back
j.emplace_back(1.78);

// iterate the array
for (json::iterator it = j.begin(); it != j.end(); ++it) {
  std::cout << *it << '\n';
}

// range-based for
for (auto& element : j) {
  std::cout << element << '\n';
}

// getter/setter
const auto tmp = j[0].get<std::string>();
j[1] = 42;
bool foo = j.at(2);

// comparison
j == R"(["foo", 1, true, 1.78])"_json;  // true

// other stuff
j.size();     // 4 entries
j.empty();    // false
j.type();     // json::value_t::array
j.clear();    // the array is empty again

// convenience type checkers
j.is_null();
j.is_boolean();
j.is_number();
j.is_object();
j.is_array();
j.is_string();

// create an object
json o;
o["foo"] = 23;
o["bar"] = false;
o["baz"] = 3.141;

// also use emplace
o.emplace("weather", "sunny");

// special iterator member functions for objects
for (json::iterator it = o.begin(); it != o.end(); ++it) {
  std::cout << it.key() << " : " << it.value() << "\n";
}

// the same code as range for
for (auto& el : o.items()) {
  std::cout << el.key() << " : " << el.value() << "\n";
}

// even easier with structured bindings (C++17)
for (auto& [key, value] : o.items()) {
  std::cout << key << " : " << value << "\n";
}

// find an entry
if (o.contains("foo")) {
  // there is an entry with key "foo"
}

// or via find and an iterator
if (o.find("foo") != o.end()) {
  // there is an entry with key "foo"
}

// or simpler using count()
int foo_present = o.count("foo"); // 1
int fob_present = o.count("fob"); // 0

// delete an entry
o.erase("foo");
```


### Conversion from STL containers

Any sequence container (`std::array`, `std::vector`, `std::deque`, `std::forward_list`, `std::list`) whose values can be used to construct JSON values (e.g., integers, floating point numbers, Booleans, string types, or again STL containers described in this section) can be used to create a JSON array. The same holds for similar associative containers (`std::set`, `std::multiset`, `std::unordered_set`, `std::unordered_multiset`), but in these cases the order of the elements of the array depends on how the elements are ordered in the respective STL container.

```cpp
std::vector<int> c_vector {1, 2, 3, 4};
json j_vec(c_vector);
// [1, 2, 3, 4]

std::deque<double> c_deque {1.2, 2.3, 3.4, 5.6};
json j_deque(c_deque);
// [1.2, 2.3, 3.4, 5.6]

std::list<bool> c_list {true, true, false, true};
json j_list(c_list);
// [true, true, false, true]

std::forward_list<int64_t> c_flist {12345678909876, 23456789098765, 34567890987654, 45678909876543};
json j_flist(c_flist);
// [12345678909876, 23456789098765, 34567890987654, 45678909876543]

std::array<unsigned long, 4> c_array {{1, 2, 3, 4}};
json j_array(c_array);
// [1, 2, 3, 4]

std::set<std::string> c_set {"one", "two", "three", "four", "one"};
json j_set(c_set); // only one entry for "one" is used
// ["four", "one", "three", "two"]

std::unordered_set<std::string> c_uset {"one", "two", "three", "four", "one"};
json j_uset(c_uset); // only one entry for "one" is used
// maybe ["two", "three", "four", "one"]

std::multiset<std::string> c_mset {"one", "two", "one", "four"};
json j_mset(c_mset); // both entries for "one" are used
// maybe ["one", "two", "one", "four"]

std::unordered_multiset<std::string> c_umset {"one", "two", "one", "four"};
json j_umset(c_umset); // both entries for "one" are used
// maybe ["one", "two", "one", "four"]
```

Likewise, any associative key-value containers (`std::map`, `std::multimap`, `std::unordered_map`, `std::unordered_multimap`) whose keys can construct an `std::string` and whose values can be used to construct JSON values (see examples above) can be used to create a JSON object. Note that in case of multimaps only one key is used in the JSON object and the value depends on the internal order of the STL container.

```cpp
std::map<std::string, int> c_map { {"one", 1}, {"two", 2}, {"three", 3} };
json j_map(c_map);
// {"one": 1, "three": 3, "two": 2 }

std::unordered_map<const char*, double> c_umap { {"one", 1.2}, {"two", 2.3}, {"three", 3.4} };
json j_umap(c_umap);
// {"one": 1.2, "two": 2.3, "three": 3.4}

std::multimap<std::string, bool> c_mmap { {"one", true}, {"two", true}, {"three", false}, {"three", true} };
json j_mmap(c_mmap); // only one entry for key "three" is used
// maybe {"one": true, "two": true, "three": true}

std::unordered_multimap<std::string, bool> c_ummap { {"one", true}, {"two", true}, {"three", false}, {"three", true} };
json j_ummap(c_ummap); // only one entry for key "three" is used
// maybe {"one": true, "two": true, "three": true}
```

### JSON Pointer and JSON Patch

The library supports **JSON Pointer** ([RFC 6901](https://tools.ietf.org/html/rfc6901)) as alternative means to address structured values. On top of this, **JSON Patch** ([RFC 6902](https://tools.ietf.org/html/rfc6902)) allows to describe differences between two JSON values - effectively allowing patch and diff operations known from Unix.

```cpp
// a JSON value
json j_original = R"({
  "baz": ["one", "two", "three"],
  "foo": "bar"
})"_json;

// access members with a JSON pointer (RFC 6901)
j_original["/baz/1"_json_pointer];
// "two"

// a JSON patch (RFC 6902)
json j_patch = R"([
  { "op": "replace", "path": "/baz", "value": "boo" },
  { "op": "add", "path": "/hello", "value": ["world"] },
  { "op": "remove", "path": "/foo"}
])"_json;

// apply the patch
json j_result = j_original.patch(j_patch);
// {
//    "baz": "boo",
//    "hello": ["world"]
// }

// calculate a JSON patch from two JSON values
json::diff(j_result, j_original);
// [
//   { "op":" replace", "path": "/baz", "value": ["one", "two", "three"] },
//   { "op": "remove","path": "/hello" },
//   { "op": "add", "path": "/foo", "value": "bar" }
// ]
```

### JSON Merge Patch

The library supports **JSON Merge Patch** ([RFC 7386](https://tools.ietf.org/html/rfc7386)) as a patch format. Instead of using JSON Pointer (see above) to specify values to be manipulated, it describes the changes using a syntax that closely mimics the document being modified.

```cpp
// a JSON value
json j_document = R"({
  "a": "b",
  "c": {
    "d": "e",
    "f": "g"
  }
})"_json;

// a patch
json j_patch = R"({
  "a":"z",
  "c": {
    "f": null
  }
})"_json;

// apply the patch
j_document.merge_patch(j_patch);
// {
//  "a": "z",
//  "c": {
//    "d": "e"
//  }
// }
```

### Implicit conversions

Supported types can be implicitly converted to JSON values.

It is recommended to **NOT USE** implicit conversions **FROM** a JSON value.
You can find more details about this recommendation [here](https://www.github.com/nlohmann/json/issues/958).
You can switch off implicit conversions by defining `JSON_USE_IMPLICIT_CONVERSIONS` to `0` before including the `json.hpp` header. When using CMake, you can also achieve this by setting the option `JSON_ImplicitConversions` to `OFF`.

```cpp
// strings
std::string s1 = "Hello, world!";
json js = s1;
auto s2 = js.get<std::string>();
// NOT RECOMMENDED
std::string s3 = js;
std::string s4;
s4 = js;

// Booleans
bool b1 = true;
json jb = b1;
auto b2 = jb.get<bool>();
// NOT RECOMMENDED
bool b3 = jb;
bool b4;
b4 = jb;

// numbers
int i = 42;
json jn = i;
auto f = jn.get<double>();
// NOT RECOMMENDED
double f2 = jb;
double f3;
f3 = jb;

// etc.
```

Note that `char` types are not automatically converted to JSON strings, but to integer numbers. A conversion to a string must be specified explicitly:

```cpp
char ch = 'A';                       // ASCII value 65
json j_default = ch;                 // stores integer number 65
json j_string = std::string(1, ch);  // stores string "A"
```

### Arbitrary types conversions

Every type can be serialized in JSON, not just STL containers and scalar types. Usually, you would do something along those lines:

```cpp
namespace ns {
    // a simple struct to model a person
    struct person {
        std::string name;
        std::string address;
        int age;
    };
}

ns::person p = {"Ned Flanders", "744 Evergreen Terrace", 60};

// convert to JSON: copy each value into the JSON object
json j;
j["name"] = p.name;
j["address"] = p.address;
j["age"] = p.age;

// ...

// convert from JSON: copy each value from the JSON object
ns::person p {
    j["name"].get<std::string>(),
    j["address"].get<std::string>(),
    j["age"].get<int>()
};
```

It works, but that's quite a lot of boilerplate... Fortunately, there's a better way:

```cpp
// create a person
ns::person p {"Ned Flanders", "744 Evergreen Terrace", 60};

// conversion: person -> json
json j = p;

std::cout << j << std::endl;
// {"address":"744 Evergreen Terrace","age":60,"name":"Ned Flanders"}

// conversion: json -> person
auto p2 = j.get<ns::person>();

// that's it
assert(p == p2);
```

#### Basic usage

To make this work with one of your types, you only need to provide two functions:

```cpp
using json = nlohmann::json;

namespace ns {
    void to_json(json& j, const person& p) {
        j = json{{"name", p.name}, {"address", p.address}, {"age", p.age}};
    }

    void from_json(const json& j, person& p) {
        j.at("name").get_to(p.name);
        j.at("address").get_to(p.address);
        j.at("age").get_to(p.age);
    }
} // namespace ns
```

That's all! When calling the `json` constructor with your type, your custom `to_json` method will be automatically called.
Likewise, when calling `get<your_type>()` or `get_to(your_type&)`, the `from_json` method will be called.

Some important things:

* Those methods **MUST** be in your type's namespace (which can be the global namespace), or the library will not be able to locate them (in this example, they are in namespace `ns`, where `person` is defined).
* Those methods **MUST** be available (e.g., proper headers must be included) everywhere you use these conversions. Look at [issue 1108](https://github.com/nlohmann/json/issues/1108) for errors that may occur otherwise.
* When using `get<your_type>()`, `your_type` **MUST** be [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). (There is a way to bypass this requirement described later.)
* In function `from_json`, use function [`at()`](https://nlohmann.github.io/json/api/basic_json/at/) to access the object values rather than `operator[]`. In case a key does not exist, `at` throws an exception that you can handle, whereas `operator[]` exhibits undefined behavior.
* You do not need to add serializers or deserializers for STL types like `std::vector`: the library already implements these.

#### Simplify your life with macros

If you just want to serialize/deserialize some structs, the `to_json`/`from_json` functions can be a lot of boilerplate.

There are two macros to make your life easier as long as you (1) want to use a JSON object as serialization and (2) want to use the member variable names as object keys in that object:

- `NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(name, member1, member2, ...)` is to be defined inside of the namespace of the class/struct to create code for.
- `NLOHMANN_DEFINE_TYPE_INTRUSIVE(name, member1, member2, ...)` is to be defined inside of the class/struct to create code for. This macro can also access private members.

In both macros, the first parameter is the name of the class/struct, and all remaining parameters name the members.

##### Examples

The `to_json`/`from_json` functions for the `person` struct above can be created with:

```cpp
namespace ns {
    NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(person, name, address, age)
}
```

Here is an example with private members, where `NLOHMANN_DEFINE_TYPE_INTRUSIVE` is needed:

```cpp
namespace ns {
    class address {
      private:
        std::string street;
        int housenumber;
        int postcode;

      public:
        NLOHMANN_DEFINE_TYPE_INTRUSIVE(address, street, housenumber, postcode)
    };
}
```

#### How do I convert third-party types?

This requires a bit more advanced technique. But first, let's see how this conversion mechanism works:

The library uses **JSON Serializers** to convert types to json.
The default serializer for `nlohmann::json` is `nlohmann::adl_serializer` (ADL means [Argument-Dependent Lookup](https://en.cppreference.com/w/cpp/language/adl)).

It is implemented like this (simplified):

```cpp
template <typename T>
struct adl_serializer {
    static void to_json(json& j, const T& value) {
        // calls the "to_json" method in T's namespace
    }

    static void from_json(const json& j, T& value) {
        // same thing, but with the "from_json" method
    }
};
```

This serializer works fine when you have control over the type's namespace. However, what about `boost::optional` or `std::filesystem::path` (C++17)? Hijacking the `boost` namespace is pretty bad, and it's illegal to add something other than template specializations to `std`...

To solve this, you need to add a specialization of `adl_serializer` to the `nlohmann` namespace, here's an example:

```cpp
// partial specialization (full specialization works too)
namespace nlohmann {
    template <typename T>
    struct adl_serializer<boost::optional<T>> {
        static void to_json(json& j, const boost::optional<T>& opt) {
            if (opt == boost::none) {
                j = nullptr;
            } else {
              j = *opt; // this will call adl_serializer<T>::to_json which will
                        // find the free function to_json in T's namespace!
            }
        }

        static void from_json(const json& j, boost::optional<T>& opt) {
            if (j.is_null()) {
                opt = boost::none;
            } else {
                opt = j.get<T>(); // same as above, but with
                                  // adl_serializer<T>::from_json
            }
        }
    };
}
```

#### How can I use `get()` for non-default constructible/non-copyable types?

There is a way, if your type is [MoveConstructible](https://en.cppreference.com/w/cpp/named_req/MoveConstructible). You will need to specialize the `adl_serializer` as well, but with a special `from_json` overload:

```cpp
struct move_only_type {
    move_only_type() = delete;
    move_only_type(int ii): i(ii) {}
    move_only_type(const move_only_type&) = delete;
    move_only_type(move_only_type&&) = default;

    int i;
};

namespace nlohmann {
    template <>
    struct adl_serializer<move_only_type> {
        // note: the return type is no longer 'void', and the method only takes
        // one argument
        static move_only_type from_json(const json& j) {
            return {j.get<int>()};
        }

        // Here's the catch! You must provide a to_json method! Otherwise you
        // will not be able to convert move_only_type to json, since you fully
        // specialized adl_serializer on that type
        static void to_json(json& j, move_only_type t) {
            j = t.i;
        }
    };
}
```

#### Can I write my own serializer? (Advanced use)

Yes. You might want to take a look at [`unit-udt.cpp`](https://github.com/nlohmann/json/blob/develop/test/src/unit-udt.cpp) in the test suite, to see a few examples.

If you write your own serializer, you'll need to do a few things:

- use a different `basic_json` alias than `nlohmann::json` (the last template parameter of `basic_json` is the `JSONSerializer`)
- use your `basic_json` alias (or a template parameter) in all your `to_json`/`from_json` methods
- use `nlohmann::to_json` and `nlohmann::from_json` when you need ADL

Here is an example, without simplifications, that only accepts types with a size <= 32, and uses ADL.

```cpp
// You should use void as a second template argument
// if you don't need compile-time checks on T
template<typename T, typename SFINAE = typename std::enable_if<sizeof(T) <= 32>::type>
struct less_than_32_serializer {
    template <typename BasicJsonType>
    static void to_json(BasicJsonType& j, T value) {
        // we want to use ADL, and call the correct to_json overload
        using nlohmann::to_json; // this method is called by adl_serializer,
                                 // this is where the magic happens
        to_json(j, value);
    }

    template <typename BasicJsonType>
    static void from_json(const BasicJsonType& j, T& value) {
        // same thing here
        using nlohmann::from_json;
        from_json(j, value);
    }
};
```

Be **very** careful when reimplementing your serializer, you can stack overflow if you don't pay attention:

```cpp
template <typename T, void>
struct bad_serializer
{
    template <typename BasicJsonType>
    static void to_json(BasicJsonType& j, const T& value) {
      // this calls BasicJsonType::json_serializer<T>::to_json(j, value);
      // if BasicJsonType::json_serializer == bad_serializer ... oops!
      j = value;
    }

    template <typename BasicJsonType>
    static void to_json(const BasicJsonType& j, T& value) {
      // this calls BasicJsonType::json_serializer<T>::from_json(j, value);
      // if BasicJsonType::json_serializer == bad_serializer ... oops!
      value = j.template get<T>(); // oops!
    }
};
```

### Specializing enum conversion

By default, enum values are serialized to JSON as integers. In some cases this could result in undesired behavior. If an enum is modified or re-ordered after data has been serialized to JSON, the later de-serialized JSON data may be undefined or a different enum value than was originally intended.

It is possible to more precisely specify how a given enum is mapped to and from JSON as shown below:

```cpp
// example enum type declaration
enum TaskState {
    TS_STOPPED,
    TS_RUNNING,
    TS_COMPLETED,
    TS_INVALID=-1,
};

// map TaskState values to JSON as strings
NLOHMANN_JSON_SERIALIZE_ENUM( TaskState, {
    {TS_INVALID, nullptr},
    {TS_STOPPED, "stopped"},
    {TS_RUNNING, "running"},
    {TS_COMPLETED, "completed"},
})
```

The `NLOHMANN_JSON_SERIALIZE_ENUM()` macro declares a set of `to_json()` / `from_json()` functions for type `TaskState` while avoiding repetition and boilerplate serialization code.

**Usage:**

```cpp
// enum to JSON as string
json j = TS_STOPPED;
assert(j == "stopped");

// json string to enum
json j3 = "running";
assert(j3.get<TaskState>() == TS_RUNNING);

// undefined json value to enum (where the first map entry above is the default)
json jPi = 3.14;
assert(jPi.get<TaskState>() == TS_INVALID );
```

Just as in [Arbitrary Type Conversions](#arbitrary-types-conversions) above,
- `NLOHMANN_JSON_SERIALIZE_ENUM()` MUST be declared in your enum type's namespace (which can be the global namespace), or the library will not be able to locate it and it will default to integer serialization.
- It MUST be available (e.g., proper headers must be included) everywhere you use the conversions.

Other Important points:
- When using `get<ENUM_TYPE>()`, undefined JSON values will default to the first pair specified in your map. Select this default pair carefully.
- If an enum or JSON value is specified more than once in your map, the first matching occurrence from the top of the map will be returned when converting to or from JSON.

### Binary formats (BSON, CBOR, MessagePack, and UBJSON)

Though JSON is a ubiquitous data format, it is not a very compact format suitable for data exchange, for instance over a network. Hence, the library supports [BSON](https://bsonspec.org) (Binary JSON), [CBOR](https://cbor.io) (Concise Binary Object Representation), [MessagePack](https://msgpack.org), and [UBJSON](https://ubjson.org) (Universal Binary JSON Specification) to efficiently encode JSON values to byte vectors and to decode such vectors.

```cpp
// create a JSON value
json j = R"({"compact": true, "schema": 0})"_json;

// serialize to BSON
std::vector<std::uint8_t> v_bson = json::to_bson(j);

// 0x1B, 0x00, 0x00, 0x00, 0x08, 0x63, 0x6F, 0x6D, 0x70, 0x61, 0x63, 0x74, 0x00, 0x01, 0x10, 0x73, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

// roundtrip
json j_from_bson = json::from_bson(v_bson);

// serialize to CBOR
std::vector<std::uint8_t> v_cbor = json::to_cbor(j);

// 0xA2, 0x67, 0x63, 0x6F, 0x6D, 0x70, 0x61, 0x63, 0x74, 0xF5, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x00

// roundtrip
json j_from_cbor = json::from_cbor(v_cbor);

// serialize to MessagePack
std::vector<std::uint8_t> v_msgpack = json::to_msgpack(j);

// 0x82, 0xA7, 0x63, 0x6F, 0x6D, 0x70, 0x61, 0x63, 0x74, 0xC3, 0xA6, 0x73, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x00

// roundtrip
json j_from_msgpack = json::from_msgpack(v_msgpack);

// serialize to UBJSON
std::vector<std::uint8_t> v_ubjson = json::to_ubjson(j);

// 0x7B, 0x69, 0x07, 0x63, 0x6F, 0x6D, 0x70, 0x61, 0x63, 0x74, 0x54, 0x69, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x69, 0x00, 0x7D

// roundtrip
json j_from_ubjson = json::from_ubjson(v_ubjson);
```

The library also supports binary types from BSON, CBOR (byte strings), and MessagePack (bin, ext, fixext). They are stored by default as `std::vector<std::uint8_t>` to be processed outside of the library.

```cpp
// CBOR byte string with payload 0xCAFE
std::vector<std::uint8_t> v = {0x42, 0xCA, 0xFE};

// read value
json j = json::from_cbor(v);

// the JSON value has type binary
j.is_binary(); // true

// get reference to stored binary value
auto& binary = j.get_binary();

// the binary value has no subtype (CBOR has no binary subtypes)
binary.has_subtype(); // false

// access std::vector<std::uint8_t> member functions
binary.size(); // 2
binary[0]; // 0xCA
binary[1]; // 0xFE

// set subtype to 0x10
binary.set_subtype(0x10);

// serialize to MessagePack
auto cbor = json::to_msgpack(j); // 0xD5 (fixext2), 0x10, 0xCA, 0xFE
```


## Supported compilers

Though it's 2021 already, the support for C++11 is still a bit sparse. Currently, the following compilers are known to work:

- GCC 4.8 - 11.0 (and possibly later)
- Clang 3.4 - 13.0 (and possibly later)
- Apple Clang 9.1 - 12.4 (and possibly later)
- Intel C++ Compiler 17.0.2 (and possibly later)
- Microsoft Visual C++ 2015 / Build Tools 14.0.25123.0 (and possibly later)
- Microsoft Visual C++ 2017 / Build Tools 15.5.180.51428 (and possibly later)
- Microsoft Visual C++ 2019 / Build Tools 16.3.1+1def00d3d (and possibly later)

I would be happy to learn about other compilers/versions.

Please note:

- GCC 4.8 has a bug [57824](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57824)): multiline raw strings cannot be the arguments to macros. Don't use multiline raw strings directly in macros with this compiler.
- Android defaults to using very old compilers and C++ libraries. To fix this, add the following to your `Application.mk`. This will switch to the LLVM C++ library, the Clang compiler, and enable C++11 and other features disabled by default.

    ```
    APP_STL := c++_shared
    NDK_TOOLCHAIN_VERSION := clang3.6
    APP_CPPFLAGS += -frtti -fexceptions
    ```

    The code compiles successfully with [Android NDK](https://developer.android.com/ndk/index.html?hl=ml), Revision 9 - 11 (and possibly later) and [CrystaX's Android NDK](https://www.crystax.net/en/android/ndk) version 10.

- For GCC running on MinGW or Android SDK, the error `'to_string' is not a member of 'std'` (or similarly, for `strtod` or `strtof`) may occur. Note this is not an issue with the code,  but rather with the compiler itself. On Android, see above to build with a newer environment.  For MinGW, please refer to [this site](https://tehsausage.com/mingw-to-string) and [this discussion](https://github.com/nlohmann/json/issues/136) for information on how to fix this bug. For Android NDK using `APP_STL := gnustl_static`, please refer to [this discussion](https://github.com/nlohmann/json/issues/219).

- Unsupported versions of GCC and Clang are rejected by `#error` directives. This can be switched off by defining `JSON_SKIP_UNSUPPORTED_COMPILER_CHECK`. Note that you can expect no support in this case.

The following compilers are currently used in continuous integration at [Travis](https://travis-ci.org/nlohmann/json), [AppVeyor](https://ci.appveyor.com/project/nlohmann/json), [Drone CI](https://cloud.drone.io/nlohmann/json), and [GitHub Actions](https://github.com/nlohmann/json/actions):

| Compiler                                                          | Operating System   | CI Provider    |
|-------------------------------------------------------------------|--------------------|----------------|
| Apple Clang 10.0.1 (clang-1001.0.46.4); Xcode 10.2.1              | macOS 10.14.4      | Travis         |
| Apple Clang 10.0.1 (clang-1001.0.46.4); Xcode 10.3                | macOS 10.15.7      | GitHub Actions |
| Apple Clang 11.0.0 (clang-1100.0.33.12); Xcode 11.2.1             | macOS 10.15.7      | GitHub Actions |
| Apple Clang 11.0.0 (clang-1100.0.33.17); Xcode 11.3.1             | macOS 10.15.7      | GitHub Actions |
| Apple Clang 11.0.3 (clang-1103.0.32.59); Xcode 11.4.1             | macOS 10.15.7      | GitHub Actions |
| Apple Clang 11.0.3 (clang-1103.0.32.62); Xcode 11.5               | macOS 10.15.7      | GitHub Actions |
| Apple Clang 11.0.3 (clang-1103.0.32.62); Xcode 11.6               | macOS 10.15.7      | GitHub Actions |
| Apple Clang 11.0.3 (clang-1103.0.32.62); Xcode 11.7               | macOS 10.15.7      | GitHub Actions |
| Apple Clang 12.0.0 (clang-1200.0.32.2); Xcode 12                  | macOS 10.15.7      | GitHub Actions |
| Apple Clang 12.0.0 (clang-1200.0.32.21); Xcode 12.1               | macOS 10.15.7      | GitHub Actions |
| Apple Clang 12.0.0 (clang-1200.0.32.21); Xcode 12.1.1             | macOS 10.15.7      | GitHub Actions |
| Apple Clang 12.0.0 (clang-1200.0.32.27); Xcode 12.2               | macOS 10.15.7      | GitHub Actions |
| Apple Clang 12.0.0 (clang-1200.0.32.28); Xcode 12.3               | macOS 10.15.7      | GitHub Actions |
| Apple Clang 12.0.0 (clang-1200.0.32.29); Xcode 12.4               | macOS 10.15.7      | GitHub Actions |
| GCC 4.8.5 (Ubuntu 4.8.5-4ubuntu2)                                 | Ubuntu 20.04.2 LTS | GitHub Actions |
| GCC 4.9.3 (Ubuntu 4.9.3-13ubuntu2)                                | Ubuntu 20.04.2 LTS | GitHub Actions |
| GCC 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.12)                        | Ubuntu 20.04.2 LTS | GitHub Actions |
| GCC 6.5.0 (Ubuntu 6.5.0-2ubuntu1~14.04.1)                         | Ubuntu 14.04.5 LTS | Travis         |
| GCC 7.5.0 (Ubuntu 7.5.0-6ubuntu2)                                 | Ubuntu 20.04.2 LTS | GitHub Actions |
| GCC 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)     | Windows-10.0.17763 | GitHub Actions |
| GCC 8.1.0 (i686-posix-dwarf-rev0, Built by MinGW-W64 project)     | Windows-10.0.17763 | GitHub Actions |
| GCC 8.4.0 (Ubuntu 8.4.0-3ubuntu2)                                 | Ubuntu 20.04.2 LTS | GitHub Actions |
| GCC 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)                          | Ubuntu 20.04.2 LTS | GitHub Actions |
| GCC 10.2.0 (Ubuntu 10.2.0-5ubuntu1~20.04)                         | Ubuntu 20.04.2 LTS | GitHub Actions |
| GCC 11.0.1 20210321 (experimental)                                | Ubuntu 20.04.2 LTS | GitHub Actions |
| GCC 11.1.0                                                        | Ubuntu (aarch64)   | Drone CI       |
| Clang 3.5.2 (3.5.2-3ubuntu1)                                      | Ubuntu 20.04.2 LTS | GitHub Actions |
| Clang 3.6.2 (3.6.2-3ubuntu2)                                      | Ubuntu 20.04.2 LTS | GitHub Actions |
| Clang 3.7.1 (3.7.1-2ubuntu2)                                      | Ubuntu 20.04.2 LTS | GitHub Actions |
| Clang 3.8.0 (3.8.0-2ubuntu4)                                      | Ubuntu 20.04.2 LTS | GitHub Actions |
| Clang 3.9.1 (3.9.1-4ubuntu3\~16.04.2)                             | Ubuntu 20.04.2 LTS | GitHub Actions |
| Clang 4.0.0 (4.0.0-1ubuntu1\~16.04.2)                             | Ubuntu 20.04.2 LTS | GitHub Actions |
| Clang 5.0.0 (5.0.0-3\~16.04.1)                                    | Ubuntu 20.04.2 LTS | GitHub Actions |
| Clang 6.0.1 (6.0.1-14)                                            | Ubuntu 20.04.2 LTS | GitHub Actions |
| Clang 7.0.1 (7.0.1-12)                                            | Ubuntu 20.04.2 LTS | GitHub Actions |
| Clang 8.0.1 (8.0.1-9)                                             | Ubuntu 20.04.2 LTS | GitHub Actions |
| Clang 9.0.1 (9.0.1-12)                                            | Ubuntu 20.04.2 LTS | GitHub Actions |
| Clang 10.0.0 (10.0.0-4ubuntu1)                                    | Ubuntu 20.04.2 LTS | GitHub Actions |
| Clang 10.0.0 with GNU-like command-line                           | Windows-10.0.17763 | GitHub Actions |
| Clang 11.0.0 with GNU-like command-line                           | Windows-10.0.17763 | GitHub Actions |
| Clang 11.0.0 with MSVC-like command-line                          | Windows-10.0.17763 | GitHub Actions |
| Clang 11.0.0 (11.0.0-2~ubuntu20.04.1)                             | Ubuntu 20.04.2 LTS | GitHub Actions |
| Clang 12.0.0 (12.0.0-3ubuntu1~20.04.3)                            | Ubuntu 20.04.2 LTS | GitHub Actions |
| Clang 13.0.0 (13.0.0-++20210828094952+9c49fee5e7ac-1exp120210828075752.71 | Ubuntu 20.04.2 LTS | GitHub Actions |
| Visual Studio 14 2015 MSVC 19.0.24241.7 (Build Engine version 14.0.25420.1) | Windows-6.3.9600 | AppVeyor |
| Visual Studio 15 2017 MSVC 19.16.27035.0 (Build Engine version 15.9.21+g9802d43bc3 for .NET Framework) | Windows-10.0.14393 | AppVeyor |
| Visual Studio 15 2017 MSVC 19.16.27045.0 (Build Engine version 15.9.21+g9802d43bc3 for .NET Framework) | Windows-10.0.14393 | GitHub Actions |
| Visual Studio 16 2019 MSVC 19.28.29912.0 (Build Engine version 16.9.0+57a23d249 for .NET Framework) | Windows-10.0.17763 | GitHub Actions |
| Visual Studio 16 2019 MSVC 19.28.29912.0 (Build Engine version 16.9.0+57a23d249 for .NET Framework) | Windows-10.0.17763 | AppVeyor |


## Integration

[`json.hpp`](https://github.com/nlohmann/json/blob/develop/single_include/nlohmann/json.hpp) is the single required file in `single_include/nlohmann` or [released here](https://github.com/nlohmann/json/releases). You need to add

```cpp
#include <nlohmann/json.hpp>

// for convenience
using json = nlohmann::json;
```

to the files you want to process JSON and set the necessary switches to enable C++11 (e.g., `-std=c++11` for GCC and Clang).

You can further use file [`include/nlohmann/json_fwd.hpp`](https://github.com/nlohmann/json/blob/develop/include/nlohmann/json_fwd.hpp) for forward-declarations. The installation of json_fwd.hpp (as part of cmake's install step), can be achieved by setting `-DJSON_MultipleHeaders=ON`.

### CMake

You can also use the `nlohmann_json::nlohmann_json` interface target in CMake.  This target populates the appropriate usage requirements for `INTERFACE_INCLUDE_DIRECTORIES` to point to the appropriate include directories and `INTERFACE_COMPILE_FEATURES` for the necessary C++11 flags.

#### External

To use this library from a CMake project, you can locate it directly with `find_package()` and use the namespaced imported target from the generated package configuration:

```cmake
# CMakeLists.txt
find_package(nlohmann_json 3.2.0 REQUIRED)
...
add_library(foo ...)
...
target_link_libraries(foo PRIVATE nlohmann_json::nlohmann_json)
```

The package configuration file, `nlohmann_jsonConfig.cmake`, can be used either from an install tree or directly out of the build tree.

#### Embedded

To embed the library directly into an existing CMake project, place the entire source tree in a subdirectory and call `add_subdirectory()` in your `CMakeLists.txt` file:

```cmake
# Typically you don't care so much for a third party library's tests to be
# run from your own project's code.
set(JSON_BuildTests OFF CACHE INTERNAL "")

# If you only include this third party in PRIVATE source files, you do not
# need to install it when your main project gets installed.
# set(JSON_Install OFF CACHE INTERNAL "")

# Don't use include(nlohmann_json/CMakeLists.txt) since that carries with it
# unintended consequences that will break the build.  It's generally
# discouraged (although not necessarily well documented as such) to use
# include(...) for pulling in other CMake projects anyways.
add_subdirectory(nlohmann_json)
...
add_library(foo ...)
...
target_link_libraries(foo PRIVATE nlohmann_json::nlohmann_json)
```

##### Embedded (FetchContent)

Since CMake v3.11,
[FetchContent](https://cmake.org/cmake/help/v3.11/module/FetchContent.html) can
be used to automatically download the repository as a dependency at configure time.

Example:
```cmake
include(FetchContent)

FetchContent_Declare(json
  GIT_REPOSITORY https://github.com/nlohmann/json.git
  GIT_TAG v3.7.3)

FetchContent_GetProperties(json)
if(NOT json_POPULATED)
  FetchContent_Populate(json)
  add_subdirectory(${json_SOURCE_DIR} ${json_BINARY_DIR} EXCLUDE_FROM_ALL)
endif()

target_link_libraries(foo PRIVATE nlohmann_json::nlohmann_json)
```

**Note**: The repository https://github.com/nlohmann/json download size is huge.
It contains all the dataset used for the benchmarks. You might want to depend on
a smaller repository. For instance, you might want to replace the URL above by
https://github.com/ArthurSonzogni/nlohmann_json_cmake_fetchcontent

#### Supporting Both

To allow your project to support either an externally supplied or an embedded JSON library, you can use a pattern akin to the following:

``` cmake
# Top level CMakeLists.txt
project(FOO)
...
option(FOO_USE_EXTERNAL_JSON "Use an external JSON library" OFF)
...
add_subdirectory(thirdparty)
...
add_library(foo ...)
...
# Note that the namespaced target will always be available regardless of the
# import method
target_link_libraries(foo PRIVATE nlohmann_json::nlohmann_json)
```
```cmake
# thirdparty/CMakeLists.txt
...
if(FOO_USE_EXTERNAL_JSON)
  find_package(nlohmann_json 3.2.0 REQUIRED)
else()
  set(JSON_BuildTests OFF CACHE INTERNAL "")
  add_subdirectory(nlohmann_json)
endif()
...
```

`thirdparty/nlohmann_json` is then a complete copy of this source tree.

### Package Managers

:beer: If you are using OS X and [Homebrew](https://brew.sh), just type `brew install nlohmann-json` and you're set. If you want the bleeding edge rather than the latest release, use `brew install nlohmann-json --HEAD`. See [nlohmann-json](https://formulae.brew.sh/formula/nlohmann-json) for more information.

If you are using the [Meson Build System](https://mesonbuild.com), add this source tree as a [meson subproject](https://mesonbuild.com/Subprojects.html#using-a-subproject). You may also use the `include.zip` published in this project's [Releases](https://github.com/nlohmann/json/releases) to reduce the size of the vendored source tree. Alternatively, you can get a wrap file by downloading it from [Meson WrapDB](https://wrapdb.mesonbuild.com/nlohmann_json), or simply use `meson wrap install nlohmann_json`. Please see the meson project for any issues regarding the packaging.

The provided meson.build can also be used as an alternative to cmake for installing `nlohmann_json` system-wide in which case a pkg-config file is installed. To use it, simply have your build system require the `nlohmann_json` pkg-config dependency. In Meson, it is preferred to use the [`dependency()`](https://mesonbuild.com/Reference-manual.html#dependency) object with a subproject fallback, rather than using the subproject directly.

If you are using [Conan](https://www.conan.io/) to manage your dependencies, merely add [`nlohmann_json/x.y.z`](https://conan.io/center/nlohmann_json) to your `conanfile`'s requires, where `x.y.z` is the release version you want to use. Please file issues [here](https://github.com/conan-io/conan-center-index/issues) if you experience problems with the packages.

If you are using [Spack](https://www.spack.io/) to manage your dependencies, you can use the [`nlohmann-json` package](https://spack.readthedocs.io/en/latest/package_list.html#nlohmann-json). Please see the [spack project](https://github.com/spack/spack) for any issues regarding the packaging.

If you are using [hunter](https://github.com/cpp-pm/hunter) on your project for external dependencies, then you can use the [nlohmann_json package](https://hunter.readthedocs.io/en/latest/packages/pkg/nlohmann_json.html). Please see the hunter project for any issues regarding the packaging.

If you are using [Buckaroo](https://buckaroo.pm), you can install this library's module with `buckaroo add github.com/buckaroo-pm/nlohmann-json`. Please file issues [here](https://github.com/buckaroo-pm/nlohmann-json). There is a demo repo [here](https://github.com/njlr/buckaroo-nholmann-json-example).

If you are using [vcpkg](https://github.com/Microsoft/vcpkg/) on your project for external dependencies, then you can install the [nlohmann-json package](https://github.com/Microsoft/vcpkg/tree/master/ports/nlohmann-json) with `vcpkg install nlohmann-json` and follow the then displayed descriptions. Please see the vcpkg project for any issues regarding the packaging.

If you are using [cget](https://cget.readthedocs.io/en/latest/), you can install the latest development version with `cget install nlohmann/json`. A specific version can be installed with `cget install nlohmann/json@v3.1.0`. Also, the multiple header version can be installed by adding the `-DJSON_MultipleHeaders=ON` flag (i.e., `cget install nlohmann/json -DJSON_MultipleHeaders=ON`).

If you are using [CocoaPods](https://cocoapods.org), you can use the library by adding pod `"nlohmann_json", '~>3.1.2'` to your podfile (see [an example](https://bitbucket.org/benman/nlohmann_json-cocoapod/src/master/)). Please file issues [here](https://bitbucket.org/benman/nlohmann_json-cocoapod/issues?status=new&status=open).

If you are using [NuGet](https://www.nuget.org), you can use the package [nlohmann.json](https://www.nuget.org/packages/nlohmann.json/). Please check [this extensive description](https://github.com/nlohmann/json/issues/1132#issuecomment-452250255) on how to use the package. Please files issues [here](https://github.com/hnkb/nlohmann-json-nuget/issues).

If you are using [conda](https://conda.io/), you can use the package [nlohmann_json](https://github.com/conda-forge/nlohmann_json-feedstock) from [conda-forge](https://conda-forge.org) executing `conda install -c conda-forge nlohmann_json`. Please file issues [here](https://github.com/conda-forge/nlohmann_json-feedstock/issues).

If you are using [MSYS2](https://www.msys2.org/), you can use the [mingw-w64-nlohmann-json](https://packages.msys2.org/base/mingw-w64-nlohmann-json) package, just type `pacman -S mingw-w64-i686-nlohmann-json` or `pacman -S mingw-w64-x86_64-nlohmann-json` for installation. Please file issues [here](https://github.com/msys2/MINGW-packages/issues/new?title=%5Bnlohmann-json%5D) if you experience problems with the packages.

If you are using [MacPorts](https://ports.macports.org), execute `sudo port install nlohmann-json` to install the [nlohmann-json](https://ports.macports.org/port/nlohmann-json/) package.

If you are using [`build2`](https://build2.org), you can use the [`nlohmann-json`](https://cppget.org/nlohmann-json) package from the public repository https://cppget.org or directly from the [package's sources repository](https://github.com/build2-packaging/nlohmann-json). In your project's `manifest` file, just add `depends: nlohmann-json` (probably with some [version constraints](https://build2.org/build2-toolchain/doc/build2-toolchain-intro.xhtml#guide-add-remove-deps)). If you are not familiar with using dependencies in `build2`, [please read this introduction](https://build2.org/build2-toolchain/doc/build2-toolchain-intro.xhtml).
Please file issues [here](https://github.com/build2-packaging/nlohmann-json) if you experience problems with the packages.

If you are using [`wsjcpp`](https://wsjcpp.org), you can use the command `wsjcpp install "https://github.com/nlohmann/json:develop"` to get the latest version. Note you can change the branch ":develop" to an existing tag or another branch.

If you are using [`CPM.cmake`](https://github.com/TheLartians/CPM.cmake), you can check this [`example`](https://github.com/TheLartians/CPM.cmake/tree/master/examples/json). After [adding CPM script](https://github.com/TheLartians/CPM.cmake#adding-cpm) to your project, implement the following snippet to your CMake:

```cmake
CPMAddPackage(
    NAME nlohmann_json
    GITHUB_REPOSITORY nlohmann/json
    VERSION 3.9.1)
```

### Pkg-config

If you are using bare Makefiles, you can use `pkg-config` to generate the include flags that point to where the library is installed:

```sh
pkg-config nlohmann_json --cflags
```

Users of the Meson build system will also be able to use a system wide library, which will be found by `pkg-config`:

```meson
json = dependency('nlohmann_json', required: true)
```


## License

<img align="right" src="https://opensource.org/trademarks/opensource/OSI-Approved-License-100x137.png">

The class is licensed under the [MIT License](https://opensource.org/licenses/MIT):

Copyright &copy; 2013-2021 [Niels Lohmann](https://nlohmann.me)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

* * *

The class contains the UTF-8 Decoder from Bjoern Hoehrmann which is licensed under the [MIT License](https://opensource.org/licenses/MIT) (see above). Copyright &copy; 2008-2009 [Björn Hoehrmann](https://bjoern.hoehrmann.de/) <bjoern@hoehrmann.de>

The class contains a slightly modified version of the Grisu2 algorithm from Florian Loitsch which is licensed under the [MIT License](https://opensource.org/licenses/MIT) (see above). Copyright &copy; 2009 [Florian Loitsch](https://florian.loitsch.com/)

The class contains a copy of [Hedley](https://nemequ.github.io/hedley/) from Evan Nemerson which is licensed as [CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/).

The class contains parts of [Google Abseil](https://github.com/abseil/abseil-cpp) which is licensed under the [Apache 2.0 License](https://opensource.org/licenses/Apache-2.0).

## Contact

If you have questions regarding the library, I would like to invite you to [open an issue at GitHub](https://github.com/nlohmann/json/issues/new/choose). Please describe your request, problem, or question as detailed as possible, and also mention the version of the library you are using as well as the version of your compiler and operating system. Opening an issue at GitHub allows other users and contributors to this library to collaborate. For instance, I have little experience with MSVC, and most issues in this regard have been solved by a growing community. If you have a look at the [closed issues](https://github.com/nlohmann/json/issues?q=is%3Aissue+is%3Aclosed), you will see that we react quite timely in most cases.

Only if your request would contain confidential information, please [send me an email](mailto:mail@nlohmann.me). For encrypted messages, please use [this key](https://keybase.io/nlohmann/pgp_keys.asc).

## Security

[Commits by Niels Lohmann](https://github.com/nlohmann/json/commits) and [releases](https://github.com/nlohmann/json/releases) are signed with this [PGP Key](https://keybase.io/nlohmann/pgp_keys.asc?fingerprint=797167ae41c0a6d9232e48457f3cea63ae251b69).

## Thanks

I deeply appreciate the help of the following people.

<img src="https://raw.githubusercontent.com/nlohmann/json/develop/doc/avatars.png" align="right">

- [Teemperor](https://github.com/Teemperor) implemented CMake support and lcov integration, realized escape and Unicode handling in the string parser, and fixed the JSON serialization.
- [elliotgoodrich](https://github.com/elliotgoodrich) fixed an issue with double deletion in the iterator classes.
- [kirkshoop](https://github.com/kirkshoop) made the iterators of the class composable to other libraries.
- [wancw](https://github.com/wanwc) fixed a bug that hindered the class to compile with Clang.
- Tomas Åblad found a bug in the iterator implementation.
- [Joshua C. Randall](https://github.com/jrandall) fixed a bug in the floating-point serialization.
- [Aaron Burghardt](https://github.com/aburgh) implemented code to parse streams incrementally. Furthermore, he greatly improved the parser class by allowing the definition of a filter function to discard undesired elements while parsing.
- [Daniel Kopeček](https://github.com/dkopecek) fixed a bug in the compilation with GCC 5.0.
- [Florian Weber](https://github.com/Florianjw) fixed a bug in and improved the performance of the comparison operators.
- [Eric Cornelius](https://github.com/EricMCornelius) pointed out a bug in the handling with NaN and infinity values. He also improved the performance of the string escaping.
- [易思龙](https://github.com/likebeta) implemented a conversion from anonymous enums.
- [kepkin](https://github.com/kepkin) patiently pushed forward the support for Microsoft Visual studio.
- [gregmarr](https://github.com/gregmarr) simplified the implementation of reverse iterators and helped with numerous hints and improvements. In particular, he pushed forward the implementation of user-defined types.
- [Caio Luppi](https://github.com/caiovlp) fixed a bug in the Unicode handling.
- [dariomt](https://github.com/dariomt) fixed some typos in the examples.
- [Daniel Frey](https://github.com/d-frey) cleaned up some pointers and implemented exception-safe memory allocation.
- [Colin Hirsch](https://github.com/ColinH) took care of a small namespace issue.
- [Huu Nguyen](https://github.com/whoshuu) correct a variable name in the documentation.
- [Silverweed](https://github.com/silverweed) overloaded `parse()` to accept an rvalue reference.
- [dariomt](https://github.com/dariomt) fixed a subtlety in MSVC type support and implemented the `get_ref()` function to get a reference to stored values.
- [ZahlGraf](https://github.com/ZahlGraf) added a workaround that allows compilation using Android NDK.
- [whackashoe](https://github.com/whackashoe) replaced a function that was marked as unsafe by Visual Studio.
- [406345](https://github.com/406345) fixed two small warnings.
- [Glen Fernandes](https://github.com/glenfe) noted a potential portability problem in the `has_mapped_type` function.
- [Corbin Hughes](https://github.com/nibroc) fixed some typos in the contribution guidelines.
- [twelsby](https://github.com/twelsby) fixed the array subscript operator, an issue that failed the MSVC build, and floating-point parsing/dumping. He further added support for unsigned integer numbers and implemented better roundtrip support for parsed numbers.
- [Volker Diels-Grabsch](https://github.com/vog) fixed a link in the README file.
- [msm-](https://github.com/msm-) added support for American Fuzzy Lop.
- [Annihil](https://github.com/Annihil) fixed an example in the README file.
- [Themercee](https://github.com/Themercee) noted a wrong URL in the README file.
- [Lv Zheng](https://github.com/lv-zheng) fixed a namespace issue with `int64_t` and `uint64_t`.
- [abc100m](https://github.com/abc100m) analyzed the issues with GCC 4.8 and proposed a [partial solution](https://github.com/nlohmann/json/pull/212).
- [zewt](https://github.com/zewt) added useful notes to the README file about Android.
- [Róbert Márki](https://github.com/robertmrk) added a fix to use move iterators and improved the integration via CMake.
- [Chris Kitching](https://github.com/ChrisKitching) cleaned up the CMake files.
- [Tom Needham](https://github.com/06needhamt) fixed a subtle bug with MSVC 2015 which was also proposed by [Michael K.](https://github.com/Epidal).
- [Mário Feroldi](https://github.com/thelostt) fixed a small typo.
- [duncanwerner](https://github.com/duncanwerner) found a really embarrassing performance regression in the 2.0.0 release.
- [Damien](https://github.com/dtoma) fixed one of the last conversion warnings.
- [Thomas Braun](https://github.com/t-b) fixed a warning in a test case and adjusted MSVC calls in the CI.
- [Théo DELRIEU](https://github.com/theodelrieu) patiently and constructively oversaw the long way toward [iterator-range parsing](https://github.com/nlohmann/json/issues/290). He also implemented the magic behind the serialization/deserialization of user-defined types and split the single header file into smaller chunks.
- [Stefan](https://github.com/5tefan) fixed a minor issue in the documentation.
- [Vasil Dimov](https://github.com/vasild) fixed the documentation regarding conversions from `std::multiset`.
- [ChristophJud](https://github.com/ChristophJud) overworked the CMake files to ease project inclusion.
- [Vladimir Petrigo](https://github.com/vpetrigo) made a SFINAE hack more readable and added Visual Studio 17 to the build matrix.
- [Denis Andrejew](https://github.com/seeekr) fixed a grammar issue in the README file.
- [Pierre-Antoine Lacaze](https://github.com/palacaze) found a subtle bug in the `dump()` function.
- [TurpentineDistillery](https://github.com/TurpentineDistillery) pointed to [`std::locale::classic()`](https://en.cppreference.com/w/cpp/locale/locale/classic) to avoid too much locale joggling, found some nice performance improvements in the parser, improved the benchmarking code, and realized locale-independent number parsing and printing.
- [cgzones](https://github.com/cgzones) had an idea how to fix the Coverity scan.
- [Jared Grubb](https://github.com/jaredgrubb) silenced a nasty documentation warning.
- [Yixin Zhang](https://github.com/qwename) fixed an integer overflow check.
- [Bosswestfalen](https://github.com/Bosswestfalen) merged two iterator classes into a smaller one.
- [Daniel599](https://github.com/Daniel599) helped to get Travis execute the tests with Clang's sanitizers.
- [Jonathan Lee](https://github.com/vjon) fixed an example in the README file.
- [gnzlbg](https://github.com/gnzlbg) supported the implementation of user-defined types.
- [Alexej Harm](https://github.com/qis) helped to get the user-defined types working with Visual Studio.
- [Jared Grubb](https://github.com/jaredgrubb) supported the implementation of user-defined types.
- [EnricoBilla](https://github.com/EnricoBilla) noted a typo in an example.
- [Martin Hořeňovský](https://github.com/horenmar) found a way for a 2x speedup for the compilation time of the test suite.
- [ukhegg](https://github.com/ukhegg) found proposed an improvement for the examples section.
- [rswanson-ihi](https://github.com/rswanson-ihi) noted a typo in the README.
- [Mihai Stan](https://github.com/stanmihai4) fixed a bug in the comparison with `nullptr`s.
- [Tushar Maheshwari](https://github.com/tusharpm) added [cotire](https://github.com/sakra/cotire) support to speed up the compilation.
- [TedLyngmo](https://github.com/TedLyngmo) noted a typo in the README, removed unnecessary bit arithmetic, and fixed some `-Weffc++` warnings.
- [Krzysztof Woś](https://github.com/krzysztofwos) made exceptions more visible.
- [ftillier](https://github.com/ftillier) fixed a compiler warning.
- [tinloaf](https://github.com/tinloaf) made sure all pushed warnings are properly popped.
- [Fytch](https://github.com/Fytch) found a bug in the documentation.
- [Jay Sistar](https://github.com/Type1J) implemented a Meson build description.
- [Henry Lee](https://github.com/HenryRLee) fixed a warning in ICC and improved the iterator implementation.
- [Vincent Thiery](https://github.com/vthiery) maintains a package for the Conan package manager.
- [Steffen](https://github.com/koemeet) fixed a potential issue with MSVC and `std::min`.
- [Mike Tzou](https://github.com/Chocobo1) fixed some typos.
- [amrcode](https://github.com/amrcode) noted a misleading documentation about comparison of floats.
- [Oleg Endo](https://github.com/olegendo) reduced the memory consumption by replacing `<iostream>` with `<iosfwd>`.
- [dan-42](https://github.com/dan-42) cleaned up the CMake files to simplify including/reusing of the library.
- [Nikita Ofitserov](https://github.com/himikof) allowed for moving values from initializer lists.
- [Greg Hurrell](https://github.com/wincent) fixed a typo.
- [Dmitry Kukovinets](https://github.com/DmitryKuk) fixed a typo.
- [kbthomp1](https://github.com/kbthomp1) fixed an issue related to the Intel OSX compiler.
- [Markus Werle](https://github.com/daixtrose) fixed a typo.
- [WebProdPP](https://github.com/WebProdPP) fixed a subtle error in a precondition check.
- [Alex](https://github.com/leha-bot) noted an error in a code sample.
- [Tom de Geus](https://github.com/tdegeus) reported some warnings with ICC and helped fixing them.
- [Perry Kundert](https://github.com/pjkundert) simplified reading from input streams.
- [Sonu Lohani](https://github.com/sonulohani) fixed a small compilation error.
- [Jamie Seward](https://github.com/jseward) fixed all MSVC warnings.
- [Nate Vargas](https://github.com/eld00d) added a Doxygen tag file.
- [pvleuven](https://github.com/pvleuven) helped fixing a warning in ICC.
- [Pavel](https://github.com/crea7or) helped fixing some warnings in MSVC.
- [Jamie Seward](https://github.com/jseward) avoided unnecessary string copies in `find()` and `count()`.
- [Mitja](https://github.com/Itja) fixed some typos.
- [Jorrit Wronski](https://github.com/jowr) updated the Hunter package links.
- [Matthias Möller](https://github.com/TinyTinni) added a `.natvis` for the MSVC debug view.
- [bogemic](https://github.com/bogemic) fixed some C++17 deprecation warnings.
- [Eren Okka](https://github.com/erengy) fixed some MSVC warnings.
- [abolz](https://github.com/abolz) integrated the Grisu2 algorithm for proper floating-point formatting, allowing more roundtrip checks to succeed.
- [Vadim Evard](https://github.com/Pipeliner) fixed a Markdown issue in the README.
- [zerodefect](https://github.com/zerodefect) fixed a compiler warning.
- [Kert](https://github.com/kaidokert) allowed to template the string type in the serialization and added the possibility to override the exceptional behavior.
- [mark-99](https://github.com/mark-99) helped fixing an ICC error.
- [Patrik Huber](https://github.com/patrikhuber) fixed links in the README file.
- [johnfb](https://github.com/johnfb) found a bug in the implementation of CBOR's indefinite length strings.
- [Paul Fultz II](https://github.com/pfultz2) added a note on the cget package manager.
- [Wilson Lin](https://github.com/wla80) made the integration section of the README more concise.
- [RalfBielig](https://github.com/ralfbielig) detected and fixed a memory leak in the parser callback.
- [agrianius](https://github.com/agrianius) allowed to dump JSON to an alternative string type.
- [Kevin Tonon](https://github.com/ktonon) overworked the C++11 compiler checks in CMake.
- [Axel Huebl](https://github.com/ax3l) simplified a CMake check and added support for the [Spack package manager](https://spack.io).
- [Carlos O'Ryan](https://github.com/coryan) fixed a typo.
- [James Upjohn](https://github.com/jammehcow) fixed a version number in the compilers section.
- [Chuck Atkins](https://github.com/chuckatkins) adjusted the CMake files to the CMake packaging guidelines and provided documentation for the CMake integration.
- [Jan Schöppach](https://github.com/dns13) fixed a typo.
- [martin-mfg](https://github.com/martin-mfg) fixed a typo.
- [Matthias Möller](https://github.com/TinyTinni) removed the dependency from `std::stringstream`.
- [agrianius](https://github.com/agrianius) added code to use alternative string implementations.
- [Daniel599](https://github.com/Daniel599) allowed to use more algorithms with the `items()` function.
- [Julius Rakow](https://github.com/jrakow) fixed the Meson include directory and fixed the links to [cppreference.com](cppreference.com).
- [Sonu Lohani](https://github.com/sonulohani) fixed the compilation with MSVC 2015 in debug mode.
- [grembo](https://github.com/grembo) fixed the test suite and re-enabled several test cases.
- [Hyeon Kim](https://github.com/simnalamburt) introduced the macro `JSON_INTERNAL_CATCH` to control the exception handling inside the library.
- [thyu](https://github.com/thyu) fixed a compiler warning.
- [David Guthrie](https://github.com/LEgregius) fixed a subtle compilation error with Clang 3.4.2.
- [Dennis Fischer](https://github.com/dennisfischer) allowed to call `find_package` without installing the library.
- [Hyeon Kim](https://github.com/simnalamburt) fixed an issue with a double macro definition.
- [Ben Berman](https://github.com/rivertam) made some error messages more understandable.
- [zakalibit](https://github.com/zakalibit) fixed a compilation problem with the Intel C++ compiler.
- [mandreyel](https://github.com/mandreyel) fixed a compilation problem.
- [Kostiantyn Ponomarenko](https://github.com/koponomarenko) added version and license information to the Meson build file.
- [Henry Schreiner](https://github.com/henryiii) added support for GCC 4.8.
- [knilch](https://github.com/knilch0r) made sure the test suite does not stall when run in the wrong directory.
- [Antonio Borondo](https://github.com/antonioborondo) fixed an MSVC 2017 warning.
- [Dan Gendreau](https://github.com/dgendreau) implemented the `NLOHMANN_JSON_SERIALIZE_ENUM` macro to quickly define a enum/JSON mapping.
- [efp](https://github.com/efp) added line and column information to parse errors.
- [julian-becker](https://github.com/julian-becker) added BSON support.
- [Pratik Chowdhury](https://github.com/pratikpc) added support for structured bindings.
- [David Avedissian](https://github.com/davedissian) added support for Clang 5.0.1 (PS4 version).
- [Jonathan Dumaresq](https://github.com/dumarjo) implemented an input adapter to read from `FILE*`.
- [kjpus](https://github.com/kjpus) fixed a link in the documentation.
- [Manvendra Singh](https://github.com/manu-chroma) fixed a typo in the documentation.
- [ziggurat29](https://github.com/ziggurat29) fixed an MSVC warning.
- [Sylvain Corlay](https://github.com/SylvainCorlay) added code to avoid an issue with MSVC.
- [mefyl](https://github.com/mefyl) fixed a bug when JSON was parsed from an input stream.
- [Millian Poquet](https://github.com/mpoquet) allowed to install the library via Meson.
- [Michael Behrns-Miller](https://github.com/moodboom) found an issue with a missing namespace.
- [Nasztanovics Ferenc](https://github.com/naszta) fixed a compilation issue with libc 2.12.
- [Andreas Schwab](https://github.com/andreas-schwab) fixed the endian conversion.
- [Mark-Dunning](https://github.com/Mark-Dunning) fixed a warning in MSVC.
- [Gareth Sylvester-Bradley](https://github.com/garethsb-sony) added `operator/` for JSON Pointers.
- [John-Mark](https://github.com/johnmarkwayve) noted a missing header.
- [Vitaly Zaitsev](https://github.com/xvitaly) fixed compilation with GCC 9.0.
- [Laurent Stacul](https://github.com/stac47) fixed compilation with GCC 9.0.
- [Ivor Wanders](https://github.com/iwanders) helped reducing the CMake requirement to version 3.1.
- [njlr](https://github.com/njlr) updated the Buckaroo instructions.
- [Lion](https://github.com/lieff) fixed a compilation issue with GCC 7 on CentOS.
- [Isaac Nickaein](https://github.com/nickaein) improved the integer serialization performance and  implemented the `contains()` function.
- [past-due](https://github.com/past-due) suppressed an unfixable warning.
- [Elvis Oric](https://github.com/elvisoric) improved Meson support.
- [Matěj Plch](https://github.com/Afforix) fixed an example in the README.
- [Mark Beckwith](https://github.com/wythe) fixed a typo.
- [scinart](https://github.com/scinart) fixed bug in the serializer.
- [Patrick Boettcher](https://github.com/pboettch) implemented `push_back()` and `pop_back()` for JSON Pointers.
- [Bruno Oliveira](https://github.com/nicoddemus) added support for Conda.
- [Michele Caini](https://github.com/skypjack) fixed links in the README.
- [Hani](https://github.com/hnkb) documented how to install the library with NuGet.
- [Mark Beckwith](https://github.com/wythe) fixed a typo.
- [yann-morin-1998](https://github.com/yann-morin-1998) helped reducing the CMake requirement to version 3.1.
- [Konstantin Podsvirov](https://github.com/podsvirov) maintains a package for the MSYS2 software distro.
- [remyabel](https://github.com/remyabel) added GNUInstallDirs to the CMake files.
- [Taylor Howard](https://github.com/taylorhoward92) fixed a unit test.
- [Gabe Ron](https://github.com/Macr0Nerd) implemented the `to_string` method.
- [Watal M. Iwasaki](https://github.com/heavywatal) fixed a Clang warning.
- [Viktor Kirilov](https://github.com/onqtam) switched the unit tests from [Catch](https://github.com/philsquared/Catch) to [doctest](https://github.com/onqtam/doctest)
- [Juncheng E](https://github.com/ejcjason) fixed a typo.
- [tete17](https://github.com/tete17) fixed a bug in the `contains` function.
- [Xav83](https://github.com/Xav83) fixed some cppcheck warnings.
- [0xflotus](https://github.com/0xflotus) fixed some typos.
- [Christian Deneke](https://github.com/chris0x44) added a const version of `json_pointer::back`.
- [Julien Hamaide](https://github.com/crazyjul) made the `items()` function work with custom string types.
- [Evan Nemerson](https://github.com/nemequ) updated fixed a bug in Hedley and updated this library accordingly.
- [Florian Pigorsch](https://github.com/flopp) fixed a lot of typos.
- [Camille Bégué](https://github.com/cbegue) fixed an issue in the conversion from  `std::pair` and `std::tuple` to `json`.
- [Anthony VH](https://github.com/AnthonyVH) fixed a compile error in an enum deserialization.
- [Yuriy Vountesmery](https://github.com/ua-code-dragon) noted a subtle bug in a preprocessor check.
- [Chen](https://github.com/dota17) fixed numerous issues in the library.
- [Antony Kellermann](https://github.com/aokellermann) added a CI step for GCC 10.1.
- [Alex](https://github.com/gistrec) fixed an MSVC warning.
- [Rainer](https://github.com/rvjr) proposed an improvement in the floating-point serialization in CBOR.
- [Francois Chabot](https://github.com/FrancoisChabot) made performance improvements in the input adapters.
- [Arthur Sonzogni](https://github.com/ArthurSonzogni) documented how the library can be included via `FetchContent`.
- [Rimas Misevičius](https://github.com/rmisev) fixed an error message.
- [Alexander Myasnikov](https://github.com/alexandermyasnikov) fixed some examples and a link in the README.
- [Hubert Chathi](https://github.com/uhoreg) made CMake's version config file architecture-independent.
- [OmnipotentEntity](https://github.com/OmnipotentEntity) implemented the binary values for CBOR, MessagePack, BSON, and UBJSON.
- [ArtemSarmini](https://github.com/ArtemSarmini) fixed a compilation issue with GCC 10 and fixed a leak.
- [Evgenii Sopov](https://github.com/sea-kg) integrated the library to the wsjcpp package manager.
- [Sergey Linev](https://github.com/linev) fixed a compiler warning.
- [Miguel Magalhães](https://github.com/magamig) fixed the year in the copyright.
- [Gareth Sylvester-Bradley](https://github.com/garethsb-sony) fixed a compilation issue with MSVC.
- [Alexander “weej” Jones](https://github.com/alex-weej) fixed an example in the README.
- [Antoine Cœur](https://github.com/Coeur) fixed some typos in the documentation.
- [jothepro](https://github.com/jothepro) updated links to the Hunter package.
- [Dave Lee](https://github.com/kastiglione) fixed link in the README.
- [Joël Lamotte](https://github.com/Klaim) added instruction for using Build2's package manager.
- [Paul Jurczak](https://github.com/pauljurczak) fixed an example in the README.
- [Sonu Lohani](https://github.com/sonulohani) fixed a warning.
- [Carlos Gomes Martinho](https://github.com/gocarlos) updated the Conan package source.
- [Konstantin Podsvirov](https://github.com/podsvirov) fixed the MSYS2 package documentation.
- [Tridacnid](https://github.com/Tridacnid) improved the CMake tests.
- [Michael](https://github.com/MBalszun) fixed MSVC warnings.
- [Quentin Barbarat](https://github.com/quentin-dev) fixed an example in the documentation.
- [XyFreak](https://github.com/XyFreak) fixed a compiler warning.
- [TotalCaesar659](https://github.com/TotalCaesar659) fixed links in the README.
- [Tanuj Garg](https://github.com/tanuj208) improved the fuzzer coverage for UBSAN input.
- [AODQ](https://github.com/AODQ) fixed a compiler warning.
- [jwittbrodt](https://github.com/jwittbrodt) made `NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE` inline.
- [pfeatherstone](https://github.com/pfeatherstone) improved the upper bound of arguments of the `NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE`/`NLOHMANN_DEFINE_TYPE_INTRUSIVE` macros.
- [Jan Procházka](https://github.com/jprochazk) fixed a bug in the CBOR parser for binary and string values.
- [T0b1-iOS](https://github.com/T0b1-iOS) fixed a bug in the new hash implementation.
- [Matthew Bauer](https://github.com/matthewbauer) adjusted the CBOR writer to create tags for binary subtypes.
- [gatopeich](https://github.com/gatopeich) implemented an ordered map container for `nlohmann::ordered_json`.
- [Érico Nogueira Rolim](https://github.com/ericonr) added support for pkg-config.
- [KonanM](https://github.com/KonanM) proposed an implementation for the `NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE`/`NLOHMANN_DEFINE_TYPE_INTRUSIVE` macros.
- [Guillaume Racicot](https://github.com/gracicot) implemented `string_view` support and allowed C++20 support.
- [Alex Reinking](https://github.com/alexreinking) improved CMake support for `FetchContent`.
- [Hannes Domani](https://github.com/ssbssa) provided a GDB pretty printer.
- Lars Wirzenius reviewed the README file.
- [Jun Jie](https://github.com/ongjunjie) fixed a compiler path in the CMake scripts.
- [Ronak Buch](https://github.com/rbuch) fixed typos in the documentation.
- [Alexander Karzhenkov](https://github.com/karzhenkov) fixed a move constructor and the Travis builds.
- [Leonardo Lima](https://github.com/leozz37) added CPM.Cmake support.
- [Joseph Blackman](https://github.com/jbzdarkid) fixed a warning.
- [Yaroslav](https://github.com/YarikTH) updated doctest and implemented unit tests.
- [Martin Stump](https://github.com/globberwops) fixed a bug in the CMake files.
- [Jaakko Moisio](https://github.com/jasujm) fixed a bug in the input adapters.
- [bl-ue](https://github.com/bl-ue) fixed some Markdown issues in the README file.
- [William A. Wieselquist](https://github.com/wawiesel) fixed an example from the README.
- [abbaswasim](https://github.com/abbaswasim) fixed an example from the README.
- [Remy Jette](https://github.com/remyjette) fixed a warning.
- [Fraser](https://github.com/frasermarlow) fixed the documentation.
- [Ben Beasley](https://github.com/musicinmybrain) updated doctest.
- [Doron Behar](https://github.com/doronbehar) fixed pkg-config.pc.
- [raduteo](https://github.com/raduteo) fixed a warning.
- [David Pfahler](https://github.com/theShmoo) added the possibility to compile the library without I/O support.
- [Morten Fyhn Amundsen](https://github.com/mortenfyhn) fixed a typo.
- [jpl-mac](https://github.com/jpl-mac) allowed to treat the library as a system header in CMake.
- [Jason Dsouza](https://github.com/jasmcaus) fixed the indentation of the CMake file.
- [offa](https://github.com/offa) added a link to Conan Center to the documentation.
- [TotalCaesar659](https://github.com/TotalCaesar659) updated the links in the documentation to use HTTPS.
- [Rafail Giavrimis](https://github.com/grafail) fixed the Google Benchmark default branch.
- [Louis Dionne](https://github.com/ldionne) fixed a conversion operator.
- [justanotheranonymoususer](https://github.co
Download .txt
gitextract_68bzuhg8/

├── .github/
│   └── workflows/
│       └── build.yml
├── .gitignore
├── CMakeLists.txt
├── LICENSE
├── README.md
├── bin/
│   ├── D2RMH.ini
│   ├── D2RMH_gamedata.ini
│   ├── D2RMH_item.ini
│   └── plugins/
│       ├── chicken_life.lua
│       ├── hotkey.lua
│       └── town_portal_check.lua
├── build_msvc2019.bat
├── build_msvc2022.bat
├── build_msys2_clang.bat
├── build_msys2_mingw.bat
├── cmake/
│   ├── CustomCompilerOptions.cmake
│   └── GetVersion.cmake
├── contrib/
│   └── zhCN/
│       ├── D2RMH.ini
│       ├── README.md
│       └── plugins/
│           ├── chicken_life.lua
│           └── town_portal_check.lua
├── copy_dist.bat
├── d2mapapi/
│   ├── .gitignore
│   ├── .gitrepo
│   ├── CMakeLists.txt
│   ├── LICENSE
│   ├── README.md
│   ├── cmake/
│   │   └── CustomCompilerOptions.cmake
│   ├── collisionmap.cpp
│   ├── collisionmap.h
│   ├── crc32.h
│   ├── d2map.cpp
│   ├── d2map.h
│   ├── d2ptrs.h
│   ├── d2structs.h
│   ├── genimage.cpp
│   ├── host.cpp
│   ├── httpd.cpp
│   ├── json/
│   │   ├── LICENSE.MIT
│   │   ├── README.md
│   │   └── json.hpp
│   ├── mapdata.cpp
│   ├── mapdata.h
│   ├── offset.cpp
│   ├── offset.h
│   ├── pathfinder.cpp
│   ├── pathfinder.h
│   ├── piped.cpp
│   ├── pipehost.cpp
│   ├── pipehost.h
│   ├── session.cpp
│   ├── session.h
│   ├── simphttp/
│   │   ├── CMakeLists.txt
│   │   ├── cmake/
│   │   │   └── FindLibUV.cmake
│   │   ├── llhttp/
│   │   │   ├── CMakeLists.txt
│   │   │   ├── api.c
│   │   │   ├── api.h
│   │   │   ├── http.c
│   │   │   ├── llhttp.c
│   │   │   └── llhttp.h
│   │   ├── simphttp.cpp
│   │   ├── simphttp.h
│   │   └── uri.h
│   └── stb/
│       └── stb_image_write.h
├── deps/
│   ├── CMakeLists.txt
│   ├── CascLib/
│   │   ├── CMakeLists.txt
│   │   ├── LICENSE
│   │   ├── README.md
│   │   └── src/
│   │       ├── CascCommon.h
│   │       ├── CascDecompress.cpp
│   │       ├── CascDecrypt.cpp
│   │       ├── CascDumpData.cpp
│   │       ├── CascFiles.cpp
│   │       ├── CascFindFile.cpp
│   │       ├── CascIndexFiles.cpp
│   │       ├── CascLib.h
│   │       ├── CascOpenFile.cpp
│   │       ├── CascOpenStorage.cpp
│   │       ├── CascPort.h
│   │       ├── CascReadFile.cpp
│   │       ├── CascRootFile_Diablo3.cpp
│   │       ├── CascRootFile_Install.cpp
│   │       ├── CascRootFile_MNDX.cpp
│   │       ├── CascRootFile_OW.cpp
│   │       ├── CascRootFile_TVFS.cpp
│   │       ├── CascRootFile_Text.cpp
│   │       ├── CascRootFile_WoW.cpp
│   │       ├── CascStructs.h
│   │       ├── DllMain.c
│   │       ├── DllMain.def
│   │       ├── DllMain.rc
│   │       ├── common/
│   │       │   ├── Array.h
│   │       │   ├── Common.cpp
│   │       │   ├── Common.h
│   │       │   ├── Csv.cpp
│   │       │   ├── Csv.h
│   │       │   ├── Directory.cpp
│   │       │   ├── Directory.h
│   │       │   ├── FileStream.cpp
│   │       │   ├── FileStream.h
│   │       │   ├── FileTree.cpp
│   │       │   ├── FileTree.h
│   │       │   ├── IndexMap.h
│   │       │   ├── ListFile.cpp
│   │       │   ├── ListFile.h
│   │       │   ├── Map.h
│   │       │   ├── Mime.cpp
│   │       │   ├── Mime.h
│   │       │   ├── Path.h
│   │       │   ├── RootHandler.cpp
│   │       │   ├── RootHandler.h
│   │       │   ├── Sockets.cpp
│   │       │   └── Sockets.h
│   │       ├── jenkins/
│   │       │   ├── lookup.h
│   │       │   └── lookup3.c
│   │       ├── md5/
│   │       │   ├── md5.cpp
│   │       │   └── md5.h
│   │       ├── resource.h
│   │       └── zlib/
│   │           ├── adler32.c
│   │           ├── crc32.c
│   │           ├── crc32.h
│   │           ├── deflate.c
│   │           ├── deflate.h
│   │           ├── gzguts.h
│   │           ├── inffast.c
│   │           ├── inffast.h
│   │           ├── inffixed.h
│   │           ├── inflate.c
│   │           ├── inflate.h
│   │           ├── inftrees.c
│   │           ├── inftrees.h
│   │           ├── trees.c
│   │           ├── trees.h
│   │           ├── zconf.h
│   │           ├── zlib.h
│   │           ├── zutil.c
│   │           └── zutil.h
│   ├── glad/
│   │   ├── CMakeLists.txt
│   │   ├── include/
│   │   │   ├── KHR/
│   │   │   │   └── khrplatform.h
│   │   │   └── glad/
│   │   │       ├── glad.h
│   │   │       └── glad_wgl.h
│   │   └── src/
│   │       ├── glad.c
│   │       └── glad_wgl.c
│   ├── inih/
│   │   ├── CMakeLists.txt
│   │   ├── LICENSE.txt
│   │   ├── README.md
│   │   ├── ini.c
│   │   └── ini.h
│   ├── sol3/
│   │   ├── CMakeLists.txt
│   │   ├── CONTRIBUTORS.md
│   │   ├── LICENSE.txt
│   │   ├── README.md
│   │   └── include/
│   │       └── sol/
│   │           ├── config.hpp
│   │           ├── forward.hpp
│   │           └── sol.hpp
│   └── stb/
│       ├── CMakeLists.txt
│       ├── stb_rect_pack.h
│       └── stb_truetype.h
├── doc/
│   ├── ChangeLog.md
│   ├── ItemDesc.md
│   ├── KeyMapping.md
│   ├── LICENSE.lua54
│   ├── Plugin.md
│   ├── Skill.md
│   └── TODO.md
└── src/
    ├── CMakeLists.txt
    ├── cfg.cpp
    ├── cfg.h
    ├── d2r/
    │   ├── d2rdefs.h
    │   ├── mapstructs.h
    │   ├── processdata.cpp
    │   ├── processdata.h
    │   ├── processmanager.cpp
    │   ├── processmanager.h
    │   ├── storage.cpp
    │   ├── storage.h
    │   └── stringdefs.inl
    ├── data/
    │   ├── d2txt.cpp
    │   ├── d2txt.h
    │   ├── gamedata.cpp
    │   ├── gamedata.h
    │   └── viewstream.h
    ├── main.cpp
    ├── plugin/
    │   ├── plugin.cpp
    │   └── plugin.h
    ├── render/
    │   ├── HandmadeMath.h
    │   ├── d2font.cpp
    │   ├── d2font.h
    │   ├── font.cpp
    │   ├── font.h
    │   ├── fontrenderimpl.h
    │   ├── renderer.cpp
    │   ├── renderer.h
    │   ├── ttf.cpp
    │   ├── ttf.h
    │   ├── ttfgl.cpp
    │   └── ttfgl.h
    ├── res/
    │   ├── D2RMH.manifest
    │   ├── manifest.rc
    │   └── res.rc
    ├── ui/
    │   ├── maprenderer.cpp
    │   ├── maprenderer.h
    │   ├── window.cpp
    │   └── window.h
    └── util/
        ├── ntprocess.cpp
        ├── ntprocess.h
        ├── os_structs.cpp
        ├── os_structs.h
        ├── util.cpp
        └── util.h
Copy disabled (too large) Download .txt
Showing preview only (577,245K chars total). Download the full file to get everything.
SYMBOL INDEX (5895 symbols across 139 files)

FILE: d2mapapi/collisionmap.cpp
  type d2mapapi (line 7) | namespace d2mapapi {
    function to_json (line 20) | void to_json(nlohmann::json &j, const std::map<uint32_t, T> &objs) {
    function from_json (line 27) | void from_json(const nlohmann::json &j, std::map<uint32_t, T> &objs) {

FILE: d2mapapi/collisionmap.h
  function namespace (line 8) | namespace d2mapapi {

FILE: d2mapapi/crc32.h
  function namespace (line 4) | namespace crc {

FILE: d2mapapi/d2map.cpp
  type d2mapapi (line 9) | namespace d2mapapi {
    function D2CLIENT_InitGameMisc (line 73) | void __declspec(naked) D2CLIENT_InitGameMisc(void)
    function D2CLIENT_InitGameMisc (line 86) | void __attribute__((naked)) D2CLIENT_InitGameMisc() {
    function D2ClientInterface (line 100) | uint32_t D2ClientInterface() {

FILE: d2mapapi/d2map.h
  function namespace (line 5) | namespace d2mapapi {

FILE: d2mapapi/d2ptrs.h
  function namespace (line 11) | namespace d2mapapi {

FILE: d2mapapi/d2structs.h
  type UnitAny (line 8) | struct UnitAny
  type Room1_111 (line 9) | struct Room1_111
  type Room1_112 (line 10) | struct Room1_112
  type Room1_113 (line 11) | struct Room1_113
  type Room2_111 (line 12) | struct Room2_111
  type Room2_112 (line 13) | struct Room2_112
  type Room2_113 (line 14) | struct Room2_113
  type Level111 (line 15) | struct Level111
  type Level112 (line 16) | struct Level112
  type Level113 (line 17) | struct Level113
  type Act111 (line 18) | struct Act111
  type Act112 (line 19) | struct Act112
  type Act113 (line 20) | struct Act113
  type ActMisc111 (line 21) | struct ActMisc111
  type ActMisc112 (line 22) | struct ActMisc112
  type ActMisc113 (line 23) | struct ActMisc113
  type d2client_struct_112 (line 36) | struct d2client_struct_112 {
  type d2client_struct_113 (line 42) | struct d2client_struct_113 {
  type CollMap (line 48) | struct CollMap {
  type RoomTile111 (line 61) | struct RoomTile111 {
  type RoomTile112 (line 68) | struct RoomTile112 {
  type RoomTile113 (line 75) | struct RoomTile113 {
  type PresetUnit111 (line 82) | struct PresetUnit111 {
  type PresetUnit112 (line 92) | struct PresetUnit112 {
  type PresetUnit113 (line 102) | struct PresetUnit113 {
  type Level111 (line 112) | struct Level111 {
  type Level112 (line 128) | struct Level112 {
  type Level113 (line 146) | struct Level113 {
  type Room2_111 (line 162) | struct Room2_111 {
  type Room2_112 (line 184) | struct Room2_112 {
  type Room2_113 (line 204) | struct Room2_113 {
  type Room1_111 (line 224) | struct Room1_111 {
  type Room1_112 (line 246) | struct Room1_112 {
  type Room1_113 (line 267) | struct Room1_113 {
  type ActMisc111 (line 285) | struct ActMisc111 {
  type ActMisc112 (line 295) | struct ActMisc112 {
  type ActMisc113 (line 304) | struct ActMisc113 {
  type Act111 (line 313) | struct Act111 {
  type Act112 (line 318) | struct Act112 {
  type Act113 (line 326) | struct Act113 {

FILE: d2mapapi/genimage.cpp
  function wmain (line 23) | int wmain(int argc, wchar_t *argv[]) {

FILE: d2mapapi/host.cpp
  function main (line 5) | int main(int argc, char *argv[]) {

FILE: d2mapapi/httpd.cpp
  function wmain (line 22) | int wmain(int argc, wchar_t *argv[]) {

FILE: d2mapapi/json/json.hpp
  type nlohmann (line 88) | namespace nlohmann
    type detail (line 90) | namespace detail
      type value_t (line 120) | enum class value_t : std::uint8_t
      type make_void (line 2229) | struct make_void
      type nonesuch (line 2243) | struct nonesuch
        method nonesuch (line 2245) | nonesuch() = delete;
        method nonesuch (line 2247) | nonesuch(nonesuch const&) = delete;
        method nonesuch (line 2248) | nonesuch(nonesuch const&&) = delete;
      type detector (line 2257) | struct detector
      type is_detected_lazy (line 2274) | struct is_detected_lazy : is_detected<Op, Args...> { }
      function replace_substring (line 2656) | inline void replace_substring(std::string& s, const std::string& f,
      function escape (line 2674) | inline std::string escape(std::string s)
      function unescape (line 2688) | static void unescape(std::string& s)
      type position_t (line 2707) | struct position_t
      class exception (line 2765) | class exception : public std::exception
        method JSON_HEDLEY_NON_NULL (line 2778) | JSON_HEDLEY_NON_NULL(3)
        method name (line 2781) | static std::string name(const std::string& ename, int id_)
        method diagnostics (line 2787) | static std::string diagnostics(const BasicJsonType& leaf_element)
      class parse_error (line 2900) | class parse_error : public exception
        method parse_error (line 2913) | static parse_error create(int id_, const position_t& pos, const st...
        method parse_error (line 2921) | static parse_error create(int id_, std::size_t byte_, const std::s...
        method parse_error (line 2941) | parse_error(int id_, std::size_t byte_, const char* what_arg)
        method position_string (line 2944) | static std::string position_string(const position_t& pos)
      class invalid_iterator (line 2988) | class invalid_iterator : public exception
        method invalid_iterator (line 2992) | static invalid_iterator create(int id_, const std::string& what_ar...
        method JSON_HEDLEY_NON_NULL (line 2999) | JSON_HEDLEY_NON_NULL(3)
      class type_error (line 3043) | class type_error : public exception
        method type_error (line 3047) | static type_error create(int id_, const std::string& what_arg, con...
        method JSON_HEDLEY_NON_NULL (line 3054) | JSON_HEDLEY_NON_NULL(3)
      class out_of_range (line 3091) | class out_of_range : public exception
        method out_of_range (line 3095) | static out_of_range create(int id_, const std::string& what_arg, c...
        method JSON_HEDLEY_NON_NULL (line 3102) | JSON_HEDLEY_NON_NULL(3)
      class other_error (line 3130) | class other_error : public exception
        method other_error (line 3134) | static other_error create(int id_, const std::string& what_arg, co...
        method JSON_HEDLEY_NON_NULL (line 3141) | JSON_HEDLEY_NON_NULL(3)
      type integer_sequence (line 3206) | struct integer_sequence
        method size (line 3209) | static constexpr std::size_t size() noexcept
      type utility_internal (line 3223) | namespace utility_internal
        type Extend (line 3227) | struct Extend
        type Gen (line 3245) | struct Gen
        type Gen<T, 0> (line 3252) | struct Gen<T, 0>
      type priority_tag (line 3290) | struct priority_tag : priority_tag < N - 1 > {}
      type priority_tag<0> (line 3291) | struct priority_tag<0> {}
      type static_const (line 3295) | struct static_const
      type identity_tag (line 3314) | struct identity_tag {}
      type iterator_types (line 3344) | struct iterator_types {}
      type iterator_types <
    It,
    void_t<typename It::difference_type, typename It::value_type, typename It::pointer,
    typename It::reference, typename It::iterator_category >> (line 3347) | struct iterator_types <
      type iterator_traits (line 3362) | struct iterator_traits
      type iterator_traits < T, enable_if_t < !std::is_pointer<T>::value >> (line 3367) | struct iterator_traits < T, enable_if_t < !std::is_pointer<T>::value >>
      type iterator_traits<T*, enable_if_t<std::is_object<T>::value>> (line 3373) | struct iterator_traits<T*, enable_if_t<std::is_object<T>::value>>
      type is_basic_json (line 3516) | struct is_basic_json : std::false_type {}
      class json_ref (line 3526) | class json_ref
        method json_ref (line 13465) | json_ref(value_type&& value)
        method json_ref (line 13469) | json_ref(const value_type& value)
        method json_ref (line 13473) | json_ref(std::initializer_list<json_ref> init)
        method json_ref (line 13480) | json_ref(Args && ... args)
        method json_ref (line 13485) | json_ref(json_ref&&) noexcept = default;
        method json_ref (line 13486) | json_ref(const json_ref&) = delete;
        method json_ref (line 13487) | json_ref& operator=(const json_ref&) = delete;
        method json_ref (line 13488) | json_ref& operator=(json_ref&&) = delete;
        method value_type (line 13491) | value_type moved_or_copied() const
        method value_type (line 13500) | value_type const& operator*() const
        method value_type (line 13505) | value_type const* operator->() const
      type is_json_ref (line 3529) | struct is_json_ref : std::false_type {}
      type is_json_ref<json_ref<T>> (line 3532) | struct is_json_ref<json_ref<T>> : std::true_type {}
      type has_from_json (line 3570) | struct has_from_json : std::false_type {}
      type is_getable (line 3577) | struct is_getable
      type has_from_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >> (line 3583) | struct has_from_json < BasicJsonType, T, enable_if_t < !is_basic_jso...
      type has_non_default_from_json (line 3595) | struct has_non_default_from_json : std::false_type {}
      type has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >> (line 3598) | struct has_non_default_from_json < BasicJsonType, T, enable_if_t < !...
      type has_to_json (line 3610) | struct has_to_json : std::false_type {}
      type has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >> (line 3613) | struct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json<...
      type conjunction (line 3628) | struct conjunction : std::true_type { }
      type conjunction<B1> (line 3629) | struct conjunction<B1> : B1 { }
      type negation (line 3635) | struct negation : std::integral_constant < bool, !B::value > { }
      type is_default_constructible (line 3641) | struct is_default_constructible : std::is_default_constructible<T> {}
      type is_default_constructible<std::pair<T1, T2>> (line 3644) | struct is_default_constructible<std::pair<T1, T2>>
      type is_default_constructible<const std::pair<T1, T2>> (line 3648) | struct is_default_constructible<const std::pair<T1, T2>>
      type is_constructible (line 3661) | struct is_constructible : std::is_constructible<T, Args...> {}
      type is_constructible<std::pair<T1, T2>> (line 3664) | struct is_constructible<std::pair<T1, T2>> : is_default_constructibl...
      type is_constructible<const std::pair<T1, T2>> (line 3667) | struct is_constructible<const std::pair<T1, T2>> : is_default_constr...
      type is_iterator_traits (line 3677) | struct is_iterator_traits : std::false_type {}
      type is_iterator_traits<iterator_traits<T>> (line 3680) | struct is_iterator_traits<iterator_traits<T>>
      type is_range (line 3695) | struct is_range
      type is_complete_type (line 3724) | struct is_complete_type : std::false_type {}
      type is_complete_type<T, decltype(void(sizeof(T)))> (line 3727) | struct is_complete_type<T, decltype(void(sizeof(T)))> : std::true_ty...
      type is_compatible_object_type_impl (line 3731) | struct is_compatible_object_type_impl : std::false_type {}
      type is_compatible_object_type_impl <
    BasicJsonType, CompatibleObjectType,
    enable_if_t < is_detected<mapped_type_t, CompatibleObjectType>::value&&
    is_detected<key_type_t, CompatibleObjectType>::value >> (line 3734) | struct is_compatible_object_type_impl <
      type is_compatible_object_type (line 3750) | struct is_compatible_object_type
      type is_constructible_object_type_impl (line 3755) | struct is_constructible_object_type_impl : std::false_type {}
      type is_constructible_object_type_impl <
    BasicJsonType, ConstructibleObjectType,
    enable_if_t < is_detected<mapped_type_t, ConstructibleObjectType>::value&&
    is_detected<key_type_t, ConstructibleObjectType>::value >> (line 3758) | struct is_constructible_object_type_impl <
      type is_constructible_object_type (line 3782) | struct is_constructible_object_type
      type is_compatible_string_type (line 3787) | struct is_compatible_string_type
      type is_constructible_string_type (line 3794) | struct is_constructible_string_type
      type is_compatible_array_type_impl (line 3802) | struct is_compatible_array_type_impl : std::false_type {}
      type is_compatible_array_type (line 3820) | struct is_compatible_array_type
      type is_constructible_array_type_impl (line 3824) | struct is_constructible_array_type_impl : std::false_type {}
      type is_constructible_array_type_impl <
    BasicJsonType, ConstructibleArrayType,
    enable_if_t<std::is_same<ConstructibleArrayType,
    typename BasicJsonType::value_type>::value >> (line 3827) | struct is_constructible_array_type_impl <
      type is_constructible_array_type (line 3864) | struct is_constructible_array_type
      type is_compatible_integer_type_impl (line 3869) | struct is_compatible_integer_type_impl : std::false_type {}
      type is_compatible_integer_type_impl <
    RealIntegerType, CompatibleNumberIntegerType,
    enable_if_t < std::is_integral<RealIntegerType>::value&&
    std::is_integral<CompatibleNumberIntegerType>::value&&
    !std::is_same<bool, CompatibleNumberIntegerType>::value >> (line 3872) | struct is_compatible_integer_type_impl <
      type is_compatible_integer_type (line 3890) | struct is_compatible_integer_type
      type is_compatible_type_impl (line 3895) | struct is_compatible_type_impl: std::false_type {}
      type is_compatible_type_impl <
    BasicJsonType, CompatibleType,
    enable_if_t<is_complete_type<CompatibleType>::value >> (line 3898) | struct is_compatible_type_impl <
      type is_compatible_type (line 3907) | struct is_compatible_type
      type is_constructible_tuple (line 3911) | struct is_constructible_tuple : std::false_type {}
      type is_ordered_map (line 3919) | struct is_ordered_map
        type two (line 3923) | struct two
      function T (line 3936) | T conditional_static_cast(U value)
      function T (line 3942) | T conditional_static_cast(U value)
      function from_json (line 3962) | void from_json(const BasicJsonType& j, typename std::nullptr_t& n)
      function get_arithmetic_value (line 3976) | void get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val)
      function from_json (line 4009) | void from_json(const BasicJsonType& j, typename BasicJsonType::boole...
      function from_json (line 4019) | void from_json(const BasicJsonType& j, typename BasicJsonType::strin...
      function from_json (line 4035) | void from_json(const BasicJsonType& j, ConstructibleStringType& s)
      function from_json (line 4046) | void from_json(const BasicJsonType& j, typename BasicJsonType::numbe...
      function from_json (line 4052) | void from_json(const BasicJsonType& j, typename BasicJsonType::numbe...
      function from_json (line 4058) | void from_json(const BasicJsonType& j, typename BasicJsonType::numbe...
      function from_json (line 4065) | void from_json(const BasicJsonType& j, EnumType& e)
      function from_json (line 4075) | void from_json(const BasicJsonType& j, std::forward_list<T, Allocato...
      function from_json (line 4092) | void from_json(const BasicJsonType& j, std::valarray<T>& l)
      function from_json (line 4107) | auto from_json(const BasicJsonType& j, T (&arr)[N])  // NOLINT(cppco...
      function from_json_array_impl (line 4117) | void from_json_array_impl(const BasicJsonType& j, typename BasicJson...
      function from_json_array_impl (line 4123) | auto from_json_array_impl(const BasicJsonType& j, std::array<T, N>& ...
      function from_json_array_impl (line 4137) | auto from_json_array_impl(const BasicJsonType& j, ConstructibleArray...
      function from_json_array_impl (line 4161) | void from_json_array_impl(const BasicJsonType& j, ConstructibleArray...
      function from_json (line 4186) | auto from_json(const BasicJsonType& j, ConstructibleArrayType& arr)
      function from_json_inplace_array_impl (line 4200) | std::array<T, sizeof...(Idx)> from_json_inplace_array_impl(BasicJson...
      function from_json (line 4207) | auto from_json(BasicJsonType&& j, identity_tag<std::array<T, N>> tag)
      function from_json (line 4219) | void from_json(const BasicJsonType& j, typename BasicJsonType::binar...
      function from_json (line 4231) | void from_json(const BasicJsonType& j, ConstructibleObjectType& obj)
      function from_json (line 4263) | void from_json(const BasicJsonType& j, ArithmeticType& val)
      function from_json_tuple_impl_base (line 4300) | std::tuple<Args...> from_json_tuple_impl_base(BasicJsonType&& j, ind...
      function from_json_tuple_impl (line 4306) | std::pair<A1, A2> from_json_tuple_impl(BasicJsonType&& j, identity_t...
      function from_json_tuple_impl (line 4313) | void from_json_tuple_impl(BasicJsonType&& j, std::pair<A1, A2>& p, p...
      function from_json_tuple_impl (line 4319) | std::tuple<Args...> from_json_tuple_impl(BasicJsonType&& j, identity...
      function from_json_tuple_impl (line 4325) | void from_json_tuple_impl(BasicJsonType&& j, std::tuple<Args...>& t,...
      function from_json (line 4331) | auto from_json(BasicJsonType&& j, TupleRelated&& t)
      function from_json (line 4345) | void from_json(const BasicJsonType& j, std::map<Key, Value, Compare,...
      function from_json (line 4365) | void from_json(const BasicJsonType& j, std::unordered_map<Key, Value...
      function from_json (line 4384) | void from_json(const BasicJsonType& j, std::filesystem::path& p)
      type from_json_fn (line 4394) | struct from_json_fn
      function int_to_string (line 4448) | void int_to_string( string_type& target, std::size_t value )
      class iteration_proxy_value (line 4454) | class iteration_proxy_value
        method iteration_proxy_value (line 4477) | explicit iteration_proxy_value(IteratorType it) noexcept
        method iteration_proxy_value (line 4482) | iteration_proxy_value& operator*()
        method iteration_proxy_value (line 4488) | iteration_proxy_value& operator++()
        method string_type (line 4509) | const string_type& key() const
        method value (line 4545) | typename IteratorType::reference value() const
      class iteration_proxy (line 4552) | class iteration_proxy
        method iteration_proxy (line 4560) | explicit iteration_proxy(typename IteratorType::reference cont) no...
        method begin (line 4564) | iteration_proxy_value<IteratorType> begin() noexcept
        method end (line 4570) | iteration_proxy_value<IteratorType> end() noexcept
      function get (line 4579) | auto get(const nlohmann::detail::iteration_proxy_value<IteratorType>...
      function get (line 4587) | auto get(const nlohmann::detail::iteration_proxy_value<IteratorType>...
      type external_constructor (line 4648) | struct external_constructor
      type external_constructor<value_t::boolean> (line 4651) | struct external_constructor<value_t::boolean>
        method construct (line 4654) | static void construct(BasicJsonType& j, typename BasicJsonType::bo...
      type external_constructor<value_t::string> (line 4664) | struct external_constructor<value_t::string>
        method construct (line 4667) | static void construct(BasicJsonType& j, const typename BasicJsonTy...
        method construct (line 4676) | static void construct(BasicJsonType& j, typename BasicJsonType::st...
        method construct (line 4687) | static void construct(BasicJsonType& j, const CompatibleStringType...
      type external_constructor<value_t::binary> (line 4697) | struct external_constructor<value_t::binary>
        method construct (line 4700) | static void construct(BasicJsonType& j, const typename BasicJsonTy...
        method construct (line 4709) | static void construct(BasicJsonType& j, typename BasicJsonType::bi...
      type external_constructor<value_t::number_float> (line 4719) | struct external_constructor<value_t::number_float>
        method construct (line 4722) | static void construct(BasicJsonType& j, typename BasicJsonType::nu...
      type external_constructor<value_t::number_unsigned> (line 4732) | struct external_constructor<value_t::number_unsigned>
        method construct (line 4735) | static void construct(BasicJsonType& j, typename BasicJsonType::nu...
      type external_constructor<value_t::number_integer> (line 4745) | struct external_constructor<value_t::number_integer>
        method construct (line 4748) | static void construct(BasicJsonType& j, typename BasicJsonType::nu...
      type external_constructor<value_t::array> (line 4758) | struct external_constructor<value_t::array>
        method construct (line 4761) | static void construct(BasicJsonType& j, const typename BasicJsonTy...
        method construct (line 4771) | static void construct(BasicJsonType& j, typename BasicJsonType::ar...
        method construct (line 4783) | static void construct(BasicJsonType& j, const CompatibleArrayType&...
        method construct (line 4796) | static void construct(BasicJsonType& j, const std::vector<bool>& arr)
        method construct (line 4812) | static void construct(BasicJsonType& j, const std::valarray<T>& arr)
      type external_constructor<value_t::object> (line 4828) | struct external_constructor<value_t::object>
        method construct (line 4831) | static void construct(BasicJsonType& j, const typename BasicJsonTy...
        method construct (line 4841) | static void construct(BasicJsonType& j, typename BasicJsonType::ob...
        method construct (line 4852) | static void construct(BasicJsonType& j, const CompatibleObjectType...
      function to_json (line 4871) | void to_json(BasicJsonType& j, T b) noexcept
      function to_json (line 4878) | void to_json(BasicJsonType& j, const CompatibleString& s)
      function to_json (line 4884) | void to_json(BasicJsonType& j, typename BasicJsonType::string_t&& s)
      function to_json (line 4891) | void to_json(BasicJsonType& j, FloatType val) noexcept
      function to_json (line 4898) | void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noe...
      function to_json (line 4905) | void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noex...
      function to_json (line 4912) | void to_json(BasicJsonType& j, EnumType e) noexcept
      function to_json (line 4919) | void to_json(BasicJsonType& j, const std::vector<bool>& e)
      function to_json (line 4932) | void to_json(BasicJsonType& j, const CompatibleArrayType& arr)
      function to_json (line 4938) | void to_json(BasicJsonType& j, const typename BasicJsonType::binary_...
      function to_json (line 4945) | void to_json(BasicJsonType& j, const std::valarray<T>& arr)
      function to_json (line 4951) | void to_json(BasicJsonType& j, typename BasicJsonType::array_t&& arr)
      function to_json (line 4958) | void to_json(BasicJsonType& j, const CompatibleObjectType& obj)
      function to_json (line 4964) | void to_json(BasicJsonType& j, typename BasicJsonType::object_t&& obj)
      function to_json (line 4974) | void to_json(BasicJsonType& j, const T(&arr)[N]) // NOLINT(cppcoregu...
      function to_json (line 4980) | void to_json(BasicJsonType& j, const std::pair<T1, T2>& p)
      function to_json (line 4988) | void to_json(BasicJsonType& j, const T& b)
      function to_json_tuple_impl (line 4994) | void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequ...
      function to_json (line 5000) | void to_json(BasicJsonType& j, const T& t)
      function to_json (line 5007) | void to_json(BasicJsonType& j, const std::filesystem::path& p)
      type to_json_fn (line 5013) | struct to_json_fn
      function combine (line 5297) | inline std::size_t combine(std::size_t seed, std::size_t h) noexcept
      function hash (line 5315) | std::size_t hash(const BasicJsonType& j)
      type input_format_t (line 5451) | enum class input_format_t { json, cbor, msgpack, ubjson, bson }
      class file_input_adapter (line 5462) | class file_input_adapter
        method file_input_adapter (line 5468) | explicit file_input_adapter(std::FILE* f) noexcept
        method file_input_adapter (line 5473) | file_input_adapter(const file_input_adapter&) = delete;
        method file_input_adapter (line 5474) | file_input_adapter(file_input_adapter&&) noexcept = default;
        method file_input_adapter (line 5475) | file_input_adapter& operator=(const file_input_adapter&) = delete;
        method file_input_adapter (line 5476) | file_input_adapter& operator=(file_input_adapter&&) = delete;
        method get_character (line 5479) | std::char_traits<char>::int_type get_character() noexcept
      class input_stream_adapter (line 5499) | class input_stream_adapter
        method input_stream_adapter (line 5514) | explicit input_stream_adapter(std::istream& i)
        method input_stream_adapter (line 5519) | input_stream_adapter(const input_stream_adapter&) = delete;
        method input_stream_adapter (line 5520) | input_stream_adapter& operator=(input_stream_adapter&) = delete;
        method input_stream_adapter (line 5521) | input_stream_adapter& operator=(input_stream_adapter&&) = delete;
        method input_stream_adapter (line 5523) | input_stream_adapter(input_stream_adapter&& rhs) noexcept
        method get_character (line 5533) | std::char_traits<char>::int_type get_character()
      class iterator_input_adapter (line 5554) | class iterator_input_adapter
        method iterator_input_adapter (line 5559) | iterator_input_adapter(IteratorType first, IteratorType last)
        method get_character (line 5563) | typename std::char_traits<char_type>::int_type get_character()
        method empty (line 5582) | bool empty() const
      type wide_string_input_helper (line 5590) | struct wide_string_input_helper
      type wide_string_input_helper<BaseInputAdapter, 4> (line 5593) | struct wide_string_input_helper<BaseInputAdapter, 4>
        method fill_buffer (line 5596) | static void fill_buffer(BaseInputAdapter& input,
      type wide_string_input_helper<BaseInputAdapter, 2> (line 5651) | struct wide_string_input_helper<BaseInputAdapter, 2>
        method fill_buffer (line 5654) | static void fill_buffer(BaseInputAdapter& input,
      class wide_string_input_adapter (line 5714) | class wide_string_input_adapter
        method wide_string_input_adapter (line 5719) | wide_string_input_adapter(BaseInputAdapter base)
        method get_character (line 5722) | typename std::char_traits<char>::int_type get_character() noexcept
        method fill_buffer (line 5743) | void fill_buffer()
      type iterator_input_adapter_factory (line 5759) | struct iterator_input_adapter_factory
        method adapter_type (line 5765) | static adapter_type create(IteratorType first, IteratorType last)
      type is_iterator_of_multibyte (line 5772) | struct is_iterator_of_multibyte
      type iterator_input_adapter_factory<IteratorType, enable_if_t<is_iterator_of_multibyte<IteratorType>::value>> (line 5782) | struct iterator_input_adapter_factory<IteratorType, enable_if_t<is_i...
        method adapter_type (line 5789) | static adapter_type create(IteratorType first, IteratorType last)
      function input_adapter (line 5797) | typename iterator_input_adapter_factory<IteratorType>::adapter_type ...
      type container_input_adapter_factory_impl (line 5807) | namespace container_input_adapter_factory_impl
        type container_input_adapter_factory (line 5814) | struct container_input_adapter_factory {}
        type container_input_adapter_factory< ContainerType,
       void_t<decltype(begin(std::declval<ContainerType>()), end(std::declval<ContainerType>()))>> (line 5817) | struct container_input_adapter_factory< ContainerType,
          method adapter_type (line 5822) | static adapter_type create(const ContainerType& container)
      function input_adapter (line 5831) | typename container_input_adapter_factory_impl::container_input_adapt...
      function file_input_adapter (line 5838) | inline file_input_adapter input_adapter(std::FILE* file)
        method file_input_adapter (line 5468) | explicit file_input_adapter(std::FILE* f) noexcept
        method file_input_adapter (line 5473) | file_input_adapter(const file_input_adapter&) = delete;
        method file_input_adapter (line 5474) | file_input_adapter(file_input_adapter&&) noexcept = default;
        method file_input_adapter (line 5475) | file_input_adapter& operator=(const file_input_adapter&) = delete;
        method file_input_adapter (line 5476) | file_input_adapter& operator=(file_input_adapter&&) = delete;
        method get_character (line 5479) | std::char_traits<char>::int_type get_character() noexcept
      function input_stream_adapter (line 5843) | inline input_stream_adapter input_adapter(std::istream& stream)
        method input_stream_adapter (line 5514) | explicit input_stream_adapter(std::istream& i)
        method input_stream_adapter (line 5519) | input_stream_adapter(const input_stream_adapter&) = delete;
        method input_stream_adapter (line 5520) | input_stream_adapter& operator=(input_stream_adapter&) = delete;
        method input_stream_adapter (line 5521) | input_stream_adapter& operator=(input_stream_adapter&&) = delete;
        method input_stream_adapter (line 5523) | input_stream_adapter(input_stream_adapter&& rhs) noexcept
        method get_character (line 5533) | std::char_traits<char>::int_type get_character()
      function input_stream_adapter (line 5848) | inline input_stream_adapter input_adapter(std::istream&& stream)
        method input_stream_adapter (line 5514) | explicit input_stream_adapter(std::istream& i)
        method input_stream_adapter (line 5519) | input_stream_adapter(const input_stream_adapter&) = delete;
        method input_stream_adapter (line 5520) | input_stream_adapter& operator=(input_stream_adapter&) = delete;
        method input_stream_adapter (line 5521) | input_stream_adapter& operator=(input_stream_adapter&&) = delete;
        method input_stream_adapter (line 5523) | input_stream_adapter(input_stream_adapter&& rhs) noexcept
        method get_character (line 5533) | std::char_traits<char>::int_type get_character()
      function contiguous_bytes_input_adapter (line 5864) | contiguous_bytes_input_adapter input_adapter(CharT b)
      function input_adapter (line 5872) | auto input_adapter(T (&array)[N]) -> decltype(input_adapter(array, a...
      class span_input_adapter (line 5880) | class span_input_adapter
        method span_input_adapter (line 5889) | span_input_adapter(CharT b, std::size_t l)
        method span_input_adapter (line 5896) | span_input_adapter(IteratorType first, IteratorType last)
        method contiguous_bytes_input_adapter (line 5899) | contiguous_bytes_input_adapter&& get()
      class json_sax_dom_parser (line 6066) | class json_sax_dom_parser
        method json_sax_dom_parser (line 6080) | explicit json_sax_dom_parser(BasicJsonType& r, const bool allow_ex...
        method json_sax_dom_parser (line 6085) | json_sax_dom_parser(const json_sax_dom_parser&) = delete;
        method json_sax_dom_parser (line 6086) | json_sax_dom_parser(json_sax_dom_parser&&) = default;
        method json_sax_dom_parser (line 6087) | json_sax_dom_parser& operator=(const json_sax_dom_parser&) = delete;
        method json_sax_dom_parser (line 6088) | json_sax_dom_parser& operator=(json_sax_dom_parser&&) = default;
        method null (line 6091) | bool null()
        method boolean (line 6097) | bool boolean(bool val)
        method number_integer (line 6103) | bool number_integer(number_integer_t val)
        method number_unsigned (line 6109) | bool number_unsigned(number_unsigned_t val)
        method number_float (line 6115) | bool number_float(number_float_t val, const string_t& /*unused*/)
        method string (line 6121) | bool string(string_t& val)
        method binary (line 6127) | bool binary(binary_t& val)
        method start_object (line 6133) | bool start_object(std::size_t len)
        method key (line 6145) | bool key(string_t& val)
        method end_object (line 6152) | bool end_object()
        method start_array (line 6159) | bool start_array(std::size_t len)
        method end_array (line 6171) | bool end_array()
        method parse_error (line 6179) | bool parse_error(std::size_t /*unused*/, const std::string& /*unus...
        method is_errored (line 6191) | constexpr bool is_errored() const
        method JSON_HEDLEY_RETURNS_NON_NULL (line 6204) | JSON_HEDLEY_RETURNS_NON_NULL
      class json_sax_dom_callback_parser (line 6240) | class json_sax_dom_callback_parser
        method json_sax_dom_callback_parser (line 6251) | json_sax_dom_callback_parser(BasicJsonType& r,
        method json_sax_dom_callback_parser (line 6260) | json_sax_dom_callback_parser(const json_sax_dom_callback_parser&) ...
        method json_sax_dom_callback_parser (line 6261) | json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) = def...
        method json_sax_dom_callback_parser (line 6262) | json_sax_dom_callback_parser& operator=(const json_sax_dom_callbac...
        method json_sax_dom_callback_parser (line 6263) | json_sax_dom_callback_parser& operator=(json_sax_dom_callback_pars...
        method null (line 6266) | bool null()
        method boolean (line 6272) | bool boolean(bool val)
        method number_integer (line 6278) | bool number_integer(number_integer_t val)
        method number_unsigned (line 6284) | bool number_unsigned(number_unsigned_t val)
        method number_float (line 6290) | bool number_float(number_float_t val, const string_t& /*unused*/)
        method string (line 6296) | bool string(string_t& val)
        method binary (line 6302) | bool binary(binary_t& val)
        method start_object (line 6308) | bool start_object(std::size_t len)
        method key (line 6326) | bool key(string_t& val)
        method end_object (line 6343) | bool end_object()
        method start_array (line 6379) | bool start_array(std::size_t len)
        method end_array (line 6396) | bool end_array()
        method parse_error (line 6429) | bool parse_error(std::size_t /*unused*/, const std::string& /*unus...
        method is_errored (line 6441) | constexpr bool is_errored() const
        method handle_value (line 6463) | std::pair<bool, BasicJsonType*> handle_value(Value&& v, const bool...
      class json_sax_acceptor (line 6547) | class json_sax_acceptor
        method null (line 6556) | bool null()
        method boolean (line 6561) | bool boolean(bool /*unused*/)
        method number_integer (line 6566) | bool number_integer(number_integer_t /*unused*/)
        method number_unsigned (line 6571) | bool number_unsigned(number_unsigned_t /*unused*/)
        method number_float (line 6576) | bool number_float(number_float_t /*unused*/, const string_t& /*unu...
        method string (line 6581) | bool string(string_t& /*unused*/)
        method binary (line 6586) | bool binary(binary_t& /*unused*/)
        method start_object (line 6591) | bool start_object(std::size_t /*unused*/ = std::size_t(-1))
        method key (line 6596) | bool key(string_t& /*unused*/)
        method end_object (line 6601) | bool end_object()
        method start_array (line 6606) | bool start_array(std::size_t /*unused*/ = std::size_t(-1))
        method end_array (line 6611) | bool end_array()
        method parse_error (line 6616) | bool parse_error(std::size_t /*unused*/, const std::string& /*unus...
      class lexer_base (line 6654) | class lexer_base
        type token_type (line 6658) | enum class token_type
      class lexer (line 6731) | class lexer : public lexer_base<BasicJsonType>
        method lexer (line 6743) | explicit lexer(InputAdapterType&& adapter, bool ignore_comments_ =...
        method lexer (line 6750) | lexer(const lexer&) = delete;
        method lexer (line 6751) | lexer(lexer&&) = default;
        method lexer (line 6752) | lexer& operator=(lexer&) = delete;
        method lexer (line 6753) | lexer& operator=(lexer&&) = default;
        method JSON_HEDLEY_PURE (line 6762) | JSON_HEDLEY_PURE
        method get_codepoint (line 6789) | int get_codepoint()
        method next_byte_in_range (line 6837) | bool next_byte_in_range(std::initializer_list<char_int_type> ranges)
        method token_type (line 6874) | token_type scan_string()
        method scan_comment (line 7464) | bool scan_comment()
        method strtof (line 7532) | static void strtof(float& f, const char* str, char** endptr) noexcept
        method strtof (line 7538) | static void strtof(double& f, const char* str, char** endptr) noex...
        method strtof (line 7544) | static void strtof(long double& f, const char* str, char** endptr)...
        method token_type (line 7589) | token_type scan_number()  // lgtm [cpp/use-of-goto]
      type is_sax (line 8322) | struct is_sax
      type is_sax_static_asserts (line 8353) | struct is_sax_static_asserts
      type cbor_tag_handler_t (line 8419) | enum class cbor_tag_handler_t
      function little_endianess (line 8433) | static inline bool little_endianess(int num = 1) noexcept
      class binary_reader (line 8447) | class binary_reader
        method binary_reader (line 8464) | explicit binary_reader(InputAdapterType&& adapter) noexcept : ia(s...
        method binary_reader (line 8470) | binary_reader(const binary_reader&) = delete;
        method binary_reader (line 8471) | binary_reader(binary_reader&&) = default;
        method binary_reader (line 8472) | binary_reader& operator=(const binary_reader&) = delete;
        method binary_reader (line 8473) | binary_reader& operator=(binary_reader&&) = default;
        method JSON_HEDLEY_NON_NULL (line 8484) | JSON_HEDLEY_NON_NULL(3)
        method parse_bson_internal (line 8547) | bool parse_bson_internal()
        method get_bson_cstr (line 8572) | bool get_bson_cstr(string_t& result)
        method get_bson_string (line 8602) | bool get_bson_string(const NumberType len, string_t& result)
        method get_bson_binary (line 8623) | bool get_bson_binary(const NumberType len, binary_t& result)
        method parse_bson_element_internal (line 8649) | bool parse_bson_element_internal(const char_int_type element_type,
        method parse_bson_element_list (line 8727) | bool parse_bson_element_list(const bool is_array)
        method parse_bson_array (line 8765) | bool parse_bson_array()
        method parse_cbor_internal (line 8795) | bool parse_cbor_internal(const bool get_char,
        method get_cbor_string (line 9283) | bool get_cbor_string(string_t& result)
        method get_cbor_binary (line 9378) | bool get_cbor_binary(binary_t& result)
        method get_cbor_array (line 9472) | bool get_cbor_array(const std::size_t len,
        method get_cbor_object (line 9510) | bool get_cbor_object(const std::size_t len,
        method parse_msgpack_internal (line 9566) | bool parse_msgpack_internal()
        method get_msgpack_string (line 9946) | bool get_msgpack_string(string_t& result)
        method get_msgpack_binary (line 10028) | bool get_msgpack_binary(binary_t& result)
        method get_msgpack_array (line 10139) | bool get_msgpack_array(const std::size_t len)
        method get_msgpack_object (line 10161) | bool get_msgpack_object(const std::size_t len)
        method parse_ubjson_internal (line 10198) | bool parse_ubjson_internal(const bool get_char = true)
        method get_ubjson_string (line 10217) | bool get_ubjson_string(string_t& result, const bool get_char = true)
        method get_ubjson_size_value (line 10271) | bool get_ubjson_size_value(std::size_t& result)
        method get_ubjson_size_type (line 10348) | bool get_ubjson_size_type(std::pair<std::size_t, char_int_type>& r...
        method get_ubjson_value (line 10389) | bool get_ubjson_value(const char_int_type prefix)
        method get_ubjson_array (line 10490) | bool get_ubjson_array()
        method get_ubjson_object (line 10552) | bool get_ubjson_object()
        method get_ubjson_high_precision_number (line 10627) | bool get_ubjson_high_precision_number()
        method char_int_type (line 10703) | char_int_type get()
        method char_int_type (line 10712) | char_int_type get_ignore_noop()
        method get_number (line 10737) | bool get_number(const input_format_t format, NumberType& result)
        method get_string (line 10780) | bool get_string(const input_format_t format,
        method get_binary (line 10813) | bool get_binary(const input_format_t format,
        method JSON_HEDLEY_NON_NULL (line 10836) | JSON_HEDLEY_NON_NULL(3)
        method get_token_string (line 10850) | std::string get_token_string() const
        method exception_message (line 10863) | std::string exception_message(const input_format_t format,
      type parse_event_t (line 10951) | enum class parse_event_t : std::uint8_t
      class parser (line 10977) | class parser
        method parser (line 10988) | explicit parser(InputAdapterType&& adapter,
        method parse (line 11010) | void parse(const bool strict, BasicJsonType& result)
        method accept (line 11070) | bool accept(const bool strict = true)
        method sax_parse (line 11078) | bool sax_parse(SAX* sax, const bool strict = true)
        method sax_parse_internal (line 11097) | bool sax_parse_internal(SAX* sax)
        method token_type (line 11378) | token_type get_token()
        method exception_message (line 11383) | std::string exception_message(const token_type expected, const std...
      class primitive_iterator_t (line 11451) | class primitive_iterator_t
        method difference_type (line 11463) | constexpr difference_type get_value() const noexcept
        method set_begin (line 11469) | void set_begin() noexcept
        method set_end (line 11475) | void set_end() noexcept
        method is_begin (line 11481) | constexpr bool is_begin() const noexcept
        method is_end (line 11487) | constexpr bool is_end() const noexcept
        method primitive_iterator_t (line 11502) | primitive_iterator_t operator+(difference_type n) noexcept
        method difference_type (line 11509) | constexpr difference_type operator-(primitive_iterator_t lhs, prim...
        method primitive_iterator_t (line 11514) | primitive_iterator_t& operator++() noexcept
        method primitive_iterator_t (line 11520) | primitive_iterator_t const operator++(int) noexcept // NOLINT(read...
        method primitive_iterator_t (line 11527) | primitive_iterator_t& operator--() noexcept
        method primitive_iterator_t (line 11533) | primitive_iterator_t const operator--(int) noexcept // NOLINT(read...
        method primitive_iterator_t (line 11540) | primitive_iterator_t& operator+=(difference_type n) noexcept
        method primitive_iterator_t (line 11546) | primitive_iterator_t& operator-=(difference_type n) noexcept
      type internal_iterator (line 11566) | struct internal_iterator
      class iteration_proxy (line 11604) | class iteration_proxy
        method iteration_proxy (line 4560) | explicit iteration_proxy(typename IteratorType::reference cont) no...
        method begin (line 4564) | iteration_proxy_value<IteratorType> begin() noexcept
        method end (line 4570) | iteration_proxy_value<IteratorType> end() noexcept
      class iteration_proxy_value (line 11605) | class iteration_proxy_value
        method iteration_proxy_value (line 4477) | explicit iteration_proxy_value(IteratorType it) noexcept
        method iteration_proxy_value (line 4482) | iteration_proxy_value& operator*()
        method iteration_proxy_value (line 4488) | iteration_proxy_value& operator++()
        method string_type (line 4509) | const string_type& key() const
        method value (line 4545) | typename IteratorType::reference value() const
      function set_end (line 11624) | class iter_impl
      class json_reverse_iterator (line 12362) | class json_reverse_iterator : public std::reverse_iterator<Base>
        method json_reverse_iterator (line 12372) | explicit json_reverse_iterator(const typename base_iterator::itera...
        method json_reverse_iterator (line 12376) | explicit json_reverse_iterator(const base_iterator& it) noexcept :...
        method json_reverse_iterator (line 12379) | json_reverse_iterator const operator++(int) // NOLINT(readability-...
        method json_reverse_iterator (line 12385) | json_reverse_iterator& operator++()
        method json_reverse_iterator (line 12391) | json_reverse_iterator const operator--(int) // NOLINT(readability-...
        method json_reverse_iterator (line 12397) | json_reverse_iterator& operator--()
        method json_reverse_iterator (line 12403) | json_reverse_iterator& operator+=(difference_type i)
        method json_reverse_iterator (line 12409) | json_reverse_iterator operator+(difference_type i) const
        method json_reverse_iterator (line 12415) | json_reverse_iterator operator-(difference_type i) const
        method difference_type (line 12421) | difference_type operator-(const json_reverse_iterator& other) const
        method reference (line 12427) | reference operator[](difference_type n) const
        method key (line 12433) | auto key() const -> decltype(std::declval<Base>().key())
        method reference (line 12440) | reference value() const
      class json_ref (line 13460) | class json_ref
        method json_ref (line 13465) | json_ref(value_type&& value)
        method json_ref (line 13469) | json_ref(const value_type& value)
        method json_ref (line 13473) | json_ref(std::initializer_list<json_ref> init)
        method json_ref (line 13480) | json_ref(Args && ... args)
        method json_ref (line 13485) | json_ref(json_ref&&) noexcept = default;
        method json_ref (line 13486) | json_ref(const json_ref&) = delete;
        method json_ref (line 13487) | json_ref& operator=(const json_ref&) = delete;
        method json_ref (line 13488) | json_ref& operator=(json_ref&&) = delete;
        method value_type (line 13491) | value_type moved_or_copied() const
        method value_type (line 13500) | value_type const& operator*() const
        method value_type (line 13505) | value_type const* operator->() const
      type output_adapter_protocol (line 13564) | struct output_adapter_protocol
        method output_adapter_protocol (line 13570) | output_adapter_protocol() = default;
        method output_adapter_protocol (line 13571) | output_adapter_protocol(const output_adapter_protocol&) = default;
        method output_adapter_protocol (line 13572) | output_adapter_protocol(output_adapter_protocol&&) noexcept = defa...
        method output_adapter_protocol (line 13573) | output_adapter_protocol& operator=(const output_adapter_protocol&)...
        method output_adapter_protocol (line 13574) | output_adapter_protocol& operator=(output_adapter_protocol&&) noex...
      class output_vector_adapter (line 13583) | class output_vector_adapter : public output_adapter_protocol<CharType>
        method output_vector_adapter (line 13586) | explicit output_vector_adapter(std::vector<CharType, AllocatorType...
        method write_character (line 13590) | void write_character(CharType c) override
        method JSON_HEDLEY_NON_NULL (line 13595) | JSON_HEDLEY_NON_NULL(2)
      class output_stream_adapter (line 13608) | class output_stream_adapter : public output_adapter_protocol<CharType>
        method output_stream_adapter (line 13611) | explicit output_stream_adapter(std::basic_ostream<CharType>& s) no...
        method write_character (line 13615) | void write_character(CharType c) override
        method JSON_HEDLEY_NON_NULL (line 13620) | JSON_HEDLEY_NON_NULL(2)
      class output_string_adapter (line 13633) | class output_string_adapter : public output_adapter_protocol<CharType>
        method output_string_adapter (line 13636) | explicit output_string_adapter(StringType& s) noexcept
        method write_character (line 13640) | void write_character(CharType c) override
        method JSON_HEDLEY_NON_NULL (line 13645) | JSON_HEDLEY_NON_NULL(2)
      class output_adapter (line 13656) | class output_adapter
        method output_adapter (line 13660) | output_adapter(std::vector<CharType, AllocatorType>& vec)
        method output_adapter (line 13664) | output_adapter(std::basic_ostream<CharType>& s)
        method output_adapter (line 13668) | output_adapter(StringType& s)
      class binary_writer (line 13695) | class binary_writer
        method binary_writer (line 13707) | explicit binary_writer(output_adapter_t<CharType> adapter) : oa(st...
        method write_bson (line 13716) | void write_bson(const BasicJsonType& j)
        method write_cbor (line 13745) | void write_cbor(const BasicJsonType& j)
        method write_msgpack (line 14069) | void write_msgpack(const BasicJsonType& j)
        method write_ubjson (line 14394) | void write_ubjson(const BasicJsonType& j, const bool use_count,
        method calc_bson_entry_header_size (line 14602) | static std::size_t calc_bson_entry_header_size(const string_t& nam...
        method write_bson_entry_header (line 14617) | void write_bson_entry_header(const string_t& name,
        method write_bson_boolean (line 14629) | void write_bson_boolean(const string_t& name,
        method write_bson_double (line 14639) | void write_bson_double(const string_t& name,
        method calc_bson_string_size (line 14649) | static std::size_t calc_bson_string_size(const string_t& value)
        method write_bson_string (line 14657) | void write_bson_string(const string_t& name,
        method write_bson_null (line 14671) | void write_bson_null(const string_t& name)
        method calc_bson_integer_size (line 14679) | static std::size_t calc_bson_integer_size(const std::int64_t value)
        method write_bson_integer (line 14689) | void write_bson_integer(const string_t& name,
        method calc_bson_unsigned_size (line 14707) | static constexpr std::size_t calc_bson_unsigned_size(const std::ui...
        method write_bson_unsigned (line 14717) | void write_bson_unsigned(const string_t& name,
        method write_bson_object_entry (line 14739) | void write_bson_object_entry(const string_t& name,
        method calc_bson_array_size (line 14749) | static std::size_t calc_bson_array_size(const typename BasicJsonTy...
        method calc_bson_binary_size (line 14764) | static std::size_t calc_bson_binary_size(const typename BasicJsonT...
        method write_bson_array (line 14772) | void write_bson_array(const string_t& name,
        method write_bson_binary (line 14791) | void write_bson_binary(const string_t& name,
        method calc_bson_element_size (line 14806) | static std::size_t calc_bson_element_size(const string_t& name,
        method write_bson_element (line 14854) | void write_bson_element(const string_t& name,
        method calc_bson_object_size (line 14901) | static std::size_t calc_bson_object_size(const typename BasicJsonT...
        method write_bson_object (line 14916) | void write_bson_object(const typename BasicJsonType::object_t& value)
        method CharType (line 14932) | static constexpr CharType get_cbor_float_prefix(float /*unused*/)
        method CharType (line 14937) | static constexpr CharType get_cbor_float_prefix(double /*unused*/)
        method CharType (line 14946) | static constexpr CharType get_msgpack_float_prefix(float /*unused*/)
        method CharType (line 14951) | static constexpr CharType get_msgpack_float_prefix(double /*unused*/)
        method write_number_with_ubjson_prefix (line 14963) | void write_number_with_ubjson_prefix(const NumberType n,
        method write_number_with_ubjson_prefix (line 14976) | void write_number_with_ubjson_prefix(const NumberType n,
        method write_number_with_ubjson_prefix (line 15039) | void write_number_with_ubjson_prefix(const NumberType n,
        method CharType (line 15103) | CharType ubjson_prefix(const BasicJsonType& j) const noexcept
        method CharType (line 15184) | static constexpr CharType get_ubjson_float_prefix(float /*unused*/)
        method CharType (line 15189) | static constexpr CharType get_ubjson_float_prefix(double /*unused*/)
        method write_number (line 15210) | void write_number(const NumberType n)
        method write_compact_float (line 15226) | void write_compact_float(const number_float_t n, detail::input_for...
        method CharType (line 15260) | static constexpr CharType to_char_type(std::uint8_t x) noexcept
        method CharType (line 15267) | static CharType to_char_type(std::uint8_t x) noexcept
        method CharType (line 15278) | static constexpr CharType to_char_type(std::uint8_t x) noexcept
        method CharType (line 15289) | static constexpr CharType to_char_type(InputCharType x) noexcept
      type dtoa_impl (line 15358) | namespace dtoa_impl
        function Target (line 15362) | Target reinterpret_bits(const Source source)
        type diyfp (line 15371) | struct diyfp // f * 2^e
          method diyfp (line 15378) | constexpr diyfp(std::uint64_t f_, int e_) noexcept : f(f_), e(e_...
          method diyfp (line 15384) | static diyfp sub(const diyfp& x, const diyfp& y) noexcept
          method diyfp (line 15396) | static diyfp mul(const diyfp& x, const diyfp& y) noexcept
          method diyfp (line 15461) | static diyfp normalize(diyfp x) noexcept
          method diyfp (line 15478) | static diyfp normalize_to(const diyfp& x, const int target_expon...
        type boundaries (line 15489) | struct boundaries
        function boundaries (line 15503) | boundaries compute_boundaries(FloatType value)
        type cached_power (line 15628) | struct cached_power // c = f * 2^e ~= 10^k
        function cached_power (line 15642) | inline cached_power get_cached_power_for_binary_exponent(int e)
        function find_largest_pow10 (line 15806) | inline int find_largest_pow10(const std::uint32_t n, std::uint32_t...
        function grisu2_round (line 15860) | inline void grisu2_round(char* buf, int len, std::uint64_t dist, s...
        function grisu2_digit_gen (line 15901) | inline void grisu2_digit_gen(char* buffer, int& length, int& decim...
        function grisu2 (line 16142) | inline void grisu2(char* buf, int& len, int& decimal_exponent,
        function JSON_HEDLEY_NON_NULL (line 16201) | JSON_HEDLEY_NON_NULL(1)
      type error_handler_t (line 16456) | enum class error_handler_t
      class serializer (line 16464) | class serializer
        method serializer (line 16480) | serializer(output_adapter_t<char> s, const char ichar,
        method serializer (line 16492) | serializer(const serializer&) = delete;
        method serializer (line 16493) | serializer& operator=(const serializer&) = delete;
        method serializer (line 16494) | serializer(serializer&&) = delete;
        method serializer (line 16495) | serializer& operator=(serializer&&) = delete;
        method dump (line 16520) | void dump(const BasicJsonType& val,
        method switch (line 16818) | switch (decode(state, codepoint, byte))
    type detail (line 2227) | namespace detail
      type value_t (line 120) | enum class value_t : std::uint8_t
      type make_void (line 2229) | struct make_void
      type nonesuch (line 2243) | struct nonesuch
        method nonesuch (line 2245) | nonesuch() = delete;
        method nonesuch (line 2247) | nonesuch(nonesuch const&) = delete;
        method nonesuch (line 2248) | nonesuch(nonesuch const&&) = delete;
      type detector (line 2257) | struct detector
      type is_detected_lazy (line 2274) | struct is_detected_lazy : is_detected<Op, Args...> { }
      function replace_substring (line 2656) | inline void replace_substring(std::string& s, const std::string& f,
      function escape (line 2674) | inline std::string escape(std::string s)
      function unescape (line 2688) | static void unescape(std::string& s)
      type position_t (line 2707) | struct position_t
      class exception (line 2765) | class exception : public std::exception
        method JSON_HEDLEY_NON_NULL (line 2778) | JSON_HEDLEY_NON_NULL(3)
        method name (line 2781) | static std::string name(const std::string& ename, int id_)
        method diagnostics (line 2787) | static std::string diagnostics(const BasicJsonType& leaf_element)
      class parse_error (line 2900) | class parse_error : public exception
        method parse_error (line 2913) | static parse_error create(int id_, const position_t& pos, const st...
        method parse_error (line 2921) | static parse_error create(int id_, std::size_t byte_, const std::s...
        method parse_error (line 2941) | parse_error(int id_, std::size_t byte_, const char* what_arg)
        method position_string (line 2944) | static std::string position_string(const position_t& pos)
      class invalid_iterator (line 2988) | class invalid_iterator : public exception
        method invalid_iterator (line 2992) | static invalid_iterator create(int id_, const std::string& what_ar...
        method JSON_HEDLEY_NON_NULL (line 2999) | JSON_HEDLEY_NON_NULL(3)
      class type_error (line 3043) | class type_error : public exception
        method type_error (line 3047) | static type_error create(int id_, const std::string& what_arg, con...
        method JSON_HEDLEY_NON_NULL (line 3054) | JSON_HEDLEY_NON_NULL(3)
      class out_of_range (line 3091) | class out_of_range : public exception
        method out_of_range (line 3095) | static out_of_range create(int id_, const std::string& what_arg, c...
        method JSON_HEDLEY_NON_NULL (line 3102) | JSON_HEDLEY_NON_NULL(3)
      class other_error (line 3130) | class other_error : public exception
        method other_error (line 3134) | static other_error create(int id_, const std::string& what_arg, co...
        method JSON_HEDLEY_NON_NULL (line 3141) | JSON_HEDLEY_NON_NULL(3)
      type integer_sequence (line 3206) | struct integer_sequence
        method size (line 3209) | static constexpr std::size_t size() noexcept
      type utility_internal (line 3223) | namespace utility_internal
        type Extend (line 3227) | struct Extend
        type Gen (line 3245) | struct Gen
        type Gen<T, 0> (line 3252) | struct Gen<T, 0>
      type priority_tag (line 3290) | struct priority_tag : priority_tag < N - 1 > {}
      type priority_tag<0> (line 3291) | struct priority_tag<0> {}
      type static_const (line 3295) | struct static_const
      type identity_tag (line 3314) | struct identity_tag {}
      type iterator_types (line 3344) | struct iterator_types {}
      type iterator_types <
    It,
    void_t<typename It::difference_type, typename It::value_type, typename It::pointer,
    typename It::reference, typename It::iterator_category >> (line 3347) | struct iterator_types <
      type iterator_traits (line 3362) | struct iterator_traits
      type iterator_traits < T, enable_if_t < !std::is_pointer<T>::value >> (line 3367) | struct iterator_traits < T, enable_if_t < !std::is_pointer<T>::value >>
      type iterator_traits<T*, enable_if_t<std::is_object<T>::value>> (line 3373) | struct iterator_traits<T*, enable_if_t<std::is_object<T>::value>>
      type is_basic_json (line 3516) | struct is_basic_json : std::false_type {}
      class json_ref (line 3526) | class json_ref
        method json_ref (line 13465) | json_ref(value_type&& value)
        method json_ref (line 13469) | json_ref(const value_type& value)
        method json_ref (line 13473) | json_ref(std::initializer_list<json_ref> init)
        method json_ref (line 13480) | json_ref(Args && ... args)
        method json_ref (line 13485) | json_ref(json_ref&&) noexcept = default;
        method json_ref (line 13486) | json_ref(const json_ref&) = delete;
        method json_ref (line 13487) | json_ref& operator=(const json_ref&) = delete;
        method json_ref (line 13488) | json_ref& operator=(json_ref&&) = delete;
        method value_type (line 13491) | value_type moved_or_copied() const
        method value_type (line 13500) | value_type const& operator*() const
        method value_type (line 13505) | value_type const* operator->() const
      type is_json_ref (line 3529) | struct is_json_ref : std::false_type {}
      type is_json_ref<json_ref<T>> (line 3532) | struct is_json_ref<json_ref<T>> : std::true_type {}
      type has_from_json (line 3570) | struct has_from_json : std::false_type {}
      type is_getable (line 3577) | struct is_getable
      type has_from_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >> (line 3583) | struct has_from_json < BasicJsonType, T, enable_if_t < !is_basic_jso...
      type has_non_default_from_json (line 3595) | struct has_non_default_from_json : std::false_type {}
      type has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >> (line 3598) | struct has_non_default_from_json < BasicJsonType, T, enable_if_t < !...
      type has_to_json (line 3610) | struct has_to_json : std::false_type {}
      type has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >> (line 3613) | struct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json<...
      type conjunction (line 3628) | struct conjunction : std::true_type { }
      type conjunction<B1> (line 3629) | struct conjunction<B1> : B1 { }
      type negation (line 3635) | struct negation : std::integral_constant < bool, !B::value > { }
      type is_default_constructible (line 3641) | struct is_default_constructible : std::is_default_constructible<T> {}
      type is_default_constructible<std::pair<T1, T2>> (line 3644) | struct is_default_constructible<std::pair<T1, T2>>
      type is_default_constructible<const std::pair<T1, T2>> (line 3648) | struct is_default_constructible<const std::pair<T1, T2>>
      type is_constructible (line 3661) | struct is_constructible : std::is_constructible<T, Args...> {}
      type is_constructible<std::pair<T1, T2>> (line 3664) | struct is_constructible<std::pair<T1, T2>> : is_default_constructibl...
      type is_constructible<const std::pair<T1, T2>> (line 3667) | struct is_constructible<const std::pair<T1, T2>> : is_default_constr...
      type is_iterator_traits (line 3677) | struct is_iterator_traits : std::false_type {}
      type is_iterator_traits<iterator_traits<T>> (line 3680) | struct is_iterator_traits<iterator_traits<T>>
      type is_range (line 3695) | struct is_range
      type is_complete_type (line 3724) | struct is_complete_type : std::false_type {}
      type is_complete_type<T, decltype(void(sizeof(T)))> (line 3727) | struct is_complete_type<T, decltype(void(sizeof(T)))> : std::true_ty...
      type is_compatible_object_type_impl (line 3731) | struct is_compatible_object_type_impl : std::false_type {}
      type is_compatible_object_type_impl <
    BasicJsonType, CompatibleObjectType,
    enable_if_t < is_detected<mapped_type_t, CompatibleObjectType>::value&&
    is_detected<key_type_t, CompatibleObjectType>::value >> (line 3734) | struct is_compatible_object_type_impl <
      type is_compatible_object_type (line 3750) | struct is_compatible_object_type
      type is_constructible_object_type_impl (line 3755) | struct is_constructible_object_type_impl : std::false_type {}
      type is_constructible_object_type_impl <
    BasicJsonType, ConstructibleObjectType,
    enable_if_t < is_detected<mapped_type_t, ConstructibleObjectType>::value&&
    is_detected<key_type_t, ConstructibleObjectType>::value >> (line 3758) | struct is_constructible_object_type_impl <
      type is_constructible_object_type (line 3782) | struct is_constructible_object_type
      type is_compatible_string_type (line 3787) | struct is_compatible_string_type
      type is_constructible_string_type (line 3794) | struct is_constructible_string_type
      type is_compatible_array_type_impl (line 3802) | struct is_compatible_array_type_impl : std::false_type {}
      type is_compatible_array_type (line 3820) | struct is_compatible_array_type
      type is_constructible_array_type_impl (line 3824) | struct is_constructible_array_type_impl : std::false_type {}
      type is_constructible_array_type_impl <
    BasicJsonType, ConstructibleArrayType,
    enable_if_t<std::is_same<ConstructibleArrayType,
    typename BasicJsonType::value_type>::value >> (line 3827) | struct is_constructible_array_type_impl <
      type is_constructible_array_type (line 3864) | struct is_constructible_array_type
      type is_compatible_integer_type_impl (line 3869) | struct is_compatible_integer_type_impl : std::false_type {}
      type is_compatible_integer_type_impl <
    RealIntegerType, CompatibleNumberIntegerType,
    enable_if_t < std::is_integral<RealIntegerType>::value&&
    std::is_integral<CompatibleNumberIntegerType>::value&&
    !std::is_same<bool, CompatibleNumberIntegerType>::value >> (line 3872) | struct is_compatible_integer_type_impl <
      type is_compatible_integer_type (line 3890) | struct is_compatible_integer_type
      type is_compatible_type_impl (line 3895) | struct is_compatible_type_impl: std::false_type {}
      type is_compatible_type_impl <
    BasicJsonType, CompatibleType,
    enable_if_t<is_complete_type<CompatibleType>::value >> (line 3898) | struct is_compatible_type_impl <
      type is_compatible_type (line 3907) | struct is_compatible_type
      type is_constructible_tuple (line 3911) | struct is_constructible_tuple : std::false_type {}
      type is_ordered_map (line 3919) | struct is_ordered_map
        type two (line 3923) | struct two
      function T (line 3936) | T conditional_static_cast(U value)
      function T (line 3942) | T conditional_static_cast(U value)
      function from_json (line 3962) | void from_json(const BasicJsonType& j, typename std::nullptr_t& n)
      function get_arithmetic_value (line 3976) | void get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val)
      function from_json (line 4009) | void from_json(const BasicJsonType& j, typename BasicJsonType::boole...
      function from_json (line 4019) | void from_json(const BasicJsonType& j, typename BasicJsonType::strin...
      function from_json (line 4035) | void from_json(const BasicJsonType& j, ConstructibleStringType& s)
      function from_json (line 4046) | void from_json(const BasicJsonType& j, typename BasicJsonType::numbe...
      function from_json (line 4052) | void from_json(const BasicJsonType& j, typename BasicJsonType::numbe...
      function from_json (line 4058) | void from_json(const BasicJsonType& j, typename BasicJsonType::numbe...
      function from_json (line 4065) | void from_json(const BasicJsonType& j, EnumType& e)
      function from_json (line 4075) | void from_json(const BasicJsonType& j, std::forward_list<T, Allocato...
      function from_json (line 4092) | void from_json(const BasicJsonType& j, std::valarray<T>& l)
      function from_json (line 4107) | auto from_json(const BasicJsonType& j, T (&arr)[N])  // NOLINT(cppco...
      function from_json_array_impl (line 4117) | void from_json_array_impl(const BasicJsonType& j, typename BasicJson...
      function from_json_array_impl (line 4123) | auto from_json_array_impl(const BasicJsonType& j, std::array<T, N>& ...
      function from_json_array_impl (line 4137) | auto from_json_array_impl(const BasicJsonType& j, ConstructibleArray...
      function from_json_array_impl (line 4161) | void from_json_array_impl(const BasicJsonType& j, ConstructibleArray...
      function from_json (line 4186) | auto from_json(const BasicJsonType& j, ConstructibleArrayType& arr)
      function from_json_inplace_array_impl (line 4200) | std::array<T, sizeof...(Idx)> from_json_inplace_array_impl(BasicJson...
      function from_json (line 4207) | auto from_json(BasicJsonType&& j, identity_tag<std::array<T, N>> tag)
      function from_json (line 4219) | void from_json(const BasicJsonType& j, typename BasicJsonType::binar...
      function from_json (line 4231) | void from_json(const BasicJsonType& j, ConstructibleObjectType& obj)
      function from_json (line 4263) | void from_json(const BasicJsonType& j, ArithmeticType& val)
      function from_json_tuple_impl_base (line 4300) | std::tuple<Args...> from_json_tuple_impl_base(BasicJsonType&& j, ind...
      function from_json_tuple_impl (line 4306) | std::pair<A1, A2> from_json_tuple_impl(BasicJsonType&& j, identity_t...
      function from_json_tuple_impl (line 4313) | void from_json_tuple_impl(BasicJsonType&& j, std::pair<A1, A2>& p, p...
      function from_json_tuple_impl (line 4319) | std::tuple<Args...> from_json_tuple_impl(BasicJsonType&& j, identity...
      function from_json_tuple_impl (line 4325) | void from_json_tuple_impl(BasicJsonType&& j, std::tuple<Args...>& t,...
      function from_json (line 4331) | auto from_json(BasicJsonType&& j, TupleRelated&& t)
      function from_json (line 4345) | void from_json(const BasicJsonType& j, std::map<Key, Value, Compare,...
      function from_json (line 4365) | void from_json(const BasicJsonType& j, std::unordered_map<Key, Value...
      function from_json (line 4384) | void from_json(const BasicJsonType& j, std::filesystem::path& p)
      type from_json_fn (line 4394) | struct from_json_fn
      function int_to_string (line 4448) | void int_to_string( string_type& target, std::size_t value )
      class iteration_proxy_value (line 4454) | class iteration_proxy_value
        method iteration_proxy_value (line 4477) | explicit iteration_proxy_value(IteratorType it) noexcept
        method iteration_proxy_value (line 4482) | iteration_proxy_value& operator*()
        method iteration_proxy_value (line 4488) | iteration_proxy_value& operator++()
        method string_type (line 4509) | const string_type& key() const
        method value (line 4545) | typename IteratorType::reference value() const
      class iteration_proxy (line 4552) | class iteration_proxy
        method iteration_proxy (line 4560) | explicit iteration_proxy(typename IteratorType::reference cont) no...
        method begin (line 4564) | iteration_proxy_value<IteratorType> begin() noexcept
        method end (line 4570) | iteration_proxy_value<IteratorType> end() noexcept
      function get (line 4579) | auto get(const nlohmann::detail::iteration_proxy_value<IteratorType>...
      function get (line 4587) | auto get(const nlohmann::detail::iteration_proxy_value<IteratorType>...
      type external_constructor (line 4648) | struct external_constructor
      type external_constructor<value_t::boolean> (line 4651) | struct external_constructor<value_t::boolean>
        method construct (line 4654) | static void construct(BasicJsonType& j, typename BasicJsonType::bo...
      type external_constructor<value_t::string> (line 4664) | struct external_constructor<value_t::string>
        method construct (line 4667) | static void construct(BasicJsonType& j, const typename BasicJsonTy...
        method construct (line 4676) | static void construct(BasicJsonType& j, typename BasicJsonType::st...
        method construct (line 4687) | static void construct(BasicJsonType& j, const CompatibleStringType...
      type external_constructor<value_t::binary> (line 4697) | struct external_constructor<value_t::binary>
        method construct (line 4700) | static void construct(BasicJsonType& j, const typename BasicJsonTy...
        method construct (line 4709) | static void construct(BasicJsonType& j, typename BasicJsonType::bi...
      type external_constructor<value_t::number_float> (line 4719) | struct external_constructor<value_t::number_float>
        method construct (line 4722) | static void construct(BasicJsonType& j, typename BasicJsonType::nu...
      type external_constructor<value_t::number_unsigned> (line 4732) | struct external_constructor<value_t::number_unsigned>
        method construct (line 4735) | static void construct(BasicJsonType& j, typename BasicJsonType::nu...
      type external_constructor<value_t::number_integer> (line 4745) | struct external_constructor<value_t::number_integer>
        method construct (line 4748) | static void construct(BasicJsonType& j, typename BasicJsonType::nu...
      type external_constructor<value_t::array> (line 4758) | struct external_constructor<value_t::array>
        method construct (line 4761) | static void construct(BasicJsonType& j, const typename BasicJsonTy...
        method construct (line 4771) | static void construct(BasicJsonType& j, typename BasicJsonType::ar...
        method construct (line 4783) | static void construct(BasicJsonType& j, const CompatibleArrayType&...
        method construct (line 4796) | static void construct(BasicJsonType& j, const std::vector<bool>& arr)
        method construct (line 4812) | static void construct(BasicJsonType& j, const std::valarray<T>& arr)
      type external_constructor<value_t::object> (line 4828) | struct external_constructor<value_t::object>
        method construct (line 4831) | static void construct(BasicJsonType& j, const typename BasicJsonTy...
        method construct (line 4841) | static void construct(BasicJsonType& j, typename BasicJsonType::ob...
        method construct (line 4852) | static void construct(BasicJsonType& j, const CompatibleObjectType...
      function to_json (line 4871) | void to_json(BasicJsonType& j, T b) noexcept
      function to_json (line 4878) | void to_json(BasicJsonType& j, const CompatibleString& s)
      function to_json (line 4884) | void to_json(BasicJsonType& j, typename BasicJsonType::string_t&& s)
      function to_json (line 4891) | void to_json(BasicJsonType& j, FloatType val) noexcept
      function to_json (line 4898) | void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noe...
      function to_json (line 4905) | void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noex...
      function to_json (line 4912) | void to_json(BasicJsonType& j, EnumType e) noexcept
      function to_json (line 4919) | void to_json(BasicJsonType& j, const std::vector<bool>& e)
      function to_json (line 4932) | void to_json(BasicJsonType& j, const CompatibleArrayType& arr)
      function to_json (line 4938) | void to_json(BasicJsonType& j, const typename BasicJsonType::binary_...
      function to_json (line 4945) | void to_json(BasicJsonType& j, const std::valarray<T>& arr)
      function to_json (line 4951) | void to_json(BasicJsonType& j, typename BasicJsonType::array_t&& arr)
      function to_json (line 4958) | void to_json(BasicJsonType& j, const CompatibleObjectType& obj)
      function to_json (line 4964) | void to_json(BasicJsonType& j, typename BasicJsonType::object_t&& obj)
      function to_json (line 4974) | void to_json(BasicJsonType& j, const T(&arr)[N]) // NOLINT(cppcoregu...
      function to_json (line 4980) | void to_json(BasicJsonType& j, const std::pair<T1, T2>& p)
      function to_json (line 4988) | void to_json(BasicJsonType& j, const T& b)
      function to_json_tuple_impl (line 4994) | void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequ...
      function to_json (line 5000) | void to_json(BasicJsonType& j, const T& t)
      function to_json (line 5007) | void to_json(BasicJsonType& j, const std::filesystem::path& p)
      type to_json_fn (line 5013) | struct to_json_fn
      function combine (line 5297) | inline std::size_t combine(std::size_t seed, std::size_t h) noexcept
      function hash (line 5315) | std::size_t hash(const BasicJsonType& j)
      type input_format_t (line 5451) | enum class input_format_t { json, cbor, msgpack, ubjson, bson }
      class file_input_adapter (line 5462) | class file_input_adapter
        method file_input_adapter (line 5468) | explicit file_input_adapter(std::FILE* f) noexcept
        method file_input_adapter (line 5473) | file_input_adapter(const file_input_adapter&) = delete;
        method file_input_adapter (line 5474) | file_input_adapter(file_input_adapter&&) noexcept = default;
        method file_input_adapter (line 5475) | file_input_adapter& operator=(const file_input_adapter&) = delete;
        method file_input_adapter (line 5476) | file_input_adapter& operator=(file_input_adapter&&) = delete;
        method get_character (line 5479) | std::char_traits<char>::int_type get_character() noexcept
      class input_stream_adapter (line 5499) | class input_stream_adapter
        method input_stream_adapter (line 5514) | explicit input_stream_adapter(std::istream& i)
        method input_stream_adapter (line 5519) | input_stream_adapter(const input_stream_adapter&) = delete;
        method input_stream_adapter (line 5520) | input_stream_adapter& operator=(input_stream_adapter&) = delete;
        method input_stream_adapter (line 5521) | input_stream_adapter& operator=(input_stream_adapter&&) = delete;
        method input_stream_adapter (line 5523) | input_stream_adapter(input_stream_adapter&& rhs) noexcept
        method get_character (line 5533) | std::char_traits<char>::int_type get_character()
      class iterator_input_adapter (line 5554) | class iterator_input_adapter
        method iterator_input_adapter (line 5559) | iterator_input_adapter(IteratorType first, IteratorType last)
        method get_character (line 5563) | typename std::char_traits<char_type>::int_type get_character()
        method empty (line 5582) | bool empty() const
      type wide_string_input_helper (line 5590) | struct wide_string_input_helper
      type wide_string_input_helper<BaseInputAdapter, 4> (line 5593) | struct wide_string_input_helper<BaseInputAdapter, 4>
        method fill_buffer (line 5596) | static void fill_buffer(BaseInputAdapter& input,
      type wide_string_input_helper<BaseInputAdapter, 2> (line 5651) | struct wide_string_input_helper<BaseInputAdapter, 2>
        method fill_buffer (line 5654) | static void fill_buffer(BaseInputAdapter& input,
      class wide_string_input_adapter (line 5714) | class wide_string_input_adapter
        method wide_string_input_adapter (line 5719) | wide_string_input_adapter(BaseInputAdapter base)
        method get_character (line 5722) | typename std::char_traits<char>::int_type get_character() noexcept
        method fill_buffer (line 5743) | void fill_buffer()
      type iterator_input_adapter_factory (line 5759) | struct iterator_input_adapter_factory
        method adapter_type (line 5765) | static adapter_type create(IteratorType first, IteratorType last)
      type is_iterator_of_multibyte (line 5772) | struct is_iterator_of_multibyte
      type iterator_input_adapter_factory<IteratorType, enable_if_t<is_iterator_of_multibyte<IteratorType>::value>> (line 5782) | struct iterator_input_adapter_factory<IteratorType, enable_if_t<is_i...
        method adapter_type (line 5789) | static adapter_type create(IteratorType first, IteratorType last)
      function input_adapter (line 5797) | typename iterator_input_adapter_factory<IteratorType>::adapter_type ...
      type container_input_adapter_factory_impl (line 5807) | namespace container_input_adapter_factory_impl
        type container_input_adapter_factory (line 5814) | struct container_input_adapter_factory {}
        type container_input_adapter_factory< ContainerType,
       void_t<decltype(begin(std::declval<ContainerType>()), end(std::declval<ContainerType>()))>> (line 5817) | struct container_input_adapter_factory< ContainerType,
          method adapter_type (line 5822) | static adapter_type create(const ContainerType& container)
      function input_adapter (line 5831) | typename container_input_adapter_factory_impl::container_input_adapt...
      function file_input_adapter (line 5838) | inline file_input_adapter input_adapter(std::FILE* file)
        method file_input_adapter (line 5468) | explicit file_input_adapter(std::FILE* f) noexcept
        method file_input_adapter (line 5473) | file_input_adapter(const file_input_adapter&) = delete;
        method file_input_adapter (line 5474) | file_input_adapter(file_input_adapter&&) noexcept = default;
        method file_input_adapter (line 5475) | file_input_adapter& operator=(const file_input_adapter&) = delete;
        method file_input_adapter (line 5476) | file_input_adapter& operator=(file_input_adapter&&) = delete;
        method get_character (line 5479) | std::char_traits<char>::int_type get_character() noexcept
      function input_stream_adapter (line 5843) | inline input_stream_adapter input_adapter(std::istream& stream)
        method input_stream_adapter (line 5514) | explicit input_stream_adapter(std::istream& i)
        method input_stream_adapter (line 5519) | input_stream_adapter(const input_stream_adapter&) = delete;
        method input_stream_adapter (line 5520) | input_stream_adapter& operator=(input_stream_adapter&) = delete;
        method input_stream_adapter (line 5521) | input_stream_adapter& operator=(input_stream_adapter&&) = delete;
        method input_stream_adapter (line 5523) | input_stream_adapter(input_stream_adapter&& rhs) noexcept
        method get_character (line 5533) | std::char_traits<char>::int_type get_character()
      function input_stream_adapter (line 5848) | inline input_stream_adapter input_adapter(std::istream&& stream)
        method input_stream_adapter (line 5514) | explicit input_stream_adapter(std::istream& i)
        method input_stream_adapter (line 5519) | input_stream_adapter(const input_stream_adapter&) = delete;
        method input_stream_adapter (line 5520) | input_stream_adapter& operator=(input_stream_adapter&) = delete;
        method input_stream_adapter (line 5521) | input_stream_adapter& operator=(input_stream_adapter&&) = delete;
        method input_stream_adapter (line 5523) | input_stream_adapter(input_stream_adapter&& rhs) noexcept
        method get_character (line 5533) | std::char_traits<char>::int_type get_character()
      function contiguous_bytes_input_adapter (line 5864) | contiguous_bytes_input_adapter input_adapter(CharT b)
      function input_adapter (line 5872) | auto input_adapter(T (&array)[N]) -> decltype(input_adapter(array, a...
      class span_input_adapter (line 5880) | class span_input_adapter
        method span_input_adapter (line 5889) | span_input_adapter(CharT b, std::size_t l)
        method span_input_adapter (line 5896) | span_input_adapter(IteratorType first, IteratorType last)
        method contiguous_bytes_input_adapter (line 5899) | contiguous_bytes_input_adapter&& get()
      class json_sax_dom_parser (line 6066) | class json_sax_dom_parser
        method json_sax_dom_parser (line 6080) | explicit json_sax_dom_parser(BasicJsonType& r, const bool allow_ex...
        method json_sax_dom_parser (line 6085) | json_sax_dom_parser(const json_sax_dom_parser&) = delete;
        method json_sax_dom_parser (line 6086) | json_sax_dom_parser(json_sax_dom_parser&&) = default;
        method json_sax_dom_parser (line 6087) | json_sax_dom_parser& operator=(const json_sax_dom_parser&) = delete;
        method json_sax_dom_parser (line 6088) | json_sax_dom_parser& operator=(json_sax_dom_parser&&) = default;
        method null (line 6091) | bool null()
        method boolean (line 6097) | bool boolean(bool val)
        method number_integer (line 6103) | bool number_integer(number_integer_t val)
        method number_unsigned (line 6109) | bool number_unsigned(number_unsigned_t val)
        method number_float (line 6115) | bool number_float(number_float_t val, const string_t& /*unused*/)
        method string (line 6121) | bool string(string_t& val)
        method binary (line 6127) | bool binary(binary_t& val)
        method start_object (line 6133) | bool start_object(std::size_t len)
        method key (line 6145) | bool key(string_t& val)
        method end_object (line 6152) | bool end_object()
        method start_array (line 6159) | bool start_array(std::size_t len)
        method end_array (line 6171) | bool end_array()
        method parse_error (line 6179) | bool parse_error(std::size_t /*unused*/, const std::string& /*unus...
        method is_errored (line 6191) | constexpr bool is_errored() const
        method JSON_HEDLEY_RETURNS_NON_NULL (line 6204) | JSON_HEDLEY_RETURNS_NON_NULL
      class json_sax_dom_callback_parser (line 6240) | class json_sax_dom_callback_parser
        method json_sax_dom_callback_parser (line 6251) | json_sax_dom_callback_parser(BasicJsonType& r,
        method json_sax_dom_callback_parser (line 6260) | json_sax_dom_callback_parser(const json_sax_dom_callback_parser&) ...
        method json_sax_dom_callback_parser (line 6261) | json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) = def...
        method json_sax_dom_callback_parser (line 6262) | json_sax_dom_callback_parser& operator=(const json_sax_dom_callbac...
        method json_sax_dom_callback_parser (line 6263) | json_sax_dom_callback_parser& operator=(json_sax_dom_callback_pars...
        method null (line 6266) | bool null()
        method boolean (line 6272) | bool boolean(bool val)
        method number_integer (line 6278) | bool number_integer(number_integer_t val)
        method number_unsigned (line 6284) | bool number_unsigned(number_unsigned_t val)
        method number_float (line 6290) | bool number_float(number_float_t val, const string_t& /*unused*/)
        method string (line 6296) | bool string(string_t& val)
        method binary (line 6302) | bool binary(binary_t& val)
        method start_object (line 6308) | bool start_object(std::size_t len)
        method key (line 6326) | bool key(string_t& val)
        method end_object (line 6343) | bool end_object()
        method start_array (line 6379) | bool start_array(std::size_t len)
        method end_array (line 6396) | bool end_array()
        method parse_error (line 6429) | bool parse_error(std::size_t /*unused*/, const std::string& /*unus...
        method is_errored (line 6441) | constexpr bool is_errored() const
        method handle_value (line 6463) | std::pair<bool, BasicJsonType*> handle_value(Value&& v, const bool...
      class json_sax_acceptor (line 6547) | class json_sax_acceptor
        method null (line 6556) | bool null()
        method boolean (line 6561) | bool boolean(bool /*unused*/)
        method number_integer (line 6566) | bool number_integer(number_integer_t /*unused*/)
        method number_unsigned (line 6571) | bool number_unsigned(number_unsigned_t /*unused*/)
        method number_float (line 6576) | bool number_float(number_float_t /*unused*/, const string_t& /*unu...
        method string (line 6581) | bool string(string_t& /*unused*/)
        method binary (line 6586) | bool binary(binary_t& /*unused*/)
        method start_object (line 6591) | bool start_object(std::size_t /*unused*/ = std::size_t(-1))
        method key (line 6596) | bool key(string_t& /*unused*/)
        method end_object (line 6601) | bool end_object()
        method start_array (line 6606) | bool start_array(std::size_t /*unused*/ = std::size_t(-1))
        method end_array (line 6611) | bool end_array()
        method parse_error (line 6616) | bool parse_error(std::size_t /*unused*/, const std::string& /*unus...
      class lexer_base (line 6654) | class lexer_base
        type token_type (line 6658) | enum class token_type
      class lexer (line 6731) | class lexer : public lexer_base<BasicJsonType>
        method lexer (line 6743) | explicit lexer(InputAdapterType&& adapter, bool ignore_comments_ =...
        method lexer (line 6750) | lexer(const lexer&) = delete;
        method lexer (line 6751) | lexer(lexer&&) = default;
        method lexer (line 6752) | lexer& operator=(lexer&) = delete;
        method lexer (line 6753) | lexer& operator=(lexer&&) = default;
        method JSON_HEDLEY_PURE (line 6762) | JSON_HEDLEY_PURE
        method get_codepoint (line 6789) | int get_codepoint()
        method next_byte_in_range (line 6837) | bool next_byte_in_range(std::initializer_list<char_int_type> ranges)
        method token_type (line 6874) | token_type scan_string()
        method scan_comment (line 7464) | bool scan_comment()
        method strtof (line 7532) | static void strtof(float& f, const char* str, char** endptr) noexcept
        method strtof (line 7538) | static void strtof(double& f, const char* str, char** endptr) noex...
        method strtof (line 7544) | static void strtof(long double& f, const char* str, char** endptr)...
        method token_type (line 7589) | token_type scan_number()  // lgtm [cpp/use-of-goto]
      type is_sax (line 8322) | struct is_sax
      type is_sax_static_asserts (line 8353) | struct is_sax_static_asserts
      type cbor_tag_handler_t (line 8419) | enum class cbor_tag_handler_t
      function little_endianess (line 8433) | static inline bool little_endianess(int num = 1) noexcept
      class binary_reader (line 8447) | class binary_reader
        method binary_reader (line 8464) | explicit binary_reader(InputAdapterType&& adapter) noexcept : ia(s...
        method binary_reader (line 8470) | binary_reader(const binary_reader&) = delete;
        method binary_reader (line 8471) | binary_reader(binary_reader&&) = default;
        method binary_reader (line 8472) | binary_reader& operator=(const binary_reader&) = delete;
        method binary_reader (line 8473) | binary_reader& operator=(binary_reader&&) = default;
        method JSON_HEDLEY_NON_NULL (line 8484) | JSON_HEDLEY_NON_NULL(3)
        method parse_bson_internal (line 8547) | bool parse_bson_internal()
        method get_bson_cstr (line 8572) | bool get_bson_cstr(string_t& result)
        method get_bson_string (line 8602) | bool get_bson_string(const NumberType len, string_t& result)
        method get_bson_binary (line 8623) | bool get_bson_binary(const NumberType len, binary_t& result)
        method parse_bson_element_internal (line 8649) | bool parse_bson_element_internal(const char_int_type element_type,
        method parse_bson_element_list (line 8727) | bool parse_bson_element_list(const bool is_array)
        method parse_bson_array (line 8765) | bool parse_bson_array()
        method parse_cbor_internal (line 8795) | bool parse_cbor_internal(const bool get_char,
        method get_cbor_string (line 9283) | bool get_cbor_string(string_t& result)
        method get_cbor_binary (line 9378) | bool get_cbor_binary(binary_t& result)
        method get_cbor_array (line 9472) | bool get_cbor_array(const std::size_t len,
        method get_cbor_object (line 9510) | bool get_cbor_object(const std::size_t len,
        method parse_msgpack_internal (line 9566) | bool parse_msgpack_internal()
        method get_msgpack_string (line 9946) | bool get_msgpack_string(string_t& result)
        method get_msgpack_binary (line 10028) | bool get_msgpack_binary(binary_t& result)
        method get_msgpack_array (line 10139) | bool get_msgpack_array(const std::size_t len)
        method get_msgpack_object (line 10161) | bool get_msgpack_object(const std::size_t len)
        method parse_ubjson_internal (line 10198) | bool parse_ubjson_internal(const bool get_char = true)
        method get_ubjson_string (line 10217) | bool get_ubjson_string(string_t& result, const bool get_char = true)
        method get_ubjson_size_value (line 10271) | bool get_ubjson_size_value(std::size_t& result)
        method get_ubjson_size_type (line 10348) | bool get_ubjson_size_type(std::pair<std::size_t, char_int_type>& r...
        method get_ubjson_value (line 10389) | bool get_ubjson_value(const char_int_type prefix)
        method get_ubjson_array (line 10490) | bool get_ubjson_array()
        method get_ubjson_object (line 10552) | bool get_ubjson_object()
        method get_ubjson_high_precision_number (line 10627) | bool get_ubjson_high_precision_number()
        method char_int_type (line 10703) | char_int_type get()
        method char_int_type (line 10712) | char_int_type get_ignore_noop()
        method get_number (line 10737) | bool get_number(const input_format_t format, NumberType& result)
        method get_string (line 10780) | bool get_string(const input_format_t format,
        method get_binary (line 10813) | bool get_binary(const input_format_t format,
        method JSON_HEDLEY_NON_NULL (line 10836) | JSON_HEDLEY_NON_NULL(3)
        method get_token_string (line 10850) | std::string get_token_string() const
        method exception_message (line 10863) | std::string exception_message(const input_format_t format,
      type parse_event_t (line 10951) | enum class parse_event_t : std::uint8_t
      class parser (line 10977) | class parser
        method parser (line 10988) | explicit parser(InputAdapterType&& adapter,
        method parse (line 11010) | void parse(const bool strict, BasicJsonType& result)
        method accept (line 11070) | bool accept(const bool strict = true)
        method sax_parse (line 11078) | bool sax_parse(SAX* sax, const bool strict = true)
        method sax_parse_internal (line 11097) | bool sax_parse_internal(SAX* sax)
        method token_type (line 11378) | token_type get_token()
        method exception_message (line 11383) | std::string exception_message(const token_type expected, const std...
      class primitive_iterator_t (line 11451) | class primitive_iterator_t
        method difference_type (line 11463) | constexpr difference_type get_value() const noexcept
        method set_begin (line 11469) | void set_begin() noexcept
        method set_end (line 11475) | void set_end() noexcept
        method is_begin (line 11481) | constexpr bool is_begin() const noexcept
        method is_end (line 11487) | constexpr bool is_end() const noexcept
        method primitive_iterator_t (line 11502) | primitive_iterator_t operator+(difference_type n) noexcept
        method difference_type (line 11509) | constexpr difference_type operator-(primitive_iterator_t lhs, prim...
        method primitive_iterator_t (line 11514) | primitive_iterator_t& operator++() noexcept
        method primitive_iterator_t (line 11520) | primitive_iterator_t const operator++(int) noexcept // NOLINT(read...
        method primitive_iterator_t (line 11527) | primitive_iterator_t& operator--() noexcept
        method primitive_iterator_t (line 11533) | primitive_iterator_t const operator--(int) noexcept // NOLINT(read...
        method primitive_iterator_t (line 11540) | primitive_iterator_t& operator+=(difference_type n) noexcept
        method primitive_iterator_t (line 11546) | primitive_iterator_t& operator-=(difference_type n) noexcept
      type internal_iterator (line 11566) | struct internal_iterator
      class iteration_proxy (line 11604) | class iteration_proxy
        method iteration_proxy (line 4560) | explicit iteration_proxy(typename IteratorType::reference cont) no...
        method begin (line 4564) | iteration_proxy_value<IteratorType> begin() noexcept
        method end (line 4570) | iteration_proxy_value<IteratorType> end() noexcept
      class iteration_proxy_value (line 11605) | class iteration_proxy_value
        method iteration_proxy_value (line 4477) | explicit iteration_proxy_value(IteratorType it) noexcept
        method iteration_proxy_value (line 4482) | iteration_proxy_value& operator*()
        method iteration_proxy_value (line 4488) | iteration_proxy_value& operator++()
        method string_type (line 4509) | const string_type& key() const
        method value (line 4545) | typename IteratorType::reference value() const
      function set_end (line 11624) | class iter_impl
      class json_reverse_iterator (line 12362) | class json_reverse_iterator : public std::reverse_iterator<Base>
        method json_reverse_iterator (line 12372) | explicit json_reverse_iterator(const typename base_iterator::itera...
        method json_reverse_iterator (line 12376) | explicit json_reverse_iterator(const base_iterator& it) noexcept :...
        method json_reverse_iterator (line 12379) | json_reverse_iterator const operator++(int) // NOLINT(readability-...
        method json_reverse_iterator (line 12385) | json_reverse_iterator& operator++()
        method json_reverse_iterator (line 12391) | json_reverse_iterator const operator--(int) // NOLINT(readability-...
        method json_reverse_iterator (line 12397) | json_reverse_iterator& operator--()
        method json_reverse_iterator (line 12403) | json_reverse_iterator& operator+=(difference_type i)
        method json_reverse_iterator (line 12409) | json_reverse_iterator operator+(difference_type i) const
        method json_reverse_iterator (line 12415) | json_reverse_iterator operator-(difference_type i) const
        method difference_type (line 12421) | difference_type operator-(const json_reverse_iterator& other) const
        method reference (line 12427) | reference operator[](difference_type n) const
        method key (line 12433) | auto key() const -> decltype(std::declval<Base>().key())
        method reference (line 12440) | reference value() const
      class json_ref (line 13460) | class json_ref
        method json_ref (line 13465) | json_ref(value_type&& value)
        method json_ref (line 13469) | json_ref(const value_type& value)
        method json_ref (line 13473) | json_ref(std::initializer_list<json_ref> init)
        method json_ref (line 13480) | json_ref(Args && ... args)
        method json_ref (line 13485) | json_ref(json_ref&&) noexcept = default;
        method json_ref (line 13486) | json_ref(const json_ref&) = delete;
        method json_ref (line 13487) | json_ref& operator=(const json_ref&) = delete;
        method json_ref (line 13488) | json_ref& operator=(json_ref&&) = delete;
        method value_type (line 13491) | value_type moved_or_copied() const
        method value_type (line 13500) | value_type const& operator*() const
        method value_type (line 13505) | value_type const* operator->() const
      type output_adapter_protocol (line 13564) | struct output_adapter_protocol
        method output_adapter_protocol (line 13570) | output_adapter_protocol() = default;
        method output_adapter_protocol (line 13571) | output_adapter_protocol(const output_adapter_protocol&) = default;
        method output_adapter_protocol (line 13572) | output_adapter_protocol(output_adapter_protocol&&) noexcept = defa...
        method output_adapter_protocol (line 13573) | output_adapter_protocol& operator=(const output_adapter_protocol&)...
        method output_adapter_protocol (line 13574) | output_adapter_protocol& operator=(output_adapter_protocol&&) noex...
      class output_vector_adapter (line 13583) | class output_vector_adapter : public output_adapter_protocol<CharType>
        method output_vector_adapter (line 13586) | explicit output_vector_adapter(std::vector<CharType, AllocatorType...
        method write_character (line 13590) | void write_character(CharType c) override
        method JSON_HEDLEY_NON_NULL (line 13595) | JSON_HEDLEY_NON_NULL(2)
      class output_stream_adapter (line 13608) | class output_stream_adapter : public output_adapter_protocol<CharType>
        method output_stream_adapter (line 13611) | explicit output_stream_adapter(std::basic_ostream<CharType>& s) no...
        method write_character (line 13615) | void write_character(CharType c) override
        method JSON_HEDLEY_NON_NULL (line 13620) | JSON_HEDLEY_NON_NULL(2)
      class output_string_adapter (line 13633) | class output_string_adapter : public output_adapter_protocol<CharType>
        method output_string_adapter (line 13636) | explicit output_string_adapter(StringType& s) noexcept
        method write_character (line 13640) | void write_character(CharType c) override
        method JSON_HEDLEY_NON_NULL (line 13645) | JSON_HEDLEY_NON_NULL(2)
      class output_adapter (line 13656) | class output_adapter
        method output_adapter (line 13660) | output_adapter(std::vector<CharType, AllocatorType>& vec)
        method output_adapter (line 13664) | output_adapter(std::basic_ostream<CharType>& s)
        method output_adapter (line 13668) | output_adapter(StringType& s)
      class binary_writer (line 13695) | class binary_writer
        method binary_writer (line 13707) | explicit binary_writer(output_adapter_t<CharType> adapter) : oa(st...
        method write_bson (line 13716) | void write_bson(const BasicJsonType& j)
        method write_cbor (line 13745) | void write_cbor(const BasicJsonType& j)
        method write_msgpack (line 14069) | void write_msgpack(const BasicJsonType& j)
        method write_ubjson (line 14394) | void write_ubjson(const BasicJsonType& j, const bool use_count,
        method calc_bson_entry_header_size (line 14602) | static std::size_t calc_bson_entry_header_size(const string_t& nam...
        method write_bson_entry_header (line 14617) | void write_bson_entry_header(const string_t& name,
        method write_bson_boolean (line 14629) | void write_bson_boolean(const string_t& name,
        method write_bson_double (line 14639) | void write_bson_double(const string_t& name,
        method calc_bson_string_size (line 14649) | static std::size_t calc_bson_string_size(const string_t& value)
        method write_bson_string (line 14657) | void write_bson_string(const string_t& name,
        method write_bson_null (line 14671) | void write_bson_null(const string_t& name)
        method calc_bson_integer_size (line 14679) | static std::size_t calc_bson_integer_size(const std::int64_t value)
        method write_bson_integer (line 14689) | void write_bson_integer(const string_t& name,
        method calc_bson_unsigned_size (line 14707) | static constexpr std::size_t calc_bson_unsigned_size(const std::ui...
        method write_bson_unsigned (line 14717) | void write_bson_unsigned(const string_t& name,
        method write_bson_object_entry (line 14739) | void write_bson_object_entry(const string_t& name,
        method calc_bson_array_size (line 14749) | static std::size_t calc_bson_array_size(const typename BasicJsonTy...
        method calc_bson_binary_size (line 14764) | static std::size_t calc_bson_binary_size(const typename BasicJsonT...
        method write_bson_array (line 14772) | void write_bson_array(const string_t& name,
        method write_bson_binary (line 14791) | void write_bson_binary(const string_t& name,
        method calc_bson_element_size (line 14806) | static std::size_t calc_bson_element_size(const string_t& name,
        method write_bson_element (line 14854) | void write_bson_element(const string_t& name,
        method calc_bson_object_size (line 14901) | static std::size_t calc_bson_object_size(const typename BasicJsonT...
        method write_bson_object (line 14916) | void write_bson_object(const typename BasicJsonType::object_t& value)
        method CharType (line 14932) | static constexpr CharType get_cbor_float_prefix(float /*unused*/)
        method CharType (line 14937) | static constexpr CharType get_cbor_float_prefix(double /*unused*/)
        method CharType (line 14946) | static constexpr CharType get_msgpack_float_prefix(float /*unused*/)
        method CharType (line 14951) | static constexpr CharType get_msgpack_float_prefix(double /*unused*/)
        method write_number_with_ubjson_prefix (line 14963) | void write_number_with_ubjson_prefix(const NumberType n,
        method write_number_with_ubjson_prefix (line 14976) | void write_number_with_ubjson_prefix(const NumberType n,
        method write_number_with_ubjson_prefix (line 15039) | void write_number_with_ubjson_prefix(const NumberType n,
        method CharType (line 15103) | CharType ubjson_prefix(const BasicJsonType& j) const noexcept
        method CharType (line 15184) | static constexpr CharType get_ubjson_float_prefix(float /*unused*/)
        method CharType (line 15189) | static constexpr CharType get_ubjson_float_prefix(double /*unused*/)
        method write_number (line 15210) | void write_number(const NumberType n)
        method write_compact_float (line 15226) | void write_compact_float(const number_float_t n, detail::input_for...
        method CharType (line 15260) | static constexpr CharType to_char_type(std::uint8_t x) noexcept
        method CharType (line 15267) | static CharType to_char_type(std::uint8_t x) noexcept
        method CharType (line 15278) | static constexpr CharType to_char_type(std::uint8_t x) noexcept
        method CharType (line 15289) | static constexpr CharType to_char_type(InputCharType x) noexcept
      type dtoa_impl (line 15358) | namespace dtoa_impl
        function Target (line 15362) | Target reinterpret_bits(const Source source)
        type diyfp (line 15371) | struct diyfp // f * 2^e
          method diyfp (line 15378) | constexpr diyfp(std::uint64_t f_, int e_) noexcept : f(f_), e(e_...
          method diyfp (line 15384) | static diyfp sub(const diyfp& x, const diyfp& y) noexcept
          method diyfp (line 15396) | static diyfp mul(const diyfp& x, const diyfp& y) noexcept
          method diyfp (line 15461) | static diyfp normalize(diyfp x) noexcept
          method diyfp (line 15478) | static diyfp normalize_to(const diyfp& x, const int target_expon...
        type boundaries (line 15489) | struct boundaries
        function boundaries (line 15503) | boundaries compute_boundaries(FloatType value)
        type cached_power (line 15628) | struct cached_power // c = f * 2^e ~= 10^k
        function cached_power (line 15642) | inline cached_power get_cached_power_for_binary_exponent(int e)
        function find_largest_pow10 (line 15806) | inline int find_largest_pow10(const std::uint32_t n, std::uint32_t...
        function grisu2_round (line 15860) | inline void grisu2_round(char* buf, int len, std::uint64_t dist, s...
        function grisu2_digit_gen (line 15901) | inline void grisu2_digit_gen(char* buffer, int& length, int& decim...
        function grisu2 (line 16142) | inline void grisu2(char* buf, int& len, int& decimal_exponent,
        function JSON_HEDLEY_NON_NULL (line 16201) | JSON_HEDLEY_NON_NULL(1)
      type error_handler_t (line 16456) | enum class error_handler_t
      class serializer (line 16464) | class serializer
        method serializer (line 16480) | serializer(output_adapter_t<char> s, const char ichar,
        method serializer (line 16492) | serializer(const serializer&) = delete;
        method serializer (line 16493) | serializer& operator=(const serializer&) = delete;
        method serializer (line 16494) | serializer(serializer&&) = delete;
        method serializer (line 16495) | serializer& operator=(serializer&&) = delete;
        method dump (line 16520) | void dump(const BasicJsonType& val,
        method switch (line 16818) | switch (decode(state, codepoint, byte))
    type detail (line 2241) | namespace detail
      type value_t (line 120) | enum class value_t : std::uint8_t
      type make_void (line 2229) | struct make_void
      type nonesuch (line 2243) | struct nonesuch
        method nonesuch (line 2245) | nonesuch() = delete;
        method nonesuch (line 2247) | nonesuch(nonesuch const&) = delete;
        method nonesuch (line 2248) | nonesuch(nonesuch const&&) = delete;
      type detector (line 2257) | struct detector
      type is_detected_lazy (line 2274) | struct is_detected_lazy : is_detected<Op, Args...> { }
      function replace_substring (line 2656) | inline void replace_substring(std::string& s, const std::string& f,
      function escape (line 2674) | inline std::string escape(std::string s)
      function unescape (line 2688) | static void unescape(std::string& s)
      type position_t (line 2707) | struct position_t
      class exception (line 2765) | class exception : public std::exception
        method JSON_HEDLEY_NON_NULL (line 2778) | JSON_HEDLEY_NON_NULL(3)
        method name (line 2781) | static std::string name(const std::string& ename, int id_)
        method diagnostics (line 2787) | static std::string diagnostics(const BasicJsonType& leaf_element)
      class parse_error (line 2900) | class parse_error : public exception
        method parse_error (line 2913) | static parse_error create(int id_, const position_t& pos, const st...
        method parse_error (line 2921) | static parse_error create(int id_, std::size_t byte_, const std::s...
        method parse_error (line 2941) | parse_error(int id_, std::size_t byte_, const char* what_arg)
        method position_string (line 2944) | static std::string position_string(const position_t& pos)
      class invalid_iterator (line 2988) | class invalid_iterator : public exception
        method invalid_iterator (line 2992) | static invalid_iterator create(int id_, const std::string& what_ar...
        method JSON_HEDLEY_NON_NULL (line 2999) | JSON_HEDLEY_NON_NULL(3)
      class type_error (line 3043) | class type_error : public exception
        method type_error (line 3047) | static type_error create(int id_, const std::string& what_arg, con...
        method JSON_HEDLEY_NON_NULL (line 3054) | JSON_HEDLEY_NON_NULL(3)
      class out_of_range (line 3091) | class out_of_range : public exception
        method out_of_range (line 3095) | static out_of_range create(int id_, const std::string& what_arg, c...
        method JSON_HEDLEY_NON_NULL (line 3102) | JSON_HEDLEY_NON_NULL(3)
      class other_error (line 3130) | class other_error : public exception
        method other_error (line 3134) | static other_error create(int id_, const std::string& what_arg, co...
        method JSON_HEDLEY_NON_NULL (line 3141) | JSON_HEDLEY_NON_NULL(3)
      type integer_sequence (line 3206) | struct integer_sequence
        method size (line 3209) | static constexpr std::size_t size() noexcept
      type utility_internal (line 3223) | namespace utility_internal
        type Extend (line 3227) | struct Extend
        type Gen (line 3245) | struct Gen
        type Gen<T, 0> (line 3252) | struct Gen<T, 0>
      type priority_tag (line 3290) | struct priority_tag : priority_tag < N - 1 > {}
      type priority_tag<0> (line 3291) | struct priority_tag<0> {}
      type static_const (line 3295) | struct static_const
      type identity_tag (line 3314) | struct identity_tag {}
      type iterator_types (line 3344) | struct iterator_types {}
      type iterator_types <
    It,
    void_t<typename It::difference_type, typename It::value_type, typename It::pointer,
    typename It::reference, typename It::iterator_category >> (line 3347) | struct iterator_types <
      type iterator_traits (line 3362) | struct iterator_traits
      type iterator_traits < T, enable_if_t < !std::is_pointer<T>::value >> (line 3367) | struct iterator_traits < T, enable_if_t < !std::is_pointer<T>::value >>
      type iterator_traits<T*, enable_if_t<std::is_object<T>::value>> (line 3373) | struct iterator_traits<T*, enable_if_t<std::is_object<T>::value>>
      type is_basic_json (line 3516) | struct is_basic_json : std::false_type {}
      class json_ref (line 3526) | class json_ref
        method json_ref (line 13465) | json_ref(value_type&& value)
        method json_ref (line 13469) | json_ref(const value_type& value)
        method json_ref (line 13473) | json_ref(std::initializer_list<json_ref> init)
        method json_ref (line 13480) | json_ref(Args && ... args)
        method json_ref (line 13485) | json_ref(json_ref&&) noexcept = default;
        method json_ref (line 13486) | json_ref(const json_ref&) = delete;
        method json_ref (line 13487) | json_ref& operator=(const json_ref&) = delete;
        method json_ref (line 13488) | json_ref& operator=(json_ref&&) = delete;
        method value_type (line 13491) | value_type moved_or_copied() const
        method value_type (line 13500) | value_type const& operator*() const
        method value_type (line 13505) | value_type const* operator->() const
      type is_json_ref (line 3529) | struct is_json_ref : std::false_type {}
      type is_json_ref<json_ref<T>> (line 3532) | struct is_json_ref<json_ref<T>> : std::true_type {}
      type has_from_json (line 3570) | struct has_from_json : std::false_type {}
      type is_getable (line 3577) | struct is_getable
      type has_from_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >> (line 3583) | struct has_from_json < BasicJsonType, T, enable_if_t < !is_basic_jso...
      type has_non_default_from_json (line 3595) | struct has_non_default_from_json : std::false_type {}
      type has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >> (line 3598) | struct has_non_default_from_json < BasicJsonType, T, enable_if_t < !...
      type has_to_json (line 3610) | struct has_to_json : std::false_type {}
      type has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >> (line 3613) | struct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json<...
      type conjunction (line 3628) | struct conjunction : std::true_type { }
      type conjunction<B1> (line 3629) | struct conjunction<B1> : B1 { }
      type negation (line 3635) | struct negation : std::integral_constant < bool, !B::value > { }
      type is_default_constructible (line 3641) | struct is_default_constructible : std::is_default_constructible<T> {}
      type is_default_constructible<std::pair<T1, T2>> (line 3644) | struct is_default_constructible<std::pair<T1, T2>>
      type is_default_constructible<const std::pair<T1, T2>> (line 3648) | struct is_default_constructible<const std::pair<T1, T2>>
      type is_constructible (line 3661) | struct is_constructible : std::is_constructible<T, Args...> {}
      type is_constructible<std::pair<T1, T2>> (line 3664) | struct is_constructible<std::pair<T1, T2>> : is_default_constructibl...
      type is_constructible<const std::pair<T1, T2>> (line 3667) | struct is_constructible<const std::pair<T1, T2>> : is_default_constr...
      type is_iterator_traits (line 3677) | struct is_iterator_traits : std::false_type {}
      type is_iterator_traits<iterator_traits<T>> (line 3680) | struct is_iterator_traits<iterator_traits<T>>
      type is_range (line 3695) | struct is_range
      type is_complete_type (line 3724) | struct is_complete_type : std::false_type {}
      type is_complete_type<T, decltype(void(sizeof(T)))> (line 3727) | struct is_complete_type<T, decltype(void(sizeof(T)))> : std::true_ty...
      type is_compatible_object_type_impl (line 3731) | struct is_compatible_object_type_impl : std::false_type {}
      type is_compatible_object_type_impl <
    BasicJsonType, CompatibleObjectType,
    enable_if_t < is_detected<mapped_type_t, CompatibleObjectType>::value&&
    is_detected<key_type_t, CompatibleObjectType>::value >> (line 3734) | struct is_compatible_object_type_impl <
      type is_compatible_object_type (line 3750) | struct is_compatible_object_type
      type is_constructible_object_type_impl (line 3755) | struct is_constructible_object_type_impl : std::false_type {}
      type is_constructible_object_type_impl <
    BasicJsonType, ConstructibleObjectType,
    enable_if_t < is_detected<mapped_type_t, ConstructibleObjectType>::value&&
    is_detected<key_type_t, ConstructibleObjectType>::value >> (line 3758) | struct is_constructible_object_type_impl <
      type is_constructible_object_type (line 3782) | struct is_constructible_object_type
      type is_compatible_string_type (line 3787) | struct is_compatible_string_type
      type is_constructible_string_type (line 3794) | struct is_constructible_string_type
      type is_compatible_array_type_impl (line 3802) | struct is_compatible_array_type_impl : std::false_type {}
      type is_compatible_array_type (line 3820) | struct is_compatible_array_type
      type is_constructible_array_type_impl (line 3824) | struct is_constructible_array_type_impl : std::false_type {}
      type is_constructible_array_type_impl <
    BasicJsonType, ConstructibleArrayType,
    enable_if_t<std::is_same<ConstructibleArrayType,
    typename BasicJsonType::value_type>::value >> (line 3827) | struct is_constructible_array_type_impl <
      type is_constructible_array_type (line 3864) | struct is_constructible_array_type
      type is_compatible_integer_type_impl (line 3869) | struct is_compatible_integer_type_impl : std::false_type {}
      type is_compatible_integer_type_impl <
    RealIntegerType, CompatibleNumberIntegerType,
    enable_if_t < std::is_integral<RealIntegerType>::value&&
    std::is_integral<CompatibleNumberIntegerType>::value&&
    !std::is_same<bool, CompatibleNumberIntegerType>::value >> (line 3872) | struct is_compatible_integer_type_impl <
      type is_compatible_integer_type (line 3890) | struct is_compatible_integer_type
      type is_compatible_type_impl (line 3895) | struct is_compatible_type_impl: std::false_type {}
      type is_compatible_type_impl <
    BasicJsonType, CompatibleType,
    enable_if_t<is_complete_type<CompatibleType>::value >> (line 3898) | struct is_compatible_type_impl <
      type is_compatible_type (line 3907) | struct is_compatible_type
      type is_constructible_tuple (line 3911) | struct is_constructible_tuple : std::false_type {}
      type is_ordered_map (line 3919) | struct is_ordered_map
        type two (line 3923) | struct two
      function T (line 3936) | T conditional_static_cast(U value)
      function T (line 3942) | T conditional_static_cast(U value)
      function from_json (line 3962) | void from_json(const BasicJsonType& j, typename std::nullptr_t& n)
      function get_arithmetic_value (line 3976) | void get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val)
      function from_json (line 4009) | void from_json(const BasicJsonType& j, typename BasicJsonType::boole...
      function from_json (line 4019) | void from_json(const BasicJsonType& j, typename BasicJsonType::strin...
      function from_json (line 4035) | void from_json(const BasicJsonType& j, ConstructibleStringType& s)
      function from_json (line 4046) | void from_json(const BasicJsonType& j, typename BasicJsonType::numbe...
      function from_json (line 4052) | void from_json(const BasicJsonType& j, typename BasicJsonType::numbe...
      function from_json (line 4058) | void from_json(const BasicJsonType& j, typename BasicJsonType::numbe...
      function from_json (line 4065) | void from_json(const BasicJsonType& j, EnumType& e)
      function from_json (line 4075) | void from_json(const BasicJsonType& j, std::forward_list<T, Allocato...
      function from_json (line 4092) | void from_json(const BasicJsonType& j, std::valarray<T>& l)
      function from_json (line 4107) | auto from_json(const BasicJsonType& j, T (&arr)[N])  // NOLINT(cppco...
      function from_json_array_impl (line 4117) | void from_json_array_impl(const BasicJsonType& j, typename BasicJson...
      function from_json_array_impl (line 4123) | auto from_json_array_impl(const BasicJsonType& j, std::array<T, N>& ...
      function from_json_array_impl (line 4137) | auto from_json_array_impl(const BasicJsonType& j, ConstructibleArray...
      function from_json_array_impl (line 4161) | void from_json_array_impl(const BasicJsonType& j, ConstructibleArray...
      function from_json (line 4186) | auto from_json(const BasicJsonType& j, ConstructibleArrayType& arr)
      function from_json_inplace_array_impl (line 4200) | std::array<T, sizeof...(Idx)> from_json_inplace_array_impl(BasicJson...
      function from_json (line 4207) | auto from_json(BasicJsonType&& j, identity_tag<std::array<T, N>> tag)
      function from_json (line 4219) | void from_json(const BasicJsonType& j, typename BasicJsonType::binar...
      function from_json (line 4231) | void from_json(const BasicJsonType& j, ConstructibleObjectType& obj)
      function from_json (line 4263) | void from_json(const BasicJsonType& j, ArithmeticType& val)
      function from_json_tuple_impl_base (line 4300) | std::tuple<Args...> from_json_tuple_impl_base(BasicJsonType&& j, ind...
      function from_json_tuple_impl (line 4306) | std::pair<A1, A2> from_json_tuple_impl(BasicJsonType&& j, identity_t...
      function from_json_tuple_impl (line 4313) | void from_json_tuple_impl(BasicJsonType&& j, std::pair<A1, A2>& p, p...
      function from_json_tuple_impl (line 4319) | std::tuple<Args...> from_json_tuple_impl(BasicJsonType&& j, identity...
      function from_json_tuple_impl (line 4325) | void from_json_tuple_impl(BasicJsonType&& j, std::tuple<Args...>& t,...
      function from_json (line 4331) | auto from_json(BasicJsonType&& j, TupleRelated&& t)
      function from_json (line 4345) | void from_json(const BasicJsonType& j, std::map<Key, Value, Compare,...
      function from_json (line 4365) | void from_json(const BasicJsonType& j, std::unordered_map<Key, Value...
      function from_json (line 4384) | void from_json(const BasicJsonType& j, std::filesystem::path& p)
      type from_json_fn (line 4394) | struct from_json_fn
      function int_to_string (line 4448) | void int_to_string( string_type& target, std::size_t value )
      class iteration_proxy_value (line 4454) | class iteration_proxy_value
        method iteration_proxy_value (line 4477) | explicit iteration_proxy_value(IteratorType it) noexcept
        method iteration_proxy_value (line 4482) | iteration_proxy_value& operator*()
        method iteration_proxy_value (line 4488) | iteration_proxy_value& operator++()
        method string_type (line 4509) | const string_type& key() const
        method value (line 4545) | typename IteratorType::reference value() const
      class iteration_proxy (line 4552) | class iteration_proxy
        method iteration_proxy (line 4560) | explicit iteration_proxy(typename IteratorType::reference cont) no...
        method begin (line 4564) | iteration_proxy_value<IteratorType> begin() noexcept
        method end (line 4570) | iteration_proxy_value<IteratorType> end() noexcept
      function get (line 4579) | auto get(const nlohmann::detail::iteration_proxy_value<IteratorType>...
      function get (line 4587) | auto get(const nlohmann::detail::iteration_proxy_value<IteratorType>...
      type external_constructor (line 4648) | struct external_constructor
      type external_constructor<value_t::boolean> (line 4651) | struct external_constructor<value_t::boolean>
        method construct (line 4654) | static void construct(BasicJsonType& j, typename BasicJsonType::bo...
      type external_constructor<value_t::string> (line 4664) | struct external_constructor<value_t::string>
        method construct (line 4667) | static void construct(BasicJsonType& j, const typename BasicJsonTy...
        method construct (line 4676) | static void construct(BasicJsonType& j, typename BasicJsonType::st...
        method construct (line 4687) | static void construct(BasicJsonType& j, const CompatibleStringType...
      type external_constructor<value_t::binary> (line 4697) | struct external_constructor<value_t::binary>
        method construct (line 4700) | static void construct(BasicJsonType& j, const typename BasicJsonTy...
        method construct (line 4709) | static void construct(BasicJsonType& j, typename BasicJsonType::bi...
      type external_constructor<value_t::number_float> (line 4719) | struct external_constructor<value_t::number_float>
        method construct (line 4722) | static void construct(BasicJsonType& j, typename BasicJsonType::nu...
      type external_constructor<value_t::number_unsigned> (line 4732) | struct external_constructor<value_t::number_unsigned>
        method construct (line 4735) | static void construct(BasicJsonType& j, typename BasicJsonType::nu...
      type external_constructor<value_t::number_integer> (line 4745) | struct external_constructor<value_t::number_integer>
        method construct (line 4748) | static void construct(BasicJsonType& j, typename BasicJsonType::nu...
      type external_constructor<value_t::array> (line 4758) | struct external_constructor<value_t::array>
        method construct (line 4761) | static void construct(BasicJsonType& j, const typename BasicJsonTy...
        method construct (line 4771) | static void construct(BasicJsonType& j, typename BasicJsonType::ar...
        method construct (line 4783) | static void construct(BasicJsonType& j, const CompatibleArrayType&...
        method construct (line 4796) | static void construct(BasicJsonType& j, const std::vector<bool>& arr)
        method construct (line 4812) | static void construct(BasicJsonType& j, const std::valarray<T>& arr)
      type external_constructor<value_t::object> (line 4828) | struct external_constructor<value_t::object>
        method construct (line 4831) | static void construct(BasicJsonType& j, const typename BasicJsonTy...
        method construct (line 4841) | static void construct(BasicJsonType& j, typename BasicJsonType::ob...
        method construct (line 4852) | static void construct(BasicJsonType& j, const CompatibleObjectType...
      function to_json (line 4871) | void to_json(BasicJsonType& j, T b) noexcept
      function to_json (line 4878) | void to_json(BasicJsonType& j, const CompatibleString& s)
      function to_json (line 4884) | void to_json(BasicJsonType& j, typename BasicJsonType::string_t&& s)
      function to_json (line 4891) | void to_json(BasicJsonType& j, FloatType val) noexcept
      function to_json (line 4898) | void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noe...
      function to_json (line 4905) | void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noex...
      function to_json (line 4912) | void to_json(BasicJsonType& j, EnumType e) noexcept
      function to_json (line 4919) | void to_json(BasicJsonType& j, const std::vector<bool>& e)
      function to_json (line 4932) | void to_json(BasicJsonType& j, const CompatibleArrayType& arr)
      function to_json (line 4938) | void to_json(BasicJsonType& j, const typename BasicJsonType::binary_...
      function to_json (line 4945) | void to_json(BasicJsonType& j, const std::valarray<T>& arr)
      function to_json (line 4951) | void to_json(BasicJsonType& j, typename BasicJsonType::array_t&& arr)
      function to_json (line 4958) | void to_json(BasicJsonType& j, const CompatibleObjectType& obj)
      function to_json (line 4964) | void to_json(BasicJsonType& j, typename BasicJsonType::object_t&& obj)
      function to_json (line 4974) | void to_json(BasicJsonType& j, const T(&arr)[N]) // NOLINT(cppcoregu...
      function to_json (line 4980) | void to_json(BasicJsonType& j, const std::pair<T1, T2>& p)
      function to_json (line 4988) | void to_json(BasicJsonType& j, const T& b)
      function to_json_tuple_impl (line 4994) | void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequ...
      function to_json (line 5000) | void to_json(BasicJsonType& j, const T& t)
      function to_json (line 5007) | void to_json(BasicJsonType& j, const std::filesystem::path& p)
      type to_json_fn (line 5013) | struct to_json_fn
      function combine (line 5297) | inline std::size_t combine(std::size_t seed, std::size_t h) noexcept
      function hash (line 5315) | std::size_t hash(const BasicJsonType& j)
      type input_format_t (line 5451) | enum class input_format_t { json, cbor, msgpack, ubjson, bson }
      class file_input_adapter (line 5462) | class file_input_adapter
        method file_input_adapter (line 5468) | explicit file_input_adapter(std::FILE* f) noexcept
        method file_input_adapter (line 5473) | file_input_adapter(const file_input_adapter&) = delete;
        method file_input_adapter (line 5474) | file_input_adapter(file_input_adapter&&) noexcept = default;
        method file_input_adapter (line 5475) | file_input_adapter& operator=(const file_input_adapter&) = delete;
        method file_input_adapter (line 5476) | file_input_adapter& operator=(file_input_adapter&&) = delete;
        method get_character (line 5479) | std::char_traits<char>::int_type get_character() noexcept
      class input_stream_adapter (line 5499) | class input_stream_adapter
        method input_stream_adapter (line 5514) | explicit input_stream_adapter(std::istream& i)
        method input_stream_adapter (line 5519) | input_stream_adapter(const input_stream_adapter&) = delete;
        method input_stream_adapter (line 5520) | input_stream_adapter& operator=(input_stream_adapter&) = delete;
        method input_stream_adapter (line 5521) | input_stream_adapter& operator=(input_stream_adapter&&) = delete;
        method input_stream_adapter (line 5523) | input_stream_adapter(input_stream_adapter&& rhs) noexcept
        method get_character (line 5533) | std::char_traits<char>::int_type get_character()
      class iterator_input_adapter (line 5554) | class iterator_input_adapter
        method iterator_input_adapter (line 5559) | iterator_input_adapter(IteratorType first, IteratorType last)
        method get_character (line 5563) | typename std::char_traits<char_type>::int_type get_character()
        method empty (line 5582) | bool empty() const
      type wide_string_input_helper (line 5590) | struct wide_string_input_helper
      type wide_string_input_helper<BaseInputAdapter, 4> (line 5593) | struct wide_string_input_helper<BaseInputAdapter, 4>
        method fill_buffer (line 5596) | static void fill_buffer(BaseInputAdapter& input,
      type wide_string_input_helper<BaseInputAdapter, 2> (line 5651) | struct wide_string_input_helper<BaseInputAdapter, 2>
        method fill_buffer (line 5654) | static void fill_buffer(BaseInputAdapter& input,
      class wide_string_input_adapter (line 5714) | class wide_string_input_adapter
        method wide_string_input_adapter (line 5719) | wide_string_input_adapter(BaseInputAdapter base)
        method get_character (line 5722) | typename std::char_traits<char>::int_type get_character() noexcept
        method fill_buffer (line 5743) | void fill_buffer()
      type iterator_input_adapter_factory (line 5759) | struct iterator_input_adapter_factory
        method adapter_type (line 5765) | static adapter_type create(IteratorType first, IteratorType last)
      type is_iterator_of_multibyte (line 5772) | struct is_iterator_of_multibyte
      type iterator_input_adapter_factory<IteratorType, enable_if_t<is_iterator_of_multibyte<IteratorType>::value>> (line 5782) | struct iterator_input_adapter_factory<IteratorType, enable_if_t<is_i...
        method adapter_type (line 5789) | static adapter_type create(IteratorType first, IteratorType last)
      function input_adapter (line 5797) | typename iterator_input_adapter_factory<IteratorType>::adapter_type ...
      type container_input_adapter_factory_impl (line 5807) | namespace container_input_adapter_factory_impl
        type container_input_adapter_factory (line 5814) | struct container_input_adapter_factory {}
        type container_input_adapter_factory< ContainerType,
       void_t<decltype(begin(std::declval<ContainerType>()), end(std::declval<ContainerType>()))>> (line 5817) | struct container_input_adapter_factory< ContainerType,
          method adapter_type (line 5822) | static adapter_type create(const ContainerType& container)
      function input_adapter (line 5831) | typename container_input_adapter_factory_impl::container_input_adapt...
      function file_input_adapter (line 5838) | inline file_input_adapter input_adapter(std::FILE* file)
        method file_input_adapter (line 5468) | explicit file_input_adapter(std::FILE* f) noexcept
        method file_input_adapter (line 5473) | file_input_adapter(const file_input_adapter&) = delete;
        method file_input_adapter (line 5474) | file_input_adapter(file_input_adapter&&) noexcept = default;
        method file_input_adapter (line 5475) | file_input_adapter& operator=(const file_input_adapter&) = delete;
        method file_input_adapter (line 5476) | file_input_adapter& operator=(file_input_adapter&&) = delete;
        method get_character (line 5479) | std::char_traits<char>::int_type get_character() noexcept
      function input_stream_adapter (line 5843) | inline input_stream_adapter input_adapter(std::istream& stream)
        method input_stream_adapter (line 5514) | explicit input_stream_adapter(std::istream& i)
        method input_stream_adapter (line 5519) | input_stream_adapter(const input_stream_adapter&) = delete;
        method input_stream_adapter (line 5520) | input_stream_adapter& operator=(input_stream_adapter&) = delete;
        method input_stream_adapter (line 5521) | input_stream_adapter& operator=(input_stream_adapter&&) = delete;
        method input_stream_adapter (line 5523) | input_stream_adapter(input_stream_adapter&& rhs) noexcept
        method get_character (line 5533) | std::char_traits<char>::int_type get_character()
      function input_stream_adapter (line 5848) | inline input_stream_adapter input_adapter(std::istream&& stream)
        method input_stream_adapter (line 5514) | explicit input_stream_adapter(std::istream& i)
        method input_stream_adapter (line 5519) | input_stream_adapter(const input_stream_adapter&) = delete;
        method input_stream_adapter (line 5520) | input_stream_adapter& operator=(input_stream_adapter&) = delete;
        method input_stream_adapter (line 5521) | input_stream_adapter& operator=(input_stream_adapter&&) = delete;
        method input_stream_adapter (line 5523) | input_stream_adapter(input_stream_adapter&& rhs) noexcept
        method get_character (line 5533) | std::char_traits<char>::int_type get_character()
      function contiguous_bytes_input_adapter (line 5864) | contiguous_bytes_input_adapter input_adapter(CharT b)
      function input_adapter (line 5872) | auto input_adapter(T (&array)[N]) -> decltype(input_adapter(array, a...
      class span_input_adapter (line 5880) | class span_input_adapter
        method span_input_adapter (line 5889) | span_input_adapter(CharT b, std::size_t l)
        method span_input_adapter (line 5896) | span_input_adapter(IteratorType first, IteratorType last)
        method contiguous_bytes_input_adapter (line 5899) | contiguous_bytes_input_adapter&& get()
      class json_sax_dom_parser (line 6066) | class json_sax_dom_parser
        method json_sax_dom_parser (line 6080) | explicit json_sax_dom_parser(BasicJsonType& r, const bool allow_ex...
        method json_sax_dom_parser (line 6085) | json_sax_dom_parser(const json_sax_dom_parser&) = delete;
        method json_sax_dom_parser (line 6086) | json_sax_dom_parser(json_sax_dom_parser&&) = default;
        method json_sax_dom_parser (line 6087) | json_sax_dom_parser& operator=(const json_sax_dom_parser&) = delete;
        method json_sax_dom_parser (line 6088) | json_sax_dom_parser& operator=(json_sax_dom_parser&&) = default;
        method null (line 6091) | bool null()
        method boolean (line 6097) | bool boolean(bool val)
        method number_integer (line 6103) | bool number_integer(number_integer_t val)
        method number_unsigned (line 6109) | bool number_unsigned(number_unsigned_t val)
        method number_float (line 6115) | bool number_float(number_float_t val, const string_t& /*unused*/)
        method string (line 6121) | bool string(string_t& val)
        method binary (line 6127) | bool binary(binary_t& val)
        method start_object (line 6133) | bool start_object(std::size_t len)
        method key (line 6145) | bool key(string_t& val)
        method end_object (line 6152) | bool end_object()
        method start_array (line 6159) | bool start_array(std::size_t len)
        method end_array (line 6171) | bool end_array()
        method parse_error (line 6179) | bool parse_error(std::size_t /*unused*/, const std::string& /*unus...
        method is_errored (line 6191) | constexpr bool is_errored() const
        method JSON_HEDLEY_RETURNS_NON_NULL (line 6204) | JSON_HEDLEY_RETURNS_NON_NULL
      class json_sax_dom_callback_parser (line 6240) | class json_sax_dom_callback_parser
        method json_sax_dom_callback_parser (line 6251) | json_sax_dom_callback_parser(BasicJsonType& r,
        method json_sax_dom_callback_parser (line 6260) | json_sax_dom_callback_parser(const json_sax_dom_callback_parser&) ...
        method json_sax_dom_callback_parser (line 6261) | json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) = def...
        method json_sax_dom_callback_parser (line 6262) | json_sax_dom_callback_parser& operator=(const json_sax_dom_callbac...
        method json_sax_dom_callback_parser (line 6263) | json_sax_dom_callback_parser& operator=(json_sax_dom_callback_pars...
        method null (line 6266) | bool null()
        method boolean (line 6272) | bool boolean(bool val)
        method number_integer (line 6278) | bool number_integer(number_integer_t val)
        method number_unsigned (line 6284) | bool number_unsigned(number_unsigned_t val)
        method number_float (line 6290) | bool number_float(number_float_t val, const string_t& /*unused*/)
        method string (line 6296) | bool string(string_t& val)
        method binary (line 6302) | bool binary(binary_t& val)
        method start_object (line 6308) | bool start_object(std::size_t len)
        method key (line 6326) | bool key(string_t& val)
        method end_object (line 6343) | bool end_object()
        method start_array (line 6379) | bool start_array(std::size_t len)
        method end_array (line 6396) | bool end_array()
        method parse_error (line 6429) | bool parse_error(std::size_t /*unused*/, const std::string& /*unus...
        method is_errored (line 6441) | constexpr bool is_errored() const
        method handle_value (line 6463) | std::pair<bool, BasicJsonType*> handle_value(Value&& v, const bool...
      class json_sax_acceptor (line 6547) | class json_sax_acceptor
        method null (line 6556) | bool null()
        method boolean (line 6561) | bool boolean(bool /*unused*/)
        method number_integer (line 6566) | bool number_integer(number_integer_t /*unused*/)
        method number_unsigned (line 6571) | bool number_unsigned(number_unsigned_t /*unused*/)
        method number_float (line 6576) | bool number_float(number_float_t /*unused*/, const string_t& /*unu...
        method string (line 6581) | bool string(string_t& /*unused*/)
        method binary (line 6586) | bool binary(binary_t& /*unused*/)
        method start_object (line 6591) | bool start_object(std::size_t /*unused*/ = std::size_t(-1))
        method key (line 6596) | bool key(string_t& /*unused*/)
        method end_object (line 6601) | bool end_object()
        method start_array (line 6606) | bool start_array(std::size_t /*unused*/ = std::size_t(-1))
        method end_array (line 6611) | bool end_array()
        method parse_error (line 6616) | bool parse_error(std::size_t /*unused*/, const std::string& /*unus...
      class lexer_base (line 6654) | class lexer_base
        type token_type (line 6658) | enum class token_type
      class lexer (line 6731) | class lexer : public lexer_base<BasicJsonType>
        method lexer (line 6743) | explicit lexer(InputAdapterType&& adapter, bool ignore_comments_ =...
        method lexer (line 6750) | lexer(const lexer&) = delete;
        method lexer (line 6751) | lexer(lexer&&) = default;
        method lexer (line 6752) | lexer& operator=(lexer&) = delete;
        method lexer (line 6753) | lexer& operator=(lexer&&) = default;
        method JSON_HEDLEY_PURE (line 6762) | JSON_HEDLEY_PURE
        method get_codepoint (line 6789) | int get_codepoint()
        method next_byte_in_range (line 6837) | bool next_byte_in_range(std::initializer_list<char_int_type> ranges)
        method token_type (line 6874) | token_type scan_string()
        method scan_comment (line 7464) | bool scan_comment()
        method strtof (line 7532) | static void strtof(float& f, const char* str, char** endptr) noexcept
        method strtof (line 7538) | static void strtof(double& f, const char* str, char** endptr) noex...
        method strtof (line 7544) | static void strtof(long double& f, const char* str, char** endptr)...
        method token_type (line 7589) | token_type scan_number()  // lgtm [cpp/use-of-goto]
      type is_sax (line 8322) | struct is_sax
      type is_sax_static_asserts (line 8353) | struct is_sax_static_asserts
      type cbor_tag_handler_t (line 8419) | enum class cbor_tag_handler_t
      function little_endianess (line 8433) | static inline bool little_endianess(int num = 1) noexcept
      class binary_reader (line 8447) | class binary_reader
        method binary_reader (line 8464) | explicit binary_reader(InputAdapterType&& adapter) noexcept : ia(s...
        method binary_reader (line 8470) | binary_reader(const binary_reader&) = delete;
        method binary_reader (line 8471) | binary_reader(binary_reader&&) = default;
        method binary_reader (line 8472) | binary_reader& operator=(const binary_reader&) = delete;
        method binary_reader (line 8473) | binary_reader& operator=(binary_reader&&) = default;
        method JSON_HEDLEY_NON_NULL (line 8484) | JSON_HEDLEY_NON_NULL(3)
        method parse_bson_internal (line 8547) | bool parse_bson_internal()
        method get_bson_cstr (line 8572) | bool get_bson_cstr(string_t& result)
        method get_bson_string (line 8602) | bool get_bson_string(const NumberType len, string_t& result)
        method get_bson_binary (line 8623) | bool get_bson_binary(const NumberType len, binary_t& result)
        method parse_bson_element_internal (line 8649) | bool parse_bson_element_internal(const char_int_type element_type,
        method parse_bson_element_list (line 8727) | bool parse_bson_element_list(const bool is_array)
        method parse_bson_array (line 8765) | bool parse_bson_array()
        method parse_cbor_internal (line 8795) | bool parse_cbor_internal(const bool get_char,
        method get_cbor_string (line 9283) | bool get_cbor_string(string_t& result)
        method get_cbor_binary (line 9378) | bool get_cbor_binary(binary_t& result)
        method get_cbor_array (line 9472) | bool get_cbor_array(const std::size_t len,
        method get_cbor_object (line 9510) | bool get_cbor_object(const std::size_t len,
        method parse_msgpack_internal (line 9566) | bool parse_msgpack_internal()
        method get_msgpack_string (line 9946) | bool get_msgpack_string(string_t& result)
        method get_msgpack_binary (line 10028) | bool get_msgpack_binary(binary_t& result)
        method get_msgpack_array (line 10139) | bool get_msgpack_array(const std::size_t len)
        method get_msgpack_object (line 10161) | bool get_msgpack_object(const std::size_t len)
        method parse_ubjson_internal (line 10198) | bool parse_ubjson_internal(const bool get_char = true)
        method get_ubjson_string (line 10217) | bool get_ubjson_string(string_t& result, const bool get_char = true)
        method get_ubjson_size_value (line 10271) | bool get_ubjson_size_value(std::size_t& result)
        method get_ubjson_size_type (line 10348) | bool get_ubjson_size_type(std::pair<std::size_t, char_int_type>& r...
        method get_ubjson_value (line 10389) | bool get_ubjson_value(const char_int_type prefix)
        method get_ubjson_array (line 10490) | bool get_ubjson_array()
        method get_ubjson_object (line 10552) | bool get_ubjson_object()
        method get_ubjson_high_precision_number (line 10627) | bool get_ubjson_high_precision_number()
        method char_int_type (line 10703) | char_int_type get()
        method char_int_type (line 10712) | char_int_type get_ignore_noop()
        method get_number (line 10737) | bool get_number(const input_format_t format, NumberType& result)
        method get_string (line 10780) | bool get_string(const input_format_t format,
        method get_binary (line 10813) | bool get_binary(const input_format_t format,
        method JSON_HEDLEY_NON_NULL (line 10836) | JSON_HEDLEY_NON_NULL(3)
        method get_token_string (line 10850) | std::string get_token_string() const
        method exception_message (line 10863) | std::string exception_message(const input_format_t format,
      type parse_event_t (line 10951) | enum class parse_event_t : std::uint8_t
      class parser (line 10977) | class parser
        method parser (line 10988) | explicit parser(InputAdapterType&& adapter,
        method parse (line 11010) | void parse(const bool strict, BasicJsonType& result)
        method accept (line 11070) | bool accept(const bool strict = true)
        method sax_parse (line 11078) | bool sax_parse(SAX* sax, const bool strict = true)
        method sax_parse_internal (line 11097) | bool sax_parse_internal(SAX* sax)
        method token_type (line 11378) | token_type get_token()
        method exception_message (line 11383) | std::string exception_message(const token_type expected, const std...
      class primitive_iterator_t (line 11451) | class primitive_iterator_t
        method difference_type (line 11463) | constexpr difference_type get_value() const noexcept
        method set_begin (line 11469) | void set_begin() noexcept
        method set_end (line 11475) | void set_end() noexcept
        method is_begin (line 11481) | constexpr bool is_begin() const noexcept
        method is_end (line 11487) | constexpr bool is_end() const noexcept
        method primitive_iterator_t (line 11502) | primitive_iterator_t operator+(difference_type n) noexcept
        method difference_type (line 11509) | constexpr difference_type operator-(primitive_iterator_t lhs, prim...
        method primitive_iterator_t (line 11514) | primitive_iterator_t& operator++() noexcept
        method primitive_iterator_t (line 11520) | primitive_iterator_t const operator++(int) noexcept // NOLINT(read...
        method primitive_iterator_t (line 11527) | primitive_iterator_t& operator--() noexcept
        method primitive_iterator_t (line 11533) | primitive_iterator_t const operator--(int) noexcept // NOLINT(read...
        method primitive_iterator_t (line 11540) | primitive_iterator_t& operator+=(difference_type n) noexcept
        method primitive_iterator_t (line 11546) | primitive_iterator_t& operator-=(difference_type n) noexcept
      type internal_iterator (line 11566) | struct internal_iterator
      class iteration_proxy (line 11604) | class iteration_proxy
        method iteration_proxy (line 4560) | explicit iteration_proxy(typename IteratorType::reference cont) no...
        method begin (line 4564) | iteration_proxy_value<IteratorType> begin() noexcept
        method end (line 4570) | iteration_proxy_value<IteratorType> end() noexcept
      class iteration_proxy_value (line 11605) | class iteration_proxy_value
        method iteration_proxy_value (line 4477) | explicit iteration_proxy_value(IteratorType it) noexcept
        method iteration_proxy_value (line 4482) | iteration_proxy_value& operator*()
        method iteration_proxy_value (line 4488) | iteration_proxy_value& operator++()
        method string_type (line 4509) | const string_type& key() const
        method value (line 4545) | typename IteratorType::reference value() const
      function set_end (line 11624) | class iter_impl
      class json_reverse_iterator (line 12362) | class json_reverse_iterator : public std::reverse_iterator<Base>
        method json_reverse_iterator (line 12372) | explicit json_reverse_iterator(const typename base_iterator::itera...
        method json_reverse_iterator (line 12376) | explicit json_reverse_iterator(const base_iterator& it) noexcept :...
        method json_reverse_iterator (line 12379) | json_reverse_iterator const operator++(int) // NOLINT(readability-...
        method json_reverse_iterator (line 12385) | json_reverse_iterator& operator++()
        method json_reverse_iterator (line 12391) | json_reverse_iterator const operator--(int) // NOLINT(readability-...
        method json_reverse_iterator (line 12397) | json_reverse_iterator& operator--()
        method json_reverse_iterator (line 12403) | json_reverse_iterator& operator+=(difference_type i)
        method json_reverse_iterator (line 12409) | json_reverse_iterator operator+(difference_type i) const
        method json_reverse_iterator (line 12415) | json_reverse_iterator operator-(difference_type i) const
        method difference_type (line 12421) | difference_type operator-(const json_reverse_iterator& other) const
        method reference (line 12427) | reference operator[](difference_type n) const
        method key (line 12433) | auto key() const -> decltype(std::declval<Base>().key())
        method reference (line 12440) | reference value() const
      class json_ref (line 13460) | class json_ref
        method json_ref (line 13465) | json_ref(value_type&& value)
        method json_ref (line 13469) | json_ref(const value_type& value)
        method json_ref (line 13473) | json_ref(std::initializer_list<json_ref> init)
        method json_ref (line 13480) | json_ref(Args && ... args)
        method json_ref (line 13485) | json_ref(json_ref&&) noexcept = default;
        method json_ref (line 13486) | json_ref(const json_ref&) = delete;
        method json_ref (line 13487) | json_ref& operator=(const json_ref&) = delete;
        method json_ref (line 13488) | json_ref& operator=(json_ref&&) = delete;
        method value_type (line 13491) | value_type moved_or_copied() const
        method value_type (line 13500) | value_type const& operator*() const
        method value_type (line 13505) | value_type const* operator->() const
      type output_adapter_protocol (line 13564) | struct output_adapter_protocol
        method output_adapter_protocol (line 13570) | output_adapter_protocol() = default;
        method output_adapter_protocol (line 13571) | output_adapter_protocol(const output_adapter_protocol&) = default;
        method output_adapter_protocol (line 13572) | output_adapter_protocol(output_adapter_protocol&&) noexcept = defa...
        method output_adapter_protocol (line 13573) | output_adapter_protocol& operator=(const output_adapter_protocol&)...
        method output_adapter_protocol (line 13574) | output_adapter_protocol& operator=(output_adapter_protocol&&) noex...
      class output_vector_adapter (line 13583) | class output_vector_adapter : public output_adapter_protocol<CharType>
        method output_vector_adapter (line 13586) | explicit output_vector_adapter(std::vector<CharType, AllocatorType...
        method write_character (line 13590) | void write_character(CharType c) override
        method JSON_HEDLEY_NON_NULL (line 13595) | JSON_HEDLEY_NON_NULL(2)
      class output_stream_adapter (line 13608) | class output_stream_adapter : public output_adapter_protocol<CharType>
        method output_stream_adapter (line 13611) | explicit output_stream_adapter(std::basic_ostream<CharType>& s) no...
        method write_character (line 13615) | void write_character(CharType c) override
        method JSON_HEDLEY_NON_NULL (line 13620) | JSON_HEDLEY_NON_NULL(2)
      class output_string_adapter (line 13633) | class output_string_adapter : public output_adapter_protocol<CharType>
        method output_string_adapter (line 13636) | explicit output_string_adapter(StringType& s) noexcept
        method write_character (line 13640) | void write_character(CharType c) override
        method JSON_HEDLEY_NON_NULL (line 13645) | JSON_HEDLEY_NON_NULL(2)
      class output_adapter (line 13656) | class output_adapter
        method output_adapter (line 13660) | output_adapter(std::vector<CharType, AllocatorType>& vec)
        method output_adapter (line 13664) | output_adapter(std::basic_ostream<CharType>& s)
        method output_adapter (line 13668) | output_adapter(StringType& s)
      class binary_writer (line 13695) | class binary_writer
        method binary_writer (line 13707) | explicit binary_writer(output_adapter_t<CharType> adapter) : oa(st...
        method write_bson (line 13716) | void write_bson(const BasicJsonType& j)
        method write_cbor (line 13745) | void write_cbor(const BasicJsonType& j)
        method write_msgpack (line 14069) | void write_msgpack(const BasicJsonType& j)
        method write_ubjson (line 14394) | void write_ubjson(const BasicJsonType& j, const bool use_count,
        method calc_bson_entry_header_size (line 14602) | static std::size_t calc_bson_entry_header_size(const string_t& nam...
        method write_bson_entry_header (line 14617) | void write_bson_entry_header(const string_t& name,
        method write_bson_boolean (line 14629) | void write_bson_boolean(const string_t& name,
        method write_bson_double (line 14639) | void write_bson_double(const string_t& name,
        method calc_bson_string_size (line 14649) | static std::size_t calc_bson_string_size(const string_t& value)
        method write_bson_string (line 14657) | void write_bson_string(const string_t& name,
        method write_bson_null (line 14671) | void write_bson_null(const string_t& name)
        method calc_bson_integer_size (line 14679) | static std::size_t calc_bson_integer_size(const std::int64_t value)
        method write_bson_integer (line 14689) | void write_bson_integer(const string_t& name,
        method calc_bson_unsigned_size (line 14707) | static constexpr std::size_t calc_bson_unsigned_size(const std::ui...
        method write_bson_unsigned (line 14717) | void write_bson_unsigned(const string_t& name,
        method write_bson_object_entry (line 14739) | void write_bson_object_entry(const string_t& name,
        method calc_bson_array_size (line 14749) | static std::size_t calc_bson_array_size(const typename BasicJsonTy...
        method calc_bson_binary_size (line 14764) | static std::size_t calc_bson_binary_size(const typename BasicJsonT...
        method write_bson_array (line 14772) | void write_bson_array(const string_t& name,
        method write_bson_binary (line 14791) | void write_bson_binary(const string_t& name,
        method calc_bson_element_size (line 14806) | static std::size_t calc_bson_element_size(const string_t& name,
        method write_bson_element (line 14854) | void write_bson_element(const string_t& name,
        method calc_bson_object_size (line 14901) | static std::size_t calc_bson_object_size(const typename BasicJsonT...
        method write_bson_object (line 14916) | void write_bson_object(const typename BasicJsonType::object_t& value)
        method CharType (line 14932) | static constexpr CharType get_cbor_float_prefix(float /*unused*/)
        method CharType (line 14937) | static constexpr CharType get_cbor_float_prefix(double /*unused*/)
        method CharType (line 14946) | static constexpr CharType get_msgpack_float_prefix(float /*unused*/)
        method CharType (line 14951) | static constexpr CharType get_msgpack_float_prefix(double /*unused*/)
        method write_number_with_ubjson_prefix (line 14963) | void write_number_with_ubjson_prefix(const NumberType n,
        method write_number_with_ubjson_prefix (line 14976) | void write_number_with_ubjson_prefix(const NumberType n,
        method write_number_with_ubjson_prefix (line 15039) | void write_number_with_ubjson_prefix(const NumberType n,
        method CharType (line 15103) | CharType ubjson_prefix(const BasicJsonType& j) const noexcept
        method CharType (line 15184) | static constexpr CharType get_ubjson_float_prefix(float /*unused*/)
        method CharType (line 15189) | static constexpr CharType get_ubjson_float_prefix(double /*unused*/)
        method write_number (line 15210) | void write_number(const NumberType n)
        method write_compact_float (line 15226) | void write_compact_float(const number_float_t n, detail::input_for...
        method CharType (line 15260) | static constexpr CharType to_char_type(std::uint8_t x) noexcept
        method CharType (line 15267) | static CharType to_char_type(std::uint8_t x) noexcept
        method CharType (line 15278) | static constexpr CharType to_char_type(std::uint8_t x) noexcept
        method CharType (line 15289) | static constexpr CharType to_char_type(InputCharType x) noexcept
      type dtoa_impl (line 15358) | namespace dtoa_impl
        function Target (line 15362) | Target reinterpret_bits(const Source source)
        type diyfp (line 15371) | struct diyfp // f * 2^e
          method diyfp (line 15378) | constexpr diyfp(std::uint64_t f_, int e_) noexcept : f(f_), e(e_...
          method diyfp (line 15384) | static diyfp sub(const diyfp& x, const diyfp& y) noexcept
          method diyfp (line 15396) | static diyfp mul(const diyfp& x, const diyfp& y) noexcept
          method diyfp (line 15461) | static diyfp normalize(diyfp x) noexcept
          method diyfp (line 15478) | static diyfp normalize_to(const diyfp& x, const int target_expon...
        type boundaries (line 15489) | struct boundaries
        function boundaries (line 15503) | boundaries compute_boundaries(FloatType value)
        type cached_power (line 15628) | struct cached_power // c = f * 2^e ~= 10^k
        function cached_power (line 15642) | inline cached_power get_cached_power_for_binary_exponent(int e)
        function find_largest_pow10 (line 15806) | inline int find_largest_pow10(const std::uint32_t n, std::uint32_t...
        function grisu2_round (line 15860) | inline void grisu2_round(char* buf, int len, std::uint64_t dist, s...
        function grisu2_digit_gen (line 15901) | inline void grisu2_digit_gen(char* buffer, int& length, int& decim...
        function grisu2 (line 16142) | inline void grisu2(char* buf, int& len, int& decimal_exponent,
        function JSON_HEDLEY_NON_NULL (line 16201) | JSON_HEDLEY_NON_NULL(1)
      type error_handler_t (line 16456) | enum class error_handler_t
      class serializer (line 16464) | class serializer
        method serializer (line 16480) | serializer(output_adapter_t<char> s, const char ichar,
        method serializer (line 16492) | serializer(const serializer&) = delete;
        method serializer (line 16493) | serializer& operator=(const serializer&) = delete;
        method serializer (line 16494) | serializer(serializer&&) = delete;
        method serializer (line 16495) | serializer& operator=(serializer&&) = delete;
        method dump (line 16520) | void dump(const BasicJsonType& val,
        method switch (line 16818) | switch (decode(state, codepoint, byte))
    type detail (line 2640) | namespace detail
      type value_t (line 120) | enum class value_t : std::uint8_t
      type make_void (line 2229) | struct make_void
      type nonesuch (line 2243) | struct nonesuch
        method nonesuch (line 2245) | nonesuch() = delete;
        method nonesuch (line 2247) | nonesuch(nonesuch const&) = delete;
        method nonesuch (line 2248) | nonesuch(nonesuch const&&) = delete;
      type detector (line 2257) | struct detector
      type is_detected_lazy (line 2274) | struct is_detected_lazy : is_detected<Op, Args...> { }
      function replace_substring (line 2656) | inline void replace_substring(std::string& s, const std::string& f,
      function escape (line 2674) | inline std::string escape(std::string s)
      function unescape (line 2688) | static void unescape(std::string& s)
      type position_t (line 2707) | struct position_t
      class exception (line 2765) | class exception : public std::exception
        method JSON_HEDLEY_NON_NULL (line 2778) | JSON_HEDLEY_NON_NULL(3)
        method name (line 2781) | static std::string name(const std::string& ename, int id_)
        method diagnostics (line 2787) | static std::string diagnostics(const BasicJsonType& leaf_element)
      class parse_error (line 2900) | class parse_error : public exception
        method parse_error (line 2913) | static parse_error create(int id_, const position_t& pos, const st...
        method parse_error (line 2921) | static parse_error create(int id_, std::size_t byte_, const std::s...
        method parse_error (line 2941) | parse_error(int id_, std::size_t byte_, const char* what_arg)
        method position_string (line 2944) | static std::string position_string(const position_t& pos)
      class invalid_iterator (line 2988) | class invalid_iterator : public exception
        method invalid_iterator (line 2992) | static invalid_iterator create(int id_, const std::string& what_ar...
        method JSON_HEDLEY_NON_NULL (line 2999) | JSON_HEDLEY_NON_NULL(3)
      class type_error (line 3043) | class type_error : public exception
        method type_error (line 3047) | static type_error create(int id_, const std::string& what_arg, con...
        method JSON_HEDLEY_NON_NULL (line 3054) | JSON_HEDLEY_NON_NULL(3)
      class out_of_range (line 3091) | class out_of_range : public exception
        method out_of_range (line 3095) | static out_of_range create(int id_, const std::string& what_arg, c...
        method JSON_HEDLEY_NON_NULL (line 3102) | JSON_HEDLEY_NON_NULL(3)
      class other_error (line 3130) | class other_error : public exception
        method other_error (line 3134) | static other_error create(int id_, const std::string& what_arg, co...
        method JSON_HEDLEY_NON_NULL (line 3141) | JSON_HEDLEY_NON_NULL(3)
      type integer_sequence (line 3206) | struct integer_sequence
        method size (line 3209) | static constexpr std::size_t size() noexcept
      type utility_internal (line 3223) | namespace utility_internal
        type Extend (line 3227) | struct Extend
        type Gen (line 3245) | struct Gen
        type Gen<T, 0> (line 3252) | struct Gen<T, 0>
      type priority_tag (line 3290) | struct priority_tag : priority_tag < N - 1 > {}
      type priority_tag<0> (line 3291) | struct priority_tag<0> {}
      type static_const (line 3295) | struct static_const
      type identity_tag (line 3314) | struct identity_tag {}
      type iterator_types (line 3344) | struct iterator_types {}
      type iterator_types <
    It,
    void_t<typename It::difference_type, typename It::value_type, typename It::pointer,
    typename It::reference, typename It::iterator_category >> (line 3347) | struct iterator_types <
      type iterator_traits (line 3362) | struct iterator_traits
      type iterator_traits < T, enable_if_t < !std::is_pointer<T>::value >> (line 3367) | struct iterator_traits < T, enable_if_t < !std::is_pointer<T>::value >>
      type iterator_traits<T*, enable_if_t<std::is_object<T>::value>> (line 3373) | struct iterator_traits<T*, enable_if_t<std::is_object<T>::value>>
      type is_basic_json (line 3516) | struct is_basic_json : std::false_type {}
      class json_ref (line 3526) | class json_ref
        method json_ref (line 13465) | json_ref(value_type&& value)
        method json_ref (line 13469) | json_ref(const value_type& value)
        method json_ref (line 13473) | json_ref(std::initializer_list<json_ref> init)
        method json_ref (line 13480) | json_ref(Args && ... args)
        method json_ref (line 13485) | json_ref(json_ref&&) noexcept = default;
        method json_ref (line 13486) | json_ref(const json_ref&) = delete;
        method json_ref (line 13487) | json_ref& operator=(const json_ref&) = delete;
        method json_ref (line 13488) | json_ref& operator=(json_ref&&) = delete;
        method value_type (line 13491) | value_type moved_or_copied() const
        method value_type (line 13500) | value_type const& operator*() const
        method value_type (line 13505) | value_type const* operator->() const
      type is_json_ref (line 3529) | struct is_json_ref : std::false_type {}
      type is_json_ref<json_ref<T>> (line 3532) | struct is_json_ref<json_ref<T>> : std::true_type {}
      type has_from_json (line 3570) | struct has_from_json : std::false_type {}
      type is_getable (line 3577) | struct is_getable
      type has_from_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >> (line 3583) | struct has_from_json < BasicJsonType, T, enable_if_t < !is_basic_jso...
      type has_non_default_from_json (line 3595) | struct has_non_default_from_json : std::false_type {}
      type has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >> (line 3598) | struct has_non_default_from_json < BasicJsonType, T, enable_if_t < !...
      type has_to_json (line 3610) | struct has_to_json : std::false_type {}
      type has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >> (line 3613) | struct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json<...
      type conjunction (line 3628) | struct conjunction : std::true_type { }
      type conjunction<B1> (line 3629) | struct conjunction<B1> : B1 { }
      type negation (line 3635) | struct negation : std::integral_constant < bool, !B::value > { }
      type is_default_constructible (line 3641) | struct is_default_constructible : std::is_default_constructible<T> {}
      type is_default_constructible<std::pair<T1, T2>> (line 3644) | struct is_default_constructible<std::pair<T1, T2>>
      type is_default_constructible<const std::pair<T1, T2>> (line 3648) | struct is_default_constructible<const std::pair<T1, T2>>
      type is_constructible (line 3661) | struct is_constructible : std::is_constructible<T, Args...> {}
      type is_constructible<std::pair<T1, T2>> (line 3664) | struct is_constructible<std::pair<T1, T2>> : is_default_constructibl...
      type is_constructible<const std::pair<T1, T2>> (line 3667) | struct is_constructible<const std::pair<T1, T2>> : is_default_constr...
      type is_iterator_traits (line 3677) | struct is_iterator_traits : std::false_type {}
      type is_iterator_traits<iterator_traits<T>> (line 3680) | struct is_iterator_traits<iterator_traits<T>>
      type is_range (line 3695) | struct is_range
      type is_complete_type (line 3724) | struct is_complete_type : std::false_type {}
      type is_complete_type<T, decltype(void(sizeof(T)))> (line 3727) | struct is_complete_type<T, decltype(void(sizeof(T)))> : std::true_ty...
      type is_compatible_object_type_impl (line 3731) | struct is_compatible_object_type_impl : std::false_type {}
      type is_compatible_object_type_impl <
    BasicJsonType, CompatibleObjectType,
    enable_if_t < is_detected<mapped_type_t, CompatibleObjectType>::value&&
    is_detected<key_type_t, CompatibleObjectType>::value >> (line 3734) | struct is_compatible_object_type_impl <
      type is_compatible_object_type (line 3750) | struct is_compatible_object_type
      type is_constructible_object_type_impl (line 3755) | struct is_constructible_object_type_impl : std::false_type {}
      type is_constructible_object_type_impl <
    BasicJsonType, ConstructibleObjectType,
    enable_if_t < is_detected<mapped_type_t, ConstructibleObjectType>::value&&
    is_detected<key_type_t, ConstructibleObjectType>::value >> (line 3758) | struct is_constructible_object_type_impl <
      type is_constructible_object_type (line 3782) | struct is_constructible_object_type
      type is_compatible_string_type (line 3787) | struct is_compatible_string_type
      type is_constructible_string_type (line 3794) | struct is_constructible_string_type
      type is_compatible_array_type_impl (line 3802) | struct is_compatible_array_type_impl : std::false_type {}
      type is_compatible_array_type (line 3820) | struct is_compatible_array_type
      type is_constructible_array_type_impl (line 3824) | struct is_constructible_array_type_impl : std::false_type {}
      type is_constructible_array_type_impl <
    BasicJsonType, ConstructibleArrayType,
    enable_if_t<std::is_same<ConstructibleArrayType,
    typename BasicJsonType::value_type>::value >> (line 3827) | struct is_constructible_array_type_impl <
      type is_constructible_array_type (line 3864) | struct is_constructible_array_type
      type is_compatible_integer_type_impl (line 3869) | struct is_compatible_integer_type_impl : std::false_type {}
      type is_compatible_integer_type_impl <
    RealIntegerType, CompatibleNumberIntegerType,
    enable_if_t < std::is_integral<RealIntegerType>::value&&
    std::is_integral<CompatibleNumberIntegerType>::value&&
    !std::is_same<bool, CompatibleNumberIntegerType>::value >> (line 3872) | struct is_compatible_integer_type_impl <
      type is_compatible_integer_type (line 3890) | struct is_compatible_integer_type
      type is_compatible_type_impl (line 3895) | struct is_compatible_type_impl: std::false_type {}
      type is_compatible_type_impl <
    BasicJsonType, CompatibleType,
    enable_if_t<is_complete_type<CompatibleType>::value >> (line 3898) | struct is_compatible_type_impl <
      type is_compatible_type (line 3907) | struct is_compatible_type
      type is_constructible_tuple (line 3911) | struct is_constructible_tuple : std::false_type {}
      type is_ordered_map (line 3919) | struct is_ordered_map
        type two (line 3923) | struct two
      function T (line 3936) | T conditional_static_cast(U value)
      function T (line 3942) | T conditional_static_cast(U value)
      function from_json (line 3962) | void from_json(const BasicJsonType& j, typename std::nullptr_t& n)
      function get_arithmetic_value (line 3976) | void get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val)
      function from_json (line 4009) | void from_json(const BasicJsonType& j, typename BasicJsonType::boole...
      function from_json (line 4019) | void from_json(const BasicJsonType& j, typename BasicJsonType::strin...
      function from_json (line 4035) | void from_json(const BasicJsonType& j, ConstructibleStringType& s)
      function from_json (line 4046) | void from_json(const BasicJsonType& j, typename BasicJsonType::numbe...
      function from_json (line 4052) | void from_json(const BasicJsonType& j, typename BasicJsonType::numbe...
      function from_json (line 4058) | void from_json(const BasicJsonType& j, typename BasicJsonType::numbe...
      function from_json (line 4065) | void from_json(const BasicJsonType& j, EnumType& e)
      function from_json (line 4075) | void from_json(const BasicJsonType& j, std::forward_list<T, Allocato...
      function from_json (line 4092) | void from_json(const BasicJsonType& j, std::valarray<T>& l)
      function from_json (line 4107) | auto from_json(const BasicJsonType& j, T (&arr)[N])  // NOLINT(cppco...
      function from_json_array_impl (line 4117) | void from_json_array_impl(const BasicJsonType& j, typename BasicJson...
      function from_json_array_impl (line 4123) | auto from_json_array_impl(const BasicJsonType& j, std::array<T, N>& ...
      function from_json_array_impl (line 4137) | auto from_json_array_impl(const BasicJsonType& j, ConstructibleArray...
      function from_json_array_impl (line 4161) | void from_json_array_impl(const BasicJsonType& j, ConstructibleArray...
      function from_json (line 4186) | auto from_json(const BasicJsonType& j, ConstructibleArrayType& arr)
      function from_json_inplace_array_impl (line 4200) | std::array<T, sizeof...(Idx)> from_json_inplace_array_impl(BasicJson...
      function from_json (line 4207) | auto from_json(BasicJsonType&& j, identity_tag<std::array<T, N>> tag)
      function from_json (line 4219) | void from_json(const BasicJsonType& j, typename BasicJsonType::binar...
      function from_json (line 4231) | void from_json(const BasicJsonType& j, ConstructibleObjectType& obj)
      function from_json (line 4263) | void from_json(const BasicJsonType& j, ArithmeticType& val)
      function from_json_tuple_impl_base (line 4300) | std::tuple<Args...> from_json_tuple_impl_base(BasicJsonType&& j, ind...
      function from_json_tuple_impl (line 4306) | std::pair<A1, A2> from_json_tuple_impl(BasicJsonType&& j, identity_t...
      function from_json_tuple_impl (line 4313) | void from_json_tuple_impl(BasicJsonType&& j, std::pair<A1, A2>& p, p...
      function from_json_tuple_impl (line 4319) | std::tuple<Args...> from_json_tuple_impl(BasicJsonType&& j, identity...
      function from_json_tuple_impl (line 4325) | void from_json_tuple_impl(BasicJsonType&& j, std::tuple<Args...>& t,...
      function from_json (line 4331) | auto from_json(BasicJsonType&& j, TupleRelated&& t)
      function from_json (line 4345) | void from_json(const BasicJsonType& j, std::map<Key, Value, Compare,...
      function from_json (line 4365) | void from_json(const BasicJsonType& j, std::unordered_map<Key, Value...
      function from_json (line 4384) | void from_json(const BasicJsonType& j, std::filesystem::path& p)
      type from_json_fn (line 4394) | struct from_json_fn
      function int_to_string (line 4448) | void int_to_string( string_type& target, std::size_t value )
      class iteration_proxy_value (line 4454) | class iteration_proxy_value
        method iteration_proxy_value (line 4477) | explicit iteration_proxy_value(IteratorType it) noexcept
        method iteration_proxy_value (line 4482) | iteration_proxy_value& operator*()
        method iteration_proxy_value (line 4488) | iteration_proxy_value& operator++()
        method string_type (line 4509) | const string_type& key() const
        method value (line 4545) | typename IteratorType::reference value() const
      class iteration_proxy (line 4552) | class iteration_proxy
        method iteration_proxy (line 4560) | explicit iteration_proxy(typename IteratorType::reference cont) no...
        method begin (line 4564) | iteration_proxy_value<IteratorType> begin() noexcept
        method end (line 4570) | iteration_proxy_value<IteratorType> end() noexcept
      function get (line 4579) | auto get(const nlohmann::detail::iteration_proxy_value<IteratorType>...
      function get (line 4587) | auto get(const nlohmann::detail::iteration_proxy_value<IteratorType>...
      type external_constructor (line 4648) | struct external_constructor
      type external_constructor<value_t::boolean> (line 4651) | struct external_constructor<value_t::boolean>
        method construct (line 4654) | static void construct(BasicJsonType& j, typename BasicJsonType::bo...
      type external_constructor<value_t::string> (line 4664) | struct external_constructor<value_t::string>
        method construct (line 4667) | static void construct(BasicJsonType& j, const typename BasicJsonTy...
        method construct (line 4676) | static void construct(BasicJsonType& j, typename BasicJsonType::st...
        method construct (line 4687) | static void construct(BasicJsonType& j, const CompatibleStringType...
      type external_constructor<value_t::binary> (line 4697) | struct external_constructor<value_t::binary>
        method construct (line 4700) | static void construct(BasicJsonType& j, const typename BasicJsonTy...
        method construct (line 4709) | static void construct(BasicJsonType& j, typename BasicJsonType::bi...
      type external_constructor<value_t::number_float> (line 4719) | struct external_constructor<value_t::number_float>
        method construct (line 4722) | static void construct(BasicJsonType& j, typename BasicJsonType::nu...
      type external_constructor<value_t::number_unsigned> (line 4732) | struct external_constructor<value_t::number_unsigned>
        method construct (line 4735) | static void construct(BasicJsonType& j, typename BasicJsonType::nu...
      type external_constructor<value_t::number_integer> (line 4745) | struct external_constructor<value_t::number_integer>
        method construct (line 4748) | static void construct(BasicJsonType& j, typename BasicJsonType::nu...
      type external_constructor<value_t::array> (line 4758) | struct external_constructor<value_t::array>
        method construct (line 4761) | static void construct(BasicJsonType& j, const typename BasicJsonTy...
        method construct (line 4771) | static void construct(BasicJsonType& j, typename BasicJsonType::ar...
        method construct (line 4783) | static void construct(BasicJsonType& j, const CompatibleArrayType&...
        method construct (line 4796) | static void construct(BasicJsonType& j, const std::vector<bool>& arr)
        method construct (line 4812) | static void construct(BasicJsonType& j, const std::valarray<T>& arr)
      type external_constructor<value_t::object> (line 4828) | struct external_constructor<value_t::object>
        method construct (line 4831) | static void construct(BasicJsonType& j, const typename BasicJsonTy...
        method construct (line 4841) | static void construct(BasicJsonType& j, typename BasicJsonType::ob...
        method construct (line 4852) | static void construct(BasicJsonType& j, const CompatibleObjectType...
      function to_json (line 4871) | void to_json(BasicJsonType& j, T b) noexcept
      function to_json (line 4878) | void to_json(BasicJsonType& j, const CompatibleString& s)
      function to_json (line 4884) | void to_json(BasicJsonType& j, typename BasicJsonType::string_t&& s)
      function to_json (line 4891) | void to_json(BasicJsonType& j, FloatType val) noexcept
      function to_json (line 4898) | void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noe...
      function to_json (line 4905) | void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noex...
      function to_json (line 4912) | void to_json(BasicJsonType& j, EnumType e) noexcept
      function to_json (line 4919) | void to_json(BasicJsonType& j, const std::vector<bool>& e)
      function to_json (line 4932) | void to_json(BasicJsonType& j, const CompatibleArrayType& arr)
      function to_json (line 4938) | void to_json(BasicJsonType& j, const typename BasicJsonType::binary_...
      function to_json (line 4945) | void to_json(BasicJsonType& j, const std::valarray<T>& arr)
      function to_json (line 4951) | void to_json(BasicJsonType& j, typename BasicJsonType::array_t&& arr)
      function to_json (line 4958) | void to_json(BasicJsonType& j, const CompatibleObjectType& obj)
      function to_json (line 4964) | void to_json(BasicJsonType& j, typename BasicJsonType::object_t&& obj)
      function to_json (line 4974) | void to_json(BasicJsonType& j, const T(&arr)[N]) // NOLINT(cppcoregu...
      function to_json (line 4980) | void to_json(BasicJsonType& j, const std::pair<T1, T2>& p)
      function to_json (line 4988) | void to_json(BasicJsonType& j, const T& b)
      function to_json_tuple_impl (line 4994) | void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequ...
      function to_json (line 5000) | void to_json(BasicJsonType& j, const T& t)
      function to_json (line 5007) | void to_json(BasicJsonType& j, const std::filesystem::path& p)
      type to_json_fn (line 5013) | struct to_json_fn
      function combine (line 5297) | inline std::size_t combine(std::size_t seed, std::size_t h) noexcept
      function hash (line 5315) | std::size_t hash(const BasicJsonType& j)
      type input_format_t (line 5451) | enum class input_format_t { json, cbor, msgpack, ubjson, bson }
      class file_input_adapter (line 5462) | class file_input_adapter
        method file_input_adapter (line 5468) | explicit file_input_adapter(std::FILE* f) noexcept
        method file_input_adapter (line 5473) | file_input_adapter(const file_input_adapter&) = delete;
        method file_input_adapter (line 5474) | file_input_adapter(file_input_adapter&&) noexcept = default;
        method file_input_adapter (line 5475) | file_input_adapter& operator=(const file_input_adapter&) = delete;
        method file_input_adapter (line 5476) | file_input_adapter& operator=(file_input_adapter&&) = delete;
        method get_character (line 5479) | std::char_traits<char>::int_type get_character() noexcept
      class input_stream_adapter (line 5499) | class input_stream_adapter
        method input_stream_adapter (line 5514) | explicit input_stream_adapter(std::istream& i)
        method input_stream_adapter (line 5519) | input_stream_adapter(const input_stream_adapter&) = delete;
        method input_stream_adapter (line 5520) | input_stream_adapter& operator=(input_stream_adapter&) = delete;
        method input_stream_adapter (line 5521) | input_stream_adapter& operator=(input_stream_adapter&&) = delete;
        method input_stream_adapter (line 5523) | input_stream_adapter(input_stream_adapter&& rhs) noexcept
        method get_character (line 5533) | std::char_traits<char>::int_type get_character()
      class iterator_input_adapter (line 5554) | class iterator_input_adapter
        method iterator_input_adapter (line 5559) | iterator_input_adapter(IteratorType first, IteratorType last)
        method get_character (line 5563) | typename std::char_traits<char_type>::int_type get_character()
        method empty (line 5582) | bool empty() const
      type wide_string_input_helper (line 5590) | struct wide_string_input_helper
      type wide_string_input_helper<BaseInputAdapter, 4> (line 5593) | struct wide_string_input_helper<BaseInputAdapter, 4>
        method fill_buffer (line 5596) | static void fill_buffer(BaseInputAdapter& input,
      type wide_string_input_helper<BaseInputAdapter, 2> (line 5651) | struct wide_string_input_helper<BaseInputAdapter, 2>
        method fill_buffer (line 5654) | static void fill_buffer(BaseInputAdapter& input,
      class wide_string_input_adapter (line 5714) | class wide_string_input_adapter
        method wide_string_input_adapter (line 5719) | wide_string_input_adapter(BaseInputAdapter base)
        method get_character (line 5722) | typename std::char_traits<char>::int_type get_character() noexcept
        method fill_buffer (line 5743) | void fill_buffer()
      type iterator_input_adapter_factory (line 5759) | struct iterator_input_adapter_factory
        method adapter_type (line 5765) | static adapter_type create(IteratorType first, IteratorType last)
      type is_iterator_of_multibyte (line 5772) | struct is_iterator_of_multibyte
      type iterator_input_adapter_factory<IteratorType, enable_if_t<is_iterator_of_multibyte<IteratorType>::value>> (line 5782) | struct iterator_input_adapter_factory<IteratorType, enable_if_t<is_i...
        method adapter_type (line 5789) | static adapter_type create(IteratorType first, IteratorType last)
      function input_adapter (line 5797) | typename iterator_input_adapter_factory<IteratorType>::adapter_type ...
      type container_input_adapter_factory_impl (line 5807) | namespace container_input_adapter_factory_impl
        type container_input_adapter_factory (line 5814) | struct container_input_adapter_factory {}
        type container_input_adapter_factory< ContainerType,
       void_t<decltype(begin(std::declval<ContainerType>()), end(std::declval<ContainerType>()))>> (line 5817) | struct container_input_adapter_factory< ContainerType,
          method adapter_type (line 5822) | static adapter_type create(const ContainerType& container)
      function input_adapter (line 5831) | typename container_input_adapter_factory_impl::container_input_adapt...
      function file_input_adapter (line 5838) | inline file_input_adapter input_adapter(std::FILE* file)
        method file_input_adapter (line 5468) | explicit file_input_adapter(std::FILE* f) noexcept
        method file_input_adapter (line 5473) | file_input_adapter(const file_input_adapter&) = delete;
        method file_input_adapter (line 5474) | file_input_adapter(file_input_adapter&&) noexcept = default;
        method file_input_adapter (line 5475) | file_input_adapter& operator=(const file_input_adapter&) = delete;
        method file_input_adapter (line 5476) | file_input_adapter& operator=(file_input_adapter&&) = delete;
        method get_character (line 5479) | std::char_traits<char>::int_type get_character() noexcept
      function input_stream_adapter (line 5843) | inline input_stream_adapter input_adapter(std::istream& stream)
        method input_stream_adapter (line 5514) | explicit input_stream_adapter(std::istream& i)
        method input_stream_adapter (line 5519) | input_stream_adapter(const input_stream_adapter&) = delete;
        method input_stream_adapter (line 5520) | input_stream_adapter& operator=(input_stream_adapter&) = delete;
        method input_stream_adapter (line 5521) | input_stream_adapter& operator=(input_stream_adapter&&) = delete;
        method input_stream_adapter (line 5523) | input_stream_adapter(input_stream_adapter&& rhs) noexcept
        method get_character (line 5533) | std::char_traits<char>::int_type get_character()
      function input_stream_adapter (line 5848) | inline input_stream_adapter input_adapter(std::istream&& stream)
        method input_stream_adapter (line 5514) | explicit input_stream_adapter(std::istream& i)
        method input_stream_adapter (line 5519) | input_stream_adapter(const input_stream_adapter&) = delete;
        method input_stream_adapter (line 5520) | input_stream_adapter& operator=(input_stream_adapter&) = delete;
        method input_stream_adapter (line 5521) | input_stream_adapter& operator=(input_stream_adapter&&) = delete;
        method input_stream_adapter (line 5523) | input_stream_adapter(input_stream_adapter&& rhs) noexcept
        method get_character (line 5533) | std::char_traits<char>::int_type get_character()
      function contiguous_bytes_input_adapter (line 5864) | contiguous_bytes_input_adapter input_adapter(CharT b)
      function input_adapter (line 5872) | auto input_adapter(T (&array)[N]) -> decltype(input_adapter(array, a...
      class span_input_adapter (line 5880) | class span_input_adapter
        method span_input_adapter (line 5889) | span_input_adapter(CharT b, std::size_t l)
        method span_input_adapter (line 5896) | span_input_adapter(IteratorType first, IteratorType last)
        method contiguous_bytes_input_adapter (line 5899) | contiguous_bytes_input_adapter&& get()
      class json_sax_dom_parser (line 6066) | class json_sax_dom_parser
        method json_sax_dom_parser (line 6080) | explicit json_sax_dom_parser(BasicJsonType& r, const bool allow_ex...
        method json_sax_dom_parser (line 6085) | json_sax_dom_parser(const json_sax_dom_parser&) = delete;
        method json_sax_dom_parser (line 6086) | json_sax_dom_parser(json_sax_dom_parser&&) = default;
        method json_sax_dom_parser (line 6087) | json_sax_dom_parser& operator=(const json_sax_dom_parser&) = delete;
        method json_sax_dom_parser (line 6088) | json_sax_dom_parser& operator=(json_sax_dom_parser&&) = default;
        method null (line 6091) | bool null()
        method boolean (line 6097) | bool boolean(bool val)
        method number_integer (line 6103) | bool number_integer(number_integer_t val)
        method number_unsigned (line 6109) | bool number_unsigned(number_unsigned_t val)
        method number_float (line 6115) | bool number_float(number_float_t val, const string_t& /*unused*/)
        method string (line 6121) | bool string(string_t& val)
        method binary (line 6127) | bool binary(binary_t& val)
        method start_object (line 6133) | bool start_object(std::size_t len)
        method key (line 6145) | bool key(string_t& val)
        method end_object (line 6152) | bool end_object()
        method start_array (line 6159) | bool start_array(std::size_t len)
        method end_array (line 6171) | bool end_array()
        method parse_error (line 6179) | bool parse_error(std::size_t /*unused*/, const std::string& /*unus...
        method is_errored (line 6191) | constexpr bool is_errored() const
        method JSON_HEDLEY_RETURNS_NON_NULL (line 6204) | JSON_HEDLEY_RETURNS_NON_NULL
      class json_sax_dom_callback_parser (line 6240) | class json_sax_dom_callback_parser
        method json_sax_dom_callback_parser (line 6251) | json_sax_dom_callback_parser(BasicJsonType& r,
        method json_sax_dom_callback_parser (line 6260) | json_sax_dom_callback_parser(const json_sax_dom_callback_parser&) ...
        method json_sax_dom_callback_parser (line 6261) | json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) = def...
        method json_sax_dom_callback_parser (line 6262) | json_sax_dom_callback_parser& operator=(const json_sax_dom_callbac...
        method json_sax_dom_callback_parser (line 6263) | json_sax_dom_callback_parser& operator=(json_sax_dom_callback_pars...
        method null (line 6266) | bool null()
        method boolean (line 6272) | bool boolean(bool val)
        method number_integer (line 6278) | bool number_integer(number_integer_t val)
        method number_unsigned (line 6284) | bool number_unsigned(number_unsigned_t val)
        method number_float (line 6290) | bool number_float(number_float_t val, const string_t& /*unused*/)
        method string (line 6296) | bool string(string_t& val)
        method binary (line 6302) | bool binary(binary_t& val)
        method start_object (line 6308) | bool start_object(std::size_t len)
        method key (line 6326) | bool key(string_t& val)
        method end_object (line 6343) | bool end_object()
        method start_array (line 6379) | bool start_array(std::size_t len)
        method end_array (line 6396) | bool end_array()
        method parse_error (line 6429) | bool parse_error(std::size_t /*unused*/, const std::string& /*unus...
        method is_errored (line 6441) | constexpr bool is_errored() const
        method handle_value (line 6463) | std::pair<bool, BasicJsonType*> handle_value(Value&& v, const bool...
      class json_sax_acceptor (line 6547) | class json_sax_acceptor
        method null (line 6556) | bool null()
        method boolean (line 6561) | bool boolean(bool /*unused*/)
        method number_integer (line 6566) | bool number_integer(number_integer_t /*unused*/)
        method number_unsigned (line 6571) | bool number_unsigned(number_unsigned_t /*unused*/)
        method number_float (line 6576) | bool number_float(number_float_t /*unused*/, const string_t& /*unu...
        method string (line 6581) | bool string(string_t& /*unused*/)
        method binary (line 6586) | bool binary(binary_t& /*unused*/)
        method start_object (line 6591) | bool start_object(std::size_t /*unused*/ = std::size_t(-1))
        method key (line 6596) | bool key(string_t& /*unused*/)
        method end_object (line 6601) | bool end_object()
        method start_array (line 6606) | bool start_array(std::size_t /*unused*/ = std::size_t(-1))
        method end_array (line 6611) | bool end_array()
        method parse_error (line 6616) | bool parse_error(std::size_t /*unused*/, const std::string& /*unus...
      class lexer_base (line 6654) | class lexer_base
        type token_type (line 6658) | enum class token_type
      class lexer (line 6731) | class lexer : public lexer_base<BasicJsonType>
        method lexer (line 6743) | explicit lexer(InputAdapterType&& adapter, bool ignore_comments_ =...
        method lexer (line 6750) | lexer(const lexer&) = delete;
        method lexer (line 6751) | lexer(lexer&&) = default;
        method lexer (line 6752) | lexer& operator=(lexer&) = delete;
        method lexer (line 6753) | lexer& operator=(lexer&&) = default;
        method JSON_HEDLEY_PURE (line 6762) | JSON_HEDLEY_PURE
        method get_codepoint (line 6789) | int get_codepoint()
        method next_byte_in_range (line 6837) | bool next_byte_in_range(std::initializer_list<char_int_type> ranges)
        method token_type (line 6874) | token_type scan_string()
        method scan_comment (line 7464) | bool scan_comment()
        method strtof (line 7532) | static void strtof(float& f, const char* str, char** endptr) noexcept
        method strtof (line 7538) | static void strtof(double& f, const char* str, char** endptr) noex...
        method strtof (line 7544) | static void strtof(long double& f, const char* str, char** endptr)...
        method token_type (line 7589) | token_type scan_number()  // lgtm [cpp/use-of-goto]
      type is_sax (line 8322) | struct is_sax
      type is_sax_static_asserts (line 8353) | struct is_sax_static_asserts
      type cbor_tag_handler_t (line 8419) | enum class cbor_tag_handler_t
      function little_endianess (line 8433) | static inline bool little_endianess(int num = 1) noexcept
      class binary_reader (line 8447) | class binary_reader
        method binary_reader (line 8464) | explicit binary_reader(InputAdapterType&& adapter) noexcept : ia(s...
        method binary_reader (line 8470) | binary_reader(const binary_reader&) = delete;
        method binary_reader (line 8471) | binary_reader(binary_reader&&) = default;
        method binary_reader (line 8472) | binary_reader& operator=(const binary_reader&) = delete;
        method binary_reader (line 8473) | binary_reader& operator=(binary_reader&&) = default;
        method JSON_HEDLEY_NON_NULL (line 8484) | JSON_HEDLEY_NON_NULL(3)
        method parse_bson_internal (line 8547) | bool parse_bson_internal()
        method get_bson_cstr (line 8572) | bool get_bson_cstr(string_t& result)
        method get_bson_string (line 8602) | bool get_bson_string(const NumberType len, string_t& result)
        method get_bson_binary (line 8623) | bool get_bson_binary(const NumberType len, binary_t& result)
        method parse_bson_element_internal (line 8649) | bool parse_bson_element_internal(const char_int_type element_type,
        method parse_bson_element_list (line 8727) | bool parse_bson_element_list(const bool is_array)
        method parse_bson_array (line 8765) | bool parse_bson_array()
        method parse_cbor_internal (line 8795) | bool parse_cbor_internal(const bool get_char,
        method get_cbor_string (line 9283) | bool get_cbor_string(string_t& result)
        method get_cbor_binary (line 9378) | bool get_cbor_binary(binary_t& result)
        method get_cbor_array (line 9472) | bool get_cbor_array(const std::size_t len,
        method get_cbor_object (line 9510) | bool get_cbor_object(const std::size_t len,
        method parse_msgpack_internal (line 9566) | bool parse_msgpack_internal()
        method get_msgpack_string (line 9946) | bool get_msgpack_string(string_t& result)
        method get_msgpack_binary (line 10028) | bool get_msgpack_binary(binary_t& result)
        method get_msgpack_array (line 10139) | bool get_msgpack_array(const std::size_t len)
        method get_msgpack_object (line 10161) | bool get_msgpack_object(const std::size_t len)
        method parse_ubjson_internal (line 10198) | bool parse_ubjson_internal(const bool get_char = true)
        method get_ubjson_string (line 10217) | bool get_ubjson_string(string_t& result, const bool get_char = true)
        method get_ubjson_size_value (line 10271) | bool get_ubjson_size_value(std::size_t& result)
        method get_ubjson_size_type (line 10348) | bool get_ubjson_size_type(std::pair<std::size_t, char_int_type>& r...
        method get_ubjson_value (line 10389) | bool get_ubjson_value(const char_int_type prefix)
        method get_ubjson_array (line 10490) | bool get_ubjson_array()
        method get_ubjson_object (line 10552) | bool get_ubjson_object()
        method get_ubjson_high_precision_number (line 10627) | bool get_ubjson_high_precision_number()
        method char_int_type (line 10703) | char_int_type get()
        method char_int_type (line 10712) | char_int_type get_ignore_noop()
        method get_number (line 10737) | bool get_number(const input_format_t format, NumberType& result)
        method get_string (line 10780) | bool get_string(const input_format_t format,
        method get_binary (line 10813) | bool get_binary(const input_format_t format,
        method JSON_HEDLEY_NON_NULL (line 10836) | JSON_HEDLEY_NON_NULL(3)
        method get_token_string (line 10850) | std::string get_token_string() const
        method exception_message (line 10863) | std::string exception_message(const input_format_t format,
      type parse_event_t (line 10951) | enum class parse_event_t : std::uint8_t
      class parser (line 10977) | class parser
        method parser (line 10988) | explicit parser(InputAdapterType&& adapter,
        method parse (line 11010) | void parse(const bool strict, BasicJsonType& result)
        method accept (line 11070) | bool accept(const bool strict = true)
        method sax_parse (line 11078) | bool sax_parse(SAX* sax, const bool strict = true)
        method sax_parse_internal (line 11097) | bool sax_parse_internal(SAX* sax)
        method token_type (line 11378) | token_type get_token()
        method exception_message (line 11383) | std::string exception_message(const token_type expected, const std...
      class primitive_iterator_t (line 11451) | class primitive_iterator_t
        method difference_type (line 11463) | constexpr difference_type get_value() const noexcept
        method set_begin (line 11469) | void set_begin() noexcept
        method set_end (line 11475) | void set_end() noexcept
        method is_begin (line 11481) | constexpr bool is_begin() const noexcept
        method is_end (line 11487) | constexpr bool is_end() const noexcept
        method primitive_iterator_t (line 11502) | primitive_iterator_t operator+(difference_type n) noexcept
        method difference_type (line 11509) | constexpr difference_type operator-(primitive_iterator_t lhs, prim...
        method primitive_iterator_t (line 11514) | primitive_iterator_t& operator++() noexcept
        method primitive_iterator_t (line 11520) | primitive_iterator_t const operator++(int) noexcept // NOLINT(read...
        method primitive_iterator_t (line 11527) | primitive_iterator_t& operator--() noexcept
        method primitive_iterator_t (line 11533) | primitive_iterator_t const operator--(int) noexcept // NOLINT(read...
        method primitive_iterator_t (line 11540) | primitive_iterator_t& operator+=(difference_type n) noexcept
        method primitive_iterator_t (line 11546) | primitive_iterator_t& operator-=(difference_type n) noexcept
      type internal_iterator (line 11566) | struct internal_iterator
      class iteration_proxy (line 11604) | class iteration_proxy
        method iteration_proxy (line 4560) | explicit iteration_proxy(typename IteratorType::reference cont) no...
        method begin (line 4564) | iteration_proxy_value<IteratorType> begin() noexcept
        method end (line 4570) | iteration_proxy_value<IteratorType> end() noexcept
      class iteration_proxy_value (line 11605) | class iteration_proxy_value
        method iteration_proxy_value (line 4477) | explicit iteration_proxy_value(IteratorType it) noexcept
        method iteration_proxy_value (line 4482) | iteration_proxy_value& operator*()
        method iteration_proxy_value (line 4488) | iteration_proxy_value& operator++()
        method string_type (line 4509) | const string_type& key() const
        method value (line 4545) | typename IteratorType::reference value() const
      function set_end (line 11624) | class iter_impl
      class json_reverse_iterator (line 12362) | class json_reverse_iterator : public std::reverse_iterator<Base>
        method json_reverse_iterator (line 12372) | explicit json_reverse_iterator(const typename base_iterator::itera...
        method json_reverse_iterator (line 12376) | explicit json_reverse_iterator(const base_iterator& it) noexcept :...
        method json_reverse_iterator (line 12379) | json_reverse_iterator const operator++(int) // NOLINT(readability-...
        method json_reverse_iterator (line 12385) | json_reverse_iterator& operator++()
        method json_reverse_iterator (line 12391) | json_reverse_iterator const operator--(int) // NOLINT(readability-...
        method json_reverse_iterator (line 12397) | json_reverse_iterator& operator--()
        method json_reverse_iterator (line 12403) | json_reverse_iterator& operator+=(difference_type i)
        method json_reverse_iterator (line 12409) | json_reverse_iterator operator+(difference_type i) const
        method json_reverse_iterator (line 12415) | json_reverse_iterator operator-(difference_type i) const
        method difference_type (line 12421) | difference_type operator-(const json_reverse_iterator& other) const
        method reference (line 12427) | reference operator[](difference_type n) const
        method key (line 12433) | auto key() const -> decltype(std::declval<Base>().key())
        method reference (line 12440) | reference value() const
      class json_ref (line 13460) | class json_ref
        method json_ref (line 13465) | json_ref(value_type&& value)
        method json_ref (line 13469) | json_ref(const value_type& value)
        method
Condensed preview — 210 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,485K chars).
[
  {
    "path": ".github/workflows/build.yml",
    "chars": 1378,
    "preview": "name: CMake\n\non:\n  push:\n    branches: [ master ]\n    paths: [ \".github/workflows/build.yml\", CMakeLists.txt, 'src/**', "
  },
  {
    "path": ".gitignore",
    "chars": 426,
    "preview": "# Prerequisites\n*.d\n\n# Compiled Object files\n*.slo\n*.lo\n*.o\n*.obj\n\n# Precompiled Headers\n*.gch\n*.pch\n\n# Compiled Dynamic"
  },
  {
    "path": "CMakeLists.txt",
    "chars": 379,
    "preview": "cmake_minimum_required(VERSION 3.13)\nproject(D2RMH C CXX)\n\nif(MSVC)\n    set(CMAKE_CXX_STANDARD 20)\nelse()\n    set(CMAKE_"
  },
  {
    "path": "LICENSE",
    "chars": 1088,
    "preview": "MIT License\n\nCopyright (c) 2021-2022 Soar Qin, and contributors\n\nPermission is hereby granted, free of charge, to any pe"
  },
  {
    "path": "README.md",
    "chars": 5294,
    "preview": "**README in other languages: [中文说明](contrib/zhCN/README.md)**\n\n# D2RMH\nDiablo II Resurrected map revealing tool.\n\n# Disc"
  },
  {
    "path": "bin/D2RMH.ini",
    "chars": 8449,
    "preview": "[main]\n; path to your Diablo II LOD.\n; if not found in this path, D2RMH will fallback to read installation path from reg"
  },
  {
    "path": "bin/D2RMH_gamedata.ini",
    "chars": 5800,
    "preview": "[guides]\n; \"string\" = Map Name\n; \"+number\" = Object with certain ID\n; \"-number\" = Npc(Monster) with certain ID\n;Act1:\ngu"
  },
  {
    "path": "bin/D2RMH_item.ini",
    "chars": 14427,
    "preview": "[items]\n; format:\n;  <ID or Code>[+quality][*sockets][#ethereal]=style[,color,[sound]]\n;  ID or Code: check `ID` and `co"
  },
  {
    "path": "bin/plugins/chicken_life.lua",
    "chars": 639,
    "preview": "local text = create_text_list(\"default\")\n\nlocal chicken_life = function()\n    local player = get_player()\n    if player "
  },
  {
    "path": "bin/plugins/hotkey.lua",
    "chars": 734,
    "preview": "local toggle_show = function()\n    local conf = get_config()\n    conf.show = conf.show + 1\n    if conf.show > 2 then\n   "
  },
  {
    "path": "bin/plugins/town_portal_check.lua",
    "chars": 500,
    "preview": "local text = create_text_list(\"default\")\n\nlocal town_portal_check = function()\n    -- game fully loaded?\n    if not get_"
  },
  {
    "path": "build_msvc2019.bat",
    "chars": 749,
    "preview": "@echo off\n\nsetlocal\nset BUILD_DIR=msvc2019\n\nsetlocal\nset PATH=%MSYS2_BASE_PATH%\\mingw64\\bin;%PATH%\ncmake -Bbuild/%BUILD_"
  },
  {
    "path": "build_msvc2022.bat",
    "chars": 749,
    "preview": "@echo off\n\nsetlocal\nset BUILD_DIR=msvc2022\n\nsetlocal\nset PATH=%MSYS2_BASE_PATH%\\mingw64\\bin;%PATH%\ncmake -Bbuild/%BUILD_"
  },
  {
    "path": "build_msys2_clang.bat",
    "chars": 924,
    "preview": "@echo off\n\nsetlocal\nset BUILD_DIR=msys2_clang\n\nsetlocal\nset MSYS2_BASE_PATH=%~1\nif \"%~1\" == \"\" set MSYS2_BASE_PATH=C:\\ms"
  },
  {
    "path": "build_msys2_mingw.bat",
    "chars": 817,
    "preview": "@echo off\n\nsetlocal\nset BUILD_DIR=msys2_mingw\n\nsetlocal\nset MSYS2_BASE_PATH=%~1\nif \"%~1\" == \"\" set MSYS2_BASE_PATH=C:\\ms"
  },
  {
    "path": "cmake/CustomCompilerOptions.cmake",
    "chars": 2520,
    "preview": "macro(fix_compile_flags)\n    if(MSVC)\n        set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} /utf-8\")\n        set(CMAKE_CXX_FLAGS \""
  },
  {
    "path": "cmake/GetVersion.cmake",
    "chars": 5026,
    "preview": "macro(get_project_version VER_PROJ_NAME)\n    find_package(Git QUIET)\n\n    # Check if git is found...\n    if (GIT_FOUND)\n"
  },
  {
    "path": "contrib/zhCN/D2RMH.ini",
    "chars": 5263,
    "preview": "[main]\n; D2LOD 路径\n; 如果该路径不包含游戏,则D2RMH会尝试从注册表读取安装目录\nd2_path = .\n; 字体路径\nfont_file_path = C:\\Windows\\Fonts\\SimHei.ttf\n; 文字字"
  },
  {
    "path": "contrib/zhCN/README.md",
    "chars": 3971,
    "preview": "**README in other languages: [English](../../README.md)**\n\n# D2RMH\nDiablo II Resurrected 开图工具\n\n# 免责声明\n**D2RMH只从D2R读取内存,并"
  },
  {
    "path": "contrib/zhCN/plugins/chicken_life.lua",
    "chars": 604,
    "preview": "local text = create_text_list(\"default\")\n\nlocal chicken_life = function()\n    local player = get_player()\n    if player "
  },
  {
    "path": "contrib/zhCN/plugins/town_portal_check.lua",
    "chars": 469,
    "preview": "local text = create_text_list(\"default\")\n\nlocal town_portal_check = function()\n    -- game fully loaded?\n    if not get_"
  },
  {
    "path": "copy_dist.bat",
    "chars": 1041,
    "preview": "@echo off\n\ncmake -E copy_if_different bin\\D2RMH.ini bin\\D2RMH_gamedata.ini bin\\D2RMH_item.ini build\\%BUILD_DIR%\\dist\\\ncm"
  },
  {
    "path": "d2mapapi/.gitignore",
    "chars": 270,
    "preview": "# Prerequisites\n*.d\n\n# Compiled Object files\n*.slo\n*.lo\n*.o\n*.obj\n\n# Precompiled Headers\n*.gch\n*.pch\n\n# Compiled Dynamic"
  },
  {
    "path": "d2mapapi/.gitrepo",
    "chars": 420,
    "preview": "; DO NOT EDIT (unless you know what you are doing)\n;\n; This subdirectory is a git \"subrepo\", and this file is maintained"
  },
  {
    "path": "d2mapapi/CMakeLists.txt",
    "chars": 3067,
    "preview": "cmake_minimum_required(VERSION 3.13)\n\nproject(d2mapapi VERSION 1.3.0)\n\nif(MSVC)\n    set(CMAKE_CXX_STANDARD 20)\nelse()\n  "
  },
  {
    "path": "d2mapapi/LICENSE",
    "chars": 1098,
    "preview": "MIT License\n\nCopyright (c) 2020 jcageman\nCopyright (c) 2021-2022 Soar Qin\n\nPermission is hereby granted, free of charge,"
  },
  {
    "path": "d2mapapi/README.md",
    "chars": 5178,
    "preview": "# d2mapapi_mod\n**d2mapapi mod, original from [jcageman/d2mapapi](https://github.com/jcageman/d2mapapi)**\n\n# Projects\n* `"
  },
  {
    "path": "d2mapapi/cmake/CustomCompilerOptions.cmake",
    "chars": 2520,
    "preview": "macro(fix_compile_flags)\n    if(MSVC)\n        set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} /utf-8\")\n        set(CMAKE_CXX_FLAGS \""
  },
  {
    "path": "d2mapapi/collisionmap.cpp",
    "chars": 2040,
    "preview": "#include \"collisionmap.h\"\n\n#include <json.hpp>\n\n#include <sstream>\n\nnamespace d2mapapi {\n\nCollisionMap::CollisionMap(std"
  },
  {
    "path": "d2mapapi/collisionmap.h",
    "chars": 4017,
    "preview": "#pragma once\n\n#include <map>\n#include <vector>\n#include <string>\n#include <string_view>\n\nnamespace d2mapapi {\n\nstruct Po"
  },
  {
    "path": "d2mapapi/crc32.h",
    "chars": 1899,
    "preview": "#include <cstdint>\n#include <cstddef>\n\nnamespace crc {\n\n// Small implementation of std::array, needed until constexpr\n//"
  },
  {
    "path": "d2mapapi/d2map.cpp",
    "chars": 2543,
    "preview": "#include \"d2map.h\"\n\n#include \"d2ptrs.h\"\n#include \"offset.h\"\n\n#include <iostream>\n#include <windows.h>\n\nnamespace d2mapap"
  },
  {
    "path": "d2mapapi/d2map.h",
    "chars": 334,
    "preview": "#pragma once\n\n#include \"d2structs.h\"\n\nnamespace d2mapapi {\n\n#define ArraySize(x) (sizeof(x) / sizeof(x[0]))\n\n/* return N"
  },
  {
    "path": "d2mapapi/d2ptrs.h",
    "chars": 1621,
    "preview": "#pragma once\n\n#include \"d2structs.h\"\n\n#if defined(_DEFINE_VARS)\n#define D2EXTERN\n#else\n#define D2EXTERN extern\n#endif\n\nn"
  },
  {
    "path": "d2mapapi/d2structs.h",
    "chars": 11894,
    "preview": "#pragma once\n\n#include \"offset.h\"\n#include <cstdint>\n\nnamespace d2mapapi {\n\nstruct UnitAny;\nstruct Room1_111;\nstruct Roo"
  },
  {
    "path": "d2mapapi/genimage.cpp",
    "chars": 3712,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "d2mapapi/host.cpp",
    "chars": 625,
    "preview": "#include \"pipehost.h\"\n\n#include <windows.h>\n\nint main(int argc, char *argv[]) {\n    d2mapapi::PipedChildProcess pcp;\n   "
  },
  {
    "path": "d2mapapi/httpd.cpp",
    "chars": 4063,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "d2mapapi/json/LICENSE.MIT",
    "chars": 1076,
    "preview": "MIT License \n\nCopyright (c) 2013-2021 Niels Lohmann\n\nPermission is hereby granted, free of charge, to any person obtaini"
  },
  {
    "path": "d2mapapi/json/README.md",
    "chars": 99702,
    "preview": "[![JSON for Modern C++](https://raw.githubusercontent.com/nlohmann/json/master/doc/json.gif)](https://github.com/nlohman"
  },
  {
    "path": "d2mapapi/json/json.hpp",
    "chars": 982934,
    "preview": "/*\n    __ _____ _____ _____\n __|  |   __|     |   | |  JSON for Modern C++\n|  |  |__   |  |  | | | |  version 3.10.4\n|__"
  },
  {
    "path": "d2mapapi/mapdata.cpp",
    "chars": 17831,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "d2mapapi/mapdata.h",
    "chars": 466,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "d2mapapi/offset.cpp",
    "chars": 7375,
    "preview": "#include \"offset.h\"\n\n#define _DEFINE_VARS\n#include \"d2ptrs.h\"\n#include \"crc32.h\"\n\n#include <iostream>\n#include <windows."
  },
  {
    "path": "d2mapapi/offset.h",
    "chars": 192,
    "preview": "#pragma once\n\n#include <cstdint>\n\nnamespace d2mapapi {\n\nenum D2Version {\n    D2_111a,\n    D2_111b,\n    D2_112a,\n    D2_1"
  },
  {
    "path": "d2mapapi/pathfinder.cpp",
    "chars": 6870,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "d2mapapi/pathfinder.h",
    "chars": 522,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "d2mapapi/piped.cpp",
    "chars": 3585,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "d2mapapi/pipehost.cpp",
    "chars": 3516,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "d2mapapi/pipehost.h",
    "chars": 1057,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "d2mapapi/session.cpp",
    "chars": 1896,
    "preview": "#include \"session.h\"\n\n#include \"d2ptrs.h\"\n\nnamespace d2mapapi {\n\nstatic const unsigned int ActLevels[] = {1, 40, 75, 103"
  },
  {
    "path": "d2mapapi/session.h",
    "chars": 466,
    "preview": "#pragma once\n\n#include \"mapdata.h\"\n\n#include <map>\n#include <memory>\n\nnamespace d2mapapi {\n\nclass Session {\npublic:\n    "
  },
  {
    "path": "d2mapapi/simphttp/CMakeLists.txt",
    "chars": 1685,
    "preview": "cmake_minimum_required(VERSION 3.13)\n\nproject(simphttp)\n\nlist(APPEND CMAKE_MODULE_PATH \"${PROJECT_SOURCE_DIR}/cmake\")\n\nf"
  },
  {
    "path": "d2mapapi/simphttp/cmake/FindLibUV.cmake",
    "chars": 2402,
    "preview": "# - Try to find libuv\n# Once done, this will define\n#\n#  LIBUV_FOUND - system has libuv\n#  LIBUV_INCLUDE_DIRS - the libu"
  },
  {
    "path": "d2mapapi/simphttp/llhttp/CMakeLists.txt",
    "chars": 159,
    "preview": "project(llhttp)\nadd_library(${PROJECT_NAME} STATIC EXCLUDE_FROM_ALL api.c api.h http.c llhttp.c llhttp.h)\ntarget_include"
  },
  {
    "path": "d2mapapi/simphttp/llhttp/api.c",
    "chars": 9441,
    "preview": "#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"llhttp.h\"\n\n#define CALLBACK_MAYBE(PARSER, NAME)   "
  },
  {
    "path": "d2mapapi/simphttp/llhttp/api.h",
    "chars": 8252,
    "preview": "#ifndef INCLUDE_LLHTTP_API_H_\n#define INCLUDE_LLHTTP_API_H_\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n#include <stddef.h>\n\n"
  },
  {
    "path": "d2mapapi/simphttp/llhttp/http.c",
    "chars": 4474,
    "preview": "#include <stdio.h>\n#ifndef LLHTTP__TEST\n# include \"llhttp.h\"\n#else\n# define llhttp_t llparse_t\n#endif  /* */\n\nint llhttp"
  },
  {
    "path": "d2mapapi/simphttp/llhttp/llhttp.c",
    "chars": 444714,
    "preview": "#if LLHTTP_STRICT_MODE\n\n#include <stdlib.h>\n#include <stdint.h>\n#include <string.h>\n\n#ifdef __SSE4_2__\n #ifdef _MSC_VER\n"
  },
  {
    "path": "d2mapapi/simphttp/llhttp/llhttp.h",
    "chars": 15786,
    "preview": "#ifndef INCLUDE_LLHTTP_H_\n#define INCLUDE_LLHTTP_H_\n\n#define LLHTTP_VERSION_MAJOR 6\n#define LLHTTP_VERSION_MINOR 0\n#defi"
  },
  {
    "path": "d2mapapi/simphttp/simphttp.cpp",
    "chars": 13346,
    "preview": "#include \"simphttp.h\"\n\n#include <string_view>\n\nnamespace simphttp {\n\nconst std::string CRLF = \"\\r\\n\";\n\nServer::Server(Li"
  },
  {
    "path": "d2mapapi/simphttp/simphttp.h",
    "chars": 4031,
    "preview": "#pragma once\n\n#include \"uri.h\"\n\n#include <map>\n#include <vector>\n#include <string>\n#include <sstream>\n#include <iostream"
  },
  {
    "path": "d2mapapi/simphttp/uri.h",
    "chars": 7889,
    "preview": "#ifndef NODEUV_URI\n#define NODEUV_URI\n\n#include <iostream>\n#include <string>\n#include <cstdlib>\n#include <map>\n#include "
  },
  {
    "path": "d2mapapi/stb/stb_image_write.h",
    "chars": 71221,
    "preview": "/* stb_image_write - v1.16 - public domain - http://nothings.org/stb\n   writes out PNG/BMP/TGA/JPEG/HDR images to C stdi"
  },
  {
    "path": "deps/CMakeLists.txt",
    "chars": 2497,
    "preview": "add_subdirectory(glad)\nadd_subdirectory(stb)\nadd_subdirectory(inih)\nadd_subdirectory(CascLib)\n\nfind_package(Git REQUIRED"
  },
  {
    "path": "deps/CascLib/CMakeLists.txt",
    "chars": 1679,
    "preview": "set(HEADER_FILES\n    src/CascCommon.h\n    src/CascLib.h\n    src/CascPort.h\n    src/common/Array.h\n    src/common/Common."
  },
  {
    "path": "deps/CascLib/LICENSE",
    "chars": 1081,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2014 Ladislav Zezula\n\nPermission is hereby granted, free of charge, to any person o"
  },
  {
    "path": "deps/CascLib/README.md",
    "chars": 2398,
    "preview": "# CascLib\n\n**CascLib** is an open-source implementation of library for reading Blizzard's CASC storages since 2014.\n\nFor"
  },
  {
    "path": "deps/CascLib/src/CascCommon.h",
    "chars": 25984,
    "preview": "/*****************************************************************************/\n/* CascCommon.h                         "
  },
  {
    "path": "deps/CascLib/src/CascDecompress.cpp",
    "chars": 2026,
    "preview": "/*****************************************************************************/\n/* CascDecompress.cpp                   "
  },
  {
    "path": "deps/CascLib/src/CascDecrypt.cpp",
    "chars": 98221,
    "preview": "/*****************************************************************************/\n/* CascDecrypt.cpp                      "
  },
  {
    "path": "deps/CascLib/src/CascDumpData.cpp",
    "chars": 19629,
    "preview": "/*****************************************************************************/\n/* CascDumpData.cpp                     "
  },
  {
    "path": "deps/CascLib/src/CascFiles.cpp",
    "chars": 54071,
    "preview": "/*****************************************************************************/\n/* CascFiles.cpp                        "
  },
  {
    "path": "deps/CascLib/src/CascFindFile.cpp",
    "chars": 8398,
    "preview": "/*****************************************************************************/\n/* CascFindFile.cpp                     "
  },
  {
    "path": "deps/CascLib/src/CascIndexFiles.cpp",
    "chars": 32712,
    "preview": "/*****************************************************************************/\n/* CascIndexFiles.cpp                   "
  },
  {
    "path": "deps/CascLib/src/CascLib.h",
    "chars": 19513,
    "preview": "/*****************************************************************************/\n/* CascLib.h                            "
  },
  {
    "path": "deps/CascLib/src/CascOpenFile.cpp",
    "chars": 13418,
    "preview": "/*****************************************************************************/\n/* CascOpenFile.cpp                     "
  },
  {
    "path": "deps/CascLib/src/CascOpenStorage.cpp",
    "chars": 51451,
    "preview": "/*****************************************************************************/\n/* CascOpenStorage.cpp                  "
  },
  {
    "path": "deps/CascLib/src/CascPort.h",
    "chars": 11576,
    "preview": "/*****************************************************************************/\n/* CascPort.h                           "
  },
  {
    "path": "deps/CascLib/src/CascReadFile.cpp",
    "chars": 45784,
    "preview": "/****************************************************************************/\n/* CascOpenFile.cpp                      "
  },
  {
    "path": "deps/CascLib/src/CascRootFile_Diablo3.cpp",
    "chars": 33245,
    "preview": "/*****************************************************************************/\n/* CascRootFile_Diablo3.cpp             "
  },
  {
    "path": "deps/CascLib/src/CascRootFile_Install.cpp",
    "chars": 4420,
    "preview": "/*****************************************************************************/\n/* CascRootFile_Install.cpp             "
  },
  {
    "path": "deps/CascLib/src/CascRootFile_MNDX.cpp",
    "chars": 105145,
    "preview": "/*****************************************************************************/\n/* CascRootFile_MNDX.cpp                "
  },
  {
    "path": "deps/CascLib/src/CascRootFile_OW.cpp",
    "chars": 19597,
    "preview": "/*****************************************************************************/\n/* CascRootFile_Text.cpp                "
  },
  {
    "path": "deps/CascLib/src/CascRootFile_TVFS.cpp",
    "chars": 32141,
    "preview": "/*****************************************************************************/\n/* CascRootFile_TVFS.cpp                "
  },
  {
    "path": "deps/CascLib/src/CascRootFile_Text.cpp",
    "chars": 4483,
    "preview": "/*****************************************************************************/\n/* CascRootFile_Text.cpp                "
  },
  {
    "path": "deps/CascLib/src/CascRootFile_WoW.cpp",
    "chars": 20149,
    "preview": "/*****************************************************************************/\n/* CascRootFile_WoW.cpp                 "
  },
  {
    "path": "deps/CascLib/src/CascStructs.h",
    "chars": 12924,
    "preview": "/*****************************************************************************/\n/* CascStructs.h                        "
  },
  {
    "path": "deps/CascLib/src/DllMain.c",
    "chars": 1070,
    "preview": "/*****************************************************************************/\n/* DllMain.c                            "
  },
  {
    "path": "deps/CascLib/src/DllMain.def",
    "chars": 627,
    "preview": ";\n; Export file for Windows\n; Copyright (c) 2015 Ladislav Zezula\n; ladik@zezula.net\n;\n\nLIBRARY CascLib.dll\n\nEXPORTS\n\n   "
  },
  {
    "path": "deps/CascLib/src/DllMain.rc",
    "chars": 2613,
    "preview": "// Microsoft Visual C++ generated resource script.\n//\n#include \"resource.h\"\n\n#define APSTUDIO_READONLY_SYMBOLS\n/////////"
  },
  {
    "path": "deps/CascLib/src/common/Array.h",
    "chars": 6226,
    "preview": "/*****************************************************************************/\n/* Array.h                              "
  },
  {
    "path": "deps/CascLib/src/common/Common.cpp",
    "chars": 21534,
    "preview": "/*****************************************************************************/\n/* CascCommon.cpp                       "
  },
  {
    "path": "deps/CascLib/src/common/Common.h",
    "chars": 19569,
    "preview": "/*****************************************************************************/\n/* CascCommon.h                         "
  },
  {
    "path": "deps/CascLib/src/common/Csv.cpp",
    "chars": 10111,
    "preview": "/*****************************************************************************/\n/* Csv.cpp                              "
  },
  {
    "path": "deps/CascLib/src/common/Csv.h",
    "chars": 3527,
    "preview": "/*****************************************************************************/\n/* Csv.h                                "
  },
  {
    "path": "deps/CascLib/src/common/Directory.cpp",
    "chars": 2895,
    "preview": "/*****************************************************************************/\n/* Directory.cpp                        "
  },
  {
    "path": "deps/CascLib/src/common/Directory.h",
    "chars": 1102,
    "preview": "/*****************************************************************************/\n/* Directory.h                          "
  },
  {
    "path": "deps/CascLib/src/common/FileStream.cpp",
    "chars": 99143,
    "preview": "/*****************************************************************************/\n/* FileStream.cpp                       "
  },
  {
    "path": "deps/CascLib/src/common/FileStream.h",
    "chars": 13379,
    "preview": "/*****************************************************************************/\n/* FileStream.h                         "
  },
  {
    "path": "deps/CascLib/src/common/FileTree.cpp",
    "chars": 23582,
    "preview": "/*****************************************************************************/\n/* FileTree.cpp                         "
  },
  {
    "path": "deps/CascLib/src/common/FileTree.h",
    "chars": 6121,
    "preview": "/*****************************************************************************/\n/* FileTree.h                           "
  },
  {
    "path": "deps/CascLib/src/common/IndexMap.h",
    "chars": 3938,
    "preview": "/*****************************************************************************/\n/* IndexMap.h                           "
  },
  {
    "path": "deps/CascLib/src/common/ListFile.cpp",
    "chars": 10073,
    "preview": "/*****************************************************************************/\n/* ListFile.cpp                         "
  },
  {
    "path": "deps/CascLib/src/common/ListFile.h",
    "chars": 1446,
    "preview": "/*****************************************************************************/\n/* ListFile.h                           "
  },
  {
    "path": "deps/CascLib/src/common/Map.h",
    "chars": 11737,
    "preview": "/*****************************************************************************/\n/* Map.h                                "
  },
  {
    "path": "deps/CascLib/src/common/Mime.cpp",
    "chars": 20874,
    "preview": "/*****************************************************************************/\n/* Mime.cpp                             "
  },
  {
    "path": "deps/CascLib/src/common/Mime.h",
    "chars": 3946,
    "preview": "/*****************************************************************************/\n/* Mime.h                               "
  },
  {
    "path": "deps/CascLib/src/common/Path.h",
    "chars": 5217,
    "preview": "/*****************************************************************************/\n/* Path.h                               "
  },
  {
    "path": "deps/CascLib/src/common/RootHandler.cpp",
    "chars": 3808,
    "preview": "/*****************************************************************************/\n/* RootHandler.cpp                      "
  },
  {
    "path": "deps/CascLib/src/common/RootHandler.h",
    "chars": 4053,
    "preview": "/*****************************************************************************/\n/* RootHandler.h                        "
  },
  {
    "path": "deps/CascLib/src/common/Sockets.cpp",
    "chars": 12771,
    "preview": "/*****************************************************************************/\n/* Sockets.cpp                          "
  },
  {
    "path": "deps/CascLib/src/common/Sockets.h",
    "chars": 4089,
    "preview": "/*****************************************************************************/\n/* Sockets.h                            "
  },
  {
    "path": "deps/CascLib/src/jenkins/lookup.h",
    "chars": 465,
    "preview": "#ifndef __LOOKUP3_H__\n#define __LOOKUP3_H__\n\n#ifdef WIN32\ntypedef unsigned char  uint8_t;\ntypedef unsigned short uint16_"
  },
  {
    "path": "deps/CascLib/src/jenkins/lookup3.c",
    "chars": 35294,
    "preview": "/*\n-------------------------------------------------------------------------------\nlookup3.c, by Bob Jenkins, May 2006, "
  },
  {
    "path": "deps/CascLib/src/md5/md5.cpp",
    "chars": 8799,
    "preview": "/*\n * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.\n * MD5 Message-Digest Algorithm (RFC 1"
  },
  {
    "path": "deps/CascLib/src/md5/md5.h",
    "chars": 1394,
    "preview": "/*\n * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.\n * MD5 Message-Digest Algorithm (RFC 1"
  },
  {
    "path": "deps/CascLib/src/resource.h",
    "chars": 390,
    "preview": "//{{NO_DEPENDENCIES}}\n// Microsoft Visual C++ generated include file.\n// Used by DllMain.rc\n//\n\n// Next default values f"
  },
  {
    "path": "deps/CascLib/src/zlib/adler32.c",
    "chars": 5204,
    "preview": "/* adler32.c -- compute the Adler-32 checksum of a data stream\n * Copyright (C) 1995-2011, 2016 Mark Adler\n * For condit"
  },
  {
    "path": "deps/CascLib/src/zlib/crc32.c",
    "chars": 14053,
    "preview": "/* crc32.c -- compute the CRC-32 of a data stream\n * Copyright (C) 1995-2006, 2010, 2011, 2012, 2016 Mark Adler\n * For c"
  },
  {
    "path": "deps/CascLib/src/zlib/crc32.h",
    "chars": 30562,
    "preview": "/* crc32.h -- tables for rapid CRC calculation\n * Generated automatically by crc32.c\n */\n\nlocal const z_crc_t FAR crc_ta"
  },
  {
    "path": "deps/CascLib/src/zlib/deflate.c",
    "chars": 78889,
    "preview": "/* deflate.c -- compress data using the deflation algorithm\n * Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler\n "
  },
  {
    "path": "deps/CascLib/src/zlib/deflate.h",
    "chars": 13150,
    "preview": "/* deflate.h -- internal compression state\n * Copyright (C) 1995-2016 Jean-loup Gailly\n * For conditions of distribution"
  },
  {
    "path": "deps/CascLib/src/zlib/gzguts.h",
    "chars": 6819,
    "preview": "/* gzguts.h -- zlib internal header definitions for gz* operations\n * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, "
  },
  {
    "path": "deps/CascLib/src/zlib/inffast.c",
    "chars": 12978,
    "preview": "/* inffast.c -- fast decoding\n * Copyright (C) 1995-2017 Mark Adler\n * For conditions of distribution and use, see copyr"
  },
  {
    "path": "deps/CascLib/src/zlib/inffast.h",
    "chars": 427,
    "preview": "/* inffast.h -- header to use inffast.c\n * Copyright (C) 1995-2003, 2010 Mark Adler\n * For conditions of distribution an"
  },
  {
    "path": "deps/CascLib/src/zlib/inffixed.h",
    "chars": 6332,
    "preview": "    /* inffixed.h -- table for decoding fixed codes\n     * Generated automatically by makefixed().\n     */\n\n    /* WARNI"
  },
  {
    "path": "deps/CascLib/src/zlib/inflate.c",
    "chars": 54800,
    "preview": "/* inflate.c -- zlib decompression\n * Copyright (C) 1995-2016 Mark Adler\n * For conditions of distribution and use, see "
  },
  {
    "path": "deps/CascLib/src/zlib/inflate.h",
    "chars": 6689,
    "preview": "/* inflate.h -- internal inflate state definition\n * Copyright (C) 1995-2016 Mark Adler\n * For conditions of distributio"
  },
  {
    "path": "deps/CascLib/src/zlib/inftrees.c",
    "chars": 12999,
    "preview": "/* inftrees.c -- generate Huffman trees for efficient decoding\n * Copyright (C) 1995-2017 Mark Adler\n * For conditions o"
  },
  {
    "path": "deps/CascLib/src/zlib/inftrees.h",
    "chars": 3003,
    "preview": "/* inftrees.h -- header to use inftrees.c\n * Copyright (C) 1995-2005, 2010 Mark Adler\n * For conditions of distribution "
  },
  {
    "path": "deps/CascLib/src/zlib/trees.c",
    "chars": 43761,
    "preview": "/* trees.c -- output deflated data using Huffman coding\n * Copyright (C) 1995-2017 Jean-loup Gailly\n * detect_data_type("
  },
  {
    "path": "deps/CascLib/src/zlib/trees.h",
    "chars": 8472,
    "preview": "/* header created automatically with -DGEN_TREES_H */\n\nlocal const ct_data static_ltree[L_CODES+2] = {\n{{ 12},{  8}}, {{"
  },
  {
    "path": "deps/CascLib/src/zlib/zconf.h",
    "chars": 16298,
    "preview": "/* zconf.h -- configuration of the zlib compression library\n * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler\n * F"
  },
  {
    "path": "deps/CascLib/src/zlib/zlib.h",
    "chars": 96239,
    "preview": "/* zlib.h -- interface of the 'zlib' general purpose compression library\n  version 1.2.11, January 15th, 2017\n\n  Copyrig"
  },
  {
    "path": "deps/CascLib/src/zlib/zutil.c",
    "chars": 7304,
    "preview": "/* zutil.c -- target dependent utility functions for the compression library\n * Copyright (C) 1995-2017 Jean-loup Gailly"
  },
  {
    "path": "deps/CascLib/src/zlib/zutil.h",
    "chars": 7127,
    "preview": "/* zutil.h -- internal interface and configuration of the compression library\n * Copyright (C) 1995-2016 Jean-loup Gaill"
  },
  {
    "path": "deps/glad/CMakeLists.txt",
    "chars": 116,
    "preview": "add_library(glad STATIC EXCLUDE_FROM_ALL src/glad.c src/glad_wgl.c)\ntarget_include_directories(glad PUBLIC include)\n"
  },
  {
    "path": "deps/glad/include/KHR/khrplatform.h",
    "chars": 10279,
    "preview": "#ifndef __khrplatform_h_\n#define __khrplatform_h_\n\n/*\n** Copyright (c) 2008-2018 The Khronos Group Inc.\n**\n** Permission"
  },
  {
    "path": "deps/glad/include/glad/glad.h",
    "chars": 108745,
    "preview": "/*\n\n    OpenGL loader generated by glad 0.1.34 on Sat Oct 30 06:22:17 2021.\n\n    Language/Generator: C/C++\n    Specifica"
  },
  {
    "path": "deps/glad/include/glad/glad_wgl.h",
    "chars": 3643,
    "preview": "/*\n\n    WGL loader generated by glad 0.1.34 on Wed Nov  3 06:45:32 2021.\n\n    Language/Generator: C/C++\n    Specificatio"
  },
  {
    "path": "deps/glad/src/glad.c",
    "chars": 60263,
    "preview": "/*\n\n    OpenGL loader generated by glad 0.1.34 on Sat Oct 30 06:22:17 2021.\n\n    Language/Generator: C/C++\n    Specifica"
  },
  {
    "path": "deps/glad/src/glad_wgl.c",
    "chars": 6882,
    "preview": "/*\n\n    WGL loader generated by glad 0.1.34 on Wed Nov  3 06:45:32 2021.\n\n    Language/Generator: C/C++\n    Specificatio"
  },
  {
    "path": "deps/inih/CMakeLists.txt",
    "chars": 276,
    "preview": "add_library(inih STATIC EXCLUDE_FROM_ALL ini.c ini.h)\ntarget_compile_definitions(inih PRIVATE INI_ALLOW_NO_VALUE INI_CAL"
  },
  {
    "path": "deps/inih/LICENSE.txt",
    "chars": 1510,
    "preview": "\nThe \"inih\" library is distributed under the New BSD license:\n\nCopyright (c) 2009, Ben Hoyt\nAll rights reserved.\n\nRedist"
  },
  {
    "path": "deps/inih/README.md",
    "chars": 9566,
    "preview": "# inih (INI Not Invented Here)\n\n[![Tests](https://github.com/benhoyt/inih/actions/workflows/tests.yml/badge.svg)](https:"
  },
  {
    "path": "deps/inih/ini.c",
    "chars": 8130,
    "preview": "/* inih -- simple .INI file parser\n\nSPDX-License-Identifier: BSD-3-Clause\n\nCopyright (C) 2009-2020, Ben Hoyt\n\ninih is re"
  },
  {
    "path": "deps/inih/ini.h",
    "chars": 5343,
    "preview": "/* inih -- simple .INI file parser\n\nSPDX-License-Identifier: BSD-3-Clause\n\nCopyright (C) 2009-2020, Ben Hoyt\n\ninih is re"
  },
  {
    "path": "deps/sol3/CMakeLists.txt",
    "chars": 145,
    "preview": "add_library(sol3 INTERFACE EXCLUDE_FROM_ALL)\ntarget_include_directories(sol3 INTERFACE include)\ntarget_link_libraries(so"
  },
  {
    "path": "deps/sol3/CONTRIBUTORS.md",
    "chars": 1004,
    "preview": "# 🎉 Donators! ♥ 🎉\n\nThank you to all patrons, donators and contributors who help keep sol3 amazing.\n\n- Robert Salvet\n- Ορ"
  },
  {
    "path": "deps/sol3/LICENSE.txt",
    "chars": 1104,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2013-2020 Rapptz, ThePhD, and contributors\n\nPermission is hereby granted, free of c"
  },
  {
    "path": "deps/sol3/README.md",
    "chars": 8584,
    "preview": "## sol3 (sol2 v3.2.3)\n\n[![Linux & Max OSX Build Status](https://travis-ci.org/ThePhD/sol2.svg?branch=develop)](https://t"
  },
  {
    "path": "deps/sol3/include/sol/config.hpp",
    "chars": 2040,
    "preview": "// The MIT License (MIT)\n\n// Copyright (c) 2013-2020 Rapptz, ThePhD and contributors\n\n// Permission is hereby granted, f"
  },
  {
    "path": "deps/sol3/include/sol/forward.hpp",
    "chars": 25347,
    "preview": "// The MIT License (MIT)\n\n// Copyright (c) 2013-2020 Rapptz, ThePhD and contributors\n\n// Permission is hereby granted, f"
  },
  {
    "path": "deps/sol3/include/sol/sol.hpp",
    "chars": 893119,
    "preview": "// The MIT License (MIT)\n\n// Copyright (c) 2013-2020 Rapptz, ThePhD and contributors\n\n// Permission is hereby granted, f"
  },
  {
    "path": "deps/stb/CMakeLists.txt",
    "chars": 89,
    "preview": "add_library(stb INTERFACE EXCLUDE_FROM_ALL)\ntarget_include_directories(stb INTERFACE .)\n\n"
  },
  {
    "path": "deps/stb/stb_rect_pack.h",
    "chars": 20199,
    "preview": "// stb_rect_pack.h - v1.01 - public domain - rectangle packing\n// Sean Barrett 2014\n//\n// Useful for e.g. packing rectan"
  },
  {
    "path": "deps/stb/stb_truetype.h",
    "chars": 199033,
    "preview": "// stb_truetype.h - v1.26 - public domain\n// authored from 2009-2021 by Sean Barrett / RAD Game Tools\n//\n// ============"
  },
  {
    "path": "doc/ChangeLog.md",
    "chars": 8527,
    "preview": "# v0.10.2\n* do not show names of dummy objects\n* fix localized string loading, to fix a bug that some objects are not sh"
  },
  {
    "path": "doc/ItemDesc.md",
    "chars": 268384,
    "preview": "|  ID | code | enUS                             | zhTW      | deDE                               | esES                "
  },
  {
    "path": "doc/KeyMapping.md",
    "chars": 11131,
    "preview": "Modifiers:\n\n| string           | key         |\n|------------------|-------------|\n| `SHIFT`          | SHIFT key   |\n| `"
  },
  {
    "path": "doc/LICENSE.lua54",
    "chars": 1063,
    "preview": "Copyright © 1994–2021 Lua.org, PUC-Rio.\nPermission is hereby granted, free of charge, to any person obtaining a copy of "
  },
  {
    "path": "doc/Plugin.md",
    "chars": 12158,
    "preview": "# Plugin system document\n## Programming Language\n* The plugin system is designed to be written in [lua](https://www.lua."
  },
  {
    "path": "doc/Skill.md",
    "chars": 17592,
    "preview": "| Skill Name                 | ID  | CharClass |\n|:---------------------------|:----|:----------|\n| Attack             "
  },
  {
    "path": "doc/TODO.md",
    "chars": 119,
    "preview": "### Scheduled\n* draw various objects in graphics\n\n### Need more research, may not be implemented\n* find ilvl for items\n"
  },
  {
    "path": "src/CMakeLists.txt",
    "chars": 996,
    "preview": "include(GetVersion)\n\noption(USE_FREETYPE \"Use FreeType to render TTF fonts\" OFF)\nfile(GLOB D2RMH_SRC_FILES\n    d2r/*.cpp"
  },
  {
    "path": "src/cfg.cpp",
    "chars": 10492,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/cfg.h",
    "chars": 3895,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/d2r/d2rdefs.h",
    "chars": 19371,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/d2r/mapstructs.h",
    "chars": 1001,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/d2r/processdata.cpp",
    "chars": 23312,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/d2r/processdata.h",
    "chars": 2064,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/d2r/processmanager.cpp",
    "chars": 8866,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/d2r/processmanager.h",
    "chars": 2833,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/d2r/storage.cpp",
    "chars": 1963,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/d2r/storage.h",
    "chars": 520,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/d2r/stringdefs.inl",
    "chars": 4699,
    "preview": "wchar_t enchantStrings[256][4] = {\n    /*  0 */ L\"\",\n    /*  1 */ L\"\",\n    /*  2 */ L\"\",\n    /*  3 */ L\"\",\n    /*  4 */ "
  },
  {
    "path": "src/data/d2txt.cpp",
    "chars": 1436,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/data/d2txt.h",
    "chars": 1471,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/data/gamedata.cpp",
    "chars": 19303,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/data/gamedata.h",
    "chars": 1526,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/data/viewstream.h",
    "chars": 3654,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/main.cpp",
    "chars": 2374,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/plugin/plugin.cpp",
    "chars": 10270,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/plugin/plugin.h",
    "chars": 1104,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/render/HandmadeMath.h",
    "chars": 75472,
    "preview": "/*\n  HandmadeMath.h v1.13.0\n\n  This is a single header file with a bunch of useful functions for game and\n  graphics mat"
  },
  {
    "path": "src/render/d2font.cpp",
    "chars": 5518,
    "preview": "#include \"d2font.h\"\n\n#include \"cfg.h\"\n#include \"d2r/storage.h\"\n\n#include <iostream>\n#include <cstring>\n\nnamespace render"
  },
  {
    "path": "src/render/d2font.h",
    "chars": 2314,
    "preview": "#pragma once\n\n#include \"font.h\"\n\n#include <vector>\n#include <array>\n#include <string>\n#include <fstream>\n#include <cstdi"
  },
  {
    "path": "src/render/font.cpp",
    "chars": 5093,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/render/font.h",
    "chars": 3296,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/render/fontrenderimpl.h",
    "chars": 705,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/render/renderer.cpp",
    "chars": 23910,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/render/renderer.h",
    "chars": 5374,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/render/ttf.cpp",
    "chars": 5013,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/render/ttf.h",
    "chars": 1026,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/render/ttfgl.cpp",
    "chars": 1901,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/render/ttfgl.h",
    "chars": 1034,
    "preview": "/*\n * Copyright (c) 2021 Soar Qin<soarchin@gmail.com>\n *\n * Use of this source code is governed by an MIT-style\n * licen"
  },
  {
    "path": "src/res/D2RMH.manifest",
    "chars": 376,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersi"
  },
  {
    "path": "src/res/manifest.rc",
    "chars": 22,
    "preview": "1 24 \"D2RMH.manifest\"\n"
  },
  {
    "path": "src/res/res.rc",
    "chars": 815,
    "preview": "1 ICON \"D2RMH.ico\"\n\n#include \"winres.h\"\n\n101 DIALOG DISCARDABLE  0, 0, 240, 155\nSTYLE DS_MODALFRAME | WS_POPUP | WS_CAPT"
  }
]

// ... and 10 more files (download for full content)

About this extraction

This page contains the full source code of the soarqin/D2RMH GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 210 files (5.0 MB), approximately 1.3M tokens, and a symbol index with 5895 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!