From a320c8fab98998839e96413d677411cf9273a409 Mon Sep 17 00:00:00 2001 From: Julian Date: Sun, 29 May 2022 00:31:34 +0200 Subject: [PATCH] Initial Commit --- .gitignore | 14 + README.md | 156 + cuteInjector/CMakeLists.txt | 66 + cuteInjector/CMakeSettings.json | 40 + cuteInjector/resources/cuteInjector.rc | 1 + cuteInjector/resources/icon.ico | Bin 0 -> 94099 bytes cuteInjector/src/helpers/jsonSerializer.h | 79 + cuteInjector/src/main.cpp | 16 + cuteInjector/src/ui/mainWindow.cpp | 328 + cuteInjector/src/ui/mainWindow.h | 64 + cuteInjector/src/ui/mainWindow.ui | 169 + cuteInjector/src/ui/selectProcessDialog.cpp | 105 + cuteInjector/src/ui/selectProcessDialog.h | 41 + cuteInjector/src/ui/style.h | 35 + cuteInjector/src/ui/textInfoWindow.cpp | 28 + cuteInjector/src/ui/textInfoWindow.h | 24 + cuteInjector/src/utils/dllFile.cpp | 79 + cuteInjector/src/utils/dllFile.h | 58 + cuteInjector/src/utils/injector/injector.cpp | 88 + cuteInjector/src/utils/injector/injector.h | 20 + cuteInjector/src/utils/process/process.cpp | 51 + cuteInjector/src/utils/process/process.h | 41 + .../src/utils/process/processManager.cpp | 185 + .../src/utils/process/processManager.h | 45 + cuteInjector/vendor/nlohmann/json.hpp | 22091 ++++++++++++++++ resources/icon.png | Bin 0 -> 503544 bytes x86Bridge/CMakeLists.txt | 10 + x86Bridge/main.cpp | 5 + 28 files changed, 23839 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 cuteInjector/CMakeLists.txt create mode 100644 cuteInjector/CMakeSettings.json create mode 100644 cuteInjector/resources/cuteInjector.rc create mode 100644 cuteInjector/resources/icon.ico create mode 100644 cuteInjector/src/helpers/jsonSerializer.h create mode 100644 cuteInjector/src/main.cpp create mode 100644 cuteInjector/src/ui/mainWindow.cpp create mode 100644 cuteInjector/src/ui/mainWindow.h create mode 100644 cuteInjector/src/ui/mainWindow.ui create mode 100644 cuteInjector/src/ui/selectProcessDialog.cpp create mode 100644 cuteInjector/src/ui/selectProcessDialog.h create mode 100644 cuteInjector/src/ui/style.h create mode 100644 cuteInjector/src/ui/textInfoWindow.cpp create mode 100644 cuteInjector/src/ui/textInfoWindow.h create mode 100644 cuteInjector/src/utils/dllFile.cpp create mode 100644 cuteInjector/src/utils/dllFile.h create mode 100644 cuteInjector/src/utils/injector/injector.cpp create mode 100644 cuteInjector/src/utils/injector/injector.h create mode 100644 cuteInjector/src/utils/process/process.cpp create mode 100644 cuteInjector/src/utils/process/process.h create mode 100644 cuteInjector/src/utils/process/processManager.cpp create mode 100644 cuteInjector/src/utils/process/processManager.h create mode 100644 cuteInjector/vendor/nlohmann/json.hpp create mode 100644 resources/icon.png create mode 100644 x86Bridge/CMakeLists.txt create mode 100644 x86Bridge/main.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9ea4f1f --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# Jetbrains +*/.idea/* + +# Visual Studio +*/.vs/* + +# Cmake +*/CmakeLists.txt.user +*/cmake-build-debug/* +*/cmake-build-release/* +*/out/* + +# Build output +build-cuteInjector-* diff --git a/README.md b/README.md new file mode 100644 index 0000000..28f2bae --- /dev/null +++ b/README.md @@ -0,0 +1,156 @@ +
+ + + +[![Contributors][contributors-shield]][contributors-url] +[![Forks][forks-shield]][forks-url] +[![Stargazers][stars-shield]][stars-url] +[![Issues][issues-shield]][issues-url] +[![Apache License][license-shield]][license-url] + + + + +
+
+ + Logo + + +

cuteInjector

+ +

+ Simple dll injector built with QT +
+
+ Report Bug + · + Request Feature +

+
+ + + + +
+ Table of Contents +
    +
  1. + About The Project + +
  2. +
  3. + Getting Started + +
  4. +
  5. Usage
  6. +
  7. Roadmap
  8. +
  9. Contributing
  10. +
  11. License
  12. +
  13. Contact
  14. +
  15. Acknowledgments
  16. +
+
+ + + + +## About The Project + +- The Injector and the x86Bridge are two different CMake Projects because of the different architecture +- The x86Bridge is only used to get the address of LoadLibraryA in a x86 Process but that will change in the future + + +

(back to top)

+ + + +### Built With + +- [QT](https://qt.io/) +- [nlohmann json](https://github.com/nlohmann/json) + +

(back to top)

+ + + + +## Getting Started + +### Prerequisites +- QT + +### Visual Studio +- Install the QT Extension +- Open the Directory with Visual Studio +- Change the CMakeSettings.json accordingly. The CMAKE_PREFIX_PATH should be the only one you need to set. + +### CLion Setup +- Set the CMAKE_PREFIX_PATH in the Debug and Release Profiles of the CMake Settings. There is an Environment field. + +### CMAKE_PREFIX_PATH +- Is the Path of the QT Installation that should be used. For Example: `C:\Qt\6.3.0\msvc2019_64` + +### Release dependencies +- run `windeployqt.exe --release P:\ath\to\dir\with\cuteInjector.exe` + + + +

(back to top)

+ + + + +## Roadmap + +- [x] LoadLibrary + CreateThread Injection +- [x] Process Icons +- [ ] (File-)Logging, Log-Window +- [ ] Rethink x86, x64 situation +- [ ] Add more injection methods + - [ ] Manual Mapping + - [ ] LdrLoadDll +- [ ] Add more thread-creation methods + - [ ] Kernel callback + + +

(back to top)

+ + + + +## License + +Distributed under the Apache License 2.0. See `LICENSE` for more information. + +

(back to top)

+ + + + +## Contact + +Julian Hackinger - dev@hackinger.io + +Project Link: [https://github.com/0verEngineer/cuteInjector](https://github.com/0verEngineer/cuteInjector) + +

(back to top)

+ + + + +[contributors-shield]: https://img.shields.io/github/contributors/0verEngineer/cuteInjector.svg?style=for-the-badge +[contributors-url]: https://github.com/0verEngineer/cuteInjector/graphs/contributors +[forks-shield]: https://img.shields.io/github/forks/0verEngineer/cuteInjector.svg?style=for-the-badge +[forks-url]: https://github.com/0verEngineer/cuteInjector/network/members +[stars-shield]: https://img.shields.io/github/stars/0verEngineer/cuteInjector.svg?style=for-the-badge +[stars-url]: https://github.com/0verEngineer/cuteInjector/stargazers +[issues-shield]: https://img.shields.io/github/issues/0verEngineer/cuteInjector.svg?style=for-the-badge +[issues-url]: https://github.com/0verEngineer/cuteInjector/issues +[license-shield]: https://img.shields.io/github/license/0verEngineer/cuteInjector.svg?style=for-the-badge +[license-url]: https://github.com/0verEngineer/cuteInjector/blob/master/LICENSE.txt diff --git a/cuteInjector/CMakeLists.txt b/cuteInjector/CMakeLists.txt new file mode 100644 index 0000000..ea1ba47 --- /dev/null +++ b/cuteInjector/CMakeLists.txt @@ -0,0 +1,66 @@ +cmake_minimum_required(VERSION 3.21) +project(cuteInjector VERSION 0.0.2 LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 20) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + + +find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets) +find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets) + +set(SOURCES + src/main.cpp + + src/helpers/jsonSerializer.h + + src/ui/mainWindow.cpp + src/ui/mainWindow.h + src/ui/mainWindow.ui + src/ui/selectProcessDialog.cpp + src/ui/selectProcessDialog.h + src/ui/style.h + src/ui/textInfoWindow.cpp + src/ui/textInfoWindow.h + + src/utils/dllFile.cpp + src/utils/dllFile.h + + src/utils/injector/injector.cpp + src/utils/injector/injector.h + + src/utils/process/process.cpp + src/utils/process/process.h + src/utils/process/processManager.cpp + src/utils/process/processManager.h +) + + +# Icon +enable_language("RC") +set(RC_FILE resources/cuteInjector.rc) + + +qt_add_executable(cuteInjector + MANUAL_FINALIZATION + ${SOURCES} + ${RC_FILE} +) + +target_link_libraries(cuteInjector PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) + +set_target_properties(cuteInjector PROPERTIES + WIN32_EXECUTABLE TRUE + LINK_FLAGS "/MANIFESTUAC:\"level='requireAdministrator' uiAccess='false'\" /SUBSYSTEM:WINDOWS /MACHINE:X64" +) + +if(QT_VERSION_MAJOR EQUAL 6) + qt_finalize_executable(cuteInjector) +endif() diff --git a/cuteInjector/CMakeSettings.json b/cuteInjector/CMakeSettings.json new file mode 100644 index 0000000..14ce750 --- /dev/null +++ b/cuteInjector/CMakeSettings.json @@ -0,0 +1,40 @@ +{ + "configurations": [ + { + "name": "x64-Debug", + "generator": "Ninja", + "configurationType": "Debug", + "inheritEnvironments": [ "msvc_x64_x64" ], + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "variables": [ + { + "name": "CMAKE_INSTALL_PREFIX", + "value": "C:/Qt/6.3.0/msvc2019_64", + "type": "PATH" + } + ] + }, + { + "name": "x64-Release", + "generator": "Ninja", + "configurationType": "Release", + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "inheritEnvironments": [ "msvc_x64_x64" ], + "variables": [ + { + "name": "CMAKE_INSTALL_PREFIX", + "value": "C:/Qt/6.3.0/msvc2019_64", + "type": "PATH" + } + ] + } + ] +} \ No newline at end of file diff --git a/cuteInjector/resources/cuteInjector.rc b/cuteInjector/resources/cuteInjector.rc new file mode 100644 index 0000000..8f9d9ca --- /dev/null +++ b/cuteInjector/resources/cuteInjector.rc @@ -0,0 +1 @@ +IDI_ICON1 ICON DISCARDABLE "icon.ico" diff --git a/cuteInjector/resources/icon.ico b/cuteInjector/resources/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..996c8d5cf363a4a936bbb14bcfc75182f8487ab9 GIT binary patch literal 94099 zcmeF41wd5W+V^LM7L^p~lJ1a_E&&A#^BAClC>SWV(j2=L0Si4U5(+AUfuuzUsI;iy zF|ff#Mb@|0%xq@QFbR6@J>Prpz0X~H?->V}-~Wjfdu;-NNFWiSq6n~6CFlqf30efo zf6%#m5P>iTUeke>;9Jm}$nQgk=xCS`fozm>_Wv*KewzS|51JaZnb3|vy94blv>(s_ zGm|1;uYj*r04c7mocdnWa${vcY9wougs(}CEahOg;OngHCVZ{8Nx*9qy8&A!=5ZZJ zFtuy&I=zX*b8(Ln7FGnb6dr@j+t` znaQit?v;>xB@vniiw~4o@VnvxlNf;F0$UyY0u3;a z1DFP=ZT=6)zY^N4!JbzKz_vGV+!e?e`hAr&Y&S#eV9MMLaz{pv1B{wrJjdS0U5n{~ zy(SoS0NJ}iA9uY0?HaTaO6zu$q6LN=fwX{h!8$jv$_LnW`gp)OA0RC-iw86fpqRiu z7U1&$c8tXU)M9x6wd5Fp@duDOvJPmQp$4Q`X#jGkvad>j$KRkq#>gO3GIQvwuJF5e zg?UjPzL zd1M_(x!+={1NIugat6knS<9skP#nNw0n@xd(?MS}z@i?&>43~1Y2X{Q1ZEnbvWGFh z3i>^sJ>>5OSt0Ju*MX#C0g$l2LN-Z<0`fH}*Rnon0MiF&4N!DK$rJQ(0sc;iy))E2 zWIk~CVKBgG2M{sX3`9-#fI(I#fVe|0SsUnmJ#_-EUf?b-Fk_Ehqt^gdD=@7K$vJ^p z9H6fWXt99%x{y)}pt^u{9Dp?erU4iS@_TZ@5VtCVf=eXSHORdhnI^PKXnkPrnBnRJ&hda5d+ZvQ z8sIV)(Bc4(8X)%#Sj7QU8<67wstGlrA@(F_YoT?~*dral@7|>pNZ4Kk1C8UsV2$}e zTEzoME82p=Lq`AsX%8TvI0uO6ZUBQVPBLhq3jTYV(c%fC2C#FCGrJaQfXp7|X2jkm z6Cn1I+JQhz&juJ67z0CSsMXLk1_Os!13uZwKuCKX3k^`~2Nv;wbA5nuXKZOYpw)(G z%z&YvK&}he$AaG#2O#$@XltPsAp1LNkb4C^d&u9l5=c40-`Of1$QuL!Z9QwCuWw8? zU0oxfq-p|0q#c2PydTuSpHKrSPy<)Vnvr(BP34cp6QqS|Twa0P@i78_OcytBdVqB% zsyii}V4my6-iXW{vBwP406#|!P<4Qd1O3klG!4*d0wx;ZvL>MEfLTp| zZ^+m(<^gohg$Bs{vE0BcAM~St$bO6njT1ulcke=j-#um+|7sxPm=Cl~eA)6x-!u0b zK%dQmf3NFE5775v-&4{F#x|R?6u;+zJu3|if_+7Cdkz|45ewMY12uYG44Y2PnB9AJzk9u$Dk95qB)V;9FLDps<(fVZRSZ z_JKVs4WRJ?dJW+60G1C>i|GIt3;NbippON#+7R=7T+2ZNw7vlk^#Jo+fY|@Q_{+c; zfEl_b<5~?=tv5sd=Fm9DT3Q_N2LoWgK+NJ4tO>c%0ApN$xd)9oIl{ls<{b3<{;_A& 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 d8PnDsVIEyNUsB>&2LSg`e*N}UmArY#{{S1 +#include +#include + + +using json = nlohmann::json; +using std::fstream; + + +namespace jsonSerializer +{ + std::string path = QString(QDir::currentPath() + "/data.json").toStdString(); + + bool load(std::vector &dllFiles, Process &selectedProcess) + { + std::ifstream file(path); + if (file.fail()) + return false; + + json j; + file >> j; + + if (j.empty()) + { + file.close(); + return false; + } + + try + { + selectedProcess.name = QString::fromStdString(j["selectedProcess"]["name"].get()); + + for (int i = 0; i < j["dllFiles"].size(); i++) + { + QString name = QString::fromStdString(j["dllFiles"][i]["name"].get()); + QString path = QString::fromStdString(j["dllFiles"][i]["path"].get()); + QString arch = QString::fromStdString(j["dllFiles"][i]["arch"].get()); + + dllFiles.push_back(DllFile(path, name, arch)); + } + } + catch (nlohmann::detail::type_error) + { + qDebug() << "ERROR: Unable to read json"; + } + + file.close(); + return true; + } + + + void save(std::vector &dllFiles, Process &selectedProcess) + { + json j; + + j["selectedProcess"]["name"] = selectedProcess.name.toStdString(); + + for (int i = 0; i < dllFiles.size(); i++) + { + j["dllFiles"][i]["name"] = dllFiles[i].name.toStdString(); + j["dllFiles"][i]["path"] = dllFiles[i].path.toStdString(); + j["dllFiles"][i]["arch"] = dllFiles[i].arch.toStdString(); + } + + std::ofstream outFile(path); + outFile << std::setw(4) << j << std::endl; + outFile.close(); + } +} + +#endif // JSONSERIALIZER_H diff --git a/cuteInjector/src/main.cpp b/cuteInjector/src/main.cpp new file mode 100644 index 0000000..dbe89ec --- /dev/null +++ b/cuteInjector/src/main.cpp @@ -0,0 +1,16 @@ +#include "ui/mainWindow.h" +#include "ui/style.h" + +#include + + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + + ApplyStyle(&a); + + MainWindow w; + w.show(); + return a.exec(); +} diff --git a/cuteInjector/src/ui/mainWindow.cpp b/cuteInjector/src/ui/mainWindow.cpp new file mode 100644 index 0000000..6b03218 --- /dev/null +++ b/cuteInjector/src/ui/mainWindow.cpp @@ -0,0 +1,328 @@ +#include "mainWindow.h" +#include "./ui_mainWindow.h" +#include "textInfoWindow.h" +#include "../helpers/jsonSerializer.h" + +#include +#include +#include +#include + + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::mainWindow) +{ + ui->setupUi(this); + + dllFileTableViewModel = new QStandardItemModel(0, 3, this); + ui->tableViewDllFiles->horizontalHeader()->hide(); + ui->tableViewDllFiles->verticalHeader()->hide(); + ui->tableViewDllFiles->horizontalHeader()->setStretchLastSection(true); + ui->tableViewDllFiles->setSelectionBehavior(QAbstractItemView::SelectRows); + + // Only allow single file selection for now + ui->tableViewDllFiles->setSelectionMode(QAbstractItemView::SingleSelection); + + ui->iconProcess->setScaledContents(true); + + selectProcessDialog = new SelectProcessDialog(&processManager, this); + + connect(selectProcessDialog, &SelectProcessDialog::signalProcessSelected, this, &MainWindow::slotProcessSelected); + connect(&processManager, &ProcessManager::processFound, this, &MainWindow::slotProcessFound); + connect(&processManager, &ProcessManager::processNotFound, this, &MainWindow::slotProcessNotFound); + connect(&injector, &Injector::signalInjectionFinished, this, &MainWindow::slotInjectionFinished); + + std::lock_guard lock(selectedProcessMutex); + selectedProcess = Process(); + selectedDll = DllFile(); + + // Set the deserialized data in the ui and start the process scanner + if (jsonSerializer::load(dllFiles, selectedProcess)) + { + refreshDllFileTableViewContents(); + + if (selectedProcess.name.length() > 0) + { + ui->inputProcessName->setText(selectedProcess.name); + processManager.startAsyncProcessScan(selectedProcess.name); + } + } + + processManager.startScanLoop(selectedProcess, selectedProcessMutex); +} + + +MainWindow::~MainWindow() +{ + disconnect(selectProcessDialog, &SelectProcessDialog::signalProcessSelected, this, &MainWindow::slotProcessSelected); + disconnect(&processManager, &ProcessManager::processFound, this, &MainWindow::slotProcessFound); + disconnect(&processManager, &ProcessManager::processNotFound, this, &MainWindow::slotProcessNotFound); + disconnect(&injector, &Injector::signalInjectionFinished, this, &MainWindow::slotInjectionFinished); + + std::lock_guard lock(selectedProcessMutex); + jsonSerializer::save(dllFiles, selectedProcess); + + delete selectProcessDialog; + delete dllFileTableViewModel; + + delete ui; +} + + +void MainWindow::refreshDllFileTableViewContents() +{ + // Delete old stack allocated items, this needs to happen before setRowCount + if (!dllFileTableItems.empty()) + dllFileTableItems.clear(); + + dllFileTableViewModel->setRowCount(dllFiles.size()); + + for (int i = 0; i < dllFiles.size(); i++) + { + dllFileTableItems.push_back(std::make_unique(dllFiles.at(i).arch)); + dllFileTableViewModel->setItem(i, 0, dllFileTableItems.at(dllFileTableItems.size() - 1).get()); + + dllFileTableItems.push_back(std::make_unique(dllFiles.at(i).name)); + dllFileTableViewModel->setItem(i, 1, dllFileTableItems.at(dllFileTableItems.size() - 1).get()); + + dllFileTableItems.push_back(std::make_unique(dllFiles.at(i).path)); + dllFileTableViewModel->setItem(i, 2, dllFileTableItems.at(dllFileTableItems.size() - 1).get()); + } + + ui->tableViewDllFiles->setModel(dllFileTableViewModel); + ui->tableViewDllFiles->resizeColumnsToContents(); +} + + +// Used to activate / deactivate the inject button +void MainWindow::injectButtonToggle() +{ + std::unique_lock lock(selectedProcessMutex); + DWORD id = selectedProcess.id; + QString path = selectedProcess.path; + QString arch = selectedProcess.architecture; + lock.unlock(); + + QString selectedDllPath = selectedDll.path; + + bool enabled = false; + + if (id != 0 && + selectedDll.path.length() > 0 && + selectedDll.arch == arch) + { + const std::filesystem::path fsFilePath = selectedDllPath.toStdString(); + if (!std::filesystem::exists(fsFilePath)) + ui->statusbar->showMessage("DllFile not found", 4000); + else + enabled = true; + } + + ui->buttonInjectFile->setEnabled(enabled); +} + + +void MainWindow::selectDllFileInTable(int index) +{ + selectedDll = DllFile(dllFiles.at(index).path, + dllFiles.at(index).name, + dllFiles.at(index).arch + ); + ui->tableViewDllFiles->selectRow(index); +} + + +DllFile MainWindow::findDllInDllFiles(const QString path) +{ + for (int i = 0; i < dllFiles.size(); i++) + { + if (dllFiles.at(i).path == path) + { + return DllFile(path, dllFiles.at(i).name, dllFiles.at(i).arch); + } + } + + return DllFile(); +} + + +void MainWindow::slotProcessSelected(const QString name) +{ + ui->inputProcessName->setText(name); + this->on_inputProcessName_textChanged(name); +} + + +void MainWindow::slotProcessFound(const DWORD procId, + const QString name, + const QString path, + const QString architecture + ) +{ + bool hasChanged = false; + std::unique_lock lock(selectedProcessMutex); + if (selectedProcess.id != procId) + { + hasChanged = true; + selectedProcess = Process(procId, name, path, architecture); + } + lock.unlock(); + + if (hasChanged) + { + QPixmap icon = processManager.getIconFromExe(path, 64); + ui->iconProcess->setPixmap(icon); + + ui->inputProcessId->setText(QString::number(procId)); + ui->inputArchitecture->setText(architecture); + + injectButtonToggle(); + } +} + + +void MainWindow::slotProcessNotFound() +{ + std::unique_lock lock(selectedProcessMutex); + selectedProcess.id = 0; + selectedProcess.path = ""; + selectedProcess.architecture = ""; + lock.unlock(); + + ui->inputProcessId->setText(""); + ui->inputArchitecture->setText(""); + + injectButtonToggle(); +} + + +void MainWindow::slotInjectionFinished(bool success, const QString message) +{ + ui->statusbar->showMessage(message, 8000); +} + + +void MainWindow::on_buttonSelectProcess_clicked() +{ + selectProcessDialog->showWindow(); +} + + +void MainWindow::on_buttonAddFile_clicked() +{ + QUrl url = QFileDialog::getOpenFileUrl(this, "Select dll", QDir::currentPath(), "dll Files (*.dll)"); + if (!url.isValid()) + return; + + QString path = url.path().mid(1, url.path().length()); + + // Do not allow the same dll multiple times + if(findDllInDllFiles(path).path.length() > 0) + { + ui->statusbar->showMessage("File already added", 8000); + + // Select the dll instead + for (int i = 0; i < dllFiles.size(); i++) + { + if (dllFiles[i].path == path) + { + selectDllFileInTable(i); + } + } + return; + } + + dllFiles.push_back(DllFile(path)); + + refreshDllFileTableViewContents(); + + // Always select the newest dll + if (dllFiles.size() > 0) + { + selectDllFileInTable(dllFiles.size() - 1); + } + + injectButtonToggle(); + + ui->buttonRemoveFile->setEnabled(true); +} + + +void MainWindow::on_buttonRemoveFile_clicked() +{ + QModelIndexList indexes = ui->tableViewDllFiles->selectionModel()->selectedRows(); + + while (!indexes.isEmpty()) + { + dllFiles.erase(dllFiles.begin() + indexes.last().row()); + indexes.removeLast(); + } + + refreshDllFileTableViewContents(); + + selectedDll = DllFile(); + + injectButtonToggle(); + + // Disable the remove button + if (dllFileTableViewModel->rowCount() <= 0) + ui->buttonRemoveFile->setEnabled(false); +} + + +void MainWindow::on_buttonInjectFile_clicked() +{ + QString dllPath = selectedDll.path; + + std::unique_lock lock(selectedProcessMutex); + DWORD id = selectedProcess.id; + QString arch = selectedProcess.architecture; + lock.unlock(); + + if (dllPath.length() < 1 || id == 0) + { + ui->statusbar->showMessage("No file selected", 8000); + injectButtonToggle(); + return; + } + + injector.run(id, dllPath, arch); +} + + +void MainWindow::on_inputProcessName_textChanged(const QString &text) +{ + ui->inputProcessId->setText(""); + ui->inputArchitecture->setText(""); + + selectedProcess.id = 0; + selectedProcess.path = ""; + selectedProcess.architecture = ""; + + processManager.startAsyncProcessScan(text); +} + + +void MainWindow::on_tableViewDllFiles_clicked(const QModelIndex &index) +{ + QModelIndexList indexList = ui->tableViewDllFiles->selectionModel()->selectedRows(); + + if (indexList.length() > 0) + { + QString path = ui->tableViewDllFiles->selectionModel()->selectedRows(2).value(0).data().toString(); + + selectedDll = findDllInDllFiles(path); + + if (selectedDll.path.length() < 1) + { + ui->tableViewDllFiles->selectionModel()->clear(); + ui->statusbar->showMessage("Selected dll could not be found", 8000); + } + + injectButtonToggle(); + + ui->buttonRemoveFile->setEnabled(true); + } +} + diff --git a/cuteInjector/src/ui/mainWindow.h b/cuteInjector/src/ui/mainWindow.h new file mode 100644 index 0000000..86f280d --- /dev/null +++ b/cuteInjector/src/ui/mainWindow.h @@ -0,0 +1,64 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include "selectProcessDialog.h" +#include "../utils/process/processManager.h" +#include "../utils/injector/injector.h" +#include "../utils/dllFile.h" + +#include +#include +#include +#include + + +QT_BEGIN_NAMESPACE +namespace Ui { class mainWindow; } +QT_END_NAMESPACE + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + + void refreshDllFileTableViewContents(); + void injectButtonToggle(); + void selectDllFileInTable(int index); + DllFile findDllInDllFiles(const QString path); + +private slots: + void slotProcessSelected(const QString name); + void slotProcessFound(const DWORD procId, + const QString name, + const QString path, + const QString architecture + ); + void slotProcessNotFound(); + void slotInjectionFinished(bool success, const QString message); + void on_buttonSelectProcess_clicked(); + void on_buttonAddFile_clicked(); + void on_buttonRemoveFile_clicked(); + void on_buttonInjectFile_clicked(); + void on_inputProcessName_textChanged(const QString &text); + void on_tableViewDllFiles_clicked(const QModelIndex &index); + +private: + Ui::mainWindow *ui; + Injector injector; + ProcessManager processManager; + Process selectedProcess; + std::vector dllFiles; + DllFile selectedDll; + + QStandardItemModel* dllFileTableViewModel = nullptr; + std::vector> dllFileTableItems; + + SelectProcessDialog* selectProcessDialog = nullptr; + + std::mutex selectedProcessMutex; +}; + +#endif // MAINWINDOW_H diff --git a/cuteInjector/src/ui/mainWindow.ui b/cuteInjector/src/ui/mainWindow.ui new file mode 100644 index 0000000..d841b09 --- /dev/null +++ b/cuteInjector/src/ui/mainWindow.ui @@ -0,0 +1,169 @@ + + + mainWindow + + + + 0 + 0 + 500 + 310 + + + + cuteInjector + + + + + + + + + + + + + + + Processname: + + + + + + + Process ID: + + + + + + + Architecture: + + + + + + + + + + + + + + false + + + + + + + + + + false + + + + + + + + + + + + + + + + 0 + + + + + + 54 + 54 + + + + + 54 + 54 + + + + Qt::LeftToRight + + + + + + Qt::AlignJustify|Qt::AlignVCenter + + + + + + + + + Select + + + + + + + + + + + + + + + false + + + Remove + + + + + + + Add + + + + + + + false + + + Inject + + + + + + + + + + + + + + + + + + + diff --git a/cuteInjector/src/ui/selectProcessDialog.cpp b/cuteInjector/src/ui/selectProcessDialog.cpp new file mode 100644 index 0000000..6c328cf --- /dev/null +++ b/cuteInjector/src/ui/selectProcessDialog.cpp @@ -0,0 +1,105 @@ +#include "selectprocessdialog.h" +#include "../utils/process/processManager.h" + +#include +#include +#include +#include + + +SelectProcessDialog::SelectProcessDialog(ProcessManager* processManager, QWidget* parent) +{ + this->setWindowTitle("Select Process"); + + this->processManager = processManager; + + this->table = new QTableWidget(); + this->windowLayout = new QBoxLayout(QBoxLayout::Direction::TopToBottom, this); + + this->table->setColumnCount(columnCount); + this->table->setParent(this); + + this->table->horizontalHeader()->hide(); + this->table->verticalHeader()->hide(); + this->table->setSelectionBehavior(QAbstractItemView::SelectRows); + this->table->setEditTriggers(QAbstractItemView::NoEditTriggers); + + this->windowLayout->addWidget(table); + + // set the border to 0px + windowLayout->setContentsMargins(0, 0, 0, 0); + + // in windows the scrollBarWidth is 3px wider + scrollBarWidth = style()->pixelMetric(QStyle::PM_ScrollBarExtent) + 3; + + connect(table, &QTableWidget::cellDoubleClicked, this, &SelectProcessDialog::slotCellDoubleClicked); + connect(table, &QTableWidget::cellActivated, this, &SelectProcessDialog::slotCellDoubleClicked); +} + + +SelectProcessDialog::~SelectProcessDialog() +{ + disconnect(table, &QTableWidget::cellDoubleClicked, this, &SelectProcessDialog::slotCellDoubleClicked); + disconnect(table, &QTableWidget::cellActivated, this, &SelectProcessDialog::slotCellDoubleClicked); + + delete table; + delete windowLayout; +} + + +void SelectProcessDialog::showWindow() +{ + if (processList != nullptr) + processList->clear(); + processList = processManager->getUpdatedProcessList(); + + table->clear(); + table->setRowCount(processList->size()); + + std::vector items; + std::vector labels; + + for (int i = 0; i < processList->size(); i++) + { + QLabel* iconLabel = new QLabel(); + iconLabel->setPixmap(processList->at(i)->icon); + iconLabel->setAlignment(Qt::AlignCenter); + table->setCellWidget(i, 0, iconLabel); + labels.push_back(iconLabel); + + QTableWidgetItem* itemProcessId = new QTableWidgetItem(); + QString procId = QString::number(processList->at(i)->id, 16); + itemProcessId->setText(procId); + table->setItem(i, 1, itemProcessId); + items.push_back(itemProcessId); + + QTableWidgetItem* itemName = new QTableWidgetItem(); + itemName->setText(processList->at(i)->name); + table->setItem(i, 2, itemName); + items.push_back(itemName); + } + + table->resizeColumnsToContents(); + table->setCurrentCell(0, 2); + + // The Dialog somehow does not use the table size + int width = 0; + for (int i = 0; i < columnCount; i++) + width += table->columnWidth(i); + this->setMinimumWidth(width + scrollBarWidth); + + this->exec(); + + for (auto item : items) + delete item; + + for (auto label : labels) + delete label; +} + + +void SelectProcessDialog::slotCellDoubleClicked(int row, int col) +{ + emit signalProcessSelected(processList->at(row)->name); + this->close(); +} diff --git a/cuteInjector/src/ui/selectProcessDialog.h b/cuteInjector/src/ui/selectProcessDialog.h new file mode 100644 index 0000000..37f5700 --- /dev/null +++ b/cuteInjector/src/ui/selectProcessDialog.h @@ -0,0 +1,41 @@ +#ifndef SELECTPROCESSDIALOG_H +#define SELECTPROCESSDIALOG_H + +#include "../utils/process/process.h" +#include "../utils/process/processManager.h" + +#include +#include +#include +#include + + +class SelectProcessDialog : public QDialog +{ + Q_OBJECT + +public: + SelectProcessDialog(ProcessManager* processManager, QWidget* parent = nullptr); + ~SelectProcessDialog(); + + void showWindow(); + + QTableWidget* table = nullptr; + QBoxLayout* windowLayout = nullptr; + + ProcessManager* processManager = nullptr; + std::vector>* processList = nullptr; + + int columnCount = 3; + int scrollBarWidth = 0; + + +private slots: + void slotCellDoubleClicked(int row, int col); + + +signals: + void signalProcessSelected(const QString path); +}; + +#endif // SELECTPROCESSDIALOG_H diff --git a/cuteInjector/src/ui/style.h b/cuteInjector/src/ui/style.h new file mode 100644 index 0000000..6b81a1b --- /dev/null +++ b/cuteInjector/src/ui/style.h @@ -0,0 +1,35 @@ +#pragma once + +#include +#include +#include + + +void ApplyStyle(QApplication* app) +{ + app->setStyle(QStyleFactory::create("Fusion")); + + QPalette darkPalette; + darkPalette.setColor(QPalette::Window,QColor(53,53,53)); + darkPalette.setColor(QPalette::WindowText,Qt::white); + darkPalette.setColor(QPalette::Disabled,QPalette::WindowText,QColor(127,127,127)); + darkPalette.setColor(QPalette::Base,QColor(42,42,42)); + darkPalette.setColor(QPalette::AlternateBase,QColor(66,66,66)); + darkPalette.setColor(QPalette::ToolTipBase,Qt::white); + darkPalette.setColor(QPalette::ToolTipText,Qt::white); + darkPalette.setColor(QPalette::Text,Qt::white); + darkPalette.setColor(QPalette::Disabled,QPalette::Text,QColor(127,127,127)); + darkPalette.setColor(QPalette::Dark,QColor(35,35,35)); + darkPalette.setColor(QPalette::Shadow,QColor(20,20,20)); + darkPalette.setColor(QPalette::Button,QColor(53,53,53)); + darkPalette.setColor(QPalette::ButtonText,Qt::white); + darkPalette.setColor(QPalette::Disabled,QPalette::ButtonText,QColor(127,127,127)); + darkPalette.setColor(QPalette::BrightText,Qt::red); + darkPalette.setColor(QPalette::Link,QColor(42,130,218)); + darkPalette.setColor(QPalette::Highlight,QColor(42,130,218)); + darkPalette.setColor(QPalette::Disabled,QPalette::Highlight,QColor(80,80,80)); + darkPalette.setColor(QPalette::HighlightedText,Qt::white); + darkPalette.setColor(QPalette::Disabled,QPalette::HighlightedText,QColor(127,127,127)); + + app->setPalette(darkPalette); +} diff --git a/cuteInjector/src/ui/textInfoWindow.cpp b/cuteInjector/src/ui/textInfoWindow.cpp new file mode 100644 index 0000000..9c8411a --- /dev/null +++ b/cuteInjector/src/ui/textInfoWindow.cpp @@ -0,0 +1,28 @@ +#include "textInfoWindow.h" + + +TextInfoWindow::TextInfoWindow(QString windowTitle, QString text) +{ + this->setWindowTitle(windowTitle); + + this->layout = new QBoxLayout(QBoxLayout::Direction::LeftToRight, this); + + this->textBrowser = new QTextBrowser(this); + + this->layout->addWidget(textBrowser); + + textBrowser->setText(text); +} + + +TextInfoWindow::~TextInfoWindow() +{ + delete textBrowser; + delete layout; +} + + +void TextInfoWindow::show() +{ + this->exec(); +} diff --git a/cuteInjector/src/ui/textInfoWindow.h b/cuteInjector/src/ui/textInfoWindow.h new file mode 100644 index 0000000..7d57880 --- /dev/null +++ b/cuteInjector/src/ui/textInfoWindow.h @@ -0,0 +1,24 @@ +#ifndef TEXTINFOWINDOW_H +#define TEXTINFOWINDOW_H + +#include +#include +#include +#include + + +class TextInfoWindow : public QDialog +{ + Q_OBJECT + +public: + TextInfoWindow(QString windowTitle, QString text); + ~TextInfoWindow(); + + void show(); + + QBoxLayout* layout = nullptr; + QTextBrowser* textBrowser = nullptr; +}; + +#endif // TEXTINFOWINDOW_H diff --git a/cuteInjector/src/utils/dllFile.cpp b/cuteInjector/src/utils/dllFile.cpp new file mode 100644 index 0000000..48bd73a --- /dev/null +++ b/cuteInjector/src/utils/dllFile.cpp @@ -0,0 +1,79 @@ +#include "dllFile.h" + +#include +#include + + +#define ___IMAGE_DOS_SIGNATURE 0x5A4D +#define ___IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b +#define ___IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b + + +DllFile::DllFile() +{ + this->path = ""; + this->name = ""; + this->arch = ""; +} + + +DllFile::DllFile(const QString &path) +{ + this->path = path; + + QStringList splittedPath = path.split("/"); + this->name = splittedPath.last(); + + int iArch = getPlatform(path); + if (iArch == 32) + this->arch = "x86"; + else if (iArch == 64) + this->arch = "x64"; + else + this->arch = QString::number(iArch); +} + + +DllFile::DllFile(const QString &path, const QString &name, const QString &arch) +{ + this->path = path; + this->name = name; + this->arch = arch; +} + + +// Thanks to 0xRick https://0xrick.github.io +int DllFile::getPlatform(const QString &path) +{ + FILE* file; + fopen_s(&file, path.toStdString().c_str(), "rb"); + + if (file == nullptr) + { + return 0; + } + + WORD peFileType; + + fseek(file, 0, SEEK_SET); + + DosHeader dosHeader; + + fread(&dosHeader, sizeof(DosHeader), 1, file); + + if (dosHeader.e_magic != ___IMAGE_DOS_SIGNATURE) { + return 0; + } + + fseek(file, (dosHeader.e_lfanew + sizeof(DWORD) + sizeof(ImageFileHeader)), SEEK_SET); + fread(&peFileType, sizeof(WORD), 1, file); + fclose(file); + + if (peFileType == ___IMAGE_NT_OPTIONAL_HDR32_MAGIC) + return 32; + + else if (peFileType == ___IMAGE_NT_OPTIONAL_HDR64_MAGIC) + return 64; + else + return 0; +} diff --git a/cuteInjector/src/utils/dllFile.h b/cuteInjector/src/utils/dllFile.h new file mode 100644 index 0000000..2ef1876 --- /dev/null +++ b/cuteInjector/src/utils/dllFile.h @@ -0,0 +1,58 @@ +#ifndef DLLFILE_H +#define DLLFILE_H + +#include +#include + + +struct DosHeader { + WORD e_magic; + WORD e_cblp; + WORD e_cp; + WORD e_crlc; + WORD e_cparhdr; + WORD e_minalloc; + WORD e_maxalloc; + WORD e_ss; + WORD e_sp; + WORD e_csum; + WORD e_ip; + WORD e_cs; + WORD e_lfarlc; + WORD e_ovno; + WORD e_res[4]; + WORD e_oemid; + WORD e_oeminfo; + WORD e_res2[10]; + LONG e_lfanew; +}; + + +struct ImageFileHeader { + WORD Machine; + WORD NumberOfSections; + DWORD TimeDateStamp; + DWORD PointerToSymbolTable; + DWORD NumberOfSymbols; + WORD SizeOfOptionalHeader; + WORD Characteristics; +}; + + +class DllFile +{ +public: + DllFile(); + DllFile(const QString &path); + DllFile(const QString &path, const QString &name, const QString &arch); + ~DllFile() = default; + + QString path; + QString name; + QString arch; + +private: + static int getPlatform(const QString &path); +}; + +#endif // DLLFILE_H diff --git a/cuteInjector/src/utils/injector/injector.cpp b/cuteInjector/src/utils/injector/injector.cpp new file mode 100644 index 0000000..2def7d7 --- /dev/null +++ b/cuteInjector/src/utils/injector/injector.cpp @@ -0,0 +1,88 @@ +#include "injector.h" + +#include + + +Injector::Injector(QObject *parent) + : QObject{parent} +{ + +} + + +void Injector::run(const DWORD &procId, const QString &dllPath, const QString &arch) +{ + DWORD exitCode = 0; + std::string sDllPath = dllPath.toStdString(); + + HANDLE processHandle = OpenProcess( + PROCESS_CREATE_THREAD|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_VM_OPERATION, FALSE, procId); + + PTHREAD_START_ROUTINE loadLibraryAddress; + bool isInjectable = true; + + const std::filesystem::path fsFilePath = dllPath.toStdString(); + if (!std::filesystem::exists(fsFilePath)) + { + CloseHandle(processHandle); + emit signalInjectionFinished(false, "DllFile not found"); + return; + } + + if (arch == "x64") + { + HMODULE kernel32base = GetModuleHandle(L"kernel32.dll"); + FARPROC loadLibraryAddressX64 = GetProcAddress(kernel32base, "LoadLibraryA"); + loadLibraryAddress = reinterpret_cast(loadLibraryAddressX64); + } + else + { + int loadLibraryAddressX32 = system("x86Bridge.exe"); + loadLibraryAddress = reinterpret_cast(loadLibraryAddressX32); + + if (loadLibraryAddress == 0) + isInjectable = false; + } + + if (isInjectable) + { + // Allocate space in the process + void* baseAddress = VirtualAllocEx(processHandle, NULL, strlen(sDllPath.c_str()) + 1, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); + + if (baseAddress != 0) + { + // Write the dll path into the allocated space + WriteProcessMemory(processHandle, baseAddress, sDllPath.c_str(), strlen(sDllPath.c_str()) + 1, NULL); + + + HANDLE thread = CreateRemoteThread( + processHandle, + NULL, + 0, + loadLibraryAddress, + baseAddress, + 0, + NULL + ); + + // Block thread execution to make sure that our dll is injected + WaitForSingleObject(thread, INFINITE); + GetExitCodeThread(thread, &exitCode); + + VirtualFreeEx(processHandle, baseAddress, 0, MEM_RELEASE); + CloseHandle(thread); + + emit signalInjectionFinished(true, "Successfully injected"); + } + else + { + emit signalInjectionFinished(false, "Injection failed"); + } + } + else + { + emit signalInjectionFinished(false, "Injection failed"); + } + + CloseHandle(processHandle); +} diff --git a/cuteInjector/src/utils/injector/injector.h b/cuteInjector/src/utils/injector/injector.h new file mode 100644 index 0000000..2437d62 --- /dev/null +++ b/cuteInjector/src/utils/injector/injector.h @@ -0,0 +1,20 @@ +#ifndef INJECTOR_H +#define INJECTOR_H + +#include +#include + + +class Injector : public QObject +{ + Q_OBJECT +public: + explicit Injector(QObject *parent = nullptr); + + void run(const DWORD &procId, const QString &dllPath, const QString &arch); + +signals: + void signalInjectionFinished(bool success, const QString message); +}; + +#endif // INJECTOR_H diff --git a/cuteInjector/src/utils/process/process.cpp b/cuteInjector/src/utils/process/process.cpp new file mode 100644 index 0000000..fc45587 --- /dev/null +++ b/cuteInjector/src/utils/process/process.cpp @@ -0,0 +1,51 @@ +#include "process.h" +#include "processManager.h" + + +Process::Process() +{ + this->id = 0; + this->path = ""; + this->architecture = ""; + this->name = ""; + this->icon = ProcessManager::getStandardIcon(); +} + + +Process::Process(const DWORD &id, + const QString &name, + const QString &path, + const QString &architecture + ) +{ + this->id = id; + this->path = path; + this->architecture = architecture; + this->name = name; + this->icon = ProcessManager::getStandardIcon(); +} + + +Process::Process(const DWORD &id, + const QString &name, + const QString &path, + const QString &architecture, + const QPixmap &icon) +{ + this->id = id; + this->path = path; + this->architecture = architecture; + this->name = name; + this->icon = icon; +} + + +QString Process::getIdAsQString() +{ + QString id = QString::number(this->id, 16); + + while (id.length() < 8) + id.push_front("0"); + + return id.toUpper(); +} diff --git a/cuteInjector/src/utils/process/process.h b/cuteInjector/src/utils/process/process.h new file mode 100644 index 0000000..894a8c6 --- /dev/null +++ b/cuteInjector/src/utils/process/process.h @@ -0,0 +1,41 @@ +#ifndef PROCESS_H +#define PROCESS_H + +#include +#include +#include +#include + + +class Process +{ +public: + + Process(); + + Process(const DWORD &id, + const QString &name, + const QString &path, + const QString &architecture + ); + + Process(const DWORD &id, + const QString &name, + const QString &path, + const QString &architecture, + const QPixmap &icon + ); + + ~Process() = default; + + QString getIdAsQString(); + + DWORD id; + QString name; + QString path; + QString architecture; + + QPixmap icon; +}; + +#endif // PROCESS_H diff --git a/cuteInjector/src/utils/process/processManager.cpp b/cuteInjector/src/utils/process/processManager.cpp new file mode 100644 index 0000000..25b32c8 --- /dev/null +++ b/cuteInjector/src/utils/process/processManager.cpp @@ -0,0 +1,185 @@ +#include "processManager.h" + +#include +#include +#include + +#include +#include +#include +#include + + +ProcessManager::ProcessManager(QObject *parent) + : QObject{parent} +{ + +} + + +ProcessManager::~ProcessManager() +{ + if (isScanLoopThreadRunning) + isScanLoopThreadRunning = false; + + if (scanLoopThread.joinable()) + scanLoopThread.join(); +} + + +void ProcessManager::queryProcessInformation(const QString name) +{ + bool found = false; + HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (hSnap != INVALID_HANDLE_VALUE) + { + PROCESSENTRY32 procEntry; + procEntry.dwSize = sizeof(procEntry); + + if (Process32First(hSnap, &procEntry)) + { + do + { + if (QString::fromWCharArray(procEntry.szExeFile) == name) + { + SetLastError(0); + HANDLE processHandle = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, FALSE, procEntry.th32ProcessID); + DWORD errorID = ::GetLastError(); + if (errorID != 0) + continue; + + BOOL wIsX86Process = FALSE; + IsWow64Process(processHandle, &wIsX86Process); + + QString arch = "x64"; + if (wIsX86Process) arch = "x86"; + + wchar_t filePath[MAX_PATH]; + GetModuleFileNameExW(processHandle, NULL, filePath, MAX_PATH); + + CloseHandle(processHandle); + + emit processFound(procEntry.th32ProcessID, + name, + QString::fromStdWString(filePath), + arch + ); + found = true; + break; + } + + } while (Process32Next(hSnap, &procEntry)); + } + } + + if (!found) + emit processNotFound(); + CloseHandle(hSnap); +} + + +void ProcessManager::startAsyncProcessScan(const QString &name) +{ + if (!name.endsWith(".exe")) + return; + + auto future = std::async(std::launch::async, &ProcessManager::queryProcessInformation, this, name); +} + + +void ProcessManager::startScanLoop(Process &selectedProcess, std::mutex &selectedProcessMutex) +{ + scanLoopThread = std::thread(&ProcessManager::scanLoop, this, std::ref(selectedProcess), std::ref(selectedProcessMutex)); + scanLoopThread.detach(); +} + + +void ProcessManager::scanLoop(Process &selectedProcess, std::mutex &selectedProcessMutex) +{ + isScanLoopThreadRunning = true; + + while (isScanLoopThreadRunning) + { + std::unique_lock lock(selectedProcessMutex); + QString name = selectedProcess.name; + lock.unlock(); + + queryProcessInformation(name); + + std::this_thread::sleep_for(std::chrono::seconds(1)); + } +} + + +std::vector> *ProcessManager::getUpdatedProcessList() +{ + processList.clear(); + HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (hSnap != INVALID_HANDLE_VALUE) + { + PROCESSENTRY32 procEntry; + procEntry.dwSize = sizeof(procEntry); + + if (Process32First(hSnap, &procEntry)) + { + do + { + SetLastError(0); + HANDLE processHandle = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, FALSE, procEntry.th32ProcessID); + DWORD errorID = ::GetLastError(); + if (errorID != 0) + continue; + + wchar_t filePath[MAX_PATH]; + GetModuleFileNameExW(processHandle, NULL, filePath, MAX_PATH); + + CloseHandle(processHandle); + + QPixmap icon = getIconFromExe(QString::fromStdWString(filePath), 16); + + processList.push_back(std::make_unique( + procEntry.th32ProcessID, + QString::fromWCharArray(procEntry.szExeFile), + "", // Arch is not relevant here + QString::fromWCharArray(filePath), + icon + )); + + } while (Process32Next(hSnap, &procEntry)); + } + } + CloseHandle(hSnap); + + return &processList; +} + + +QPixmap ProcessManager::getIconFromExe(const QString &path, int size) +{ + HICON hIcon = 0; + SHDefExtractIcon(path.toStdWString().c_str(), 0, 0, &hIcon, NULL, size); + + // Default icon + if (hIcon == 0) { + hIcon = getStandardHIcon(); + } + + QPixmap icon = QPixmap::fromImage(QImage::fromHICON(hIcon).scaled(size, size, Qt::IgnoreAspectRatio, Qt::FastTransformation)); + DestroyIcon(hIcon); + return icon; +} + + +HICON ProcessManager::getStandardHIcon() +{ + return ::LoadIcon(0, IDI_APPLICATION); +} + + +QPixmap ProcessManager::getStandardIcon() +{ + HICON hIcon = getStandardHIcon(); + QPixmap icon = QPixmap::fromImage(QImage::fromHICON(hIcon)); + DestroyIcon(hIcon); + return icon; +} diff --git a/cuteInjector/src/utils/process/processManager.h b/cuteInjector/src/utils/process/processManager.h new file mode 100644 index 0000000..707ffee --- /dev/null +++ b/cuteInjector/src/utils/process/processManager.h @@ -0,0 +1,45 @@ +#ifndef PROCESSMANAGER_H +#define PROCESSMANAGER_H + +#include "process.h" + +#include +#include +#include +#include + + +class ProcessManager: public QObject +{ + Q_OBJECT + +public: + explicit ProcessManager(QObject *parent = nullptr); + ~ProcessManager(); + + void queryProcessInformation(const QString name); + void startAsyncProcessScan(const QString &name); + void startScanLoop(Process &selectedProcess, std::mutex &selectedProcessMutex); + void scanLoop(Process &selectedProcess, std::mutex &selectedProcessMutex); + std::vector> *getUpdatedProcessList(); + + static QPixmap getIconFromExe(const QString &path, int size); + static HICON getStandardHIcon(); + static QPixmap getStandardIcon(); + +private: + std::vector> processList; + std::atomic isScanLoopThreadRunning = false; + std::thread scanLoopThread; + +signals: + void processFound(const DWORD selectedProcessId, + const QString name, + const QString path, + const QString architecture + ); + void processNotFound(); + +}; + +#endif // PROCESSMANAGER_H diff --git a/cuteInjector/vendor/nlohmann/json.hpp b/cuteInjector/vendor/nlohmann/json.hpp new file mode 100644 index 0000000..cb27e05 --- /dev/null +++ b/cuteInjector/vendor/nlohmann/json.hpp @@ -0,0 +1,22091 @@ +/* + __ _____ _____ _____ + __| | __| | | | JSON for Modern C++ +| | |__ | | | | | | version 3.10.5 +|_____|_____|_____|_|___| https://github.com/nlohmann/json + +Licensed under the MIT License . +SPDX-License-Identifier: MIT +Copyright (c) 2013-2022 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. +*/ + +/****************************************************************************\ + * Note on documentation: The source files contain links to the online * + * documentation of the public API at https://json.nlohmann.me. This URL * + * contains the most recent documentation and should also be applicable to * + * previous versions; documentation for deprecated functions is not * + * removed, but marked deprecated. See "Generate documentation" section in * + * file doc/README.md. * +\****************************************************************************/ + +#ifndef INCLUDE_NLOHMANN_JSON_HPP_ +#define INCLUDE_NLOHMANN_JSON_HPP_ + +#define NLOHMANN_JSON_VERSION_MAJOR 3 +#define NLOHMANN_JSON_VERSION_MINOR 10 +#define NLOHMANN_JSON_VERSION_PATCH 5 + +#include // all_of, find, for_each +#include // nullptr_t, ptrdiff_t, size_t +#include // hash, less +#include // initializer_list +#ifndef JSON_NO_IO + #include // istream, ostream +#endif // JSON_NO_IO +#include // random_access_iterator_tag +#include // unique_ptr +#include // accumulate +#include // string, stoi, to_string +#include // declval, forward, move, pair, swap +#include // vector + +// #include + + +#include +#include + +// #include + + +#include // transform +#include // array +#include // forward_list +#include // inserter, front_inserter, end +#include // map +#include // string +#include // tuple, make_tuple +#include // is_arithmetic, is_same, is_enum, underlying_type, is_convertible +#include // unordered_map +#include // pair, declval +#include // valarray + +// #include + + +#include // exception +#include // runtime_error +#include // to_string +#include // vector + +// #include + + +#include // array +#include // size_t +#include // uint8_t +#include // string + +namespace nlohmann +{ +namespace detail +{ +/////////////////////////// +// JSON type enumeration // +/////////////////////////// + +/*! +@brief the JSON type enumeration + +This enumeration collects the different JSON types. It is internally used to +distinguish the stored values, and the functions @ref basic_json::is_null(), +@ref basic_json::is_object(), @ref basic_json::is_array(), +@ref basic_json::is_string(), @ref basic_json::is_boolean(), +@ref basic_json::is_number() (with @ref basic_json::is_number_integer(), +@ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()), +@ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and +@ref basic_json::is_structured() rely on it. + +@note There are three enumeration entries (number_integer, number_unsigned, and +number_float), because the library distinguishes these three types for numbers: +@ref basic_json::number_unsigned_t is used for unsigned integers, +@ref basic_json::number_integer_t is used for signed integers, and +@ref basic_json::number_float_t is used for floating-point numbers or to +approximate integers which do not fit in the limits of their respective type. + +@sa see @ref basic_json::basic_json(const value_t value_type) -- create a JSON +value with the default value for a given type + +@since version 1.0.0 +*/ +enum class value_t : std::uint8_t +{ + null, ///< null value + object, ///< object (unordered set of name/value pairs) + array, ///< array (ordered collection of values) + string, ///< string value + boolean, ///< boolean value + number_integer, ///< number value (signed integer) + number_unsigned, ///< number value (unsigned integer) + number_float, ///< number value (floating-point) + binary, ///< binary array (ordered collection of bytes) + discarded ///< discarded by the parser callback function +}; + +/*! +@brief comparison operator for JSON types + +Returns an ordering that is similar to Python: +- order: null < boolean < number < object < array < string < binary +- furthermore, each type is not smaller than itself +- discarded values are not comparable +- binary is represented as a b"" string in python and directly comparable to a + string; however, making a binary array directly comparable with a string would + be surprising behavior in a JSON file. + +@since version 1.0.0 +*/ +inline bool operator<(const value_t lhs, const value_t rhs) noexcept +{ + static constexpr std::array order = {{ + 0 /* null */, 3 /* object */, 4 /* array */, 5 /* string */, + 1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */, + 6 /* binary */ + } + }; + + const auto l_index = static_cast(lhs); + const auto r_index = static_cast(rhs); + return l_index < order.size() && r_index < order.size() && order[l_index] < order[r_index]; +} +} // namespace detail +} // namespace nlohmann + +// #include + + +#include +// #include + + +#include // declval, pair +// #include + + +/* Hedley - https://nemequ.github.io/hedley + * Created by Evan Nemerson + * + * To the extent possible under law, the author(s) have dedicated all + * copyright and related and neighboring rights to this software to + * the public domain worldwide. This software is distributed without + * any warranty. + * + * For details, see . + * SPDX-License-Identifier: CC0-1.0 + */ + +#if !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < 15) +#if defined(JSON_HEDLEY_VERSION) + #undef JSON_HEDLEY_VERSION +#endif +#define JSON_HEDLEY_VERSION 15 + +#if defined(JSON_HEDLEY_STRINGIFY_EX) + #undef JSON_HEDLEY_STRINGIFY_EX +#endif +#define JSON_HEDLEY_STRINGIFY_EX(x) #x + +#if defined(JSON_HEDLEY_STRINGIFY) + #undef JSON_HEDLEY_STRINGIFY +#endif +#define JSON_HEDLEY_STRINGIFY(x) JSON_HEDLEY_STRINGIFY_EX(x) + +#if defined(JSON_HEDLEY_CONCAT_EX) + #undef JSON_HEDLEY_CONCAT_EX +#endif +#define JSON_HEDLEY_CONCAT_EX(a,b) a##b + +#if defined(JSON_HEDLEY_CONCAT) + #undef JSON_HEDLEY_CONCAT +#endif +#define JSON_HEDLEY_CONCAT(a,b) JSON_HEDLEY_CONCAT_EX(a,b) + +#if defined(JSON_HEDLEY_CONCAT3_EX) + #undef JSON_HEDLEY_CONCAT3_EX +#endif +#define JSON_HEDLEY_CONCAT3_EX(a,b,c) a##b##c + +#if defined(JSON_HEDLEY_CONCAT3) + #undef JSON_HEDLEY_CONCAT3 +#endif +#define JSON_HEDLEY_CONCAT3(a,b,c) JSON_HEDLEY_CONCAT3_EX(a,b,c) + +#if defined(JSON_HEDLEY_VERSION_ENCODE) + #undef JSON_HEDLEY_VERSION_ENCODE +#endif +#define JSON_HEDLEY_VERSION_ENCODE(major,minor,revision) (((major) * 1000000) + ((minor) * 1000) + (revision)) + +#if defined(JSON_HEDLEY_VERSION_DECODE_MAJOR) + #undef JSON_HEDLEY_VERSION_DECODE_MAJOR +#endif +#define JSON_HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000) + +#if defined(JSON_HEDLEY_VERSION_DECODE_MINOR) + #undef JSON_HEDLEY_VERSION_DECODE_MINOR +#endif +#define JSON_HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000) + +#if defined(JSON_HEDLEY_VERSION_DECODE_REVISION) + #undef JSON_HEDLEY_VERSION_DECODE_REVISION +#endif +#define JSON_HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000) + +#if defined(JSON_HEDLEY_GNUC_VERSION) + #undef JSON_HEDLEY_GNUC_VERSION +#endif +#if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__) + #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) +#elif defined(__GNUC__) + #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0) +#endif + +#if defined(JSON_HEDLEY_GNUC_VERSION_CHECK) + #undef JSON_HEDLEY_GNUC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_GNUC_VERSION) + #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GNUC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_MSVC_VERSION) + #undef JSON_HEDLEY_MSVC_VERSION +#endif +#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, (_MSC_FULL_VER % 10000000) / 100000, (_MSC_FULL_VER % 100000) / 100) +#elif defined(_MSC_FULL_VER) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, (_MSC_FULL_VER % 1000000) / 10000, (_MSC_FULL_VER % 10000) / 10) +#elif defined(_MSC_VER) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0) +#endif + +#if defined(JSON_HEDLEY_MSVC_VERSION_CHECK) + #undef JSON_HEDLEY_MSVC_VERSION_CHECK +#endif +#if !defined(JSON_HEDLEY_MSVC_VERSION) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (0) +#elif defined(_MSC_VER) && (_MSC_VER >= 1400) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch))) +#elif defined(_MSC_VER) && (_MSC_VER >= 1200) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch))) +#else + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_VER >= ((major * 100) + (minor))) +#endif + +#if defined(JSON_HEDLEY_INTEL_VERSION) + #undef JSON_HEDLEY_INTEL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && !defined(__ICL) + #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE) +#elif defined(__INTEL_COMPILER) && !defined(__ICL) + #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0) +#endif + +#if defined(JSON_HEDLEY_INTEL_VERSION_CHECK) + #undef JSON_HEDLEY_INTEL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_INTEL_VERSION) + #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_INTEL_CL_VERSION) + #undef JSON_HEDLEY_INTEL_CL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && defined(__ICL) + #define JSON_HEDLEY_INTEL_CL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER, __INTEL_COMPILER_UPDATE, 0) +#endif + +#if defined(JSON_HEDLEY_INTEL_CL_VERSION_CHECK) + #undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_INTEL_CL_VERSION) + #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_CL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_PGI_VERSION) + #undef JSON_HEDLEY_PGI_VERSION +#endif +#if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__) + #define JSON_HEDLEY_PGI_VERSION JSON_HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__) +#endif + +#if defined(JSON_HEDLEY_PGI_VERSION_CHECK) + #undef JSON_HEDLEY_PGI_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_PGI_VERSION) + #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PGI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_SUNPRO_VERSION) + #undef JSON_HEDLEY_SUNPRO_VERSION +#endif +#if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), (__SUNPRO_C & 0xf) * 10) +#elif defined(__SUNPRO_C) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C) & 0xf) +#elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), (__SUNPRO_CC & 0xf) * 10) +#elif defined(__SUNPRO_CC) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC) & 0xf) +#endif + +#if defined(JSON_HEDLEY_SUNPRO_VERSION_CHECK) + #undef JSON_HEDLEY_SUNPRO_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_SUNPRO_VERSION) + #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_SUNPRO_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) + #undef JSON_HEDLEY_EMSCRIPTEN_VERSION +#endif +#if defined(__EMSCRIPTEN__) + #define JSON_HEDLEY_EMSCRIPTEN_VERSION JSON_HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__) +#endif + +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK) + #undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) + #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_EMSCRIPTEN_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_ARM_VERSION) + #undef JSON_HEDLEY_ARM_VERSION +#endif +#if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION) + #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, (__ARMCOMPILER_VERSION % 1000000) / 10000, (__ARMCOMPILER_VERSION % 10000) / 100) +#elif defined(__CC_ARM) && defined(__ARMCC_VERSION) + #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, (__ARMCC_VERSION % 1000000) / 10000, (__ARMCC_VERSION % 10000) / 100) +#endif + +#if defined(JSON_HEDLEY_ARM_VERSION_CHECK) + #undef JSON_HEDLEY_ARM_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_ARM_VERSION) + #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_ARM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_IBM_VERSION) + #undef JSON_HEDLEY_IBM_VERSION +#endif +#if defined(__ibmxl__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, __ibmxl_modification__) +#elif defined(__xlC__) && defined(__xlC_ver__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff) +#elif defined(__xlC__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0) +#endif + +#if defined(JSON_HEDLEY_IBM_VERSION_CHECK) + #undef JSON_HEDLEY_IBM_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_IBM_VERSION) + #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IBM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_VERSION) + #undef JSON_HEDLEY_TI_VERSION +#endif +#if \ + defined(__TI_COMPILER_VERSION__) && \ + ( \ + defined(__TMS470__) || defined(__TI_ARM__) || \ + defined(__MSP430__) || \ + defined(__TMS320C2000__) \ + ) +#if (__TI_COMPILER_VERSION__ >= 16000000) + #define JSON_HEDLEY_TI_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif +#endif + +#if defined(JSON_HEDLEY_TI_VERSION_CHECK) + #undef JSON_HEDLEY_TI_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_VERSION) + #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL2000_VERSION) + #undef JSON_HEDLEY_TI_CL2000_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C2000__) + #define JSON_HEDLEY_TI_CL2000_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL2000_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL2000_VERSION) + #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL2000_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL430_VERSION) + #undef JSON_HEDLEY_TI_CL430_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__MSP430__) + #define JSON_HEDLEY_TI_CL430_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL430_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL430_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL430_VERSION) + #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL430_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) + #undef JSON_HEDLEY_TI_ARMCL_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && (defined(__TMS470__) || defined(__TI_ARM__)) + #define JSON_HEDLEY_TI_ARMCL_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION_CHECK) + #undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) + #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_ARMCL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL6X_VERSION) + #undef JSON_HEDLEY_TI_CL6X_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C6X__) + #define JSON_HEDLEY_TI_CL6X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL6X_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL6X_VERSION) + #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL6X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL7X_VERSION) + #undef JSON_HEDLEY_TI_CL7X_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__C7000__) + #define JSON_HEDLEY_TI_CL7X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL7X_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL7X_VERSION) + #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL7X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) + #undef JSON_HEDLEY_TI_CLPRU_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__PRU__) + #define JSON_HEDLEY_TI_CLPRU_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) + #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CLPRU_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_CRAY_VERSION) + #undef JSON_HEDLEY_CRAY_VERSION +#endif +#if defined(_CRAYC) + #if defined(_RELEASE_PATCHLEVEL) + #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, _RELEASE_PATCHLEVEL) + #else + #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0) + #endif +#endif + +#if defined(JSON_HEDLEY_CRAY_VERSION_CHECK) + #undef JSON_HEDLEY_CRAY_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_CRAY_VERSION) + #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_CRAY_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_IAR_VERSION) + #undef JSON_HEDLEY_IAR_VERSION +#endif +#if defined(__IAR_SYSTEMS_ICC__) + #if __VER__ > 1000 + #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), (__VER__ % 1000)) + #else + #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE(__VER__ / 100, __VER__ % 100, 0) + #endif +#endif + +#if defined(JSON_HEDLEY_IAR_VERSION_CHECK) + #undef JSON_HEDLEY_IAR_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_IAR_VERSION) + #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IAR_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TINYC_VERSION) + #undef JSON_HEDLEY_TINYC_VERSION +#endif +#if defined(__TINYC__) + #define JSON_HEDLEY_TINYC_VERSION JSON_HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100) +#endif + +#if defined(JSON_HEDLEY_TINYC_VERSION_CHECK) + #undef JSON_HEDLEY_TINYC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TINYC_VERSION) + #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TINYC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_DMC_VERSION) + #undef JSON_HEDLEY_DMC_VERSION +#endif +#if defined(__DMC__) + #define JSON_HEDLEY_DMC_VERSION JSON_HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf) +#endif + +#if defined(JSON_HEDLEY_DMC_VERSION_CHECK) + #undef JSON_HEDLEY_DMC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_DMC_VERSION) + #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_DMC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_COMPCERT_VERSION) + #undef JSON_HEDLEY_COMPCERT_VERSION +#endif +#if defined(__COMPCERT_VERSION__) + #define JSON_HEDLEY_COMPCERT_VERSION JSON_HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, (__COMPCERT_VERSION__ / 100) % 100, __COMPCERT_VERSION__ % 100) +#endif + +#if defined(JSON_HEDLEY_COMPCERT_VERSION_CHECK) + #undef JSON_HEDLEY_COMPCERT_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_COMPCERT_VERSION) + #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_COMPCERT_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_PELLES_VERSION) + #undef JSON_HEDLEY_PELLES_VERSION +#endif +#if defined(__POCC__) + #define JSON_HEDLEY_PELLES_VERSION JSON_HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0) +#endif + +#if defined(JSON_HEDLEY_PELLES_VERSION_CHECK) + #undef JSON_HEDLEY_PELLES_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_PELLES_VERSION) + #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PELLES_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_MCST_LCC_VERSION) + #undef JSON_HEDLEY_MCST_LCC_VERSION +#endif +#if defined(__LCC__) && defined(__LCC_MINOR__) + #define JSON_HEDLEY_MCST_LCC_VERSION JSON_HEDLEY_VERSION_ENCODE(__LCC__ / 100, __LCC__ % 100, __LCC_MINOR__) +#endif + +#if defined(JSON_HEDLEY_MCST_LCC_VERSION_CHECK) + #undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_MCST_LCC_VERSION) + #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_MCST_LCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_GCC_VERSION) + #undef JSON_HEDLEY_GCC_VERSION +#endif +#if \ + defined(JSON_HEDLEY_GNUC_VERSION) && \ + !defined(__clang__) && \ + !defined(JSON_HEDLEY_INTEL_VERSION) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_ARM_VERSION) && \ + !defined(JSON_HEDLEY_CRAY_VERSION) && \ + !defined(JSON_HEDLEY_TI_VERSION) && \ + !defined(JSON_HEDLEY_TI_ARMCL_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL430_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL2000_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL6X_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL7X_VERSION) && \ + !defined(JSON_HEDLEY_TI_CLPRU_VERSION) && \ + !defined(__COMPCERT__) && \ + !defined(JSON_HEDLEY_MCST_LCC_VERSION) + #define JSON_HEDLEY_GCC_VERSION JSON_HEDLEY_GNUC_VERSION +#endif + +#if defined(JSON_HEDLEY_GCC_VERSION_CHECK) + #undef JSON_HEDLEY_GCC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_GCC_VERSION) + #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_ATTRIBUTE +#endif +#if \ + defined(__has_attribute) && \ + ( \ + (!defined(JSON_HEDLEY_IAR_VERSION) || JSON_HEDLEY_IAR_VERSION_CHECK(8,5,9)) \ + ) +# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute) +#else +# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) + #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) + #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE +#endif +#if \ + defined(__has_cpp_attribute) && \ + defined(__cplusplus) && \ + (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS) + #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS +#endif +#if !defined(__cplusplus) || !defined(__has_cpp_attribute) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) +#elif \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_IAR_VERSION) && \ + (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) && \ + (!defined(JSON_HEDLEY_MSVC_VERSION) || JSON_HEDLEY_MSVC_VERSION_CHECK(19,20,0)) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(ns::attribute) +#else + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) + #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) + #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_BUILTIN) + #undef JSON_HEDLEY_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin) +#else + #define JSON_HEDLEY_HAS_BUILTIN(builtin) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_BUILTIN) + #undef JSON_HEDLEY_GNUC_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) +#else + #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_BUILTIN) + #undef JSON_HEDLEY_GCC_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) +#else + #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_FEATURE) + #undef JSON_HEDLEY_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_HAS_FEATURE(feature) __has_feature(feature) +#else + #define JSON_HEDLEY_HAS_FEATURE(feature) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_FEATURE) + #undef JSON_HEDLEY_GNUC_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) +#else + #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_FEATURE) + #undef JSON_HEDLEY_GCC_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) +#else + #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_EXTENSION) + #undef JSON_HEDLEY_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_HAS_EXTENSION(extension) __has_extension(extension) +#else + #define JSON_HEDLEY_HAS_EXTENSION(extension) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_EXTENSION) + #undef JSON_HEDLEY_GNUC_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) +#else + #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_EXTENSION) + #undef JSON_HEDLEY_GCC_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) +#else + #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_WARNING) + #undef JSON_HEDLEY_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_HAS_WARNING(warning) __has_warning(warning) +#else + #define JSON_HEDLEY_HAS_WARNING(warning) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_WARNING) + #undef JSON_HEDLEY_GNUC_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) +#else + #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_WARNING) + #undef JSON_HEDLEY_GCC_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) +#else + #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + defined(__clang__) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,17) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(8,0,0) || \ + (JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) && defined(__C99_PRAGMA_OPERATOR)) + #define JSON_HEDLEY_PRAGMA(value) _Pragma(#value) +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_PRAGMA(value) __pragma(value) +#else + #define JSON_HEDLEY_PRAGMA(value) +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_PUSH) + #undef JSON_HEDLEY_DIAGNOSTIC_PUSH +#endif +#if defined(JSON_HEDLEY_DIAGNOSTIC_POP) + #undef JSON_HEDLEY_DIAGNOSTIC_POP +#endif +#if defined(__clang__) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("clang diagnostic pop") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push)) + #define JSON_HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop)) +#elif JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("pop") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,4,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("diag_push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("diag_pop") +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#else + #define JSON_HEDLEY_DIAGNOSTIC_PUSH + #define JSON_HEDLEY_DIAGNOSTIC_POP +#endif + +/* JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ is for + HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ +#endif +#if defined(__cplusplus) +# if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat") +# if JSON_HEDLEY_HAS_WARNING("-Wc++17-extensions") +# if JSON_HEDLEY_HAS_WARNING("-Wc++1z-extensions") +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ + _Pragma("clang diagnostic ignored \"-Wc++1z-extensions\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# endif +# else +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# endif +# endif +#endif +#if !defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(x) x +#endif + +#if defined(JSON_HEDLEY_CONST_CAST) + #undef JSON_HEDLEY_CONST_CAST +#endif +#if defined(__cplusplus) +# define JSON_HEDLEY_CONST_CAST(T, expr) (const_cast(expr)) +#elif \ + JSON_HEDLEY_HAS_WARNING("-Wcast-qual") || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_CONST_CAST(T, expr) (__extension__ ({ \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \ + ((T) (expr)); \ + JSON_HEDLEY_DIAGNOSTIC_POP \ + })) +#else +# define JSON_HEDLEY_CONST_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_REINTERPRET_CAST) + #undef JSON_HEDLEY_REINTERPRET_CAST +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast(expr)) +#else + #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_STATIC_CAST) + #undef JSON_HEDLEY_STATIC_CAST +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_STATIC_CAST(T, expr) (static_cast(expr)) +#else + #define JSON_HEDLEY_STATIC_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_CPP_CAST) + #undef JSON_HEDLEY_CPP_CAST +#endif +#if defined(__cplusplus) +# if JSON_HEDLEY_HAS_WARNING("-Wold-style-cast") +# define JSON_HEDLEY_CPP_CAST(T, expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wold-style-cast\"") \ + ((T) (expr)) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# elif JSON_HEDLEY_IAR_VERSION_CHECK(8,3,0) +# define JSON_HEDLEY_CPP_CAST(T, expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("diag_suppress=Pe137") \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_CPP_CAST(T, expr) ((T) (expr)) +# endif +#else +# define JSON_HEDLEY_CPP_CAST(T, expr) (expr) +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wdeprecated-declarations") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warning(disable:1478 1786)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:1478 1786)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1216,1444,1445") +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:4996)) +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1291,1718") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && !defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,symdeprecated,symdeprecated2)") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress=Pe1444,Pe1215") +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warn(disable:2241)") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("warning(disable:161)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:161)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068)) +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(16,9,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161") +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 161") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-attributes") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("clang diagnostic ignored \"-Wunknown-attributes\"") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("warning(disable:1292)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:1292)) +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:5030)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097,1098") +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("error_messages(off,attrskipunsup)") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1173") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress=Pe1097") +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wcast-qual") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("clang diagnostic ignored \"-Wcast-qual\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("warning(disable:2203 2331)") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunused-function") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("clang diagnostic ignored \"-Wunused-function\"") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("GCC diagnostic ignored \"-Wunused-function\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(1,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION __pragma(warning(disable:4505)) +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("diag_suppress 3142") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#endif + +#if defined(JSON_HEDLEY_DEPRECATED) + #undef JSON_HEDLEY_DEPRECATED +#endif +#if defined(JSON_HEDLEY_DEPRECATED_FOR) + #undef JSON_HEDLEY_DEPRECATED_FOR +#endif +#if \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " # since)) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated("Since " #since "; use " #replacement)) +#elif \ + (JSON_HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__("Since " #since))) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__("Since " #since "; use " #replacement))) +#elif defined(__cplusplus) && (__cplusplus >= 201402L) + #define JSON_HEDLEY_DEPRECATED(since) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since)]]) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since "; use " #replacement)]]) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(deprecated) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__)) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_PELLES_VERSION_CHECK(6,50,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated) +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DEPRECATED(since) _Pragma("deprecated") + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma("deprecated") +#else + #define JSON_HEDLEY_DEPRECATED(since) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) +#endif + +#if defined(JSON_HEDLEY_UNAVAILABLE) + #undef JSON_HEDLEY_UNAVAILABLE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(warning) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_UNAVAILABLE(available_since) __attribute__((__warning__("Not available until " #available_since))) +#else + #define JSON_HEDLEY_UNAVAILABLE(available_since) +#endif + +#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT) + #undef JSON_HEDLEY_WARN_UNUSED_RESULT +#endif +#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT_MSG) + #undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) __attribute__((__warn_unused_result__)) +#elif (JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L) + #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard(msg)]]) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) + #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) +#elif defined(_Check_return_) /* SAL */ + #define JSON_HEDLEY_WARN_UNUSED_RESULT _Check_return_ + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) _Check_return_ +#else + #define JSON_HEDLEY_WARN_UNUSED_RESULT + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) +#endif + +#if defined(JSON_HEDLEY_SENTINEL) + #undef JSON_HEDLEY_SENTINEL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(sentinel) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position))) +#else + #define JSON_HEDLEY_SENTINEL(position) +#endif + +#if defined(JSON_HEDLEY_NO_RETURN) + #undef JSON_HEDLEY_NO_RETURN +#endif +#if JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_NO_RETURN __noreturn +#elif \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L + #define JSON_HEDLEY_NO_RETURN _Noreturn +#elif defined(__cplusplus) && (__cplusplus >= 201103L) + #define JSON_HEDLEY_NO_RETURN JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[noreturn]]) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(noreturn) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,2,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_NO_RETURN _Pragma("does_not_return") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) + #define JSON_HEDLEY_NO_RETURN _Pragma("FUNC_NEVER_RETURNS;") +#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) + #define JSON_HEDLEY_NO_RETURN __attribute((noreturn)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) + #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) +#else + #define JSON_HEDLEY_NO_RETURN +#endif + +#if defined(JSON_HEDLEY_NO_ESCAPE) + #undef JSON_HEDLEY_NO_ESCAPE +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(noescape) + #define JSON_HEDLEY_NO_ESCAPE __attribute__((__noescape__)) +#else + #define JSON_HEDLEY_NO_ESCAPE +#endif + +#if defined(JSON_HEDLEY_UNREACHABLE) + #undef JSON_HEDLEY_UNREACHABLE +#endif +#if defined(JSON_HEDLEY_UNREACHABLE_RETURN) + #undef JSON_HEDLEY_UNREACHABLE_RETURN +#endif +#if defined(JSON_HEDLEY_ASSUME) + #undef JSON_HEDLEY_ASSUME +#endif +#if \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_ASSUME(expr) __assume(expr) +#elif JSON_HEDLEY_HAS_BUILTIN(__builtin_assume) + #define JSON_HEDLEY_ASSUME(expr) __builtin_assume(expr) +#elif \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) + #if defined(__cplusplus) + #define JSON_HEDLEY_ASSUME(expr) std::_nassert(expr) + #else + #define JSON_HEDLEY_ASSUME(expr) _nassert(expr) + #endif +#endif +#if \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_unreachable) && (!defined(JSON_HEDLEY_ARM_VERSION))) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,10,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,5) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(10,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_UNREACHABLE() __builtin_unreachable() +#elif defined(JSON_HEDLEY_ASSUME) + #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) +#endif +#if !defined(JSON_HEDLEY_ASSUME) + #if defined(JSON_HEDLEY_UNREACHABLE) + #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, ((expr) ? 1 : (JSON_HEDLEY_UNREACHABLE(), 1))) + #else + #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, expr) + #endif +#endif +#if defined(JSON_HEDLEY_UNREACHABLE) + #if \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (JSON_HEDLEY_STATIC_CAST(void, JSON_HEDLEY_ASSUME(0)), (value)) + #else + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) JSON_HEDLEY_UNREACHABLE() + #endif +#else + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (value) +#endif +#if !defined(JSON_HEDLEY_UNREACHABLE) + #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) +#endif + +JSON_HEDLEY_DIAGNOSTIC_PUSH +#if JSON_HEDLEY_HAS_WARNING("-Wpedantic") + #pragma clang diagnostic ignored "-Wpedantic" +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat-pedantic") && defined(__cplusplus) + #pragma clang diagnostic ignored "-Wc++98-compat-pedantic" +#endif +#if JSON_HEDLEY_GCC_HAS_WARNING("-Wvariadic-macros",4,0,0) + #if defined(__clang__) + #pragma clang diagnostic ignored "-Wvariadic-macros" + #elif defined(JSON_HEDLEY_GCC_VERSION) + #pragma GCC diagnostic ignored "-Wvariadic-macros" + #endif +#endif +#if defined(JSON_HEDLEY_NON_NULL) + #undef JSON_HEDLEY_NON_NULL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(nonnull) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) + #define JSON_HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__))) +#else + #define JSON_HEDLEY_NON_NULL(...) +#endif +JSON_HEDLEY_DIAGNOSTIC_POP + +#if defined(JSON_HEDLEY_PRINTF_FORMAT) + #undef JSON_HEDLEY_PRINTF_FORMAT +#endif +#if defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && !defined(__USE_MINGW_ANSI_STDIO) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(ms_printf, string_idx, first_to_check))) +#elif defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && defined(__USE_MINGW_ANSI_STDIO) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(gnu_printf, string_idx, first_to_check))) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(format) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(__printf__, string_idx, first_to_check))) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(6,0,0) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __declspec(vaformat(printf,string_idx,first_to_check)) +#else + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) +#endif + +#if defined(JSON_HEDLEY_CONSTEXPR) + #undef JSON_HEDLEY_CONSTEXPR +#endif +#if defined(__cplusplus) + #if __cplusplus >= 201103L + #define JSON_HEDLEY_CONSTEXPR JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(constexpr) + #endif +#endif +#if !defined(JSON_HEDLEY_CONSTEXPR) + #define JSON_HEDLEY_CONSTEXPR +#endif + +#if defined(JSON_HEDLEY_PREDICT) + #undef JSON_HEDLEY_PREDICT +#endif +#if defined(JSON_HEDLEY_LIKELY) + #undef JSON_HEDLEY_LIKELY +#endif +#if defined(JSON_HEDLEY_UNLIKELY) + #undef JSON_HEDLEY_UNLIKELY +#endif +#if defined(JSON_HEDLEY_UNPREDICTABLE) + #undef JSON_HEDLEY_UNPREDICTABLE +#endif +#if JSON_HEDLEY_HAS_BUILTIN(__builtin_unpredictable) + #define JSON_HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable((expr)) +#endif +#if \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) && !defined(JSON_HEDLEY_PGI_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(9,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PREDICT(expr, value, probability) __builtin_expect_with_probability( (expr), (value), (probability)) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) __builtin_expect_with_probability(!!(expr), 1 , (probability)) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) __builtin_expect_with_probability(!!(expr), 0 , (probability)) +# define JSON_HEDLEY_LIKELY(expr) __builtin_expect (!!(expr), 1 ) +# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect (!!(expr), 0 ) +#elif \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,27) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PREDICT(expr, expected, probability) \ + (((probability) >= 0.9) ? __builtin_expect((expr), (expected)) : (JSON_HEDLEY_STATIC_CAST(void, expected), (expr))) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) \ + (__extension__ ({ \ + double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 1) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 0) : !!(expr))); \ + })) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) \ + (__extension__ ({ \ + double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 0) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 1) : !!(expr))); \ + })) +# define JSON_HEDLEY_LIKELY(expr) __builtin_expect(!!(expr), 1) +# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0) +#else +# define JSON_HEDLEY_PREDICT(expr, expected, probability) (JSON_HEDLEY_STATIC_CAST(void, expected), (expr)) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr)) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr)) +# define JSON_HEDLEY_LIKELY(expr) (!!(expr)) +# define JSON_HEDLEY_UNLIKELY(expr) (!!(expr)) +#endif +#if !defined(JSON_HEDLEY_UNPREDICTABLE) + #define JSON_HEDLEY_UNPREDICTABLE(expr) JSON_HEDLEY_PREDICT(expr, 1, 0.5) +#endif + +#if defined(JSON_HEDLEY_MALLOC) + #undef JSON_HEDLEY_MALLOC +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(malloc) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_MALLOC __attribute__((__malloc__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_MALLOC _Pragma("returns_new_memory") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_MALLOC __declspec(restrict) +#else + #define JSON_HEDLEY_MALLOC +#endif + +#if defined(JSON_HEDLEY_PURE) + #undef JSON_HEDLEY_PURE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(pure) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(2,96,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PURE __attribute__((__pure__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) +# define JSON_HEDLEY_PURE _Pragma("does_not_write_global_data") +#elif defined(__cplusplus) && \ + ( \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) \ + ) +# define JSON_HEDLEY_PURE _Pragma("FUNC_IS_PURE;") +#else +# define JSON_HEDLEY_PURE +#endif + +#if defined(JSON_HEDLEY_CONST) + #undef JSON_HEDLEY_CONST +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(const) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(2,5,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_CONST __attribute__((__const__)) +#elif \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_CONST _Pragma("no_side_effect") +#else + #define JSON_HEDLEY_CONST JSON_HEDLEY_PURE +#endif + +#if defined(JSON_HEDLEY_RESTRICT) + #undef JSON_HEDLEY_RESTRICT +#endif +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && !defined(__cplusplus) + #define JSON_HEDLEY_RESTRICT restrict +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,4) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ + defined(__clang__) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_RESTRICT __restrict +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,3,0) && !defined(__cplusplus) + #define JSON_HEDLEY_RESTRICT _Restrict +#else + #define JSON_HEDLEY_RESTRICT +#endif + +#if defined(JSON_HEDLEY_INLINE) + #undef JSON_HEDLEY_INLINE +#endif +#if \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + (defined(__cplusplus) && (__cplusplus >= 199711L)) + #define JSON_HEDLEY_INLINE inline +#elif \ + defined(JSON_HEDLEY_GCC_VERSION) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(6,2,0) + #define JSON_HEDLEY_INLINE __inline__ +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,1,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_INLINE __inline +#else + #define JSON_HEDLEY_INLINE +#endif + +#if defined(JSON_HEDLEY_ALWAYS_INLINE) + #undef JSON_HEDLEY_ALWAYS_INLINE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(always_inline) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) +# define JSON_HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) JSON_HEDLEY_INLINE +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_ALWAYS_INLINE __forceinline +#elif defined(__cplusplus) && \ + ( \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) \ + ) +# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("FUNC_ALWAYS_INLINE;") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) +# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("inline=forced") +#else +# define JSON_HEDLEY_ALWAYS_INLINE JSON_HEDLEY_INLINE +#endif + +#if defined(JSON_HEDLEY_NEVER_INLINE) + #undef JSON_HEDLEY_NEVER_INLINE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(noinline) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_NEVER_INLINE __attribute__((__noinline__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(10,2,0) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("noinline") +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("FUNC_CANNOT_INLINE;") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("inline=never") +#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) + #define JSON_HEDLEY_NEVER_INLINE __attribute((noinline)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) + #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) +#else + #define JSON_HEDLEY_NEVER_INLINE +#endif + +#if defined(JSON_HEDLEY_PRIVATE) + #undef JSON_HEDLEY_PRIVATE +#endif +#if defined(JSON_HEDLEY_PUBLIC) + #undef JSON_HEDLEY_PUBLIC +#endif +#if defined(JSON_HEDLEY_IMPORT) + #undef JSON_HEDLEY_IMPORT +#endif +#if defined(_WIN32) || defined(__CYGWIN__) +# define JSON_HEDLEY_PRIVATE +# define JSON_HEDLEY_PUBLIC __declspec(dllexport) +# define JSON_HEDLEY_IMPORT __declspec(dllimport) +#else +# if \ + JSON_HEDLEY_HAS_ATTRIBUTE(visibility) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + ( \ + defined(__TI_EABI__) && \ + ( \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) \ + ) \ + ) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PRIVATE __attribute__((__visibility__("hidden"))) +# define JSON_HEDLEY_PUBLIC __attribute__((__visibility__("default"))) +# else +# define JSON_HEDLEY_PRIVATE +# define JSON_HEDLEY_PUBLIC +# endif +# define JSON_HEDLEY_IMPORT extern +#endif + +#if defined(JSON_HEDLEY_NO_THROW) + #undef JSON_HEDLEY_NO_THROW +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(nothrow) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_NO_THROW __attribute__((__nothrow__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) + #define JSON_HEDLEY_NO_THROW __declspec(nothrow) +#else + #define JSON_HEDLEY_NO_THROW +#endif + +#if defined(JSON_HEDLEY_FALL_THROUGH) + #undef JSON_HEDLEY_FALL_THROUGH +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(fallthrough) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(7,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_FALL_THROUGH __attribute__((__fallthrough__)) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(clang,fallthrough) + #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[clang::fallthrough]]) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough) + #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[fallthrough]]) +#elif defined(__fallthrough) /* SAL */ + #define JSON_HEDLEY_FALL_THROUGH __fallthrough +#else + #define JSON_HEDLEY_FALL_THROUGH +#endif + +#if defined(JSON_HEDLEY_RETURNS_NON_NULL) + #undef JSON_HEDLEY_RETURNS_NON_NULL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__)) +#elif defined(_Ret_notnull_) /* SAL */ + #define JSON_HEDLEY_RETURNS_NON_NULL _Ret_notnull_ +#else + #define JSON_HEDLEY_RETURNS_NON_NULL +#endif + +#if defined(JSON_HEDLEY_ARRAY_PARAM) + #undef JSON_HEDLEY_ARRAY_PARAM +#endif +#if \ + defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ + !defined(__STDC_NO_VLA__) && \ + !defined(__cplusplus) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_TINYC_VERSION) + #define JSON_HEDLEY_ARRAY_PARAM(name) (name) +#else + #define JSON_HEDLEY_ARRAY_PARAM(name) +#endif + +#if defined(JSON_HEDLEY_IS_CONSTANT) + #undef JSON_HEDLEY_IS_CONSTANT +#endif +#if defined(JSON_HEDLEY_REQUIRE_CONSTEXPR) + #undef JSON_HEDLEY_REQUIRE_CONSTEXPR +#endif +/* JSON_HEDLEY_IS_CONSTEXPR_ is for + HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ +#if defined(JSON_HEDLEY_IS_CONSTEXPR_) + #undef JSON_HEDLEY_IS_CONSTEXPR_ +#endif +#if \ + JSON_HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,19) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) && !defined(__cplusplus)) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr) +#endif +#if !defined(__cplusplus) +# if \ + JSON_HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,24) +#if defined(__INTPTR_TYPE__) + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0)), int*) +#else + #include + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((intptr_t) ((expr) * 0)) : (int*) 0)), int*) +#endif +# elif \ + ( \ + defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \ + !defined(JSON_HEDLEY_SUNPRO_VERSION) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_IAR_VERSION)) || \ + (JSON_HEDLEY_HAS_EXTENSION(c_generic_selections) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,3,0) +#if defined(__INTPTR_TYPE__) + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0), int*: 1, void*: 0) +#else + #include + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((intptr_t) * 0) : (int*) 0), int*: 1, void*: 0) +#endif +# elif \ + defined(JSON_HEDLEY_GCC_VERSION) || \ + defined(JSON_HEDLEY_INTEL_VERSION) || \ + defined(JSON_HEDLEY_TINYC_VERSION) || \ + defined(JSON_HEDLEY_TI_ARMCL_VERSION) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(18,12,0) || \ + defined(JSON_HEDLEY_TI_CL2000_VERSION) || \ + defined(JSON_HEDLEY_TI_CL6X_VERSION) || \ + defined(JSON_HEDLEY_TI_CL7X_VERSION) || \ + defined(JSON_HEDLEY_TI_CLPRU_VERSION) || \ + defined(__clang__) +# define JSON_HEDLEY_IS_CONSTEXPR_(expr) ( \ + sizeof(void) != \ + sizeof(*( \ + 1 ? \ + ((void*) ((expr) * 0L) ) : \ +((struct { char v[sizeof(void) * 2]; } *) 1) \ + ) \ + ) \ + ) +# endif +#endif +#if defined(JSON_HEDLEY_IS_CONSTEXPR_) + #if !defined(JSON_HEDLEY_IS_CONSTANT) + #define JSON_HEDLEY_IS_CONSTANT(expr) JSON_HEDLEY_IS_CONSTEXPR_(expr) + #endif + #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (JSON_HEDLEY_IS_CONSTEXPR_(expr) ? (expr) : (-1)) +#else + #if !defined(JSON_HEDLEY_IS_CONSTANT) + #define JSON_HEDLEY_IS_CONSTANT(expr) (0) + #endif + #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (expr) +#endif + +#if defined(JSON_HEDLEY_BEGIN_C_DECLS) + #undef JSON_HEDLEY_BEGIN_C_DECLS +#endif +#if defined(JSON_HEDLEY_END_C_DECLS) + #undef JSON_HEDLEY_END_C_DECLS +#endif +#if defined(JSON_HEDLEY_C_DECL) + #undef JSON_HEDLEY_C_DECL +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_BEGIN_C_DECLS extern "C" { + #define JSON_HEDLEY_END_C_DECLS } + #define JSON_HEDLEY_C_DECL extern "C" +#else + #define JSON_HEDLEY_BEGIN_C_DECLS + #define JSON_HEDLEY_END_C_DECLS + #define JSON_HEDLEY_C_DECL +#endif + +#if defined(JSON_HEDLEY_STATIC_ASSERT) + #undef JSON_HEDLEY_STATIC_ASSERT +#endif +#if \ + !defined(__cplusplus) && ( \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \ + (JSON_HEDLEY_HAS_FEATURE(c_static_assert) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(6,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + defined(_Static_assert) \ + ) +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message) +#elif \ + (defined(__cplusplus) && (__cplusplus >= 201103L)) || \ + JSON_HEDLEY_MSVC_VERSION_CHECK(16,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(static_assert(expr, message)) +#else +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) +#endif + +#if defined(JSON_HEDLEY_NULL) + #undef JSON_HEDLEY_NULL +#endif +#if defined(__cplusplus) + #if __cplusplus >= 201103L + #define JSON_HEDLEY_NULL JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(nullptr) + #elif defined(NULL) + #define JSON_HEDLEY_NULL NULL + #else + #define JSON_HEDLEY_NULL JSON_HEDLEY_STATIC_CAST(void*, 0) + #endif +#elif defined(NULL) + #define JSON_HEDLEY_NULL NULL +#else + #define JSON_HEDLEY_NULL ((void*) 0) +#endif + +#if defined(JSON_HEDLEY_MESSAGE) + #undef JSON_HEDLEY_MESSAGE +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") +# define JSON_HEDLEY_MESSAGE(msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + JSON_HEDLEY_PRAGMA(message msg) \ + JSON_HEDLEY_DIAGNOSTIC_POP +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message msg) +#elif JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(_CRI message msg) +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#else +# define JSON_HEDLEY_MESSAGE(msg) +#endif + +#if defined(JSON_HEDLEY_WARNING) + #undef JSON_HEDLEY_WARNING +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") +# define JSON_HEDLEY_WARNING(msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + JSON_HEDLEY_PRAGMA(clang warning msg) \ + JSON_HEDLEY_DIAGNOSTIC_POP +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,8,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(GCC warning msg) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#else +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_MESSAGE(msg) +#endif + +#if defined(JSON_HEDLEY_REQUIRE) + #undef JSON_HEDLEY_REQUIRE +#endif +#if defined(JSON_HEDLEY_REQUIRE_MSG) + #undef JSON_HEDLEY_REQUIRE_MSG +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(diagnose_if) +# if JSON_HEDLEY_HAS_WARNING("-Wgcc-compat") +# define JSON_HEDLEY_REQUIRE(expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), #expr, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), msg, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_REQUIRE(expr) __attribute__((diagnose_if(!(expr), #expr, "error"))) +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) __attribute__((diagnose_if(!(expr), msg, "error"))) +# endif +#else +# define JSON_HEDLEY_REQUIRE(expr) +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) +#endif + +#if defined(JSON_HEDLEY_FLAGS) + #undef JSON_HEDLEY_FLAGS +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(flag_enum) && (!defined(__cplusplus) || JSON_HEDLEY_HAS_WARNING("-Wbitfield-enum-conversion")) + #define JSON_HEDLEY_FLAGS __attribute__((__flag_enum__)) +#else + #define JSON_HEDLEY_FLAGS +#endif + +#if defined(JSON_HEDLEY_FLAGS_CAST) + #undef JSON_HEDLEY_FLAGS_CAST +#endif +#if JSON_HEDLEY_INTEL_VERSION_CHECK(19,0,0) +# define JSON_HEDLEY_FLAGS_CAST(T, expr) (__extension__ ({ \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("warning(disable:188)") \ + ((T) (expr)); \ + JSON_HEDLEY_DIAGNOSTIC_POP \ + })) +#else +# define JSON_HEDLEY_FLAGS_CAST(T, expr) JSON_HEDLEY_STATIC_CAST(T, expr) +#endif + +#if defined(JSON_HEDLEY_EMPTY_BASES) + #undef JSON_HEDLEY_EMPTY_BASES +#endif +#if \ + (JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,23918) && !JSON_HEDLEY_MSVC_VERSION_CHECK(20,0,0)) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_EMPTY_BASES __declspec(empty_bases) +#else + #define JSON_HEDLEY_EMPTY_BASES +#endif + +/* Remaining macros are deprecated. */ + +#if defined(JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK) + #undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK +#endif +#if defined(__clang__) + #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) (0) +#else + #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_CLANG_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_BUILTIN) + #undef JSON_HEDLEY_CLANG_HAS_BUILTIN +#endif +#define JSON_HEDLEY_CLANG_HAS_BUILTIN(builtin) JSON_HEDLEY_HAS_BUILTIN(builtin) + +#if defined(JSON_HEDLEY_CLANG_HAS_FEATURE) + #undef JSON_HEDLEY_CLANG_HAS_FEATURE +#endif +#define JSON_HEDLEY_CLANG_HAS_FEATURE(feature) JSON_HEDLEY_HAS_FEATURE(feature) + +#if defined(JSON_HEDLEY_CLANG_HAS_EXTENSION) + #undef JSON_HEDLEY_CLANG_HAS_EXTENSION +#endif +#define JSON_HEDLEY_CLANG_HAS_EXTENSION(extension) JSON_HEDLEY_HAS_EXTENSION(extension) + +#if defined(JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_WARNING) + #undef JSON_HEDLEY_CLANG_HAS_WARNING +#endif +#define JSON_HEDLEY_CLANG_HAS_WARNING(warning) JSON_HEDLEY_HAS_WARNING(warning) + +#endif /* !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < X) */ + +// #include + + +#include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +template struct make_void +{ + using type = void; +}; +template using void_t = typename make_void::type; +} // namespace detail +} // namespace nlohmann + + +// https://en.cppreference.com/w/cpp/experimental/is_detected +namespace nlohmann +{ +namespace detail +{ +struct nonesuch +{ + nonesuch() = delete; + ~nonesuch() = delete; + nonesuch(nonesuch const&) = delete; + nonesuch(nonesuch const&&) = delete; + void operator=(nonesuch const&) = delete; + void operator=(nonesuch&&) = delete; +}; + +template class Op, + class... Args> +struct detector +{ + using value_t = std::false_type; + using type = Default; +}; + +template class Op, class... Args> +struct detector>, Op, Args...> +{ + using value_t = std::true_type; + using type = Op; +}; + +template class Op, class... Args> +using is_detected = typename detector::value_t; + +template class Op, class... Args> +struct is_detected_lazy : is_detected { }; + +template class Op, class... Args> +using detected_t = typename detector::type; + +template class Op, class... Args> +using detected_or = detector; + +template class Op, class... Args> +using detected_or_t = typename detected_or::type; + +template class Op, class... Args> +using is_detected_exact = std::is_same>; + +template class Op, class... Args> +using is_detected_convertible = + std::is_convertible, To>; +} // namespace detail +} // namespace nlohmann + + +// This file contains all internal macro definitions +// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them + +// exclude unsupported compilers +#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK) + #if defined(__clang__) + #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 + #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER)) + #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800 + #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #endif +#endif + +// C++ language standard detection +// if the user manually specified the used c++ version this is skipped +#if !defined(JSON_HAS_CPP_20) && !defined(JSON_HAS_CPP_17) && !defined(JSON_HAS_CPP_14) && !defined(JSON_HAS_CPP_11) + #if (defined(__cplusplus) && __cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L) + #define JSON_HAS_CPP_20 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1) + #define JSON_HAS_CPP_14 + #endif + // the cpp 11 flag is always specified because it is the minimal required version + #define JSON_HAS_CPP_11 +#endif + +#if !defined(JSON_HAS_FILESYSTEM) && !defined(JSON_HAS_EXPERIMENTAL_FILESYSTEM) + #ifdef JSON_HAS_CPP_17 + #if defined(__cpp_lib_filesystem) + #define JSON_HAS_FILESYSTEM 1 + #elif defined(__cpp_lib_experimental_filesystem) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif !defined(__has_include) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif __has_include() + #define JSON_HAS_FILESYSTEM 1 + #elif __has_include() + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #endif + + // std::filesystem does not work on MinGW GCC 8: https://sourceforge.net/p/mingw-w64/bugs/737/ + #if defined(__MINGW32__) && defined(__GNUC__) && __GNUC__ == 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before GCC 8: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before Clang 7: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__clang_major__) && __clang_major__ < 7 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before MSVC 19.14: https://en.cppreference.com/w/cpp/compiler_support + #if defined(_MSC_VER) && _MSC_VER < 1940 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before iOS 13 + #if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 130000 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before macOS Catalina + #if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + #endif +#endif + +#ifndef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 0 +#endif + +#ifndef JSON_HAS_FILESYSTEM + #define JSON_HAS_FILESYSTEM 0 +#endif + +// disable documentation warnings on clang +#if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdocumentation" + #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" +#endif + +// allow disabling exceptions +#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION) + #define JSON_THROW(exception) throw exception + #define JSON_TRY try + #define JSON_CATCH(exception) catch(exception) + #define JSON_INTERNAL_CATCH(exception) catch(exception) +#else + #include + #define JSON_THROW(exception) std::abort() + #define JSON_TRY if(true) + #define JSON_CATCH(exception) if(false) + #define JSON_INTERNAL_CATCH(exception) if(false) +#endif + +// override exception macros +#if defined(JSON_THROW_USER) + #undef JSON_THROW + #define JSON_THROW JSON_THROW_USER +#endif +#if defined(JSON_TRY_USER) + #undef JSON_TRY + #define JSON_TRY JSON_TRY_USER +#endif +#if defined(JSON_CATCH_USER) + #undef JSON_CATCH + #define JSON_CATCH JSON_CATCH_USER + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_CATCH_USER +#endif +#if defined(JSON_INTERNAL_CATCH_USER) + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER +#endif + +// allow overriding assert +#if !defined(JSON_ASSERT) + #include // assert + #define JSON_ASSERT(x) assert(x) +#endif + +// allow to access some private functions (needed by the test suite) +#if defined(JSON_TESTS_PRIVATE) + #define JSON_PRIVATE_UNLESS_TESTED public +#else + #define JSON_PRIVATE_UNLESS_TESTED private +#endif + +/*! +@brief macro to briefly define a mapping between an enum and JSON +@def NLOHMANN_JSON_SERIALIZE_ENUM +@since version 3.4.0 +*/ +#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \ + template \ + inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \ + { \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [e](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.first == e; \ + }); \ + j = ((it != std::end(m)) ? it : std::begin(m))->second; \ + } \ + template \ + inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \ + { \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [&j](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.second == j; \ + }); \ + e = ((it != std::end(m)) ? it : std::begin(m))->first; \ + } + +// Ugly macros to avoid uglier copy-paste when specializing basic_json. They +// may be removed in the future once the class is split. + +#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \ + template class ObjectType, \ + template class ArrayType, \ + class StringType, class BooleanType, class NumberIntegerType, \ + class NumberUnsignedType, class NumberFloatType, \ + template class AllocatorType, \ + template class JSONSerializer, \ + class BinaryType> + +#define NLOHMANN_BASIC_JSON_TPL \ + basic_json + +// Macros to simplify conversion from/to types + +#define NLOHMANN_JSON_EXPAND( x ) x +#define NLOHMANN_JSON_GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME,...) NAME +#define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \ + NLOHMANN_JSON_PASTE64, \ + NLOHMANN_JSON_PASTE63, \ + NLOHMANN_JSON_PASTE62, \ + NLOHMANN_JSON_PASTE61, \ + NLOHMANN_JSON_PASTE60, \ + NLOHMANN_JSON_PASTE59, \ + NLOHMANN_JSON_PASTE58, \ + NLOHMANN_JSON_PASTE57, \ + NLOHMANN_JSON_PASTE56, \ + NLOHMANN_JSON_PASTE55, \ + NLOHMANN_JSON_PASTE54, \ + NLOHMANN_JSON_PASTE53, \ + NLOHMANN_JSON_PASTE52, \ + NLOHMANN_JSON_PASTE51, \ + NLOHMANN_JSON_PASTE50, \ + NLOHMANN_JSON_PASTE49, \ + NLOHMANN_JSON_PASTE48, \ + NLOHMANN_JSON_PASTE47, \ + NLOHMANN_JSON_PASTE46, \ + NLOHMANN_JSON_PASTE45, \ + NLOHMANN_JSON_PASTE44, \ + NLOHMANN_JSON_PASTE43, \ + NLOHMANN_JSON_PASTE42, \ + NLOHMANN_JSON_PASTE41, \ + NLOHMANN_JSON_PASTE40, \ + NLOHMANN_JSON_PASTE39, \ + NLOHMANN_JSON_PASTE38, \ + NLOHMANN_JSON_PASTE37, \ + NLOHMANN_JSON_PASTE36, \ + NLOHMANN_JSON_PASTE35, \ + NLOHMANN_JSON_PASTE34, \ + NLOHMANN_JSON_PASTE33, \ + NLOHMANN_JSON_PASTE32, \ + NLOHMANN_JSON_PASTE31, \ + NLOHMANN_JSON_PASTE30, \ + NLOHMANN_JSON_PASTE29, \ + NLOHMANN_JSON_PASTE28, \ + NLOHMANN_JSON_PASTE27, \ + NLOHMANN_JSON_PASTE26, \ + NLOHMANN_JSON_PASTE25, \ + NLOHMANN_JSON_PASTE24, \ + NLOHMANN_JSON_PASTE23, \ + NLOHMANN_JSON_PASTE22, \ + NLOHMANN_JSON_PASTE21, \ + NLOHMANN_JSON_PASTE20, \ + NLOHMANN_JSON_PASTE19, \ + NLOHMANN_JSON_PASTE18, \ + NLOHMANN_JSON_PASTE17, \ + NLOHMANN_JSON_PASTE16, \ + NLOHMANN_JSON_PASTE15, \ + NLOHMANN_JSON_PASTE14, \ + NLOHMANN_JSON_PASTE13, \ + NLOHMANN_JSON_PASTE12, \ + NLOHMANN_JSON_PASTE11, \ + NLOHMANN_JSON_PASTE10, \ + NLOHMANN_JSON_PASTE9, \ + NLOHMANN_JSON_PASTE8, \ + NLOHMANN_JSON_PASTE7, \ + NLOHMANN_JSON_PASTE6, \ + NLOHMANN_JSON_PASTE5, \ + NLOHMANN_JSON_PASTE4, \ + NLOHMANN_JSON_PASTE3, \ + NLOHMANN_JSON_PASTE2, \ + NLOHMANN_JSON_PASTE1)(__VA_ARGS__)) +#define NLOHMANN_JSON_PASTE2(func, v1) func(v1) +#define NLOHMANN_JSON_PASTE3(func, v1, v2) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2) +#define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3) +#define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4) +#define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5) +#define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6) +#define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7) +#define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8) +#define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9) +#define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10) +#define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) +#define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) +#define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) +#define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) +#define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) +#define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) +#define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) +#define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) +#define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) +#define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) +#define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) +#define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) +#define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) +#define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) +#define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) +#define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) +#define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) +#define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) +#define NLOHMANN_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) +#define NLOHMANN_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) +#define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) +#define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) +#define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) +#define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) +#define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) +#define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) +#define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) +#define NLOHMANN_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) +#define NLOHMANN_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) +#define NLOHMANN_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) +#define NLOHMANN_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) +#define NLOHMANN_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) +#define NLOHMANN_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) +#define NLOHMANN_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) +#define NLOHMANN_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) +#define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) +#define NLOHMANN_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) +#define NLOHMANN_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) +#define NLOHMANN_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) +#define NLOHMANN_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) +#define NLOHMANN_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) +#define NLOHMANN_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) +#define NLOHMANN_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) +#define NLOHMANN_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) +#define NLOHMANN_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) +#define NLOHMANN_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) +#define NLOHMANN_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) +#define NLOHMANN_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) +#define NLOHMANN_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) +#define NLOHMANN_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) +#define NLOHMANN_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) +#define NLOHMANN_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) +#define NLOHMANN_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) + +#define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1; +#define NLOHMANN_JSON_FROM(v1) nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1); + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_INTRUSIVE +@since version 3.9.0 +*/ +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...) \ + friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE +@since version 3.9.0 +*/ +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...) \ + inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + + +// inspired from https://stackoverflow.com/a/26745591 +// allows to call any std function as if (e.g. with begin): +// using std::begin; begin(x); +// +// it allows using the detected idiom to retrieve the return type +// of such an expression +#define NLOHMANN_CAN_CALL_STD_FUNC_IMPL(std_name) \ + namespace detail { \ + using std::std_name; \ + \ + template \ + using result_of_##std_name = decltype(std_name(std::declval()...)); \ + } \ + \ + namespace detail2 { \ + struct std_name##_tag \ + { \ + }; \ + \ + template \ + std_name##_tag std_name(T&&...); \ + \ + template \ + using result_of_##std_name = decltype(std_name(std::declval()...)); \ + \ + template \ + struct would_call_std_##std_name \ + { \ + static constexpr auto const value = ::nlohmann::detail:: \ + is_detected_exact::value; \ + }; \ + } /* namespace detail2 */ \ + \ + template \ + struct would_call_std_##std_name : detail2::would_call_std_##std_name \ + { \ + } + +#ifndef JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_USE_IMPLICIT_CONVERSIONS 1 +#endif + +#if JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_EXPLICIT +#else + #define JSON_EXPLICIT explicit +#endif + +#ifndef JSON_DIAGNOSTICS + #define JSON_DIAGNOSTICS 0 +#endif + + +namespace nlohmann +{ +namespace detail +{ + +/*! +@brief replace all occurrences of a substring by another string + +@param[in,out] s the string to manipulate; changed so that all + occurrences of @a f are replaced with @a t +@param[in] f the substring to replace with @a t +@param[in] t the string to replace @a f + +@pre The search string @a f must not be empty. **This precondition is +enforced with an assertion.** + +@since version 2.0.0 +*/ +inline void replace_substring(std::string& s, const std::string& f, + const std::string& t) +{ + JSON_ASSERT(!f.empty()); + for (auto pos = s.find(f); // find first occurrence of f + pos != std::string::npos; // make sure f was found + s.replace(pos, f.size(), t), // replace with t, and + pos = s.find(f, pos + t.size())) // find next occurrence of f + {} +} + +/*! + * @brief string escaping as described in RFC 6901 (Sect. 4) + * @param[in] s string to escape + * @return escaped string + * + * Note the order of escaping "~" to "~0" and "/" to "~1" is important. + */ +inline std::string escape(std::string s) +{ + replace_substring(s, "~", "~0"); + replace_substring(s, "/", "~1"); + return s; +} + +/*! + * @brief string unescaping as described in RFC 6901 (Sect. 4) + * @param[in] s string to unescape + * @return unescaped string + * + * Note the order of escaping "~1" to "/" and "~0" to "~" is important. + */ +static void unescape(std::string& s) +{ + replace_substring(s, "~1", "/"); + replace_substring(s, "~0", "~"); +} + +} // namespace detail +} // namespace nlohmann + +// #include + + +#include // size_t + +namespace nlohmann +{ +namespace detail +{ +/// struct to capture the start position of the current token +struct position_t +{ + /// the total number of characters read + std::size_t chars_read_total = 0; + /// the number of characters read in the current line + std::size_t chars_read_current_line = 0; + /// the number of lines read + std::size_t lines_read = 0; + + /// conversion to size_t to preserve SAX interface + constexpr operator size_t() const + { + return chars_read_total; + } +}; + +} // namespace detail +} // namespace nlohmann + +// #include + + +namespace nlohmann +{ +namespace detail +{ +//////////////// +// exceptions // +//////////////// + +/// @brief general exception of the @ref basic_json class +/// @sa https://json.nlohmann.me/api/basic_json/exception/ +class exception : public std::exception +{ + public: + /// returns the explanatory string + const char* what() const noexcept override + { + return m.what(); + } + + /// the id of the exception + const int id; // NOLINT(cppcoreguidelines-non-private-member-variables-in-classes) + + protected: + JSON_HEDLEY_NON_NULL(3) + exception(int id_, const char* what_arg) : id(id_), m(what_arg) {} // NOLINT(bugprone-throw-keyword-missing) + + static std::string name(const std::string& ename, int id_) + { + return "[json.exception." + ename + "." + std::to_string(id_) + "] "; + } + + template + static std::string diagnostics(const BasicJsonType& leaf_element) + { +#if JSON_DIAGNOSTICS + std::vector tokens; + for (const auto* current = &leaf_element; current->m_parent != nullptr; current = current->m_parent) + { + switch (current->m_parent->type()) + { + case value_t::array: + { + for (std::size_t i = 0; i < current->m_parent->m_value.array->size(); ++i) + { + if (¤t->m_parent->m_value.array->operator[](i) == current) + { + tokens.emplace_back(std::to_string(i)); + break; + } + } + break; + } + + case value_t::object: + { + for (const auto& element : *current->m_parent->m_value.object) + { + if (&element.second == current) + { + tokens.emplace_back(element.first.c_str()); + break; + } + } + break; + } + + case value_t::null: // LCOV_EXCL_LINE + case value_t::string: // LCOV_EXCL_LINE + case value_t::boolean: // LCOV_EXCL_LINE + case value_t::number_integer: // LCOV_EXCL_LINE + case value_t::number_unsigned: // LCOV_EXCL_LINE + case value_t::number_float: // LCOV_EXCL_LINE + case value_t::binary: // LCOV_EXCL_LINE + case value_t::discarded: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + break; // LCOV_EXCL_LINE + } + } + + if (tokens.empty()) + { + return ""; + } + + return "(" + std::accumulate(tokens.rbegin(), tokens.rend(), std::string{}, + [](const std::string & a, const std::string & b) + { + return a + "/" + detail::escape(b); + }) + ") "; +#else + static_cast(leaf_element); + return ""; +#endif + } + + private: + /// an exception object as storage for error messages + std::runtime_error m; +}; + +/// @brief exception indicating a parse error +/// @sa https://json.nlohmann.me/api/basic_json/parse_error/ +class parse_error : public exception +{ + public: + /*! + @brief create a parse error exception + @param[in] id_ the id of the exception + @param[in] pos the position where the error occurred (or with + chars_read_total=0 if the position cannot be + determined) + @param[in] what_arg the explanatory string + @return parse_error object + */ + template + static parse_error create(int id_, const position_t& pos, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("parse_error", id_) + "parse error" + + position_string(pos) + ": " + exception::diagnostics(context) + what_arg; + return {id_, pos.chars_read_total, w.c_str()}; + } + + template + static parse_error create(int id_, std::size_t byte_, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("parse_error", id_) + "parse error" + + (byte_ != 0 ? (" at byte " + std::to_string(byte_)) : "") + + ": " + exception::diagnostics(context) + what_arg; + return {id_, byte_, w.c_str()}; + } + + /*! + @brief byte index of the parse error + + The byte index of the last read character in the input file. + + @note For an input with n bytes, 1 is the index of the first character and + n+1 is the index of the terminating null byte or the end of file. + This also holds true when reading a byte vector (CBOR or MessagePack). + */ + const std::size_t byte; + + private: + parse_error(int id_, std::size_t byte_, const char* what_arg) + : exception(id_, what_arg), byte(byte_) {} + + static std::string position_string(const position_t& pos) + { + return " at line " + std::to_string(pos.lines_read + 1) + + ", column " + std::to_string(pos.chars_read_current_line); + } +}; + +/// @brief exception indicating errors with iterators +/// @sa https://json.nlohmann.me/api/basic_json/invalid_iterator/ +class invalid_iterator : public exception +{ + public: + template + static invalid_iterator create(int id_, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("invalid_iterator", id_) + exception::diagnostics(context) + what_arg; + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + invalid_iterator(int id_, const char* what_arg) + : exception(id_, what_arg) {} +}; + +/// @brief exception indicating executing a member function with a wrong type +/// @sa https://json.nlohmann.me/api/basic_json/type_error/ +class type_error : public exception +{ + public: + template + static type_error create(int id_, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("type_error", id_) + exception::diagnostics(context) + what_arg; + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + type_error(int id_, const char* what_arg) : exception(id_, what_arg) {} +}; + +/// @brief exception indicating access out of the defined range +/// @sa https://json.nlohmann.me/api/basic_json/out_of_range/ +class out_of_range : public exception +{ + public: + template + static out_of_range create(int id_, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("out_of_range", id_) + exception::diagnostics(context) + what_arg; + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + out_of_range(int id_, const char* what_arg) : exception(id_, what_arg) {} +}; + +/// @brief exception indicating other library errors +/// @sa https://json.nlohmann.me/api/basic_json/other_error/ +class other_error : public exception +{ + public: + template + static other_error create(int id_, const std::string& what_arg, const BasicJsonType& context) + { + std::string w = exception::name("other_error", id_) + exception::diagnostics(context) + what_arg; + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + other_error(int id_, const char* what_arg) : exception(id_, what_arg) {} +}; + +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +#include // size_t +#include // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type +#include // index_sequence, make_index_sequence, index_sequence_for + +// #include + + +namespace nlohmann +{ +namespace detail +{ + +template +using uncvref_t = typename std::remove_cv::type>::type; + +#ifdef JSON_HAS_CPP_14 + +// the following utilities are natively available in C++14 +using std::enable_if_t; +using std::index_sequence; +using std::make_index_sequence; +using std::index_sequence_for; + +#else + +// alias templates to reduce boilerplate +template +using enable_if_t = typename std::enable_if::type; + +// The following code is taken from https://github.com/abseil/abseil-cpp/blob/10cb35e459f5ecca5b2ff107635da0bfa41011b4/absl/utility/utility.h +// which is part of Google Abseil (https://github.com/abseil/abseil-cpp), licensed under the Apache License 2.0. + +//// START OF CODE FROM GOOGLE ABSEIL + +// integer_sequence +// +// Class template representing a compile-time integer sequence. An instantiation +// of `integer_sequence` has a sequence of integers encoded in its +// type through its template arguments (which is a common need when +// working with C++11 variadic templates). `absl::integer_sequence` is designed +// to be a drop-in replacement for C++14's `std::integer_sequence`. +// +// Example: +// +// template< class T, T... Ints > +// void user_function(integer_sequence); +// +// int main() +// { +// // user_function's `T` will be deduced to `int` and `Ints...` +// // will be deduced to `0, 1, 2, 3, 4`. +// user_function(make_integer_sequence()); +// } +template +struct integer_sequence +{ + using value_type = T; + static constexpr std::size_t size() noexcept + { + return sizeof...(Ints); + } +}; + +// index_sequence +// +// A helper template for an `integer_sequence` of `size_t`, +// `absl::index_sequence` is designed to be a drop-in replacement for C++14's +// `std::index_sequence`. +template +using index_sequence = integer_sequence; + +namespace utility_internal +{ + +template +struct Extend; + +// Note that SeqSize == sizeof...(Ints). It's passed explicitly for efficiency. +template +struct Extend, SeqSize, 0> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)... >; +}; + +template +struct Extend, SeqSize, 1> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)..., 2 * SeqSize >; +}; + +// Recursion helper for 'make_integer_sequence'. +// 'Gen::type' is an alias for 'integer_sequence'. +template +struct Gen +{ + using type = + typename Extend < typename Gen < T, N / 2 >::type, N / 2, N % 2 >::type; +}; + +template +struct Gen +{ + using type = integer_sequence; +}; + +} // namespace utility_internal + +// Compile-time sequences of integers + +// make_integer_sequence +// +// This template alias is equivalent to +// `integer_sequence`, and is designed to be a drop-in +// replacement for C++14's `std::make_integer_sequence`. +template +using make_integer_sequence = typename utility_internal::Gen::type; + +// make_index_sequence +// +// This template alias is equivalent to `index_sequence<0, 1, ..., N-1>`, +// and is designed to be a drop-in replacement for C++14's +// `std::make_index_sequence`. +template +using make_index_sequence = make_integer_sequence; + +// index_sequence_for +// +// Converts a typename pack into an index sequence of the same length, and +// is designed to be a drop-in replacement for C++14's +// `std::index_sequence_for()` +template +using index_sequence_for = make_index_sequence; + +//// END OF CODE FROM GOOGLE ABSEIL + +#endif + +// dispatch utility (taken from ranges-v3) +template struct priority_tag : priority_tag < N - 1 > {}; +template<> struct priority_tag<0> {}; + +// taken from ranges-v3 +template +struct static_const +{ + static constexpr T value{}; +}; + +template +constexpr T static_const::value; // NOLINT(readability-redundant-declaration) + +} // namespace detail +} // namespace nlohmann + +// #include + + +namespace nlohmann +{ +namespace detail +{ +// dispatching helper struct +template struct identity_tag {}; +} // namespace detail +} // namespace nlohmann + +// #include + + +#include // numeric_limits +#include // false_type, is_constructible, is_integral, is_same, true_type +#include // declval +#include // tuple + +// #include + + +// #include + + +#include // random_access_iterator_tag + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +template +struct iterator_types {}; + +template +struct iterator_types < + It, + void_t> +{ + using difference_type = typename It::difference_type; + using value_type = typename It::value_type; + using pointer = typename It::pointer; + using reference = typename It::reference; + using iterator_category = typename It::iterator_category; +}; + +// This is required as some compilers implement std::iterator_traits in a way that +// doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341. +template +struct iterator_traits +{ +}; + +template +struct iterator_traits < T, enable_if_t < !std::is_pointer::value >> + : iterator_types +{ +}; + +template +struct iterator_traits::value>> +{ + using iterator_category = std::random_access_iterator_tag; + using value_type = T; + using difference_type = ptrdiff_t; + using pointer = T*; + using reference = T&; +}; +} // namespace detail +} // namespace nlohmann + +// #include + + +// #include + + +namespace nlohmann +{ +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(begin); +} // namespace nlohmann + +// #include + + +// #include + + +namespace nlohmann +{ +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(end); +} // namespace nlohmann + +// #include + +// #include + +// #include +#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_ +#define INCLUDE_NLOHMANN_JSON_FWD_HPP_ + +#include // int64_t, uint64_t +#include // map +#include // allocator +#include // string +#include // vector + +/*! +@brief namespace for Niels Lohmann +@see https://github.com/nlohmann +@since version 1.0.0 +*/ +namespace nlohmann +{ +/*! +@brief default JSONSerializer template argument + +This serializer ignores the template arguments and uses ADL +([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl)) +for serialization. +*/ +template +struct adl_serializer; + +/// a class to store JSON values +/// @sa https://json.nlohmann.me/api/basic_json/ +template class ObjectType = + std::map, + template class ArrayType = std::vector, + class StringType = std::string, class BooleanType = bool, + class NumberIntegerType = std::int64_t, + class NumberUnsignedType = std::uint64_t, + class NumberFloatType = double, + template class AllocatorType = std::allocator, + template class JSONSerializer = + adl_serializer, + class BinaryType = std::vector> +class basic_json; + +/// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document +/// @sa https://json.nlohmann.me/api/json_pointer/ +template +class json_pointer; + +/*! +@brief default specialization +@sa https://json.nlohmann.me/api/json/ +*/ +using json = basic_json<>; + +/// @brief a minimal map-like container that preserves insertion order +/// @sa https://json.nlohmann.me/api/ordered_map/ +template +struct ordered_map; + +/// @brief specialization that maintains the insertion order of object keys +/// @sa https://json.nlohmann.me/api/ordered_json/ +using ordered_json = basic_json; + +} // namespace nlohmann + +#endif // INCLUDE_NLOHMANN_JSON_FWD_HPP_ + + +namespace nlohmann +{ +/*! +@brief detail namespace with internal helper functions + +This namespace collects functions that should not be exposed, +implementations of some @ref basic_json methods, and meta-programming helpers. + +@since version 2.1.0 +*/ +namespace detail +{ +///////////// +// helpers // +///////////// + +// Note to maintainers: +// +// Every trait in this file expects a non CV-qualified type. +// The only exceptions are in the 'aliases for detected' section +// (i.e. those of the form: decltype(T::member_function(std::declval()))) +// +// In this case, T has to be properly CV-qualified to constraint the function arguments +// (e.g. to_json(BasicJsonType&, const T&)) + +template struct is_basic_json : std::false_type {}; + +NLOHMANN_BASIC_JSON_TPL_DECLARATION +struct is_basic_json : std::true_type {}; + +////////////////////// +// json_ref helpers // +////////////////////// + +template +class json_ref; + +template +struct is_json_ref : std::false_type {}; + +template +struct is_json_ref> : std::true_type {}; + +////////////////////////// +// aliases for detected // +////////////////////////// + +template +using mapped_type_t = typename T::mapped_type; + +template +using key_type_t = typename T::key_type; + +template +using value_type_t = typename T::value_type; + +template +using difference_type_t = typename T::difference_type; + +template +using pointer_t = typename T::pointer; + +template +using reference_t = typename T::reference; + +template +using iterator_category_t = typename T::iterator_category; + +template +using to_json_function = decltype(T::to_json(std::declval()...)); + +template +using from_json_function = decltype(T::from_json(std::declval()...)); + +template +using get_template_function = decltype(std::declval().template get()); + +// trait checking if JSONSerializer::from_json(json const&, udt&) exists +template +struct has_from_json : std::false_type {}; + +// trait checking if j.get is valid +// use this trait instead of std::is_constructible or std::is_convertible, +// both rely on, or make use of implicit conversions, and thus fail when T +// has several constructors/operator= (see https://github.com/nlohmann/json/issues/958) +template +struct is_getable +{ + static constexpr bool value = is_detected::value; +}; + +template +struct has_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +// This trait checks if JSONSerializer::from_json(json const&) exists +// this overload is used for non-default-constructible user-defined-types +template +struct has_non_default_from_json : std::false_type {}; + +template +struct has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +// This trait checks if BasicJsonType::json_serializer::to_json exists +// Do not evaluate the trait when T is a basic_json type, to avoid template instantiation infinite recursion. +template +struct has_to_json : std::false_type {}; + +template +struct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + + +/////////////////// +// is_ functions // +/////////////////// + +// https://en.cppreference.com/w/cpp/types/conjunction +template struct conjunction : std::true_type { }; +template struct conjunction : B1 { }; +template +struct conjunction +: std::conditional, B1>::type {}; + +// https://en.cppreference.com/w/cpp/types/negation +template struct negation : std::integral_constant < bool, !B::value > { }; + +// Reimplementation of is_constructible and is_default_constructible, due to them being broken for +// std::pair and std::tuple until LWG 2367 fix (see https://cplusplus.github.io/LWG/lwg-defects.html#2367). +// This causes compile errors in e.g. clang 3.5 or gcc 4.9. +template +struct is_default_constructible : std::is_default_constructible {}; + +template +struct is_default_constructible> + : conjunction, is_default_constructible> {}; + +template +struct is_default_constructible> + : conjunction, is_default_constructible> {}; + +template +struct is_default_constructible> + : conjunction...> {}; + +template +struct is_default_constructible> + : conjunction...> {}; + + +template +struct is_constructible : std::is_constructible {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + + +template +struct is_iterator_traits : std::false_type {}; + +template +struct is_iterator_traits> +{ + private: + using traits = iterator_traits; + + public: + static constexpr auto value = + is_detected::value && + is_detected::value && + is_detected::value && + is_detected::value && + is_detected::value; +}; + +template +struct is_range +{ + private: + using t_ref = typename std::add_lvalue_reference::type; + + using iterator = detected_t; + using sentinel = detected_t; + + // to be 100% correct, it should use https://en.cppreference.com/w/cpp/iterator/input_or_output_iterator + // and https://en.cppreference.com/w/cpp/iterator/sentinel_for + // but reimplementing these would be too much work, as a lot of other concepts are used underneath + static constexpr auto is_iterator_begin = + is_iterator_traits>::value; + + public: + static constexpr bool value = !std::is_same::value && !std::is_same::value && is_iterator_begin; +}; + +template +using iterator_t = enable_if_t::value, result_of_begin())>>; + +template +using range_value_t = value_type_t>>; + +// The following implementation of is_complete_type is taken from +// https://blogs.msdn.microsoft.com/vcblog/2015/12/02/partial-support-for-expression-sfinae-in-vs-2015-update-1/ +// and is written by Xiang Fan who agreed to using it in this library. + +template +struct is_complete_type : std::false_type {}; + +template +struct is_complete_type : std::true_type {}; + +template +struct is_compatible_object_type_impl : std::false_type {}; + +template +struct is_compatible_object_type_impl < + BasicJsonType, CompatibleObjectType, + enable_if_t < is_detected::value&& + is_detected::value >> +{ + using object_t = typename BasicJsonType::object_t; + + // macOS's is_constructible does not play well with nonesuch... + static constexpr bool value = + is_constructible::value && + is_constructible::value; +}; + +template +struct is_compatible_object_type + : is_compatible_object_type_impl {}; + +template +struct is_constructible_object_type_impl : std::false_type {}; + +template +struct is_constructible_object_type_impl < + BasicJsonType, ConstructibleObjectType, + enable_if_t < is_detected::value&& + is_detected::value >> +{ + using object_t = typename BasicJsonType::object_t; + + static constexpr bool value = + (is_default_constructible::value && + (std::is_move_assignable::value || + std::is_copy_assignable::value) && + (is_constructible::value && + std::is_same < + typename object_t::mapped_type, + typename ConstructibleObjectType::mapped_type >::value)) || + (has_from_json::value || + has_non_default_from_json < + BasicJsonType, + typename ConstructibleObjectType::mapped_type >::value); +}; + +template +struct is_constructible_object_type + : is_constructible_object_type_impl {}; + +template +struct is_compatible_string_type +{ + static constexpr auto value = + is_constructible::value; +}; + +template +struct is_constructible_string_type +{ + static constexpr auto value = + is_constructible::value; +}; + +template +struct is_compatible_array_type_impl : std::false_type {}; + +template +struct is_compatible_array_type_impl < + BasicJsonType, CompatibleArrayType, + enable_if_t < + is_detected::value&& + is_iterator_traits>>::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 + !std::is_same>::value >> +{ + static constexpr bool value = + is_constructible>::value; +}; + +template +struct is_compatible_array_type + : is_compatible_array_type_impl {}; + +template +struct is_constructible_array_type_impl : std::false_type {}; + +template +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t::value >> + : std::true_type {}; + +template +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t < !std::is_same::value&& + !is_compatible_string_type::value&& + is_default_constructible::value&& +(std::is_move_assignable::value || + std::is_copy_assignable::value)&& +is_detected::value&& +is_iterator_traits>>::value&& +is_detected::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 +!std::is_same>::value&& + is_complete_type < + detected_t>::value >> +{ + using value_type = range_value_t; + + static constexpr bool value = + std::is_same::value || + has_from_json::value || + has_non_default_from_json < + BasicJsonType, + value_type >::value; +}; + +template +struct is_constructible_array_type + : is_constructible_array_type_impl {}; + +template +struct is_compatible_integer_type_impl : std::false_type {}; + +template +struct is_compatible_integer_type_impl < + RealIntegerType, CompatibleNumberIntegerType, + enable_if_t < std::is_integral::value&& + std::is_integral::value&& + !std::is_same::value >> +{ + // is there an assert somewhere on overflows? + using RealLimits = std::numeric_limits; + using CompatibleLimits = std::numeric_limits; + + static constexpr auto value = + is_constructible::value && + CompatibleLimits::is_integer && + RealLimits::is_signed == CompatibleLimits::is_signed; +}; + +template +struct is_compatible_integer_type + : is_compatible_integer_type_impl {}; + +template +struct is_compatible_type_impl: std::false_type {}; + +template +struct is_compatible_type_impl < + BasicJsonType, CompatibleType, + enable_if_t::value >> +{ + static constexpr bool value = + has_to_json::value; +}; + +template +struct is_compatible_type + : is_compatible_type_impl {}; + +template +struct is_constructible_tuple : std::false_type {}; + +template +struct is_constructible_tuple> : conjunction...> {}; + +// a naive helper to check if a type is an ordered_map (exploits the fact that +// ordered_map inherits capacity() from std::vector) +template +struct is_ordered_map +{ + using one = char; + + struct two + { + char x[2]; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) + }; + + template static one test( decltype(&C::capacity) ) ; + template static two test(...); + + enum { value = sizeof(test(nullptr)) == sizeof(char) }; // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) +}; + +// to avoid useless casts (see https://github.com/nlohmann/json/issues/2893#issuecomment-889152324) +template < typename T, typename U, enable_if_t < !std::is_same::value, int > = 0 > +T conditional_static_cast(U value) +{ + return static_cast(value); +} + +template::value, int> = 0> +T conditional_static_cast(U value) +{ + return value; +} + +} // namespace detail +} // namespace nlohmann + +// #include + + +#if JSON_HAS_EXPERIMENTAL_FILESYSTEM +#include +namespace nlohmann::detail +{ +namespace std_fs = std::experimental::filesystem; +} // namespace nlohmann::detail +#elif JSON_HAS_FILESYSTEM +#include +namespace nlohmann::detail +{ +namespace std_fs = std::filesystem; +} // namespace nlohmann::detail +#endif + +namespace nlohmann +{ +namespace detail +{ +template +void from_json(const BasicJsonType& j, typename std::nullptr_t& n) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_null())) + { + JSON_THROW(type_error::create(302, "type must be null, but is " + std::string(j.type_name()), j)); + } + n = nullptr; +} + +// overloads for basic_json template parameters +template < typename BasicJsonType, typename ArithmeticType, + enable_if_t < std::is_arithmetic::value&& + !std::is_same::value, + int > = 0 > +void get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val) +{ + switch (static_cast(j)) + { + case value_t::number_unsigned: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::number_integer: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::number_float: + { + val = static_cast(*j.template get_ptr()); + break; + } + + case value_t::null: + case value_t::object: + case value_t::array: + case value_t::string: + case value_t::boolean: + case value_t::binary: + case value_t::discarded: + default: + JSON_THROW(type_error::create(302, "type must be number, but is " + std::string(j.type_name()), j)); + } +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::boolean_t& b) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_boolean())) + { + JSON_THROW(type_error::create(302, "type must be boolean, but is " + std::string(j.type_name()), j)); + } + b = *j.template get_ptr(); +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::string_t& s) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_string())) + { + JSON_THROW(type_error::create(302, "type must be string, but is " + std::string(j.type_name()), j)); + } + s = *j.template get_ptr(); +} + +template < + typename BasicJsonType, typename ConstructibleStringType, + enable_if_t < + is_constructible_string_type::value&& + !std::is_same::value, + int > = 0 > +void from_json(const BasicJsonType& j, ConstructibleStringType& s) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_string())) + { + JSON_THROW(type_error::create(302, "type must be string, but is " + std::string(j.type_name()), j)); + } + + s = *j.template get_ptr(); +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::number_float_t& val) +{ + get_arithmetic_value(j, val); +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::number_unsigned_t& val) +{ + get_arithmetic_value(j, val); +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::number_integer_t& val) +{ + get_arithmetic_value(j, val); +} + +template::value, int> = 0> +void from_json(const BasicJsonType& j, EnumType& e) +{ + typename std::underlying_type::type val; + get_arithmetic_value(j, val); + e = static_cast(val); +} + +// forward_list doesn't have an insert method +template::value, int> = 0> +void from_json(const BasicJsonType& j, std::forward_list& l) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + l.clear(); + std::transform(j.rbegin(), j.rend(), + std::front_inserter(l), [](const BasicJsonType & i) + { + return i.template get(); + }); +} + +// valarray doesn't have an insert method +template::value, int> = 0> +void from_json(const BasicJsonType& j, std::valarray& l) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + l.resize(j.size()); + std::transform(j.begin(), j.end(), std::begin(l), + [](const BasicJsonType & elem) + { + return elem.template get(); + }); +} + +template +auto from_json(const BasicJsonType& j, T (&arr)[N]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) +-> decltype(j.template get(), void()) +{ + for (std::size_t i = 0; i < N; ++i) + { + arr[i] = j.at(i).template get(); + } +} + +template +void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/) +{ + arr = *j.template get_ptr(); +} + +template +auto from_json_array_impl(const BasicJsonType& j, std::array& arr, + priority_tag<2> /*unused*/) +-> decltype(j.template get(), void()) +{ + for (std::size_t i = 0; i < N; ++i) + { + arr[i] = j.at(i).template get(); + } +} + +template::value, + int> = 0> +auto from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, priority_tag<1> /*unused*/) +-> decltype( + arr.reserve(std::declval()), + j.template get(), + void()) +{ + using std::end; + + ConstructibleArrayType ret; + ret.reserve(j.size()); + std::transform(j.begin(), j.end(), + std::inserter(ret, end(ret)), [](const BasicJsonType & i) + { + // get() returns *this, this won't call a from_json + // method when value_type is BasicJsonType + return i.template get(); + }); + arr = std::move(ret); +} + +template::value, + int> = 0> +void from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, + priority_tag<0> /*unused*/) +{ + using std::end; + + ConstructibleArrayType ret; + std::transform( + j.begin(), j.end(), std::inserter(ret, end(ret)), + [](const BasicJsonType & i) + { + // get() returns *this, this won't call a from_json + // method when value_type is BasicJsonType + return i.template get(); + }); + arr = std::move(ret); +} + +template < typename BasicJsonType, typename ConstructibleArrayType, + enable_if_t < + is_constructible_array_type::value&& + !is_constructible_object_type::value&& + !is_constructible_string_type::value&& + !std::is_same::value&& + !is_basic_json::value, + int > = 0 > +auto from_json(const BasicJsonType& j, ConstructibleArrayType& arr) +-> decltype(from_json_array_impl(j, arr, priority_tag<3> {}), +j.template get(), +void()) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + + from_json_array_impl(j, arr, priority_tag<3> {}); +} + +template < typename BasicJsonType, typename T, std::size_t... Idx > +std::array from_json_inplace_array_impl(BasicJsonType&& j, + identity_tag> /*unused*/, index_sequence /*unused*/) +{ + return { { std::forward(j).at(Idx).template get()... } }; +} + +template < typename BasicJsonType, typename T, std::size_t N > +auto from_json(BasicJsonType&& j, identity_tag> tag) +-> decltype(from_json_inplace_array_impl(std::forward(j), tag, make_index_sequence {})) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + + return from_json_inplace_array_impl(std::forward(j), tag, make_index_sequence {}); +} + +template +void from_json(const BasicJsonType& j, typename BasicJsonType::binary_t& bin) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_binary())) + { + JSON_THROW(type_error::create(302, "type must be binary, but is " + std::string(j.type_name()), j)); + } + + bin = *j.template get_ptr(); +} + +template::value, int> = 0> +void from_json(const BasicJsonType& j, ConstructibleObjectType& obj) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_object())) + { + JSON_THROW(type_error::create(302, "type must be object, but is " + std::string(j.type_name()), j)); + } + + ConstructibleObjectType ret; + const auto* inner_object = j.template get_ptr(); + using value_type = typename ConstructibleObjectType::value_type; + std::transform( + inner_object->begin(), inner_object->end(), + std::inserter(ret, ret.begin()), + [](typename BasicJsonType::object_t::value_type const & p) + { + return value_type(p.first, p.second.template get()); + }); + obj = std::move(ret); +} + +// overload for arithmetic types, not chosen for basic_json template arguments +// (BooleanType, etc..); note: Is it really necessary to provide explicit +// overloads for boolean_t etc. in case of a custom BooleanType which is not +// an arithmetic type? +template < typename BasicJsonType, typename ArithmeticType, + enable_if_t < + std::is_arithmetic::value&& + !std::is_same::value&& + !std::is_same::value&& + !std::is_same::value&& + !std::is_same::value, + int > = 0 > +void from_json(const BasicJsonType& j, ArithmeticType& val) +{ + switch (static_cast(j)) + { + case value_t::number_unsigned: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::number_integer: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::number_float: + { + val = static_cast(*j.template get_ptr()); + break; + } + case value_t::boolean: + { + val = static_cast(*j.template get_ptr()); + break; + } + + case value_t::null: + case value_t::object: + case value_t::array: + case value_t::string: + case value_t::binary: + case value_t::discarded: + default: + JSON_THROW(type_error::create(302, "type must be number, but is " + std::string(j.type_name()), j)); + } +} + +template +std::tuple from_json_tuple_impl_base(BasicJsonType&& j, index_sequence /*unused*/) +{ + return std::make_tuple(std::forward(j).at(Idx).template get()...); +} + +template < typename BasicJsonType, class A1, class A2 > +std::pair from_json_tuple_impl(BasicJsonType&& j, identity_tag> /*unused*/, priority_tag<0> /*unused*/) +{ + return {std::forward(j).at(0).template get(), + std::forward(j).at(1).template get()}; +} + +template +void from_json_tuple_impl(BasicJsonType&& j, std::pair& p, priority_tag<1> /*unused*/) +{ + p = from_json_tuple_impl(std::forward(j), identity_tag> {}, priority_tag<0> {}); +} + +template +std::tuple from_json_tuple_impl(BasicJsonType&& j, identity_tag> /*unused*/, priority_tag<2> /*unused*/) +{ + return from_json_tuple_impl_base(std::forward(j), index_sequence_for {}); +} + +template +void from_json_tuple_impl(BasicJsonType&& j, std::tuple& t, priority_tag<3> /*unused*/) +{ + t = from_json_tuple_impl_base(std::forward(j), index_sequence_for {}); +} + +template +auto from_json(BasicJsonType&& j, TupleRelated&& t) +-> decltype(from_json_tuple_impl(std::forward(j), std::forward(t), priority_tag<3> {})) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + + return from_json_tuple_impl(std::forward(j), std::forward(t), priority_tag<3> {}); +} + +template < typename BasicJsonType, typename Key, typename Value, typename Compare, typename Allocator, + typename = enable_if_t < !std::is_constructible < + typename BasicJsonType::string_t, Key >::value >> +void from_json(const BasicJsonType& j, std::map& m) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + m.clear(); + for (const auto& p : j) + { + if (JSON_HEDLEY_UNLIKELY(!p.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(p.type_name()), j)); + } + m.emplace(p.at(0).template get(), p.at(1).template get()); + } +} + +template < typename BasicJsonType, typename Key, typename Value, typename Hash, typename KeyEqual, typename Allocator, + typename = enable_if_t < !std::is_constructible < + typename BasicJsonType::string_t, Key >::value >> +void from_json(const BasicJsonType& j, std::unordered_map& m) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()), j)); + } + m.clear(); + for (const auto& p : j) + { + if (JSON_HEDLEY_UNLIKELY(!p.is_array())) + { + JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(p.type_name()), j)); + } + m.emplace(p.at(0).template get(), p.at(1).template get()); + } +} + +#if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM +template +void from_json(const BasicJsonType& j, std_fs::path& p) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_string())) + { + JSON_THROW(type_error::create(302, "type must be string, but is " + std::string(j.type_name()), j)); + } + p = *j.template get_ptr(); +} +#endif + +struct from_json_fn +{ + template + auto operator()(const BasicJsonType& j, T&& val) const + noexcept(noexcept(from_json(j, std::forward(val)))) + -> decltype(from_json(j, std::forward(val))) + { + return from_json(j, std::forward(val)); + } +}; +} // namespace detail + +/// namespace to hold default `from_json` function +/// to see why this is required: +/// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html +namespace // NOLINT(cert-dcl59-cpp,fuchsia-header-anon-namespaces,google-build-namespaces) +{ +constexpr const auto& from_json = detail::static_const::value; // NOLINT(misc-definitions-in-headers) +} // namespace +} // namespace nlohmann + +// #include + + +#include // copy +#include // begin, end +#include // string +#include // tuple, get +#include // is_same, is_constructible, is_floating_point, is_enum, underlying_type +#include // move, forward, declval, pair +#include // valarray +#include // vector + +// #include + +// #include + + +#include // size_t +#include // input_iterator_tag +#include // string, to_string +#include // tuple_size, get, tuple_element +#include // move + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +template +void int_to_string( string_type& target, std::size_t value ) +{ + // For ADL + using std::to_string; + target = to_string(value); +} +template class iteration_proxy_value +{ + public: + using difference_type = std::ptrdiff_t; + using value_type = iteration_proxy_value; + using pointer = value_type * ; + using reference = value_type & ; + using iterator_category = std::input_iterator_tag; + using string_type = typename std::remove_cv< typename std::remove_reference().key() ) >::type >::type; + + private: + /// the iterator + IteratorType anchor; + /// an index for arrays (used to create key names) + std::size_t array_index = 0; + /// last stringified array index + mutable std::size_t array_index_last = 0; + /// a string representation of the array index + mutable string_type array_index_str = "0"; + /// an empty string (to return a reference for primitive values) + const string_type empty_str{}; + + public: + explicit iteration_proxy_value(IteratorType it) noexcept + : anchor(std::move(it)) + {} + + /// dereference operator (needed for range-based for) + iteration_proxy_value& operator*() + { + return *this; + } + + /// increment operator (needed for range-based for) + iteration_proxy_value& operator++() + { + ++anchor; + ++array_index; + + return *this; + } + + /// equality operator (needed for InputIterator) + bool operator==(const iteration_proxy_value& o) const + { + return anchor == o.anchor; + } + + /// inequality operator (needed for range-based for) + bool operator!=(const iteration_proxy_value& o) const + { + return anchor != o.anchor; + } + + /// return key of the iterator + const string_type& key() const + { + JSON_ASSERT(anchor.m_object != nullptr); + + switch (anchor.m_object->type()) + { + // use integer array index as key + case value_t::array: + { + if (array_index != array_index_last) + { + int_to_string( array_index_str, array_index ); + array_index_last = array_index; + } + return array_index_str; + } + + // use key from the object + case value_t::object: + return anchor.key(); + + // use an empty key for all primitive types + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return empty_str; + } + } + + /// return value of the iterator + typename IteratorType::reference value() const + { + return anchor.value(); + } +}; + +/// proxy class for the items() function +template class iteration_proxy +{ + private: + /// the container to iterate + typename IteratorType::reference container; + + public: + /// construct iteration proxy from a container + explicit iteration_proxy(typename IteratorType::reference cont) noexcept + : container(cont) {} + + /// return iterator begin (needed for range-based for) + iteration_proxy_value begin() noexcept + { + return iteration_proxy_value(container.begin()); + } + + /// return iterator end (needed for range-based for) + iteration_proxy_value end() noexcept + { + return iteration_proxy_value(container.end()); + } +}; +// Structured Bindings Support +// For further reference see https://blog.tartanllama.xyz/structured-bindings/ +// And see https://github.com/nlohmann/json/pull/1391 +template = 0> +auto get(const nlohmann::detail::iteration_proxy_value& i) -> decltype(i.key()) +{ + return i.key(); +} +// Structured Bindings Support +// For further reference see https://blog.tartanllama.xyz/structured-bindings/ +// And see https://github.com/nlohmann/json/pull/1391 +template = 0> +auto get(const nlohmann::detail::iteration_proxy_value& i) -> decltype(i.value()) +{ + return i.value(); +} +} // namespace detail +} // namespace nlohmann + +// The Addition to the STD Namespace is required to add +// Structured Bindings Support to the iteration_proxy_value class +// For further reference see https://blog.tartanllama.xyz/structured-bindings/ +// And see https://github.com/nlohmann/json/pull/1391 +namespace std +{ +#if defined(__clang__) + // Fix: https://github.com/nlohmann/json/issues/1401 + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wmismatched-tags" +#endif +template +class tuple_size<::nlohmann::detail::iteration_proxy_value> + : public std::integral_constant {}; + +template +class tuple_element> +{ + public: + using type = decltype( + get(std::declval < + ::nlohmann::detail::iteration_proxy_value> ())); +}; +#if defined(__clang__) + #pragma clang diagnostic pop +#endif +} // namespace std + +// #include + +// #include + +// #include + + +#if JSON_HAS_EXPERIMENTAL_FILESYSTEM +#include +namespace nlohmann::detail +{ +namespace std_fs = std::experimental::filesystem; +} // namespace nlohmann::detail +#elif JSON_HAS_FILESYSTEM +#include +namespace nlohmann::detail +{ +namespace std_fs = std::filesystem; +} // namespace nlohmann::detail +#endif + +namespace nlohmann +{ +namespace detail +{ +////////////////// +// constructors // +////////////////// + +/* + * Note all external_constructor<>::construct functions need to call + * j.m_value.destroy(j.m_type) to avoid a memory leak in case j contains an + * allocated value (e.g., a string). See bug issue + * https://github.com/nlohmann/json/issues/2865 for more information. + */ + +template struct external_constructor; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, typename BasicJsonType::boolean_t b) noexcept + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::boolean; + j.m_value = b; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, const typename BasicJsonType::string_t& s) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::string; + j.m_value = s; + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, typename BasicJsonType::string_t&& s) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::string; + j.m_value = std::move(s); + j.assert_invariant(); + } + + template < typename BasicJsonType, typename CompatibleStringType, + enable_if_t < !std::is_same::value, + int > = 0 > + static void construct(BasicJsonType& j, const CompatibleStringType& str) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::string; + j.m_value.string = j.template create(str); + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, const typename BasicJsonType::binary_t& b) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::binary; + j.m_value = typename BasicJsonType::binary_t(b); + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, typename BasicJsonType::binary_t&& b) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::binary; + j.m_value = typename BasicJsonType::binary_t(std::move(b)); + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, typename BasicJsonType::number_float_t val) noexcept + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::number_float; + j.m_value = val; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, typename BasicJsonType::number_unsigned_t val) noexcept + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::number_unsigned; + j.m_value = val; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, typename BasicJsonType::number_integer_t val) noexcept + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::number_integer; + j.m_value = val; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, const typename BasicJsonType::array_t& arr) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value = arr; + j.set_parents(); + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, typename BasicJsonType::array_t&& arr) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value = std::move(arr); + j.set_parents(); + j.assert_invariant(); + } + + template < typename BasicJsonType, typename CompatibleArrayType, + enable_if_t < !std::is_same::value, + int > = 0 > + static void construct(BasicJsonType& j, const CompatibleArrayType& arr) + { + using std::begin; + using std::end; + + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value.array = j.template create(begin(arr), end(arr)); + j.set_parents(); + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, const std::vector& arr) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value = value_t::array; + j.m_value.array->reserve(arr.size()); + for (const bool x : arr) + { + j.m_value.array->push_back(x); + j.set_parent(j.m_value.array->back()); + } + j.assert_invariant(); + } + + template::value, int> = 0> + static void construct(BasicJsonType& j, const std::valarray& arr) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::array; + j.m_value = value_t::array; + j.m_value.array->resize(arr.size()); + if (arr.size() > 0) + { + std::copy(std::begin(arr), std::end(arr), j.m_value.array->begin()); + } + j.set_parents(); + j.assert_invariant(); + } +}; + +template<> +struct external_constructor +{ + template + static void construct(BasicJsonType& j, const typename BasicJsonType::object_t& obj) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::object; + j.m_value = obj; + j.set_parents(); + j.assert_invariant(); + } + + template + static void construct(BasicJsonType& j, typename BasicJsonType::object_t&& obj) + { + j.m_value.destroy(j.m_type); + j.m_type = value_t::object; + j.m_value = std::move(obj); + j.set_parents(); + j.assert_invariant(); + } + + template < typename BasicJsonType, typename CompatibleObjectType, + enable_if_t < !std::is_same::value, int > = 0 > + static void construct(BasicJsonType& j, const CompatibleObjectType& obj) + { + using std::begin; + using std::end; + + j.m_value.destroy(j.m_type); + j.m_type = value_t::object; + j.m_value.object = j.template create(begin(obj), end(obj)); + j.set_parents(); + j.assert_invariant(); + } +}; + +///////////// +// to_json // +///////////// + +template::value, int> = 0> +void to_json(BasicJsonType& j, T b) noexcept +{ + external_constructor::construct(j, b); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, const CompatibleString& s) +{ + external_constructor::construct(j, s); +} + +template +void to_json(BasicJsonType& j, typename BasicJsonType::string_t&& s) +{ + external_constructor::construct(j, std::move(s)); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, FloatType val) noexcept +{ + external_constructor::construct(j, static_cast(val)); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noexcept +{ + external_constructor::construct(j, static_cast(val)); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noexcept +{ + external_constructor::construct(j, static_cast(val)); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, EnumType e) noexcept +{ + using underlying_type = typename std::underlying_type::type; + external_constructor::construct(j, static_cast(e)); +} + +template +void to_json(BasicJsonType& j, const std::vector& e) +{ + external_constructor::construct(j, e); +} + +template < typename BasicJsonType, typename CompatibleArrayType, + enable_if_t < is_compatible_array_type::value&& + !is_compatible_object_type::value&& + !is_compatible_string_type::value&& + !std::is_same::value&& + !is_basic_json::value, + int > = 0 > +void to_json(BasicJsonType& j, const CompatibleArrayType& arr) +{ + external_constructor::construct(j, arr); +} + +template +void to_json(BasicJsonType& j, const typename BasicJsonType::binary_t& bin) +{ + external_constructor::construct(j, bin); +} + +template::value, int> = 0> +void to_json(BasicJsonType& j, const std::valarray& arr) +{ + external_constructor::construct(j, std::move(arr)); +} + +template +void to_json(BasicJsonType& j, typename BasicJsonType::array_t&& arr) +{ + external_constructor::construct(j, std::move(arr)); +} + +template < typename BasicJsonType, typename CompatibleObjectType, + enable_if_t < is_compatible_object_type::value&& !is_basic_json::value, int > = 0 > +void to_json(BasicJsonType& j, const CompatibleObjectType& obj) +{ + external_constructor::construct(j, obj); +} + +template +void to_json(BasicJsonType& j, typename BasicJsonType::object_t&& obj) +{ + external_constructor::construct(j, std::move(obj)); +} + +template < + typename BasicJsonType, typename T, std::size_t N, + enable_if_t < !std::is_constructible::value, // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) + int > = 0 > +void to_json(BasicJsonType& j, const T(&arr)[N]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) +{ + external_constructor::construct(j, arr); +} + +template < typename BasicJsonType, typename T1, typename T2, enable_if_t < std::is_constructible::value&& std::is_constructible::value, int > = 0 > +void to_json(BasicJsonType& j, const std::pair& p) +{ + j = { p.first, p.second }; +} + +// for https://github.com/nlohmann/json/pull/1134 +template>::value, int> = 0> +void to_json(BasicJsonType& j, const T& b) +{ + j = { {b.key(), b.value()} }; +} + +template +void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequence /*unused*/) +{ + j = { std::get(t)... }; +} + +template::value, int > = 0> +void to_json(BasicJsonType& j, const T& t) +{ + to_json_tuple_impl(j, t, make_index_sequence::value> {}); +} + +#if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM +template +void to_json(BasicJsonType& j, const std_fs::path& p) +{ + j = p.string(); +} +#endif + +struct to_json_fn +{ + template + auto operator()(BasicJsonType& j, T&& val) const noexcept(noexcept(to_json(j, std::forward(val)))) + -> decltype(to_json(j, std::forward(val)), void()) + { + return to_json(j, std::forward(val)); + } +}; +} // namespace detail + +/// namespace to hold default `to_json` function +/// to see why this is required: +/// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html +namespace // NOLINT(cert-dcl59-cpp,fuchsia-header-anon-namespaces,google-build-namespaces) +{ +constexpr const auto& to_json = detail::static_const::value; // NOLINT(misc-definitions-in-headers) +} // namespace +} // namespace nlohmann + +// #include + +// #include + + +namespace nlohmann +{ + +/// @sa https://json.nlohmann.me/api/adl_serializer/ +template +struct adl_serializer +{ + /// @brief convert a JSON value to any value type + /// @sa https://json.nlohmann.me/api/adl_serializer/from_json/ + template + static auto from_json(BasicJsonType && j, TargetType& val) noexcept( + noexcept(::nlohmann::from_json(std::forward(j), val))) + -> decltype(::nlohmann::from_json(std::forward(j), val), void()) + { + ::nlohmann::from_json(std::forward(j), val); + } + + /// @brief convert a JSON value to any value type + /// @sa https://json.nlohmann.me/api/adl_serializer/from_json/ + template + static auto from_json(BasicJsonType && j) noexcept( + noexcept(::nlohmann::from_json(std::forward(j), detail::identity_tag {}))) + -> decltype(::nlohmann::from_json(std::forward(j), detail::identity_tag {})) + { + return ::nlohmann::from_json(std::forward(j), detail::identity_tag {}); + } + + /// @brief convert any value type to a JSON value + /// @sa https://json.nlohmann.me/api/adl_serializer/to_json/ + template + static auto to_json(BasicJsonType& j, TargetType && val) noexcept( + noexcept(::nlohmann::to_json(j, std::forward(val)))) + -> decltype(::nlohmann::to_json(j, std::forward(val)), void()) + { + ::nlohmann::to_json(j, std::forward(val)); + } +}; +} // namespace nlohmann + +// #include + + +#include // uint8_t, uint64_t +#include // tie +#include // move + +namespace nlohmann +{ + +/// @brief an internal type for a backed binary type +/// @sa https://json.nlohmann.me/api/byte_container_with_subtype/ +template +class byte_container_with_subtype : public BinaryType +{ + public: + using container_type = BinaryType; + using subtype_type = std::uint64_t; + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype() noexcept(noexcept(container_type())) + : container_type() + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(const container_type& b) noexcept(noexcept(container_type(b))) + : container_type(b) + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(container_type&& b) noexcept(noexcept(container_type(std::move(b)))) + : container_type(std::move(b)) + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(const container_type& b, subtype_type subtype_) noexcept(noexcept(container_type(b))) + : container_type(b) + , m_subtype(subtype_) + , m_has_subtype(true) + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(container_type&& b, subtype_type subtype_) noexcept(noexcept(container_type(std::move(b)))) + : container_type(std::move(b)) + , m_subtype(subtype_) + , m_has_subtype(true) + {} + + bool operator==(const byte_container_with_subtype& rhs) const + { + return std::tie(static_cast(*this), m_subtype, m_has_subtype) == + std::tie(static_cast(rhs), rhs.m_subtype, rhs.m_has_subtype); + } + + bool operator!=(const byte_container_with_subtype& rhs) const + { + return !(rhs == *this); + } + + /// @brief sets the binary subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/set_subtype/ + void set_subtype(subtype_type subtype_) noexcept + { + m_subtype = subtype_; + m_has_subtype = true; + } + + /// @brief return the binary subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/subtype/ + constexpr subtype_type subtype() const noexcept + { + return m_has_subtype ? m_subtype : static_cast(-1); + } + + /// @brief return whether the value has a subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/has_subtype/ + constexpr bool has_subtype() const noexcept + { + return m_has_subtype; + } + + /// @brief clears the binary subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/clear_subtype/ + void clear_subtype() noexcept + { + m_subtype = 0; + m_has_subtype = false; + } + + private: + subtype_type m_subtype = 0; + bool m_has_subtype = false; +}; + +} // namespace nlohmann + +// #include + +// #include + +// #include + +// #include + + +#include // uint8_t +#include // size_t +#include // hash + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ + +// boost::hash_combine +inline std::size_t combine(std::size_t seed, std::size_t h) noexcept +{ + seed ^= h + 0x9e3779b9 + (seed << 6U) + (seed >> 2U); + return seed; +} + +/*! +@brief hash a JSON value + +The hash function tries to rely on std::hash where possible. Furthermore, the +type of the JSON value is taken into account to have different hash values for +null, 0, 0U, and false, etc. + +@tparam BasicJsonType basic_json specialization +@param j JSON value to hash +@return hash value of j +*/ +template +std::size_t hash(const BasicJsonType& j) +{ + using string_t = typename BasicJsonType::string_t; + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + + const auto type = static_cast(j.type()); + switch (j.type()) + { + case BasicJsonType::value_t::null: + case BasicJsonType::value_t::discarded: + { + return combine(type, 0); + } + + case BasicJsonType::value_t::object: + { + auto seed = combine(type, j.size()); + for (const auto& element : j.items()) + { + const auto h = std::hash {}(element.key()); + seed = combine(seed, h); + seed = combine(seed, hash(element.value())); + } + return seed; + } + + case BasicJsonType::value_t::array: + { + auto seed = combine(type, j.size()); + for (const auto& element : j) + { + seed = combine(seed, hash(element)); + } + return seed; + } + + case BasicJsonType::value_t::string: + { + const auto h = std::hash {}(j.template get_ref()); + return combine(type, h); + } + + case BasicJsonType::value_t::boolean: + { + const auto h = std::hash {}(j.template get()); + return combine(type, h); + } + + case BasicJsonType::value_t::number_integer: + { + const auto h = std::hash {}(j.template get()); + return combine(type, h); + } + + case BasicJsonType::value_t::number_unsigned: + { + const auto h = std::hash {}(j.template get()); + return combine(type, h); + } + + case BasicJsonType::value_t::number_float: + { + const auto h = std::hash {}(j.template get()); + return combine(type, h); + } + + case BasicJsonType::value_t::binary: + { + auto seed = combine(type, j.get_binary().size()); + const auto h = std::hash {}(j.get_binary().has_subtype()); + seed = combine(seed, h); + seed = combine(seed, static_cast(j.get_binary().subtype())); + for (const auto byte : j.get_binary()) + { + seed = combine(seed, std::hash {}(byte)); + } + return seed; + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + return 0; // LCOV_EXCL_LINE + } +} + +} // namespace detail +} // namespace nlohmann + +// #include + + +#include // generate_n +#include // array +#include // ldexp +#include // size_t +#include // uint8_t, uint16_t, uint32_t, uint64_t +#include // snprintf +#include // memcpy +#include // back_inserter +#include // numeric_limits +#include // char_traits, string +#include // make_pair, move +#include // vector + +// #include + +// #include + + +#include // array +#include // size_t +#include // strlen +#include // begin, end, iterator_traits, random_access_iterator_tag, distance, next +#include // shared_ptr, make_shared, addressof +#include // accumulate +#include // string, char_traits +#include // enable_if, is_base_of, is_pointer, is_integral, remove_pointer +#include // pair, declval + +#ifndef JSON_NO_IO + #include // FILE * + #include // istream +#endif // JSON_NO_IO + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +/// the supported input formats +enum class input_format_t { json, cbor, msgpack, ubjson, bson }; + +//////////////////// +// input adapters // +//////////////////// + +#ifndef JSON_NO_IO +/*! +Input adapter for stdio file access. This adapter read only 1 byte and do not use any + buffer. This adapter is a very low level adapter. +*/ +class file_input_adapter +{ + public: + using char_type = char; + + JSON_HEDLEY_NON_NULL(2) + explicit file_input_adapter(std::FILE* f) noexcept + : m_file(f) + {} + + // make class move-only + file_input_adapter(const file_input_adapter&) = delete; + file_input_adapter(file_input_adapter&&) noexcept = default; + file_input_adapter& operator=(const file_input_adapter&) = delete; + file_input_adapter& operator=(file_input_adapter&&) = delete; + ~file_input_adapter() = default; + + std::char_traits::int_type get_character() noexcept + { + return std::fgetc(m_file); + } + + private: + /// the file pointer to read from + std::FILE* m_file; +}; + + +/*! +Input adapter for a (caching) istream. Ignores a UFT Byte Order Mark at +beginning of input. Does not support changing the underlying std::streambuf +in mid-input. Maintains underlying std::istream and std::streambuf to support +subsequent use of standard std::istream operations to process any input +characters following those used in parsing the JSON input. Clears the +std::istream flags; any input errors (e.g., EOF) will be detected by the first +subsequent call for input from the std::istream. +*/ +class input_stream_adapter +{ + public: + using char_type = char; + + ~input_stream_adapter() + { + // clear stream flags; we use underlying streambuf I/O, do not + // maintain ifstream flags, except eof + if (is != nullptr) + { + is->clear(is->rdstate() & std::ios::eofbit); + } + } + + explicit input_stream_adapter(std::istream& i) + : is(&i), sb(i.rdbuf()) + {} + + // delete because of pointer members + input_stream_adapter(const input_stream_adapter&) = delete; + input_stream_adapter& operator=(input_stream_adapter&) = delete; + input_stream_adapter& operator=(input_stream_adapter&&) = delete; + + input_stream_adapter(input_stream_adapter&& rhs) noexcept + : is(rhs.is), sb(rhs.sb) + { + rhs.is = nullptr; + rhs.sb = nullptr; + } + + // std::istream/std::streambuf use std::char_traits::to_int_type, to + // ensure that std::char_traits::eof() and the character 0xFF do not + // end up as the same value, e.g. 0xFFFFFFFF. + std::char_traits::int_type get_character() + { + auto res = sb->sbumpc(); + // set eof manually, as we don't use the istream interface. + if (JSON_HEDLEY_UNLIKELY(res == std::char_traits::eof())) + { + is->clear(is->rdstate() | std::ios::eofbit); + } + return res; + } + + private: + /// the associated input stream + std::istream* is = nullptr; + std::streambuf* sb = nullptr; +}; +#endif // JSON_NO_IO + +// General-purpose iterator-based adapter. It might not be as fast as +// theoretically possible for some containers, but it is extremely versatile. +template +class iterator_input_adapter +{ + public: + using char_type = typename std::iterator_traits::value_type; + + iterator_input_adapter(IteratorType first, IteratorType last) + : current(std::move(first)), end(std::move(last)) + {} + + typename std::char_traits::int_type get_character() + { + if (JSON_HEDLEY_LIKELY(current != end)) + { + auto result = std::char_traits::to_int_type(*current); + std::advance(current, 1); + return result; + } + + return std::char_traits::eof(); + } + + private: + IteratorType current; + IteratorType end; + + template + friend struct wide_string_input_helper; + + bool empty() const + { + return current == end; + } +}; + + +template +struct wide_string_input_helper; + +template +struct wide_string_input_helper +{ + // UTF-32 + static void fill_buffer(BaseInputAdapter& input, + std::array::int_type, 4>& utf8_bytes, + size_t& utf8_bytes_index, + size_t& utf8_bytes_filled) + { + utf8_bytes_index = 0; + + if (JSON_HEDLEY_UNLIKELY(input.empty())) + { + utf8_bytes[0] = std::char_traits::eof(); + utf8_bytes_filled = 1; + } + else + { + // get the current character + const auto wc = input.get_character(); + + // UTF-32 to UTF-8 encoding + if (wc < 0x80) + { + utf8_bytes[0] = static_cast::int_type>(wc); + utf8_bytes_filled = 1; + } + else if (wc <= 0x7FF) + { + utf8_bytes[0] = static_cast::int_type>(0xC0u | ((static_cast(wc) >> 6u) & 0x1Fu)); + utf8_bytes[1] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 2; + } + else if (wc <= 0xFFFF) + { + utf8_bytes[0] = static_cast::int_type>(0xE0u | ((static_cast(wc) >> 12u) & 0x0Fu)); + utf8_bytes[1] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 6u) & 0x3Fu)); + utf8_bytes[2] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 3; + } + else if (wc <= 0x10FFFF) + { + utf8_bytes[0] = static_cast::int_type>(0xF0u | ((static_cast(wc) >> 18u) & 0x07u)); + utf8_bytes[1] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 12u) & 0x3Fu)); + utf8_bytes[2] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 6u) & 0x3Fu)); + utf8_bytes[3] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 4; + } + else + { + // unknown character + utf8_bytes[0] = static_cast::int_type>(wc); + utf8_bytes_filled = 1; + } + } + } +}; + +template +struct wide_string_input_helper +{ + // UTF-16 + static void fill_buffer(BaseInputAdapter& input, + std::array::int_type, 4>& utf8_bytes, + size_t& utf8_bytes_index, + size_t& utf8_bytes_filled) + { + utf8_bytes_index = 0; + + if (JSON_HEDLEY_UNLIKELY(input.empty())) + { + utf8_bytes[0] = std::char_traits::eof(); + utf8_bytes_filled = 1; + } + else + { + // get the current character + const auto wc = input.get_character(); + + // UTF-16 to UTF-8 encoding + if (wc < 0x80) + { + utf8_bytes[0] = static_cast::int_type>(wc); + utf8_bytes_filled = 1; + } + else if (wc <= 0x7FF) + { + utf8_bytes[0] = static_cast::int_type>(0xC0u | ((static_cast(wc) >> 6u))); + utf8_bytes[1] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 2; + } + else if (0xD800 > wc || wc >= 0xE000) + { + utf8_bytes[0] = static_cast::int_type>(0xE0u | ((static_cast(wc) >> 12u))); + utf8_bytes[1] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 6u) & 0x3Fu)); + utf8_bytes[2] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); + utf8_bytes_filled = 3; + } + else + { + if (JSON_HEDLEY_UNLIKELY(!input.empty())) + { + const auto wc2 = static_cast(input.get_character()); + const auto charcode = 0x10000u + (((static_cast(wc) & 0x3FFu) << 10u) | (wc2 & 0x3FFu)); + utf8_bytes[0] = static_cast::int_type>(0xF0u | (charcode >> 18u)); + utf8_bytes[1] = static_cast::int_type>(0x80u | ((charcode >> 12u) & 0x3Fu)); + utf8_bytes[2] = static_cast::int_type>(0x80u | ((charcode >> 6u) & 0x3Fu)); + utf8_bytes[3] = static_cast::int_type>(0x80u | (charcode & 0x3Fu)); + utf8_bytes_filled = 4; + } + else + { + utf8_bytes[0] = static_cast::int_type>(wc); + utf8_bytes_filled = 1; + } + } + } + } +}; + +// Wraps another input apdater to convert wide character types into individual bytes. +template +class wide_string_input_adapter +{ + public: + using char_type = char; + + wide_string_input_adapter(BaseInputAdapter base) + : base_adapter(base) {} + + typename std::char_traits::int_type get_character() noexcept + { + // check if buffer needs to be filled + if (utf8_bytes_index == utf8_bytes_filled) + { + fill_buffer(); + + JSON_ASSERT(utf8_bytes_filled > 0); + JSON_ASSERT(utf8_bytes_index == 0); + } + + // use buffer + JSON_ASSERT(utf8_bytes_filled > 0); + JSON_ASSERT(utf8_bytes_index < utf8_bytes_filled); + return utf8_bytes[utf8_bytes_index++]; + } + + private: + BaseInputAdapter base_adapter; + + template + void fill_buffer() + { + wide_string_input_helper::fill_buffer(base_adapter, utf8_bytes, utf8_bytes_index, utf8_bytes_filled); + } + + /// a buffer for UTF-8 bytes + std::array::int_type, 4> utf8_bytes = {{0, 0, 0, 0}}; + + /// index to the utf8_codes array for the next valid byte + std::size_t utf8_bytes_index = 0; + /// number of valid bytes in the utf8_codes array + std::size_t utf8_bytes_filled = 0; +}; + + +template +struct iterator_input_adapter_factory +{ + using iterator_type = IteratorType; + using char_type = typename std::iterator_traits::value_type; + using adapter_type = iterator_input_adapter; + + static adapter_type create(IteratorType first, IteratorType last) + { + return adapter_type(std::move(first), std::move(last)); + } +}; + +template +struct is_iterator_of_multibyte +{ + using value_type = typename std::iterator_traits::value_type; + enum + { + value = sizeof(value_type) > 1 + }; +}; + +template +struct iterator_input_adapter_factory::value>> +{ + using iterator_type = IteratorType; + using char_type = typename std::iterator_traits::value_type; + using base_adapter_type = iterator_input_adapter; + using adapter_type = wide_string_input_adapter; + + static adapter_type create(IteratorType first, IteratorType last) + { + return adapter_type(base_adapter_type(std::move(first), std::move(last))); + } +}; + +// General purpose iterator-based input +template +typename iterator_input_adapter_factory::adapter_type input_adapter(IteratorType first, IteratorType last) +{ + using factory_type = iterator_input_adapter_factory; + return factory_type::create(first, last); +} + +// Convenience shorthand from container to iterator +// Enables ADL on begin(container) and end(container) +// Encloses the using declarations in namespace for not to leak them to outside scope + +namespace container_input_adapter_factory_impl +{ + +using std::begin; +using std::end; + +template +struct container_input_adapter_factory {}; + +template +struct container_input_adapter_factory< ContainerType, + void_t()), end(std::declval()))>> + { + using adapter_type = decltype(input_adapter(begin(std::declval()), end(std::declval()))); + + static adapter_type create(const ContainerType& container) +{ + return input_adapter(begin(container), end(container)); +} + }; + +} // namespace container_input_adapter_factory_impl + +template +typename container_input_adapter_factory_impl::container_input_adapter_factory::adapter_type input_adapter(const ContainerType& container) +{ + return container_input_adapter_factory_impl::container_input_adapter_factory::create(container); +} + +#ifndef JSON_NO_IO +// Special cases with fast paths +inline file_input_adapter input_adapter(std::FILE* file) +{ + return file_input_adapter(file); +} + +inline input_stream_adapter input_adapter(std::istream& stream) +{ + return input_stream_adapter(stream); +} + +inline input_stream_adapter input_adapter(std::istream&& stream) +{ + return input_stream_adapter(stream); +} +#endif // JSON_NO_IO + +using contiguous_bytes_input_adapter = decltype(input_adapter(std::declval(), std::declval())); + +// Null-delimited strings, and the like. +template < typename CharT, + typename std::enable_if < + std::is_pointer::value&& + !std::is_array::value&& + std::is_integral::type>::value&& + sizeof(typename std::remove_pointer::type) == 1, + int >::type = 0 > +contiguous_bytes_input_adapter input_adapter(CharT b) +{ + auto length = std::strlen(reinterpret_cast(b)); + const auto* ptr = reinterpret_cast(b); + return input_adapter(ptr, ptr + length); +} + +template +auto input_adapter(T (&array)[N]) -> decltype(input_adapter(array, array + N)) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) +{ + return input_adapter(array, array + N); +} + +// This class only handles inputs of input_buffer_adapter type. +// It's required so that expressions like {ptr, len} can be implicitly cast +// to the correct adapter. +class span_input_adapter +{ + public: + template < typename CharT, + typename std::enable_if < + std::is_pointer::value&& + std::is_integral::type>::value&& + sizeof(typename std::remove_pointer::type) == 1, + int >::type = 0 > + span_input_adapter(CharT b, std::size_t l) + : ia(reinterpret_cast(b), reinterpret_cast(b) + l) {} + + template::iterator_category, std::random_access_iterator_tag>::value, + int>::type = 0> + span_input_adapter(IteratorType first, IteratorType last) + : ia(input_adapter(first, last)) {} + + contiguous_bytes_input_adapter&& get() + { + return std::move(ia); // NOLINT(hicpp-move-const-arg,performance-move-const-arg) + } + + private: + contiguous_bytes_input_adapter ia; +}; +} // namespace detail +} // namespace nlohmann + +// #include + + +#include +#include // string +#include // move +#include // vector + +// #include + +// #include + + +namespace nlohmann +{ + +/*! +@brief SAX interface + +This class describes the SAX interface used by @ref nlohmann::json::sax_parse. +Each function is called in different situations while the input is parsed. The +boolean return value informs the parser whether to continue processing the +input. +*/ +template +struct json_sax +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + + /*! + @brief a null value was read + @return whether parsing should proceed + */ + virtual bool null() = 0; + + /*! + @brief a boolean value was read + @param[in] val boolean value + @return whether parsing should proceed + */ + virtual bool boolean(bool val) = 0; + + /*! + @brief an integer number was read + @param[in] val integer value + @return whether parsing should proceed + */ + virtual bool number_integer(number_integer_t val) = 0; + + /*! + @brief an unsigned integer number was read + @param[in] val unsigned integer value + @return whether parsing should proceed + */ + virtual bool number_unsigned(number_unsigned_t val) = 0; + + /*! + @brief a floating-point number was read + @param[in] val floating-point value + @param[in] s raw token value + @return whether parsing should proceed + */ + virtual bool number_float(number_float_t val, const string_t& s) = 0; + + /*! + @brief a string value was read + @param[in] val string value + @return whether parsing should proceed + @note It is safe to move the passed string value. + */ + virtual bool string(string_t& val) = 0; + + /*! + @brief a binary value was read + @param[in] val binary value + @return whether parsing should proceed + @note It is safe to move the passed binary value. + */ + virtual bool binary(binary_t& val) = 0; + + /*! + @brief the beginning of an object was read + @param[in] elements number of object elements or -1 if unknown + @return whether parsing should proceed + @note binary formats may report the number of elements + */ + virtual bool start_object(std::size_t elements) = 0; + + /*! + @brief an object key was read + @param[in] val object key + @return whether parsing should proceed + @note It is safe to move the passed string. + */ + virtual bool key(string_t& val) = 0; + + /*! + @brief the end of an object was read + @return whether parsing should proceed + */ + virtual bool end_object() = 0; + + /*! + @brief the beginning of an array was read + @param[in] elements number of array elements or -1 if unknown + @return whether parsing should proceed + @note binary formats may report the number of elements + */ + virtual bool start_array(std::size_t elements) = 0; + + /*! + @brief the end of an array was read + @return whether parsing should proceed + */ + virtual bool end_array() = 0; + + /*! + @brief a parse error occurred + @param[in] position the position in the input where the error occurs + @param[in] last_token the last read token + @param[in] ex an exception object describing the error + @return whether parsing should proceed (must return false) + */ + virtual bool parse_error(std::size_t position, + const std::string& last_token, + const detail::exception& ex) = 0; + + json_sax() = default; + json_sax(const json_sax&) = default; + json_sax(json_sax&&) noexcept = default; + json_sax& operator=(const json_sax&) = default; + json_sax& operator=(json_sax&&) noexcept = default; + virtual ~json_sax() = default; +}; + + +namespace detail +{ +/*! +@brief SAX implementation to create a JSON value from SAX events + +This class implements the @ref json_sax interface and processes the SAX events +to create a JSON value which makes it basically a DOM parser. The structure or +hierarchy of the JSON value is managed by the stack `ref_stack` which contains +a pointer to the respective array or object for each recursion depth. + +After successful parsing, the value that is passed by reference to the +constructor contains the parsed value. + +@tparam BasicJsonType the JSON type +*/ +template +class json_sax_dom_parser +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + + /*! + @param[in,out] r reference to a JSON value that is manipulated while + parsing + @param[in] allow_exceptions_ whether parse errors yield exceptions + */ + explicit json_sax_dom_parser(BasicJsonType& r, const bool allow_exceptions_ = true) + : root(r), allow_exceptions(allow_exceptions_) + {} + + // make class move-only + json_sax_dom_parser(const json_sax_dom_parser&) = delete; + json_sax_dom_parser(json_sax_dom_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + json_sax_dom_parser& operator=(const json_sax_dom_parser&) = delete; + json_sax_dom_parser& operator=(json_sax_dom_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~json_sax_dom_parser() = default; + + bool null() + { + handle_value(nullptr); + return true; + } + + bool boolean(bool val) + { + handle_value(val); + return true; + } + + bool number_integer(number_integer_t val) + { + handle_value(val); + return true; + } + + bool number_unsigned(number_unsigned_t val) + { + handle_value(val); + return true; + } + + bool number_float(number_float_t val, const string_t& /*unused*/) + { + handle_value(val); + return true; + } + + bool string(string_t& val) + { + handle_value(val); + return true; + } + + bool binary(binary_t& val) + { + handle_value(std::move(val)); + return true; + } + + bool start_object(std::size_t len) + { + ref_stack.push_back(handle_value(BasicJsonType::value_t::object)); + + if (JSON_HEDLEY_UNLIKELY(len != static_cast(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, "excessive object size: " + std::to_string(len), *ref_stack.back())); + } + + return true; + } + + bool key(string_t& val) + { + // add null at given key and store the reference for later + object_element = &(ref_stack.back()->m_value.object->operator[](val)); + return true; + } + + bool end_object() + { + ref_stack.back()->set_parents(); + ref_stack.pop_back(); + return true; + } + + bool start_array(std::size_t len) + { + ref_stack.push_back(handle_value(BasicJsonType::value_t::array)); + + if (JSON_HEDLEY_UNLIKELY(len != static_cast(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, "excessive array size: " + std::to_string(len), *ref_stack.back())); + } + + return true; + } + + bool end_array() + { + ref_stack.back()->set_parents(); + ref_stack.pop_back(); + return true; + } + + template + bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, + const Exception& ex) + { + errored = true; + static_cast(ex); + if (allow_exceptions) + { + JSON_THROW(ex); + } + return false; + } + + constexpr bool is_errored() const + { + return errored; + } + + private: + /*! + @invariant If the ref stack is empty, then the passed value will be the new + root. + @invariant If the ref stack contains a value, then it is an array or an + object to which we can add elements + */ + template + JSON_HEDLEY_RETURNS_NON_NULL + BasicJsonType* handle_value(Value&& v) + { + if (ref_stack.empty()) + { + root = BasicJsonType(std::forward(v)); + return &root; + } + + JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object()); + + if (ref_stack.back()->is_array()) + { + ref_stack.back()->m_value.array->emplace_back(std::forward(v)); + return &(ref_stack.back()->m_value.array->back()); + } + + JSON_ASSERT(ref_stack.back()->is_object()); + JSON_ASSERT(object_element); + *object_element = BasicJsonType(std::forward(v)); + return object_element; + } + + /// the parsed JSON value + BasicJsonType& root; + /// stack to model hierarchy of values + std::vector ref_stack {}; + /// helper to hold the reference for the next object element + BasicJsonType* object_element = nullptr; + /// whether a syntax error occurred + bool errored = false; + /// whether to throw exceptions in case of errors + const bool allow_exceptions = true; +}; + +template +class json_sax_dom_callback_parser +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using parser_callback_t = typename BasicJsonType::parser_callback_t; + using parse_event_t = typename BasicJsonType::parse_event_t; + + json_sax_dom_callback_parser(BasicJsonType& r, + const parser_callback_t cb, + const bool allow_exceptions_ = true) + : root(r), callback(cb), allow_exceptions(allow_exceptions_) + { + keep_stack.push_back(true); + } + + // make class move-only + json_sax_dom_callback_parser(const json_sax_dom_callback_parser&) = delete; + json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + json_sax_dom_callback_parser& operator=(const json_sax_dom_callback_parser&) = delete; + json_sax_dom_callback_parser& operator=(json_sax_dom_callback_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~json_sax_dom_callback_parser() = default; + + bool null() + { + handle_value(nullptr); + return true; + } + + bool boolean(bool val) + { + handle_value(val); + return true; + } + + bool number_integer(number_integer_t val) + { + handle_value(val); + return true; + } + + bool number_unsigned(number_unsigned_t val) + { + handle_value(val); + return true; + } + + bool number_float(number_float_t val, const string_t& /*unused*/) + { + handle_value(val); + return true; + } + + bool string(string_t& val) + { + handle_value(val); + return true; + } + + bool binary(binary_t& val) + { + handle_value(std::move(val)); + return true; + } + + bool start_object(std::size_t len) + { + // check callback for object start + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::object_start, discarded); + keep_stack.push_back(keep); + + auto val = handle_value(BasicJsonType::value_t::object, true); + ref_stack.push_back(val.second); + + // check object limit + if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != static_cast(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, "excessive object size: " + std::to_string(len), *ref_stack.back())); + } + + return true; + } + + bool key(string_t& val) + { + BasicJsonType k = BasicJsonType(val); + + // check callback for key + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::key, k); + key_keep_stack.push_back(keep); + + // add discarded value at given key and store the reference for later + if (keep && ref_stack.back()) + { + object_element = &(ref_stack.back()->m_value.object->operator[](val) = discarded); + } + + return true; + } + + bool end_object() + { + if (ref_stack.back()) + { + if (!callback(static_cast(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back())) + { + // discard object + *ref_stack.back() = discarded; + } + else + { + ref_stack.back()->set_parents(); + } + } + + JSON_ASSERT(!ref_stack.empty()); + JSON_ASSERT(!keep_stack.empty()); + ref_stack.pop_back(); + keep_stack.pop_back(); + + if (!ref_stack.empty() && ref_stack.back() && ref_stack.back()->is_structured()) + { + // remove discarded value + for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it) + { + if (it->is_discarded()) + { + ref_stack.back()->erase(it); + break; + } + } + } + + return true; + } + + bool start_array(std::size_t len) + { + const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::array_start, discarded); + keep_stack.push_back(keep); + + auto val = handle_value(BasicJsonType::value_t::array, true); + ref_stack.push_back(val.second); + + // check array limit + if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != static_cast(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, "excessive array size: " + std::to_string(len), *ref_stack.back())); + } + + return true; + } + + bool end_array() + { + bool keep = true; + + if (ref_stack.back()) + { + keep = callback(static_cast(ref_stack.size()) - 1, parse_event_t::array_end, *ref_stack.back()); + if (keep) + { + ref_stack.back()->set_parents(); + } + else + { + // discard array + *ref_stack.back() = discarded; + } + } + + JSON_ASSERT(!ref_stack.empty()); + JSON_ASSERT(!keep_stack.empty()); + ref_stack.pop_back(); + keep_stack.pop_back(); + + // remove discarded value + if (!keep && !ref_stack.empty() && ref_stack.back()->is_array()) + { + ref_stack.back()->m_value.array->pop_back(); + } + + return true; + } + + template + bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, + const Exception& ex) + { + errored = true; + static_cast(ex); + if (allow_exceptions) + { + JSON_THROW(ex); + } + return false; + } + + constexpr bool is_errored() const + { + return errored; + } + + private: + /*! + @param[in] v value to add to the JSON value we build during parsing + @param[in] skip_callback whether we should skip calling the callback + function; this is required after start_array() and + start_object() SAX events, because otherwise we would call the + callback function with an empty array or object, respectively. + + @invariant If the ref stack is empty, then the passed value will be the new + root. + @invariant If the ref stack contains a value, then it is an array or an + object to which we can add elements + + @return pair of boolean (whether value should be kept) and pointer (to the + passed value in the ref_stack hierarchy; nullptr if not kept) + */ + template + std::pair handle_value(Value&& v, const bool skip_callback = false) + { + JSON_ASSERT(!keep_stack.empty()); + + // do not handle this value if we know it would be added to a discarded + // container + if (!keep_stack.back()) + { + return {false, nullptr}; + } + + // create value + auto value = BasicJsonType(std::forward(v)); + + // check callback + const bool keep = skip_callback || callback(static_cast(ref_stack.size()), parse_event_t::value, value); + + // do not handle this value if we just learnt it shall be discarded + if (!keep) + { + return {false, nullptr}; + } + + if (ref_stack.empty()) + { + root = std::move(value); + return {true, &root}; + } + + // skip this value if we already decided to skip the parent + // (https://github.com/nlohmann/json/issues/971#issuecomment-413678360) + if (!ref_stack.back()) + { + return {false, nullptr}; + } + + // we now only expect arrays and objects + JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object()); + + // array + if (ref_stack.back()->is_array()) + { + ref_stack.back()->m_value.array->emplace_back(std::move(value)); + return {true, &(ref_stack.back()->m_value.array->back())}; + } + + // object + JSON_ASSERT(ref_stack.back()->is_object()); + // check if we should store an element for the current key + JSON_ASSERT(!key_keep_stack.empty()); + const bool store_element = key_keep_stack.back(); + key_keep_stack.pop_back(); + + if (!store_element) + { + return {false, nullptr}; + } + + JSON_ASSERT(object_element); + *object_element = std::move(value); + return {true, object_element}; + } + + /// the parsed JSON value + BasicJsonType& root; + /// stack to model hierarchy of values + std::vector ref_stack {}; + /// stack to manage which values to keep + std::vector keep_stack {}; + /// stack to manage which object keys to keep + std::vector key_keep_stack {}; + /// helper to hold the reference for the next object element + BasicJsonType* object_element = nullptr; + /// whether a syntax error occurred + bool errored = false; + /// callback function + const parser_callback_t callback = nullptr; + /// whether to throw exceptions in case of errors + const bool allow_exceptions = true; + /// a discarded value for the callback + BasicJsonType discarded = BasicJsonType::value_t::discarded; +}; + +template +class json_sax_acceptor +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + + bool null() + { + return true; + } + + bool boolean(bool /*unused*/) + { + return true; + } + + bool number_integer(number_integer_t /*unused*/) + { + return true; + } + + bool number_unsigned(number_unsigned_t /*unused*/) + { + return true; + } + + bool number_float(number_float_t /*unused*/, const string_t& /*unused*/) + { + return true; + } + + bool string(string_t& /*unused*/) + { + return true; + } + + bool binary(binary_t& /*unused*/) + { + return true; + } + + bool start_object(std::size_t /*unused*/ = static_cast(-1)) + { + return true; + } + + bool key(string_t& /*unused*/) + { + return true; + } + + bool end_object() + { + return true; + } + + bool start_array(std::size_t /*unused*/ = static_cast(-1)) + { + return true; + } + + bool end_array() + { + return true; + } + + bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, const detail::exception& /*unused*/) + { + return false; + } +}; +} // namespace detail + +} // namespace nlohmann + +// #include + + +#include // array +#include // localeconv +#include // size_t +#include // snprintf +#include // strtof, strtod, strtold, strtoll, strtoull +#include // initializer_list +#include // char_traits, string +#include // move +#include // vector + +// #include + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +/////////// +// lexer // +/////////// + +template +class lexer_base +{ + public: + /// token types for the parser + enum class token_type + { + uninitialized, ///< indicating the scanner is uninitialized + literal_true, ///< the `true` literal + literal_false, ///< the `false` literal + literal_null, ///< the `null` literal + value_string, ///< a string -- use get_string() for actual value + value_unsigned, ///< an unsigned integer -- use get_number_unsigned() for actual value + value_integer, ///< a signed integer -- use get_number_integer() for actual value + value_float, ///< an floating point number -- use get_number_float() for actual value + begin_array, ///< the character for array begin `[` + begin_object, ///< the character for object begin `{` + end_array, ///< the character for array end `]` + end_object, ///< the character for object end `}` + name_separator, ///< the name separator `:` + value_separator, ///< the value separator `,` + parse_error, ///< indicating a parse error + end_of_input, ///< indicating the end of the input buffer + literal_or_value ///< a literal or the begin of a value (only for diagnostics) + }; + + /// return name of values of type token_type (only used for errors) + JSON_HEDLEY_RETURNS_NON_NULL + JSON_HEDLEY_CONST + static const char* token_type_name(const token_type t) noexcept + { + switch (t) + { + case token_type::uninitialized: + return ""; + case token_type::literal_true: + return "true literal"; + case token_type::literal_false: + return "false literal"; + case token_type::literal_null: + return "null literal"; + case token_type::value_string: + return "string literal"; + case token_type::value_unsigned: + case token_type::value_integer: + case token_type::value_float: + return "number literal"; + case token_type::begin_array: + return "'['"; + case token_type::begin_object: + return "'{'"; + case token_type::end_array: + return "']'"; + case token_type::end_object: + return "'}'"; + case token_type::name_separator: + return "':'"; + case token_type::value_separator: + return "','"; + case token_type::parse_error: + return ""; + case token_type::end_of_input: + return "end of input"; + case token_type::literal_or_value: + return "'[', '{', or a literal"; + // LCOV_EXCL_START + default: // catch non-enum values + return "unknown token"; + // LCOV_EXCL_STOP + } + } +}; +/*! +@brief lexical analysis + +This class organizes the lexical analysis during JSON deserialization. +*/ +template +class lexer : public lexer_base +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using char_type = typename InputAdapterType::char_type; + using char_int_type = typename std::char_traits::int_type; + + public: + using token_type = typename lexer_base::token_type; + + explicit lexer(InputAdapterType&& adapter, bool ignore_comments_ = false) noexcept + : ia(std::move(adapter)) + , ignore_comments(ignore_comments_) + , decimal_point_char(static_cast(get_decimal_point())) + {} + + // delete because of pointer members + lexer(const lexer&) = delete; + lexer(lexer&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + lexer& operator=(lexer&) = delete; + lexer& operator=(lexer&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~lexer() = default; + + private: + ///////////////////// + // locales + ///////////////////// + + /// return the locale-dependent decimal point + JSON_HEDLEY_PURE + static char get_decimal_point() noexcept + { + const auto* loc = localeconv(); + JSON_ASSERT(loc != nullptr); + return (loc->decimal_point == nullptr) ? '.' : *(loc->decimal_point); + } + + ///////////////////// + // scan functions + ///////////////////// + + /*! + @brief get codepoint from 4 hex characters following `\u` + + For input "\u c1 c2 c3 c4" the codepoint is: + (c1 * 0x1000) + (c2 * 0x0100) + (c3 * 0x0010) + c4 + = (c1 << 12) + (c2 << 8) + (c3 << 4) + (c4 << 0) + + Furthermore, the possible characters '0'..'9', 'A'..'F', and 'a'..'f' + must be converted to the integers 0x0..0x9, 0xA..0xF, 0xA..0xF, resp. The + conversion is done by subtracting the offset (0x30, 0x37, and 0x57) + between the ASCII value of the character and the desired integer value. + + @return codepoint (0x0000..0xFFFF) or -1 in case of an error (e.g. EOF or + non-hex character) + */ + int get_codepoint() + { + // this function only makes sense after reading `\u` + JSON_ASSERT(current == 'u'); + int codepoint = 0; + + const auto factors = { 12u, 8u, 4u, 0u }; + for (const auto factor : factors) + { + get(); + + if (current >= '0' && current <= '9') + { + codepoint += static_cast((static_cast(current) - 0x30u) << factor); + } + else if (current >= 'A' && current <= 'F') + { + codepoint += static_cast((static_cast(current) - 0x37u) << factor); + } + else if (current >= 'a' && current <= 'f') + { + codepoint += static_cast((static_cast(current) - 0x57u) << factor); + } + else + { + return -1; + } + } + + JSON_ASSERT(0x0000 <= codepoint && codepoint <= 0xFFFF); + return codepoint; + } + + /*! + @brief check if the next byte(s) are inside a given range + + Adds the current byte and, for each passed range, reads a new byte and + checks if it is inside the range. If a violation was detected, set up an + error message and return false. Otherwise, return true. + + @param[in] ranges list of integers; interpreted as list of pairs of + inclusive lower and upper bound, respectively + + @pre The passed list @a ranges must have 2, 4, or 6 elements; that is, + 1, 2, or 3 pairs. This precondition is enforced by an assertion. + + @return true if and only if no range violation was detected + */ + bool next_byte_in_range(std::initializer_list ranges) + { + JSON_ASSERT(ranges.size() == 2 || ranges.size() == 4 || ranges.size() == 6); + add(current); + + for (auto range = ranges.begin(); range != ranges.end(); ++range) + { + get(); + if (JSON_HEDLEY_LIKELY(*range <= current && current <= *(++range))) + { + add(current); + } + else + { + error_message = "invalid string: ill-formed UTF-8 byte"; + return false; + } + } + + return true; + } + + /*! + @brief scan a string literal + + This function scans a string according to Sect. 7 of RFC 8259. While + scanning, bytes are escaped and copied into buffer token_buffer. Then the + function returns successfully, token_buffer is *not* null-terminated (as it + may contain \0 bytes), and token_buffer.size() is the number of bytes in the + string. + + @return token_type::value_string if string could be successfully scanned, + token_type::parse_error otherwise + + @note In case of errors, variable error_message contains a textual + description. + */ + token_type scan_string() + { + // reset token_buffer (ignore opening quote) + reset(); + + // we entered the function by reading an open quote + JSON_ASSERT(current == '\"'); + + while (true) + { + // get next character + switch (get()) + { + // end of file while parsing string + case std::char_traits::eof(): + { + error_message = "invalid string: missing closing quote"; + return token_type::parse_error; + } + + // closing quote + case '\"': + { + return token_type::value_string; + } + + // escapes + case '\\': + { + switch (get()) + { + // quotation mark + case '\"': + add('\"'); + break; + // reverse solidus + case '\\': + add('\\'); + break; + // solidus + case '/': + add('/'); + break; + // backspace + case 'b': + add('\b'); + break; + // form feed + case 'f': + add('\f'); + break; + // line feed + case 'n': + add('\n'); + break; + // carriage return + case 'r': + add('\r'); + break; + // tab + case 't': + add('\t'); + break; + + // unicode escapes + case 'u': + { + const int codepoint1 = get_codepoint(); + int codepoint = codepoint1; // start with codepoint1 + + if (JSON_HEDLEY_UNLIKELY(codepoint1 == -1)) + { + error_message = "invalid string: '\\u' must be followed by 4 hex digits"; + return token_type::parse_error; + } + + // check if code point is a high surrogate + if (0xD800 <= codepoint1 && codepoint1 <= 0xDBFF) + { + // expect next \uxxxx entry + if (JSON_HEDLEY_LIKELY(get() == '\\' && get() == 'u')) + { + const int codepoint2 = get_codepoint(); + + if (JSON_HEDLEY_UNLIKELY(codepoint2 == -1)) + { + error_message = "invalid string: '\\u' must be followed by 4 hex digits"; + return token_type::parse_error; + } + + // check if codepoint2 is a low surrogate + if (JSON_HEDLEY_LIKELY(0xDC00 <= codepoint2 && codepoint2 <= 0xDFFF)) + { + // overwrite codepoint + codepoint = static_cast( + // high surrogate occupies the most significant 22 bits + (static_cast(codepoint1) << 10u) + // low surrogate occupies the least significant 15 bits + + static_cast(codepoint2) + // there is still the 0xD800, 0xDC00 and 0x10000 noise + // in the result, so we have to subtract with: + // (0xD800 << 10) + DC00 - 0x10000 = 0x35FDC00 + - 0x35FDC00u); + } + else + { + error_message = "invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF"; + return token_type::parse_error; + } + } + else + { + error_message = "invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF"; + return token_type::parse_error; + } + } + else + { + if (JSON_HEDLEY_UNLIKELY(0xDC00 <= codepoint1 && codepoint1 <= 0xDFFF)) + { + error_message = "invalid string: surrogate U+DC00..U+DFFF must follow U+D800..U+DBFF"; + return token_type::parse_error; + } + } + + // result of the above calculation yields a proper codepoint + JSON_ASSERT(0x00 <= codepoint && codepoint <= 0x10FFFF); + + // translate codepoint into bytes + if (codepoint < 0x80) + { + // 1-byte characters: 0xxxxxxx (ASCII) + add(static_cast(codepoint)); + } + else if (codepoint <= 0x7FF) + { + // 2-byte characters: 110xxxxx 10xxxxxx + add(static_cast(0xC0u | (static_cast(codepoint) >> 6u))); + add(static_cast(0x80u | (static_cast(codepoint) & 0x3Fu))); + } + else if (codepoint <= 0xFFFF) + { + // 3-byte characters: 1110xxxx 10xxxxxx 10xxxxxx + add(static_cast(0xE0u | (static_cast(codepoint) >> 12u))); + add(static_cast(0x80u | ((static_cast(codepoint) >> 6u) & 0x3Fu))); + add(static_cast(0x80u | (static_cast(codepoint) & 0x3Fu))); + } + else + { + // 4-byte characters: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + add(static_cast(0xF0u | (static_cast(codepoint) >> 18u))); + add(static_cast(0x80u | ((static_cast(codepoint) >> 12u) & 0x3Fu))); + add(static_cast(0x80u | ((static_cast(codepoint) >> 6u) & 0x3Fu))); + add(static_cast(0x80u | (static_cast(codepoint) & 0x3Fu))); + } + + break; + } + + // other characters after escape + default: + error_message = "invalid string: forbidden character after backslash"; + return token_type::parse_error; + } + + break; + } + + // invalid control characters + case 0x00: + { + error_message = "invalid string: control character U+0000 (NUL) must be escaped to \\u0000"; + return token_type::parse_error; + } + + case 0x01: + { + error_message = "invalid string: control character U+0001 (SOH) must be escaped to \\u0001"; + return token_type::parse_error; + } + + case 0x02: + { + error_message = "invalid string: control character U+0002 (STX) must be escaped to \\u0002"; + return token_type::parse_error; + } + + case 0x03: + { + error_message = "invalid string: control character U+0003 (ETX) must be escaped to \\u0003"; + return token_type::parse_error; + } + + case 0x04: + { + error_message = "invalid string: control character U+0004 (EOT) must be escaped to \\u0004"; + return token_type::parse_error; + } + + case 0x05: + { + error_message = "invalid string: control character U+0005 (ENQ) must be escaped to \\u0005"; + return token_type::parse_error; + } + + case 0x06: + { + error_message = "invalid string: control character U+0006 (ACK) must be escaped to \\u0006"; + return token_type::parse_error; + } + + case 0x07: + { + error_message = "invalid string: control character U+0007 (BEL) must be escaped to \\u0007"; + return token_type::parse_error; + } + + case 0x08: + { + error_message = "invalid string: control character U+0008 (BS) must be escaped to \\u0008 or \\b"; + return token_type::parse_error; + } + + case 0x09: + { + error_message = "invalid string: control character U+0009 (HT) must be escaped to \\u0009 or \\t"; + return token_type::parse_error; + } + + case 0x0A: + { + error_message = "invalid string: control character U+000A (LF) must be escaped to \\u000A or \\n"; + return token_type::parse_error; + } + + case 0x0B: + { + error_message = "invalid string: control character U+000B (VT) must be escaped to \\u000B"; + return token_type::parse_error; + } + + case 0x0C: + { + error_message = "invalid string: control character U+000C (FF) must be escaped to \\u000C or \\f"; + return token_type::parse_error; + } + + case 0x0D: + { + error_message = "invalid string: control character U+000D (CR) must be escaped to \\u000D or \\r"; + return token_type::parse_error; + } + + case 0x0E: + { + error_message = "invalid string: control character U+000E (SO) must be escaped to \\u000E"; + return token_type::parse_error; + } + + case 0x0F: + { + error_message = "invalid string: control character U+000F (SI) must be escaped to \\u000F"; + return token_type::parse_error; + } + + case 0x10: + { + error_message = "invalid string: control character U+0010 (DLE) must be escaped to \\u0010"; + return token_type::parse_error; + } + + case 0x11: + { + error_message = "invalid string: control character U+0011 (DC1) must be escaped to \\u0011"; + return token_type::parse_error; + } + + case 0x12: + { + error_message = "invalid string: control character U+0012 (DC2) must be escaped to \\u0012"; + return token_type::parse_error; + } + + case 0x13: + { + error_message = "invalid string: control character U+0013 (DC3) must be escaped to \\u0013"; + return token_type::parse_error; + } + + case 0x14: + { + error_message = "invalid string: control character U+0014 (DC4) must be escaped to \\u0014"; + return token_type::parse_error; + } + + case 0x15: + { + error_message = "invalid string: control character U+0015 (NAK) must be escaped to \\u0015"; + return token_type::parse_error; + } + + case 0x16: + { + error_message = "invalid string: control character U+0016 (SYN) must be escaped to \\u0016"; + return token_type::parse_error; + } + + case 0x17: + { + error_message = "invalid string: control character U+0017 (ETB) must be escaped to \\u0017"; + return token_type::parse_error; + } + + case 0x18: + { + error_message = "invalid string: control character U+0018 (CAN) must be escaped to \\u0018"; + return token_type::parse_error; + } + + case 0x19: + { + error_message = "invalid string: control character U+0019 (EM) must be escaped to \\u0019"; + return token_type::parse_error; + } + + case 0x1A: + { + error_message = "invalid string: control character U+001A (SUB) must be escaped to \\u001A"; + return token_type::parse_error; + } + + case 0x1B: + { + error_message = "invalid string: control character U+001B (ESC) must be escaped to \\u001B"; + return token_type::parse_error; + } + + case 0x1C: + { + error_message = "invalid string: control character U+001C (FS) must be escaped to \\u001C"; + return token_type::parse_error; + } + + case 0x1D: + { + error_message = "invalid string: control character U+001D (GS) must be escaped to \\u001D"; + return token_type::parse_error; + } + + case 0x1E: + { + error_message = "invalid string: control character U+001E (RS) must be escaped to \\u001E"; + return token_type::parse_error; + } + + case 0x1F: + { + error_message = "invalid string: control character U+001F (US) must be escaped to \\u001F"; + return token_type::parse_error; + } + + // U+0020..U+007F (except U+0022 (quote) and U+005C (backspace)) + case 0x20: + case 0x21: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2A: + case 0x2B: + case 0x2C: + case 0x2D: + case 0x2E: + case 0x2F: + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x3A: + case 0x3B: + case 0x3C: + case 0x3D: + case 0x3E: + case 0x3F: + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: + case 0x59: + case 0x5A: + case 0x5B: + case 0x5D: + case 0x5E: + case 0x5F: + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + case 0x78: + case 0x79: + case 0x7A: + case 0x7B: + case 0x7C: + case 0x7D: + case 0x7E: + case 0x7F: + { + add(current); + break; + } + + // U+0080..U+07FF: bytes C2..DF 80..BF + case 0xC2: + case 0xC3: + case 0xC4: + case 0xC5: + case 0xC6: + case 0xC7: + case 0xC8: + case 0xC9: + case 0xCA: + case 0xCB: + case 0xCC: + case 0xCD: + case 0xCE: + case 0xCF: + case 0xD0: + case 0xD1: + case 0xD2: + case 0xD3: + case 0xD4: + case 0xD5: + case 0xD6: + case 0xD7: + case 0xD8: + case 0xD9: + case 0xDA: + case 0xDB: + case 0xDC: + case 0xDD: + case 0xDE: + case 0xDF: + { + if (JSON_HEDLEY_UNLIKELY(!next_byte_in_range({0x80, 0xBF}))) + { + return token_type::parse_error; + } + break; + } + + // U+0800..U+0FFF: bytes E0 A0..BF 80..BF + case 0xE0: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0xA0, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+1000..U+CFFF: bytes E1..EC 80..BF 80..BF + // U+E000..U+FFFF: bytes EE..EF 80..BF 80..BF + case 0xE1: + case 0xE2: + case 0xE3: + case 0xE4: + case 0xE5: + case 0xE6: + case 0xE7: + case 0xE8: + case 0xE9: + case 0xEA: + case 0xEB: + case 0xEC: + case 0xEE: + case 0xEF: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+D000..U+D7FF: bytes ED 80..9F 80..BF + case 0xED: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0x9F, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+10000..U+3FFFF F0 90..BF 80..BF 80..BF + case 0xF0: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x90, 0xBF, 0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+40000..U+FFFFF F1..F3 80..BF 80..BF 80..BF + case 0xF1: + case 0xF2: + case 0xF3: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+100000..U+10FFFF F4 80..8F 80..BF 80..BF + case 0xF4: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0x8F, 0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // remaining bytes (80..C1 and F5..FF) are ill-formed + default: + { + error_message = "invalid string: ill-formed UTF-8 byte"; + return token_type::parse_error; + } + } + } + } + + /*! + * @brief scan a comment + * @return whether comment could be scanned successfully + */ + bool scan_comment() + { + switch (get()) + { + // single-line comments skip input until a newline or EOF is read + case '/': + { + while (true) + { + switch (get()) + { + case '\n': + case '\r': + case std::char_traits::eof(): + case '\0': + return true; + + default: + break; + } + } + } + + // multi-line comments skip input until */ is read + case '*': + { + while (true) + { + switch (get()) + { + case std::char_traits::eof(): + case '\0': + { + error_message = "invalid comment; missing closing '*/'"; + return false; + } + + case '*': + { + switch (get()) + { + case '/': + return true; + + default: + { + unget(); + continue; + } + } + } + + default: + continue; + } + } + } + + // unexpected character after reading '/' + default: + { + error_message = "invalid comment; expecting '/' or '*' after '/'"; + return false; + } + } + } + + JSON_HEDLEY_NON_NULL(2) + static void strtof(float& f, const char* str, char** endptr) noexcept + { + f = std::strtof(str, endptr); + } + + JSON_HEDLEY_NON_NULL(2) + static void strtof(double& f, const char* str, char** endptr) noexcept + { + f = std::strtod(str, endptr); + } + + JSON_HEDLEY_NON_NULL(2) + static void strtof(long double& f, const char* str, char** endptr) noexcept + { + f = std::strtold(str, endptr); + } + + /*! + @brief scan a number literal + + This function scans a string according to Sect. 6 of RFC 8259. + + The function is realized with a deterministic finite state machine derived + from the grammar described in RFC 8259. Starting in state "init", the + input is read and used to determined the next state. Only state "done" + accepts the number. State "error" is a trap state to model errors. In the + table below, "anything" means any character but the ones listed before. + + state | 0 | 1-9 | e E | + | - | . | anything + ---------|----------|----------|----------|---------|---------|----------|----------- + init | zero | any1 | [error] | [error] | minus | [error] | [error] + minus | zero | any1 | [error] | [error] | [error] | [error] | [error] + zero | done | done | exponent | done | done | decimal1 | done + any1 | any1 | any1 | exponent | done | done | decimal1 | done + decimal1 | decimal2 | decimal2 | [error] | [error] | [error] | [error] | [error] + decimal2 | decimal2 | decimal2 | exponent | done | done | done | done + exponent | any2 | any2 | [error] | sign | sign | [error] | [error] + sign | any2 | any2 | [error] | [error] | [error] | [error] | [error] + any2 | any2 | any2 | done | done | done | done | done + + The state machine is realized with one label per state (prefixed with + "scan_number_") and `goto` statements between them. The state machine + contains cycles, but any cycle can be left when EOF is read. Therefore, + the function is guaranteed to terminate. + + During scanning, the read bytes are stored in token_buffer. This string is + then converted to a signed integer, an unsigned integer, or a + floating-point number. + + @return token_type::value_unsigned, token_type::value_integer, or + token_type::value_float if number could be successfully scanned, + token_type::parse_error otherwise + + @note The scanner is independent of the current locale. Internally, the + locale's decimal point is used instead of `.` to work with the + locale-dependent converters. + */ + token_type scan_number() // lgtm [cpp/use-of-goto] + { + // reset token_buffer to store the number's bytes + reset(); + + // the type of the parsed number; initially set to unsigned; will be + // changed if minus sign, decimal point or exponent is read + token_type number_type = token_type::value_unsigned; + + // state (init): we just found out we need to scan a number + switch (current) + { + case '-': + { + add(current); + goto scan_number_minus; + } + + case '0': + { + add(current); + goto scan_number_zero; + } + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any1; + } + + // all other characters are rejected outside scan_number() + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + +scan_number_minus: + // state: we just parsed a leading minus sign + number_type = token_type::value_integer; + switch (get()) + { + case '0': + { + add(current); + goto scan_number_zero; + } + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any1; + } + + default: + { + error_message = "invalid number; expected digit after '-'"; + return token_type::parse_error; + } + } + +scan_number_zero: + // state: we just parse a zero (maybe with a leading minus sign) + switch (get()) + { + case '.': + { + add(decimal_point_char); + goto scan_number_decimal1; + } + + case 'e': + case 'E': + { + add(current); + goto scan_number_exponent; + } + + default: + goto scan_number_done; + } + +scan_number_any1: + // state: we just parsed a number 0-9 (maybe with a leading minus sign) + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any1; + } + + case '.': + { + add(decimal_point_char); + goto scan_number_decimal1; + } + + case 'e': + case 'E': + { + add(current); + goto scan_number_exponent; + } + + default: + goto scan_number_done; + } + +scan_number_decimal1: + // state: we just parsed a decimal point + number_type = token_type::value_float; + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_decimal2; + } + + default: + { + error_message = "invalid number; expected digit after '.'"; + return token_type::parse_error; + } + } + +scan_number_decimal2: + // we just parsed at least one number after a decimal point + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_decimal2; + } + + case 'e': + case 'E': + { + add(current); + goto scan_number_exponent; + } + + default: + goto scan_number_done; + } + +scan_number_exponent: + // we just parsed an exponent + number_type = token_type::value_float; + switch (get()) + { + case '+': + case '-': + { + add(current); + goto scan_number_sign; + } + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any2; + } + + default: + { + error_message = + "invalid number; expected '+', '-', or digit after exponent"; + return token_type::parse_error; + } + } + +scan_number_sign: + // we just parsed an exponent sign + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any2; + } + + default: + { + error_message = "invalid number; expected digit after exponent sign"; + return token_type::parse_error; + } + } + +scan_number_any2: + // we just parsed a number after the exponent or exponent sign + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any2; + } + + default: + goto scan_number_done; + } + +scan_number_done: + // unget the character after the number (we only read it to know that + // we are done scanning a number) + unget(); + + char* endptr = nullptr; // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + errno = 0; + + // try to parse integers first and fall back to floats + if (number_type == token_type::value_unsigned) + { + const auto x = std::strtoull(token_buffer.data(), &endptr, 10); + + // we checked the number format before + JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size()); + + if (errno == 0) + { + value_unsigned = static_cast(x); + if (value_unsigned == x) + { + return token_type::value_unsigned; + } + } + } + else if (number_type == token_type::value_integer) + { + const auto x = std::strtoll(token_buffer.data(), &endptr, 10); + + // we checked the number format before + JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size()); + + if (errno == 0) + { + value_integer = static_cast(x); + if (value_integer == x) + { + return token_type::value_integer; + } + } + } + + // this code is reached if we parse a floating-point number or if an + // integer conversion above failed + strtof(value_float, token_buffer.data(), &endptr); + + // we checked the number format before + JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size()); + + return token_type::value_float; + } + + /*! + @param[in] literal_text the literal text to expect + @param[in] length the length of the passed literal text + @param[in] return_type the token type to return on success + */ + JSON_HEDLEY_NON_NULL(2) + token_type scan_literal(const char_type* literal_text, const std::size_t length, + token_type return_type) + { + JSON_ASSERT(std::char_traits::to_char_type(current) == literal_text[0]); + for (std::size_t i = 1; i < length; ++i) + { + if (JSON_HEDLEY_UNLIKELY(std::char_traits::to_char_type(get()) != literal_text[i])) + { + error_message = "invalid literal"; + return token_type::parse_error; + } + } + return return_type; + } + + ///////////////////// + // input management + ///////////////////// + + /// reset token_buffer; current character is beginning of token + void reset() noexcept + { + token_buffer.clear(); + token_string.clear(); + token_string.push_back(std::char_traits::to_char_type(current)); + } + + /* + @brief get next character from the input + + This function provides the interface to the used input adapter. It does + not throw in case the input reached EOF, but returns a + `std::char_traits::eof()` in that case. Stores the scanned characters + for use in error messages. + + @return character read from the input + */ + char_int_type get() + { + ++position.chars_read_total; + ++position.chars_read_current_line; + + if (next_unget) + { + // just reset the next_unget variable and work with current + next_unget = false; + } + else + { + current = ia.get_character(); + } + + if (JSON_HEDLEY_LIKELY(current != std::char_traits::eof())) + { + token_string.push_back(std::char_traits::to_char_type(current)); + } + + if (current == '\n') + { + ++position.lines_read; + position.chars_read_current_line = 0; + } + + return current; + } + + /*! + @brief unget current character (read it again on next get) + + We implement unget by setting variable next_unget to true. The input is not + changed - we just simulate ungetting by modifying chars_read_total, + chars_read_current_line, and token_string. The next call to get() will + behave as if the unget character is read again. + */ + void unget() + { + next_unget = true; + + --position.chars_read_total; + + // in case we "unget" a newline, we have to also decrement the lines_read + if (position.chars_read_current_line == 0) + { + if (position.lines_read > 0) + { + --position.lines_read; + } + } + else + { + --position.chars_read_current_line; + } + + if (JSON_HEDLEY_LIKELY(current != std::char_traits::eof())) + { + JSON_ASSERT(!token_string.empty()); + token_string.pop_back(); + } + } + + /// add a character to token_buffer + void add(char_int_type c) + { + token_buffer.push_back(static_cast(c)); + } + + public: + ///////////////////// + // value getters + ///////////////////// + + /// return integer value + constexpr number_integer_t get_number_integer() const noexcept + { + return value_integer; + } + + /// return unsigned integer value + constexpr number_unsigned_t get_number_unsigned() const noexcept + { + return value_unsigned; + } + + /// return floating-point value + constexpr number_float_t get_number_float() const noexcept + { + return value_float; + } + + /// return current string value (implicitly resets the token; useful only once) + string_t& get_string() + { + return token_buffer; + } + + ///////////////////// + // diagnostics + ///////////////////// + + /// return position of last read token + constexpr position_t get_position() const noexcept + { + return position; + } + + /// return the last read token (for errors only). Will never contain EOF + /// (an arbitrary value that is not a valid char value, often -1), because + /// 255 may legitimately occur. May contain NUL, which should be escaped. + std::string get_token_string() const + { + // escape control characters + std::string result; + for (const auto c : token_string) + { + if (static_cast(c) <= '\x1F') + { + // escape control characters + std::array cs{{}}; + static_cast((std::snprintf)(cs.data(), cs.size(), "", static_cast(c))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + result += cs.data(); + } + else + { + // add character as is + result.push_back(static_cast(c)); + } + } + + return result; + } + + /// return syntax error message + JSON_HEDLEY_RETURNS_NON_NULL + constexpr const char* get_error_message() const noexcept + { + return error_message; + } + + ///////////////////// + // actual scanner + ///////////////////// + + /*! + @brief skip the UTF-8 byte order mark + @return true iff there is no BOM or the correct BOM has been skipped + */ + bool skip_bom() + { + if (get() == 0xEF) + { + // check if we completely parse the BOM + return get() == 0xBB && get() == 0xBF; + } + + // the first character is not the beginning of the BOM; unget it to + // process is later + unget(); + return true; + } + + void skip_whitespace() + { + do + { + get(); + } + while (current == ' ' || current == '\t' || current == '\n' || current == '\r'); + } + + token_type scan() + { + // initially, skip the BOM + if (position.chars_read_total == 0 && !skip_bom()) + { + error_message = "invalid BOM; must be 0xEF 0xBB 0xBF if given"; + return token_type::parse_error; + } + + // read next character and ignore whitespace + skip_whitespace(); + + // ignore comments + while (ignore_comments && current == '/') + { + if (!scan_comment()) + { + return token_type::parse_error; + } + + // skip following whitespace + skip_whitespace(); + } + + switch (current) + { + // structural characters + case '[': + return token_type::begin_array; + case ']': + return token_type::end_array; + case '{': + return token_type::begin_object; + case '}': + return token_type::end_object; + case ':': + return token_type::name_separator; + case ',': + return token_type::value_separator; + + // literals + case 't': + { + std::array true_literal = {{static_cast('t'), static_cast('r'), static_cast('u'), static_cast('e')}}; + return scan_literal(true_literal.data(), true_literal.size(), token_type::literal_true); + } + case 'f': + { + std::array false_literal = {{static_cast('f'), static_cast('a'), static_cast('l'), static_cast('s'), static_cast('e')}}; + return scan_literal(false_literal.data(), false_literal.size(), token_type::literal_false); + } + case 'n': + { + std::array null_literal = {{static_cast('n'), static_cast('u'), static_cast('l'), static_cast('l')}}; + return scan_literal(null_literal.data(), null_literal.size(), token_type::literal_null); + } + + // string + case '\"': + return scan_string(); + + // number + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + return scan_number(); + + // end of input (the null byte is needed when parsing from + // string literals) + case '\0': + case std::char_traits::eof(): + return token_type::end_of_input; + + // error + default: + error_message = "invalid literal"; + return token_type::parse_error; + } + } + + private: + /// input adapter + InputAdapterType ia; + + /// whether comments should be ignored (true) or signaled as errors (false) + const bool ignore_comments = false; + + /// the current character + char_int_type current = std::char_traits::eof(); + + /// whether the next get() call should just return current + bool next_unget = false; + + /// the start position of the current token + position_t position {}; + + /// raw input token string (for error messages) + std::vector token_string {}; + + /// buffer for variable-length tokens (numbers, strings) + string_t token_buffer {}; + + /// a description of occurred lexer errors + const char* error_message = ""; + + // number values + number_integer_t value_integer = 0; + number_unsigned_t value_unsigned = 0; + number_float_t value_float = 0; + + /// the decimal point + const char_int_type decimal_point_char = '.'; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +#include // size_t +#include // declval +#include // string + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +template +using null_function_t = decltype(std::declval().null()); + +template +using boolean_function_t = + decltype(std::declval().boolean(std::declval())); + +template +using number_integer_function_t = + decltype(std::declval().number_integer(std::declval())); + +template +using number_unsigned_function_t = + decltype(std::declval().number_unsigned(std::declval())); + +template +using number_float_function_t = decltype(std::declval().number_float( + std::declval(), std::declval())); + +template +using string_function_t = + decltype(std::declval().string(std::declval())); + +template +using binary_function_t = + decltype(std::declval().binary(std::declval())); + +template +using start_object_function_t = + decltype(std::declval().start_object(std::declval())); + +template +using key_function_t = + decltype(std::declval().key(std::declval())); + +template +using end_object_function_t = decltype(std::declval().end_object()); + +template +using start_array_function_t = + decltype(std::declval().start_array(std::declval())); + +template +using end_array_function_t = decltype(std::declval().end_array()); + +template +using parse_error_function_t = decltype(std::declval().parse_error( + std::declval(), std::declval(), + std::declval())); + +template +struct is_sax +{ + private: + static_assert(is_basic_json::value, + "BasicJsonType must be of type basic_json<...>"); + + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using exception_t = typename BasicJsonType::exception; + + public: + static constexpr bool value = + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value && + is_detected_exact::value; +}; + +template +struct is_sax_static_asserts +{ + private: + static_assert(is_basic_json::value, + "BasicJsonType must be of type basic_json<...>"); + + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using exception_t = typename BasicJsonType::exception; + + public: + static_assert(is_detected_exact::value, + "Missing/invalid function: bool null()"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool boolean(bool)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool boolean(bool)"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool number_integer(number_integer_t)"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool number_unsigned(number_unsigned_t)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool number_float(number_float_t, const string_t&)"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool string(string_t&)"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool binary(binary_t&)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool start_object(std::size_t)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool key(string_t&)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool end_object()"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool start_array(std::size_t)"); + static_assert(is_detected_exact::value, + "Missing/invalid function: bool end_array()"); + static_assert( + is_detected_exact::value, + "Missing/invalid function: bool parse_error(std::size_t, const " + "std::string&, const exception&)"); +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ + +/// how to treat CBOR tags +enum class cbor_tag_handler_t +{ + error, ///< throw a parse_error exception in case of a tag + ignore, ///< ignore tags + store ///< store tags as binary type +}; + +/*! +@brief determine system byte order + +@return true if and only if system's byte order is little endian + +@note from https://stackoverflow.com/a/1001328/266378 +*/ +static inline bool little_endianness(int num = 1) noexcept +{ + return *reinterpret_cast(&num) == 1; +} + + +/////////////////// +// binary reader // +/////////////////// + +/*! +@brief deserialization of CBOR, MessagePack, and UBJSON values +*/ +template> +class binary_reader +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using json_sax_t = SAX; + using char_type = typename InputAdapterType::char_type; + using char_int_type = typename std::char_traits::int_type; + + public: + /*! + @brief create a binary reader + + @param[in] adapter input adapter to read from + */ + explicit binary_reader(InputAdapterType&& adapter) noexcept : ia(std::move(adapter)) + { + (void)detail::is_sax_static_asserts {}; + } + + // make class move-only + binary_reader(const binary_reader&) = delete; + binary_reader(binary_reader&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + binary_reader& operator=(const binary_reader&) = delete; + binary_reader& operator=(binary_reader&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~binary_reader() = default; + + /*! + @param[in] format the binary format to parse + @param[in] sax_ a SAX event processor + @param[in] strict whether to expect the input to be consumed completed + @param[in] tag_handler how to treat CBOR tags + + @return whether parsing was successful + */ + JSON_HEDLEY_NON_NULL(3) + bool sax_parse(const input_format_t format, + json_sax_t* sax_, + const bool strict = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + sax = sax_; + bool result = false; + + switch (format) + { + case input_format_t::bson: + result = parse_bson_internal(); + break; + + case input_format_t::cbor: + result = parse_cbor_internal(true, tag_handler); + break; + + case input_format_t::msgpack: + result = parse_msgpack_internal(); + break; + + case input_format_t::ubjson: + result = parse_ubjson_internal(); + break; + + case input_format_t::json: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + + // strict mode: next byte must be EOF + if (result && strict) + { + if (format == input_format_t::ubjson) + { + get_ignore_noop(); + } + else + { + get(); + } + + if (JSON_HEDLEY_UNLIKELY(current != std::char_traits::eof())) + { + return sax->parse_error(chars_read, get_token_string(), + parse_error::create(110, chars_read, exception_message(format, "expected end of input; last byte: 0x" + get_token_string(), "value"), BasicJsonType())); + } + } + + return result; + } + + private: + ////////// + // BSON // + ////////// + + /*! + @brief Reads in a BSON-object and passes it to the SAX-parser. + @return whether a valid BSON-value was passed to the SAX parser + */ + bool parse_bson_internal() + { + std::int32_t document_size{}; + get_number(input_format_t::bson, document_size); + + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(static_cast(-1)))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(/*is_array*/false))) + { + return false; + } + + return sax->end_object(); + } + + /*! + @brief Parses a C-style string from the BSON input. + @param[in,out] result A reference to the string variable where the read + string is to be stored. + @return `true` if the \x00-byte indicating the end of the string was + encountered before the EOF; false` indicates an unexpected EOF. + */ + bool get_bson_cstr(string_t& result) + { + auto out = std::back_inserter(result); + while (true) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, "cstring"))) + { + return false; + } + if (current == 0x00) + { + return true; + } + *out++ = static_cast(current); + } + } + + /*! + @brief Parses a zero-terminated string of length @a len from the BSON + input. + @param[in] len The length (including the zero-byte at the end) of the + string to be read. + @param[in,out] result A reference to the string variable where the read + string is to be stored. + @tparam NumberType The type of the length @a len + @pre len >= 1 + @return `true` if the string was successfully parsed + */ + template + bool get_bson_string(const NumberType len, string_t& result) + { + if (JSON_HEDLEY_UNLIKELY(len < 1)) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::bson, "string length must be at least 1, is " + std::to_string(len), "string"), BasicJsonType())); + } + + return get_string(input_format_t::bson, len - static_cast(1), result) && get() != std::char_traits::eof(); + } + + /*! + @brief Parses a byte array input of length @a len from the BSON input. + @param[in] len The length of the byte array to be read. + @param[in,out] result A reference to the binary variable where the read + array is to be stored. + @tparam NumberType The type of the length @a len + @pre len >= 0 + @return `true` if the byte array was successfully parsed + */ + template + bool get_bson_binary(const NumberType len, binary_t& result) + { + if (JSON_HEDLEY_UNLIKELY(len < 0)) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::bson, "byte array length cannot be negative, is " + std::to_string(len), "binary"), BasicJsonType())); + } + + // All BSON binary values have a subtype + std::uint8_t subtype{}; + get_number(input_format_t::bson, subtype); + result.set_subtype(subtype); + + return get_binary(input_format_t::bson, len, result); + } + + /*! + @brief Read a BSON document element of the given @a element_type. + @param[in] element_type The BSON element type, c.f. http://bsonspec.org/spec.html + @param[in] element_type_parse_position The position in the input stream, + where the `element_type` was read. + @warning Not all BSON element types are supported yet. An unsupported + @a element_type will give rise to a parse_error.114: + Unsupported BSON record type 0x... + @return whether a valid BSON-object/array was passed to the SAX parser + */ + bool parse_bson_element_internal(const char_int_type element_type, + const std::size_t element_type_parse_position) + { + switch (element_type) + { + case 0x01: // double + { + double number{}; + return get_number(input_format_t::bson, number) && sax->number_float(static_cast(number), ""); + } + + case 0x02: // string + { + std::int32_t len{}; + string_t value; + return get_number(input_format_t::bson, len) && get_bson_string(len, value) && sax->string(value); + } + + case 0x03: // object + { + return parse_bson_internal(); + } + + case 0x04: // array + { + return parse_bson_array(); + } + + case 0x05: // binary + { + std::int32_t len{}; + binary_t value; + return get_number(input_format_t::bson, len) && get_bson_binary(len, value) && sax->binary(value); + } + + case 0x08: // boolean + { + return sax->boolean(get() != 0); + } + + case 0x0A: // null + { + return sax->null(); + } + + case 0x10: // int32 + { + std::int32_t value{}; + return get_number(input_format_t::bson, value) && sax->number_integer(value); + } + + case 0x12: // int64 + { + std::int64_t value{}; + return get_number(input_format_t::bson, value) && sax->number_integer(value); + } + + default: // anything else not supported (yet) + { + std::array cr{{}}; + static_cast((std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast(element_type))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + return sax->parse_error(element_type_parse_position, std::string(cr.data()), parse_error::create(114, element_type_parse_position, "Unsupported BSON record type 0x" + std::string(cr.data()), BasicJsonType())); + } + } + } + + /*! + @brief Read a BSON element list (as specified in the BSON-spec) + + The same binary layout is used for objects and arrays, hence it must be + indicated with the argument @a is_array which one is expected + (true --> array, false --> object). + + @param[in] is_array Determines if the element list being read is to be + treated as an object (@a is_array == false), or as an + array (@a is_array == true). + @return whether a valid BSON-object/array was passed to the SAX parser + */ + bool parse_bson_element_list(const bool is_array) + { + string_t key; + + while (auto element_type = get()) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, "element list"))) + { + return false; + } + + const std::size_t element_type_parse_position = chars_read; + if (JSON_HEDLEY_UNLIKELY(!get_bson_cstr(key))) + { + return false; + } + + if (!is_array && !sax->key(key)) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_internal(element_type, element_type_parse_position))) + { + return false; + } + + // get_bson_cstr only appends + key.clear(); + } + + return true; + } + + /*! + @brief Reads an array from the BSON input and passes it to the SAX-parser. + @return whether a valid BSON-array was passed to the SAX parser + */ + bool parse_bson_array() + { + std::int32_t document_size{}; + get_number(input_format_t::bson, document_size); + + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(static_cast(-1)))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(/*is_array*/true))) + { + return false; + } + + return sax->end_array(); + } + + ////////// + // CBOR // + ////////// + + /*! + @param[in] get_char whether a new character should be retrieved from the + input (true) or whether the last read character should + be considered instead (false) + @param[in] tag_handler how CBOR tags should be treated + + @return whether a valid CBOR value was passed to the SAX parser + */ + bool parse_cbor_internal(const bool get_char, + const cbor_tag_handler_t tag_handler) + { + switch (get_char ? get() : current) + { + // EOF + case std::char_traits::eof(): + return unexpect_eof(input_format_t::cbor, "value"); + + // Integer 0x00..0x17 (0..23) + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0A: + case 0x0B: + case 0x0C: + case 0x0D: + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + return sax->number_unsigned(static_cast(current)); + + case 0x18: // Unsigned integer (one-byte uint8_t follows) + { + std::uint8_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + case 0x19: // Unsigned integer (two-byte uint16_t follows) + { + std::uint16_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + case 0x1A: // Unsigned integer (four-byte uint32_t follows) + { + std::uint32_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + case 0x1B: // Unsigned integer (eight-byte uint64_t follows) + { + std::uint64_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + // Negative integer -1-0x00..-1-0x17 (-1..-24) + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2A: + case 0x2B: + case 0x2C: + case 0x2D: + case 0x2E: + case 0x2F: + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + return sax->number_integer(static_cast(0x20 - 1 - current)); + + case 0x38: // Negative integer (one-byte uint8_t follows) + { + std::uint8_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) - number); + } + + case 0x39: // Negative integer -1-n (two-byte uint16_t follows) + { + std::uint16_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) - number); + } + + case 0x3A: // Negative integer -1-n (four-byte uint32_t follows) + { + std::uint32_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) - number); + } + + case 0x3B: // Negative integer -1-n (eight-byte uint64_t follows) + { + std::uint64_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) + - static_cast(number)); + } + + // Binary data (0x00..0x17 bytes follow) + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: // Binary data (one-byte uint8_t for n follows) + case 0x59: // Binary data (two-byte uint16_t for n follow) + case 0x5A: // Binary data (four-byte uint32_t for n follow) + case 0x5B: // Binary data (eight-byte uint64_t for n follow) + case 0x5F: // Binary data (indefinite length) + { + binary_t b; + return get_cbor_binary(b) && sax->binary(b); + } + + // UTF-8 string (0x00..0x17 bytes follow) + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + case 0x78: // UTF-8 string (one-byte uint8_t for n follows) + case 0x79: // UTF-8 string (two-byte uint16_t for n follow) + case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) + case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) + case 0x7F: // UTF-8 string (indefinite length) + { + string_t s; + return get_cbor_string(s) && sax->string(s); + } + + // array (0x00..0x17 data items follow) + case 0x80: + case 0x81: + case 0x82: + case 0x83: + case 0x84: + case 0x85: + case 0x86: + case 0x87: + case 0x88: + case 0x89: + case 0x8A: + case 0x8B: + case 0x8C: + case 0x8D: + case 0x8E: + case 0x8F: + case 0x90: + case 0x91: + case 0x92: + case 0x93: + case 0x94: + case 0x95: + case 0x96: + case 0x97: + return get_cbor_array(static_cast(static_cast(current) & 0x1Fu), tag_handler); + + case 0x98: // array (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast(len), tag_handler); + } + + case 0x99: // array (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast(len), tag_handler); + } + + case 0x9A: // array (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast(len), tag_handler); + } + + case 0x9B: // array (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(detail::conditional_static_cast(len), tag_handler); + } + + case 0x9F: // array (indefinite length) + return get_cbor_array(static_cast(-1), tag_handler); + + // map (0x00..0x17 pairs of data items follow) + case 0xA0: + case 0xA1: + case 0xA2: + case 0xA3: + case 0xA4: + case 0xA5: + case 0xA6: + case 0xA7: + case 0xA8: + case 0xA9: + case 0xAA: + case 0xAB: + case 0xAC: + case 0xAD: + case 0xAE: + case 0xAF: + case 0xB0: + case 0xB1: + case 0xB2: + case 0xB3: + case 0xB4: + case 0xB5: + case 0xB6: + case 0xB7: + return get_cbor_object(static_cast(static_cast(current) & 0x1Fu), tag_handler); + + case 0xB8: // map (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast(len), tag_handler); + } + + case 0xB9: // map (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast(len), tag_handler); + } + + case 0xBA: // map (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast(len), tag_handler); + } + + case 0xBB: // map (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(detail::conditional_static_cast(len), tag_handler); + } + + case 0xBF: // map (indefinite length) + return get_cbor_object(static_cast(-1), tag_handler); + + case 0xC6: // tagged item + case 0xC7: + case 0xC8: + case 0xC9: + case 0xCA: + case 0xCB: + case 0xCC: + case 0xCD: + case 0xCE: + case 0xCF: + case 0xD0: + case 0xD1: + case 0xD2: + case 0xD3: + case 0xD4: + case 0xD8: // tagged item (1 bytes follow) + case 0xD9: // tagged item (2 bytes follow) + case 0xDA: // tagged item (4 bytes follow) + case 0xDB: // tagged item (8 bytes follow) + { + switch (tag_handler) + { + case cbor_tag_handler_t::error: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::cbor, "invalid byte: 0x" + last_token, "value"), BasicJsonType())); + } + + case cbor_tag_handler_t::ignore: + { + // ignore binary subtype + switch (current) + { + case 0xD8: + { + std::uint8_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + case 0xD9: + { + std::uint16_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + case 0xDA: + { + std::uint32_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + case 0xDB: + { + std::uint64_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + default: + break; + } + return parse_cbor_internal(true, tag_handler); + } + + case cbor_tag_handler_t::store: + { + binary_t b; + // use binary subtype and store in binary container + switch (current) + { + case 0xD8: + { + std::uint8_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast(subtype)); + break; + } + case 0xD9: + { + std::uint16_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast(subtype)); + break; + } + case 0xDA: + { + std::uint32_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast(subtype)); + break; + } + case 0xDB: + { + std::uint64_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast(subtype)); + break; + } + default: + return parse_cbor_internal(true, tag_handler); + } + get(); + return get_cbor_binary(b) && sax->binary(b); + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + return false; // LCOV_EXCL_LINE + } + } + + case 0xF4: // false + return sax->boolean(false); + + case 0xF5: // true + return sax->boolean(true); + + case 0xF6: // null + return sax->null(); + + case 0xF9: // Half-Precision Float (two-byte IEEE 754) + { + const auto byte1_raw = get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "number"))) + { + return false; + } + const auto byte2_raw = get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "number"))) + { + return false; + } + + const auto byte1 = static_cast(byte1_raw); + const auto byte2 = static_cast(byte2_raw); + + // code from RFC 7049, Appendix D, Figure 3: + // As half-precision floating-point numbers were only added + // to IEEE 754 in 2008, today's programming platforms often + // still only have limited support for them. It is very + // easy to include at least decoding support for them even + // without such support. An example of a small decoder for + // half-precision floating-point numbers in the C language + // is shown in Fig. 3. + const auto half = static_cast((byte1 << 8u) + byte2); + const double val = [&half] + { + const int exp = (half >> 10u) & 0x1Fu; + const unsigned int mant = half & 0x3FFu; + JSON_ASSERT(0 <= exp&& exp <= 32); + JSON_ASSERT(mant <= 1024); + switch (exp) + { + case 0: + return std::ldexp(mant, -24); + case 31: + return (mant == 0) + ? std::numeric_limits::infinity() + : std::numeric_limits::quiet_NaN(); + default: + return std::ldexp(mant + 1024, exp - 25); + } + }(); + return sax->number_float((half & 0x8000u) != 0 + ? static_cast(-val) + : static_cast(val), ""); + } + + case 0xFA: // Single-Precision Float (four-byte IEEE 754) + { + float number{}; + return get_number(input_format_t::cbor, number) && sax->number_float(static_cast(number), ""); + } + + case 0xFB: // Double-Precision Float (eight-byte IEEE 754) + { + double number{}; + return get_number(input_format_t::cbor, number) && sax->number_float(static_cast(number), ""); + } + + default: // anything else (0xFF is handled inside the other types) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::cbor, "invalid byte: 0x" + last_token, "value"), BasicJsonType())); + } + } + } + + /*! + @brief reads a CBOR string + + This function first reads starting bytes to determine the expected + string length and then copies this number of bytes into a string. + Additionally, CBOR's strings with indefinite lengths are supported. + + @param[out] result created string + + @return whether string creation completed + */ + bool get_cbor_string(string_t& result) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "string"))) + { + return false; + } + + switch (current) + { + // UTF-8 string (0x00..0x17 bytes follow) + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + { + return get_string(input_format_t::cbor, static_cast(current) & 0x1Fu, result); + } + + case 0x78: // UTF-8 string (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x79: // UTF-8 string (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x7F: // UTF-8 string (indefinite length) + { + while (get() != 0xFF) + { + string_t chunk; + if (!get_cbor_string(chunk)) + { + return false; + } + result.append(chunk); + } + return true; + } + + default: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::cbor, "expected length specification (0x60-0x7B) or indefinite string type (0x7F); last byte: 0x" + last_token, "string"), BasicJsonType())); + } + } + } + + /*! + @brief reads a CBOR byte array + + This function first reads starting bytes to determine the expected + byte array length and then copies this number of bytes into the byte array. + Additionally, CBOR's byte arrays with indefinite lengths are supported. + + @param[out] result created byte array + + @return whether byte array creation completed + */ + bool get_cbor_binary(binary_t& result) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "binary"))) + { + return false; + } + + switch (current) + { + // Binary data (0x00..0x17 bytes follow) + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + { + return get_binary(input_format_t::cbor, static_cast(current) & 0x1Fu, result); + } + + case 0x58: // Binary data (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x59: // Binary data (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x5A: // Binary data (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x5B: // Binary data (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x5F: // Binary data (indefinite length) + { + while (get() != 0xFF) + { + binary_t chunk; + if (!get_cbor_binary(chunk)) + { + return false; + } + result.insert(result.end(), chunk.begin(), chunk.end()); + } + return true; + } + + default: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::cbor, "expected length specification (0x40-0x5B) or indefinite binary array type (0x5F); last byte: 0x" + last_token, "binary"), BasicJsonType())); + } + } + } + + /*! + @param[in] len the length of the array or static_cast(-1) for an + array of indefinite size + @param[in] tag_handler how CBOR tags should be treated + @return whether array creation completed + */ + bool get_cbor_array(const std::size_t len, + const cbor_tag_handler_t tag_handler) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len))) + { + return false; + } + + if (len != static_cast(-1)) + { + for (std::size_t i = 0; i < len; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) + { + return false; + } + } + } + else + { + while (get() != 0xFF) + { + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(false, tag_handler))) + { + return false; + } + } + } + + return sax->end_array(); + } + + /*! + @param[in] len the length of the object or static_cast(-1) for an + object of indefinite size + @param[in] tag_handler how CBOR tags should be treated + @return whether object creation completed + */ + bool get_cbor_object(const std::size_t len, + const cbor_tag_handler_t tag_handler) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len))) + { + return false; + } + + if (len != 0) + { + string_t key; + if (len != static_cast(-1)) + { + for (std::size_t i = 0; i < len; ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) + { + return false; + } + key.clear(); + } + } + else + { + while (get() != 0xFF) + { + if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) + { + return false; + } + key.clear(); + } + } + } + + return sax->end_object(); + } + + ///////////// + // MsgPack // + ///////////// + + /*! + @return whether a valid MessagePack value was passed to the SAX parser + */ + bool parse_msgpack_internal() + { + switch (get()) + { + // EOF + case std::char_traits::eof(): + return unexpect_eof(input_format_t::msgpack, "value"); + + // positive fixint + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0A: + case 0x0B: + case 0x0C: + case 0x0D: + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x1F: + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2A: + case 0x2B: + case 0x2C: + case 0x2D: + case 0x2E: + case 0x2F: + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x3A: + case 0x3B: + case 0x3C: + case 0x3D: + case 0x3E: + case 0x3F: + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: + case 0x59: + case 0x5A: + case 0x5B: + case 0x5C: + case 0x5D: + case 0x5E: + case 0x5F: + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + case 0x78: + case 0x79: + case 0x7A: + case 0x7B: + case 0x7C: + case 0x7D: + case 0x7E: + case 0x7F: + return sax->number_unsigned(static_cast(current)); + + // fixmap + case 0x80: + case 0x81: + case 0x82: + case 0x83: + case 0x84: + case 0x85: + case 0x86: + case 0x87: + case 0x88: + case 0x89: + case 0x8A: + case 0x8B: + case 0x8C: + case 0x8D: + case 0x8E: + case 0x8F: + return get_msgpack_object(static_cast(static_cast(current) & 0x0Fu)); + + // fixarray + case 0x90: + case 0x91: + case 0x92: + case 0x93: + case 0x94: + case 0x95: + case 0x96: + case 0x97: + case 0x98: + case 0x99: + case 0x9A: + case 0x9B: + case 0x9C: + case 0x9D: + case 0x9E: + case 0x9F: + return get_msgpack_array(static_cast(static_cast(current) & 0x0Fu)); + + // fixstr + case 0xA0: + case 0xA1: + case 0xA2: + case 0xA3: + case 0xA4: + case 0xA5: + case 0xA6: + case 0xA7: + case 0xA8: + case 0xA9: + case 0xAA: + case 0xAB: + case 0xAC: + case 0xAD: + case 0xAE: + case 0xAF: + case 0xB0: + case 0xB1: + case 0xB2: + case 0xB3: + case 0xB4: + case 0xB5: + case 0xB6: + case 0xB7: + case 0xB8: + case 0xB9: + case 0xBA: + case 0xBB: + case 0xBC: + case 0xBD: + case 0xBE: + case 0xBF: + case 0xD9: // str 8 + case 0xDA: // str 16 + case 0xDB: // str 32 + { + string_t s; + return get_msgpack_string(s) && sax->string(s); + } + + case 0xC0: // nil + return sax->null(); + + case 0xC2: // false + return sax->boolean(false); + + case 0xC3: // true + return sax->boolean(true); + + case 0xC4: // bin 8 + case 0xC5: // bin 16 + case 0xC6: // bin 32 + case 0xC7: // ext 8 + case 0xC8: // ext 16 + case 0xC9: // ext 32 + case 0xD4: // fixext 1 + case 0xD5: // fixext 2 + case 0xD6: // fixext 4 + case 0xD7: // fixext 8 + case 0xD8: // fixext 16 + { + binary_t b; + return get_msgpack_binary(b) && sax->binary(b); + } + + case 0xCA: // float 32 + { + float number{}; + return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast(number), ""); + } + + case 0xCB: // float 64 + { + double number{}; + return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast(number), ""); + } + + case 0xCC: // uint 8 + { + std::uint8_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xCD: // uint 16 + { + std::uint16_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xCE: // uint 32 + { + std::uint32_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xCF: // uint 64 + { + std::uint64_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xD0: // int 8 + { + std::int8_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xD1: // int 16 + { + std::int16_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xD2: // int 32 + { + std::int32_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xD3: // int 64 + { + std::int64_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xDC: // array 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_array(static_cast(len)); + } + + case 0xDD: // array 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_array(static_cast(len)); + } + + case 0xDE: // map 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_object(static_cast(len)); + } + + case 0xDF: // map 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_object(static_cast(len)); + } + + // negative fixint + case 0xE0: + case 0xE1: + case 0xE2: + case 0xE3: + case 0xE4: + case 0xE5: + case 0xE6: + case 0xE7: + case 0xE8: + case 0xE9: + case 0xEA: + case 0xEB: + case 0xEC: + case 0xED: + case 0xEE: + case 0xEF: + case 0xF0: + case 0xF1: + case 0xF2: + case 0xF3: + case 0xF4: + case 0xF5: + case 0xF6: + case 0xF7: + case 0xF8: + case 0xF9: + case 0xFA: + case 0xFB: + case 0xFC: + case 0xFD: + case 0xFE: + case 0xFF: + return sax->number_integer(static_cast(current)); + + default: // anything else + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::msgpack, "invalid byte: 0x" + last_token, "value"), BasicJsonType())); + } + } + } + + /*! + @brief reads a MessagePack string + + This function first reads starting bytes to determine the expected + string length and then copies this number of bytes into a string. + + @param[out] result created string + + @return whether string creation completed + */ + bool get_msgpack_string(string_t& result) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::msgpack, "string"))) + { + return false; + } + + switch (current) + { + // fixstr + case 0xA0: + case 0xA1: + case 0xA2: + case 0xA3: + case 0xA4: + case 0xA5: + case 0xA6: + case 0xA7: + case 0xA8: + case 0xA9: + case 0xAA: + case 0xAB: + case 0xAC: + case 0xAD: + case 0xAE: + case 0xAF: + case 0xB0: + case 0xB1: + case 0xB2: + case 0xB3: + case 0xB4: + case 0xB5: + case 0xB6: + case 0xB7: + case 0xB8: + case 0xB9: + case 0xBA: + case 0xBB: + case 0xBC: + case 0xBD: + case 0xBE: + case 0xBF: + { + return get_string(input_format_t::msgpack, static_cast(current) & 0x1Fu, result); + } + + case 0xD9: // str 8 + { + std::uint8_t len{}; + return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result); + } + + case 0xDA: // str 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result); + } + + case 0xDB: // str 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result); + } + + default: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::msgpack, "expected length specification (0xA0-0xBF, 0xD9-0xDB); last byte: 0x" + last_token, "string"), BasicJsonType())); + } + } + } + + /*! + @brief reads a MessagePack byte array + + This function first reads starting bytes to determine the expected + byte array length and then copies this number of bytes into a byte array. + + @param[out] result created byte array + + @return whether byte array creation completed + */ + bool get_msgpack_binary(binary_t& result) + { + // helper function to set the subtype + auto assign_and_return_true = [&result](std::int8_t subtype) + { + result.set_subtype(static_cast(subtype)); + return true; + }; + + switch (current) + { + case 0xC4: // bin 8 + { + std::uint8_t len{}; + return get_number(input_format_t::msgpack, len) && + get_binary(input_format_t::msgpack, len, result); + } + + case 0xC5: // bin 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && + get_binary(input_format_t::msgpack, len, result); + } + + case 0xC6: // bin 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && + get_binary(input_format_t::msgpack, len, result); + } + + case 0xC7: // ext 8 + { + std::uint8_t len{}; + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, len) && + get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, len, result) && + assign_and_return_true(subtype); + } + + case 0xC8: // ext 16 + { + std::uint16_t len{}; + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, len) && + get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, len, result) && + assign_and_return_true(subtype); + } + + case 0xC9: // ext 32 + { + std::uint32_t len{}; + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, len) && + get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, len, result) && + assign_and_return_true(subtype); + } + + case 0xD4: // fixext 1 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 1, result) && + assign_and_return_true(subtype); + } + + case 0xD5: // fixext 2 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 2, result) && + assign_and_return_true(subtype); + } + + case 0xD6: // fixext 4 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 4, result) && + assign_and_return_true(subtype); + } + + case 0xD7: // fixext 8 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 8, result) && + assign_and_return_true(subtype); + } + + case 0xD8: // fixext 16 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 16, result) && + assign_and_return_true(subtype); + } + + default: // LCOV_EXCL_LINE + return false; // LCOV_EXCL_LINE + } + } + + /*! + @param[in] len the length of the array + @return whether array creation completed + */ + bool get_msgpack_array(const std::size_t len) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len))) + { + return false; + } + + for (std::size_t i = 0; i < len; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal())) + { + return false; + } + } + + return sax->end_array(); + } + + /*! + @param[in] len the length of the object + @return whether object creation completed + */ + bool get_msgpack_object(const std::size_t len) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len))) + { + return false; + } + + string_t key; + for (std::size_t i = 0; i < len; ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!get_msgpack_string(key) || !sax->key(key))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal())) + { + return false; + } + key.clear(); + } + + return sax->end_object(); + } + + //////////// + // UBJSON // + //////////// + + /*! + @param[in] get_char whether a new character should be retrieved from the + input (true, default) or whether the last read + character should be considered instead + + @return whether a valid UBJSON value was passed to the SAX parser + */ + bool parse_ubjson_internal(const bool get_char = true) + { + return get_ubjson_value(get_char ? get_ignore_noop() : current); + } + + /*! + @brief reads a UBJSON string + + This function is either called after reading the 'S' byte explicitly + indicating a string, or in case of an object key where the 'S' byte can be + left out. + + @param[out] result created string + @param[in] get_char whether a new character should be retrieved from the + input (true, default) or whether the last read + character should be considered instead + + @return whether string creation completed + */ + bool get_ubjson_string(string_t& result, const bool get_char = true) + { + if (get_char) + { + get(); // TODO(niels): may we ignore N here? + } + + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "value"))) + { + return false; + } + + switch (current) + { + case 'U': + { + std::uint8_t len{}; + return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); + } + + case 'i': + { + std::int8_t len{}; + return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); + } + + case 'I': + { + std::int16_t len{}; + return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); + } + + case 'l': + { + std::int32_t len{}; + return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); + } + + case 'L': + { + std::int64_t len{}; + return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); + } + + default: + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, "expected length type specification (U, i, I, l, L); last byte: 0x" + last_token, "string"), BasicJsonType())); + } + } + + /*! + @param[out] result determined size + @return whether size determination completed + */ + bool get_ubjson_size_value(std::size_t& result) + { + switch (get_ignore_noop()) + { + case 'U': + { + std::uint8_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) + { + return false; + } + result = static_cast(number); + return true; + } + + case 'i': + { + std::int8_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) + { + return false; + } + result = static_cast(number); // NOLINT(bugprone-signed-char-misuse,cert-str34-c): number is not a char + return true; + } + + case 'I': + { + std::int16_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) + { + return false; + } + result = static_cast(number); + return true; + } + + case 'l': + { + std::int32_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) + { + return false; + } + result = static_cast(number); + return true; + } + + case 'L': + { + std::int64_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) + { + return false; + } + result = static_cast(number); + return true; + } + + default: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, "expected length type specification (U, i, I, l, L) after '#'; last byte: 0x" + last_token, "size"), BasicJsonType())); + } + } + } + + /*! + @brief determine the type and size for a container + + In the optimized UBJSON format, a type and a size can be provided to allow + for a more compact representation. + + @param[out] result pair of the size and the type + + @return whether pair creation completed + */ + bool get_ubjson_size_type(std::pair& result) + { + result.first = string_t::npos; // size + result.second = 0; // type + + get_ignore_noop(); + + if (current == '$') + { + result.second = get(); // must not ignore 'N', because 'N' maybe the type + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "type"))) + { + return false; + } + + get_ignore_noop(); + if (JSON_HEDLEY_UNLIKELY(current != '#')) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "value"))) + { + return false; + } + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::ubjson, "expected '#' after type information; last byte: 0x" + last_token, "size"), BasicJsonType())); + } + + return get_ubjson_size_value(result.first); + } + + if (current == '#') + { + return get_ubjson_size_value(result.first); + } + + return true; + } + + /*! + @param prefix the previously read or set type prefix + @return whether value creation completed + */ + bool get_ubjson_value(const char_int_type prefix) + { + switch (prefix) + { + case std::char_traits::eof(): // EOF + return unexpect_eof(input_format_t::ubjson, "value"); + + case 'T': // true + return sax->boolean(true); + case 'F': // false + return sax->boolean(false); + + case 'Z': // null + return sax->null(); + + case 'U': + { + std::uint8_t number{}; + return get_number(input_format_t::ubjson, number) && sax->number_unsigned(number); + } + + case 'i': + { + std::int8_t number{}; + return get_number(input_format_t::ubjson, number) && sax->number_integer(number); + } + + case 'I': + { + std::int16_t number{}; + return get_number(input_format_t::ubjson, number) && sax->number_integer(number); + } + + case 'l': + { + std::int32_t number{}; + return get_number(input_format_t::ubjson, number) && sax->number_integer(number); + } + + case 'L': + { + std::int64_t number{}; + return get_number(input_format_t::ubjson, number) && sax->number_integer(number); + } + + case 'd': + { + float number{}; + return get_number(input_format_t::ubjson, number) && sax->number_float(static_cast(number), ""); + } + + case 'D': + { + double number{}; + return get_number(input_format_t::ubjson, number) && sax->number_float(static_cast(number), ""); + } + + case 'H': + { + return get_ubjson_high_precision_number(); + } + + case 'C': // char + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "char"))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(current > 127)) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, "byte after 'C' must be in range 0x00..0x7F; last byte: 0x" + last_token, "char"), BasicJsonType())); + } + string_t s(1, static_cast(current)); + return sax->string(s); + } + + case 'S': // string + { + string_t s; + return get_ubjson_string(s) && sax->string(s); + } + + case '[': // array + return get_ubjson_array(); + + case '{': // object + return get_ubjson_object(); + + default: // anything else + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::ubjson, "invalid byte: 0x" + last_token, "value"), BasicJsonType())); + } + } + } + + /*! + @return whether array creation completed + */ + bool get_ubjson_array() + { + std::pair size_and_type; + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type))) + { + return false; + } + + if (size_and_type.first != string_t::npos) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(size_and_type.first))) + { + return false; + } + + if (size_and_type.second != 0) + { + if (size_and_type.second != 'N') + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second))) + { + return false; + } + } + } + } + else + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) + { + return false; + } + } + } + } + else + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(static_cast(-1)))) + { + return false; + } + + while (current != ']') + { + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal(false))) + { + return false; + } + get_ignore_noop(); + } + } + + return sax->end_array(); + } + + /*! + @return whether object creation completed + */ + bool get_ubjson_object() + { + std::pair size_and_type; + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type))) + { + return false; + } + + string_t key; + if (size_and_type.first != string_t::npos) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(size_and_type.first))) + { + return false; + } + + if (size_and_type.second != 0) + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second))) + { + return false; + } + key.clear(); + } + } + else + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) + { + return false; + } + key.clear(); + } + } + } + else + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(static_cast(-1)))) + { + return false; + } + + while (current != '}') + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key, false) || !sax->key(key))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) + { + return false; + } + get_ignore_noop(); + key.clear(); + } + } + + return sax->end_object(); + } + + // Note, no reader for UBJSON binary types is implemented because they do + // not exist + + bool get_ubjson_high_precision_number() + { + // get size of following number string + std::size_t size{}; + auto res = get_ubjson_size_value(size); + if (JSON_HEDLEY_UNLIKELY(!res)) + { + return res; + } + + // get number string + std::vector number_vector; + for (std::size_t i = 0; i < size; ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "number"))) + { + return false; + } + number_vector.push_back(static_cast(current)); + } + + // parse number string + using ia_type = decltype(detail::input_adapter(number_vector)); + auto number_lexer = detail::lexer(detail::input_adapter(number_vector), false); + const auto result_number = number_lexer.scan(); + const auto number_string = number_lexer.get_token_string(); + const auto result_remainder = number_lexer.scan(); + + using token_type = typename detail::lexer_base::token_type; + + if (JSON_HEDLEY_UNLIKELY(result_remainder != token_type::end_of_input)) + { + return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read, exception_message(input_format_t::ubjson, "invalid number text: " + number_lexer.get_token_string(), "high-precision number"), BasicJsonType())); + } + + switch (result_number) + { + case token_type::value_integer: + return sax->number_integer(number_lexer.get_number_integer()); + case token_type::value_unsigned: + return sax->number_unsigned(number_lexer.get_number_unsigned()); + case token_type::value_float: + return sax->number_float(number_lexer.get_number_float(), std::move(number_string)); + case token_type::uninitialized: + case token_type::literal_true: + case token_type::literal_false: + case token_type::literal_null: + case token_type::value_string: + case token_type::begin_array: + case token_type::begin_object: + case token_type::end_array: + case token_type::end_object: + case token_type::name_separator: + case token_type::value_separator: + case token_type::parse_error: + case token_type::end_of_input: + case token_type::literal_or_value: + default: + return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read, exception_message(input_format_t::ubjson, "invalid number text: " + number_lexer.get_token_string(), "high-precision number"), BasicJsonType())); + } + } + + /////////////////////// + // Utility functions // + /////////////////////// + + /*! + @brief get next character from the input + + This function provides the interface to the used input adapter. It does + not throw in case the input reached EOF, but returns a -'ve valued + `std::char_traits::eof()` in that case. + + @return character read from the input + */ + char_int_type get() + { + ++chars_read; + return current = ia.get_character(); + } + + /*! + @return character read from the input after ignoring all 'N' entries + */ + char_int_type get_ignore_noop() + { + do + { + get(); + } + while (current == 'N'); + + return current; + } + + /* + @brief read a number from the input + + @tparam NumberType the type of the number + @param[in] format the current format (for diagnostics) + @param[out] result number of type @a NumberType + + @return whether conversion completed + + @note This function needs to respect the system's endianness, because + bytes in CBOR, MessagePack, and UBJSON are stored in network order + (big endian) and therefore need reordering on little endian systems. + */ + template + bool get_number(const input_format_t format, NumberType& result) + { + // step 1: read input into array with system's byte order + std::array vec{}; + for (std::size_t i = 0; i < sizeof(NumberType); ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "number"))) + { + return false; + } + + // reverse byte order prior to conversion if necessary + if (is_little_endian != InputIsLittleEndian) + { + vec[sizeof(NumberType) - i - 1] = static_cast(current); + } + else + { + vec[i] = static_cast(current); // LCOV_EXCL_LINE + } + } + + // step 2: convert array into number of type T and return + std::memcpy(&result, vec.data(), sizeof(NumberType)); + return true; + } + + /*! + @brief create a string by reading characters from the input + + @tparam NumberType the type of the number + @param[in] format the current format (for diagnostics) + @param[in] len number of characters to read + @param[out] result string created by reading @a len bytes + + @return whether string creation completed + + @note We can not reserve @a len bytes for the result, because @a len + may be too large. Usually, @ref unexpect_eof() detects the end of + the input before we run out of string memory. + */ + template + bool get_string(const input_format_t format, + const NumberType len, + string_t& result) + { + bool success = true; + for (NumberType i = 0; i < len; i++) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "string"))) + { + success = false; + break; + } + result.push_back(static_cast(current)); + } + return success; + } + + /*! + @brief create a byte array by reading bytes from the input + + @tparam NumberType the type of the number + @param[in] format the current format (for diagnostics) + @param[in] len number of bytes to read + @param[out] result byte array created by reading @a len bytes + + @return whether byte array creation completed + + @note We can not reserve @a len bytes for the result, because @a len + may be too large. Usually, @ref unexpect_eof() detects the end of + the input before we run out of memory. + */ + template + bool get_binary(const input_format_t format, + const NumberType len, + binary_t& result) + { + bool success = true; + for (NumberType i = 0; i < len; i++) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "binary"))) + { + success = false; + break; + } + result.push_back(static_cast(current)); + } + return success; + } + + /*! + @param[in] format the current format (for diagnostics) + @param[in] context further context information (for diagnostics) + @return whether the last read character is not EOF + */ + JSON_HEDLEY_NON_NULL(3) + bool unexpect_eof(const input_format_t format, const char* context) const + { + if (JSON_HEDLEY_UNLIKELY(current == std::char_traits::eof())) + { + return sax->parse_error(chars_read, "", + parse_error::create(110, chars_read, exception_message(format, "unexpected end of input", context), BasicJsonType())); + } + return true; + } + + /*! + @return a string representation of the last read byte + */ + std::string get_token_string() const + { + std::array cr{{}}; + static_cast((std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast(current))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + return std::string{cr.data()}; + } + + /*! + @param[in] format the current format + @param[in] detail a detailed error message + @param[in] context further context information + @return a message string to use in the parse_error exceptions + */ + std::string exception_message(const input_format_t format, + const std::string& detail, + const std::string& context) const + { + std::string error_msg = "syntax error while parsing "; + + switch (format) + { + case input_format_t::cbor: + error_msg += "CBOR"; + break; + + case input_format_t::msgpack: + error_msg += "MessagePack"; + break; + + case input_format_t::ubjson: + error_msg += "UBJSON"; + break; + + case input_format_t::bson: + error_msg += "BSON"; + break; + + case input_format_t::json: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + + return error_msg + " " + context + ": " + detail; + } + + private: + /// input adapter + InputAdapterType ia; + + /// the current character + char_int_type current = std::char_traits::eof(); + + /// the number of characters read + std::size_t chars_read = 0; + + /// whether we can assume little endianness + const bool is_little_endian = little_endianness(); + + /// the SAX parser + json_sax_t* sax = nullptr; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + +// #include + + +#include // isfinite +#include // uint8_t +#include // function +#include // string +#include // move +#include // vector + +// #include + +// #include + +// #include + +// #include + +// #include + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +//////////// +// parser // +//////////// + +enum class parse_event_t : std::uint8_t +{ + /// the parser read `{` and started to process a JSON object + object_start, + /// the parser read `}` and finished processing a JSON object + object_end, + /// the parser read `[` and started to process a JSON array + array_start, + /// the parser read `]` and finished processing a JSON array + array_end, + /// the parser read a key of a value in an object + key, + /// the parser finished reading a JSON value + value +}; + +template +using parser_callback_t = + std::function; + +/*! +@brief syntax analysis + +This class implements a recursive descent parser. +*/ +template +class parser +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using lexer_t = lexer; + using token_type = typename lexer_t::token_type; + + public: + /// a parser reading from an input adapter + explicit parser(InputAdapterType&& adapter, + const parser_callback_t cb = nullptr, + const bool allow_exceptions_ = true, + const bool skip_comments = false) + : callback(cb) + , m_lexer(std::move(adapter), skip_comments) + , allow_exceptions(allow_exceptions_) + { + // read first token + get_token(); + } + + /*! + @brief public parser interface + + @param[in] strict whether to expect the last token to be EOF + @param[in,out] result parsed JSON value + + @throw parse_error.101 in case of an unexpected token + @throw parse_error.102 if to_unicode fails or surrogate error + @throw parse_error.103 if to_unicode fails + */ + void parse(const bool strict, BasicJsonType& result) + { + if (callback) + { + json_sax_dom_callback_parser sdp(result, callback, allow_exceptions); + sax_parse_internal(&sdp); + + // in strict mode, input must be completely read + if (strict && (get_token() != token_type::end_of_input)) + { + sdp.parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), + exception_message(token_type::end_of_input, "value"), BasicJsonType())); + } + + // in case of an error, return discarded value + if (sdp.is_errored()) + { + result = value_t::discarded; + return; + } + + // set top-level value to null if it was discarded by the callback + // function + if (result.is_discarded()) + { + result = nullptr; + } + } + else + { + json_sax_dom_parser sdp(result, allow_exceptions); + sax_parse_internal(&sdp); + + // in strict mode, input must be completely read + if (strict && (get_token() != token_type::end_of_input)) + { + sdp.parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input, "value"), BasicJsonType())); + } + + // in case of an error, return discarded value + if (sdp.is_errored()) + { + result = value_t::discarded; + return; + } + } + + result.assert_invariant(); + } + + /*! + @brief public accept interface + + @param[in] strict whether to expect the last token to be EOF + @return whether the input is a proper JSON text + */ + bool accept(const bool strict = true) + { + json_sax_acceptor sax_acceptor; + return sax_parse(&sax_acceptor, strict); + } + + template + JSON_HEDLEY_NON_NULL(2) + bool sax_parse(SAX* sax, const bool strict = true) + { + (void)detail::is_sax_static_asserts {}; + const bool result = sax_parse_internal(sax); + + // strict mode: next byte must be EOF + if (result && strict && (get_token() != token_type::end_of_input)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input, "value"), BasicJsonType())); + } + + return result; + } + + private: + template + JSON_HEDLEY_NON_NULL(2) + bool sax_parse_internal(SAX* sax) + { + // stack to remember the hierarchy of structured values we are parsing + // true = array; false = object + std::vector states; + // value to avoid a goto (see comment where set to true) + bool skip_to_state_evaluation = false; + + while (true) + { + if (!skip_to_state_evaluation) + { + // invariant: get_token() was called before each iteration + switch (last_token) + { + case token_type::begin_object: + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(static_cast(-1)))) + { + return false; + } + + // closing } -> we are done + if (get_token() == token_type::end_object) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_object())) + { + return false; + } + break; + } + + // parse key + if (JSON_HEDLEY_UNLIKELY(last_token != token_type::value_string)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string, "object key"), BasicJsonType())); + } + if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string()))) + { + return false; + } + + // parse separator (:) + if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator, "object separator"), BasicJsonType())); + } + + // remember we are now inside an object + states.push_back(false); + + // parse values + get_token(); + continue; + } + + case token_type::begin_array: + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(static_cast(-1)))) + { + return false; + } + + // closing ] -> we are done + if (get_token() == token_type::end_array) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_array())) + { + return false; + } + break; + } + + // remember we are now inside an array + states.push_back(true); + + // parse values (no need to call get_token) + continue; + } + + case token_type::value_float: + { + const auto res = m_lexer.get_number_float(); + + if (JSON_HEDLEY_UNLIKELY(!std::isfinite(res))) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + out_of_range::create(406, "number overflow parsing '" + m_lexer.get_token_string() + "'", BasicJsonType())); + } + + if (JSON_HEDLEY_UNLIKELY(!sax->number_float(res, m_lexer.get_string()))) + { + return false; + } + + break; + } + + case token_type::literal_false: + { + if (JSON_HEDLEY_UNLIKELY(!sax->boolean(false))) + { + return false; + } + break; + } + + case token_type::literal_null: + { + if (JSON_HEDLEY_UNLIKELY(!sax->null())) + { + return false; + } + break; + } + + case token_type::literal_true: + { + if (JSON_HEDLEY_UNLIKELY(!sax->boolean(true))) + { + return false; + } + break; + } + + case token_type::value_integer: + { + if (JSON_HEDLEY_UNLIKELY(!sax->number_integer(m_lexer.get_number_integer()))) + { + return false; + } + break; + } + + case token_type::value_string: + { + if (JSON_HEDLEY_UNLIKELY(!sax->string(m_lexer.get_string()))) + { + return false; + } + break; + } + + case token_type::value_unsigned: + { + if (JSON_HEDLEY_UNLIKELY(!sax->number_unsigned(m_lexer.get_number_unsigned()))) + { + return false; + } + break; + } + + case token_type::parse_error: + { + // using "uninitialized" to avoid "expected" message + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::uninitialized, "value"), BasicJsonType())); + } + + case token_type::uninitialized: + case token_type::end_array: + case token_type::end_object: + case token_type::name_separator: + case token_type::value_separator: + case token_type::end_of_input: + case token_type::literal_or_value: + default: // the last token was unexpected + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::literal_or_value, "value"), BasicJsonType())); + } + } + } + else + { + skip_to_state_evaluation = false; + } + + // we reached this line after we successfully parsed a value + if (states.empty()) + { + // empty stack: we reached the end of the hierarchy: done + return true; + } + + if (states.back()) // array + { + // comma -> next value + if (get_token() == token_type::value_separator) + { + // parse a new value + get_token(); + continue; + } + + // closing ] + if (JSON_HEDLEY_LIKELY(last_token == token_type::end_array)) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_array())) + { + return false; + } + + // We are done with this array. Before we can parse a + // new value, we need to evaluate the new state first. + // By setting skip_to_state_evaluation to false, we + // are effectively jumping to the beginning of this if. + JSON_ASSERT(!states.empty()); + states.pop_back(); + skip_to_state_evaluation = true; + continue; + } + + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_array, "array"), BasicJsonType())); + } + + // states.back() is false -> object + + // comma -> next value + if (get_token() == token_type::value_separator) + { + // parse key + if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::value_string)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string, "object key"), BasicJsonType())); + } + + if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string()))) + { + return false; + } + + // parse separator (:) + if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator, "object separator"), BasicJsonType())); + } + + // parse values + get_token(); + continue; + } + + // closing } + if (JSON_HEDLEY_LIKELY(last_token == token_type::end_object)) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_object())) + { + return false; + } + + // We are done with this object. Before we can parse a + // new value, we need to evaluate the new state first. + // By setting skip_to_state_evaluation to false, we + // are effectively jumping to the beginning of this if. + JSON_ASSERT(!states.empty()); + states.pop_back(); + skip_to_state_evaluation = true; + continue; + } + + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_object, "object"), BasicJsonType())); + } + } + + /// get next token from lexer + token_type get_token() + { + return last_token = m_lexer.scan(); + } + + std::string exception_message(const token_type expected, const std::string& context) + { + std::string error_msg = "syntax error "; + + if (!context.empty()) + { + error_msg += "while parsing " + context + " "; + } + + error_msg += "- "; + + if (last_token == token_type::parse_error) + { + error_msg += std::string(m_lexer.get_error_message()) + "; last read: '" + + m_lexer.get_token_string() + "'"; + } + else + { + error_msg += "unexpected " + std::string(lexer_t::token_type_name(last_token)); + } + + if (expected != token_type::uninitialized) + { + error_msg += "; expected " + std::string(lexer_t::token_type_name(expected)); + } + + return error_msg; + } + + private: + /// callback function + const parser_callback_t callback = nullptr; + /// the type of the last read token + token_type last_token = token_type::uninitialized; + /// the lexer + lexer_t m_lexer; + /// whether to throw exceptions in case of errors + const bool allow_exceptions = true; +}; + +} // namespace detail +} // namespace nlohmann + +// #include + + +// #include + + +#include // ptrdiff_t +#include // numeric_limits + +// #include + + +namespace nlohmann +{ +namespace detail +{ +/* +@brief an iterator for primitive JSON types + +This class models an iterator for primitive JSON types (boolean, number, +string). It's only purpose is to allow the iterator/const_iterator classes +to "iterate" over primitive values. Internally, the iterator is modeled by +a `difference_type` variable. Value begin_value (`0`) models the begin, +end_value (`1`) models past the end. +*/ +class primitive_iterator_t +{ + private: + using difference_type = std::ptrdiff_t; + static constexpr difference_type begin_value = 0; + static constexpr difference_type end_value = begin_value + 1; + + JSON_PRIVATE_UNLESS_TESTED: + /// iterator as signed integer type + difference_type m_it = (std::numeric_limits::min)(); + + public: + constexpr difference_type get_value() const noexcept + { + return m_it; + } + + /// set iterator to a defined beginning + void set_begin() noexcept + { + m_it = begin_value; + } + + /// set iterator to a defined past the end + void set_end() noexcept + { + m_it = end_value; + } + + /// return whether the iterator can be dereferenced + constexpr bool is_begin() const noexcept + { + return m_it == begin_value; + } + + /// return whether the iterator is at end + constexpr bool is_end() const noexcept + { + return m_it == end_value; + } + + friend constexpr bool operator==(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept + { + return lhs.m_it == rhs.m_it; + } + + friend constexpr bool operator<(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept + { + return lhs.m_it < rhs.m_it; + } + + primitive_iterator_t operator+(difference_type n) noexcept + { + auto result = *this; + result += n; + return result; + } + + friend constexpr difference_type operator-(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept + { + return lhs.m_it - rhs.m_it; + } + + primitive_iterator_t& operator++() noexcept + { + ++m_it; + return *this; + } + + primitive_iterator_t const operator++(int) noexcept // NOLINT(readability-const-return-type) + { + auto result = *this; + ++m_it; + return result; + } + + primitive_iterator_t& operator--() noexcept + { + --m_it; + return *this; + } + + primitive_iterator_t const operator--(int) noexcept // NOLINT(readability-const-return-type) + { + auto result = *this; + --m_it; + return result; + } + + primitive_iterator_t& operator+=(difference_type n) noexcept + { + m_it += n; + return *this; + } + + primitive_iterator_t& operator-=(difference_type n) noexcept + { + m_it -= n; + return *this; + } +}; +} // namespace detail +} // namespace nlohmann + + +namespace nlohmann +{ +namespace detail +{ +/*! +@brief an iterator value + +@note This structure could easily be a union, but MSVC currently does not allow +unions members with complex constructors, see https://github.com/nlohmann/json/pull/105. +*/ +template struct internal_iterator +{ + /// iterator for JSON objects + typename BasicJsonType::object_t::iterator object_iterator {}; + /// iterator for JSON arrays + typename BasicJsonType::array_t::iterator array_iterator {}; + /// generic iterator for all other types + primitive_iterator_t primitive_iterator {}; +}; +} // namespace detail +} // namespace nlohmann + +// #include + + +#include // iterator, random_access_iterator_tag, bidirectional_iterator_tag, advance, next +#include // conditional, is_const, remove_const + +// #include + +// #include + +// #include + +// #include + +// #include + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +// forward declare, to be able to friend it later on +template class iteration_proxy; +template class iteration_proxy_value; + +/*! +@brief a template for a bidirectional iterator for the @ref basic_json class +This class implements a both iterators (iterator and const_iterator) for the +@ref basic_json class. +@note An iterator is called *initialized* when a pointer to a JSON value has + been set (e.g., by a constructor or a copy assignment). If the iterator is + default-constructed, it is *uninitialized* and most methods are undefined. + **The library uses assertions to detect calls on uninitialized iterators.** +@requirement The class satisfies the following concept requirements: +- +[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator): + The iterator that can be moved can be moved in both directions (i.e. + incremented and decremented). +@since version 1.0.0, simplified in version 2.0.9, change to bidirectional + iterators in version 3.0.0 (see https://github.com/nlohmann/json/issues/593) +*/ +template +class iter_impl // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions) +{ + /// the iterator with BasicJsonType of different const-ness + using other_iter_impl = iter_impl::value, typename std::remove_const::type, const BasicJsonType>::type>; + /// allow basic_json to access private members + friend other_iter_impl; + friend BasicJsonType; + friend iteration_proxy; + friend iteration_proxy_value; + + using object_t = typename BasicJsonType::object_t; + using array_t = typename BasicJsonType::array_t; + // make sure BasicJsonType is basic_json or const basic_json + static_assert(is_basic_json::type>::value, + "iter_impl only accepts (const) basic_json"); + + public: + + /// The std::iterator class template (used as a base class to provide typedefs) is deprecated in C++17. + /// The C++ Standard has never required user-defined iterators to derive from std::iterator. + /// A user-defined iterator should provide publicly accessible typedefs named + /// iterator_category, value_type, difference_type, pointer, and reference. + /// Note that value_type is required to be non-const, even for constant iterators. + using iterator_category = std::bidirectional_iterator_tag; + + /// the type of the values when the iterator is dereferenced + using value_type = typename BasicJsonType::value_type; + /// a type to represent differences between iterators + using difference_type = typename BasicJsonType::difference_type; + /// defines a pointer to the type iterated over (value_type) + using pointer = typename std::conditional::value, + typename BasicJsonType::const_pointer, + typename BasicJsonType::pointer>::type; + /// defines a reference to the type iterated over (value_type) + using reference = + typename std::conditional::value, + typename BasicJsonType::const_reference, + typename BasicJsonType::reference>::type; + + iter_impl() = default; + ~iter_impl() = default; + iter_impl(iter_impl&&) noexcept = default; + iter_impl& operator=(iter_impl&&) noexcept = default; + + /*! + @brief constructor for a given JSON instance + @param[in] object pointer to a JSON object for this iterator + @pre object != nullptr + @post The iterator is initialized; i.e. `m_object != nullptr`. + */ + explicit iter_impl(pointer object) noexcept : m_object(object) + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + m_it.object_iterator = typename object_t::iterator(); + break; + } + + case value_t::array: + { + m_it.array_iterator = typename array_t::iterator(); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator = primitive_iterator_t(); + break; + } + } + } + + /*! + @note The conventional copy constructor and copy assignment are implicitly + defined. Combined with the following converting constructor and + assignment, they support: (1) copy from iterator to iterator, (2) + copy from const iterator to const iterator, and (3) conversion from + iterator to const iterator. However conversion from const iterator + to iterator is not defined. + */ + + /*! + @brief const copy constructor + @param[in] other const iterator to copy from + @note This copy constructor had to be defined explicitly to circumvent a bug + occurring on msvc v19.0 compiler (VS 2015) debug build. For more + information refer to: https://github.com/nlohmann/json/issues/1608 + */ + iter_impl(const iter_impl& other) noexcept + : m_object(other.m_object), m_it(other.m_it) + {} + + /*! + @brief converting assignment + @param[in] other const iterator to copy from + @return const/non-const iterator + @note It is not checked whether @a other is initialized. + */ + iter_impl& operator=(const iter_impl& other) noexcept + { + if (&other != this) + { + m_object = other.m_object; + m_it = other.m_it; + } + return *this; + } + + /*! + @brief converting constructor + @param[in] other non-const iterator to copy from + @note It is not checked whether @a other is initialized. + */ + iter_impl(const iter_impl::type>& other) noexcept + : m_object(other.m_object), m_it(other.m_it) + {} + + /*! + @brief converting assignment + @param[in] other non-const iterator to copy from + @return const/non-const iterator + @note It is not checked whether @a other is initialized. + */ + iter_impl& operator=(const iter_impl::type>& other) noexcept // NOLINT(cert-oop54-cpp) + { + m_object = other.m_object; + m_it = other.m_it; + return *this; + } + + JSON_PRIVATE_UNLESS_TESTED: + /*! + @brief set the iterator to the first value + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + void set_begin() noexcept + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + m_it.object_iterator = m_object->m_value.object->begin(); + break; + } + + case value_t::array: + { + m_it.array_iterator = m_object->m_value.array->begin(); + break; + } + + case value_t::null: + { + // set to end so begin()==end() is true: null is empty + m_it.primitive_iterator.set_end(); + break; + } + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator.set_begin(); + break; + } + } + } + + /*! + @brief set the iterator past the last value + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + void set_end() noexcept + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + m_it.object_iterator = m_object->m_value.object->end(); + break; + } + + case value_t::array: + { + m_it.array_iterator = m_object->m_value.array->end(); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator.set_end(); + break; + } + } + } + + public: + /*! + @brief return a reference to the value pointed to by the iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + reference operator*() const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + JSON_ASSERT(m_it.object_iterator != m_object->m_value.object->end()); + return m_it.object_iterator->second; + } + + case value_t::array: + { + JSON_ASSERT(m_it.array_iterator != m_object->m_value.array->end()); + return *m_it.array_iterator; + } + + case value_t::null: + JSON_THROW(invalid_iterator::create(214, "cannot get value", *m_object)); + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin())) + { + return *m_object; + } + + JSON_THROW(invalid_iterator::create(214, "cannot get value", *m_object)); + } + } + } + + /*! + @brief dereference the iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + pointer operator->() const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + JSON_ASSERT(m_it.object_iterator != m_object->m_value.object->end()); + return &(m_it.object_iterator->second); + } + + case value_t::array: + { + JSON_ASSERT(m_it.array_iterator != m_object->m_value.array->end()); + return &*m_it.array_iterator; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin())) + { + return m_object; + } + + JSON_THROW(invalid_iterator::create(214, "cannot get value", *m_object)); + } + } + } + + /*! + @brief post-increment (it++) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl const operator++(int) // NOLINT(readability-const-return-type) + { + auto result = *this; + ++(*this); + return result; + } + + /*! + @brief pre-increment (++it) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator++() + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + std::advance(m_it.object_iterator, 1); + break; + } + + case value_t::array: + { + std::advance(m_it.array_iterator, 1); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + ++m_it.primitive_iterator; + break; + } + } + + return *this; + } + + /*! + @brief post-decrement (it--) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl const operator--(int) // NOLINT(readability-const-return-type) + { + auto result = *this; + --(*this); + return result; + } + + /*! + @brief pre-decrement (--it) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator--() + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + { + std::advance(m_it.object_iterator, -1); + break; + } + + case value_t::array: + { + std::advance(m_it.array_iterator, -1); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + --m_it.primitive_iterator; + break; + } + } + + return *this; + } + + /*! + @brief comparison: equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + template < typename IterImpl, detail::enable_if_t < (std::is_same::value || std::is_same::value), std::nullptr_t > = nullptr > + bool operator==(const IterImpl& other) const + { + // if objects are not the same, the comparison is undefined + if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object)) + { + JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers", *m_object)); + } + + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + return (m_it.object_iterator == other.m_it.object_iterator); + + case value_t::array: + return (m_it.array_iterator == other.m_it.array_iterator); + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return (m_it.primitive_iterator == other.m_it.primitive_iterator); + } + } + + /*! + @brief comparison: not equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + template < typename IterImpl, detail::enable_if_t < (std::is_same::value || std::is_same::value), std::nullptr_t > = nullptr > + bool operator!=(const IterImpl& other) const + { + return !operator==(other); + } + + /*! + @brief comparison: smaller + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator<(const iter_impl& other) const + { + // if objects are not the same, the comparison is undefined + if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object)) + { + JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers", *m_object)); + } + + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(213, "cannot compare order of object iterators", *m_object)); + + case value_t::array: + return (m_it.array_iterator < other.m_it.array_iterator); + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return (m_it.primitive_iterator < other.m_it.primitive_iterator); + } + } + + /*! + @brief comparison: less than or equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator<=(const iter_impl& other) const + { + return !other.operator < (*this); + } + + /*! + @brief comparison: greater than + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator>(const iter_impl& other) const + { + return !operator<=(other); + } + + /*! + @brief comparison: greater than or equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator>=(const iter_impl& other) const + { + return !operator<(other); + } + + /*! + @brief add to iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator+=(difference_type i) + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators", *m_object)); + + case value_t::array: + { + std::advance(m_it.array_iterator, i); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator += i; + break; + } + } + + return *this; + } + + /*! + @brief subtract from iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator-=(difference_type i) + { + return operator+=(-i); + } + + /*! + @brief add to iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl operator+(difference_type i) const + { + auto result = *this; + result += i; + return result; + } + + /*! + @brief addition of distance and iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + friend iter_impl operator+(difference_type i, const iter_impl& it) + { + auto result = it; + result += i; + return result; + } + + /*! + @brief subtract from iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl operator-(difference_type i) const + { + auto result = *this; + result -= i; + return result; + } + + /*! + @brief return difference + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + difference_type operator-(const iter_impl& other) const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators", *m_object)); + + case value_t::array: + return m_it.array_iterator - other.m_it.array_iterator; + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return m_it.primitive_iterator - other.m_it.primitive_iterator; + } + } + + /*! + @brief access to successor + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + reference operator[](difference_type n) const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(208, "cannot use operator[] for object iterators", *m_object)); + + case value_t::array: + return *std::next(m_it.array_iterator, n); + + case value_t::null: + JSON_THROW(invalid_iterator::create(214, "cannot get value", *m_object)); + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.get_value() == -n)) + { + return *m_object; + } + + JSON_THROW(invalid_iterator::create(214, "cannot get value", *m_object)); + } + } + } + + /*! + @brief return the key of an object iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + const typename object_t::key_type& key() const + { + JSON_ASSERT(m_object != nullptr); + + if (JSON_HEDLEY_LIKELY(m_object->is_object())) + { + return m_it.object_iterator->first; + } + + JSON_THROW(invalid_iterator::create(207, "cannot use key() for non-object iterators", *m_object)); + } + + /*! + @brief return the value of an iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + reference value() const + { + return operator*(); + } + + JSON_PRIVATE_UNLESS_TESTED: + /// associated JSON instance + pointer m_object = nullptr; + /// the actual iterator of the associated instance + internal_iterator::type> m_it {}; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +#include // ptrdiff_t +#include // reverse_iterator +#include // declval + +namespace nlohmann +{ +namespace detail +{ +////////////////////// +// reverse_iterator // +////////////////////// + +/*! +@brief a template for a reverse iterator class + +@tparam Base the base iterator type to reverse. Valid types are @ref +iterator (to create @ref reverse_iterator) and @ref const_iterator (to +create @ref const_reverse_iterator). + +@requirement The class satisfies the following concept requirements: +- +[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator): + The iterator that can be moved can be moved in both directions (i.e. + incremented and decremented). +- [OutputIterator](https://en.cppreference.com/w/cpp/named_req/OutputIterator): + It is possible to write to the pointed-to element (only if @a Base is + @ref iterator). + +@since version 1.0.0 +*/ +template +class json_reverse_iterator : public std::reverse_iterator +{ + public: + using difference_type = std::ptrdiff_t; + /// shortcut to the reverse iterator adapter + using base_iterator = std::reverse_iterator; + /// the reference type for the pointed-to element + using reference = typename Base::reference; + + /// create reverse iterator from iterator + explicit json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept + : base_iterator(it) {} + + /// create reverse iterator from base class + explicit json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {} + + /// post-increment (it++) + json_reverse_iterator const operator++(int) // NOLINT(readability-const-return-type) + { + return static_cast(base_iterator::operator++(1)); + } + + /// pre-increment (++it) + json_reverse_iterator& operator++() + { + return static_cast(base_iterator::operator++()); + } + + /// post-decrement (it--) + json_reverse_iterator const operator--(int) // NOLINT(readability-const-return-type) + { + return static_cast(base_iterator::operator--(1)); + } + + /// pre-decrement (--it) + json_reverse_iterator& operator--() + { + return static_cast(base_iterator::operator--()); + } + + /// add to iterator + json_reverse_iterator& operator+=(difference_type i) + { + return static_cast(base_iterator::operator+=(i)); + } + + /// add to iterator + json_reverse_iterator operator+(difference_type i) const + { + return static_cast(base_iterator::operator+(i)); + } + + /// subtract from iterator + json_reverse_iterator operator-(difference_type i) const + { + return static_cast(base_iterator::operator-(i)); + } + + /// return difference + difference_type operator-(const json_reverse_iterator& other) const + { + return base_iterator(*this) - base_iterator(other); + } + + /// access to successor + reference operator[](difference_type n) const + { + return *(this->operator+(n)); + } + + /// return the key of an object iterator + auto key() const -> decltype(std::declval().key()) + { + auto it = --this->base(); + return it.key(); + } + + /// return the value of an iterator + reference value() const + { + auto it = --this->base(); + return it.operator * (); + } +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +#include // all_of +#include // isdigit +#include // max +#include // accumulate +#include // string +#include // move +#include // vector + +// #include + +// #include + +// #include + +// #include + + +namespace nlohmann +{ + +/// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document +/// @sa https://json.nlohmann.me/api/json_pointer/ +template +class json_pointer +{ + // allow basic_json to access private members + NLOHMANN_BASIC_JSON_TPL_DECLARATION + friend class basic_json; + + public: + /// @brief create JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/json_pointer/ + explicit json_pointer(const std::string& s = "") + : reference_tokens(split(s)) + {} + + /// @brief return a string representation of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/to_string/ + std::string to_string() const + { + return std::accumulate(reference_tokens.begin(), reference_tokens.end(), + std::string{}, + [](const std::string & a, const std::string & b) + { + return a + "/" + detail::escape(b); + }); + } + + /// @brief return a string representation of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_string/ + operator std::string() const + { + return to_string(); + } + + /// @brief append another JSON pointer at the end of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/ + json_pointer& operator/=(const json_pointer& ptr) + { + reference_tokens.insert(reference_tokens.end(), + ptr.reference_tokens.begin(), + ptr.reference_tokens.end()); + return *this; + } + + /// @brief append an unescaped reference token at the end of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/ + json_pointer& operator/=(std::string token) + { + push_back(std::move(token)); + return *this; + } + + /// @brief append an array index at the end of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/ + json_pointer& operator/=(std::size_t array_idx) + { + return *this /= std::to_string(array_idx); + } + + /// @brief create a new JSON pointer by appending the right JSON pointer at the end of the left JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/ + friend json_pointer operator/(const json_pointer& lhs, + const json_pointer& rhs) + { + return json_pointer(lhs) /= rhs; + } + + /// @brief create a new JSON pointer by appending the unescaped token at the end of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/ + friend json_pointer operator/(const json_pointer& lhs, std::string token) // NOLINT(performance-unnecessary-value-param) + { + return json_pointer(lhs) /= std::move(token); + } + + /// @brief create a new JSON pointer by appending the array-index-token at the end of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/ + friend json_pointer operator/(const json_pointer& lhs, std::size_t array_idx) + { + return json_pointer(lhs) /= array_idx; + } + + /// @brief returns the parent of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/parent_pointer/ + json_pointer parent_pointer() const + { + if (empty()) + { + return *this; + } + + json_pointer res = *this; + res.pop_back(); + return res; + } + + /// @brief remove last reference token + /// @sa https://json.nlohmann.me/api/json_pointer/pop_back/ + void pop_back() + { + if (JSON_HEDLEY_UNLIKELY(empty())) + { + JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", BasicJsonType())); + } + + reference_tokens.pop_back(); + } + + /// @brief return last reference token + /// @sa https://json.nlohmann.me/api/json_pointer/back/ + const std::string& back() const + { + if (JSON_HEDLEY_UNLIKELY(empty())) + { + JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", BasicJsonType())); + } + + return reference_tokens.back(); + } + + /// @brief append an unescaped token at the end of the reference pointer + /// @sa https://json.nlohmann.me/api/json_pointer/push_back/ + void push_back(const std::string& token) + { + reference_tokens.push_back(token); + } + + /// @brief append an unescaped token at the end of the reference pointer + /// @sa https://json.nlohmann.me/api/json_pointer/push_back/ + void push_back(std::string&& token) + { + reference_tokens.push_back(std::move(token)); + } + + /// @brief return whether pointer points to the root document + /// @sa https://json.nlohmann.me/api/json_pointer/empty/ + bool empty() const noexcept + { + return reference_tokens.empty(); + } + + private: + /*! + @param[in] s reference token to be converted into an array index + + @return integer representation of @a s + + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index begins not with a digit + @throw out_of_range.404 if string @a s could not be converted to an integer + @throw out_of_range.410 if an array index exceeds size_type + */ + static typename BasicJsonType::size_type array_index(const std::string& s) + { + using size_type = typename BasicJsonType::size_type; + + // error condition (cf. RFC 6901, Sect. 4) + if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && s[0] == '0')) + { + JSON_THROW(detail::parse_error::create(106, 0, "array index '" + s + "' must not begin with '0'", BasicJsonType())); + } + + // error condition (cf. RFC 6901, Sect. 4) + if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && !(s[0] >= '1' && s[0] <= '9'))) + { + JSON_THROW(detail::parse_error::create(109, 0, "array index '" + s + "' is not a number", BasicJsonType())); + } + + std::size_t processed_chars = 0; + unsigned long long res = 0; // NOLINT(runtime/int) + JSON_TRY + { + res = std::stoull(s, &processed_chars); + } + JSON_CATCH(std::out_of_range&) + { + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + s + "'", BasicJsonType())); + } + + // check if the string was completely read + if (JSON_HEDLEY_UNLIKELY(processed_chars != s.size())) + { + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + s + "'", BasicJsonType())); + } + + // only triggered on special platforms (like 32bit), see also + // https://github.com/nlohmann/json/pull/2203 + if (res >= static_cast((std::numeric_limits::max)())) // NOLINT(runtime/int) + { + JSON_THROW(detail::out_of_range::create(410, "array index " + s + " exceeds size_type", BasicJsonType())); // LCOV_EXCL_LINE + } + + return static_cast(res); + } + + JSON_PRIVATE_UNLESS_TESTED: + json_pointer top() const + { + if (JSON_HEDLEY_UNLIKELY(empty())) + { + JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", BasicJsonType())); + } + + json_pointer result = *this; + result.reference_tokens = {reference_tokens[0]}; + return result; + } + + private: + /*! + @brief create and return a reference to the pointed to value + + @complexity Linear in the number of reference tokens. + + @throw parse_error.109 if array index is not a number + @throw type_error.313 if value cannot be unflattened + */ + BasicJsonType& get_and_create(BasicJsonType& j) const + { + auto* result = &j; + + // in case no reference tokens exist, return a reference to the JSON value + // j which will be overwritten by a primitive value + for (const auto& reference_token : reference_tokens) + { + switch (result->type()) + { + case detail::value_t::null: + { + if (reference_token == "0") + { + // start a new array if reference token is 0 + result = &result->operator[](0); + } + else + { + // start a new object otherwise + result = &result->operator[](reference_token); + } + break; + } + + case detail::value_t::object: + { + // create an entry in the object + result = &result->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + // create an entry in the array + result = &result->operator[](array_index(reference_token)); + break; + } + + /* + The following code is only reached if there exists a reference + token _and_ the current value is primitive. In this case, we have + an error situation, because primitive values may only occur as + single value; that is, with an empty list of reference tokens. + */ + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::type_error::create(313, "invalid value to unflatten", j)); + } + } + + return *result; + } + + /*! + @brief return a reference to the pointed to value + + @note This version does not throw if a value is not present, but tries to + create nested values instead. For instance, calling this function + with pointer `"/this/that"` on a null value is equivalent to calling + `operator[]("this").operator[]("that")` on that value, effectively + changing the null value to an object. + + @param[in] ptr a JSON value + + @return reference to the JSON value pointed to by the JSON pointer + + @complexity Linear in the length of the JSON pointer. + + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + BasicJsonType& get_unchecked(BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + // convert null values to arrays or objects before continuing + if (ptr->is_null()) + { + // check if reference token is a number + const bool nums = + std::all_of(reference_token.begin(), reference_token.end(), + [](const unsigned char x) + { + return std::isdigit(x); + }); + + // change value to array for numbers or "-" or to object otherwise + *ptr = (nums || reference_token == "-") + ? detail::value_t::array + : detail::value_t::object; + } + + switch (ptr->type()) + { + case detail::value_t::object: + { + // use unchecked object access + ptr = &ptr->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + if (reference_token == "-") + { + // explicitly treat "-" as index beyond the end + ptr = &ptr->operator[](ptr->m_value.array->size()); + } + else + { + // convert array index to number; unchecked access + ptr = &ptr->operator[](array_index(reference_token)); + } + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'", *ptr)); + } + } + + return *ptr; + } + + /*! + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.402 if the array index '-' is used + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + BasicJsonType& get_checked(BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + // note: at performs range check + ptr = &ptr->at(reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" always fails the range check + JSON_THROW(detail::out_of_range::create(402, + "array index '-' (" + std::to_string(ptr->m_value.array->size()) + + ") is out of range", *ptr)); + } + + // note: at performs range check + ptr = &ptr->at(array_index(reference_token)); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'", *ptr)); + } + } + + return *ptr; + } + + /*! + @brief return a const reference to the pointed to value + + @param[in] ptr a JSON value + + @return const reference to the JSON value pointed to by the JSON + pointer + + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.402 if the array index '-' is used + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + const BasicJsonType& get_unchecked(const BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + // use unchecked object access + ptr = &ptr->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" cannot be used for const access + JSON_THROW(detail::out_of_range::create(402, "array index '-' (" + std::to_string(ptr->m_value.array->size()) + ") is out of range", *ptr)); + } + + // use unchecked array access + ptr = &ptr->operator[](array_index(reference_token)); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'", *ptr)); + } + } + + return *ptr; + } + + /*! + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.402 if the array index '-' is used + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + const BasicJsonType& get_checked(const BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + // note: at performs range check + ptr = &ptr->at(reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" always fails the range check + JSON_THROW(detail::out_of_range::create(402, + "array index '-' (" + std::to_string(ptr->m_value.array->size()) + + ") is out of range", *ptr)); + } + + // note: at performs range check + ptr = &ptr->at(array_index(reference_token)); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'", *ptr)); + } + } + + return *ptr; + } + + /*! + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + */ + bool contains(const BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + if (!ptr->contains(reference_token)) + { + // we did not find the key in the object + return false; + } + + ptr = &ptr->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" always fails the range check + return false; + } + if (JSON_HEDLEY_UNLIKELY(reference_token.size() == 1 && !("0" <= reference_token && reference_token <= "9"))) + { + // invalid char + return false; + } + if (JSON_HEDLEY_UNLIKELY(reference_token.size() > 1)) + { + if (JSON_HEDLEY_UNLIKELY(!('1' <= reference_token[0] && reference_token[0] <= '9'))) + { + // first char should be between '1' and '9' + return false; + } + for (std::size_t i = 1; i < reference_token.size(); i++) + { + if (JSON_HEDLEY_UNLIKELY(!('0' <= reference_token[i] && reference_token[i] <= '9'))) + { + // other char should be between '0' and '9' + return false; + } + } + } + + const auto idx = array_index(reference_token); + if (idx >= ptr->size()) + { + // index out of range + return false; + } + + ptr = &ptr->operator[](idx); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + { + // we do not expect primitive values if there is still a + // reference token to process + return false; + } + } + } + + // no reference token left means we found a primitive value + return true; + } + + /*! + @brief split the string input to reference tokens + + @note This function is only called by the json_pointer constructor. + All exceptions below are documented there. + + @throw parse_error.107 if the pointer is not empty or begins with '/' + @throw parse_error.108 if character '~' is not followed by '0' or '1' + */ + static std::vector split(const std::string& reference_string) + { + std::vector result; + + // special case: empty reference string -> no reference tokens + if (reference_string.empty()) + { + return result; + } + + // check if nonempty reference string begins with slash + if (JSON_HEDLEY_UNLIKELY(reference_string[0] != '/')) + { + JSON_THROW(detail::parse_error::create(107, 1, "JSON pointer must be empty or begin with '/' - was: '" + reference_string + "'", BasicJsonType())); + } + + // extract the reference tokens: + // - slash: position of the last read slash (or end of string) + // - start: position after the previous slash + for ( + // search for the first slash after the first character + std::size_t slash = reference_string.find_first_of('/', 1), + // set the beginning of the first reference token + start = 1; + // we can stop if start == 0 (if slash == std::string::npos) + start != 0; + // set the beginning of the next reference token + // (will eventually be 0 if slash == std::string::npos) + start = (slash == std::string::npos) ? 0 : slash + 1, + // find next slash + slash = reference_string.find_first_of('/', start)) + { + // use the text between the beginning of the reference token + // (start) and the last slash (slash). + auto reference_token = reference_string.substr(start, slash - start); + + // check reference tokens are properly escaped + for (std::size_t pos = reference_token.find_first_of('~'); + pos != std::string::npos; + pos = reference_token.find_first_of('~', pos + 1)) + { + JSON_ASSERT(reference_token[pos] == '~'); + + // ~ must be followed by 0 or 1 + if (JSON_HEDLEY_UNLIKELY(pos == reference_token.size() - 1 || + (reference_token[pos + 1] != '0' && + reference_token[pos + 1] != '1'))) + { + JSON_THROW(detail::parse_error::create(108, 0, "escape character '~' must be followed with '0' or '1'", BasicJsonType())); + } + } + + // finally, store the reference token + detail::unescape(reference_token); + result.push_back(reference_token); + } + + return result; + } + + private: + /*! + @param[in] reference_string the reference string to the current value + @param[in] value the value to consider + @param[in,out] result the result object to insert values to + + @note Empty objects or arrays are flattened to `null`. + */ + static void flatten(const std::string& reference_string, + const BasicJsonType& value, + BasicJsonType& result) + { + switch (value.type()) + { + case detail::value_t::array: + { + if (value.m_value.array->empty()) + { + // flatten empty array as null + result[reference_string] = nullptr; + } + else + { + // iterate array and use index as reference string + for (std::size_t i = 0; i < value.m_value.array->size(); ++i) + { + flatten(reference_string + "/" + std::to_string(i), + value.m_value.array->operator[](i), result); + } + } + break; + } + + case detail::value_t::object: + { + if (value.m_value.object->empty()) + { + // flatten empty object as null + result[reference_string] = nullptr; + } + else + { + // iterate object and use keys as reference string + for (const auto& element : *value.m_value.object) + { + flatten(reference_string + "/" + detail::escape(element.first), element.second, result); + } + } + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + { + // add primitive value with its reference string + result[reference_string] = value; + break; + } + } + } + + /*! + @param[in] value flattened JSON + + @return unflattened JSON + + @throw parse_error.109 if array index is not a number + @throw type_error.314 if value is not an object + @throw type_error.315 if object values are not primitive + @throw type_error.313 if value cannot be unflattened + */ + static BasicJsonType + unflatten(const BasicJsonType& value) + { + if (JSON_HEDLEY_UNLIKELY(!value.is_object())) + { + JSON_THROW(detail::type_error::create(314, "only objects can be unflattened", value)); + } + + BasicJsonType result; + + // iterate the JSON object values + for (const auto& element : *value.m_value.object) + { + if (JSON_HEDLEY_UNLIKELY(!element.second.is_primitive())) + { + JSON_THROW(detail::type_error::create(315, "values in object must be primitive", element.second)); + } + + // assign value to reference pointed to by JSON pointer; Note that if + // the JSON pointer is "" (i.e., points to the whole value), function + // get_and_create returns a reference to result itself. An assignment + // will then create a primitive value. + json_pointer(element.first).get_and_create(result) = element.second; + } + + return result; + } + + /*! + @brief compares two JSON pointers for equality + + @param[in] lhs JSON pointer to compare + @param[in] rhs JSON pointer to compare + @return whether @a lhs is equal to @a rhs + + @complexity Linear in the length of the JSON pointer + + @exceptionsafety No-throw guarantee: this function never throws exceptions. + */ + friend bool operator==(json_pointer const& lhs, + json_pointer const& rhs) noexcept + { + return lhs.reference_tokens == rhs.reference_tokens; + } + + /*! + @brief compares two JSON pointers for inequality + + @param[in] lhs JSON pointer to compare + @param[in] rhs JSON pointer to compare + @return whether @a lhs is not equal @a rhs + + @complexity Linear in the length of the JSON pointer + + @exceptionsafety No-throw guarantee: this function never throws exceptions. + */ + friend bool operator!=(json_pointer const& lhs, + json_pointer const& rhs) noexcept + { + return !(lhs == rhs); + } + + /// the reference tokens + std::vector reference_tokens; +}; +} // namespace nlohmann + +// #include + + +#include +#include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +template +class json_ref +{ + public: + using value_type = BasicJsonType; + + json_ref(value_type&& value) + : owned_value(std::move(value)) + {} + + json_ref(const value_type& value) + : value_ref(&value) + {} + + json_ref(std::initializer_list init) + : owned_value(init) + {} + + template < + class... Args, + enable_if_t::value, int> = 0 > + json_ref(Args && ... args) + : owned_value(std::forward(args)...) + {} + + // class should be movable only + json_ref(json_ref&&) noexcept = default; + json_ref(const json_ref&) = delete; + json_ref& operator=(const json_ref&) = delete; + json_ref& operator=(json_ref&&) = delete; + ~json_ref() = default; + + value_type moved_or_copied() const + { + if (value_ref == nullptr) + { + return std::move(owned_value); + } + return *value_ref; + } + + value_type const& operator*() const + { + return value_ref ? *value_ref : owned_value; + } + + value_type const* operator->() const + { + return &** this; + } + + private: + mutable value_type owned_value = nullptr; + value_type const* value_ref = nullptr; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + +// #include + +// #include + +// #include + + +#include // reverse +#include // array +#include // isnan, isinf +#include // uint8_t, uint16_t, uint32_t, uint64_t +#include // memcpy +#include // numeric_limits +#include // string +#include // move + +// #include + +// #include + +// #include + + +#include // copy +#include // size_t +#include // back_inserter +#include // shared_ptr, make_shared +#include // basic_string +#include // vector + +#ifndef JSON_NO_IO + #include // streamsize + #include // basic_ostream +#endif // JSON_NO_IO + +// #include + + +namespace nlohmann +{ +namespace detail +{ +/// abstract output adapter interface +template struct output_adapter_protocol +{ + virtual void write_character(CharType c) = 0; + virtual void write_characters(const CharType* s, std::size_t length) = 0; + virtual ~output_adapter_protocol() = default; + + output_adapter_protocol() = default; + output_adapter_protocol(const output_adapter_protocol&) = default; + output_adapter_protocol(output_adapter_protocol&&) noexcept = default; + output_adapter_protocol& operator=(const output_adapter_protocol&) = default; + output_adapter_protocol& operator=(output_adapter_protocol&&) noexcept = default; +}; + +/// a type to simplify interfaces +template +using output_adapter_t = std::shared_ptr>; + +/// output adapter for byte vectors +template> +class output_vector_adapter : public output_adapter_protocol +{ + public: + explicit output_vector_adapter(std::vector& vec) noexcept + : v(vec) + {} + + void write_character(CharType c) override + { + v.push_back(c); + } + + JSON_HEDLEY_NON_NULL(2) + void write_characters(const CharType* s, std::size_t length) override + { + std::copy(s, s + length, std::back_inserter(v)); + } + + private: + std::vector& v; +}; + +#ifndef JSON_NO_IO +/// output adapter for output streams +template +class output_stream_adapter : public output_adapter_protocol +{ + public: + explicit output_stream_adapter(std::basic_ostream& s) noexcept + : stream(s) + {} + + void write_character(CharType c) override + { + stream.put(c); + } + + JSON_HEDLEY_NON_NULL(2) + void write_characters(const CharType* s, std::size_t length) override + { + stream.write(s, static_cast(length)); + } + + private: + std::basic_ostream& stream; +}; +#endif // JSON_NO_IO + +/// output adapter for basic_string +template> +class output_string_adapter : public output_adapter_protocol +{ + public: + explicit output_string_adapter(StringType& s) noexcept + : str(s) + {} + + void write_character(CharType c) override + { + str.push_back(c); + } + + JSON_HEDLEY_NON_NULL(2) + void write_characters(const CharType* s, std::size_t length) override + { + str.append(s, length); + } + + private: + StringType& str; +}; + +template> +class output_adapter +{ + public: + template> + output_adapter(std::vector& vec) + : oa(std::make_shared>(vec)) {} + +#ifndef JSON_NO_IO + output_adapter(std::basic_ostream& s) + : oa(std::make_shared>(s)) {} +#endif // JSON_NO_IO + + output_adapter(StringType& s) + : oa(std::make_shared>(s)) {} + + operator output_adapter_t() + { + return oa; + } + + private: + output_adapter_t oa = nullptr; +}; +} // namespace detail +} // namespace nlohmann + + +namespace nlohmann +{ +namespace detail +{ +/////////////////// +// binary writer // +/////////////////// + +/*! +@brief serialization to CBOR and MessagePack values +*/ +template +class binary_writer +{ + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using number_float_t = typename BasicJsonType::number_float_t; + + public: + /*! + @brief create a binary writer + + @param[in] adapter output adapter to write to + */ + explicit binary_writer(output_adapter_t adapter) : oa(std::move(adapter)) + { + JSON_ASSERT(oa); + } + + /*! + @param[in] j JSON value to serialize + @pre j.type() == value_t::object + */ + void write_bson(const BasicJsonType& j) + { + switch (j.type()) + { + case value_t::object: + { + write_bson_object(*j.m_value.object); + break; + } + + case value_t::null: + case value_t::array: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + JSON_THROW(type_error::create(317, "to serialize to BSON, top-level type must be object, but is " + std::string(j.type_name()), j)); + } + } + } + + /*! + @param[in] j JSON value to serialize + */ + void write_cbor(const BasicJsonType& j) + { + switch (j.type()) + { + case value_t::null: + { + oa->write_character(to_char_type(0xF6)); + break; + } + + case value_t::boolean: + { + oa->write_character(j.m_value.boolean + ? to_char_type(0xF5) + : to_char_type(0xF4)); + break; + } + + case value_t::number_integer: + { + if (j.m_value.number_integer >= 0) + { + // CBOR does not differentiate between positive signed + // integers and unsigned integers. Therefore, we used the + // code from the value_t::number_unsigned case here. + if (j.m_value.number_integer <= 0x17) + { + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x18)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x19)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x1A)); + write_number(static_cast(j.m_value.number_integer)); + } + else + { + oa->write_character(to_char_type(0x1B)); + write_number(static_cast(j.m_value.number_integer)); + } + } + else + { + // The conversions below encode the sign in the first + // byte, and the value is converted to a positive number. + const auto positive_number = -1 - j.m_value.number_integer; + if (j.m_value.number_integer >= -24) + { + write_number(static_cast(0x20 + positive_number)); + } + else if (positive_number <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x38)); + write_number(static_cast(positive_number)); + } + else if (positive_number <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x39)); + write_number(static_cast(positive_number)); + } + else if (positive_number <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x3A)); + write_number(static_cast(positive_number)); + } + else + { + oa->write_character(to_char_type(0x3B)); + write_number(static_cast(positive_number)); + } + } + break; + } + + case value_t::number_unsigned: + { + if (j.m_value.number_unsigned <= 0x17) + { + write_number(static_cast(j.m_value.number_unsigned)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x18)); + write_number(static_cast(j.m_value.number_unsigned)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x19)); + write_number(static_cast(j.m_value.number_unsigned)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x1A)); + write_number(static_cast(j.m_value.number_unsigned)); + } + else + { + oa->write_character(to_char_type(0x1B)); + write_number(static_cast(j.m_value.number_unsigned)); + } + break; + } + + case value_t::number_float: + { + if (std::isnan(j.m_value.number_float)) + { + // NaN is 0xf97e00 in CBOR + oa->write_character(to_char_type(0xF9)); + oa->write_character(to_char_type(0x7E)); + oa->write_character(to_char_type(0x00)); + } + else if (std::isinf(j.m_value.number_float)) + { + // Infinity is 0xf97c00, -Infinity is 0xf9fc00 + oa->write_character(to_char_type(0xf9)); + oa->write_character(j.m_value.number_float > 0 ? to_char_type(0x7C) : to_char_type(0xFC)); + oa->write_character(to_char_type(0x00)); + } + else + { + write_compact_float(j.m_value.number_float, detail::input_format_t::cbor); + } + break; + } + + case value_t::string: + { + // step 1: write control byte and the string length + const auto N = j.m_value.string->size(); + if (N <= 0x17) + { + write_number(static_cast(0x60 + N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x78)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x79)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x7A)); + write_number(static_cast(N)); + } + // LCOV_EXCL_START + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x7B)); + write_number(static_cast(N)); + } + // LCOV_EXCL_STOP + + // step 2: write the string + oa->write_characters( + reinterpret_cast(j.m_value.string->c_str()), + j.m_value.string->size()); + break; + } + + case value_t::array: + { + // step 1: write control byte and the array size + const auto N = j.m_value.array->size(); + if (N <= 0x17) + { + write_number(static_cast(0x80 + N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x98)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x99)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x9A)); + write_number(static_cast(N)); + } + // LCOV_EXCL_START + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x9B)); + write_number(static_cast(N)); + } + // LCOV_EXCL_STOP + + // step 2: write each element + for (const auto& el : *j.m_value.array) + { + write_cbor(el); + } + break; + } + + case value_t::binary: + { + if (j.m_value.binary->has_subtype()) + { + if (j.m_value.binary->subtype() <= (std::numeric_limits::max)()) + { + write_number(static_cast(0xd8)); + write_number(static_cast(j.m_value.binary->subtype())); + } + else if (j.m_value.binary->subtype() <= (std::numeric_limits::max)()) + { + write_number(static_cast(0xd9)); + write_number(static_cast(j.m_value.binary->subtype())); + } + else if (j.m_value.binary->subtype() <= (std::numeric_limits::max)()) + { + write_number(static_cast(0xda)); + write_number(static_cast(j.m_value.binary->subtype())); + } + else if (j.m_value.binary->subtype() <= (std::numeric_limits::max)()) + { + write_number(static_cast(0xdb)); + write_number(static_cast(j.m_value.binary->subtype())); + } + } + + // step 1: write control byte and the binary array size + const auto N = j.m_value.binary->size(); + if (N <= 0x17) + { + write_number(static_cast(0x40 + N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x58)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x59)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x5A)); + write_number(static_cast(N)); + } + // LCOV_EXCL_START + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0x5B)); + write_number(static_cast(N)); + } + // LCOV_EXCL_STOP + + // step 2: write each element + oa->write_characters( + reinterpret_cast(j.m_value.binary->data()), + N); + + break; + } + + case value_t::object: + { + // step 1: write control byte and the object size + const auto N = j.m_value.object->size(); + if (N <= 0x17) + { + write_number(static_cast(0xA0 + N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0xB8)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0xB9)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0xBA)); + write_number(static_cast(N)); + } + // LCOV_EXCL_START + else if (N <= (std::numeric_limits::max)()) + { + oa->write_character(to_char_type(0xBB)); + write_number(static_cast(N)); + } + // LCOV_EXCL_STOP + + // step 2: write each element + for (const auto& el : *j.m_value.object) + { + write_cbor(el.first); + write_cbor(el.second); + } + break; + } + + case value_t::discarded: + default: + break; + } + } + + /*! + @param[in] j JSON value to serialize + */ + void write_msgpack(const BasicJsonType& j) + { + switch (j.type()) + { + case value_t::null: // nil + { + oa->write_character(to_char_type(0xC0)); + break; + } + + case value_t::boolean: // true and false + { + oa->write_character(j.m_value.boolean + ? to_char_type(0xC3) + : to_char_type(0xC2)); + break; + } + + case value_t::number_integer: + { + if (j.m_value.number_integer >= 0) + { + // MessagePack does not differentiate between positive + // signed integers and unsigned integers. Therefore, we used + // the code from the value_t::number_unsigned case here. + if (j.m_value.number_unsigned < 128) + { + // positive fixnum + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 8 + oa->write_character(to_char_type(0xCC)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 16 + oa->write_character(to_char_type(0xCD)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 32 + oa->write_character(to_char_type(0xCE)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 64 + oa->write_character(to_char_type(0xCF)); + write_number(static_cast(j.m_value.number_integer)); + } + } + else + { + if (j.m_value.number_integer >= -32) + { + // negative fixnum + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer >= (std::numeric_limits::min)() && + j.m_value.number_integer <= (std::numeric_limits::max)()) + { + // int 8 + oa->write_character(to_char_type(0xD0)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer >= (std::numeric_limits::min)() && + j.m_value.number_integer <= (std::numeric_limits::max)()) + { + // int 16 + oa->write_character(to_char_type(0xD1)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer >= (std::numeric_limits::min)() && + j.m_value.number_integer <= (std::numeric_limits::max)()) + { + // int 32 + oa->write_character(to_char_type(0xD2)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_integer >= (std::numeric_limits::min)() && + j.m_value.number_integer <= (std::numeric_limits::max)()) + { + // int 64 + oa->write_character(to_char_type(0xD3)); + write_number(static_cast(j.m_value.number_integer)); + } + } + break; + } + + case value_t::number_unsigned: + { + if (j.m_value.number_unsigned < 128) + { + // positive fixnum + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 8 + oa->write_character(to_char_type(0xCC)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 16 + oa->write_character(to_char_type(0xCD)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 32 + oa->write_character(to_char_type(0xCE)); + write_number(static_cast(j.m_value.number_integer)); + } + else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) + { + // uint 64 + oa->write_character(to_char_type(0xCF)); + write_number(static_cast(j.m_value.number_integer)); + } + break; + } + + case value_t::number_float: + { + write_compact_float(j.m_value.number_float, detail::input_format_t::msgpack); + break; + } + + case value_t::string: + { + // step 1: write control byte and the string length + const auto N = j.m_value.string->size(); + if (N <= 31) + { + // fixstr + write_number(static_cast(0xA0 | N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // str 8 + oa->write_character(to_char_type(0xD9)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // str 16 + oa->write_character(to_char_type(0xDA)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // str 32 + oa->write_character(to_char_type(0xDB)); + write_number(static_cast(N)); + } + + // step 2: write the string + oa->write_characters( + reinterpret_cast(j.m_value.string->c_str()), + j.m_value.string->size()); + break; + } + + case value_t::array: + { + // step 1: write control byte and the array size + const auto N = j.m_value.array->size(); + if (N <= 15) + { + // fixarray + write_number(static_cast(0x90 | N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // array 16 + oa->write_character(to_char_type(0xDC)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // array 32 + oa->write_character(to_char_type(0xDD)); + write_number(static_cast(N)); + } + + // step 2: write each element + for (const auto& el : *j.m_value.array) + { + write_msgpack(el); + } + break; + } + + case value_t::binary: + { + // step 0: determine if the binary type has a set subtype to + // determine whether or not to use the ext or fixext types + const bool use_ext = j.m_value.binary->has_subtype(); + + // step 1: write control byte and the byte string length + const auto N = j.m_value.binary->size(); + if (N <= (std::numeric_limits::max)()) + { + std::uint8_t output_type{}; + bool fixed = true; + if (use_ext) + { + switch (N) + { + case 1: + output_type = 0xD4; // fixext 1 + break; + case 2: + output_type = 0xD5; // fixext 2 + break; + case 4: + output_type = 0xD6; // fixext 4 + break; + case 8: + output_type = 0xD7; // fixext 8 + break; + case 16: + output_type = 0xD8; // fixext 16 + break; + default: + output_type = 0xC7; // ext 8 + fixed = false; + break; + } + + } + else + { + output_type = 0xC4; // bin 8 + fixed = false; + } + + oa->write_character(to_char_type(output_type)); + if (!fixed) + { + write_number(static_cast(N)); + } + } + else if (N <= (std::numeric_limits::max)()) + { + std::uint8_t output_type = use_ext + ? 0xC8 // ext 16 + : 0xC5; // bin 16 + + oa->write_character(to_char_type(output_type)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + std::uint8_t output_type = use_ext + ? 0xC9 // ext 32 + : 0xC6; // bin 32 + + oa->write_character(to_char_type(output_type)); + write_number(static_cast(N)); + } + + // step 1.5: if this is an ext type, write the subtype + if (use_ext) + { + write_number(static_cast(j.m_value.binary->subtype())); + } + + // step 2: write the byte string + oa->write_characters( + reinterpret_cast(j.m_value.binary->data()), + N); + + break; + } + + case value_t::object: + { + // step 1: write control byte and the object size + const auto N = j.m_value.object->size(); + if (N <= 15) + { + // fixmap + write_number(static_cast(0x80 | (N & 0xF))); + } + else if (N <= (std::numeric_limits::max)()) + { + // map 16 + oa->write_character(to_char_type(0xDE)); + write_number(static_cast(N)); + } + else if (N <= (std::numeric_limits::max)()) + { + // map 32 + oa->write_character(to_char_type(0xDF)); + write_number(static_cast(N)); + } + + // step 2: write each element + for (const auto& el : *j.m_value.object) + { + write_msgpack(el.first); + write_msgpack(el.second); + } + break; + } + + case value_t::discarded: + default: + break; + } + } + + /*! + @param[in] j JSON value to serialize + @param[in] use_count whether to use '#' prefixes (optimized format) + @param[in] use_type whether to use '$' prefixes (optimized format) + @param[in] add_prefix whether prefixes need to be used for this value + */ + void write_ubjson(const BasicJsonType& j, const bool use_count, + const bool use_type, const bool add_prefix = true) + { + switch (j.type()) + { + case value_t::null: + { + if (add_prefix) + { + oa->write_character(to_char_type('Z')); + } + break; + } + + case value_t::boolean: + { + if (add_prefix) + { + oa->write_character(j.m_value.boolean + ? to_char_type('T') + : to_char_type('F')); + } + break; + } + + case value_t::number_integer: + { + write_number_with_ubjson_prefix(j.m_value.number_integer, add_prefix); + break; + } + + case value_t::number_unsigned: + { + write_number_with_ubjson_prefix(j.m_value.number_unsigned, add_prefix); + break; + } + + case value_t::number_float: + { + write_number_with_ubjson_prefix(j.m_value.number_float, add_prefix); + break; + } + + case value_t::string: + { + if (add_prefix) + { + oa->write_character(to_char_type('S')); + } + write_number_with_ubjson_prefix(j.m_value.string->size(), true); + oa->write_characters( + reinterpret_cast(j.m_value.string->c_str()), + j.m_value.string->size()); + break; + } + + case value_t::array: + { + if (add_prefix) + { + oa->write_character(to_char_type('[')); + } + + bool prefix_required = true; + if (use_type && !j.m_value.array->empty()) + { + JSON_ASSERT(use_count); + const CharType first_prefix = ubjson_prefix(j.front()); + const bool same_prefix = std::all_of(j.begin() + 1, j.end(), + [this, first_prefix](const BasicJsonType & v) + { + return ubjson_prefix(v) == first_prefix; + }); + + if (same_prefix) + { + prefix_required = false; + oa->write_character(to_char_type('$')); + oa->write_character(first_prefix); + } + } + + if (use_count) + { + oa->write_character(to_char_type('#')); + write_number_with_ubjson_prefix(j.m_value.array->size(), true); + } + + for (const auto& el : *j.m_value.array) + { + write_ubjson(el, use_count, use_type, prefix_required); + } + + if (!use_count) + { + oa->write_character(to_char_type(']')); + } + + break; + } + + case value_t::binary: + { + if (add_prefix) + { + oa->write_character(to_char_type('[')); + } + + if (use_type && !j.m_value.binary->empty()) + { + JSON_ASSERT(use_count); + oa->write_character(to_char_type('$')); + oa->write_character('U'); + } + + if (use_count) + { + oa->write_character(to_char_type('#')); + write_number_with_ubjson_prefix(j.m_value.binary->size(), true); + } + + if (use_type) + { + oa->write_characters( + reinterpret_cast(j.m_value.binary->data()), + j.m_value.binary->size()); + } + else + { + for (size_t i = 0; i < j.m_value.binary->size(); ++i) + { + oa->write_character(to_char_type('U')); + oa->write_character(j.m_value.binary->data()[i]); + } + } + + if (!use_count) + { + oa->write_character(to_char_type(']')); + } + + break; + } + + case value_t::object: + { + if (add_prefix) + { + oa->write_character(to_char_type('{')); + } + + bool prefix_required = true; + if (use_type && !j.m_value.object->empty()) + { + JSON_ASSERT(use_count); + const CharType first_prefix = ubjson_prefix(j.front()); + const bool same_prefix = std::all_of(j.begin(), j.end(), + [this, first_prefix](const BasicJsonType & v) + { + return ubjson_prefix(v) == first_prefix; + }); + + if (same_prefix) + { + prefix_required = false; + oa->write_character(to_char_type('$')); + oa->write_character(first_prefix); + } + } + + if (use_count) + { + oa->write_character(to_char_type('#')); + write_number_with_ubjson_prefix(j.m_value.object->size(), true); + } + + for (const auto& el : *j.m_value.object) + { + write_number_with_ubjson_prefix(el.first.size(), true); + oa->write_characters( + reinterpret_cast(el.first.c_str()), + el.first.size()); + write_ubjson(el.second, use_count, use_type, prefix_required); + } + + if (!use_count) + { + oa->write_character(to_char_type('}')); + } + + break; + } + + case value_t::discarded: + default: + break; + } + } + + private: + ////////// + // BSON // + ////////// + + /*! + @return The size of a BSON document entry header, including the id marker + and the entry name size (and its null-terminator). + */ + static std::size_t calc_bson_entry_header_size(const string_t& name, const BasicJsonType& j) + { + const auto it = name.find(static_cast(0)); + if (JSON_HEDLEY_UNLIKELY(it != BasicJsonType::string_t::npos)) + { + JSON_THROW(out_of_range::create(409, "BSON key cannot contain code point U+0000 (at byte " + std::to_string(it) + ")", j)); + static_cast(j); + } + + return /*id*/ 1ul + name.size() + /*zero-terminator*/1u; + } + + /*! + @brief Writes the given @a element_type and @a name to the output adapter + */ + void write_bson_entry_header(const string_t& name, + const std::uint8_t element_type) + { + oa->write_character(to_char_type(element_type)); // boolean + oa->write_characters( + reinterpret_cast(name.c_str()), + name.size() + 1u); + } + + /*! + @brief Writes a BSON element with key @a name and boolean value @a value + */ + void write_bson_boolean(const string_t& name, + const bool value) + { + write_bson_entry_header(name, 0x08); + oa->write_character(value ? to_char_type(0x01) : to_char_type(0x00)); + } + + /*! + @brief Writes a BSON element with key @a name and double value @a value + */ + void write_bson_double(const string_t& name, + const double value) + { + write_bson_entry_header(name, 0x01); + write_number(value); + } + + /*! + @return The size of the BSON-encoded string in @a value + */ + static std::size_t calc_bson_string_size(const string_t& value) + { + return sizeof(std::int32_t) + value.size() + 1ul; + } + + /*! + @brief Writes a BSON element with key @a name and string value @a value + */ + void write_bson_string(const string_t& name, + const string_t& value) + { + write_bson_entry_header(name, 0x02); + + write_number(static_cast(value.size() + 1ul)); + oa->write_characters( + reinterpret_cast(value.c_str()), + value.size() + 1); + } + + /*! + @brief Writes a BSON element with key @a name and null value + */ + void write_bson_null(const string_t& name) + { + write_bson_entry_header(name, 0x0A); + } + + /*! + @return The size of the BSON-encoded integer @a value + */ + static std::size_t calc_bson_integer_size(const std::int64_t value) + { + return (std::numeric_limits::min)() <= value && value <= (std::numeric_limits::max)() + ? sizeof(std::int32_t) + : sizeof(std::int64_t); + } + + /*! + @brief Writes a BSON element with key @a name and integer @a value + */ + void write_bson_integer(const string_t& name, + const std::int64_t value) + { + if ((std::numeric_limits::min)() <= value && value <= (std::numeric_limits::max)()) + { + write_bson_entry_header(name, 0x10); // int32 + write_number(static_cast(value)); + } + else + { + write_bson_entry_header(name, 0x12); // int64 + write_number(static_cast(value)); + } + } + + /*! + @return The size of the BSON-encoded unsigned integer in @a j + */ + static constexpr std::size_t calc_bson_unsigned_size(const std::uint64_t value) noexcept + { + return (value <= static_cast((std::numeric_limits::max)())) + ? sizeof(std::int32_t) + : sizeof(std::int64_t); + } + + /*! + @brief Writes a BSON element with key @a name and unsigned @a value + */ + void write_bson_unsigned(const string_t& name, + const BasicJsonType& j) + { + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + write_bson_entry_header(name, 0x10 /* int32 */); + write_number(static_cast(j.m_value.number_unsigned)); + } + else if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + write_bson_entry_header(name, 0x12 /* int64 */); + write_number(static_cast(j.m_value.number_unsigned)); + } + else + { + JSON_THROW(out_of_range::create(407, "integer number " + std::to_string(j.m_value.number_unsigned) + " cannot be represented by BSON as it does not fit int64", j)); + } + } + + /*! + @brief Writes a BSON element with key @a name and object @a value + */ + void write_bson_object_entry(const string_t& name, + const typename BasicJsonType::object_t& value) + { + write_bson_entry_header(name, 0x03); // object + write_bson_object(value); + } + + /*! + @return The size of the BSON-encoded array @a value + */ + static std::size_t calc_bson_array_size(const typename BasicJsonType::array_t& value) + { + std::size_t array_index = 0ul; + + const std::size_t embedded_document_size = std::accumulate(std::begin(value), std::end(value), static_cast(0), [&array_index](std::size_t result, const typename BasicJsonType::array_t::value_type & el) + { + return result + calc_bson_element_size(std::to_string(array_index++), el); + }); + + return sizeof(std::int32_t) + embedded_document_size + 1ul; + } + + /*! + @return The size of the BSON-encoded binary array @a value + */ + static std::size_t calc_bson_binary_size(const typename BasicJsonType::binary_t& value) + { + return sizeof(std::int32_t) + value.size() + 1ul; + } + + /*! + @brief Writes a BSON element with key @a name and array @a value + */ + void write_bson_array(const string_t& name, + const typename BasicJsonType::array_t& value) + { + write_bson_entry_header(name, 0x04); // array + write_number(static_cast(calc_bson_array_size(value))); + + std::size_t array_index = 0ul; + + for (const auto& el : value) + { + write_bson_element(std::to_string(array_index++), el); + } + + oa->write_character(to_char_type(0x00)); + } + + /*! + @brief Writes a BSON element with key @a name and binary value @a value + */ + void write_bson_binary(const string_t& name, + const binary_t& value) + { + write_bson_entry_header(name, 0x05); + + write_number(static_cast(value.size())); + write_number(value.has_subtype() ? static_cast(value.subtype()) : static_cast(0x00)); + + oa->write_characters(reinterpret_cast(value.data()), value.size()); + } + + /*! + @brief Calculates the size necessary to serialize the JSON value @a j with its @a name + @return The calculated size for the BSON document entry for @a j with the given @a name. + */ + static std::size_t calc_bson_element_size(const string_t& name, + const BasicJsonType& j) + { + const auto header_size = calc_bson_entry_header_size(name, j); + switch (j.type()) + { + case value_t::object: + return header_size + calc_bson_object_size(*j.m_value.object); + + case value_t::array: + return header_size + calc_bson_array_size(*j.m_value.array); + + case value_t::binary: + return header_size + calc_bson_binary_size(*j.m_value.binary); + + case value_t::boolean: + return header_size + 1ul; + + case value_t::number_float: + return header_size + 8ul; + + case value_t::number_integer: + return header_size + calc_bson_integer_size(j.m_value.number_integer); + + case value_t::number_unsigned: + return header_size + calc_bson_unsigned_size(j.m_value.number_unsigned); + + case value_t::string: + return header_size + calc_bson_string_size(*j.m_value.string); + + case value_t::null: + return header_size + 0ul; + + // LCOV_EXCL_START + case value_t::discarded: + default: + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) + return 0ul; + // LCOV_EXCL_STOP + } + } + + /*! + @brief Serializes the JSON value @a j to BSON and associates it with the + key @a name. + @param name The name to associate with the JSON entity @a j within the + current BSON document + */ + void write_bson_element(const string_t& name, + const BasicJsonType& j) + { + switch (j.type()) + { + case value_t::object: + return write_bson_object_entry(name, *j.m_value.object); + + case value_t::array: + return write_bson_array(name, *j.m_value.array); + + case value_t::binary: + return write_bson_binary(name, *j.m_value.binary); + + case value_t::boolean: + return write_bson_boolean(name, j.m_value.boolean); + + case value_t::number_float: + return write_bson_double(name, j.m_value.number_float); + + case value_t::number_integer: + return write_bson_integer(name, j.m_value.number_integer); + + case value_t::number_unsigned: + return write_bson_unsigned(name, j); + + case value_t::string: + return write_bson_string(name, *j.m_value.string); + + case value_t::null: + return write_bson_null(name); + + // LCOV_EXCL_START + case value_t::discarded: + default: + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) + return; + // LCOV_EXCL_STOP + } + } + + /*! + @brief Calculates the size of the BSON serialization of the given + JSON-object @a j. + @param[in] value JSON value to serialize + @pre value.type() == value_t::object + */ + static std::size_t calc_bson_object_size(const typename BasicJsonType::object_t& value) + { + std::size_t document_size = std::accumulate(value.begin(), value.end(), static_cast(0), + [](size_t result, const typename BasicJsonType::object_t::value_type & el) + { + return result += calc_bson_element_size(el.first, el.second); + }); + + return sizeof(std::int32_t) + document_size + 1ul; + } + + /*! + @param[in] value JSON value to serialize + @pre value.type() == value_t::object + */ + void write_bson_object(const typename BasicJsonType::object_t& value) + { + write_number(static_cast(calc_bson_object_size(value))); + + for (const auto& el : value) + { + write_bson_element(el.first, el.second); + } + + oa->write_character(to_char_type(0x00)); + } + + ////////// + // CBOR // + ////////// + + static constexpr CharType get_cbor_float_prefix(float /*unused*/) + { + return to_char_type(0xFA); // Single-Precision Float + } + + static constexpr CharType get_cbor_float_prefix(double /*unused*/) + { + return to_char_type(0xFB); // Double-Precision Float + } + + ///////////// + // MsgPack // + ///////////// + + static constexpr CharType get_msgpack_float_prefix(float /*unused*/) + { + return to_char_type(0xCA); // float 32 + } + + static constexpr CharType get_msgpack_float_prefix(double /*unused*/) + { + return to_char_type(0xCB); // float 64 + } + + //////////// + // UBJSON // + //////////// + + // UBJSON: write number (floating point) + template::value, int>::type = 0> + void write_number_with_ubjson_prefix(const NumberType n, + const bool add_prefix) + { + if (add_prefix) + { + oa->write_character(get_ubjson_float_prefix(n)); + } + write_number(n); + } + + // UBJSON: write number (unsigned integer) + template::value, int>::type = 0> + void write_number_with_ubjson_prefix(const NumberType n, + const bool add_prefix) + { + if (n <= static_cast((std::numeric_limits::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('i')); // int8 + } + write_number(static_cast(n)); + } + else if (n <= (std::numeric_limits::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('U')); // uint8 + } + write_number(static_cast(n)); + } + else if (n <= static_cast((std::numeric_limits::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('I')); // int16 + } + write_number(static_cast(n)); + } + else if (n <= static_cast((std::numeric_limits::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('l')); // int32 + } + write_number(static_cast(n)); + } + else if (n <= static_cast((std::numeric_limits::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('L')); // int64 + } + write_number(static_cast(n)); + } + else + { + if (add_prefix) + { + oa->write_character(to_char_type('H')); // high-precision number + } + + const auto number = BasicJsonType(n).dump(); + write_number_with_ubjson_prefix(number.size(), true); + for (std::size_t i = 0; i < number.size(); ++i) + { + oa->write_character(to_char_type(static_cast(number[i]))); + } + } + } + + // UBJSON: write number (signed integer) + template < typename NumberType, typename std::enable_if < + std::is_signed::value&& + !std::is_floating_point::value, int >::type = 0 > + void write_number_with_ubjson_prefix(const NumberType n, + const bool add_prefix) + { + if ((std::numeric_limits::min)() <= n && n <= (std::numeric_limits::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('i')); // int8 + } + write_number(static_cast(n)); + } + else if (static_cast((std::numeric_limits::min)()) <= n && n <= static_cast((std::numeric_limits::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('U')); // uint8 + } + write_number(static_cast(n)); + } + else if ((std::numeric_limits::min)() <= n && n <= (std::numeric_limits::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('I')); // int16 + } + write_number(static_cast(n)); + } + else if ((std::numeric_limits::min)() <= n && n <= (std::numeric_limits::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('l')); // int32 + } + write_number(static_cast(n)); + } + else if ((std::numeric_limits::min)() <= n && n <= (std::numeric_limits::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('L')); // int64 + } + write_number(static_cast(n)); + } + // LCOV_EXCL_START + else + { + if (add_prefix) + { + oa->write_character(to_char_type('H')); // high-precision number + } + + const auto number = BasicJsonType(n).dump(); + write_number_with_ubjson_prefix(number.size(), true); + for (std::size_t i = 0; i < number.size(); ++i) + { + oa->write_character(to_char_type(static_cast(number[i]))); + } + } + // LCOV_EXCL_STOP + } + + /*! + @brief determine the type prefix of container values + */ + CharType ubjson_prefix(const BasicJsonType& j) const noexcept + { + switch (j.type()) + { + case value_t::null: + return 'Z'; + + case value_t::boolean: + return j.m_value.boolean ? 'T' : 'F'; + + case value_t::number_integer: + { + if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) + { + return 'i'; + } + if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) + { + return 'U'; + } + if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) + { + return 'I'; + } + if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) + { + return 'l'; + } + if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) + { + return 'L'; + } + // anything else is treated as high-precision number + return 'H'; // LCOV_EXCL_LINE + } + + case value_t::number_unsigned: + { + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + return 'i'; + } + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + return 'U'; + } + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + return 'I'; + } + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + return 'l'; + } + if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) + { + return 'L'; + } + // anything else is treated as high-precision number + return 'H'; // LCOV_EXCL_LINE + } + + case value_t::number_float: + return get_ubjson_float_prefix(j.m_value.number_float); + + case value_t::string: + return 'S'; + + case value_t::array: // fallthrough + case value_t::binary: + return '['; + + case value_t::object: + return '{'; + + case value_t::discarded: + default: // discarded values + return 'N'; + } + } + + static constexpr CharType get_ubjson_float_prefix(float /*unused*/) + { + return 'd'; // float 32 + } + + static constexpr CharType get_ubjson_float_prefix(double /*unused*/) + { + return 'D'; // float 64 + } + + /////////////////////// + // Utility functions // + /////////////////////// + + /* + @brief write a number to output input + @param[in] n number of type @a NumberType + @tparam NumberType the type of the number + @tparam OutputIsLittleEndian Set to true if output data is + required to be little endian + + @note This function needs to respect the system's endianness, because bytes + in CBOR, MessagePack, and UBJSON are stored in network order (big + endian) and therefore need reordering on little endian systems. + */ + template + void write_number(const NumberType n) + { + // step 1: write number to array of length NumberType + std::array vec{}; + std::memcpy(vec.data(), &n, sizeof(NumberType)); + + // step 2: write array to output (with possible reordering) + if (is_little_endian != OutputIsLittleEndian) + { + // reverse byte order prior to conversion if necessary + std::reverse(vec.begin(), vec.end()); + } + + oa->write_characters(vec.data(), sizeof(NumberType)); + } + + void write_compact_float(const number_float_t n, detail::input_format_t format) + { +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + if (static_cast(n) >= static_cast(std::numeric_limits::lowest()) && + static_cast(n) <= static_cast((std::numeric_limits::max)()) && + static_cast(static_cast(n)) == static_cast(n)) + { + oa->write_character(format == detail::input_format_t::cbor + ? get_cbor_float_prefix(static_cast(n)) + : get_msgpack_float_prefix(static_cast(n))); + write_number(static_cast(n)); + } + else + { + oa->write_character(format == detail::input_format_t::cbor + ? get_cbor_float_prefix(n) + : get_msgpack_float_prefix(n)); + write_number(n); + } +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + } + + public: + // The following to_char_type functions are implement the conversion + // between uint8_t and CharType. In case CharType is not unsigned, + // such a conversion is required to allow values greater than 128. + // See for a discussion. + template < typename C = CharType, + enable_if_t < std::is_signed::value && std::is_signed::value > * = nullptr > + static constexpr CharType to_char_type(std::uint8_t x) noexcept + { + return *reinterpret_cast(&x); + } + + template < typename C = CharType, + enable_if_t < std::is_signed::value && std::is_unsigned::value > * = nullptr > + static CharType to_char_type(std::uint8_t x) noexcept + { + static_assert(sizeof(std::uint8_t) == sizeof(CharType), "size of CharType must be equal to std::uint8_t"); + static_assert(std::is_trivial::value, "CharType must be trivial"); + CharType result; + std::memcpy(&result, &x, sizeof(x)); + return result; + } + + template::value>* = nullptr> + static constexpr CharType to_char_type(std::uint8_t x) noexcept + { + return x; + } + + template < typename InputCharType, typename C = CharType, + enable_if_t < + std::is_signed::value && + std::is_signed::value && + std::is_same::type>::value + > * = nullptr > + static constexpr CharType to_char_type(InputCharType x) noexcept + { + return x; + } + + private: + /// whether we can assume little endianness + const bool is_little_endian = little_endianness(); + + /// the output + output_adapter_t oa = nullptr; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + + +#include // reverse, remove, fill, find, none_of +#include // array +#include // localeconv, lconv +#include // labs, isfinite, isnan, signbit +#include // size_t, ptrdiff_t +#include // uint8_t +#include // snprintf +#include // numeric_limits +#include // string, char_traits +#include // setfill, setw +#include // stringstream +#include // is_same +#include // move + +// #include + + +#include // array +#include // signbit, isfinite +#include // intN_t, uintN_t +#include // memcpy, memmove +#include // numeric_limits +#include // conditional + +// #include + + +namespace nlohmann +{ +namespace detail +{ + +/*! +@brief implements the Grisu2 algorithm for binary to decimal floating-point +conversion. + +This implementation is a slightly modified version of the reference +implementation which may be obtained from +http://florian.loitsch.com/publications (bench.tar.gz). + +The code is distributed under the MIT license, Copyright (c) 2009 Florian Loitsch. + +For a detailed description of the algorithm see: + +[1] Loitsch, "Printing Floating-Point Numbers Quickly and Accurately with + Integers", Proceedings of the ACM SIGPLAN 2010 Conference on Programming + Language Design and Implementation, PLDI 2010 +[2] Burger, Dybvig, "Printing Floating-Point Numbers Quickly and Accurately", + Proceedings of the ACM SIGPLAN 1996 Conference on Programming Language + Design and Implementation, PLDI 1996 +*/ +namespace dtoa_impl +{ + +template +Target reinterpret_bits(const Source source) +{ + static_assert(sizeof(Target) == sizeof(Source), "size mismatch"); + + Target target; + std::memcpy(&target, &source, sizeof(Source)); + return target; +} + +struct diyfp // f * 2^e +{ + static constexpr int kPrecision = 64; // = q + + std::uint64_t f = 0; + int e = 0; + + constexpr diyfp(std::uint64_t f_, int e_) noexcept : f(f_), e(e_) {} + + /*! + @brief returns x - y + @pre x.e == y.e and x.f >= y.f + */ + static diyfp sub(const diyfp& x, const diyfp& y) noexcept + { + JSON_ASSERT(x.e == y.e); + JSON_ASSERT(x.f >= y.f); + + return {x.f - y.f, x.e}; + } + + /*! + @brief returns x * y + @note The result is rounded. (Only the upper q bits are returned.) + */ + static diyfp mul(const diyfp& x, const diyfp& y) noexcept + { + static_assert(kPrecision == 64, "internal error"); + + // Computes: + // f = round((x.f * y.f) / 2^q) + // e = x.e + y.e + q + + // Emulate the 64-bit * 64-bit multiplication: + // + // p = u * v + // = (u_lo + 2^32 u_hi) (v_lo + 2^32 v_hi) + // = (u_lo v_lo ) + 2^32 ((u_lo v_hi ) + (u_hi v_lo )) + 2^64 (u_hi v_hi ) + // = (p0 ) + 2^32 ((p1 ) + (p2 )) + 2^64 (p3 ) + // = (p0_lo + 2^32 p0_hi) + 2^32 ((p1_lo + 2^32 p1_hi) + (p2_lo + 2^32 p2_hi)) + 2^64 (p3 ) + // = (p0_lo ) + 2^32 (p0_hi + p1_lo + p2_lo ) + 2^64 (p1_hi + p2_hi + p3) + // = (p0_lo ) + 2^32 (Q ) + 2^64 (H ) + // = (p0_lo ) + 2^32 (Q_lo + 2^32 Q_hi ) + 2^64 (H ) + // + // (Since Q might be larger than 2^32 - 1) + // + // = (p0_lo + 2^32 Q_lo) + 2^64 (Q_hi + H) + // + // (Q_hi + H does not overflow a 64-bit int) + // + // = p_lo + 2^64 p_hi + + const std::uint64_t u_lo = x.f & 0xFFFFFFFFu; + const std::uint64_t u_hi = x.f >> 32u; + const std::uint64_t v_lo = y.f & 0xFFFFFFFFu; + const std::uint64_t v_hi = y.f >> 32u; + + const std::uint64_t p0 = u_lo * v_lo; + const std::uint64_t p1 = u_lo * v_hi; + const std::uint64_t p2 = u_hi * v_lo; + const std::uint64_t p3 = u_hi * v_hi; + + const std::uint64_t p0_hi = p0 >> 32u; + const std::uint64_t p1_lo = p1 & 0xFFFFFFFFu; + const std::uint64_t p1_hi = p1 >> 32u; + const std::uint64_t p2_lo = p2 & 0xFFFFFFFFu; + const std::uint64_t p2_hi = p2 >> 32u; + + std::uint64_t Q = p0_hi + p1_lo + p2_lo; + + // The full product might now be computed as + // + // p_hi = p3 + p2_hi + p1_hi + (Q >> 32) + // p_lo = p0_lo + (Q << 32) + // + // But in this particular case here, the full p_lo is not required. + // Effectively we only need to add the highest bit in p_lo to p_hi (and + // Q_hi + 1 does not overflow). + + Q += std::uint64_t{1} << (64u - 32u - 1u); // round, ties up + + const std::uint64_t h = p3 + p2_hi + p1_hi + (Q >> 32u); + + return {h, x.e + y.e + 64}; + } + + /*! + @brief normalize x such that the significand is >= 2^(q-1) + @pre x.f != 0 + */ + static diyfp normalize(diyfp x) noexcept + { + JSON_ASSERT(x.f != 0); + + while ((x.f >> 63u) == 0) + { + x.f <<= 1u; + x.e--; + } + + return x; + } + + /*! + @brief normalize x such that the result has the exponent E + @pre e >= x.e and the upper e - x.e bits of x.f must be zero. + */ + static diyfp normalize_to(const diyfp& x, const int target_exponent) noexcept + { + const int delta = x.e - target_exponent; + + JSON_ASSERT(delta >= 0); + JSON_ASSERT(((x.f << delta) >> delta) == x.f); + + return {x.f << delta, target_exponent}; + } +}; + +struct boundaries +{ + diyfp w; + diyfp minus; + diyfp plus; +}; + +/*! +Compute the (normalized) diyfp representing the input number 'value' and its +boundaries. + +@pre value must be finite and positive +*/ +template +boundaries compute_boundaries(FloatType value) +{ + JSON_ASSERT(std::isfinite(value)); + JSON_ASSERT(value > 0); + + // Convert the IEEE representation into a diyfp. + // + // If v is denormal: + // value = 0.F * 2^(1 - bias) = ( F) * 2^(1 - bias - (p-1)) + // If v is normalized: + // value = 1.F * 2^(E - bias) = (2^(p-1) + F) * 2^(E - bias - (p-1)) + + static_assert(std::numeric_limits::is_iec559, + "internal error: dtoa_short requires an IEEE-754 floating-point implementation"); + + constexpr int kPrecision = std::numeric_limits::digits; // = p (includes the hidden bit) + constexpr int kBias = std::numeric_limits::max_exponent - 1 + (kPrecision - 1); + constexpr int kMinExp = 1 - kBias; + constexpr std::uint64_t kHiddenBit = std::uint64_t{1} << (kPrecision - 1); // = 2^(p-1) + + using bits_type = typename std::conditional::type; + + const auto bits = static_cast(reinterpret_bits(value)); + const std::uint64_t E = bits >> (kPrecision - 1); + const std::uint64_t F = bits & (kHiddenBit - 1); + + const bool is_denormal = E == 0; + const diyfp v = is_denormal + ? diyfp(F, kMinExp) + : diyfp(F + kHiddenBit, static_cast(E) - kBias); + + // Compute the boundaries m- and m+ of the floating-point value + // v = f * 2^e. + // + // Determine v- and v+, the floating-point predecessor and successor if v, + // respectively. + // + // v- = v - 2^e if f != 2^(p-1) or e == e_min (A) + // = v - 2^(e-1) if f == 2^(p-1) and e > e_min (B) + // + // v+ = v + 2^e + // + // Let m- = (v- + v) / 2 and m+ = (v + v+) / 2. All real numbers _strictly_ + // between m- and m+ round to v, regardless of how the input rounding + // algorithm breaks ties. + // + // ---+-------------+-------------+-------------+-------------+--- (A) + // v- m- v m+ v+ + // + // -----------------+------+------+-------------+-------------+--- (B) + // v- m- v m+ v+ + + const bool lower_boundary_is_closer = F == 0 && E > 1; + const diyfp m_plus = diyfp(2 * v.f + 1, v.e - 1); + const diyfp m_minus = lower_boundary_is_closer + ? diyfp(4 * v.f - 1, v.e - 2) // (B) + : diyfp(2 * v.f - 1, v.e - 1); // (A) + + // Determine the normalized w+ = m+. + const diyfp w_plus = diyfp::normalize(m_plus); + + // Determine w- = m- such that e_(w-) = e_(w+). + const diyfp w_minus = diyfp::normalize_to(m_minus, w_plus.e); + + return {diyfp::normalize(v), w_minus, w_plus}; +} + +// Given normalized diyfp w, Grisu needs to find a (normalized) cached +// power-of-ten c, such that the exponent of the product c * w = f * 2^e lies +// within a certain range [alpha, gamma] (Definition 3.2 from [1]) +// +// alpha <= e = e_c + e_w + q <= gamma +// +// or +// +// f_c * f_w * 2^alpha <= f_c 2^(e_c) * f_w 2^(e_w) * 2^q +// <= f_c * f_w * 2^gamma +// +// Since c and w are normalized, i.e. 2^(q-1) <= f < 2^q, this implies +// +// 2^(q-1) * 2^(q-1) * 2^alpha <= c * w * 2^q < 2^q * 2^q * 2^gamma +// +// or +// +// 2^(q - 2 + alpha) <= c * w < 2^(q + gamma) +// +// The choice of (alpha,gamma) determines the size of the table and the form of +// the digit generation procedure. Using (alpha,gamma)=(-60,-32) works out well +// in practice: +// +// The idea is to cut the number c * w = f * 2^e into two parts, which can be +// processed independently: An integral part p1, and a fractional part p2: +// +// f * 2^e = ( (f div 2^-e) * 2^-e + (f mod 2^-e) ) * 2^e +// = (f div 2^-e) + (f mod 2^-e) * 2^e +// = p1 + p2 * 2^e +// +// The conversion of p1 into decimal form requires a series of divisions and +// modulos by (a power of) 10. These operations are faster for 32-bit than for +// 64-bit integers, so p1 should ideally fit into a 32-bit integer. This can be +// achieved by choosing +// +// -e >= 32 or e <= -32 := gamma +// +// In order to convert the fractional part +// +// p2 * 2^e = p2 / 2^-e = d[-1] / 10^1 + d[-2] / 10^2 + ... +// +// into decimal form, the fraction is repeatedly multiplied by 10 and the digits +// d[-i] are extracted in order: +// +// (10 * p2) div 2^-e = d[-1] +// (10 * p2) mod 2^-e = d[-2] / 10^1 + ... +// +// The multiplication by 10 must not overflow. It is sufficient to choose +// +// 10 * p2 < 16 * p2 = 2^4 * p2 <= 2^64. +// +// Since p2 = f mod 2^-e < 2^-e, +// +// -e <= 60 or e >= -60 := alpha + +constexpr int kAlpha = -60; +constexpr int kGamma = -32; + +struct cached_power // c = f * 2^e ~= 10^k +{ + std::uint64_t f; + int e; + int k; +}; + +/*! +For a normalized diyfp w = f * 2^e, this function returns a (normalized) cached +power-of-ten c = f_c * 2^e_c, such that the exponent of the product w * c +satisfies (Definition 3.2 from [1]) + + alpha <= e_c + e + q <= gamma. +*/ +inline cached_power get_cached_power_for_binary_exponent(int e) +{ + // Now + // + // alpha <= e_c + e + q <= gamma (1) + // ==> f_c * 2^alpha <= c * 2^e * 2^q + // + // and since the c's are normalized, 2^(q-1) <= f_c, + // + // ==> 2^(q - 1 + alpha) <= c * 2^(e + q) + // ==> 2^(alpha - e - 1) <= c + // + // If c were an exact power of ten, i.e. c = 10^k, one may determine k as + // + // k = ceil( log_10( 2^(alpha - e - 1) ) ) + // = ceil( (alpha - e - 1) * log_10(2) ) + // + // From the paper: + // "In theory the result of the procedure could be wrong since c is rounded, + // and the computation itself is approximated [...]. In practice, however, + // this simple function is sufficient." + // + // For IEEE double precision floating-point numbers converted into + // normalized diyfp's w = f * 2^e, with q = 64, + // + // e >= -1022 (min IEEE exponent) + // -52 (p - 1) + // -52 (p - 1, possibly normalize denormal IEEE numbers) + // -11 (normalize the diyfp) + // = -1137 + // + // and + // + // e <= +1023 (max IEEE exponent) + // -52 (p - 1) + // -11 (normalize the diyfp) + // = 960 + // + // This binary exponent range [-1137,960] results in a decimal exponent + // range [-307,324]. One does not need to store a cached power for each + // k in this range. For each such k it suffices to find a cached power + // such that the exponent of the product lies in [alpha,gamma]. + // This implies that the difference of the decimal exponents of adjacent + // table entries must be less than or equal to + // + // floor( (gamma - alpha) * log_10(2) ) = 8. + // + // (A smaller distance gamma-alpha would require a larger table.) + + // NB: + // Actually this function returns c, such that -60 <= e_c + e + 64 <= -34. + + constexpr int kCachedPowersMinDecExp = -300; + constexpr int kCachedPowersDecStep = 8; + + static constexpr std::array kCachedPowers = + { + { + { 0xAB70FE17C79AC6CA, -1060, -300 }, + { 0xFF77B1FCBEBCDC4F, -1034, -292 }, + { 0xBE5691EF416BD60C, -1007, -284 }, + { 0x8DD01FAD907FFC3C, -980, -276 }, + { 0xD3515C2831559A83, -954, -268 }, + { 0x9D71AC8FADA6C9B5, -927, -260 }, + { 0xEA9C227723EE8BCB, -901, -252 }, + { 0xAECC49914078536D, -874, -244 }, + { 0x823C12795DB6CE57, -847, -236 }, + { 0xC21094364DFB5637, -821, -228 }, + { 0x9096EA6F3848984F, -794, -220 }, + { 0xD77485CB25823AC7, -768, -212 }, + { 0xA086CFCD97BF97F4, -741, -204 }, + { 0xEF340A98172AACE5, -715, -196 }, + { 0xB23867FB2A35B28E, -688, -188 }, + { 0x84C8D4DFD2C63F3B, -661, -180 }, + { 0xC5DD44271AD3CDBA, -635, -172 }, + { 0x936B9FCEBB25C996, -608, -164 }, + { 0xDBAC6C247D62A584, -582, -156 }, + { 0xA3AB66580D5FDAF6, -555, -148 }, + { 0xF3E2F893DEC3F126, -529, -140 }, + { 0xB5B5ADA8AAFF80B8, -502, -132 }, + { 0x87625F056C7C4A8B, -475, -124 }, + { 0xC9BCFF6034C13053, -449, -116 }, + { 0x964E858C91BA2655, -422, -108 }, + { 0xDFF9772470297EBD, -396, -100 }, + { 0xA6DFBD9FB8E5B88F, -369, -92 }, + { 0xF8A95FCF88747D94, -343, -84 }, + { 0xB94470938FA89BCF, -316, -76 }, + { 0x8A08F0F8BF0F156B, -289, -68 }, + { 0xCDB02555653131B6, -263, -60 }, + { 0x993FE2C6D07B7FAC, -236, -52 }, + { 0xE45C10C42A2B3B06, -210, -44 }, + { 0xAA242499697392D3, -183, -36 }, + { 0xFD87B5F28300CA0E, -157, -28 }, + { 0xBCE5086492111AEB, -130, -20 }, + { 0x8CBCCC096F5088CC, -103, -12 }, + { 0xD1B71758E219652C, -77, -4 }, + { 0x9C40000000000000, -50, 4 }, + { 0xE8D4A51000000000, -24, 12 }, + { 0xAD78EBC5AC620000, 3, 20 }, + { 0x813F3978F8940984, 30, 28 }, + { 0xC097CE7BC90715B3, 56, 36 }, + { 0x8F7E32CE7BEA5C70, 83, 44 }, + { 0xD5D238A4ABE98068, 109, 52 }, + { 0x9F4F2726179A2245, 136, 60 }, + { 0xED63A231D4C4FB27, 162, 68 }, + { 0xB0DE65388CC8ADA8, 189, 76 }, + { 0x83C7088E1AAB65DB, 216, 84 }, + { 0xC45D1DF942711D9A, 242, 92 }, + { 0x924D692CA61BE758, 269, 100 }, + { 0xDA01EE641A708DEA, 295, 108 }, + { 0xA26DA3999AEF774A, 322, 116 }, + { 0xF209787BB47D6B85, 348, 124 }, + { 0xB454E4A179DD1877, 375, 132 }, + { 0x865B86925B9BC5C2, 402, 140 }, + { 0xC83553C5C8965D3D, 428, 148 }, + { 0x952AB45CFA97A0B3, 455, 156 }, + { 0xDE469FBD99A05FE3, 481, 164 }, + { 0xA59BC234DB398C25, 508, 172 }, + { 0xF6C69A72A3989F5C, 534, 180 }, + { 0xB7DCBF5354E9BECE, 561, 188 }, + { 0x88FCF317F22241E2, 588, 196 }, + { 0xCC20CE9BD35C78A5, 614, 204 }, + { 0x98165AF37B2153DF, 641, 212 }, + { 0xE2A0B5DC971F303A, 667, 220 }, + { 0xA8D9D1535CE3B396, 694, 228 }, + { 0xFB9B7CD9A4A7443C, 720, 236 }, + { 0xBB764C4CA7A44410, 747, 244 }, + { 0x8BAB8EEFB6409C1A, 774, 252 }, + { 0xD01FEF10A657842C, 800, 260 }, + { 0x9B10A4E5E9913129, 827, 268 }, + { 0xE7109BFBA19C0C9D, 853, 276 }, + { 0xAC2820D9623BF429, 880, 284 }, + { 0x80444B5E7AA7CF85, 907, 292 }, + { 0xBF21E44003ACDD2D, 933, 300 }, + { 0x8E679C2F5E44FF8F, 960, 308 }, + { 0xD433179D9C8CB841, 986, 316 }, + { 0x9E19DB92B4E31BA9, 1013, 324 }, + } + }; + + // This computation gives exactly the same results for k as + // k = ceil((kAlpha - e - 1) * 0.30102999566398114) + // for |e| <= 1500, but doesn't require floating-point operations. + // NB: log_10(2) ~= 78913 / 2^18 + JSON_ASSERT(e >= -1500); + JSON_ASSERT(e <= 1500); + const int f = kAlpha - e - 1; + const int k = (f * 78913) / (1 << 18) + static_cast(f > 0); + + const int index = (-kCachedPowersMinDecExp + k + (kCachedPowersDecStep - 1)) / kCachedPowersDecStep; + JSON_ASSERT(index >= 0); + JSON_ASSERT(static_cast(index) < kCachedPowers.size()); + + const cached_power cached = kCachedPowers[static_cast(index)]; + JSON_ASSERT(kAlpha <= cached.e + e + 64); + JSON_ASSERT(kGamma >= cached.e + e + 64); + + return cached; +} + +/*! +For n != 0, returns k, such that pow10 := 10^(k-1) <= n < 10^k. +For n == 0, returns 1 and sets pow10 := 1. +*/ +inline int find_largest_pow10(const std::uint32_t n, std::uint32_t& pow10) +{ + // LCOV_EXCL_START + if (n >= 1000000000) + { + pow10 = 1000000000; + return 10; + } + // LCOV_EXCL_STOP + if (n >= 100000000) + { + pow10 = 100000000; + return 9; + } + if (n >= 10000000) + { + pow10 = 10000000; + return 8; + } + if (n >= 1000000) + { + pow10 = 1000000; + return 7; + } + if (n >= 100000) + { + pow10 = 100000; + return 6; + } + if (n >= 10000) + { + pow10 = 10000; + return 5; + } + if (n >= 1000) + { + pow10 = 1000; + return 4; + } + if (n >= 100) + { + pow10 = 100; + return 3; + } + if (n >= 10) + { + pow10 = 10; + return 2; + } + + pow10 = 1; + return 1; +} + +inline void grisu2_round(char* buf, int len, std::uint64_t dist, std::uint64_t delta, + std::uint64_t rest, std::uint64_t ten_k) +{ + JSON_ASSERT(len >= 1); + JSON_ASSERT(dist <= delta); + JSON_ASSERT(rest <= delta); + JSON_ASSERT(ten_k > 0); + + // <--------------------------- delta ----> + // <---- dist ---------> + // --------------[------------------+-------------------]-------------- + // M- w M+ + // + // ten_k + // <------> + // <---- rest ----> + // --------------[------------------+----+--------------]-------------- + // w V + // = buf * 10^k + // + // ten_k represents a unit-in-the-last-place in the decimal representation + // stored in buf. + // Decrement buf by ten_k while this takes buf closer to w. + + // The tests are written in this order to avoid overflow in unsigned + // integer arithmetic. + + while (rest < dist + && delta - rest >= ten_k + && (rest + ten_k < dist || dist - rest > rest + ten_k - dist)) + { + JSON_ASSERT(buf[len - 1] != '0'); + buf[len - 1]--; + rest += ten_k; + } +} + +/*! +Generates V = buffer * 10^decimal_exponent, such that M- <= V <= M+. +M- and M+ must be normalized and share the same exponent -60 <= e <= -32. +*/ +inline void grisu2_digit_gen(char* buffer, int& length, int& decimal_exponent, + diyfp M_minus, diyfp w, diyfp M_plus) +{ + static_assert(kAlpha >= -60, "internal error"); + static_assert(kGamma <= -32, "internal error"); + + // Generates the digits (and the exponent) of a decimal floating-point + // number V = buffer * 10^decimal_exponent in the range [M-, M+]. The diyfp's + // w, M- and M+ share the same exponent e, which satisfies alpha <= e <= gamma. + // + // <--------------------------- delta ----> + // <---- dist ---------> + // --------------[------------------+-------------------]-------------- + // M- w M+ + // + // Grisu2 generates the digits of M+ from left to right and stops as soon as + // V is in [M-,M+]. + + JSON_ASSERT(M_plus.e >= kAlpha); + JSON_ASSERT(M_plus.e <= kGamma); + + std::uint64_t delta = diyfp::sub(M_plus, M_minus).f; // (significand of (M+ - M-), implicit exponent is e) + std::uint64_t dist = diyfp::sub(M_plus, w ).f; // (significand of (M+ - w ), implicit exponent is e) + + // Split M+ = f * 2^e into two parts p1 and p2 (note: e < 0): + // + // M+ = f * 2^e + // = ((f div 2^-e) * 2^-e + (f mod 2^-e)) * 2^e + // = ((p1 ) * 2^-e + (p2 )) * 2^e + // = p1 + p2 * 2^e + + const diyfp one(std::uint64_t{1} << -M_plus.e, M_plus.e); + + auto p1 = static_cast(M_plus.f >> -one.e); // p1 = f div 2^-e (Since -e >= 32, p1 fits into a 32-bit int.) + std::uint64_t p2 = M_plus.f & (one.f - 1); // p2 = f mod 2^-e + + // 1) + // + // Generate the digits of the integral part p1 = d[n-1]...d[1]d[0] + + JSON_ASSERT(p1 > 0); + + std::uint32_t pow10{}; + const int k = find_largest_pow10(p1, pow10); + + // 10^(k-1) <= p1 < 10^k, pow10 = 10^(k-1) + // + // p1 = (p1 div 10^(k-1)) * 10^(k-1) + (p1 mod 10^(k-1)) + // = (d[k-1] ) * 10^(k-1) + (p1 mod 10^(k-1)) + // + // M+ = p1 + p2 * 2^e + // = d[k-1] * 10^(k-1) + (p1 mod 10^(k-1)) + p2 * 2^e + // = d[k-1] * 10^(k-1) + ((p1 mod 10^(k-1)) * 2^-e + p2) * 2^e + // = d[k-1] * 10^(k-1) + ( rest) * 2^e + // + // Now generate the digits d[n] of p1 from left to right (n = k-1,...,0) + // + // p1 = d[k-1]...d[n] * 10^n + d[n-1]...d[0] + // + // but stop as soon as + // + // rest * 2^e = (d[n-1]...d[0] * 2^-e + p2) * 2^e <= delta * 2^e + + int n = k; + while (n > 0) + { + // Invariants: + // M+ = buffer * 10^n + (p1 + p2 * 2^e) (buffer = 0 for n = k) + // pow10 = 10^(n-1) <= p1 < 10^n + // + const std::uint32_t d = p1 / pow10; // d = p1 div 10^(n-1) + const std::uint32_t r = p1 % pow10; // r = p1 mod 10^(n-1) + // + // M+ = buffer * 10^n + (d * 10^(n-1) + r) + p2 * 2^e + // = (buffer * 10 + d) * 10^(n-1) + (r + p2 * 2^e) + // + JSON_ASSERT(d <= 9); + buffer[length++] = static_cast('0' + d); // buffer := buffer * 10 + d + // + // M+ = buffer * 10^(n-1) + (r + p2 * 2^e) + // + p1 = r; + n--; + // + // M+ = buffer * 10^n + (p1 + p2 * 2^e) + // pow10 = 10^n + // + + // Now check if enough digits have been generated. + // Compute + // + // p1 + p2 * 2^e = (p1 * 2^-e + p2) * 2^e = rest * 2^e + // + // Note: + // Since rest and delta share the same exponent e, it suffices to + // compare the significands. + const std::uint64_t rest = (std::uint64_t{p1} << -one.e) + p2; + if (rest <= delta) + { + // V = buffer * 10^n, with M- <= V <= M+. + + decimal_exponent += n; + + // We may now just stop. But instead look if the buffer could be + // decremented to bring V closer to w. + // + // pow10 = 10^n is now 1 ulp in the decimal representation V. + // The rounding procedure works with diyfp's with an implicit + // exponent of e. + // + // 10^n = (10^n * 2^-e) * 2^e = ulp * 2^e + // + const std::uint64_t ten_n = std::uint64_t{pow10} << -one.e; + grisu2_round(buffer, length, dist, delta, rest, ten_n); + + return; + } + + pow10 /= 10; + // + // pow10 = 10^(n-1) <= p1 < 10^n + // Invariants restored. + } + + // 2) + // + // The digits of the integral part have been generated: + // + // M+ = d[k-1]...d[1]d[0] + p2 * 2^e + // = buffer + p2 * 2^e + // + // Now generate the digits of the fractional part p2 * 2^e. + // + // Note: + // No decimal point is generated: the exponent is adjusted instead. + // + // p2 actually represents the fraction + // + // p2 * 2^e + // = p2 / 2^-e + // = d[-1] / 10^1 + d[-2] / 10^2 + ... + // + // Now generate the digits d[-m] of p1 from left to right (m = 1,2,...) + // + // p2 * 2^e = d[-1]d[-2]...d[-m] * 10^-m + // + 10^-m * (d[-m-1] / 10^1 + d[-m-2] / 10^2 + ...) + // + // using + // + // 10^m * p2 = ((10^m * p2) div 2^-e) * 2^-e + ((10^m * p2) mod 2^-e) + // = ( d) * 2^-e + ( r) + // + // or + // 10^m * p2 * 2^e = d + r * 2^e + // + // i.e. + // + // M+ = buffer + p2 * 2^e + // = buffer + 10^-m * (d + r * 2^e) + // = (buffer * 10^m + d) * 10^-m + 10^-m * r * 2^e + // + // and stop as soon as 10^-m * r * 2^e <= delta * 2^e + + JSON_ASSERT(p2 > delta); + + int m = 0; + for (;;) + { + // Invariant: + // M+ = buffer * 10^-m + 10^-m * (d[-m-1] / 10 + d[-m-2] / 10^2 + ...) * 2^e + // = buffer * 10^-m + 10^-m * (p2 ) * 2^e + // = buffer * 10^-m + 10^-m * (1/10 * (10 * p2) ) * 2^e + // = buffer * 10^-m + 10^-m * (1/10 * ((10*p2 div 2^-e) * 2^-e + (10*p2 mod 2^-e)) * 2^e + // + JSON_ASSERT(p2 <= (std::numeric_limits::max)() / 10); + p2 *= 10; + const std::uint64_t d = p2 >> -one.e; // d = (10 * p2) div 2^-e + const std::uint64_t r = p2 & (one.f - 1); // r = (10 * p2) mod 2^-e + // + // M+ = buffer * 10^-m + 10^-m * (1/10 * (d * 2^-e + r) * 2^e + // = buffer * 10^-m + 10^-m * (1/10 * (d + r * 2^e)) + // = (buffer * 10 + d) * 10^(-m-1) + 10^(-m-1) * r * 2^e + // + JSON_ASSERT(d <= 9); + buffer[length++] = static_cast('0' + d); // buffer := buffer * 10 + d + // + // M+ = buffer * 10^(-m-1) + 10^(-m-1) * r * 2^e + // + p2 = r; + m++; + // + // M+ = buffer * 10^-m + 10^-m * p2 * 2^e + // Invariant restored. + + // Check if enough digits have been generated. + // + // 10^-m * p2 * 2^e <= delta * 2^e + // p2 * 2^e <= 10^m * delta * 2^e + // p2 <= 10^m * delta + delta *= 10; + dist *= 10; + if (p2 <= delta) + { + break; + } + } + + // V = buffer * 10^-m, with M- <= V <= M+. + + decimal_exponent -= m; + + // 1 ulp in the decimal representation is now 10^-m. + // Since delta and dist are now scaled by 10^m, we need to do the + // same with ulp in order to keep the units in sync. + // + // 10^m * 10^-m = 1 = 2^-e * 2^e = ten_m * 2^e + // + const std::uint64_t ten_m = one.f; + grisu2_round(buffer, length, dist, delta, p2, ten_m); + + // By construction this algorithm generates the shortest possible decimal + // number (Loitsch, Theorem 6.2) which rounds back to w. + // For an input number of precision p, at least + // + // N = 1 + ceil(p * log_10(2)) + // + // decimal digits are sufficient to identify all binary floating-point + // numbers (Matula, "In-and-Out conversions"). + // This implies that the algorithm does not produce more than N decimal + // digits. + // + // N = 17 for p = 53 (IEEE double precision) + // N = 9 for p = 24 (IEEE single precision) +} + +/*! +v = buf * 10^decimal_exponent +len is the length of the buffer (number of decimal digits) +The buffer must be large enough, i.e. >= max_digits10. +*/ +JSON_HEDLEY_NON_NULL(1) +inline void grisu2(char* buf, int& len, int& decimal_exponent, + diyfp m_minus, diyfp v, diyfp m_plus) +{ + JSON_ASSERT(m_plus.e == m_minus.e); + JSON_ASSERT(m_plus.e == v.e); + + // --------(-----------------------+-----------------------)-------- (A) + // m- v m+ + // + // --------------------(-----------+-----------------------)-------- (B) + // m- v m+ + // + // First scale v (and m- and m+) such that the exponent is in the range + // [alpha, gamma]. + + const cached_power cached = get_cached_power_for_binary_exponent(m_plus.e); + + const diyfp c_minus_k(cached.f, cached.e); // = c ~= 10^-k + + // The exponent of the products is = v.e + c_minus_k.e + q and is in the range [alpha,gamma] + const diyfp w = diyfp::mul(v, c_minus_k); + const diyfp w_minus = diyfp::mul(m_minus, c_minus_k); + const diyfp w_plus = diyfp::mul(m_plus, c_minus_k); + + // ----(---+---)---------------(---+---)---------------(---+---)---- + // w- w w+ + // = c*m- = c*v = c*m+ + // + // diyfp::mul rounds its result and c_minus_k is approximated too. w, w- and + // w+ are now off by a small amount. + // In fact: + // + // w - v * 10^k < 1 ulp + // + // To account for this inaccuracy, add resp. subtract 1 ulp. + // + // --------+---[---------------(---+---)---------------]---+-------- + // w- M- w M+ w+ + // + // Now any number in [M-, M+] (bounds included) will round to w when input, + // regardless of how the input rounding algorithm breaks ties. + // + // And digit_gen generates the shortest possible such number in [M-, M+]. + // Note that this does not mean that Grisu2 always generates the shortest + // possible number in the interval (m-, m+). + const diyfp M_minus(w_minus.f + 1, w_minus.e); + const diyfp M_plus (w_plus.f - 1, w_plus.e ); + + decimal_exponent = -cached.k; // = -(-k) = k + + grisu2_digit_gen(buf, len, decimal_exponent, M_minus, w, M_plus); +} + +/*! +v = buf * 10^decimal_exponent +len is the length of the buffer (number of decimal digits) +The buffer must be large enough, i.e. >= max_digits10. +*/ +template +JSON_HEDLEY_NON_NULL(1) +void grisu2(char* buf, int& len, int& decimal_exponent, FloatType value) +{ + static_assert(diyfp::kPrecision >= std::numeric_limits::digits + 3, + "internal error: not enough precision"); + + JSON_ASSERT(std::isfinite(value)); + JSON_ASSERT(value > 0); + + // If the neighbors (and boundaries) of 'value' are always computed for double-precision + // numbers, all float's can be recovered using strtod (and strtof). However, the resulting + // decimal representations are not exactly "short". + // + // The documentation for 'std::to_chars' (https://en.cppreference.com/w/cpp/utility/to_chars) + // says "value is converted to a string as if by std::sprintf in the default ("C") locale" + // and since sprintf promotes floats to doubles, I think this is exactly what 'std::to_chars' + // does. + // On the other hand, the documentation for 'std::to_chars' requires that "parsing the + // representation using the corresponding std::from_chars function recovers value exactly". That + // indicates that single precision floating-point numbers should be recovered using + // 'std::strtof'. + // + // NB: If the neighbors are computed for single-precision numbers, there is a single float + // (7.0385307e-26f) which can't be recovered using strtod. The resulting double precision + // value is off by 1 ulp. +#if 0 + const boundaries w = compute_boundaries(static_cast(value)); +#else + const boundaries w = compute_boundaries(value); +#endif + + grisu2(buf, len, decimal_exponent, w.minus, w.w, w.plus); +} + +/*! +@brief appends a decimal representation of e to buf +@return a pointer to the element following the exponent. +@pre -1000 < e < 1000 +*/ +JSON_HEDLEY_NON_NULL(1) +JSON_HEDLEY_RETURNS_NON_NULL +inline char* append_exponent(char* buf, int e) +{ + JSON_ASSERT(e > -1000); + JSON_ASSERT(e < 1000); + + if (e < 0) + { + e = -e; + *buf++ = '-'; + } + else + { + *buf++ = '+'; + } + + auto k = static_cast(e); + if (k < 10) + { + // Always print at least two digits in the exponent. + // This is for compatibility with printf("%g"). + *buf++ = '0'; + *buf++ = static_cast('0' + k); + } + else if (k < 100) + { + *buf++ = static_cast('0' + k / 10); + k %= 10; + *buf++ = static_cast('0' + k); + } + else + { + *buf++ = static_cast('0' + k / 100); + k %= 100; + *buf++ = static_cast('0' + k / 10); + k %= 10; + *buf++ = static_cast('0' + k); + } + + return buf; +} + +/*! +@brief prettify v = buf * 10^decimal_exponent + +If v is in the range [10^min_exp, 10^max_exp) it will be printed in fixed-point +notation. Otherwise it will be printed in exponential notation. + +@pre min_exp < 0 +@pre max_exp > 0 +*/ +JSON_HEDLEY_NON_NULL(1) +JSON_HEDLEY_RETURNS_NON_NULL +inline char* format_buffer(char* buf, int len, int decimal_exponent, + int min_exp, int max_exp) +{ + JSON_ASSERT(min_exp < 0); + JSON_ASSERT(max_exp > 0); + + const int k = len; + const int n = len + decimal_exponent; + + // v = buf * 10^(n-k) + // k is the length of the buffer (number of decimal digits) + // n is the position of the decimal point relative to the start of the buffer. + + if (k <= n && n <= max_exp) + { + // digits[000] + // len <= max_exp + 2 + + std::memset(buf + k, '0', static_cast(n) - static_cast(k)); + // Make it look like a floating-point number (#362, #378) + buf[n + 0] = '.'; + buf[n + 1] = '0'; + return buf + (static_cast(n) + 2); + } + + if (0 < n && n <= max_exp) + { + // dig.its + // len <= max_digits10 + 1 + + JSON_ASSERT(k > n); + + std::memmove(buf + (static_cast(n) + 1), buf + n, static_cast(k) - static_cast(n)); + buf[n] = '.'; + return buf + (static_cast(k) + 1U); + } + + if (min_exp < n && n <= 0) + { + // 0.[000]digits + // len <= 2 + (-min_exp - 1) + max_digits10 + + std::memmove(buf + (2 + static_cast(-n)), buf, static_cast(k)); + buf[0] = '0'; + buf[1] = '.'; + std::memset(buf + 2, '0', static_cast(-n)); + return buf + (2U + static_cast(-n) + static_cast(k)); + } + + if (k == 1) + { + // dE+123 + // len <= 1 + 5 + + buf += 1; + } + else + { + // d.igitsE+123 + // len <= max_digits10 + 1 + 5 + + std::memmove(buf + 2, buf + 1, static_cast(k) - 1); + buf[1] = '.'; + buf += 1 + static_cast(k); + } + + *buf++ = 'e'; + return append_exponent(buf, n - 1); +} + +} // namespace dtoa_impl + +/*! +@brief generates a decimal representation of the floating-point number value in [first, last). + +The format of the resulting decimal representation is similar to printf's %g +format. Returns an iterator pointing past-the-end of the decimal representation. + +@note The input number must be finite, i.e. NaN's and Inf's are not supported. +@note The buffer must be large enough. +@note The result is NOT null-terminated. +*/ +template +JSON_HEDLEY_NON_NULL(1, 2) +JSON_HEDLEY_RETURNS_NON_NULL +char* to_chars(char* first, const char* last, FloatType value) +{ + static_cast(last); // maybe unused - fix warning + JSON_ASSERT(std::isfinite(value)); + + // Use signbit(value) instead of (value < 0) since signbit works for -0. + if (std::signbit(value)) + { + value = -value; + *first++ = '-'; + } + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + if (value == 0) // +-0 + { + *first++ = '0'; + // Make it look like a floating-point number (#362, #378) + *first++ = '.'; + *first++ = '0'; + return first; + } +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + + JSON_ASSERT(last - first >= std::numeric_limits::max_digits10); + + // Compute v = buffer * 10^decimal_exponent. + // The decimal digits are stored in the buffer, which needs to be interpreted + // as an unsigned decimal integer. + // len is the length of the buffer, i.e. the number of decimal digits. + int len = 0; + int decimal_exponent = 0; + dtoa_impl::grisu2(first, len, decimal_exponent, value); + + JSON_ASSERT(len <= std::numeric_limits::max_digits10); + + // Format the buffer like printf("%.*g", prec, value) + constexpr int kMinExp = -4; + // Use digits10 here to increase compatibility with version 2. + constexpr int kMaxExp = std::numeric_limits::digits10; + + JSON_ASSERT(last - first >= kMaxExp + 2); + JSON_ASSERT(last - first >= 2 + (-kMinExp - 1) + std::numeric_limits::max_digits10); + JSON_ASSERT(last - first >= std::numeric_limits::max_digits10 + 6); + + return dtoa_impl::format_buffer(first, len, decimal_exponent, kMinExp, kMaxExp); +} + +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + +// #include + +// #include + +// #include + +// #include + + +namespace nlohmann +{ +namespace detail +{ +/////////////////// +// serialization // +/////////////////// + +/// how to treat decoding errors +enum class error_handler_t +{ + strict, ///< throw a type_error exception in case of invalid UTF-8 + replace, ///< replace invalid UTF-8 sequences with U+FFFD + ignore ///< ignore invalid UTF-8 sequences +}; + +template +class serializer +{ + using string_t = typename BasicJsonType::string_t; + using number_float_t = typename BasicJsonType::number_float_t; + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using binary_char_t = typename BasicJsonType::binary_t::value_type; + static constexpr std::uint8_t UTF8_ACCEPT = 0; + static constexpr std::uint8_t UTF8_REJECT = 1; + + public: + /*! + @param[in] s output stream to serialize to + @param[in] ichar indentation character to use + @param[in] error_handler_ how to react on decoding errors + */ + serializer(output_adapter_t s, const char ichar, + error_handler_t error_handler_ = error_handler_t::strict) + : o(std::move(s)) + , loc(std::localeconv()) + , thousands_sep(loc->thousands_sep == nullptr ? '\0' : std::char_traits::to_char_type(* (loc->thousands_sep))) + , decimal_point(loc->decimal_point == nullptr ? '\0' : std::char_traits::to_char_type(* (loc->decimal_point))) + , indent_char(ichar) + , indent_string(512, indent_char) + , error_handler(error_handler_) + {} + + // delete because of pointer members + serializer(const serializer&) = delete; + serializer& operator=(const serializer&) = delete; + serializer(serializer&&) = delete; + serializer& operator=(serializer&&) = delete; + ~serializer() = default; + + /*! + @brief internal implementation of the serialization function + + This function is called by the public member function dump and organizes + the serialization internally. The indentation level is propagated as + additional parameter. In case of arrays and objects, the function is + called recursively. + + - strings and object keys are escaped using `escape_string()` + - integer numbers are converted implicitly via `operator<<` + - floating-point numbers are converted to a string using `"%g"` format + - binary values are serialized as objects containing the subtype and the + byte array + + @param[in] val value to serialize + @param[in] pretty_print whether the output shall be pretty-printed + @param[in] ensure_ascii If @a ensure_ascii is true, all non-ASCII characters + in the output are escaped with `\uXXXX` sequences, and the result consists + of ASCII characters only. + @param[in] indent_step the indent level + @param[in] current_indent the current indent level (only used internally) + */ + void dump(const BasicJsonType& val, + const bool pretty_print, + const bool ensure_ascii, + const unsigned int indent_step, + const unsigned int current_indent = 0) + { + switch (val.m_type) + { + case value_t::object: + { + if (val.m_value.object->empty()) + { + o->write_characters("{}", 2); + return; + } + + if (pretty_print) + { + o->write_characters("{\n", 2); + + // variable to hold indentation for recursive calls + const auto new_indent = current_indent + indent_step; + if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) + { + indent_string.resize(indent_string.size() * 2, ' '); + } + + // first n-1 elements + auto i = val.m_value.object->cbegin(); + for (std::size_t cnt = 0; cnt < val.m_value.object->size() - 1; ++cnt, ++i) + { + o->write_characters(indent_string.c_str(), new_indent); + o->write_character('\"'); + dump_escaped(i->first, ensure_ascii); + o->write_characters("\": ", 3); + dump(i->second, true, ensure_ascii, indent_step, new_indent); + o->write_characters(",\n", 2); + } + + // last element + JSON_ASSERT(i != val.m_value.object->cend()); + JSON_ASSERT(std::next(i) == val.m_value.object->cend()); + o->write_characters(indent_string.c_str(), new_indent); + o->write_character('\"'); + dump_escaped(i->first, ensure_ascii); + o->write_characters("\": ", 3); + dump(i->second, true, ensure_ascii, indent_step, new_indent); + + o->write_character('\n'); + o->write_characters(indent_string.c_str(), current_indent); + o->write_character('}'); + } + else + { + o->write_character('{'); + + // first n-1 elements + auto i = val.m_value.object->cbegin(); + for (std::size_t cnt = 0; cnt < val.m_value.object->size() - 1; ++cnt, ++i) + { + o->write_character('\"'); + dump_escaped(i->first, ensure_ascii); + o->write_characters("\":", 2); + dump(i->second, false, ensure_ascii, indent_step, current_indent); + o->write_character(','); + } + + // last element + JSON_ASSERT(i != val.m_value.object->cend()); + JSON_ASSERT(std::next(i) == val.m_value.object->cend()); + o->write_character('\"'); + dump_escaped(i->first, ensure_ascii); + o->write_characters("\":", 2); + dump(i->second, false, ensure_ascii, indent_step, current_indent); + + o->write_character('}'); + } + + return; + } + + case value_t::array: + { + if (val.m_value.array->empty()) + { + o->write_characters("[]", 2); + return; + } + + if (pretty_print) + { + o->write_characters("[\n", 2); + + // variable to hold indentation for recursive calls + const auto new_indent = current_indent + indent_step; + if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) + { + indent_string.resize(indent_string.size() * 2, ' '); + } + + // first n-1 elements + for (auto i = val.m_value.array->cbegin(); + i != val.m_value.array->cend() - 1; ++i) + { + o->write_characters(indent_string.c_str(), new_indent); + dump(*i, true, ensure_ascii, indent_step, new_indent); + o->write_characters(",\n", 2); + } + + // last element + JSON_ASSERT(!val.m_value.array->empty()); + o->write_characters(indent_string.c_str(), new_indent); + dump(val.m_value.array->back(), true, ensure_ascii, indent_step, new_indent); + + o->write_character('\n'); + o->write_characters(indent_string.c_str(), current_indent); + o->write_character(']'); + } + else + { + o->write_character('['); + + // first n-1 elements + for (auto i = val.m_value.array->cbegin(); + i != val.m_value.array->cend() - 1; ++i) + { + dump(*i, false, ensure_ascii, indent_step, current_indent); + o->write_character(','); + } + + // last element + JSON_ASSERT(!val.m_value.array->empty()); + dump(val.m_value.array->back(), false, ensure_ascii, indent_step, current_indent); + + o->write_character(']'); + } + + return; + } + + case value_t::string: + { + o->write_character('\"'); + dump_escaped(*val.m_value.string, ensure_ascii); + o->write_character('\"'); + return; + } + + case value_t::binary: + { + if (pretty_print) + { + o->write_characters("{\n", 2); + + // variable to hold indentation for recursive calls + const auto new_indent = current_indent + indent_step; + if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) + { + indent_string.resize(indent_string.size() * 2, ' '); + } + + o->write_characters(indent_string.c_str(), new_indent); + + o->write_characters("\"bytes\": [", 10); + + if (!val.m_value.binary->empty()) + { + for (auto i = val.m_value.binary->cbegin(); + i != val.m_value.binary->cend() - 1; ++i) + { + dump_integer(*i); + o->write_characters(", ", 2); + } + dump_integer(val.m_value.binary->back()); + } + + o->write_characters("],\n", 3); + o->write_characters(indent_string.c_str(), new_indent); + + o->write_characters("\"subtype\": ", 11); + if (val.m_value.binary->has_subtype()) + { + dump_integer(val.m_value.binary->subtype()); + } + else + { + o->write_characters("null", 4); + } + o->write_character('\n'); + o->write_characters(indent_string.c_str(), current_indent); + o->write_character('}'); + } + else + { + o->write_characters("{\"bytes\":[", 10); + + if (!val.m_value.binary->empty()) + { + for (auto i = val.m_value.binary->cbegin(); + i != val.m_value.binary->cend() - 1; ++i) + { + dump_integer(*i); + o->write_character(','); + } + dump_integer(val.m_value.binary->back()); + } + + o->write_characters("],\"subtype\":", 12); + if (val.m_value.binary->has_subtype()) + { + dump_integer(val.m_value.binary->subtype()); + o->write_character('}'); + } + else + { + o->write_characters("null}", 5); + } + } + return; + } + + case value_t::boolean: + { + if (val.m_value.boolean) + { + o->write_characters("true", 4); + } + else + { + o->write_characters("false", 5); + } + return; + } + + case value_t::number_integer: + { + dump_integer(val.m_value.number_integer); + return; + } + + case value_t::number_unsigned: + { + dump_integer(val.m_value.number_unsigned); + return; + } + + case value_t::number_float: + { + dump_float(val.m_value.number_float); + return; + } + + case value_t::discarded: + { + o->write_characters("", 11); + return; + } + + case value_t::null: + { + o->write_characters("null", 4); + return; + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + } + + JSON_PRIVATE_UNLESS_TESTED: + /*! + @brief dump escaped string + + Escape a string by replacing certain special characters by a sequence of an + escape character (backslash) and another character and other control + characters by a sequence of "\u" followed by a four-digit hex + representation. The escaped string is written to output stream @a o. + + @param[in] s the string to escape + @param[in] ensure_ascii whether to escape non-ASCII characters with + \uXXXX sequences + + @complexity Linear in the length of string @a s. + */ + void dump_escaped(const string_t& s, const bool ensure_ascii) + { + std::uint32_t codepoint{}; + std::uint8_t state = UTF8_ACCEPT; + std::size_t bytes = 0; // number of bytes written to string_buffer + + // number of bytes written at the point of the last valid byte + std::size_t bytes_after_last_accept = 0; + std::size_t undumped_chars = 0; + + for (std::size_t i = 0; i < s.size(); ++i) + { + const auto byte = static_cast(s[i]); + + switch (decode(state, codepoint, byte)) + { + case UTF8_ACCEPT: // decode found a new code point + { + switch (codepoint) + { + case 0x08: // backspace + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'b'; + break; + } + + case 0x09: // horizontal tab + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 't'; + break; + } + + case 0x0A: // newline + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'n'; + break; + } + + case 0x0C: // formfeed + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'f'; + break; + } + + case 0x0D: // carriage return + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'r'; + break; + } + + case 0x22: // quotation mark + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = '\"'; + break; + } + + case 0x5C: // reverse solidus + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = '\\'; + break; + } + + default: + { + // escape control characters (0x00..0x1F) or, if + // ensure_ascii parameter is used, non-ASCII characters + if ((codepoint <= 0x1F) || (ensure_ascii && (codepoint >= 0x7F))) + { + if (codepoint <= 0xFFFF) + { + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + static_cast((std::snprintf)(string_buffer.data() + bytes, 7, "\\u%04x", + static_cast(codepoint))); + bytes += 6; + } + else + { + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + static_cast((std::snprintf)(string_buffer.data() + bytes, 13, "\\u%04x\\u%04x", + static_cast(0xD7C0u + (codepoint >> 10u)), + static_cast(0xDC00u + (codepoint & 0x3FFu)))); + bytes += 12; + } + } + else + { + // copy byte to buffer (all previous bytes + // been copied have in default case above) + string_buffer[bytes++] = s[i]; + } + break; + } + } + + // write buffer and reset index; there must be 13 bytes + // left, as this is the maximal number of bytes to be + // written ("\uxxxx\uxxxx\0") for one code point + if (string_buffer.size() - bytes < 13) + { + o->write_characters(string_buffer.data(), bytes); + bytes = 0; + } + + // remember the byte position of this accept + bytes_after_last_accept = bytes; + undumped_chars = 0; + break; + } + + case UTF8_REJECT: // decode found invalid UTF-8 byte + { + switch (error_handler) + { + case error_handler_t::strict: + { + std::stringstream ss; + ss << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << (byte | 0); + JSON_THROW(type_error::create(316, "invalid UTF-8 byte at index " + std::to_string(i) + ": 0x" + ss.str(), BasicJsonType())); + } + + case error_handler_t::ignore: + case error_handler_t::replace: + { + // in case we saw this character the first time, we + // would like to read it again, because the byte + // may be OK for itself, but just not OK for the + // previous sequence + if (undumped_chars > 0) + { + --i; + } + + // reset length buffer to the last accepted index; + // thus removing/ignoring the invalid characters + bytes = bytes_after_last_accept; + + if (error_handler == error_handler_t::replace) + { + // add a replacement character + if (ensure_ascii) + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'u'; + string_buffer[bytes++] = 'f'; + string_buffer[bytes++] = 'f'; + string_buffer[bytes++] = 'f'; + string_buffer[bytes++] = 'd'; + } + else + { + string_buffer[bytes++] = detail::binary_writer::to_char_type('\xEF'); + string_buffer[bytes++] = detail::binary_writer::to_char_type('\xBF'); + string_buffer[bytes++] = detail::binary_writer::to_char_type('\xBD'); + } + + // write buffer and reset index; there must be 13 bytes + // left, as this is the maximal number of bytes to be + // written ("\uxxxx\uxxxx\0") for one code point + if (string_buffer.size() - bytes < 13) + { + o->write_characters(string_buffer.data(), bytes); + bytes = 0; + } + + bytes_after_last_accept = bytes; + } + + undumped_chars = 0; + + // continue processing the string + state = UTF8_ACCEPT; + break; + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + break; + } + + default: // decode found yet incomplete multi-byte code point + { + if (!ensure_ascii) + { + // code point will not be escaped - copy byte to buffer + string_buffer[bytes++] = s[i]; + } + ++undumped_chars; + break; + } + } + } + + // we finished processing the string + if (JSON_HEDLEY_LIKELY(state == UTF8_ACCEPT)) + { + // write buffer + if (bytes > 0) + { + o->write_characters(string_buffer.data(), bytes); + } + } + else + { + // we finish reading, but do not accept: string was incomplete + switch (error_handler) + { + case error_handler_t::strict: + { + std::stringstream ss; + ss << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << (static_cast(s.back()) | 0); + JSON_THROW(type_error::create(316, "incomplete UTF-8 string; last byte: 0x" + ss.str(), BasicJsonType())); + } + + case error_handler_t::ignore: + { + // write all accepted bytes + o->write_characters(string_buffer.data(), bytes_after_last_accept); + break; + } + + case error_handler_t::replace: + { + // write all accepted bytes + o->write_characters(string_buffer.data(), bytes_after_last_accept); + // add a replacement character + if (ensure_ascii) + { + o->write_characters("\\ufffd", 6); + } + else + { + o->write_characters("\xEF\xBF\xBD", 3); + } + break; + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + } + } + + private: + /*! + @brief count digits + + Count the number of decimal (base 10) digits for an input unsigned integer. + + @param[in] x unsigned integer number to count its digits + @return number of decimal digits + */ + inline unsigned int count_digits(number_unsigned_t x) noexcept + { + unsigned int n_digits = 1; + for (;;) + { + if (x < 10) + { + return n_digits; + } + if (x < 100) + { + return n_digits + 1; + } + if (x < 1000) + { + return n_digits + 2; + } + if (x < 10000) + { + return n_digits + 3; + } + x = x / 10000u; + n_digits += 4; + } + } + + // templates to avoid warnings about useless casts + template ::value, int> = 0> + bool is_negative_number(NumberType x) + { + return x < 0; + } + + template < typename NumberType, enable_if_t ::value, int > = 0 > + bool is_negative_number(NumberType /*unused*/) + { + return false; + } + + /*! + @brief dump an integer + + Dump a given integer to output stream @a o. Works internally with + @a number_buffer. + + @param[in] x integer number (signed or unsigned) to dump + @tparam NumberType either @a number_integer_t or @a number_unsigned_t + */ + template < typename NumberType, detail::enable_if_t < + std::is_integral::value || + std::is_same::value || + std::is_same::value || + std::is_same::value, + int > = 0 > + void dump_integer(NumberType x) + { + static constexpr std::array, 100> digits_to_99 + { + { + {{'0', '0'}}, {{'0', '1'}}, {{'0', '2'}}, {{'0', '3'}}, {{'0', '4'}}, {{'0', '5'}}, {{'0', '6'}}, {{'0', '7'}}, {{'0', '8'}}, {{'0', '9'}}, + {{'1', '0'}}, {{'1', '1'}}, {{'1', '2'}}, {{'1', '3'}}, {{'1', '4'}}, {{'1', '5'}}, {{'1', '6'}}, {{'1', '7'}}, {{'1', '8'}}, {{'1', '9'}}, + {{'2', '0'}}, {{'2', '1'}}, {{'2', '2'}}, {{'2', '3'}}, {{'2', '4'}}, {{'2', '5'}}, {{'2', '6'}}, {{'2', '7'}}, {{'2', '8'}}, {{'2', '9'}}, + {{'3', '0'}}, {{'3', '1'}}, {{'3', '2'}}, {{'3', '3'}}, {{'3', '4'}}, {{'3', '5'}}, {{'3', '6'}}, {{'3', '7'}}, {{'3', '8'}}, {{'3', '9'}}, + {{'4', '0'}}, {{'4', '1'}}, {{'4', '2'}}, {{'4', '3'}}, {{'4', '4'}}, {{'4', '5'}}, {{'4', '6'}}, {{'4', '7'}}, {{'4', '8'}}, {{'4', '9'}}, + {{'5', '0'}}, {{'5', '1'}}, {{'5', '2'}}, {{'5', '3'}}, {{'5', '4'}}, {{'5', '5'}}, {{'5', '6'}}, {{'5', '7'}}, {{'5', '8'}}, {{'5', '9'}}, + {{'6', '0'}}, {{'6', '1'}}, {{'6', '2'}}, {{'6', '3'}}, {{'6', '4'}}, {{'6', '5'}}, {{'6', '6'}}, {{'6', '7'}}, {{'6', '8'}}, {{'6', '9'}}, + {{'7', '0'}}, {{'7', '1'}}, {{'7', '2'}}, {{'7', '3'}}, {{'7', '4'}}, {{'7', '5'}}, {{'7', '6'}}, {{'7', '7'}}, {{'7', '8'}}, {{'7', '9'}}, + {{'8', '0'}}, {{'8', '1'}}, {{'8', '2'}}, {{'8', '3'}}, {{'8', '4'}}, {{'8', '5'}}, {{'8', '6'}}, {{'8', '7'}}, {{'8', '8'}}, {{'8', '9'}}, + {{'9', '0'}}, {{'9', '1'}}, {{'9', '2'}}, {{'9', '3'}}, {{'9', '4'}}, {{'9', '5'}}, {{'9', '6'}}, {{'9', '7'}}, {{'9', '8'}}, {{'9', '9'}}, + } + }; + + // special case for "0" + if (x == 0) + { + o->write_character('0'); + return; + } + + // use a pointer to fill the buffer + auto buffer_ptr = number_buffer.begin(); // NOLINT(llvm-qualified-auto,readability-qualified-auto,cppcoreguidelines-pro-type-vararg,hicpp-vararg) + + number_unsigned_t abs_value; + + unsigned int n_chars{}; + + if (is_negative_number(x)) + { + *buffer_ptr = '-'; + abs_value = remove_sign(static_cast(x)); + + // account one more byte for the minus sign + n_chars = 1 + count_digits(abs_value); + } + else + { + abs_value = static_cast(x); + n_chars = count_digits(abs_value); + } + + // spare 1 byte for '\0' + JSON_ASSERT(n_chars < number_buffer.size() - 1); + + // jump to the end to generate the string from backward, + // so we later avoid reversing the result + buffer_ptr += n_chars; + + // Fast int2ascii implementation inspired by "Fastware" talk by Andrei Alexandrescu + // See: https://www.youtube.com/watch?v=o4-CwDo2zpg + while (abs_value >= 100) + { + const auto digits_index = static_cast((abs_value % 100)); + abs_value /= 100; + *(--buffer_ptr) = digits_to_99[digits_index][1]; + *(--buffer_ptr) = digits_to_99[digits_index][0]; + } + + if (abs_value >= 10) + { + const auto digits_index = static_cast(abs_value); + *(--buffer_ptr) = digits_to_99[digits_index][1]; + *(--buffer_ptr) = digits_to_99[digits_index][0]; + } + else + { + *(--buffer_ptr) = static_cast('0' + abs_value); + } + + o->write_characters(number_buffer.data(), n_chars); + } + + /*! + @brief dump a floating-point number + + Dump a given floating-point number to output stream @a o. Works internally + with @a number_buffer. + + @param[in] x floating-point number to dump + */ + void dump_float(number_float_t x) + { + // NaN / inf + if (!std::isfinite(x)) + { + o->write_characters("null", 4); + return; + } + + // If number_float_t is an IEEE-754 single or double precision number, + // use the Grisu2 algorithm to produce short numbers which are + // guaranteed to round-trip, using strtof and strtod, resp. + // + // NB: The test below works if == . + static constexpr bool is_ieee_single_or_double + = (std::numeric_limits::is_iec559 && std::numeric_limits::digits == 24 && std::numeric_limits::max_exponent == 128) || + (std::numeric_limits::is_iec559 && std::numeric_limits::digits == 53 && std::numeric_limits::max_exponent == 1024); + + dump_float(x, std::integral_constant()); + } + + void dump_float(number_float_t x, std::true_type /*is_ieee_single_or_double*/) + { + auto* begin = number_buffer.data(); + auto* end = ::nlohmann::detail::to_chars(begin, begin + number_buffer.size(), x); + + o->write_characters(begin, static_cast(end - begin)); + } + + void dump_float(number_float_t x, std::false_type /*is_ieee_single_or_double*/) + { + // get number of digits for a float -> text -> float round-trip + static constexpr auto d = std::numeric_limits::max_digits10; + + // the actual conversion + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + std::ptrdiff_t len = (std::snprintf)(number_buffer.data(), number_buffer.size(), "%.*g", d, x); + + // negative value indicates an error + JSON_ASSERT(len > 0); + // check if buffer was large enough + JSON_ASSERT(static_cast(len) < number_buffer.size()); + + // erase thousands separator + if (thousands_sep != '\0') + { + // NOLINTNEXTLINE(readability-qualified-auto,llvm-qualified-auto): std::remove returns an iterator, see https://github.com/nlohmann/json/issues/3081 + const auto end = std::remove(number_buffer.begin(), number_buffer.begin() + len, thousands_sep); + std::fill(end, number_buffer.end(), '\0'); + JSON_ASSERT((end - number_buffer.begin()) <= len); + len = (end - number_buffer.begin()); + } + + // convert decimal point to '.' + if (decimal_point != '\0' && decimal_point != '.') + { + // NOLINTNEXTLINE(readability-qualified-auto,llvm-qualified-auto): std::find returns an iterator, see https://github.com/nlohmann/json/issues/3081 + const auto dec_pos = std::find(number_buffer.begin(), number_buffer.end(), decimal_point); + if (dec_pos != number_buffer.end()) + { + *dec_pos = '.'; + } + } + + o->write_characters(number_buffer.data(), static_cast(len)); + + // determine if we need to append ".0" + const bool value_is_int_like = + std::none_of(number_buffer.begin(), number_buffer.begin() + len + 1, + [](char c) + { + return c == '.' || c == 'e'; + }); + + if (value_is_int_like) + { + o->write_characters(".0", 2); + } + } + + /*! + @brief check whether a string is UTF-8 encoded + + The function checks each byte of a string whether it is UTF-8 encoded. The + result of the check is stored in the @a state parameter. The function must + be called initially with state 0 (accept). State 1 means the string must + be rejected, because the current byte is not allowed. If the string is + completely processed, but the state is non-zero, the string ended + prematurely; that is, the last byte indicated more bytes should have + followed. + + @param[in,out] state the state of the decoding + @param[in,out] codep codepoint (valid only if resulting state is UTF8_ACCEPT) + @param[in] byte next byte to decode + @return new state + + @note The function has been edited: a std::array is used. + + @copyright Copyright (c) 2008-2009 Bjoern Hoehrmann + @sa http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ + */ + static std::uint8_t decode(std::uint8_t& state, std::uint32_t& codep, const std::uint8_t byte) noexcept + { + static const std::array utf8d = + { + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 00..1F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20..3F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 40..5F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 60..7F + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 80..9F + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // A0..BF + 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // C0..DF + 0xA, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x3, 0x3, // E0..EF + 0xB, 0x6, 0x6, 0x6, 0x5, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, // F0..FF + 0x0, 0x1, 0x2, 0x3, 0x5, 0x8, 0x7, 0x1, 0x1, 0x1, 0x4, 0x6, 0x1, 0x1, 0x1, 0x1, // s0..s0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, // s1..s2 + 1, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, // s3..s4 + 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, // s5..s6 + 1, 3, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // s7..s8 + } + }; + + JSON_ASSERT(byte < utf8d.size()); + const std::uint8_t type = utf8d[byte]; + + codep = (state != UTF8_ACCEPT) + ? (byte & 0x3fu) | (codep << 6u) + : (0xFFu >> type) & (byte); + + std::size_t index = 256u + static_cast(state) * 16u + static_cast(type); + JSON_ASSERT(index < 400); + state = utf8d[index]; + return state; + } + + /* + * Overload to make the compiler happy while it is instantiating + * dump_integer for number_unsigned_t. + * Must never be called. + */ + number_unsigned_t remove_sign(number_unsigned_t x) + { + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + return x; // LCOV_EXCL_LINE + } + + /* + * Helper function for dump_integer + * + * This function takes a negative signed integer and returns its absolute + * value as unsigned integer. The plus/minus shuffling is necessary as we can + * not directly remove the sign of an arbitrary signed integer as the + * absolute values of INT_MIN and INT_MAX are usually not the same. See + * #1708 for details. + */ + inline number_unsigned_t remove_sign(number_integer_t x) noexcept + { + JSON_ASSERT(x < 0 && x < (std::numeric_limits::max)()); // NOLINT(misc-redundant-expression) + return static_cast(-(x + 1)) + 1; + } + + private: + /// the output of the serializer + output_adapter_t o = nullptr; + + /// a (hopefully) large enough character buffer + std::array number_buffer{{}}; + + /// the locale + const std::lconv* loc = nullptr; + /// the locale's thousand separator character + const char thousands_sep = '\0'; + /// the locale's decimal point character + const char decimal_point = '\0'; + + /// string buffer + std::array string_buffer{{}}; + + /// the indentation character + const char indent_char; + /// the indentation string + string_t indent_string; + + /// error_handler how to react on decoding errors + const error_handler_t error_handler; +}; +} // namespace detail +} // namespace nlohmann + +// #include + +// #include + +// #include + + +#include // less +#include // initializer_list +#include // input_iterator_tag, iterator_traits +#include // allocator +#include // for out_of_range +#include // enable_if, is_convertible +#include // pair +#include // vector + +// #include + + +namespace nlohmann +{ + +/// ordered_map: a minimal map-like container that preserves insertion order +/// for use within nlohmann::basic_json +template , + class Allocator = std::allocator>> + struct ordered_map : std::vector, Allocator> +{ + using key_type = Key; + using mapped_type = T; + using Container = std::vector, Allocator>; + using iterator = typename Container::iterator; + using const_iterator = typename Container::const_iterator; + using size_type = typename Container::size_type; + using value_type = typename Container::value_type; + + // Explicit constructors instead of `using Container::Container` + // otherwise older compilers choke on it (GCC <= 5.5, xcode <= 9.4) + ordered_map(const Allocator& alloc = Allocator()) : Container{alloc} {} + template + ordered_map(It first, It last, const Allocator& alloc = Allocator()) + : Container{first, last, alloc} {} + ordered_map(std::initializer_list init, const Allocator& alloc = Allocator() ) + : Container{init, alloc} {} + + std::pair emplace(const key_type& key, T&& t) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return {it, false}; + } + } + Container::emplace_back(key, t); + return {--this->end(), true}; + } + + T& operator[](const Key& key) + { + return emplace(key, T{}).first->second; + } + + const T& operator[](const Key& key) const + { + return at(key); + } + + T& at(const Key& key) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it->second; + } + } + + JSON_THROW(std::out_of_range("key not found")); + } + + const T& at(const Key& key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it->second; + } + } + + JSON_THROW(std::out_of_range("key not found")); + } + + size_type erase(const Key& key) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + // Since we cannot move const Keys, re-construct them in place + for (auto next = it; ++next != this->end(); ++it) + { + it->~value_type(); // Destroy but keep allocation + new (&*it) value_type{std::move(*next)}; + } + Container::pop_back(); + return 1; + } + } + return 0; + } + + iterator erase(iterator pos) + { + return erase(pos, std::next(pos)); + } + + iterator erase(iterator first, iterator last) + { + const auto elements_affected = std::distance(first, last); + const auto offset = std::distance(Container::begin(), first); + + // This is the start situation. We need to delete elements_affected + // elements (3 in this example: e, f, g), and need to return an + // iterator past the last deleted element (h in this example). + // Note that offset is the distance from the start of the vector + // to first. We will need this later. + + // [ a, b, c, d, e, f, g, h, i, j ] + // ^ ^ + // first last + + // Since we cannot move const Keys, we re-construct them in place. + // We start at first and re-construct (viz. copy) the elements from + // the back of the vector. Example for first iteration: + + // ,--------. + // v | destroy e and re-construct with h + // [ a, b, c, d, e, f, g, h, i, j ] + // ^ ^ + // it it + elements_affected + + for (auto it = first; std::next(it, elements_affected) != Container::end(); ++it) + { + it->~value_type(); // destroy but keep allocation + new (&*it) value_type{std::move(*std::next(it, elements_affected))}; // "move" next element to it + } + + // [ a, b, c, d, h, i, j, h, i, j ] + // ^ ^ + // first last + + // remove the unneeded elements at the end of the vector + Container::resize(this->size() - static_cast(elements_affected)); + + // [ a, b, c, d, h, i, j ] + // ^ ^ + // first last + + // first is now pointing past the last deleted element, but we cannot + // use this iterator, because it may have been invalidated by the + // resize call. Instead, we can return begin() + offset. + return Container::begin() + offset; + } + + size_type count(const Key& key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return 1; + } + } + return 0; + } + + iterator find(const Key& key) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it; + } + } + return Container::end(); + } + + const_iterator find(const Key& key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == key) + { + return it; + } + } + return Container::end(); + } + + std::pair insert( value_type&& value ) + { + return emplace(value.first, std::move(value.second)); + } + + std::pair insert( const value_type& value ) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (it->first == value.first) + { + return {it, false}; + } + } + Container::push_back(value); + return {--this->end(), true}; + } + + template + using require_input_iter = typename std::enable_if::iterator_category, + std::input_iterator_tag>::value>::type; + + template> + void insert(InputIt first, InputIt last) + { + for (auto it = first; it != last; ++it) + { + insert(*it); + } + } +}; + +} // namespace nlohmann + + +#if defined(JSON_HAS_CPP_17) + #include +#endif + +/*! +@brief namespace for Niels Lohmann +@see https://github.com/nlohmann +@since version 1.0.0 +*/ +namespace nlohmann +{ + +/*! +@brief a class to store JSON values + +@internal +@invariant The member variables @a m_value and @a m_type have the following +relationship: +- If `m_type == value_t::object`, then `m_value.object != nullptr`. +- If `m_type == value_t::array`, then `m_value.array != nullptr`. +- If `m_type == value_t::string`, then `m_value.string != nullptr`. +The invariants are checked by member function assert_invariant(). + +@note ObjectType trick from https://stackoverflow.com/a/9860911 +@endinternal + +@since version 1.0.0 + +@nosubgrouping +*/ +NLOHMANN_BASIC_JSON_TPL_DECLARATION +class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions) +{ + private: + template friend struct detail::external_constructor; + friend ::nlohmann::json_pointer; + + template + friend class ::nlohmann::detail::parser; + friend ::nlohmann::detail::serializer; + template + friend class ::nlohmann::detail::iter_impl; + template + friend class ::nlohmann::detail::binary_writer; + template + friend class ::nlohmann::detail::binary_reader; + template + friend class ::nlohmann::detail::json_sax_dom_parser; + template + friend class ::nlohmann::detail::json_sax_dom_callback_parser; + friend class ::nlohmann::detail::exception; + + /// workaround type for MSVC + using basic_json_t = NLOHMANN_BASIC_JSON_TPL; + + JSON_PRIVATE_UNLESS_TESTED: + // convenience aliases for types residing in namespace detail; + using lexer = ::nlohmann::detail::lexer_base; + + template + static ::nlohmann::detail::parser parser( + InputAdapterType adapter, + detail::parser_callback_tcb = nullptr, + const bool allow_exceptions = true, + const bool ignore_comments = false + ) + { + return ::nlohmann::detail::parser(std::move(adapter), + std::move(cb), allow_exceptions, ignore_comments); + } + + private: + using primitive_iterator_t = ::nlohmann::detail::primitive_iterator_t; + template + using internal_iterator = ::nlohmann::detail::internal_iterator; + template + using iter_impl = ::nlohmann::detail::iter_impl; + template + using iteration_proxy = ::nlohmann::detail::iteration_proxy; + template using json_reverse_iterator = ::nlohmann::detail::json_reverse_iterator; + + template + using output_adapter_t = ::nlohmann::detail::output_adapter_t; + + template + using binary_reader = ::nlohmann::detail::binary_reader; + template using binary_writer = ::nlohmann::detail::binary_writer; + + JSON_PRIVATE_UNLESS_TESTED: + using serializer = ::nlohmann::detail::serializer; + + public: + using value_t = detail::value_t; + /// JSON Pointer, see @ref nlohmann::json_pointer + using json_pointer = ::nlohmann::json_pointer; + template + using json_serializer = JSONSerializer; + /// how to treat decoding errors + using error_handler_t = detail::error_handler_t; + /// how to treat CBOR tags + using cbor_tag_handler_t = detail::cbor_tag_handler_t; + /// helper type for initializer lists of basic_json values + using initializer_list_t = std::initializer_list>; + + using input_format_t = detail::input_format_t; + /// SAX interface type, see @ref nlohmann::json_sax + using json_sax_t = json_sax; + + //////////////// + // exceptions // + //////////////// + + /// @name exceptions + /// Classes to implement user-defined exceptions. + /// @{ + + using exception = detail::exception; + using parse_error = detail::parse_error; + using invalid_iterator = detail::invalid_iterator; + using type_error = detail::type_error; + using out_of_range = detail::out_of_range; + using other_error = detail::other_error; + + /// @} + + + ///////////////////// + // container types // + ///////////////////// + + /// @name container types + /// The canonic container types to use @ref basic_json like any other STL + /// container. + /// @{ + + /// the type of elements in a basic_json container + using value_type = basic_json; + + /// the type of an element reference + using reference = value_type&; + /// the type of an element const reference + using const_reference = const value_type&; + + /// a type to represent differences between iterators + using difference_type = std::ptrdiff_t; + /// a type to represent container sizes + using size_type = std::size_t; + + /// the allocator type + using allocator_type = AllocatorType; + + /// the type of an element pointer + using pointer = typename std::allocator_traits::pointer; + /// the type of an element const pointer + using const_pointer = typename std::allocator_traits::const_pointer; + + /// an iterator for a basic_json container + using iterator = iter_impl; + /// a const iterator for a basic_json container + using const_iterator = iter_impl; + /// a reverse iterator for a basic_json container + using reverse_iterator = json_reverse_iterator; + /// a const reverse iterator for a basic_json container + using const_reverse_iterator = json_reverse_iterator; + + /// @} + + + /// @brief returns the allocator associated with the container + /// @sa https://json.nlohmann.me/api/basic_json/get_allocator/ + static allocator_type get_allocator() + { + return allocator_type(); + } + + /// @brief returns version information on the library + /// @sa https://json.nlohmann.me/api/basic_json/meta/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json meta() + { + basic_json result; + + result["copyright"] = "(C) 2013-2022 Niels Lohmann"; + result["name"] = "JSON for Modern C++"; + result["url"] = "https://github.com/nlohmann/json"; + result["version"]["string"] = + std::to_string(NLOHMANN_JSON_VERSION_MAJOR) + "." + + std::to_string(NLOHMANN_JSON_VERSION_MINOR) + "." + + std::to_string(NLOHMANN_JSON_VERSION_PATCH); + result["version"]["major"] = NLOHMANN_JSON_VERSION_MAJOR; + result["version"]["minor"] = NLOHMANN_JSON_VERSION_MINOR; + result["version"]["patch"] = NLOHMANN_JSON_VERSION_PATCH; + +#ifdef _WIN32 + result["platform"] = "win32"; +#elif defined __linux__ + result["platform"] = "linux"; +#elif defined __APPLE__ + result["platform"] = "apple"; +#elif defined __unix__ + result["platform"] = "unix"; +#else + result["platform"] = "unknown"; +#endif + +#if defined(__ICC) || defined(__INTEL_COMPILER) + result["compiler"] = {{"family", "icc"}, {"version", __INTEL_COMPILER}}; +#elif defined(__clang__) + result["compiler"] = {{"family", "clang"}, {"version", __clang_version__}}; +#elif defined(__GNUC__) || defined(__GNUG__) + result["compiler"] = {{"family", "gcc"}, {"version", std::to_string(__GNUC__) + "." + std::to_string(__GNUC_MINOR__) + "." + std::to_string(__GNUC_PATCHLEVEL__)}}; +#elif defined(__HP_cc) || defined(__HP_aCC) + result["compiler"] = "hp" +#elif defined(__IBMCPP__) + result["compiler"] = {{"family", "ilecpp"}, {"version", __IBMCPP__}}; +#elif defined(_MSC_VER) + result["compiler"] = {{"family", "msvc"}, {"version", _MSC_VER}}; +#elif defined(__PGI) + result["compiler"] = {{"family", "pgcpp"}, {"version", __PGI}}; +#elif defined(__SUNPRO_CC) + result["compiler"] = {{"family", "sunpro"}, {"version", __SUNPRO_CC}}; +#else + result["compiler"] = {{"family", "unknown"}, {"version", "unknown"}}; +#endif + +#ifdef __cplusplus + result["compiler"]["c++"] = std::to_string(__cplusplus); +#else + result["compiler"]["c++"] = "unknown"; +#endif + return result; + } + + + /////////////////////////// + // JSON value data types // + /////////////////////////// + + /// @name JSON value data types + /// The data types to store a JSON value. These types are derived from + /// the template arguments passed to class @ref basic_json. + /// @{ + + /// @brief object key comparator type + /// @sa https://json.nlohmann.me/api/basic_json/object_comparator_t/ +#if defined(JSON_HAS_CPP_14) + // Use transparent comparator if possible, combined with perfect forwarding + // on find() and count() calls prevents unnecessary string construction. + using object_comparator_t = std::less<>; +#else + using object_comparator_t = std::less; +#endif + + /// @brief a type for an object + /// @sa https://json.nlohmann.me/api/basic_json/object_t/ + using object_t = ObjectType>>; + + /// @brief a type for an array + /// @sa https://json.nlohmann.me/api/basic_json/array_t/ + using array_t = ArrayType>; + + /// @brief a type for a string + /// @sa https://json.nlohmann.me/api/basic_json/string_t/ + using string_t = StringType; + + /// @brief a type for a boolean + /// @sa https://json.nlohmann.me/api/basic_json/boolean_t/ + using boolean_t = BooleanType; + + /// @brief a type for a number (integer) + /// @sa https://json.nlohmann.me/api/basic_json/number_integer_t/ + using number_integer_t = NumberIntegerType; + + /// @brief a type for a number (unsigned) + /// @sa https://json.nlohmann.me/api/basic_json/number_unsigned_t/ + using number_unsigned_t = NumberUnsignedType; + + /// @brief a type for a number (floating-point) + /// @sa https://json.nlohmann.me/api/basic_json/number_float_t/ + using number_float_t = NumberFloatType; + + /// @brief a type for a packed binary type + /// @sa https://json.nlohmann.me/api/basic_json/binary_t/ + using binary_t = nlohmann::byte_container_with_subtype; + + /// @} + + private: + + /// helper for exception-safe object creation + template + JSON_HEDLEY_RETURNS_NON_NULL + static T* create(Args&& ... args) + { + AllocatorType alloc; + using AllocatorTraits = std::allocator_traits>; + + auto deleter = [&](T * obj) + { + AllocatorTraits::deallocate(alloc, obj, 1); + }; + std::unique_ptr obj(AllocatorTraits::allocate(alloc, 1), deleter); + AllocatorTraits::construct(alloc, obj.get(), std::forward(args)...); + JSON_ASSERT(obj != nullptr); + return obj.release(); + } + + //////////////////////// + // JSON value storage // + //////////////////////// + + JSON_PRIVATE_UNLESS_TESTED: + /*! + @brief a JSON value + + The actual storage for a JSON value of the @ref basic_json class. This + union combines the different storage types for the JSON value types + defined in @ref value_t. + + JSON type | value_t type | used type + --------- | --------------- | ------------------------ + object | object | pointer to @ref object_t + array | array | pointer to @ref array_t + string | string | pointer to @ref string_t + boolean | boolean | @ref boolean_t + number | number_integer | @ref number_integer_t + number | number_unsigned | @ref number_unsigned_t + number | number_float | @ref number_float_t + binary | binary | pointer to @ref binary_t + null | null | *no value is stored* + + @note Variable-length types (objects, arrays, and strings) are stored as + pointers. The size of the union should not exceed 64 bits if the default + value types are used. + + @since version 1.0.0 + */ + union json_value + { + /// object (stored with pointer to save storage) + object_t* object; + /// array (stored with pointer to save storage) + array_t* array; + /// string (stored with pointer to save storage) + string_t* string; + /// binary (stored with pointer to save storage) + binary_t* binary; + /// boolean + boolean_t boolean; + /// number (integer) + number_integer_t number_integer; + /// number (unsigned integer) + number_unsigned_t number_unsigned; + /// number (floating-point) + number_float_t number_float; + + /// default constructor (for null values) + json_value() = default; + /// constructor for booleans + json_value(boolean_t v) noexcept : boolean(v) {} + /// constructor for numbers (integer) + json_value(number_integer_t v) noexcept : number_integer(v) {} + /// constructor for numbers (unsigned) + json_value(number_unsigned_t v) noexcept : number_unsigned(v) {} + /// constructor for numbers (floating-point) + json_value(number_float_t v) noexcept : number_float(v) {} + /// constructor for empty values of a given type + json_value(value_t t) + { + switch (t) + { + case value_t::object: + { + object = create(); + break; + } + + case value_t::array: + { + array = create(); + break; + } + + case value_t::string: + { + string = create(""); + break; + } + + case value_t::binary: + { + binary = create(); + break; + } + + case value_t::boolean: + { + boolean = static_cast(false); + break; + } + + case value_t::number_integer: + { + number_integer = static_cast(0); + break; + } + + case value_t::number_unsigned: + { + number_unsigned = static_cast(0); + break; + } + + case value_t::number_float: + { + number_float = static_cast(0.0); + break; + } + + case value_t::null: + { + object = nullptr; // silence warning, see #821 + break; + } + + case value_t::discarded: + default: + { + object = nullptr; // silence warning, see #821 + if (JSON_HEDLEY_UNLIKELY(t == value_t::null)) + { + JSON_THROW(other_error::create(500, "961c151d2e87f2686a955a9be24d316f1362bf21 3.10.5", basic_json())); // LCOV_EXCL_LINE + } + break; + } + } + } + + /// constructor for strings + json_value(const string_t& value) : string(create(value)) {} + + /// constructor for rvalue strings + json_value(string_t&& value) : string(create(std::move(value))) {} + + /// constructor for objects + json_value(const object_t& value) : object(create(value)) {} + + /// constructor for rvalue objects + json_value(object_t&& value) : object(create(std::move(value))) {} + + /// constructor for arrays + json_value(const array_t& value) : array(create(value)) {} + + /// constructor for rvalue arrays + json_value(array_t&& value) : array(create(std::move(value))) {} + + /// constructor for binary arrays + json_value(const typename binary_t::container_type& value) : binary(create(value)) {} + + /// constructor for rvalue binary arrays + json_value(typename binary_t::container_type&& value) : binary(create(std::move(value))) {} + + /// constructor for binary arrays (internal type) + json_value(const binary_t& value) : binary(create(value)) {} + + /// constructor for rvalue binary arrays (internal type) + json_value(binary_t&& value) : binary(create(std::move(value))) {} + + void destroy(value_t t) + { + if (t == value_t::array || t == value_t::object) + { + // flatten the current json_value to a heap-allocated stack + std::vector stack; + + // move the top-level items to stack + if (t == value_t::array) + { + stack.reserve(array->size()); + std::move(array->begin(), array->end(), std::back_inserter(stack)); + } + else + { + stack.reserve(object->size()); + for (auto&& it : *object) + { + stack.push_back(std::move(it.second)); + } + } + + while (!stack.empty()) + { + // move the last item to local variable to be processed + basic_json current_item(std::move(stack.back())); + stack.pop_back(); + + // if current_item is array/object, move + // its children to the stack to be processed later + if (current_item.is_array()) + { + std::move(current_item.m_value.array->begin(), current_item.m_value.array->end(), std::back_inserter(stack)); + + current_item.m_value.array->clear(); + } + else if (current_item.is_object()) + { + for (auto&& it : *current_item.m_value.object) + { + stack.push_back(std::move(it.second)); + } + + current_item.m_value.object->clear(); + } + + // it's now safe that current_item get destructed + // since it doesn't have any children + } + } + + switch (t) + { + case value_t::object: + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, object); + std::allocator_traits::deallocate(alloc, object, 1); + break; + } + + case value_t::array: + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, array); + std::allocator_traits::deallocate(alloc, array, 1); + break; + } + + case value_t::string: + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, string); + std::allocator_traits::deallocate(alloc, string, 1); + break; + } + + case value_t::binary: + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, binary); + std::allocator_traits::deallocate(alloc, binary, 1); + break; + } + + case value_t::null: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::discarded: + default: + { + break; + } + } + } + }; + + private: + /*! + @brief checks the class invariants + + This function asserts the class invariants. It needs to be called at the + end of every constructor to make sure that created objects respect the + invariant. Furthermore, it has to be called each time the type of a JSON + value is changed, because the invariant expresses a relationship between + @a m_type and @a m_value. + + Furthermore, the parent relation is checked for arrays and objects: If + @a check_parents true and the value is an array or object, then the + container's elements must have the current value as parent. + + @param[in] check_parents whether the parent relation should be checked. + The value is true by default and should only be set to false + during destruction of objects when the invariant does not + need to hold. + */ + void assert_invariant(bool check_parents = true) const noexcept + { + JSON_ASSERT(m_type != value_t::object || m_value.object != nullptr); + JSON_ASSERT(m_type != value_t::array || m_value.array != nullptr); + JSON_ASSERT(m_type != value_t::string || m_value.string != nullptr); + JSON_ASSERT(m_type != value_t::binary || m_value.binary != nullptr); + +#if JSON_DIAGNOSTICS + JSON_TRY + { + // cppcheck-suppress assertWithSideEffect + JSON_ASSERT(!check_parents || !is_structured() || std::all_of(begin(), end(), [this](const basic_json & j) + { + return j.m_parent == this; + })); + } + JSON_CATCH(...) {} // LCOV_EXCL_LINE +#endif + static_cast(check_parents); + } + + void set_parents() + { +#if JSON_DIAGNOSTICS + switch (m_type) + { + case value_t::array: + { + for (auto& element : *m_value.array) + { + element.m_parent = this; + } + break; + } + + case value_t::object: + { + for (auto& element : *m_value.object) + { + element.second.m_parent = this; + } + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + break; + } +#endif + } + + iterator set_parents(iterator it, typename iterator::difference_type count_set_parents) + { +#if JSON_DIAGNOSTICS + for (typename iterator::difference_type i = 0; i < count_set_parents; ++i) + { + (it + i)->m_parent = this; + } +#else + static_cast(count_set_parents); +#endif + return it; + } + + reference set_parent(reference j, std::size_t old_capacity = static_cast(-1)) + { +#if JSON_DIAGNOSTICS + if (old_capacity != static_cast(-1)) + { + // see https://github.com/nlohmann/json/issues/2838 + JSON_ASSERT(type() == value_t::array); + if (JSON_HEDLEY_UNLIKELY(m_value.array->capacity() != old_capacity)) + { + // capacity has changed: update all parents + set_parents(); + return j; + } + } + + // ordered_json uses a vector internally, so pointers could have + // been invalidated; see https://github.com/nlohmann/json/issues/2962 +#ifdef JSON_HEDLEY_MSVC_VERSION +#pragma warning(push ) +#pragma warning(disable : 4127) // ignore warning to replace if with if constexpr +#endif + if (detail::is_ordered_map::value) + { + set_parents(); + return j; + } +#ifdef JSON_HEDLEY_MSVC_VERSION +#pragma warning( pop ) +#endif + + j.m_parent = this; +#else + static_cast(j); + static_cast(old_capacity); +#endif + return j; + } + + public: + ////////////////////////// + // JSON parser callback // + ////////////////////////// + + /// @brief parser event types + /// @sa https://json.nlohmann.me/api/basic_json/parse_event_t/ + using parse_event_t = detail::parse_event_t; + + /// @brief per-element parser callback type + /// @sa https://json.nlohmann.me/api/basic_json/parser_callback_t/ + using parser_callback_t = detail::parser_callback_t; + + ////////////////// + // constructors // + ////////////////// + + /// @name constructors and destructors + /// Constructors of class @ref basic_json, copy/move constructor, copy + /// assignment, static functions creating objects, and the destructor. + /// @{ + + /// @brief create an empty value with a given type + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(const value_t v) + : m_type(v), m_value(v) + { + assert_invariant(); + } + + /// @brief create a null object + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(std::nullptr_t = nullptr) noexcept + : basic_json(value_t::null) + { + assert_invariant(); + } + + /// @brief create a JSON value from compatible types + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + template < typename CompatibleType, + typename U = detail::uncvref_t, + detail::enable_if_t < + !detail::is_basic_json::value && detail::is_compatible_type::value, int > = 0 > + basic_json(CompatibleType && val) noexcept(noexcept( // NOLINT(bugprone-forwarding-reference-overload,bugprone-exception-escape) + JSONSerializer::to_json(std::declval(), + std::forward(val)))) + { + JSONSerializer::to_json(*this, std::forward(val)); + set_parents(); + assert_invariant(); + } + + /// @brief create a JSON value from an existing one + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + template < typename BasicJsonType, + detail::enable_if_t < + detail::is_basic_json::value&& !std::is_same::value, int > = 0 > + basic_json(const BasicJsonType& val) + { + using other_boolean_t = typename BasicJsonType::boolean_t; + using other_number_float_t = typename BasicJsonType::number_float_t; + using other_number_integer_t = typename BasicJsonType::number_integer_t; + using other_number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using other_string_t = typename BasicJsonType::string_t; + using other_object_t = typename BasicJsonType::object_t; + using other_array_t = typename BasicJsonType::array_t; + using other_binary_t = typename BasicJsonType::binary_t; + + switch (val.type()) + { + case value_t::boolean: + JSONSerializer::to_json(*this, val.template get()); + break; + case value_t::number_float: + JSONSerializer::to_json(*this, val.template get()); + break; + case value_t::number_integer: + JSONSerializer::to_json(*this, val.template get()); + break; + case value_t::number_unsigned: + JSONSerializer::to_json(*this, val.template get()); + break; + case value_t::string: + JSONSerializer::to_json(*this, val.template get_ref()); + break; + case value_t::object: + JSONSerializer::to_json(*this, val.template get_ref()); + break; + case value_t::array: + JSONSerializer::to_json(*this, val.template get_ref()); + break; + case value_t::binary: + JSONSerializer::to_json(*this, val.template get_ref()); + break; + case value_t::null: + *this = nullptr; + break; + case value_t::discarded: + m_type = value_t::discarded; + break; + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + set_parents(); + assert_invariant(); + } + + /// @brief create a container (array or object) from an initializer list + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(initializer_list_t init, + bool type_deduction = true, + value_t manual_type = value_t::array) + { + // check if each element is an array with two elements whose first + // element is a string + bool is_an_object = std::all_of(init.begin(), init.end(), + [](const detail::json_ref& element_ref) + { + return element_ref->is_array() && element_ref->size() == 2 && (*element_ref)[0].is_string(); + }); + + // adjust type if type deduction is not wanted + if (!type_deduction) + { + // if array is wanted, do not create an object though possible + if (manual_type == value_t::array) + { + is_an_object = false; + } + + // if object is wanted but impossible, throw an exception + if (JSON_HEDLEY_UNLIKELY(manual_type == value_t::object && !is_an_object)) + { + JSON_THROW(type_error::create(301, "cannot create object from initializer list", basic_json())); + } + } + + if (is_an_object) + { + // the initializer list is a list of pairs -> create object + m_type = value_t::object; + m_value = value_t::object; + + for (auto& element_ref : init) + { + auto element = element_ref.moved_or_copied(); + m_value.object->emplace( + std::move(*((*element.m_value.array)[0].m_value.string)), + std::move((*element.m_value.array)[1])); + } + } + else + { + // the initializer list describes an array -> create array + m_type = value_t::array; + m_value.array = create(init.begin(), init.end()); + } + + set_parents(); + assert_invariant(); + } + + /// @brief explicitly create a binary array (without subtype) + /// @sa https://json.nlohmann.me/api/basic_json/binary/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json binary(const typename binary_t::container_type& init) + { + auto res = basic_json(); + res.m_type = value_t::binary; + res.m_value = init; + return res; + } + + /// @brief explicitly create a binary array (with subtype) + /// @sa https://json.nlohmann.me/api/basic_json/binary/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json binary(const typename binary_t::container_type& init, typename binary_t::subtype_type subtype) + { + auto res = basic_json(); + res.m_type = value_t::binary; + res.m_value = binary_t(init, subtype); + return res; + } + + /// @brief explicitly create a binary array + /// @sa https://json.nlohmann.me/api/basic_json/binary/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json binary(typename binary_t::container_type&& init) + { + auto res = basic_json(); + res.m_type = value_t::binary; + res.m_value = std::move(init); + return res; + } + + /// @brief explicitly create a binary array (with subtype) + /// @sa https://json.nlohmann.me/api/basic_json/binary/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json binary(typename binary_t::container_type&& init, typename binary_t::subtype_type subtype) + { + auto res = basic_json(); + res.m_type = value_t::binary; + res.m_value = binary_t(std::move(init), subtype); + return res; + } + + /// @brief explicitly create an array from an initializer list + /// @sa https://json.nlohmann.me/api/basic_json/array/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json array(initializer_list_t init = {}) + { + return basic_json(init, false, value_t::array); + } + + /// @brief explicitly create an object from an initializer list + /// @sa https://json.nlohmann.me/api/basic_json/object/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json object(initializer_list_t init = {}) + { + return basic_json(init, false, value_t::object); + } + + /// @brief construct an array with count copies of given value + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(size_type cnt, const basic_json& val) + : m_type(value_t::array) + { + m_value.array = create(cnt, val); + set_parents(); + assert_invariant(); + } + + /// @brief construct a JSON container given an iterator range + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + template < class InputIT, typename std::enable_if < + std::is_same::value || + std::is_same::value, int >::type = 0 > + basic_json(InputIT first, InputIT last) + { + JSON_ASSERT(first.m_object != nullptr); + JSON_ASSERT(last.m_object != nullptr); + + // make sure iterator fits the current value + if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) + { + JSON_THROW(invalid_iterator::create(201, "iterators are not compatible", basic_json())); + } + + // copy type from first iterator + m_type = first.m_object->m_type; + + // check if iterator range is complete for primitive values + switch (m_type) + { + case value_t::boolean: + case value_t::number_float: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::string: + { + if (JSON_HEDLEY_UNLIKELY(!first.m_it.primitive_iterator.is_begin() + || !last.m_it.primitive_iterator.is_end())) + { + JSON_THROW(invalid_iterator::create(204, "iterators out of range", *first.m_object)); + } + break; + } + + case value_t::null: + case value_t::object: + case value_t::array: + case value_t::binary: + case value_t::discarded: + default: + break; + } + + switch (m_type) + { + case value_t::number_integer: + { + m_value.number_integer = first.m_object->m_value.number_integer; + break; + } + + case value_t::number_unsigned: + { + m_value.number_unsigned = first.m_object->m_value.number_unsigned; + break; + } + + case value_t::number_float: + { + m_value.number_float = first.m_object->m_value.number_float; + break; + } + + case value_t::boolean: + { + m_value.boolean = first.m_object->m_value.boolean; + break; + } + + case value_t::string: + { + m_value = *first.m_object->m_value.string; + break; + } + + case value_t::object: + { + m_value.object = create(first.m_it.object_iterator, + last.m_it.object_iterator); + break; + } + + case value_t::array: + { + m_value.array = create(first.m_it.array_iterator, + last.m_it.array_iterator); + break; + } + + case value_t::binary: + { + m_value = *first.m_object->m_value.binary; + break; + } + + case value_t::null: + case value_t::discarded: + default: + JSON_THROW(invalid_iterator::create(206, "cannot construct with iterators from " + std::string(first.m_object->type_name()), *first.m_object)); + } + + set_parents(); + assert_invariant(); + } + + + /////////////////////////////////////// + // other constructors and destructor // + /////////////////////////////////////// + + template, + std::is_same>::value, int> = 0 > + basic_json(const JsonRef& ref) : basic_json(ref.moved_or_copied()) {} + + /// @brief copy constructor + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(const basic_json& other) + : m_type(other.m_type) + { + // check of passed value is valid + other.assert_invariant(); + + switch (m_type) + { + case value_t::object: + { + m_value = *other.m_value.object; + break; + } + + case value_t::array: + { + m_value = *other.m_value.array; + break; + } + + case value_t::string: + { + m_value = *other.m_value.string; + break; + } + + case value_t::boolean: + { + m_value = other.m_value.boolean; + break; + } + + case value_t::number_integer: + { + m_value = other.m_value.number_integer; + break; + } + + case value_t::number_unsigned: + { + m_value = other.m_value.number_unsigned; + break; + } + + case value_t::number_float: + { + m_value = other.m_value.number_float; + break; + } + + case value_t::binary: + { + m_value = *other.m_value.binary; + break; + } + + case value_t::null: + case value_t::discarded: + default: + break; + } + + set_parents(); + assert_invariant(); + } + + /// @brief move constructor + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(basic_json&& other) noexcept + : m_type(std::move(other.m_type)), + m_value(std::move(other.m_value)) + { + // check that passed value is valid + other.assert_invariant(false); + + // invalidate payload + other.m_type = value_t::null; + other.m_value = {}; + + set_parents(); + assert_invariant(); + } + + /// @brief copy assignment + /// @sa https://json.nlohmann.me/api/basic_json/operator=/ + basic_json& operator=(basic_json other) noexcept ( + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value&& + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value + ) + { + // check that passed value is valid + other.assert_invariant(); + + using std::swap; + swap(m_type, other.m_type); + swap(m_value, other.m_value); + + set_parents(); + assert_invariant(); + return *this; + } + + /// @brief destructor + /// @sa https://json.nlohmann.me/api/basic_json/~basic_json/ + ~basic_json() noexcept + { + assert_invariant(false); + m_value.destroy(m_type); + } + + /// @} + + public: + /////////////////////// + // object inspection // + /////////////////////// + + /// @name object inspection + /// Functions to inspect the type of a JSON value. + /// @{ + + /// @brief serialization + /// @sa https://json.nlohmann.me/api/basic_json/dump/ + string_t dump(const int indent = -1, + const char indent_char = ' ', + const bool ensure_ascii = false, + const error_handler_t error_handler = error_handler_t::strict) const + { + string_t result; + serializer s(detail::output_adapter(result), indent_char, error_handler); + + if (indent >= 0) + { + s.dump(*this, true, ensure_ascii, static_cast(indent)); + } + else + { + s.dump(*this, false, ensure_ascii, 0); + } + + return result; + } + + /// @brief return the type of the JSON value (explicit) + /// @sa https://json.nlohmann.me/api/basic_json/type/ + constexpr value_t type() const noexcept + { + return m_type; + } + + /// @brief return whether type is primitive + /// @sa https://json.nlohmann.me/api/basic_json/is_primitive/ + constexpr bool is_primitive() const noexcept + { + return is_null() || is_string() || is_boolean() || is_number() || is_binary(); + } + + /// @brief return whether type is structured + /// @sa https://json.nlohmann.me/api/basic_json/is_structured/ + constexpr bool is_structured() const noexcept + { + return is_array() || is_object(); + } + + /// @brief return whether value is null + /// @sa https://json.nlohmann.me/api/basic_json/is_null/ + constexpr bool is_null() const noexcept + { + return m_type == value_t::null; + } + + /// @brief return whether value is a boolean + /// @sa https://json.nlohmann.me/api/basic_json/is_boolean/ + constexpr bool is_boolean() const noexcept + { + return m_type == value_t::boolean; + } + + /// @brief return whether value is a number + /// @sa https://json.nlohmann.me/api/basic_json/is_number/ + constexpr bool is_number() const noexcept + { + return is_number_integer() || is_number_float(); + } + + /// @brief return whether value is an integer number + /// @sa https://json.nlohmann.me/api/basic_json/is_number_integer/ + constexpr bool is_number_integer() const noexcept + { + return m_type == value_t::number_integer || m_type == value_t::number_unsigned; + } + + /// @brief return whether value is an unsigned integer number + /// @sa https://json.nlohmann.me/api/basic_json/is_number_unsigned/ + constexpr bool is_number_unsigned() const noexcept + { + return m_type == value_t::number_unsigned; + } + + /// @brief return whether value is a floating-point number + /// @sa https://json.nlohmann.me/api/basic_json/is_number_float/ + constexpr bool is_number_float() const noexcept + { + return m_type == value_t::number_float; + } + + /// @brief return whether value is an object + /// @sa https://json.nlohmann.me/api/basic_json/is_object/ + constexpr bool is_object() const noexcept + { + return m_type == value_t::object; + } + + /// @brief return whether value is an array + /// @sa https://json.nlohmann.me/api/basic_json/is_array/ + constexpr bool is_array() const noexcept + { + return m_type == value_t::array; + } + + /// @brief return whether value is a string + /// @sa https://json.nlohmann.me/api/basic_json/is_string/ + constexpr bool is_string() const noexcept + { + return m_type == value_t::string; + } + + /// @brief return whether value is a binary array + /// @sa https://json.nlohmann.me/api/basic_json/is_binary/ + constexpr bool is_binary() const noexcept + { + return m_type == value_t::binary; + } + + /// @brief return whether value is discarded + /// @sa https://json.nlohmann.me/api/basic_json/is_discarded/ + constexpr bool is_discarded() const noexcept + { + return m_type == value_t::discarded; + } + + /// @brief return the type of the JSON value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/operator_value_t/ + constexpr operator value_t() const noexcept + { + return m_type; + } + + /// @} + + private: + ////////////////// + // value access // + ////////////////// + + /// get a boolean (explicit) + boolean_t get_impl(boolean_t* /*unused*/) const + { + if (JSON_HEDLEY_LIKELY(is_boolean())) + { + return m_value.boolean; + } + + JSON_THROW(type_error::create(302, "type must be boolean, but is " + std::string(type_name()), *this)); + } + + /// get a pointer to the value (object) + object_t* get_impl_ptr(object_t* /*unused*/) noexcept + { + return is_object() ? m_value.object : nullptr; + } + + /// get a pointer to the value (object) + constexpr const object_t* get_impl_ptr(const object_t* /*unused*/) const noexcept + { + return is_object() ? m_value.object : nullptr; + } + + /// get a pointer to the value (array) + array_t* get_impl_ptr(array_t* /*unused*/) noexcept + { + return is_array() ? m_value.array : nullptr; + } + + /// get a pointer to the value (array) + constexpr const array_t* get_impl_ptr(const array_t* /*unused*/) const noexcept + { + return is_array() ? m_value.array : nullptr; + } + + /// get a pointer to the value (string) + string_t* get_impl_ptr(string_t* /*unused*/) noexcept + { + return is_string() ? m_value.string : nullptr; + } + + /// get a pointer to the value (string) + constexpr const string_t* get_impl_ptr(const string_t* /*unused*/) const noexcept + { + return is_string() ? m_value.string : nullptr; + } + + /// get a pointer to the value (boolean) + boolean_t* get_impl_ptr(boolean_t* /*unused*/) noexcept + { + return is_boolean() ? &m_value.boolean : nullptr; + } + + /// get a pointer to the value (boolean) + constexpr const boolean_t* get_impl_ptr(const boolean_t* /*unused*/) const noexcept + { + return is_boolean() ? &m_value.boolean : nullptr; + } + + /// get a pointer to the value (integer number) + number_integer_t* get_impl_ptr(number_integer_t* /*unused*/) noexcept + { + return is_number_integer() ? &m_value.number_integer : nullptr; + } + + /// get a pointer to the value (integer number) + constexpr const number_integer_t* get_impl_ptr(const number_integer_t* /*unused*/) const noexcept + { + return is_number_integer() ? &m_value.number_integer : nullptr; + } + + /// get a pointer to the value (unsigned number) + number_unsigned_t* get_impl_ptr(number_unsigned_t* /*unused*/) noexcept + { + return is_number_unsigned() ? &m_value.number_unsigned : nullptr; + } + + /// get a pointer to the value (unsigned number) + constexpr const number_unsigned_t* get_impl_ptr(const number_unsigned_t* /*unused*/) const noexcept + { + return is_number_unsigned() ? &m_value.number_unsigned : nullptr; + } + + /// get a pointer to the value (floating-point number) + number_float_t* get_impl_ptr(number_float_t* /*unused*/) noexcept + { + return is_number_float() ? &m_value.number_float : nullptr; + } + + /// get a pointer to the value (floating-point number) + constexpr const number_float_t* get_impl_ptr(const number_float_t* /*unused*/) const noexcept + { + return is_number_float() ? &m_value.number_float : nullptr; + } + + /// get a pointer to the value (binary) + binary_t* get_impl_ptr(binary_t* /*unused*/) noexcept + { + return is_binary() ? m_value.binary : nullptr; + } + + /// get a pointer to the value (binary) + constexpr const binary_t* get_impl_ptr(const binary_t* /*unused*/) const noexcept + { + return is_binary() ? m_value.binary : nullptr; + } + + /*! + @brief helper function to implement get_ref() + + This function helps to implement get_ref() without code duplication for + const and non-const overloads + + @tparam ThisType will be deduced as `basic_json` or `const basic_json` + + @throw type_error.303 if ReferenceType does not match underlying value + type of the current JSON + */ + template + static ReferenceType get_ref_impl(ThisType& obj) + { + // delegate the call to get_ptr<>() + auto* ptr = obj.template get_ptr::type>(); + + if (JSON_HEDLEY_LIKELY(ptr != nullptr)) + { + return *ptr; + } + + JSON_THROW(type_error::create(303, "incompatible ReferenceType for get_ref, actual type is " + std::string(obj.type_name()), obj)); + } + + public: + /// @name value access + /// Direct access to the stored value of a JSON value. + /// @{ + + /// @brief get a pointer value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_ptr/ + template::value, int>::type = 0> + auto get_ptr() noexcept -> decltype(std::declval().get_impl_ptr(std::declval())) + { + // delegate the call to get_impl_ptr<>() + return get_impl_ptr(static_cast(nullptr)); + } + + /// @brief get a pointer value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_ptr/ + template < typename PointerType, typename std::enable_if < + std::is_pointer::value&& + std::is_const::type>::value, int >::type = 0 > + constexpr auto get_ptr() const noexcept -> decltype(std::declval().get_impl_ptr(std::declval())) + { + // delegate the call to get_impl_ptr<>() const + return get_impl_ptr(static_cast(nullptr)); + } + + private: + /*! + @brief get a value (explicit) + + Explicit type conversion between the JSON value and a compatible value + which is [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible) + and [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). + The value is converted by calling the @ref json_serializer + `from_json()` method. + + The function is equivalent to executing + @code {.cpp} + ValueType ret; + JSONSerializer::from_json(*this, ret); + return ret; + @endcode + + This overloads is chosen if: + - @a ValueType is not @ref basic_json, + - @ref json_serializer has a `from_json()` method of the form + `void from_json(const basic_json&, ValueType&)`, and + - @ref json_serializer does not have a `from_json()` method of + the form `ValueType from_json(const basic_json&)` + + @tparam ValueType the returned value type + + @return copy of the JSON value, converted to @a ValueType + + @throw what @ref json_serializer `from_json()` method throws + + @liveexample{The example below shows several conversions from JSON values + to other types. There a few things to note: (1) Floating-point numbers can + be converted to integers\, (2) A JSON array can be converted to a standard + `std::vector`\, (3) A JSON object can be converted to C++ + associative containers such as `std::unordered_map`.,get__ValueType_const} + + @since version 2.1.0 + */ + template < typename ValueType, + detail::enable_if_t < + detail::is_default_constructible::value&& + detail::has_from_json::value, + int > = 0 > + ValueType get_impl(detail::priority_tag<0> /*unused*/) const noexcept(noexcept( + JSONSerializer::from_json(std::declval(), std::declval()))) + { + auto ret = ValueType(); + JSONSerializer::from_json(*this, ret); + return ret; + } + + /*! + @brief get a value (explicit); special case + + Explicit type conversion between the JSON value and a compatible value + which is **not** [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible) + and **not** [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). + The value is converted by calling the @ref json_serializer + `from_json()` method. + + The function is equivalent to executing + @code {.cpp} + return JSONSerializer::from_json(*this); + @endcode + + This overloads is chosen if: + - @a ValueType is not @ref basic_json and + - @ref json_serializer has a `from_json()` method of the form + `ValueType from_json(const basic_json&)` + + @note If @ref json_serializer has both overloads of + `from_json()`, this one is chosen. + + @tparam ValueType the returned value type + + @return copy of the JSON value, converted to @a ValueType + + @throw what @ref json_serializer `from_json()` method throws + + @since version 2.1.0 + */ + template < typename ValueType, + detail::enable_if_t < + detail::has_non_default_from_json::value, + int > = 0 > + ValueType get_impl(detail::priority_tag<1> /*unused*/) const noexcept(noexcept( + JSONSerializer::from_json(std::declval()))) + { + return JSONSerializer::from_json(*this); + } + + /*! + @brief get special-case overload + + This overloads converts the current @ref basic_json in a different + @ref basic_json type + + @tparam BasicJsonType == @ref basic_json + + @return a copy of *this, converted into @a BasicJsonType + + @complexity Depending on the implementation of the called `from_json()` + method. + + @since version 3.2.0 + */ + template < typename BasicJsonType, + detail::enable_if_t < + detail::is_basic_json::value, + int > = 0 > + BasicJsonType get_impl(detail::priority_tag<2> /*unused*/) const + { + return *this; + } + + /*! + @brief get special-case overload + + This overloads avoids a lot of template boilerplate, it can be seen as the + identity method + + @tparam BasicJsonType == @ref basic_json + + @return a copy of *this + + @complexity Constant. + + @since version 2.1.0 + */ + template::value, + int> = 0> + basic_json get_impl(detail::priority_tag<3> /*unused*/) const + { + return *this; + } + + /*! + @brief get a pointer value (explicit) + @copydoc get() + */ + template::value, + int> = 0> + constexpr auto get_impl(detail::priority_tag<4> /*unused*/) const noexcept + -> decltype(std::declval().template get_ptr()) + { + // delegate the call to get_ptr + return get_ptr(); + } + + public: + /*! + @brief get a (pointer) value (explicit) + + Performs explicit type conversion between the JSON value and a compatible value if required. + + - If the requested type is a pointer to the internally stored JSON value that pointer is returned. + No copies are made. + + - If the requested type is the current @ref basic_json, or a different @ref basic_json convertible + from the current @ref basic_json. + + - Otherwise the value is converted by calling the @ref json_serializer `from_json()` + method. + + @tparam ValueTypeCV the provided value type + @tparam ValueType the returned value type + + @return copy of the JSON value, converted to @tparam ValueType if necessary + + @throw what @ref json_serializer `from_json()` method throws if conversion is required + + @since version 2.1.0 + */ + template < typename ValueTypeCV, typename ValueType = detail::uncvref_t> +#if defined(JSON_HAS_CPP_14) + constexpr +#endif + auto get() const noexcept( + noexcept(std::declval().template get_impl(detail::priority_tag<4> {}))) + -> decltype(std::declval().template get_impl(detail::priority_tag<4> {})) + { + // we cannot static_assert on ValueTypeCV being non-const, because + // there is support for get(), which is why we + // still need the uncvref + static_assert(!std::is_reference::value, + "get() cannot be used with reference types, you might want to use get_ref()"); + return get_impl(detail::priority_tag<4> {}); + } + + /*! + @brief get a pointer value (explicit) + + Explicit pointer access to the internally stored JSON value. No copies are + made. + + @warning The pointer becomes invalid if the underlying JSON object + changes. + + @tparam PointerType pointer type; must be a pointer to @ref array_t, @ref + object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, + @ref number_unsigned_t, or @ref number_float_t. + + @return pointer to the internally stored JSON value if the requested + pointer type @a PointerType fits to the JSON value; `nullptr` otherwise + + @complexity Constant. + + @liveexample{The example below shows how pointers to internal values of a + JSON value can be requested. Note that no type conversions are made and a + `nullptr` is returned if the value and the requested pointer type does not + match.,get__PointerType} + + @sa see @ref get_ptr() for explicit pointer-member access + + @since version 1.0.0 + */ + template::value, int>::type = 0> + auto get() noexcept -> decltype(std::declval().template get_ptr()) + { + // delegate the call to get_ptr + return get_ptr(); + } + + /// @brief get a value (explicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_to/ + template < typename ValueType, + detail::enable_if_t < + !detail::is_basic_json::value&& + detail::has_from_json::value, + int > = 0 > + ValueType & get_to(ValueType& v) const noexcept(noexcept( + JSONSerializer::from_json(std::declval(), v))) + { + JSONSerializer::from_json(*this, v); + return v; + } + + // specialization to allow calling get_to with a basic_json value + // see https://github.com/nlohmann/json/issues/2175 + template::value, + int> = 0> + ValueType & get_to(ValueType& v) const + { + v = *this; + return v; + } + + template < + typename T, std::size_t N, + typename Array = T (&)[N], // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) + detail::enable_if_t < + detail::has_from_json::value, int > = 0 > + Array get_to(T (&v)[N]) const // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) + noexcept(noexcept(JSONSerializer::from_json( + std::declval(), v))) + { + JSONSerializer::from_json(*this, v); + return v; + } + + /// @brief get a reference value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_ref/ + template::value, int>::type = 0> + ReferenceType get_ref() + { + // delegate call to get_ref_impl + return get_ref_impl(*this); + } + + /// @brief get a reference value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_ref/ + template < typename ReferenceType, typename std::enable_if < + std::is_reference::value&& + std::is_const::type>::value, int >::type = 0 > + ReferenceType get_ref() const + { + // delegate call to get_ref_impl + return get_ref_impl(*this); + } + + /*! + @brief get a value (implicit) + + Implicit type conversion between the JSON value and a compatible value. + The call is realized by calling @ref get() const. + + @tparam ValueType non-pointer type compatible to the JSON value, for + instance `int` for JSON integer numbers, `bool` for JSON booleans, or + `std::vector` types for JSON arrays. The character type of @ref string_t + as well as an initializer list of this type is excluded to avoid + ambiguities as these types implicitly convert to `std::string`. + + @return copy of the JSON value, converted to type @a ValueType + + @throw type_error.302 in case passed type @a ValueType is incompatible + to the JSON value type (e.g., the JSON value is of type boolean, but a + string is requested); see example below + + @complexity Linear in the size of the JSON value. + + @liveexample{The example below shows several conversions from JSON values + to other types. There a few things to note: (1) Floating-point numbers can + be converted to integers\, (2) A JSON array can be converted to a standard + `std::vector`\, (3) A JSON object can be converted to C++ + associative containers such as `std::unordered_map`.,operator__ValueType} + + @since version 1.0.0 + */ + template < typename ValueType, typename std::enable_if < + detail::conjunction < + detail::negation>, + detail::negation>>, + detail::negation>, + detail::negation>, + detail::negation>>, + +#if defined(JSON_HAS_CPP_17) && (defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER >= 1910 && _MSC_VER <= 1914)) + detail::negation>, +#endif + detail::is_detected_lazy + >::value, int >::type = 0 > + JSON_EXPLICIT operator ValueType() const + { + // delegate the call to get<>() const + return get(); + } + + /// @brief get a binary value + /// @sa https://json.nlohmann.me/api/basic_json/get_binary/ + binary_t& get_binary() + { + if (!is_binary()) + { + JSON_THROW(type_error::create(302, "type must be binary, but is " + std::string(type_name()), *this)); + } + + return *get_ptr(); + } + + /// @brief get a binary value + /// @sa https://json.nlohmann.me/api/basic_json/get_binary/ + const binary_t& get_binary() const + { + if (!is_binary()) + { + JSON_THROW(type_error::create(302, "type must be binary, but is " + std::string(type_name()), *this)); + } + + return *get_ptr(); + } + + /// @} + + + //////////////////// + // element access // + //////////////////// + + /// @name element access + /// Access to the JSON value. + /// @{ + + /// @brief access specified array element with bounds checking + /// @sa https://json.nlohmann.me/api/basic_json/at/ + reference at(size_type idx) + { + // at only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + JSON_TRY + { + return set_parent(m_value.array->at(idx)); + } + JSON_CATCH (std::out_of_range&) + { + // create better exception explanation + JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range", *this)); + } + } + else + { + JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()), *this)); + } + } + + /// @brief access specified array element with bounds checking + /// @sa https://json.nlohmann.me/api/basic_json/at/ + const_reference at(size_type idx) const + { + // at only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + JSON_TRY + { + return m_value.array->at(idx); + } + JSON_CATCH (std::out_of_range&) + { + // create better exception explanation + JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range", *this)); + } + } + else + { + JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()), *this)); + } + } + + /// @brief access specified object element with bounds checking + /// @sa https://json.nlohmann.me/api/basic_json/at/ + reference at(const typename object_t::key_type& key) + { + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + JSON_TRY + { + return set_parent(m_value.object->at(key)); + } + JSON_CATCH (std::out_of_range&) + { + // create better exception explanation + JSON_THROW(out_of_range::create(403, "key '" + key + "' not found", *this)); + } + } + else + { + JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()), *this)); + } + } + + /// @brief access specified object element with bounds checking + /// @sa https://json.nlohmann.me/api/basic_json/at/ + const_reference at(const typename object_t::key_type& key) const + { + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + JSON_TRY + { + return m_value.object->at(key); + } + JSON_CATCH (std::out_of_range&) + { + // create better exception explanation + JSON_THROW(out_of_range::create(403, "key '" + key + "' not found", *this)); + } + } + else + { + JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()), *this)); + } + } + + /// @brief access specified array element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + reference operator[](size_type idx) + { + // implicitly convert null value to an empty array + if (is_null()) + { + m_type = value_t::array; + m_value.array = create(); + assert_invariant(); + } + + // operator[] only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + // fill up array with null values if given idx is outside range + if (idx >= m_value.array->size()) + { +#if JSON_DIAGNOSTICS + // remember array size & capacity before resizing + const auto old_size = m_value.array->size(); + const auto old_capacity = m_value.array->capacity(); +#endif + m_value.array->resize(idx + 1); + +#if JSON_DIAGNOSTICS + if (JSON_HEDLEY_UNLIKELY(m_value.array->capacity() != old_capacity)) + { + // capacity has changed: update all parents + set_parents(); + } + else + { + // set parent for values added above + set_parents(begin() + static_cast(old_size), static_cast(idx + 1 - old_size)); + } +#endif + assert_invariant(); + } + + return m_value.array->operator[](idx); + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a numeric argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified array element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + const_reference operator[](size_type idx) const + { + // const operator[] only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + return m_value.array->operator[](idx); + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a numeric argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + reference operator[](const typename object_t::key_type& key) + { + // implicitly convert null value to an empty object + if (is_null()) + { + m_type = value_t::object; + m_value.object = create(); + assert_invariant(); + } + + // operator[] only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + return set_parent(m_value.object->operator[](key)); + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + const_reference operator[](const typename object_t::key_type& key) const + { + // const operator[] only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + JSON_ASSERT(m_value.object->find(key) != m_value.object->end()); + return m_value.object->find(key)->second; + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + template + JSON_HEDLEY_NON_NULL(2) + reference operator[](T* key) + { + // implicitly convert null to object + if (is_null()) + { + m_type = value_t::object; + m_value = value_t::object; + assert_invariant(); + } + + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + return set_parent(m_value.object->operator[](key)); + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + template + JSON_HEDLEY_NON_NULL(2) + const_reference operator[](T* key) const + { + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + JSON_ASSERT(m_value.object->find(key) != m_value.object->end()); + return m_value.object->find(key)->second; + } + + JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + /// using std::is_convertible in a std::enable_if will fail when using explicit conversions + template < class ValueType, typename std::enable_if < + detail::is_getable::value + && !std::is_same::value, int >::type = 0 > + ValueType value(const typename object_t::key_type& key, const ValueType& default_value) const + { + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + // if key is found, return value and given default value otherwise + const auto it = find(key); + if (it != end()) + { + return it->template get(); + } + + return default_value; + } + + JSON_THROW(type_error::create(306, "cannot use value() with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + /// overload for a default value of type const char* + string_t value(const typename object_t::key_type& key, const char* default_value) const + { + return value(key, string_t(default_value)); + } + + /// @brief access specified object element via JSON Pointer with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + template::value, int>::type = 0> + ValueType value(const json_pointer& ptr, const ValueType& default_value) const + { + // at only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + // if pointer resolves a value, return it or use default value + JSON_TRY + { + return ptr.get_checked(this).template get(); + } + JSON_INTERNAL_CATCH (out_of_range&) + { + return default_value; + } + } + + JSON_THROW(type_error::create(306, "cannot use value() with " + std::string(type_name()), *this)); + } + + /// @brief access specified object element via JSON Pointer with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + /// overload for a default value of type const char* + JSON_HEDLEY_NON_NULL(3) + string_t value(const json_pointer& ptr, const char* default_value) const + { + return value(ptr, string_t(default_value)); + } + + /// @brief access the first element + /// @sa https://json.nlohmann.me/api/basic_json/front/ + reference front() + { + return *begin(); + } + + /// @brief access the first element + /// @sa https://json.nlohmann.me/api/basic_json/front/ + const_reference front() const + { + return *cbegin(); + } + + /// @brief access the last element + /// @sa https://json.nlohmann.me/api/basic_json/back/ + reference back() + { + auto tmp = end(); + --tmp; + return *tmp; + } + + /// @brief access the last element + /// @sa https://json.nlohmann.me/api/basic_json/back/ + const_reference back() const + { + auto tmp = cend(); + --tmp; + return *tmp; + } + + /// @brief remove element given an iterator + /// @sa https://json.nlohmann.me/api/basic_json/erase/ + template < class IteratorType, typename std::enable_if < + std::is_same::value || + std::is_same::value, int >::type + = 0 > + IteratorType erase(IteratorType pos) + { + // make sure iterator fits the current value + if (JSON_HEDLEY_UNLIKELY(this != pos.m_object)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", *this)); + } + + IteratorType result = end(); + + switch (m_type) + { + case value_t::boolean: + case value_t::number_float: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::string: + case value_t::binary: + { + if (JSON_HEDLEY_UNLIKELY(!pos.m_it.primitive_iterator.is_begin())) + { + JSON_THROW(invalid_iterator::create(205, "iterator out of range", *this)); + } + + if (is_string()) + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, m_value.string); + std::allocator_traits::deallocate(alloc, m_value.string, 1); + m_value.string = nullptr; + } + else if (is_binary()) + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, m_value.binary); + std::allocator_traits::deallocate(alloc, m_value.binary, 1); + m_value.binary = nullptr; + } + + m_type = value_t::null; + assert_invariant(); + break; + } + + case value_t::object: + { + result.m_it.object_iterator = m_value.object->erase(pos.m_it.object_iterator); + break; + } + + case value_t::array: + { + result.m_it.array_iterator = m_value.array->erase(pos.m_it.array_iterator); + break; + } + + case value_t::null: + case value_t::discarded: + default: + JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()), *this)); + } + + return result; + } + + /// @brief remove elements given an iterator range + /// @sa https://json.nlohmann.me/api/basic_json/erase/ + template < class IteratorType, typename std::enable_if < + std::is_same::value || + std::is_same::value, int >::type + = 0 > + IteratorType erase(IteratorType first, IteratorType last) + { + // make sure iterator fits the current value + if (JSON_HEDLEY_UNLIKELY(this != first.m_object || this != last.m_object)) + { + JSON_THROW(invalid_iterator::create(203, "iterators do not fit current value", *this)); + } + + IteratorType result = end(); + + switch (m_type) + { + case value_t::boolean: + case value_t::number_float: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::string: + case value_t::binary: + { + if (JSON_HEDLEY_LIKELY(!first.m_it.primitive_iterator.is_begin() + || !last.m_it.primitive_iterator.is_end())) + { + JSON_THROW(invalid_iterator::create(204, "iterators out of range", *this)); + } + + if (is_string()) + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, m_value.string); + std::allocator_traits::deallocate(alloc, m_value.string, 1); + m_value.string = nullptr; + } + else if (is_binary()) + { + AllocatorType alloc; + std::allocator_traits::destroy(alloc, m_value.binary); + std::allocator_traits::deallocate(alloc, m_value.binary, 1); + m_value.binary = nullptr; + } + + m_type = value_t::null; + assert_invariant(); + break; + } + + case value_t::object: + { + result.m_it.object_iterator = m_value.object->erase(first.m_it.object_iterator, + last.m_it.object_iterator); + break; + } + + case value_t::array: + { + result.m_it.array_iterator = m_value.array->erase(first.m_it.array_iterator, + last.m_it.array_iterator); + break; + } + + case value_t::null: + case value_t::discarded: + default: + JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()), *this)); + } + + return result; + } + + /// @brief remove element from a JSON object given a key + /// @sa https://json.nlohmann.me/api/basic_json/erase/ + size_type erase(const typename object_t::key_type& key) + { + // this erase only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + return m_value.object->erase(key); + } + + JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()), *this)); + } + + /// @brief remove element from a JSON array given an index + /// @sa https://json.nlohmann.me/api/basic_json/erase/ + void erase(const size_type idx) + { + // this erase only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + if (JSON_HEDLEY_UNLIKELY(idx >= size())) + { + JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range", *this)); + } + + m_value.array->erase(m_value.array->begin() + static_cast(idx)); + } + else + { + JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()), *this)); + } + } + + /// @} + + + //////////// + // lookup // + //////////// + + /// @name lookup + /// @{ + + /// @brief find an element in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/find/ + template + iterator find(KeyT&& key) + { + auto result = end(); + + if (is_object()) + { + result.m_it.object_iterator = m_value.object->find(std::forward(key)); + } + + return result; + } + + /// @brief find an element in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/find/ + template + const_iterator find(KeyT&& key) const + { + auto result = cend(); + + if (is_object()) + { + result.m_it.object_iterator = m_value.object->find(std::forward(key)); + } + + return result; + } + + /// @brief returns the number of occurrences of a key in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/count/ + template + size_type count(KeyT&& key) const + { + // return 0 for all nonobject types + return is_object() ? m_value.object->count(std::forward(key)) : 0; + } + + /// @brief check the existence of an element in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/contains/ + template < typename KeyT, typename std::enable_if < + !std::is_same::type, json_pointer>::value, int >::type = 0 > + bool contains(KeyT && key) const + { + return is_object() && m_value.object->find(std::forward(key)) != m_value.object->end(); + } + + /// @brief check the existence of an element in a JSON object given a JSON pointer + /// @sa https://json.nlohmann.me/api/basic_json/contains/ + bool contains(const json_pointer& ptr) const + { + return ptr.contains(this); + } + + /// @} + + + /////////////// + // iterators // + /////////////// + + /// @name iterators + /// @{ + + /// @brief returns an iterator to the first element + /// @sa https://json.nlohmann.me/api/basic_json/begin/ + iterator begin() noexcept + { + iterator result(this); + result.set_begin(); + return result; + } + + /// @brief returns an iterator to the first element + /// @sa https://json.nlohmann.me/api/basic_json/begin/ + const_iterator begin() const noexcept + { + return cbegin(); + } + + /// @brief returns a const iterator to the first element + /// @sa https://json.nlohmann.me/api/basic_json/cbegin/ + const_iterator cbegin() const noexcept + { + const_iterator result(this); + result.set_begin(); + return result; + } + + /// @brief returns an iterator to one past the last element + /// @sa https://json.nlohmann.me/api/basic_json/end/ + iterator end() noexcept + { + iterator result(this); + result.set_end(); + return result; + } + + /// @brief returns an iterator to one past the last element + /// @sa https://json.nlohmann.me/api/basic_json/end/ + const_iterator end() const noexcept + { + return cend(); + } + + /// @brief returns an iterator to one past the last element + /// @sa https://json.nlohmann.me/api/basic_json/cend/ + const_iterator cend() const noexcept + { + const_iterator result(this); + result.set_end(); + return result; + } + + /// @brief returns an iterator to the reverse-beginning + /// @sa https://json.nlohmann.me/api/basic_json/rbegin/ + reverse_iterator rbegin() noexcept + { + return reverse_iterator(end()); + } + + /// @brief returns an iterator to the reverse-beginning + /// @sa https://json.nlohmann.me/api/basic_json/rbegin/ + const_reverse_iterator rbegin() const noexcept + { + return crbegin(); + } + + /// @brief returns an iterator to the reverse-end + /// @sa https://json.nlohmann.me/api/basic_json/rend/ + reverse_iterator rend() noexcept + { + return reverse_iterator(begin()); + } + + /// @brief returns an iterator to the reverse-end + /// @sa https://json.nlohmann.me/api/basic_json/rend/ + const_reverse_iterator rend() const noexcept + { + return crend(); + } + + /// @brief returns a const reverse iterator to the last element + /// @sa https://json.nlohmann.me/api/basic_json/crbegin/ + const_reverse_iterator crbegin() const noexcept + { + return const_reverse_iterator(cend()); + } + + /// @brief returns a const reverse iterator to one before the first + /// @sa https://json.nlohmann.me/api/basic_json/crend/ + const_reverse_iterator crend() const noexcept + { + return const_reverse_iterator(cbegin()); + } + + public: + /// @brief wrapper to access iterator member functions in range-based for + /// @sa https://json.nlohmann.me/api/basic_json/items/ + /// @deprecated This function is deprecated since 3.1.0 and will be removed in + /// version 4.0.0 of the library. Please use @ref items() instead; + /// that is, replace `json::iterator_wrapper(j)` with `j.items()`. + JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items()) + static iteration_proxy iterator_wrapper(reference ref) noexcept + { + return ref.items(); + } + + /// @brief wrapper to access iterator member functions in range-based for + /// @sa https://json.nlohmann.me/api/basic_json/items/ + /// @deprecated This function is deprecated since 3.1.0 and will be removed in + /// version 4.0.0 of the library. Please use @ref items() instead; + /// that is, replace `json::iterator_wrapper(j)` with `j.items()`. + JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items()) + static iteration_proxy iterator_wrapper(const_reference ref) noexcept + { + return ref.items(); + } + + /// @brief helper to access iterator member functions in range-based for + /// @sa https://json.nlohmann.me/api/basic_json/items/ + iteration_proxy items() noexcept + { + return iteration_proxy(*this); + } + + /// @brief helper to access iterator member functions in range-based for + /// @sa https://json.nlohmann.me/api/basic_json/items/ + iteration_proxy items() const noexcept + { + return iteration_proxy(*this); + } + + /// @} + + + ////////////// + // capacity // + ////////////// + + /// @name capacity + /// @{ + + /// @brief checks whether the container is empty. + /// @sa https://json.nlohmann.me/api/basic_json/empty/ + bool empty() const noexcept + { + switch (m_type) + { + case value_t::null: + { + // null values are empty + return true; + } + + case value_t::array: + { + // delegate call to array_t::empty() + return m_value.array->empty(); + } + + case value_t::object: + { + // delegate call to object_t::empty() + return m_value.object->empty(); + } + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + // all other types are nonempty + return false; + } + } + } + + /// @brief returns the number of elements + /// @sa https://json.nlohmann.me/api/basic_json/size/ + size_type size() const noexcept + { + switch (m_type) + { + case value_t::null: + { + // null values are empty + return 0; + } + + case value_t::array: + { + // delegate call to array_t::size() + return m_value.array->size(); + } + + case value_t::object: + { + // delegate call to object_t::size() + return m_value.object->size(); + } + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + // all other types have size 1 + return 1; + } + } + } + + /// @brief returns the maximum possible number of elements + /// @sa https://json.nlohmann.me/api/basic_json/max_size/ + size_type max_size() const noexcept + { + switch (m_type) + { + case value_t::array: + { + // delegate call to array_t::max_size() + return m_value.array->max_size(); + } + + case value_t::object: + { + // delegate call to object_t::max_size() + return m_value.object->max_size(); + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + // all other types have max_size() == size() + return size(); + } + } + } + + /// @} + + + /////////////// + // modifiers // + /////////////// + + /// @name modifiers + /// @{ + + /// @brief clears the contents + /// @sa https://json.nlohmann.me/api/basic_json/clear/ + void clear() noexcept + { + switch (m_type) + { + case value_t::number_integer: + { + m_value.number_integer = 0; + break; + } + + case value_t::number_unsigned: + { + m_value.number_unsigned = 0; + break; + } + + case value_t::number_float: + { + m_value.number_float = 0.0; + break; + } + + case value_t::boolean: + { + m_value.boolean = false; + break; + } + + case value_t::string: + { + m_value.string->clear(); + break; + } + + case value_t::binary: + { + m_value.binary->clear(); + break; + } + + case value_t::array: + { + m_value.array->clear(); + break; + } + + case value_t::object: + { + m_value.object->clear(); + break; + } + + case value_t::null: + case value_t::discarded: + default: + break; + } + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/push_back/ + void push_back(basic_json&& val) + { + // push_back only works for null objects or arrays + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array()))) + { + JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name()), *this)); + } + + // transform null object into an array + if (is_null()) + { + m_type = value_t::array; + m_value = value_t::array; + assert_invariant(); + } + + // add element to array (move semantics) + const auto old_capacity = m_value.array->capacity(); + m_value.array->push_back(std::move(val)); + set_parent(m_value.array->back(), old_capacity); + // if val is moved from, basic_json move constructor marks it null, so we do not call the destructor + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/operator+=/ + reference operator+=(basic_json&& val) + { + push_back(std::move(val)); + return *this; + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/push_back/ + void push_back(const basic_json& val) + { + // push_back only works for null objects or arrays + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array()))) + { + JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name()), *this)); + } + + // transform null object into an array + if (is_null()) + { + m_type = value_t::array; + m_value = value_t::array; + assert_invariant(); + } + + // add element to array + const auto old_capacity = m_value.array->capacity(); + m_value.array->push_back(val); + set_parent(m_value.array->back(), old_capacity); + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/operator+=/ + reference operator+=(const basic_json& val) + { + push_back(val); + return *this; + } + + /// @brief add an object to an object + /// @sa https://json.nlohmann.me/api/basic_json/push_back/ + void push_back(const typename object_t::value_type& val) + { + // push_back only works for null objects or objects + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_object()))) + { + JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name()), *this)); + } + + // transform null object into an object + if (is_null()) + { + m_type = value_t::object; + m_value = value_t::object; + assert_invariant(); + } + + // add element to object + auto res = m_value.object->insert(val); + set_parent(res.first->second); + } + + /// @brief add an object to an object + /// @sa https://json.nlohmann.me/api/basic_json/operator+=/ + reference operator+=(const typename object_t::value_type& val) + { + push_back(val); + return *this; + } + + /// @brief add an object to an object + /// @sa https://json.nlohmann.me/api/basic_json/push_back/ + void push_back(initializer_list_t init) + { + if (is_object() && init.size() == 2 && (*init.begin())->is_string()) + { + basic_json&& key = init.begin()->moved_or_copied(); + push_back(typename object_t::value_type( + std::move(key.get_ref()), (init.begin() + 1)->moved_or_copied())); + } + else + { + push_back(basic_json(init)); + } + } + + /// @brief add an object to an object + /// @sa https://json.nlohmann.me/api/basic_json/operator+=/ + reference operator+=(initializer_list_t init) + { + push_back(init); + return *this; + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/emplace_back/ + template + reference emplace_back(Args&& ... args) + { + // emplace_back only works for null objects or arrays + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array()))) + { + JSON_THROW(type_error::create(311, "cannot use emplace_back() with " + std::string(type_name()), *this)); + } + + // transform null object into an array + if (is_null()) + { + m_type = value_t::array; + m_value = value_t::array; + assert_invariant(); + } + + // add element to array (perfect forwarding) + const auto old_capacity = m_value.array->capacity(); + m_value.array->emplace_back(std::forward(args)...); + return set_parent(m_value.array->back(), old_capacity); + } + + /// @brief add an object to an object if key does not exist + /// @sa https://json.nlohmann.me/api/basic_json/emplace/ + template + std::pair emplace(Args&& ... args) + { + // emplace only works for null objects or arrays + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_object()))) + { + JSON_THROW(type_error::create(311, "cannot use emplace() with " + std::string(type_name()), *this)); + } + + // transform null object into an object + if (is_null()) + { + m_type = value_t::object; + m_value = value_t::object; + assert_invariant(); + } + + // add element to array (perfect forwarding) + auto res = m_value.object->emplace(std::forward(args)...); + set_parent(res.first->second); + + // create result iterator and set iterator to the result of emplace + auto it = begin(); + it.m_it.object_iterator = res.first; + + // return pair of iterator and boolean + return {it, res.second}; + } + + /// Helper for insertion of an iterator + /// @note: This uses std::distance to support GCC 4.8, + /// see https://github.com/nlohmann/json/pull/1257 + template + iterator insert_iterator(const_iterator pos, Args&& ... args) + { + iterator result(this); + JSON_ASSERT(m_value.array != nullptr); + + auto insert_pos = std::distance(m_value.array->begin(), pos.m_it.array_iterator); + m_value.array->insert(pos.m_it.array_iterator, std::forward(args)...); + result.m_it.array_iterator = m_value.array->begin() + insert_pos; + + // This could have been written as: + // result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, cnt, val); + // but the return value of insert is missing in GCC 4.8, so it is written this way instead. + + set_parents(); + return result; + } + + /// @brief inserts element into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, const basic_json& val) + { + // insert only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + // check if iterator pos fits to this JSON value + if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", *this)); + } + + // insert to array and return iterator + return insert_iterator(pos, val); + } + + JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()), *this)); + } + + /// @brief inserts element into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, basic_json&& val) + { + return insert(pos, val); + } + + /// @brief inserts copies of element into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, size_type cnt, const basic_json& val) + { + // insert only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + // check if iterator pos fits to this JSON value + if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", *this)); + } + + // insert to array and return iterator + return insert_iterator(pos, cnt, val); + } + + JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()), *this)); + } + + /// @brief inserts range of elements into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, const_iterator first, const_iterator last) + { + // insert only works for arrays + if (JSON_HEDLEY_UNLIKELY(!is_array())) + { + JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()), *this)); + } + + // check if iterator pos fits to this JSON value + if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", *this)); + } + + // check if range iterators belong to the same JSON object + if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) + { + JSON_THROW(invalid_iterator::create(210, "iterators do not fit", *this)); + } + + if (JSON_HEDLEY_UNLIKELY(first.m_object == this)) + { + JSON_THROW(invalid_iterator::create(211, "passed iterators may not belong to container", *this)); + } + + // insert to array and return iterator + return insert_iterator(pos, first.m_it.array_iterator, last.m_it.array_iterator); + } + + /// @brief inserts elements from initializer list into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, initializer_list_t ilist) + { + // insert only works for arrays + if (JSON_HEDLEY_UNLIKELY(!is_array())) + { + JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()), *this)); + } + + // check if iterator pos fits to this JSON value + if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", *this)); + } + + // insert to array and return iterator + return insert_iterator(pos, ilist.begin(), ilist.end()); + } + + /// @brief inserts range of elements into object + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + void insert(const_iterator first, const_iterator last) + { + // insert only works for objects + if (JSON_HEDLEY_UNLIKELY(!is_object())) + { + JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()), *this)); + } + + // check if range iterators belong to the same JSON object + if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) + { + JSON_THROW(invalid_iterator::create(210, "iterators do not fit", *this)); + } + + // passed iterators must belong to objects + if (JSON_HEDLEY_UNLIKELY(!first.m_object->is_object())) + { + JSON_THROW(invalid_iterator::create(202, "iterators first and last must point to objects", *this)); + } + + m_value.object->insert(first.m_it.object_iterator, last.m_it.object_iterator); + } + + /// @brief updates a JSON object from another object, overwriting existing keys + /// @sa https://json.nlohmann.me/api/basic_json/update/ + void update(const_reference j, bool merge_objects = false) + { + update(j.begin(), j.end(), merge_objects); + } + + /// @brief updates a JSON object from another object, overwriting existing keys + /// @sa https://json.nlohmann.me/api/basic_json/update/ + void update(const_iterator first, const_iterator last, bool merge_objects = false) + { + // implicitly convert null value to an empty object + if (is_null()) + { + m_type = value_t::object; + m_value.object = create(); + assert_invariant(); + } + + if (JSON_HEDLEY_UNLIKELY(!is_object())) + { + JSON_THROW(type_error::create(312, "cannot use update() with " + std::string(type_name()), *this)); + } + + // check if range iterators belong to the same JSON object + if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) + { + JSON_THROW(invalid_iterator::create(210, "iterators do not fit", *this)); + } + + // passed iterators must belong to objects + if (JSON_HEDLEY_UNLIKELY(!first.m_object->is_object())) + { + JSON_THROW(type_error::create(312, "cannot use update() with " + std::string(first.m_object->type_name()), *first.m_object)); + } + + for (auto it = first; it != last; ++it) + { + if (merge_objects && it.value().is_object()) + { + auto it2 = m_value.object->find(it.key()); + if (it2 != m_value.object->end()) + { + it2->second.update(it.value(), true); + continue; + } + } + m_value.object->operator[](it.key()) = it.value(); +#if JSON_DIAGNOSTICS + m_value.object->operator[](it.key()).m_parent = this; +#endif + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(reference other) noexcept ( + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value&& + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value + ) + { + std::swap(m_type, other.m_type); + std::swap(m_value, other.m_value); + + set_parents(); + other.set_parents(); + assert_invariant(); + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + friend void swap(reference left, reference right) noexcept ( + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value&& + std::is_nothrow_move_constructible::value&& + std::is_nothrow_move_assignable::value + ) + { + left.swap(right); + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(array_t& other) // NOLINT(bugprone-exception-escape) + { + // swap only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + std::swap(*(m_value.array), other); + } + else + { + JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()), *this)); + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(object_t& other) // NOLINT(bugprone-exception-escape) + { + // swap only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + std::swap(*(m_value.object), other); + } + else + { + JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()), *this)); + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(string_t& other) // NOLINT(bugprone-exception-escape) + { + // swap only works for strings + if (JSON_HEDLEY_LIKELY(is_string())) + { + std::swap(*(m_value.string), other); + } + else + { + JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()), *this)); + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(binary_t& other) // NOLINT(bugprone-exception-escape) + { + // swap only works for strings + if (JSON_HEDLEY_LIKELY(is_binary())) + { + std::swap(*(m_value.binary), other); + } + else + { + JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()), *this)); + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(typename binary_t::container_type& other) // NOLINT(bugprone-exception-escape) + { + // swap only works for strings + if (JSON_HEDLEY_LIKELY(is_binary())) + { + std::swap(*(m_value.binary), other); + } + else + { + JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()), *this)); + } + } + + /// @} + + public: + ////////////////////////////////////////// + // lexicographical comparison operators // + ////////////////////////////////////////// + + /// @name lexicographical comparison operators + /// @{ + + /// @brief comparison: equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/ + friend bool operator==(const_reference lhs, const_reference rhs) noexcept + { +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + const auto lhs_type = lhs.type(); + const auto rhs_type = rhs.type(); + + if (lhs_type == rhs_type) + { + switch (lhs_type) + { + case value_t::array: + return *lhs.m_value.array == *rhs.m_value.array; + + case value_t::object: + return *lhs.m_value.object == *rhs.m_value.object; + + case value_t::null: + return true; + + case value_t::string: + return *lhs.m_value.string == *rhs.m_value.string; + + case value_t::boolean: + return lhs.m_value.boolean == rhs.m_value.boolean; + + case value_t::number_integer: + return lhs.m_value.number_integer == rhs.m_value.number_integer; + + case value_t::number_unsigned: + return lhs.m_value.number_unsigned == rhs.m_value.number_unsigned; + + case value_t::number_float: + return lhs.m_value.number_float == rhs.m_value.number_float; + + case value_t::binary: + return *lhs.m_value.binary == *rhs.m_value.binary; + + case value_t::discarded: + default: + return false; + } + } + else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float) + { + return static_cast(lhs.m_value.number_integer) == rhs.m_value.number_float; + } + else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer) + { + return lhs.m_value.number_float == static_cast(rhs.m_value.number_integer); + } + else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float) + { + return static_cast(lhs.m_value.number_unsigned) == rhs.m_value.number_float; + } + else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned) + { + return lhs.m_value.number_float == static_cast(rhs.m_value.number_unsigned); + } + else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer) + { + return static_cast(lhs.m_value.number_unsigned) == rhs.m_value.number_integer; + } + else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned) + { + return lhs.m_value.number_integer == static_cast(rhs.m_value.number_unsigned); + } + + return false; +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + } + + /// @brief comparison: equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/ + template::value, int>::type = 0> + friend bool operator==(const_reference lhs, ScalarType rhs) noexcept + { + return lhs == basic_json(rhs); + } + + /// @brief comparison: equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/ + template::value, int>::type = 0> + friend bool operator==(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) == rhs; + } + + /// @brief comparison: not equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ne/ + friend bool operator!=(const_reference lhs, const_reference rhs) noexcept + { + return !(lhs == rhs); + } + + /// @brief comparison: not equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ne/ + template::value, int>::type = 0> + friend bool operator!=(const_reference lhs, ScalarType rhs) noexcept + { + return lhs != basic_json(rhs); + } + + /// @brief comparison: not equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ne/ + template::value, int>::type = 0> + friend bool operator!=(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) != rhs; + } + + /// @brief comparison: less than + /// @sa https://json.nlohmann.me/api/basic_json/operator_lt/ + friend bool operator<(const_reference lhs, const_reference rhs) noexcept + { + const auto lhs_type = lhs.type(); + const auto rhs_type = rhs.type(); + + if (lhs_type == rhs_type) + { + switch (lhs_type) + { + case value_t::array: + // note parentheses are necessary, see + // https://github.com/nlohmann/json/issues/1530 + return (*lhs.m_value.array) < (*rhs.m_value.array); + + case value_t::object: + return (*lhs.m_value.object) < (*rhs.m_value.object); + + case value_t::null: + return false; + + case value_t::string: + return (*lhs.m_value.string) < (*rhs.m_value.string); + + case value_t::boolean: + return (lhs.m_value.boolean) < (rhs.m_value.boolean); + + case value_t::number_integer: + return (lhs.m_value.number_integer) < (rhs.m_value.number_integer); + + case value_t::number_unsigned: + return (lhs.m_value.number_unsigned) < (rhs.m_value.number_unsigned); + + case value_t::number_float: + return (lhs.m_value.number_float) < (rhs.m_value.number_float); + + case value_t::binary: + return (*lhs.m_value.binary) < (*rhs.m_value.binary); + + case value_t::discarded: + default: + return false; + } + } + else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float) + { + return static_cast(lhs.m_value.number_integer) < rhs.m_value.number_float; + } + else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer) + { + return lhs.m_value.number_float < static_cast(rhs.m_value.number_integer); + } + else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float) + { + return static_cast(lhs.m_value.number_unsigned) < rhs.m_value.number_float; + } + else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned) + { + return lhs.m_value.number_float < static_cast(rhs.m_value.number_unsigned); + } + else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned) + { + return lhs.m_value.number_integer < static_cast(rhs.m_value.number_unsigned); + } + else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer) + { + return static_cast(lhs.m_value.number_unsigned) < rhs.m_value.number_integer; + } + + // We only reach this line if we cannot compare values. In that case, + // we compare types. Note we have to call the operator explicitly, + // because MSVC has problems otherwise. + return operator<(lhs_type, rhs_type); + } + + /// @brief comparison: less than + /// @sa https://json.nlohmann.me/api/basic_json/operator_lt/ + template::value, int>::type = 0> + friend bool operator<(const_reference lhs, ScalarType rhs) noexcept + { + return lhs < basic_json(rhs); + } + + /// @brief comparison: less than + /// @sa https://json.nlohmann.me/api/basic_json/operator_lt/ + template::value, int>::type = 0> + friend bool operator<(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) < rhs; + } + + /// @brief comparison: less than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_le/ + friend bool operator<=(const_reference lhs, const_reference rhs) noexcept + { + return !(rhs < lhs); + } + + /// @brief comparison: less than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_le/ + template::value, int>::type = 0> + friend bool operator<=(const_reference lhs, ScalarType rhs) noexcept + { + return lhs <= basic_json(rhs); + } + + /// @brief comparison: less than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_le/ + template::value, int>::type = 0> + friend bool operator<=(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) <= rhs; + } + + /// @brief comparison: greater than + /// @sa https://json.nlohmann.me/api/basic_json/operator_gt/ + friend bool operator>(const_reference lhs, const_reference rhs) noexcept + { + return !(lhs <= rhs); + } + + /// @brief comparison: greater than + /// @sa https://json.nlohmann.me/api/basic_json/operator_gt/ + template::value, int>::type = 0> + friend bool operator>(const_reference lhs, ScalarType rhs) noexcept + { + return lhs > basic_json(rhs); + } + + /// @brief comparison: greater than + /// @sa https://json.nlohmann.me/api/basic_json/operator_gt/ + template::value, int>::type = 0> + friend bool operator>(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) > rhs; + } + + /// @brief comparison: greater than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/ + friend bool operator>=(const_reference lhs, const_reference rhs) noexcept + { + return !(lhs < rhs); + } + + /// @brief comparison: greater than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/ + template::value, int>::type = 0> + friend bool operator>=(const_reference lhs, ScalarType rhs) noexcept + { + return lhs >= basic_json(rhs); + } + + /// @brief comparison: greater than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/ + template::value, int>::type = 0> + friend bool operator>=(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) >= rhs; + } + + /// @} + + /////////////////// + // serialization // + /////////////////// + + /// @name serialization + /// @{ +#ifndef JSON_NO_IO + /// @brief serialize to stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_ltlt/ + friend std::ostream& operator<<(std::ostream& o, const basic_json& j) + { + // read width member and use it as indentation parameter if nonzero + const bool pretty_print = o.width() > 0; + const auto indentation = pretty_print ? o.width() : 0; + + // reset width to 0 for subsequent calls to this stream + o.width(0); + + // do the actual serialization + serializer s(detail::output_adapter(o), o.fill()); + s.dump(j, pretty_print, false, static_cast(indentation)); + return o; + } + + /// @brief serialize to stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_ltlt/ + /// @deprecated This function is deprecated since 3.0.0 and will be removed in + /// version 4.0.0 of the library. Please use + /// operator<<(std::ostream&, const basic_json&) instead; that is, + /// replace calls like `j >> o;` with `o << j;`. + JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator<<(std::ostream&, const basic_json&)) + friend std::ostream& operator>>(const basic_json& j, std::ostream& o) + { + return o << j; + } +#endif // JSON_NO_IO + /// @} + + + ///////////////////// + // deserialization // + ///////////////////// + + /// @name deserialization + /// @{ + + /// @brief deserialize from a compatible input + /// @sa https://json.nlohmann.me/api/basic_json/parse/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json parse(InputType&& i, + const parser_callback_t cb = nullptr, + const bool allow_exceptions = true, + const bool ignore_comments = false) + { + basic_json result; + parser(detail::input_adapter(std::forward(i)), cb, allow_exceptions, ignore_comments).parse(true, result); + return result; + } + + /// @brief deserialize from a pair of character iterators + /// @sa https://json.nlohmann.me/api/basic_json/parse/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json parse(IteratorType first, + IteratorType last, + const parser_callback_t cb = nullptr, + const bool allow_exceptions = true, + const bool ignore_comments = false) + { + basic_json result; + parser(detail::input_adapter(std::move(first), std::move(last)), cb, allow_exceptions, ignore_comments).parse(true, result); + return result; + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, parse(ptr, ptr + len)) + static basic_json parse(detail::span_input_adapter&& i, + const parser_callback_t cb = nullptr, + const bool allow_exceptions = true, + const bool ignore_comments = false) + { + basic_json result; + parser(i.get(), cb, allow_exceptions, ignore_comments).parse(true, result); + return result; + } + + /// @brief check if the input is valid JSON + /// @sa https://json.nlohmann.me/api/basic_json/accept/ + template + static bool accept(InputType&& i, + const bool ignore_comments = false) + { + return parser(detail::input_adapter(std::forward(i)), nullptr, false, ignore_comments).accept(true); + } + + /// @brief check if the input is valid JSON + /// @sa https://json.nlohmann.me/api/basic_json/accept/ + template + static bool accept(IteratorType first, IteratorType last, + const bool ignore_comments = false) + { + return parser(detail::input_adapter(std::move(first), std::move(last)), nullptr, false, ignore_comments).accept(true); + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, accept(ptr, ptr + len)) + static bool accept(detail::span_input_adapter&& i, + const bool ignore_comments = false) + { + return parser(i.get(), nullptr, false, ignore_comments).accept(true); + } + + /// @brief generate SAX events + /// @sa https://json.nlohmann.me/api/basic_json/sax_parse/ + template + JSON_HEDLEY_NON_NULL(2) + static bool sax_parse(InputType&& i, SAX* sax, + input_format_t format = input_format_t::json, + const bool strict = true, + const bool ignore_comments = false) + { + auto ia = detail::input_adapter(std::forward(i)); + return format == input_format_t::json + ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict) + : detail::binary_reader(std::move(ia)).sax_parse(format, sax, strict); + } + + /// @brief generate SAX events + /// @sa https://json.nlohmann.me/api/basic_json/sax_parse/ + template + JSON_HEDLEY_NON_NULL(3) + static bool sax_parse(IteratorType first, IteratorType last, SAX* sax, + input_format_t format = input_format_t::json, + const bool strict = true, + const bool ignore_comments = false) + { + auto ia = detail::input_adapter(std::move(first), std::move(last)); + return format == input_format_t::json + ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict) + : detail::binary_reader(std::move(ia)).sax_parse(format, sax, strict); + } + + /// @brief generate SAX events + /// @sa https://json.nlohmann.me/api/basic_json/sax_parse/ + /// @deprecated This function is deprecated since 3.8.0 and will be removed in + /// version 4.0.0 of the library. Please use + /// sax_parse(ptr, ptr + len) instead. + template + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, sax_parse(ptr, ptr + len, ...)) + JSON_HEDLEY_NON_NULL(2) + static bool sax_parse(detail::span_input_adapter&& i, SAX* sax, + input_format_t format = input_format_t::json, + const bool strict = true, + const bool ignore_comments = false) + { + auto ia = i.get(); + return format == input_format_t::json + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict) + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + : detail::binary_reader(std::move(ia)).sax_parse(format, sax, strict); + } +#ifndef JSON_NO_IO + /// @brief deserialize from stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_gtgt/ + /// @deprecated This stream operator is deprecated since 3.0.0 and will be removed in + /// version 4.0.0 of the library. Please use + /// operator>>(std::istream&, basic_json&) instead; that is, + /// replace calls like `j << i;` with `i >> j;`. + JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator>>(std::istream&, basic_json&)) + friend std::istream& operator<<(basic_json& j, std::istream& i) + { + return operator>>(i, j); + } + + /// @brief deserialize from stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_gtgt/ + friend std::istream& operator>>(std::istream& i, basic_json& j) + { + parser(detail::input_adapter(i)).parse(false, j); + return i; + } +#endif // JSON_NO_IO + /// @} + + /////////////////////////// + // convenience functions // + /////////////////////////// + + /// @brief return the type as string + /// @sa https://json.nlohmann.me/api/basic_json/type_name/ + JSON_HEDLEY_RETURNS_NON_NULL + const char* type_name() const noexcept + { + switch (m_type) + { + case value_t::null: + return "null"; + case value_t::object: + return "object"; + case value_t::array: + return "array"; + case value_t::string: + return "string"; + case value_t::boolean: + return "boolean"; + case value_t::binary: + return "binary"; + case value_t::discarded: + return "discarded"; + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + default: + return "number"; + } + } + + + JSON_PRIVATE_UNLESS_TESTED: + ////////////////////// + // member variables // + ////////////////////// + + /// the type of the current element + value_t m_type = value_t::null; + + /// the value of the current element + json_value m_value = {}; + +#if JSON_DIAGNOSTICS + /// a pointer to a parent value (for debugging purposes) + basic_json* m_parent = nullptr; +#endif + + ////////////////////////////////////////// + // binary serialization/deserialization // + ////////////////////////////////////////// + + /// @name binary serialization/deserialization support + /// @{ + + public: + /// @brief create a CBOR serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_cbor/ + static std::vector to_cbor(const basic_json& j) + { + std::vector result; + to_cbor(j, result); + return result; + } + + /// @brief create a CBOR serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_cbor/ + static void to_cbor(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_cbor(j); + } + + /// @brief create a CBOR serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_cbor/ + static void to_cbor(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_cbor(j); + } + + /// @brief create a MessagePack serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_msgpack/ + static std::vector to_msgpack(const basic_json& j) + { + std::vector result; + to_msgpack(j, result); + return result; + } + + /// @brief create a MessagePack serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_msgpack/ + static void to_msgpack(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_msgpack(j); + } + + /// @brief create a MessagePack serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_msgpack/ + static void to_msgpack(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_msgpack(j); + } + + /// @brief create a UBJSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_ubjson/ + static std::vector to_ubjson(const basic_json& j, + const bool use_size = false, + const bool use_type = false) + { + std::vector result; + to_ubjson(j, result, use_size, use_type); + return result; + } + + /// @brief create a UBJSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_ubjson/ + static void to_ubjson(const basic_json& j, detail::output_adapter o, + const bool use_size = false, const bool use_type = false) + { + binary_writer(o).write_ubjson(j, use_size, use_type); + } + + /// @brief create a UBJSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_ubjson/ + static void to_ubjson(const basic_json& j, detail::output_adapter o, + const bool use_size = false, const bool use_type = false) + { + binary_writer(o).write_ubjson(j, use_size, use_type); + } + + /// @brief create a BSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_bson/ + static std::vector to_bson(const basic_json& j) + { + std::vector result; + to_bson(j, result); + return result; + } + + /// @brief create a BSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_bson/ + static void to_bson(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_bson(j); + } + + /// @brief create a BSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_bson/ + static void to_bson(const basic_json& j, detail::output_adapter o) + { + binary_writer(o).write_bson(j); + } + + /// @brief create a JSON value from an input in CBOR format + /// @sa https://json.nlohmann.me/api/basic_json/from_cbor/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_cbor(InputType&& i, + const bool strict = true, + const bool allow_exceptions = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::forward(i)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in CBOR format + /// @sa https://json.nlohmann.me/api/basic_json/from_cbor/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_cbor(IteratorType first, IteratorType last, + const bool strict = true, + const bool allow_exceptions = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::move(first), std::move(last)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); + return res ? result : basic_json(value_t::discarded); + } + + template + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len)) + static basic_json from_cbor(const T* ptr, std::size_t len, + const bool strict = true, + const bool allow_exceptions = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + return from_cbor(ptr, ptr + len, strict, allow_exceptions, tag_handler); + } + + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len)) + static basic_json from_cbor(detail::span_input_adapter&& i, + const bool strict = true, + const bool allow_exceptions = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = i.get(); + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in MessagePack format + /// @sa https://json.nlohmann.me/api/basic_json/from_msgpack/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_msgpack(InputType&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::forward(i)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in MessagePack format + /// @sa https://json.nlohmann.me/api/basic_json/from_msgpack/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_msgpack(IteratorType first, IteratorType last, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::move(first), std::move(last)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + template + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len)) + static basic_json from_msgpack(const T* ptr, std::size_t len, + const bool strict = true, + const bool allow_exceptions = true) + { + return from_msgpack(ptr, ptr + len, strict, allow_exceptions); + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len)) + static basic_json from_msgpack(detail::span_input_adapter&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = i.get(); + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in UBJSON format + /// @sa https://json.nlohmann.me/api/basic_json/from_ubjson/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_ubjson(InputType&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::forward(i)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in UBJSON format + /// @sa https://json.nlohmann.me/api/basic_json/from_ubjson/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_ubjson(IteratorType first, IteratorType last, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::move(first), std::move(last)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + template + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len)) + static basic_json from_ubjson(const T* ptr, std::size_t len, + const bool strict = true, + const bool allow_exceptions = true) + { + return from_ubjson(ptr, ptr + len, strict, allow_exceptions); + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len)) + static basic_json from_ubjson(detail::span_input_adapter&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = i.get(); + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in BSON format + /// @sa https://json.nlohmann.me/api/basic_json/from_bson/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_bson(InputType&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::forward(i)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in BSON format + /// @sa https://json.nlohmann.me/api/basic_json/from_bson/ + template + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_bson(IteratorType first, IteratorType last, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::move(first), std::move(last)); + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + template + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len)) + static basic_json from_bson(const T* ptr, std::size_t len, + const bool strict = true, + const bool allow_exceptions = true) + { + return from_bson(ptr, ptr + len, strict, allow_exceptions); + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len)) + static basic_json from_bson(detail::span_input_adapter&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser sdp(result, allow_exceptions); + auto ia = i.get(); + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + /// @} + + ////////////////////////// + // JSON Pointer support // + ////////////////////////// + + /// @name JSON Pointer functions + /// @{ + + /// @brief access specified element via JSON Pointer + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + reference operator[](const json_pointer& ptr) + { + return ptr.get_unchecked(this); + } + + /// @brief access specified element via JSON Pointer + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + const_reference operator[](const json_pointer& ptr) const + { + return ptr.get_unchecked(this); + } + + /// @brief access specified element via JSON Pointer + /// @sa https://json.nlohmann.me/api/basic_json/at/ + reference at(const json_pointer& ptr) + { + return ptr.get_checked(this); + } + + /// @brief access specified element via JSON Pointer + /// @sa https://json.nlohmann.me/api/basic_json/at/ + const_reference at(const json_pointer& ptr) const + { + return ptr.get_checked(this); + } + + /// @brief return flattened JSON value + /// @sa https://json.nlohmann.me/api/basic_json/flatten/ + basic_json flatten() const + { + basic_json result(value_t::object); + json_pointer::flatten("", *this, result); + return result; + } + + /// @brief unflatten a previously flattened JSON value + /// @sa https://json.nlohmann.me/api/basic_json/unflatten/ + basic_json unflatten() const + { + return json_pointer::unflatten(*this); + } + + /// @} + + ////////////////////////// + // JSON Patch functions // + ////////////////////////// + + /// @name JSON Patch functions + /// @{ + + /// @brief applies a JSON patch + /// @sa https://json.nlohmann.me/api/basic_json/patch/ + basic_json patch(const basic_json& json_patch) const + { + // make a working copy to apply the patch to + basic_json result = *this; + + // the valid JSON Patch operations + enum class patch_operations {add, remove, replace, move, copy, test, invalid}; + + const auto get_op = [](const std::string & op) + { + if (op == "add") + { + return patch_operations::add; + } + if (op == "remove") + { + return patch_operations::remove; + } + if (op == "replace") + { + return patch_operations::replace; + } + if (op == "move") + { + return patch_operations::move; + } + if (op == "copy") + { + return patch_operations::copy; + } + if (op == "test") + { + return patch_operations::test; + } + + return patch_operations::invalid; + }; + + // wrapper for "add" operation; add value at ptr + const auto operation_add = [&result](json_pointer & ptr, basic_json val) + { + // adding to the root of the target document means replacing it + if (ptr.empty()) + { + result = val; + return; + } + + // make sure the top element of the pointer exists + json_pointer top_pointer = ptr.top(); + if (top_pointer != ptr) + { + result.at(top_pointer); + } + + // get reference to parent of JSON pointer ptr + const auto last_path = ptr.back(); + ptr.pop_back(); + basic_json& parent = result[ptr]; + + switch (parent.m_type) + { + case value_t::null: + case value_t::object: + { + // use operator[] to add value + parent[last_path] = val; + break; + } + + case value_t::array: + { + if (last_path == "-") + { + // special case: append to back + parent.push_back(val); + } + else + { + const auto idx = json_pointer::array_index(last_path); + if (JSON_HEDLEY_UNLIKELY(idx > parent.size())) + { + // avoid undefined behavior + JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range", parent)); + } + + // default case: insert add offset + parent.insert(parent.begin() + static_cast(idx), val); + } + break; + } + + // if there exists a parent it cannot be primitive + case value_t::string: // LCOV_EXCL_LINE + case value_t::boolean: // LCOV_EXCL_LINE + case value_t::number_integer: // LCOV_EXCL_LINE + case value_t::number_unsigned: // LCOV_EXCL_LINE + case value_t::number_float: // LCOV_EXCL_LINE + case value_t::binary: // LCOV_EXCL_LINE + case value_t::discarded: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + }; + + // wrapper for "remove" operation; remove value at ptr + const auto operation_remove = [this, &result](json_pointer & ptr) + { + // get reference to parent of JSON pointer ptr + const auto last_path = ptr.back(); + ptr.pop_back(); + basic_json& parent = result.at(ptr); + + // remove child + if (parent.is_object()) + { + // perform range check + auto it = parent.find(last_path); + if (JSON_HEDLEY_LIKELY(it != parent.end())) + { + parent.erase(it); + } + else + { + JSON_THROW(out_of_range::create(403, "key '" + last_path + "' not found", *this)); + } + } + else if (parent.is_array()) + { + // note erase performs range check + parent.erase(json_pointer::array_index(last_path)); + } + }; + + // type check: top level value must be an array + if (JSON_HEDLEY_UNLIKELY(!json_patch.is_array())) + { + JSON_THROW(parse_error::create(104, 0, "JSON patch must be an array of objects", json_patch)); + } + + // iterate and apply the operations + for (const auto& val : json_patch) + { + // wrapper to get a value for an operation + const auto get_value = [&val](const std::string & op, + const std::string & member, + bool string_type) -> basic_json & + { + // find value + auto it = val.m_value.object->find(member); + + // context-sensitive error message + const auto error_msg = (op == "op") ? "operation" : "operation '" + op + "'"; + + // check if desired value is present + if (JSON_HEDLEY_UNLIKELY(it == val.m_value.object->end())) + { + // NOLINTNEXTLINE(performance-inefficient-string-concatenation) + JSON_THROW(parse_error::create(105, 0, error_msg + " must have member '" + member + "'", val)); + } + + // check if result is of type string + if (JSON_HEDLEY_UNLIKELY(string_type && !it->second.is_string())) + { + // NOLINTNEXTLINE(performance-inefficient-string-concatenation) + JSON_THROW(parse_error::create(105, 0, error_msg + " must have string member '" + member + "'", val)); + } + + // no error: return value + return it->second; + }; + + // type check: every element of the array must be an object + if (JSON_HEDLEY_UNLIKELY(!val.is_object())) + { + JSON_THROW(parse_error::create(104, 0, "JSON patch must be an array of objects", val)); + } + + // collect mandatory members + const auto op = get_value("op", "op", true).template get(); + const auto path = get_value(op, "path", true).template get(); + json_pointer ptr(path); + + switch (get_op(op)) + { + case patch_operations::add: + { + operation_add(ptr, get_value("add", "value", false)); + break; + } + + case patch_operations::remove: + { + operation_remove(ptr); + break; + } + + case patch_operations::replace: + { + // the "path" location must exist - use at() + result.at(ptr) = get_value("replace", "value", false); + break; + } + + case patch_operations::move: + { + const auto from_path = get_value("move", "from", true).template get(); + json_pointer from_ptr(from_path); + + // the "from" location must exist - use at() + basic_json v = result.at(from_ptr); + + // The move operation is functionally identical to a + // "remove" operation on the "from" location, followed + // immediately by an "add" operation at the target + // location with the value that was just removed. + operation_remove(from_ptr); + operation_add(ptr, v); + break; + } + + case patch_operations::copy: + { + const auto from_path = get_value("copy", "from", true).template get(); + const json_pointer from_ptr(from_path); + + // the "from" location must exist - use at() + basic_json v = result.at(from_ptr); + + // The copy is functionally identical to an "add" + // operation at the target location using the value + // specified in the "from" member. + operation_add(ptr, v); + break; + } + + case patch_operations::test: + { + bool success = false; + JSON_TRY + { + // check if "value" matches the one at "path" + // the "path" location must exist - use at() + success = (result.at(ptr) == get_value("test", "value", false)); + } + JSON_INTERNAL_CATCH (out_of_range&) + { + // ignore out of range errors: success remains false + } + + // throw an exception if test fails + if (JSON_HEDLEY_UNLIKELY(!success)) + { + JSON_THROW(other_error::create(501, "unsuccessful: " + val.dump(), val)); + } + + break; + } + + case patch_operations::invalid: + default: + { + // op must be "add", "remove", "replace", "move", "copy", or + // "test" + JSON_THROW(parse_error::create(105, 0, "operation value '" + op + "' is invalid", val)); + } + } + } + + return result; + } + + /// @brief creates a diff as a JSON patch + /// @sa https://json.nlohmann.me/api/basic_json/diff/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json diff(const basic_json& source, const basic_json& target, + const std::string& path = "") + { + // the patch + basic_json result(value_t::array); + + // if the values are the same, return empty patch + if (source == target) + { + return result; + } + + if (source.type() != target.type()) + { + // different types: replace value + result.push_back( + { + {"op", "replace"}, {"path", path}, {"value", target} + }); + return result; + } + + switch (source.type()) + { + case value_t::array: + { + // first pass: traverse common elements + std::size_t i = 0; + while (i < source.size() && i < target.size()) + { + // recursive call to compare array values at index i + auto temp_diff = diff(source[i], target[i], path + "/" + std::to_string(i)); + result.insert(result.end(), temp_diff.begin(), temp_diff.end()); + ++i; + } + + // We now reached the end of at least one array + // in a second pass, traverse the remaining elements + + // remove my remaining elements + const auto end_index = static_cast(result.size()); + while (i < source.size()) + { + // add operations in reverse order to avoid invalid + // indices + result.insert(result.begin() + end_index, object( + { + {"op", "remove"}, + {"path", path + "/" + std::to_string(i)} + })); + ++i; + } + + // add other remaining elements + while (i < target.size()) + { + result.push_back( + { + {"op", "add"}, + {"path", path + "/-"}, + {"value", target[i]} + }); + ++i; + } + + break; + } + + case value_t::object: + { + // first pass: traverse this object's elements + for (auto it = source.cbegin(); it != source.cend(); ++it) + { + // escape the key name to be used in a JSON patch + const auto path_key = path + "/" + detail::escape(it.key()); + + if (target.find(it.key()) != target.end()) + { + // recursive call to compare object values at key it + auto temp_diff = diff(it.value(), target[it.key()], path_key); + result.insert(result.end(), temp_diff.begin(), temp_diff.end()); + } + else + { + // found a key that is not in o -> remove it + result.push_back(object( + { + {"op", "remove"}, {"path", path_key} + })); + } + } + + // second pass: traverse other object's elements + for (auto it = target.cbegin(); it != target.cend(); ++it) + { + if (source.find(it.key()) == source.end()) + { + // found a key that is not in this -> add it + const auto path_key = path + "/" + detail::escape(it.key()); + result.push_back( + { + {"op", "add"}, {"path", path_key}, + {"value", it.value()} + }); + } + } + + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + // both primitive type: replace value + result.push_back( + { + {"op", "replace"}, {"path", path}, {"value", target} + }); + break; + } + } + + return result; + } + + /// @} + + //////////////////////////////// + // JSON Merge Patch functions // + //////////////////////////////// + + /// @name JSON Merge Patch functions + /// @{ + + /// @brief applies a JSON Merge Patch + /// @sa https://json.nlohmann.me/api/basic_json/merge_patch/ + void merge_patch(const basic_json& apply_patch) + { + if (apply_patch.is_object()) + { + if (!is_object()) + { + *this = object(); + } + for (auto it = apply_patch.begin(); it != apply_patch.end(); ++it) + { + if (it.value().is_null()) + { + erase(it.key()); + } + else + { + operator[](it.key()).merge_patch(it.value()); + } + } + } + else + { + *this = apply_patch; + } + } + + /// @} +}; + +/// @brief user-defined to_string function for JSON values +/// @sa https://json.nlohmann.me/api/basic_json/to_string/ +NLOHMANN_BASIC_JSON_TPL_DECLARATION +std::string to_string(const NLOHMANN_BASIC_JSON_TPL& j) +{ + return j.dump(); +} + +} // namespace nlohmann + +/////////////////////// +// nonmember support // +/////////////////////// + +namespace std // NOLINT(cert-dcl58-cpp) +{ + +/// @brief hash value for JSON objects +/// @sa https://json.nlohmann.me/api/basic_json/std_hash/ +NLOHMANN_BASIC_JSON_TPL_DECLARATION +struct hash +{ + std::size_t operator()(const nlohmann::NLOHMANN_BASIC_JSON_TPL& j) const + { + return nlohmann::detail::hash(j); + } +}; + +// specialization for std::less +template<> +struct less< ::nlohmann::detail::value_t> // do not remove the space after '<', see https://github.com/nlohmann/json/pull/679 +{ + /*! + @brief compare two value_t enum values + @since version 3.0.0 + */ + bool operator()(nlohmann::detail::value_t lhs, + nlohmann::detail::value_t rhs) const noexcept + { + return nlohmann::detail::operator<(lhs, rhs); + } +}; + +// C++20 prohibit function specialization in the std namespace. +#ifndef JSON_HAS_CPP_20 + +/// @brief exchanges the values of two JSON objects +/// @sa https://json.nlohmann.me/api/basic_json/std_swap/ +NLOHMANN_BASIC_JSON_TPL_DECLARATION +inline void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL& j1, nlohmann::NLOHMANN_BASIC_JSON_TPL& j2) noexcept( // NOLINT(readability-inconsistent-declaration-parameter-name) + is_nothrow_move_constructible::value&& // NOLINT(misc-redundant-expression) + is_nothrow_move_assignable::value) +{ + j1.swap(j2); +} + +#endif + +} // namespace std + +/// @brief user-defined string literal for JSON values +/// @sa https://json.nlohmann.me/api/basic_json/operator_literal_json/ +JSON_HEDLEY_NON_NULL(1) +inline nlohmann::json operator "" _json(const char* s, std::size_t n) +{ + return nlohmann::json::parse(s, s + n); +} + +/// @brief user-defined string literal for JSON pointer +/// @sa https://json.nlohmann.me/api/basic_json/operator_literal_json_pointer/ +JSON_HEDLEY_NON_NULL(1) +inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std::size_t n) +{ + return nlohmann::json::json_pointer(std::string(s, n)); +} + +// #include + + +// restore clang diagnostic settings +#if defined(__clang__) + #pragma clang diagnostic pop +#endif + +// clean up +#undef JSON_ASSERT +#undef JSON_INTERNAL_CATCH +#undef JSON_CATCH +#undef JSON_THROW +#undef JSON_TRY +#undef JSON_PRIVATE_UNLESS_TESTED +#undef JSON_HAS_CPP_11 +#undef JSON_HAS_CPP_14 +#undef JSON_HAS_CPP_17 +#undef JSON_HAS_CPP_20 +#undef JSON_HAS_FILESYSTEM +#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM +#undef NLOHMANN_BASIC_JSON_TPL_DECLARATION +#undef NLOHMANN_BASIC_JSON_TPL +#undef JSON_EXPLICIT +#undef NLOHMANN_CAN_CALL_STD_FUNC_IMPL + +// #include + + +#undef JSON_HEDLEY_ALWAYS_INLINE +#undef JSON_HEDLEY_ARM_VERSION +#undef JSON_HEDLEY_ARM_VERSION_CHECK +#undef JSON_HEDLEY_ARRAY_PARAM +#undef JSON_HEDLEY_ASSUME +#undef JSON_HEDLEY_BEGIN_C_DECLS +#undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE +#undef JSON_HEDLEY_CLANG_HAS_BUILTIN +#undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE +#undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE +#undef JSON_HEDLEY_CLANG_HAS_EXTENSION +#undef JSON_HEDLEY_CLANG_HAS_FEATURE +#undef JSON_HEDLEY_CLANG_HAS_WARNING +#undef JSON_HEDLEY_COMPCERT_VERSION +#undef JSON_HEDLEY_COMPCERT_VERSION_CHECK +#undef JSON_HEDLEY_CONCAT +#undef JSON_HEDLEY_CONCAT3 +#undef JSON_HEDLEY_CONCAT3_EX +#undef JSON_HEDLEY_CONCAT_EX +#undef JSON_HEDLEY_CONST +#undef JSON_HEDLEY_CONSTEXPR +#undef JSON_HEDLEY_CONST_CAST +#undef JSON_HEDLEY_CPP_CAST +#undef JSON_HEDLEY_CRAY_VERSION +#undef JSON_HEDLEY_CRAY_VERSION_CHECK +#undef JSON_HEDLEY_C_DECL +#undef JSON_HEDLEY_DEPRECATED +#undef JSON_HEDLEY_DEPRECATED_FOR +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#undef JSON_HEDLEY_DIAGNOSTIC_POP +#undef JSON_HEDLEY_DIAGNOSTIC_PUSH +#undef JSON_HEDLEY_DMC_VERSION +#undef JSON_HEDLEY_DMC_VERSION_CHECK +#undef JSON_HEDLEY_EMPTY_BASES +#undef JSON_HEDLEY_EMSCRIPTEN_VERSION +#undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK +#undef JSON_HEDLEY_END_C_DECLS +#undef JSON_HEDLEY_FLAGS +#undef JSON_HEDLEY_FLAGS_CAST +#undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE +#undef JSON_HEDLEY_GCC_HAS_BUILTIN +#undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE +#undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE +#undef JSON_HEDLEY_GCC_HAS_EXTENSION +#undef JSON_HEDLEY_GCC_HAS_FEATURE +#undef JSON_HEDLEY_GCC_HAS_WARNING +#undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK +#undef JSON_HEDLEY_GCC_VERSION +#undef JSON_HEDLEY_GCC_VERSION_CHECK +#undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE +#undef JSON_HEDLEY_GNUC_HAS_BUILTIN +#undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE +#undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE +#undef JSON_HEDLEY_GNUC_HAS_EXTENSION +#undef JSON_HEDLEY_GNUC_HAS_FEATURE +#undef JSON_HEDLEY_GNUC_HAS_WARNING +#undef JSON_HEDLEY_GNUC_VERSION +#undef JSON_HEDLEY_GNUC_VERSION_CHECK +#undef JSON_HEDLEY_HAS_ATTRIBUTE +#undef JSON_HEDLEY_HAS_BUILTIN +#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE +#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS +#undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE +#undef JSON_HEDLEY_HAS_EXTENSION +#undef JSON_HEDLEY_HAS_FEATURE +#undef JSON_HEDLEY_HAS_WARNING +#undef JSON_HEDLEY_IAR_VERSION +#undef JSON_HEDLEY_IAR_VERSION_CHECK +#undef JSON_HEDLEY_IBM_VERSION +#undef JSON_HEDLEY_IBM_VERSION_CHECK +#undef JSON_HEDLEY_IMPORT +#undef JSON_HEDLEY_INLINE +#undef JSON_HEDLEY_INTEL_CL_VERSION +#undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK +#undef JSON_HEDLEY_INTEL_VERSION +#undef JSON_HEDLEY_INTEL_VERSION_CHECK +#undef JSON_HEDLEY_IS_CONSTANT +#undef JSON_HEDLEY_IS_CONSTEXPR_ +#undef JSON_HEDLEY_LIKELY +#undef JSON_HEDLEY_MALLOC +#undef JSON_HEDLEY_MCST_LCC_VERSION +#undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK +#undef JSON_HEDLEY_MESSAGE +#undef JSON_HEDLEY_MSVC_VERSION +#undef JSON_HEDLEY_MSVC_VERSION_CHECK +#undef JSON_HEDLEY_NEVER_INLINE +#undef JSON_HEDLEY_NON_NULL +#undef JSON_HEDLEY_NO_ESCAPE +#undef JSON_HEDLEY_NO_RETURN +#undef JSON_HEDLEY_NO_THROW +#undef JSON_HEDLEY_NULL +#undef JSON_HEDLEY_PELLES_VERSION +#undef JSON_HEDLEY_PELLES_VERSION_CHECK +#undef JSON_HEDLEY_PGI_VERSION +#undef JSON_HEDLEY_PGI_VERSION_CHECK +#undef JSON_HEDLEY_PREDICT +#undef JSON_HEDLEY_PRINTF_FORMAT +#undef JSON_HEDLEY_PRIVATE +#undef JSON_HEDLEY_PUBLIC +#undef JSON_HEDLEY_PURE +#undef JSON_HEDLEY_REINTERPRET_CAST +#undef JSON_HEDLEY_REQUIRE +#undef JSON_HEDLEY_REQUIRE_CONSTEXPR +#undef JSON_HEDLEY_REQUIRE_MSG +#undef JSON_HEDLEY_RESTRICT +#undef JSON_HEDLEY_RETURNS_NON_NULL +#undef JSON_HEDLEY_SENTINEL +#undef JSON_HEDLEY_STATIC_ASSERT +#undef JSON_HEDLEY_STATIC_CAST +#undef JSON_HEDLEY_STRINGIFY +#undef JSON_HEDLEY_STRINGIFY_EX +#undef JSON_HEDLEY_SUNPRO_VERSION +#undef JSON_HEDLEY_SUNPRO_VERSION_CHECK +#undef JSON_HEDLEY_TINYC_VERSION +#undef JSON_HEDLEY_TINYC_VERSION_CHECK +#undef JSON_HEDLEY_TI_ARMCL_VERSION +#undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK +#undef JSON_HEDLEY_TI_CL2000_VERSION +#undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK +#undef JSON_HEDLEY_TI_CL430_VERSION +#undef JSON_HEDLEY_TI_CL430_VERSION_CHECK +#undef JSON_HEDLEY_TI_CL6X_VERSION +#undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK +#undef JSON_HEDLEY_TI_CL7X_VERSION +#undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK +#undef JSON_HEDLEY_TI_CLPRU_VERSION +#undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK +#undef JSON_HEDLEY_TI_VERSION +#undef JSON_HEDLEY_TI_VERSION_CHECK +#undef JSON_HEDLEY_UNAVAILABLE +#undef JSON_HEDLEY_UNLIKELY +#undef JSON_HEDLEY_UNPREDICTABLE +#undef JSON_HEDLEY_UNREACHABLE +#undef JSON_HEDLEY_UNREACHABLE_RETURN +#undef JSON_HEDLEY_VERSION +#undef JSON_HEDLEY_VERSION_DECODE_MAJOR +#undef JSON_HEDLEY_VERSION_DECODE_MINOR +#undef JSON_HEDLEY_VERSION_DECODE_REVISION +#undef JSON_HEDLEY_VERSION_ENCODE +#undef JSON_HEDLEY_WARNING +#undef JSON_HEDLEY_WARN_UNUSED_RESULT +#undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG +#undef JSON_HEDLEY_FALL_THROUGH + + + +#endif // INCLUDE_NLOHMANN_JSON_HPP_ diff --git a/resources/icon.png b/resources/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..895f0a7fa7559eb48ed6cbf6c55678fd50941e1b GIT binary patch literal 503544 zcmV)dK&QWnP)0004nX+uL$Nkc;* zaB^>EX>4Tx04R}tkv&MmKpe$iTT4YM4ptQDkfAzR6curlDi*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RRt)YGqgl{F$34}bq^0;@1i`*{oJ3USI!#@@Cd|nOw&!`4dR(i zQ{%i(9AYI=CO#(~)9Hf5k6f1=e&bxU*~>FSdL}hb93mEq9V~S)E9naHG;u^$RLb{e z9hNz7aaJld*19KuVKA?*q`6Krj5wB%KoSBZ)KEqRCZe>eq!>uie$2%`Z2ObslE_sC zBgX=&P$1fV@IUz7tx=eobdrKG!2e=dA0t3u7iiWk>-*TUnkRto8Msp0{%Ql5{Up8K z)*?qh-!^b@-PWW%;Bp5TdeTH)v?U)+Z=nFZpV2qvfc{&cXU*xYwU5&WAVXa(-v9@P zz-W=O*InM--Pzl}XIlOJ0L4sl$b%IycmMzZ24YJ`L;&dkKL8#HzkweB000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j&GF6*MV5lRszx000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}001BWNklwU-voVH1>Qvk7UpLKJW9KbD#UZ zu6^yj_S$O^w_mUOuTOmE6L%my0^%JIz7oJ!1Na&dUr*ud0DK*YuLbb9gs&v<4iImX zaF<+OM1TPB^vBa506+r4^lzk~h z=2+*{xccp$(3f1k%iA&s$AYm%u`cuNx6&FL>ruWZ&@3*0G|F2^vOm+dzCE)TZ^ma? zKiYT!EjQzIi|zie&m%3BX6?{EK-}AD{j48V$nV7E^Nr^yj(as?3sWo|d&Kv7-W`4) z_V;#vMyGX>*SbJ(c?b%ThT9eS&Sd(#cHfoD8rAgYFuVS!uzmnNSlmlL23Ef_!8q$bKBGTgM~9*_L53zNwXPulDHIi z#xsps3nhqn2=McOJ_qr)L46wF3jjU==o0{b6T&9}ehSoY1N@wzSKjl?i`Tc++w1#_ zx3}PRQsh7V#6iGgB)$g1Hv@PNh(8A5{Qw?~hhm$IE9V*)<-py6azUPnE-`AOu~h*E z7-%h|;xQT%APCwHp!i`yCCoSH&ZR&f)P(|5hDae$2&D#IVPYAz%^ zTTnF+fCKyp1sM!5r~y4+UrCzwiht~%5wio9<$L2a8W>5=#yDAP2*P`DFM+fN z61UK9px9YsIr)!&8Sx<(tW7?$?6oycwC}G0T4n$vC-q&dss+qQ;c1C!ye40<>zhVU zBF3~8AQ&q=U*8G5Sl9ImhGbyJljnZp5;NE!?+~3$lQmhcvNg5$dlvzd4s`Ao_ys!| zYbnBgtf;FJ0JGc)hFBARo(-g^?KLA>s*0-7u2^cKo1G2FAk+pR#g(!a2dagGuadmK z3yQD+m|i)e0#scGVJ8lakAFJPN-lz2yr9Whw6l`g)cf6ecCOYN*D;5X94bzQQHJXb zYO?1z{Un-ft{$}V|ImdDn6~6C{69ynUCJQNtQf|65yKJn<4e-?b zd}$C5h4r%Nc>v>`?oma-6eNFgAhW zCBfrR19Xewyi*8gZ1Thlgrk&R{udH75B!5ek)gh20IOXJkd#&FZU^y57+fll7 zOt-_6nFz2YZ7C3Yh8|MqHCc&CS@_+A+M@mp7jR+y@N02CG8mOeJFd~XtV_Yp5E$b@ z=NR~!#E)*Jnuh9njZHCzrbwF|pyxpE=KS(QFBU(2SCqDF>-R7#NxBc0sx|fPW*9mS zwyh#ruO)YEMx~u0hw$mwF318Lt`Gt=5*aEjndjJMAH#blW4P6GTVA7#Rd!cXT-98 zFR1Hv=p;wkM&OWD=I+efDF=hItpdG;P?D5eo_mW$N6q|OgT+#zn zi0Ryt`cafCWY#N?AdgK{?e3og2vCtIE$c5A^R)pgjk8Ax%(wOL%m=^J=L>rv@RT-y zeqXeoyZK!;w~dp9p`AiLfd4iw)_GdnI7AwB}x&;8)FRmjl4E-K8BLOXA!ShXui=JI#sVsXj1@eaaMCqtJo{ri+rgaFS$>`u;P4zxU~gQpSw|f^ZNKpG zz3TLJ7QWehPD|(KXCfm6hKV;ZJu>Ew7&%v6Zxwo0pyv-ZmVsGB8k5>yTiigmy>XGk zZLguXeUwefc>yxrN7ivEW6aB22;0b0KN}Q4?g|%;HP10Nx8 znQ3x!uCt~dJWUMyGv{=ojx~vXrIP6jSQ=eR&rpVDQf|ER(EAGih-S znD7LR0|d}cf#V00y3dj^0H3EP^2A>r9cY?DA%ON6YwgZWdp5GH`vRn?%b(COT3d*q zTf(svnYLyd_+XYG_1~|(eT1WHUOXh&VA%jOQga&hrRzmtQhBrA13ui}QU5S&hIqo5 z*HxJVwOTihq9D-zgfoEtxkYzDJX6PTY#Lp0Y+$8ave|-ycez7aS9C{W1%iEgWa?B{ z8ZU-oEF_ZK`z!6!{QO36j!;xZO+u$pG~iYfu<_j9uI0zMlG;n4Xky4XWT-3FGC8L5sQrGj$`0E7a2W!8BX-W|m1hukCRmnW(t^Cg@oag;3K)`Q)! zf$ZMH<^_PUw;G$UJhoax*HBZCMqt${ny5olYG9UTbRFxNE|N>vd>;Kc51dzc+hLe` z+L#6aHOCdo$Eo97X@3#@sFZ&z#6xFVt=FXEIA6H20JX6jbL_-m%ESWMV{_?HjiiZF zkb^0U=$9>e__^Dv@)iJiJs120_|<@( zCirIs{n6RreA}7B`2)abgyBU#>j*MTyCo)SK4HMvZL|GZ#AVpfZZVmQqIJsY>OwA< zf<(C=FHZvnGMgb&B)N?MFeK=;T^SQMHB@@fOxsw=dU!g^ zW=rsBv;P5A-_iwXXJhwWgP2TY&7mx~$-o3ig-^E}t;ilpTIlFtM>y&dUN`66_7ku- zZ+IzmqDm7Xbr!XaS+La^h&07+A*&JbROQpI0)Nf~hyr^uoq)Btq?*o$?~_?rk8#82 zad&QcO9|OOM6@fY#nQ2y7xs;o^IKl7cql_#-*Cy-AKyu_pG=M~O(& zDf9Vg=eZ+w*y4IgNHB)@?ZzT8LFmE{j&XyijiFXs z6HRv#=*E2v9N*J~L!Gj?u(GeH1kn)_Cui1c5v5hbkZE*3c9GSZ-;K4*0a&x*Qv`~T zD!OKM(!&X5o|;+rNzNr|o}?B{CGRVvh@a+H%4=+I5_NrUhnD*^0~crNlK%WU=8~FZ zejdPNfIV6v&Ia7y8^ue{I0)c&0EsdS7$$h>S~V$Ony5tgCz_2H8W2!F#^emC$Jj3b z_z?jAJAhBU=b0C8#|3TyfY(Lg|1|)9O7s?*9JqEAa~jt=!E8LS2i7@ zxoGJ+)*HP(1-o%lr-WxF7Shp+QoS9z9FyPM*Z^r()lzGj2+yWqKI1lqLLZvkRO}?u zY%)qO*wp74%3YEu_J^nmFca`=T3l?Bm)F!`yD($wbdt`<+F6NlhBLl<9q0O$ljjtQ z+bYwSXJn(AKQer4ms%dj`ntdy{T(}ZDP4T~Ijzu7FTW6IakT1JY zVC%+EXK0Wv04R}@4o^~@vD>Z!4T@vO&N3{oGI1{8G>>0cKpPjhxh zccBYFnLXLFfG_+SfFC6B)9?Avi=Vu$LT>?pFY4C|Cwl*P3iv?)|6GaJEoytd+pn&J z?~N+-dT*Y`cMf)H#9+|O{$+YC!{L$zVA?Ki!);fwQbC%LJ$IinNVCxclq^D^C6*u+-Ro?1ac$@}fq9$l z4xRXnOxP@gZGD7!1^>BkUibo2-39Be zYr1#ixx9-X0c;v=~?D`hguVG;bP#!Ob3buQF`>54-LI z(2T+%7ekn1PElpOfNPDr?tBSUy7WvdwiRgKbG=F3)cMSFeX8~RmqEnQZNZ1uQXVqv z0+$@POh=v$9nW}rDX?%H zK5mQWCwQd1g_*T2tayhe&dr8udWi8gLN*;;Em-9+L|jkc+2!M%m#tZXWtD$UXTNgS zG9*Ks zkv5q3^sK*@7xA=fJ6-?z^^J60iWe}_C8Gn#NGLavt#BWrIFs*zwD!Vt@Dry6GkLy4 zU&Wg013hme-pic9eXh|1pAX zRj?}OA5tMnvz7I8Hl@yPwMBg#36{s4a}UumQ(pw>=bcm1bfjm^1Ft| znbG9k^>#61Zl+s1iR+z)kAr?a1Kn6RjTK;f57p;~FbieL&x~=kM*&9yIs%{96(r&Y zz%_`Mjt6|~)q8j-;O-JaA1>E=7s7$UI}XA>b?;RiARI;9#SxEO-QW&Sph4am!iFS- z^~6SzjpD=x6$T;H}ufY`wt8uh%~Be z$YD4Wz-KDLs4HSF0Hgi8piqDA2%QU7mq{_hBJE7#Y%8Xx_CW#v6@dTesb^lixvg4n z0f2uDh5wW95cGb6|23$ucD<&~?*7t6TJ^g^>6h+8|{&`1H!v3I4dWfkuBVBJ-?YuXrYT+F~i*z>DWqi~GbVOG)t zyN)?x`kKDZBt)}+R_7vfez`WT$hFLv)1(_~guM??x`hglgyqm!DYT>eW|opNMd0<= z3P@S9&FPT+ZvFf04GdID$*roQeoEeyi}!NxOqCv01UTlK2?Xerwa-{H?T-jV${|uW zfhJG{d)(f|?h5-M{uc`y)QqYHE^{2qwtgtZj?b}XCjbOsvI+o3jgQpbOn`!^h({1W zs5IK01EwD;sNfN*)-}$lb~HI_ZD?K!PM*tBbnf39@wUkkTX$+!JD{!876aH`+qG(d_XQ4rD{H3TT>WCth+ zFCXvV;gNVn2mFIq@8L7YE4-ppq5nX{$8HYzyns820RUVruk}?2;oWy`a9qHFufDp$ zH{N}SFTc9RV-)W323JcSN2*l^V!_w)GjT>cQO_}1bmAn66(68(G_?a;n~k)_Zx&I+ zv2kcnrh@I>c!s9tYe6RyR4t;jLCJPdDMfZ~)WS;4-?)`#o-ecWg4oqWm<9NhPG{?5 zHnD#L@=hP%Q-Ho7FJp=L=21FC?yA606gO*F0F!w;UtvR>Z*=3m3`7#5fhpsMj#%t+`pu__?O7pF zNqrL%yH_EhLz?W%8oEm`jeR{Z4c3FetZK-xAm+ zQ_LNwaAnH6WDyXY(PrB+m=SQ{9;)6%P?mNOS%pmeqO3@uZkUu9{+@ z^cT=f4pd>URQzuifU$6>1^9WTd`Gq}pkef=P>bGFgR)F#b~5y(P~@y&yJ#%nH6WLH zJ$TYs&mP2>Ba2m(0W5aDb)pzW&~Ks#P$HW~2j6D*(wa%ulnmfb= z>d_4~3hNW^F$cd`XSc`4GCdy+A;HPuSM83TJ0~w*O4+qzV@xdAHTlBLlM7reZc2HTd|tPauH-yVF>vH_|l=ilo1xJEr+l178)tt*J}xMrBcJS(vL} zc6)PM1aJnw%*_Q~gClx7@>SA~khD_xPelB;PkrdcPuy0uw*bJ|uTMPv#Jd3e0Ko5? z9R+1d$;3|>(5l^}uH83tLBI|jOZ6Tt?`y=7U}D(2KtZ=mW`_0C)`Ax_p;HsZmFOZ{ zD0KN%K+h3b+FTr(j$#U0;KU-OaUXc?Z1(5=!5?k zQ0~vI^J@9xrNRW8!k%h!Ju@|tj^6iQjyI(g_o?~Sk(bS8sHot@+`jQQNC#6*tfLd`DkoQWV(to}#m+CEk2lNDeExWaUw?QHfA7IP z+z9yi%@sa&Jm4tcrGJch^*sPj9FF+fE8#17#5?cY;Ge$#3f^(J#$5^rJ7--NDdwz) z<{rmqmqF{gh}nR+9{F1V+?MUC#(OciWr#Ln6yuEvgvX*<`|)a;zIK|(DJSgrg90$V z0p#cgC)J#%=*Ix3Z6O*%*H)KC{j~Tp+JxVVL{+;J1CgS|vm<~{_!%A>a5JYKa`$NFmgl?u3J%^}K zDF0Eh9HpCPNfhFIXPkd@F*h_3P&;bPUD4y#M@?C*dEt`+p^MWQ0iFr);9M}MBT&7@ zqW{8_dsifERu>`^V?L>mws>d&fsRJpi~_XRX^Fcg6U?#vA9Om;YguT5dCoF#LihXa zhca<~{0CVCkm3CplY~ju%1MW)pCx2s3GC<^?Oo=+8kNtXhOCawBFij=Y_XU|m6FvN zi|Vn9Fy<+yNpVoyo%wmDaHht_4@vzwIuWoLAE^6|785e4gZ?B!_HsrkhG&L%K$XGV z^BX_Y6KkW?e&_!SKrER-8Wowb31H6XbR%QR_@zz8C(@oWO9Ka=rK+$=_WC*29o}3i ziYRTcCJTVGx*49WMp0r7saXJ-1=J)L?Q*k9iB&lzb^d&&TNOY6>~{7wRt@!Q5$S@A zJlDC*`y*))mEE(qx@W7%f6G8*6K{=G?_mCg*=*Ei&oKb#E6cKzn-Z6f|MeYQi}XoAjO=qDJ& z0CWZ&9|4IKm+xEWieb#L!XBM@uUrToH!j@!LhD6A@_!KYpAr0(r#^IRCHR&H0A6_d ziFbqiK}g@-_9aQ93I^o8QPl3JkHmhLYp=tPwwqXK!s~o|?4HiF=thi*B3yub!S*6& z*mE&!6QL}%!^z4URx>`Ui7-~~Z;mWntOe8=A>Q_JC* z55YgSvVyV0mIUcSvWaGoY@N0CQ0G)dJB!5G%x=8Gju{@im$?odzP#2{$yfr5%YXo;{@wD?m)Cl!o%FXRwB4>XOq=NF&gBMt zXf3FMCP$ek-?K>AouPr{7aSTOca%FCdXQ( z{{rrw;>`L_ujqhJJiLdWd-)N(a3p@`NPPTwz^h;6y!#%2cOHcM5WeB+h(CPqRebBc zSMb>328U4mGc|Hg>w6mkUnbrmKZ{| zB0_~^001BWNkl_;gil-COhP5#TiG{ZosBi-c-d3 zR$rTC;tVCkkC1d-ix!#CUVLi& zkW%c*B7w2XzdcuFt2UZ819Af=gPE})n)KLh2x?NfP1?5(Otlc$dE4o6nI;mL@^tkhO4Biby>rg!{uSD8y7J|0wr*$f5u8EY zHM=Hlg)@R&1L?r>bL^OYmm`+-*ULYzi|HnzGWE;VAx6wx5~Tx@n;&ZmSHT&CQn_S$)TJz_7qlKj!CQ?%%IUw zNY5-R>TP7WwcPZs-h8aiWnKg&%gJ_>bVgFitsFaVT`yy=!sr8X^>68b0QPm1-5{3Vh{{(=4PtafHr0{N)ZV?luh9wvN!oIqwEurmDHhSMh+1>x2$3&)iNt1-diz& zDiD@1Ol7Jzryi;qSsBTHP!3Mwfbp|g$Dv^lWCp3t5o6EZ=1lYKOfe^3HUdy3|F~N> zx|~jD(KgqG^|`Zi`(nl^$O)K2kw=>V9D6FT0hm?UX&I^LXv~-e7js9NP@W04$|ueO zyRWB8Xu_JUAgdFFK%OYjF{gS`|B|Re`o;#-gWO4eEHS&((NAy3B#H?*eyHQBp1uTMSb?#Q9N>${j%C- zyz?|-7a+r+-BNW%T*pZJ!qBL=!OUbxGcdJ@O==i)pcDQ%0pZT5!X(jb^tv9HHwrL2 zqmnL6vC7HXD08e10REhS|K`2Vy!bn}0Kl8@>l5GkIyxD`cqYTlVY5gT1S{ zc9Yud&CbqgDfdUsj<0T`5thJ%B2dU!d^g8qqTfzXgf19NZT@lxWG%R=*L&{PM?d70 zBE`fe-fuPv=$kS-O(>>QFzHm2*I*fhiZl^*Y`P$b;wn3{ji)$f*Vszlp0@(Sj1h1V zDZp(RdyT$Y{?9D{yFLkW$=)0f+_~b=J#oRwsAvmJ00NnScihjJGPpkb)LlE<6ID;U zZB8W>#)plvINH^+7Eq|=rI>f*oXuo~po1oi%#Q?f`DSMltXJ#*A@-a7C9#J*i~$>e{^}= z%{!VhLg)ksdTrV_XTn)GN|vNtI@wCE1Lj?z6MRh$AYqp`- z9X2b{G`(zxeEPWp+%dcOlvbmwBi6zs3X^Utp%MI(9pOIJG(a%f+T$L#=A^G$_stT<9ICE$1KIZ|_kw!a8}SvQz2zjIN0nb~etNken#RI8U=b7%EiU zGeLJ*Wvm^zET{?q_%}iQ!5r#sAY!d>etkbt?WxLauEij1cXFQ>E13 zyA5H(Z%GBi2IAPz49d+M|I;oUqZWMFvpr$cwqZ;HJh_iP;TmePTYREI*K19#aulM1 zZ+hYL!PMM1(CrkY1B%Txky-Emk}z#lte~L3UCTo8TmN_Zt>r}t7h_O(^%7KKrot@V zFy1pfZI00pflcFqX?BTC_#3ls4DYpGpL)$A6S3j6eKHS>Jk!&Vl?h|kPE8Ir@APw8 z9*-Gmkdu<4Kc>@(zTEbWBAbeIn{nB=grm?OGtSY*liONazrS_Yqk8xBrm9vTF-r@( zEmL;6?8!0nxa|gWkC4^Cj7QnB_7iBsX>7+?Sz;vlh?2wow5m z4QwVlwx&uZ?uC1oYmTwkb#yMql8FLl{O^d8u@?9n68_e6?|Ten#fs~BnC<*2Gj`<|R)_jWYoETsLGv4K=>=6;UQMz(0j6h8b-O~N)(y{uhC#`d zyB;ulZ>zQ*;~X6)e${RfXfyP2oIs`kw5dQlZ7+F!n?E?b(;jKv4OEQ$d5|prf?ut5 z40G2%o0`*SA48(9$#Z5MN5)y9h)cgTN5-9sy3_1!zTZJ=NLD+S_dd@3?8Iw!OQO5} zOH{+fmN0YTRWO!b7IrFg-t1;QV4?-pUUHi!kF)H`6y-q|4u@c(7fyP`%Nk7`-A;55 z*q3nM^H^(tH+Zk3@iRu9V=WCx11}^`x|o#SD~l(prgM%?b@c6W;loE+(XPsv0VJAk zJEvOwY*=Xi0E>y3YWD^c?~OTkW;dElH68nbokmB1a~y1r7^(>24bV-=k~5#@)iSWm z{fG8`rs!VaToBJlxXeeRDI;^wvDq)Rj3;IUQpXwuAR>92n z-mU+XXWi3UOL<9Uos`GzYtE&3YI@Pmsw8Np%)3QP#vDg9^|hDIQ%0-UEEgy_fO!MHmn` zQT-2Fk7#_JL&~Fs18eV}Wh|&ZDL)ssDNBjT!1AAmtH_4HzY5#WFM z)H5%B<`w{WV-@}fK>rfJ{}s^vJr&m3?O4(6&AT0Hx}7f8*Q;3W{&{D?R~Bcq0aA4m zqKCn8CTeRv@rn&QT+^EDJxh_j&J87U75gF z96wR&ICwXmrk;;fybO(knux|VvMUzY3;Wl+d?u*BSJzzX zyVQYj>Dj0evTqV_PsaDe;-f20zFzHoP|ks~(hYVUfC2O|icCh^Sv7YhIsRneGOf7s z>r4PyY*w_ZsmvKxaU+*EiDz!Qp2i6grWLRYJas~Wu;>%VE|zfw{$E!oNR% z#@(suX3!JZC27E{4UQuV8F6EDuCICw>*v+u0l)F^9)A9nNATh6J9y#v`kMJa_w@*X zcVC^x0p5N0WqjGyH4aM?=@9ZC0yqSH0Q%WuPEF3!1*^?t_wy-FX~qMUv}xj~kqu4- z!Dw$1(LnzM(p$^}dR>fE<(wJWTd%W3+D&MC;`h>d5jN8`s;5P>xAzCzcI%<;L@aJ7 z-D^#(Sshe4!BP_ER7F^c!glUG(*)8v%IX=_kJmz+VCIGa&AJfg()i{}{=P z+LG{f<3?Il>@Q|Ix3Y3+!zOLzOKa7auQAQ4EQl3r)4`eci7w{ZS^4jnZ%(hl$&t)+ zo!T&q%t5CfwGB66msq?L`E*lI+D@Nk36}E0pOL)USrNu=U=&PaNW$ob;Wdy(L;)Qx9qB-`z@V(GrGv`$9xv2zOA+9?8P)ZAuV#PyKbKwoyJ%kh~>?ktoSl_{}I z>~@NOUX*Kt z^jT9TUB;IuI#W*{`cd2o=@aHS+`md%CYN;ok;7qS90e^8v(%Bs{Yu~{RRq*ZImQfb z2pZn&WlfDcNwHEJwjiOFV^OHRtNsng9ZzFm8q;fWWQoDDPV|oEvL}cHj8nsfX8neO zhRM1%)A^G|WBTVs&H<2h|IyADL?$kKoFjqaKIY*K0X7Zu29tNuPsLHfGUiDu9s>+Z ze^HgdxScKGcWA>)vYbcO=G@qgA%<-+@VGs$(fMEY!Gq%g|M1~`{L+I*@Z7^UUhxkA zuK@Vfn=Aa{tM~EIhmYbjH+OJ@6U%?2{x5$%>bQ*o+}QX|$pu0;dN486WHcjBD@_WY zzd#tN5mHXemH8GmW0c*uMn21|@so1BamLX~1x5=)F^~E}we|?Lij-S6TXRjhh-VF? z{@?ioA^b6b|J$kS56p->S?I62e|H)kh5@(jj7kX%2gh#LpP4dvAraA^plemZI{s|N z1XR%S$_0;fe~6g57FI^jOkk@PN2TkLu2I8tICK|i%KU2~hiIV{DZSPK0j;m)vir%3 zZPKL@Cn7;;)brJ{FURNPu%b)1aaWzO*PP>p-8Ri@Rc8n6{rc4Qy)El}gj0Jb*wQXb$8Ns9e z9MyMk9AHAys0l;^ASlezC%SWF)%Z*Rv(#1)Ev=(eYV6oLv7^Qrpc9>xp}J<_wyh%t zu{LucX`bLdQBrJ_=<0P>d87+_?AEbW`O`cm0KHV_ISbkgnmoHrCIG#fzjwnLv))f~4G zO{E-91RmTR@bQQD@Z2)<|4F^EQ~WCcfB5PK@4fo~@4EZ)A`A!|7U};32L1mKfE+TH z@)gV(cl`jg43tqQ=b8BSAe_)^Q{f-aZch)4d8Y~0Kj+NVS`(f99VeNZVhltc(KW}O zI$Jzv$I93fb@c-~ZH1?cBLN}F;OBJF}>7aCf?u%hI>_Mi4yu#INyCU)LT|h{) zFWt7HksU&StHU!PaPUMIWCBT<8lQE8sX~=70i&Rty>;?v`4b~WklE`qb~$OPP-5;- zm}OEyF&O}e5YX8G6N3a16y(>$F+`G}2b-{!_5I0=ppvmj%lDPtGmPtoUSyt6h~gR= z_{_MsX$~9MEe!S>MTCos&4)KWizcpVhO@o-AocAFtyVb<;M zx*f>En6&Y-c5yHrTU1?ZQFC~@(Co8t@1Sy2VgrGLa}1TvsrqsqAXjHQ8K%u!75b7{ z_Uj(tsn`#nFg6h4?KuK?<#@m+uJ7U(A3TCzcoP)=>mB-}4mj$7`yk%N8{FY>$~sK( zGPwd+J%GVbiSR79ae@%NBdvTr;}`%wUjpkMq=Kk($o*vTehPHv#ZA}8Vg1oIxHaFRIg>V(#w=d1vlbR_4#IVLMz6_k^u1z!G9OP z%isG=Z~MDH_WVn4c&C6je1v%6=_lR|@V^7_9hbGPDjbxizd{!(^=cZnF;y**=5I$t zI*z7xXSJA~xwuVr0hy`9i3;cdbLt2%H}5eKDs0hj)bR#c=f&r=6T&GgAk=q4*{ge| zo-eJR6SO=ymixA)+pW z9ue);pynYPJaKI z7t#SP6bWdxZYDH@nI1vxBuh#&`1y=?p)mGswzp_oIBp{h!h@SD{O0vt{Orq*;=>QG@JYS#X#eLr zmEU@}!F%sLz`O6hgm)aSac8N`PAq@{Kn$m&})t!BHl zAGwrZ>?EnU16&MO>4HRV|E#Jg@s38%JYgD2q%J^L6h+H{J3LNvE~|}>SY~dDhcCn+KH4cd#rdm7m0P2;p9Jol9xwN1hEe|g#x@eortTcoz@w@wX-T%C1yH^{aXt{` z-)yyb?pb>6mfUT$WL;v}-U@+Tl2h#_{b#^|3KpQw$W4#G`tGhu9>sTJ=1FD2tBtyy z3i@#{<^AS<+8WPTXVgAJa?V02kL%2026LfT5^MDZo(q=6gtNmbT_hN2Sj>~tLuv%A zOJx{};gk~xW{+nns5Lzrz^elN!vSPF&^xcxLX~VjY-6voS^Y&DHZ+2P8el9#tn0jI zkXS_7ahjcD!#>V;;n`v?7TCv#_KN>6xVGmGet*fQnpA;ZEXksKr8zwA#H^}p*d!5% z%4@~|?IKj_BM-7QZh&zBpq2T>0W`Dq1Qf8FA%^rt_I$WY9kHhX%h4(rTMNL27(EOEPL4XZ4yH}s3dFrf?VM^`D`;JEb3gl)8VfmlA@6DucBX+LKo0_ zaX~aNGZG?QYbdUr1j}L+omed4onk)gzg2x#6}vH&LIc+6^uNnHX7GiNvOsf=4Pe6U z^^}7yMv#qRMM?N9DoqSwLx$ayQYiXZ33d?yh2PaKpse=iU}xlv?jNLc^UsiIl?CXF z4wzkln)m2*9TfnYAsopxPKHn%YxW6*pu8Ij@D8{J{Nl+Xw8N!Z?Lc|W>CZ~x_b}i5t`iw=JX`0`%Tt^>%bV<{ZmR-mDOkoxHWDbrJzL)S;t|! zz@G&0=bwB3<8QwO0KO>2{}bN;=&u9(OLaPb-YxVp1k8uPK&4g4kwjuuP|DUe_(@p-ydom&e>j0%XJ)(c-dd+Ls<>wHq9CjiKnhx- zL$f;~d@8vfC`s1;Y^QI(TNq=c)N5QZDv+xifEmXr+xca+06}_=J!!41x2hpqq`(uY za~x(G{?)AOIi=$qUF4*uPapNopEoM^=2HpvFk)oTaIAT|V=HBO{2EgydW1Jt2@d7o zaa={0*k!3Xb%|Xc<4zBhtTf=dzl>$EEXsV#nY!gQe`j@HXl8=9Vyf#Z1d$;sJ5>ld zd84cI2lm0{h61I8-l@l$><|{fVx~%iG=toQ;YJZBX-{;iS^qk0_w~S8n?>Uy>NADa z?o)OyI{~;a3svsiVA&(r=fI)8vcY^B<7CnRiaTGrR<<5_V0Ve{n{&vv=9ov{;yp?Cj4&s3mlAyYMu*fJIh(CInN6z~by#p-kbhCq40 zpbBXA?ZsiYmqB(;_eKv((V!_NfX|(zI#2X$-xk)W8ovRKe?LNa>E?jnx;fyJZ{p&A z{dyI^-#=dA!w(<9#~wa{-?_Pq>*G@FA5UlFarxhx!`wJ9us#n}{hjsSX`MEgxI4I#msDWitYy!79# z+pL_Tg)OaPlu;86)d6DqUJ6Vs)=uYIZ>#`3#h!h9x~RVd;IBXTzIT4ZEdcNbTl_x- z@FM^|P{X2{6lUJ#7z@=sX=0h6(lue~H!E4fC8g1bxVmgX**A`Anm&RjR4@jv{>zaI<%LbxT?6I8h(S++1`Y{Y_$B6QqtIYsmD{h zOk1;fdszrmPLOGnC4i>7^?*n0{{RZ z07*naRNp5naLH_QCd9oxMviD>HI#Xxrnunctb#TR?Vf7u&dT<^QrgH?Ghh>(3*Ov{ z0N1kCqYD)kiN~287HUQ7P&t)RBFGf<0C40O~7QgA1bwIH#Y((Xb8m)6lUC18vS z;#CD?M7Fx!67+cH+317RgJ}$4hM4`xIxUnCV4PgxK!7Z%Z~N_qALyN-uXhLVN$ z%*6jx;l^+mQs?$8SxO}}pceCZqa}9=>m)&(0**)G<>M88`*;Vxb9~bndY%0efWLRV z!gCKF!N(pxir+il!L@*E2-k}>;LTzaIM`yR=zFvoN+|#W0FGQm6@8CJ;aAUZti2dD zI70KeHsNR>+`QKjM+j0nZZ0^A&7sJ4mF>?ZM~2qoHcKdP4M0WgKodBuI-Rg&d}A+7 zIKY#K-P@ycbHXr!E=JRb-MCIWQp*IsG1L{~yhFB%_W}$2fPjxY_r7;N^+wuDZ-}Vz z!qZP22z-~opV|w&y_!}1d6!|UNk+B_D%(FeS zfnvAc(&!ShTUTY=z-{Z)Q>}?+HW95=pdT<~E6vc%kpq{Q7@cDcR588oHB`bqZ8m>j zl58SR=0X*_5@jyIR5=Ivebw|lnTXjjRZF6F4m4Y5(0@NyJeEAnHA=(i!SM1 z@idi+gWO3itSP(i?4`iccQ=Y~7}Jr(5C-;`3)4pZ5KSJ88;|YncUNkTk;|P&&+Xs# ztZA0}G%^vp^wk;{Xj(Yoo&>r{IWo(6nJqPo(&{u|RSlv|~}!a1RxdG!g_s0MGN=?i3B!7Xvu1_(AS4opsu?GqFc;mLep8OP#e`kw_@(~dq4F0*9CapGXP$A`iZ*$zGoEwO+rmC zNcy38#RAm5b{FJcss)1rDxAP_uAF^GZw5?n7gM*-5o4RLQYn@7O#P}(>zM0uout~Y)zPq zp;Op(7yB9F^LdNf^QCMw2H~YNqGMEOYGd%wdaluTyC%}(W=m0dUfrd%Y=aCSmaKib ze~rHnkw#aFrJ}ohu(EJmf!?(M${5A01-Ex9N0w7_X40Iq7}0gb`#L%i-Nb@SWI`}0(OO^{ClU=e|a@!s~aJz+=hGuB(1&WQ?bDCKNH^NZ!@Pz7Yu_>=2`0Tg~p z!1p}+{>Sg$0sz0i;{P!KKLFq-da6H~0PdyxNT67Bdny4i&y;sv$+%{$Zy4tXXHv?0 z)q2fx3yZl3*Y5_1VJ%XHnR1QWHdt3N5UIB!luR~M{pSrH%&UN(Y*tYVeOcijS9)R| zix^6sir%aN-DLF3Rrb-%-Yg*iB~?VvQj3aNIGkgzKZqTgNXjMxCKvJ<9TaVNg3WxE zX1H5X`5-mVb9>USR4)PlY%C?b6>t_bM*1WW#xtxAh2`PW9A~7Edu+H;RcB@poxT?Fx#Iz!zB%A`_12;P z``0Tt2?Kuk;Ujqd`cZr)fB?s34B#l8X#Ubk@K3^V!`FtLVjRy^5`A4jECp7JMWWSN zqT;gyq3*UP0kR_yboy>Xfa*bo$j-v^;3Wmpdekvyv-Dt2i zeHegp6lUc_ptjME%A=|Ex3VZN`m;XF2Xx~|ip|bsEzS+x+-fRXcW%r!{se&^c)Vv{%BfA;n) zd@Vj-do}<;>Avo+T>8%pGvlgeJ1M3!>)w3`Y&ONqhe%0{P8?LoUD@tUFpBl%{alG~ z!QzcG8MHX{W@13IN<1Z=Op&OJFC-@nCN=w%^Y3+53u3clrM3r5c7Z7~l@m*&`z(x# z;UU4#3<0L^t>8}f;$@;bZZ0C*Ychxg#s!`&J_`*vIYflG+0OkV*^ef+N$BiFdqbAu zJ8H(T8B59QuvJ%O$C2QfzGc5FBTJzpH}8=`cm{NwFTMW#yU@knRHM^&OrL;d&jw{{ zJL_l+w0JJC6qijKJE_yLVJX^pQiwea;+I^lW`kxf4_HZr=^4l_r+nt_w)^N}9FS(J2NdId=!B{$?REjs6`{Jw zT>&(m-zA~9a{9UBQm7q6t?{Z3_|5Bk_~nQ9@ax9|uJP9WIs*8#4!F@3?tyq4kGRL< zHnPXi_=@@N#uDOS{iVH-v==gPHgo-AXnJhtO4O{`wis);@LV+dN0>8)3KKorbGy@q z=>Tjat?}$p*aKO_PmQQ2Vc5Tzt@kynh={>Sz}!-N|a`5gA@`kaCztdaR5I8;QOaDCT+IL-P{8uu}~5- ztK=*eRb%f3R#YkahIUd)oL_3K4O&(`Fd4&Tqw*iR%xPXIdf~Ex!&8z&yDO37Xx(RK zO|=P0rhfM)hyL9lNK2eP@CTttU*D`jHz+2;;Si_f|1 zSj42D#L;}7Y`}=$!?qafpF#Ax$OdHf7u@z!J^WqRF}#dmv(e^mT35Ia;%&Ua-4YYR zbBi6^iFo*d)ySDGC}g!mQwPwx(Ja5#$8-hYx0`h@%{m`t-BMQ;l+@4ToYDu)qmnty ztU==FRpG_9bbVe5h+UF`aO4mk=ZbJvVBpbAhg(5;8gSp;!|p65zk}e{e($>;`#*l{ z`Ilb01pv+$|6dE>uL1n-c?jLFf@&$k#=y^e1e4&Ok>$;wl%26DXDMIsCSI>4(j++&9d_#OmY}EY84Gc%HcG5#cVLgg zEkQ!fGTUfT%E3Kh16H^iMv&p%oxd{nN9p%bA=wX12YkUHo-la3V!j0DoId^gGFkU}B63 z%zyy7(U2L>hoth4%zoR>i2zg+sgo~EDpuNtZD+Wc$A{wiUAme%HgMCt$Zw(CPicA) z3Pn{ejHiiQL1Q&?l9lGXby0_CYNGTP-(HqXGpKnaE}Sk$z|t*N&{tAWWdH2(4nF$u z9-hCs!tdc009e0%R|h;;m;i6*5%+jg3jKJ#t>8~e6Ehg~2$B-6yCobRG@TauUc8639W2iCX&pN{{S zZ}ZR@vgcpMJ;g#Ms4=BUX-|K64}ov|)8F*i-~RFEU;4e*(|&nfX#l+N^pjr)@W%lB z$$B_f%D<*0V@%QzBA0wBf1(}EopNwW`Prbk;ssqZp6!Z6OTpF#%s_%f`x9GR%>jlf z*q8U}Mt?9oQ8Fh((*T#iN)STTQF# zv!1-AG=%&}g+QW^Kp@yjX`rpJkz=VQ)=`LtW6mt5>1sT}i5?Q(#Ax=sxSI9@Cm=#r zQ=J#XWv(~uur_B*DD1jMs+pi1rAWw!&a|qdYLqrjfTY{Jt~q6s8o8DQGxtS1*Qw|o z?!ZQ)@FN>yW>L!)OuG-+=R9W#3X0*bX`s&Rgn5JwG~J;F_?J`ul-CknKs{kN%DOvY zxREy7PUTJ}Vu7?xhbUMH+6;EMw+enn3U-clGt}>iqf4v~5@t?%iZx)9m2pbU4>qT= zx$<^WQWuonm$%?^@*9m;BYcwN4tsG>?ssZ5lVIoyZ1&|*tu5UG5fh6-wt&)nQwGyzsoz>_Ax%_^w4 zSOXrznRJ9nk;EarO}LNPeyOlob`?vlAZK#uv#nY4MK_68bsRAQsZDUMKK>{gh(^33 z+x)3)UJK}IE(_=dj_d%FE7a%nsS3oYNd;-_Jg3rOXaOi3-btM&2<;^a-aVx;hpB+Uexw0svSXy zWDSl8!pI65Y?>WidOybJWDX)qnpuMx!n$G81|3Dim<^A~04Ac2xy%_!qmn&aDx8DO zT)HH+wQeKGhED6ME}lf|RfEAS;DmYfZu^{hk48YvtwHHd0f-`VrqNPV4UGno0$)s+ z8m)ZA&aslp`l@)oUAJ;#Kj^%x=X*GPG#FCpykfI69jU1gFBB1TI`>TUFQ2Sxh6sv0 zSs5RQMOCW_tDTW1aT<$K!RfE80jmspfBnEw6U)WAqI*Ux_ET55!g5{T*69l7*pSg- z?=))L%n?isIf})X9ARyAE&>)|-BUaR9A)iI62|)wZcf{vRC!XnV$Q3iw2*R=^kHA9_FX@2aI1;bR z!QwCR*8>2*dc49%t{=g#Jv3oJoWKAre?D&ObB)V&2cHVyW6fKLiHhy|yx7$94R{{x zJg2JvsGxe(ok@|Y1YJAJeDAO0x2chpeVr;Rt#7%mXOC$E2V>1;Djj^;7d-Em=WvoyEhtgKtvHM`tL|{D(nem2VN4RzZ zVh$|x`Yx)sg5hke9lv#Bs6hjhC~{x}m{O?nof$r>VN-4vKdg<5l`3O6^h9DIZUR#g$5Q zj)uSp>nyCA5#o2qs)@7in<;=_altDTvEmks7`lp*5y+Wi8R$UBIBU5jv>NuT8m>B< z9hsf?S#ErpMK@8Jbzjowh#E`I&9axX^4Y)xgsCYuHh@t}Kvq2O#i**kzc|8VURQ6K z*`1XAAdKR@FDD-d%Pf2#8N#tD(;oroh^1RS&bT`~;*r~0fBJO;;QwBj0M9>s6ra7h zgX<%4v)KXyM;*5&{&8aj@TZ>~>6s|}}uxOBsFkM(A@a|{f_n4C|^Th-^UkZ|I$ zTNt2q_I)~s<^F345CS%M9v%0sZXSyD&kjJSDgZ4-G2pOM zSB9cG>rmCiN@IK{p6@!EIy-P7*qG2=C`%2A(+)oNR~&pD2_T*enXJDw^Li;4k_7bYUA*Q?jO6Zs2cm9 zYL}DDEsVd$W}t28U=q`C%$=~t{&A7@pk$a-TGfUXPylW^9YBMjZU?NZA&VKrT*nMz zjLXW5<2fkM{-bSEb)MbKp+>R@CkiQ_IO{l(l#5f0xThkfsBgcxUDSVJv`KX=lFAu^a)iL2$VVc%^59lD2%9SCC_DaEvCOPHTS!mgV8Bx|ZB zjLyg1+&3d*4UM%K%Ehr+73KXFuE1D&io_el$hW>@Zs3JoXRqbA2wkM8V@C1Uf z$JLr9ZUH&s{$LL{k2pvqrlvPb;wdSmoHskaa?4G!rnu{hW$ag7?vyDetPN$tX#s z(8MNGHv`w{l-RjUYYQ?ap?0#;>Bv5VkY?xtHQp_~w%agkUCJ)9igqZfxO$?Igb!Vq z2U#@9U!RSwliU3T+dk7zDK=8DW}_w_Gd)jNOivRM)?w)-Rr{UN6b_nWJQdkRRCS#v z!+DXZLEif1r&!c_cWZENzo|R@7 z;*|oGnhXMihH98Jdz`zD+KuZdMI0=1AAxE_d!ky?_ODMD0gVvo3{B=tt*w7(o!u>( zZagO^t0wQp3n9Jshc6jh?#`GqKVF+hY~PwSU$fC1WV>2M0a`YYWwE$ejtQCQZgmaF z#4x6Kqvly|XEbBc7&J*DfXB@KQA!FdAz+7#vDyL$!Na8Mi!9zJdAwmtzJ+QdIBsKO zkrvMC_`2*#A&sz&G7z-ds49Z_oIujDd_ipx&7#u`S~7hQjZs4(L5Stl(V7Gg1^lDy z`*`lbBly_yfR}Ft0C&Fx;Ilg5mBk(4?S~uO<1vA*TdoQ~hf^bmhcTj;Y_M%%4$)dW z=KT+3Vz?yN4DH2AmZo*I0_-SO6*mofRg5|{X1BS4p-gNi%5&*>ZSMO^6AN!5xOUt| z$X%#cXku66{*sHGPVhD7b#WAlV6KgrUCP$Dt4_&KOu!<+a%3;5(mx~OtH1YMkNwP- z(jxFn1^|5W=_elp@IwH;-yARV|IYbVBO_T%VD z)<4hZQOWURCn;yMVLE4n^X|?}wm!v1sQWA-d5}90w6jBFZhE!xVn~=66#oac)m2NC z<`ZN0b4!w#)s;(8Ked`{=$8{aw6nvUIE}o6Rl$vCTpRe z(c-iotgFT~H)d5#alwXmTgm<28RChxyU7CnbsF3`2@qG>7(*P7#pT{!K@IlN`%3kI zbH?53olRE_ce(43JjWF>=E#E6c7v%RiM-9eyLBGGfrQDvH-2h$|D}(ao9Q|=Y`3!%7Ce89h^_!&~P{)F*p@rStl-wy5NHtT8i;PH#5G4oaVXbJ9?j})E3(2f*$~PYw?jLEDVcFGLQAZ{It*VJ z0{V|d8W8RJvdK%P-n&3#=n%}eEV^=rYi{+T$B8_{r z=3$*_F_3O!&r-Y3gxON_j=4xLWsDafIP=ii*P!ENG`g9oc3q2}Re;Fp6b-XVk@nAq z2WiQiC-4(sjOIP&V6j_(QYzyg+bs|b(1?9LTdy392QmxZw!4n@;4bKjdueh3k$wup zVIRWY{rT5&)a`ZiCaMS98i-5~p<9z?A7|o|M7E;Lx(%r4o4tQ?RR(lbfvLFW6*`5h zIHsG;v2+M?%p{pC?Na3sQF*s3X5(hid5dc_N}^5e%3z^`0^y8uvR=YK$Sjf=E<+JO z=VVma=ysemQnD`4q7%bh=%oA1jz#K9I9)plT{~zOOmhY_0326c0G=2DpS-z?UwL>J zzrE1bZ@(@B0e(vd+~^9AEFi!=9+QyV*zlQnV{pi|inIWY$8_{oa;oeevi9g;_Ernq8b5iPcy zs{)dE{>UUQQUT7`G>`$QTEuyiHChKK#0Rh-FJiP39pZ{HE{5jFcR=|3_r2?}U-+@- zU;3hN=P$Yjzza`5aRBhA0Q~S=7Q*!&O?rB@OpB_@7o{U?+oVdebaAc7>JQBu_cs6M zg0889vzPs7p9PTUyptwfw1cBrpT$Bt9g=d}4VLLqN#*A`+(~&lnKIuK4#4=H9=idaqEp_$>L>f#q-nP_|%<-oC4Xc#^7I zXwV5)iYktAP1f=FO99oI(kLgAjVa9j*j7^^ChAvORn2U>&1C1!G8-!GxFRL%$2g^( z`=3-4jhv4)sO0uTCj>z-X4u$;<4IAJ(FEhvxEuu9@OtP*NF&X>t~Of*ymAan*##jh zh7P;WM0Gbys@d%Sv>H>>$xu~>=MY9q&R0RKEe0p0q>KfbU=%K+vIP-4j!B)ZOi5W7 zLN4wpYmu{xe})@Hx+STSglrv2feFkCz10G1mMEPq;meqdC25^ZE++e1V0(VmDbU?x z>;e|SBwiJTR{thf)D)x~rejoY0Je>j2q9InlmVHNQ#%tZ_6zRV3L3lUJ+Yq)}wgI|`a>=0+0Y z;SlKV#RlZsLx?Koeizw}2<+#r9Uxa5Sfwo*Gd5xqq2p1w5%CbjE4S4D*Zd^_e}8cY z_*fJMgm63pHzICy#0`Ms@$`(28u?yS6w)!Ki^{@*OKcu{HnU8QDGv{^H~Foqx*f;k zE&Mkf$qFthp&8efL(%R!D)uuOQf=A>o8_q7h0XSis;-8rd~zetj#i9>>d%b<&`0+I z1MWjiWT=Z$6G3JVulQ@BIi)<(lZ19P8XXKm=!#5buR8~@^1~AT)U)q@{EJ?XeJ=D5+qBs)M?akua(+!7)^Jk z$fGe(*cilg4B>L2Egj_r^@n4<%-(QWEJLBah8hgr(IlorwytLgO*^v z?cR_lijY&O{Z^r`WCt3$YGebwOc+V19iY@TR|5plBcleOw5}gzMp+siPFN(Vo8=T$(_y0^u-(hbN04rKQ+89TxsOB8s`Or{Lh z#lWUCTD1uSu8g9s###3>6U!@n{RD*XdQ$@cFFgI^QviReb^tX=0fd?FnOYK+3^HOW zDx6JCbJSip`L=1d-y7C9N#$9Vnw3Nz=oQNwDzG&?)89LbKvc&1Fe%9M_oMJsqS7f^ zRiG+AXJL$x?8Nqj(;is;No1#Yw89#IMOEltsWh9Ima+if8o(4Qnnb6}$xIX&Vq9Bn z{ExkR;4}1stwR;GG72GWimKuMuY!b{FgS`2sa4e-jZAx0e%meaWZz2)w#{Dcbo=%# zJl!C(0RlDY4>DdA;l{b+U!qV|M%PJh-KOzeqV*&;FYVCYPlt5Iv>Po64y18KfThk_ zFwb_oC}(co(fqQ8qWp%nM+-Cc9)w8Wl(R_lJ7^z*Xze9&h9STlO{!UkfvjMrRx#WnSS?F+IzD))SFF)~4|skD(*H zI)q3;XDOUxM`b#+Yhe7q>OdRqnpX6o85T#Sy2GSDAL!7mgM(#F~3y@V5{$vI}s8X>j635 zW(Gi*X-rKio`z5VQ_sHd@u%LD0Kg}oe)1at{B-U3&76WQ2sgrE?p(|UI%1$pa<`Rb zzVnt0z&hsE8V@LS8B}giYuTPrJg20lBvwcGM(amy?OLo71<`a#T5N zVylPUpn-ZcJDTdbjp8_96kcA1h&wEAm^wfyId4WV;yT}yoC^b2^|?iwLM#L{4xX6s za%F>r8KA@fk*_me7CZRz&U^c+#y00XN~t>o4*rFf`spr98vW|JAh z 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
e8 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%0A7_T<)&ry&k*uV` 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

VT+F>wkDiYJ$A)FAP2f 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 z z>^xe`2*b~HERt0?fmfI+Z{mH|pitBxe%#)Z%GbyT2NKSZH!@}gz z?1S!`23{KWKE;QRvhrr#mLV1u3Z#pONCCJ{EmPjhy6MCmclw(6nU0?is60FbD!=3= zLbI|*4SQwg67^5~3Z=Cn*%()rH(klX=QSTMBhzXr!mQ7o%o~YXo8i1@%~d-QB$p3{ zhXReQJv@1c?J;RN-iSQY86E#?XUhne`lW^G* zD77%vMp3{#7;V1&?gM#*-)y%=?pbjl+noWK{Re|uF^?)Wn7;y1tM93}}XbJSC%quG7TAG99>z3a3b_ck40X#FfJ%SA@o%34za=)g zrRV0me~_#&8u=_HCjij662B;H*fIX+?D}DtYO$_f(L-)SU^OBAF7koC+W-7dx*l4S zDA!)SQ}$mwd+%WMXH-m&DA;qQ5VtC$?I6{h&0UG-a9I4|U-_dhgOn+HGKesF2XAKM z^JMFK$Bw08@xcUOqNAQv~;ZO zO{JE5EuJnyrioT4MM0<#QYW~n^-@k!QJYK5Ee6hw6)_m5uk|-z3~VBFw8+dBv~C5+ z7~105m2?Zdto$vZUHSNE0FN zf$zlwwqayfXGnVMn|FO4OqAQXJm;`H6^%$ih)6*NH)9P}SU>3V3r!O2+~cuKGq+f? zW0L!q@g4#!nfUZp4S!ur8ZAB$@OSc~G8SPjvNGdo$18nRk9M;)1rlAXPQVjZR)(7J zPdATe>V7^=yMY1kFQ0m;NGRpnmTvDMPfxM?FfbE4=rH!jizWmSp(@A0l8^%eB z@U;M+xqz z4c!momcQ*^L58N%(_|Da-LXnb66zccA6jD_GYIVtu~Eztj=$EK8U0Qu5Y;4DQ+5W2 zaODgiCA?%8ZpW=}jj=|ak4o^)nIybZ%Bn-f$@?`fQ&pGcZ`#q#gKw%z!x?Ccq`{?* z*k$6LXe_1}b!ZOsoIXLsBw}3GZ7iS7MTJ@iVa%jNP9sGcTo4``dXCB9@_x3kILK&D=Zfjg zbo+;liV8z`zUc6|ltm+-(rFjBcV#fF#`@2EPoTQy>gUkD{0oTlYKs>}v+d-QI17EG zhv{rTbbG7*Q3f-6dfBU%@03({w=Ro!HN>el^ny%*~Q zce6b5z1rF>n1cdsGGH$SQ1+0AnlO+s*wJTqcUDCf)LA4Tu{Ph$g-{9W%*<6CS7O0Q zcxRDDzC|CW*Si;vmspn6w%ty^v{@SF8F!k*DRBMu4E*B*(EuLJ~2ak zv)H$PWcB#G-_-?sQ<`5$kH4jmwDr2F&3X}g_?D~1dV=VeE6~6+cRM4m!TR&j&CbA4 zMgjGh#IMZxY4=!>bO{u!;kmZdsgiNQMA?GtO=`4#C62-O^%87~_TZU^%RhFqu0`9} zJXm}J()N+s{3f&9q;vi*xVKRfBl(xb!IR$>Khc|}#nj@(HW(WnEw^V)cF%dJkxEj^ zZ$eK}_^@6h7LB_?BQBnv!d5tWwz4oT)%9U#%@u>MdCC1!gmcqvn@mr+Jd8ibZnJ|-V7`+=eGv5g-Gw#ea(WszT?3BFX5;(?Cb%yy-hQf zvrDT2ih0Pjg5q%<*hJuKx-p|JB6_xNa!{gbV#)Fi+Y*58Ff^?lo~4qC!8L>aIDb={ z$1#7}HfURgMN=#^wviuZW(>-a=|3~~Tbv&k9(_H~A$c|F$>s;RVryX6&XBeC3;#p- z`dC!&XRqHY0c>fKK{r5Zu@8Gho=U}9hY#6+k3%=vpg@K#FiGnxMR&}e{B^hH*EGWe7^Q<~G5S=%iY&`znIx@?lk6W;I)aAk@cgEqG2tJ8jl!iZfuoe?uz@8l;1gkuLm-J`?% za}n&^IS0ygHD7t+K-2J8+{&$J^lslTr%Ki-_o)vP#EGTj?4iAJI%NDz^Y|kXDCbgw%gr3|E7W+7{5yRD-20sr0)EwLuxe$ZdnuqOezGlJPP{0`uz7} z1Rd7wJVfU9J(mq>ap2V!LG-F8_Q8DAeve8{;73^OZLdG=Rd>fTW6|r-2;6fwafgNo zA|RO!9Z65H33E^TDFv+KV!ea+R0->k6RX!2oo9kv!`b!MqTF#m_^8f(iFjE z#YW9|W2<-iZX>HD%RCdnP^g{dk%g+KZh)+PF7dd7y>r=h4N;yV>bClxpds>Oeb!9$ zc$OI=|4)>-F2Uxw{`09w&M*7^RtamI*VW11@d~vGpSkPhco-G$WsTB8)I#6!bA3NV z2Bcetp_rA>Kl9A5rbBe!{OwVINYdtJLSN`p<>`ZEa%?MGOZmdPR`A}1wG~z>DYzW< z{3NKNULc*FExXl}jSmkA5Xy z2E%REhv(ZQ6&+=9)?_tUtFF;exv>*~A!bgF4^A86ncC1O0o`Lnw2|7-11!={m|-Qs zdi}0a5&V4cO+(l3t$c8CjLXgZlD?Yk@iJWl%5*hWK_{Yxb~j>{ekIbzv9*Vdh?E%ZIwxK|Ih-dtw_ zEVgYJm!vyjhLD=W;Fso>UWcbg!m$d=_HEGSmQ??3Tp+B-uf_{WixaX|3_&A=+W}n} zmb{jOHT?>u;$nnN1G?Y4KAYrN99w2&6&o$bLk2_-zA=2ylS;s=+vdvBUbc*2n#ThZ*a_6YX_`oeSJJKIWb^LfNoL41$-1+zan z@m9Z&rw%v=BdcF}Yny8LisLg3DtF?Oi{@V80+{!H%svmI=s7;!7hWlLWC67%Qff_O ztm7V75D}$^!D*lT`7!Dc?w6U#-=y5NI^G^hl6 z7q3OI0^O)&P>7x=&~-KSlJZ=10W4t^_u*5U;#HSB7&$cTweXGp*2&&3=!KpAN`L+J z9)xo0liK>?lG}SuviVbA-{EZ_RUnln(&a_Z9@XgB(o-_*IX4UM06yP_yZ442(1=fb zoP`!(oa7t;y^$G@G`A8%;bDM027w9bxW61j`?;snbGktE5f+ z_CW+x&u+htS3(-lm+1{^J+T!C_IsF1ACZ>!oCsc3%$i=;N+?g0M)lU~Oa18F+44Y= zlw4sl^87e`y!_`-?#Z;2etU7jcI(^xnVIN!?jwi_jppLY5=Ojv3GBFS0**>nFU8*G zYg|b&&$r;@aDwX?AB2}LPh@Wu11u3ZEeW&`WrIwiS48!Bxv_VldWjd~oa!yCiSkXR zN34U>K=MN)t7SfoM9Lo4lTs1oSr@u8fU6pKWoX=Qoii%x={@=2v5RQ@`+UkvitWb( z%H&Ud>7Do-Q|LAIH9|~(zZ5iY$h4OU$b~D`rYZNCog--mi~UW*^1!`Qve^xs3F$(IxW5`Ipf|M050w&Ni1-9v%3nT zJ-u4Ups$nnM9?euUZwxvhZX0{Jo>r4{ZpVZ6ULL~FBZPTjLrQ&h`wwI4E^02+x#ai z$Pf}?%~Mqpqff6o#?g?(wI3>bZ;lg2w>#TTbY0m3OXzSMG3hsWw(NOR?Grr>c{~vX zi_-x`;gksM@11^^^Z(t71`MTE8i@$opBPf0p$0X{TzPf|em9kXA3B<|I>;toORF5h z!{KKCbLe9&T+X|^7deU^S9X3*H7Z@>^mGCQ(zK%aV#DD)h%PW?$FLe4OAUZq087%t zWM8D6o(`QJ4ms~kVLF{P#4!gQX^~(R#bw?>#~=6&Xsidh)#UTvBrabQj@XhP39U=Zd7p_*VF{Asc6r*!_t z`PV}Z{gw)pqI)o&1*jl1(NJjF!+}lXIoQY8f3%W@*f&_;%&wX4A~%nY@1Q<)K~-Du zA`lz%B2*~F>)kxUS;EipGs7Me<-Lz`ZZNbBV;e%BG-LEb|2WTfaC)@)o1Fw7ZI3$WG4shvtI1&Yh zPlC;qKE1!jgi_6YrO-yZ4vNXue8er)|J?cx?)*{5!$6?D)&-m8@9*B~_7B+-%VB`w z!9x+!t)M_knIIxqYj4n`ol&xFqrjx@$OTva|&Cn#FeuKeF zxd33T(==jN3CGUF_!N#!`$x+x&9%kh3ar?3o2#)jrR`Kl(MtrsKwr%j5ZpBoPVv?& z*RI`d25sIydHUh3@7iHMVR>IE<(PsK54Els4uh{J17Ub|9pzylh-VncWjOr{Nu$?@V#Q>;A_5L=P|_3*AOjIVaW>nR?+-q;PVGh`JrEH30{gUg$xm8BM6C; z(j#;=UzE(~pK?aF&7>zYX4fUJ5)ge`?&%3EdEEK?v$*WvaZjt={k(-LvZf8b8+t;D zj>FMW*7#>c;(XB%8FLLi(MA*Fs7)?&&`)Y~TW(S8@@-N1+AowBdQ27hD6zwH~7 zLw?ATn~kh+v3jKTv&^~Ev@L&pH>2GjFHXctkQH4REPE`gcH1$Zn>dyT+eZZr;y z%E}AN2-?+46SJ5RU=wQf|3$HfPT_gKNrrw93XNu_0F39`jz{x?Ma^bE&r*6~4SFp; zl+RE$Y`DjN{M07nFFKW0Q-Gd#%l}qXdQ5L4ZT41Qjr9X;Y98Isk3mzD_|Xj2k$UMJ zc6;Kfm%pZbOVn`}e!3bn$sXsS1^2v%+7*-W)PV!xYw|j|JMcURso^(y# zhzOjPI^2aaHDS|{fzZOll=Jv}Kr;7tR!=|9*(cKzxdY2MH_Q7lN8`ZOrPUs}ISA~^ z!sP`Bm*9PT0{&WqJIv^Ek(WWmPdIoWw+^s^chkQ%wmmm85Tfm;kE{7kVi#6c5r|I- zYT+p$%N}1fRMsly+Ov>|R;&LH07I zp-f>Q>}?Qa1p)3Dnp6x+gPih~#vxu0PO8}?+cV_?6-ms8&ItbQ6mct^r4NQa9+Q98 z=$s(!XB~^)Bx6RV|BU;liU(lwD?L3mMmwCTfmA|Vp{-mx(AvEP!$>ZJ^?+*I$2n@o zN1o3MdFa%gNBhv0Q>4E{IZY)DUmixjFG?KaC!A4}#1s~lX2c(C8l!l?Hm$Re1#gIS zEFKX+^a7TtmOB!jNMCF+7;+obY$JpiKGbPP!qO;Nn*4gU`L=Zh4V*8_)}*-hCr?0W zStox<*|II9e%-Jx(pbyJ-&{(!imA}bYnZOh)P*Sx^h*C~fjT(%Nnsle?FqOD!&t>9 zXmKI*Z{N=?w>cTiCB|Fm%cF)~3-1`1<~^>lj$c1k$BO#K22Mn06C;w1uN499R4(xS zRTih+jApz}e>@!s?)g$d7C{?{w?WjQZ&RzjEfw^!;hYGJuMNb!4vC)gZ96oe121I*`JolEDPl~VtG z=!V^0eV4g7FzWxqzJKnW+Vm_HKW<)K#>qnquD`RobI2Y~onHHMU6kAE+g@W8{aK{& zRzS>S3D7;G*>Q2TL^G2v`aN;iqS%tf6IP<2;8(6WXW7W>$6zlVMPo8gZEHk5>kmvafILY8>JBTFqrk9|TOIy8!YlM=vq0l* z5}E6|P_s|HBA7qMTqkhUZ*o5EU>t!m=9L7rWA_CaaM1Rrxn*=7zYXzzST+%*+;FXw z6u?C-;DF5NLzL-qP4vXw=Qh6lkhtl-#=mJChp{MSB8ngJ6iHjs)0`bBl}%69uAS#mwiarsF5g<6 z6`-W3Z#)(myN1^Y=|B9y3lGq``C3vfFAK_SPf4M)D`JnbdQ&7cj<$xr1T>M_ce<{A zC)LBZb+A5a_rW3NG+W^~))WA#?cOgB+3LpKYzpaxACeS%|$)%pNhac3eLBn_%0i zK=_LR;YTHXfN)E#o9TBWvHzg(1&@2=smcFJ76U3|YxiOwZUNe`e!isu-C0(CX#^>V zlPRE-fE{0qi(WZm9=6t@(u7&u*?+FfG9h>^F!vg^SEyq|%7*l>cK|db&+w62@G=vo z!d!c5WL>&B>vQ3sFXA#PRU8YvETUUHxPFy{){}Qp!es9BF9ujKoOF~m_WsN=HL!ao zFYb8!MPy#6vK1 zIU`S-v?oav4&+$@)`N!f$`T`E_TYJ0a%Cc|dP(4#sN8nok~Bb4+99V><} zYR~Gd?L5;lHmPD~Tyg~#khM-ZI|p@-4__Y*CK}KSg~T#uKImJV8Nc)U&Hk^yFsI?i zhh|39XWcq&xzQvjm z>0*+F+gg2}PrTo~2)LxFxvDy4@jYzawuGNFr)}7P#gm8N=G|^XAS_aUqPqkl&~j>g zC*TVExmyO!Mww=;DV^8&w!^ZWYr$B=2f+N*PEu#Pv0?%!tA42}AmNS{B2j+lPvVpE zDTn2|b(34aHdUfTO`Ux<3HhRTKkKYMeb}|3DRWw@NdvJ~5zp6^f(}>i+Qzq5vS`c2 zFx0hqemXtFCa#`)KBt$;u2mmP`X2DL9Ly>M1|K$il0yvFDDG&skp%W7)fq`(FU)8XMF$oW?|F`CuzqY1-VXizei_DpaE( z)wqahlyLg4vk9uig1iVB*;U-xyT63Q{2D z&~!t#w{ra8RvEW&B|)~k6)Y7_meX(3^j_6mgd#%GkR%vjNq&ljN-^x!&o16b>O4%P z1o#m3C(mDXnVX*&!smOE43us0jr$t5R4Bih_7X`1atr^8XX=~`F$Tl)(j4Rx%vRi% z4XEQ6cxcVYm1hgOK0TxQ2l%I0@MgqMeFR{1kTNC8zqjT_{2PjlI`?={F1zLJ1U#&4 zdUzN<`J{w|B$YAY>ZbYK!mRM+x^t;%c5$~V)vmdIxF9N6yF5q!0$aB-4pDy0MD)hi zDq$bk@bB)nLb{Cb3(4oq_r}Dt7*s9_21^|X?JhFe!3Zd2Y>}A%u0FrZd&AB>!ofXP z{d8lC{K<{7<52uf!tmB@9Cy-!eCk}Nc6zX3!QTl@Xjlhb(_!Ex-bnPvo}SlHo;DyG zg^>Jcm>`TFJ_g$@c6TG>-=?EUe5PM&4-?^)7Lis|zGKquLtN!t{SB|fd7=U=^W{M*Cu zZPr+e+3(_4p1wq1=%*Ce8=|0W&5(oQ@3RxMk~Z$)dWZkU@$$Z|_R2z4J-CIFMe(HV zBs5*jcO#-L2iJ>OBNo8trLNaY1)iTc;|}hWKfiehAojYYsYWyXNJ&&5M=8GN{s;BF z$xyjH+*o44(Ipc2eAV#Oe<>ab^hAZehK#{5AwKy%!1&kpLz;I{P^>o`Eo!Jf>@fJ> z4Gn{?yRI{g3t?+=Ys-nXYTe$CLS8(q<-Wt=(+~6! z8|Fn!5qZf!h1BQY-Rfs}KFL7X^pw-_e~1JFny9vYCC(u-inQ1F z2!OsIKrT_>RBX4)(Do@y(d%O%$g$`Zhzt3!0$j>9;W+?Wu#ckRg4ZSuOE_V{=7@Dt zYs7MhS$-ZK_Y_iMJbu%%;%Fn0qB;BNuS~M)4&)SkBq3H|qZi@V)dEuz`whI(k{0 zl0-a!(X+1Wz43Nwb=2+yjX1MXxjr-wWECVg(a;1EJXtS7grHe%p1*gLo92`H=~!*w zZZ~Ru*|6y8O51`{{6Aa{eXbkxYVG^xT+-9+h_?cB0mCp-VPsE_(8M$tiCpJ}D2!(z z1NuswlqCiw3%7?KA)%+7$NsP#5Rj%(@a;9&DEoLRpb3(L^?=^X^5G{|WpyRM_$t+C zkb5zYAWAlIDB_nCnpk4FfeMK=z_^Z=-H078M<6MANtgSXy) zJkK4F?|?|_EjdZ=Pb2WK)bQtN!Tbz($%)Ea1F5Dkmbk<*&t0%^$ze?L2_kG<}~U;Wt~~A!Anh~ zom2mlM`w&~FPKcz)Zo18TrdAlk1zZ!t=7tJ(kc7bU>rmy*|S*Lgxwaakah}`zNtjK-DZ&K3iUI{b{8Bj3tFKR?adYMGJe}y|K8lF}nQQRnTf{cTR z$w`#wIw?0qycENf$aL*+rWA88Y?=DG&RIu?A78cg2~fIZh*J@hOv1^;C)0i+abhzY ziYV26Ag!jEmwNFvoeurStoSwdYu&zeuWrxMTUm*EVzai16U#TPgTfr~Ct|rPWNiq( zsPhSIl-RvyL!}(GhFZoA@8s0m$3Q&tE8|$dLt%C1;STAIQw;tNLpzh^Wi(|oO&Ik5Xcz;b)58*AtZZxlNc3$4UfbtvRY`!Ai znSB$W_WgF3_K_ha8G^t`t3T7m;^7-gxeH+8&fM)cXk7VI>y`cp6`~sV#>d!Lkl} znVYdw-di!uJ^i>wk=-i*K?2%`%MZYqq5iGNn%s1Rso1TD{ahrNINdp@!W#Bi1z)D| zAjJJBDDM_O2h~C-_;M+`fogYk>xF9fyusn7bi>lBPNMSGrE(a*ADsJbUQwqR`Gfu; z2;pLm(-p;rftj#&27J9g;ib|6PfvbsoA+AA@)cNXiX~EM({HuiDZomZP|1k^8QL+r zu_oABLbcSK z#ZD%IQJ`9V{x5_5TOUxFlr2b?e*}#`ylQpc@uAbIWP^5P`fPdTuKYnMiZ@jt}8 z57aLaV3bSoXF8Ae8J*^Mh$apzu;bzz!R`1p&oi0wLb&8@EaUJ+F5!a;rc(gZ9IF3uDd4 z+n)C5>Qk^FkPH@`28-%x9$-t`*Xjb(MTCZIR=$yN`Suy#lR!$mzbVm;AgS5+#laJ za~wHQ#TgjZU3OY*+8bqJWbM%5`uW!hOY6OytGFwJncNv26Aq?ot2=kInmCV*zSr^T z>69dj3T@GSyW8PHy>DtC%q+>w#Cg}8+RX?tM~CHJkW_Ygu2`w;cR3_pw_Idw9Of;k zlw|}pG}}2~pY;yxdarDS*{^9#`)W@#Z3u}MR>zi!U=(x^Fmz`x<45+s?FJ-gs zB>qE!PPwD4_5s*XYE4~Y>6%=Xk*8^>J3kwOi*q&h3~-uOJEHx8Shn;#wKCGilJ%?% z>v8?NT(&Xco7C9u6{}B6`X?l*q9oAHcF$j;zO>_)djJ-)R7R~fj6Pqzkwe@u){JLd zsoRykK^wr4lsNk&_OfI!IdhwHub;O>>=CXAV6mT;XLoIVHx>wCg~r0WcGznh1on3f zma4E#^Xm*&WDNaz2&4K5vtP6qg9?elw8mktW-S*bsUQmefLmsf6j;=nAa(OxisI6( zD&Xj*t3wkUKsandctj00DBeYuJ?ue@r5~32*R1iT2<#^LT-&0R9JFSgO}4d*JAvaw zCy@p6kh{YW6Zq1R1M6aXf$ikK-S*q=KRoof!bbJ=hY(W*!;33)|L{jQI^&r<{qda^^J@4DpXs$nAO=*9HVKaA;zEYQ(t=bB?>SuG{%X!QY zV>3@gQU0c((Wt-i$-rE5;O$-x>eoUJ%Q#Zwt`e{%XU7;1 zvl1~njb_s6RPBE0sgh~-Mlfy6)9$pSPPe3{Wmu=(QPx}qSEnlW;+$%ZCBzYJka2X~ z4+fpg30{_^^C!;vX#FK=J85nsPC8?g8Qsb6k$tiTym--G3`lYa#C=-GKB#I;PFqha zzZJD|lrdF~uejhv8)0BCha&ezRnROm`AC{_9KE@krtl5LmikA1ZNCXWM83o@$Xf0| zw;%lJ*EsfH%g&7i%eq!Q0C7L-T_27C%g{Cz4&>&bmuqoPdzBDfxL4S*rG7okZPB6m zs;0agho^-6)a}1mFHmGevbTO^Sx1jhggfexkB@Sgsg!_c+6Cj)weAVolx@9*(tJr zsMw`gNnGn-3y{m{(&s^Yb202+-HKQ;wZt#uRwu`1TeuU9cmbx>9-Un27@!9 z)9AFI^=eC{yA2iQ(I5B+q^|Z!z}ZS+>%PD!m3lJ6x==^yuJZD+CXMWdqH^%ht?(7bs+|NhZl z=-bYv5@nP++X@XDAKiW=|1Gs>LL$4mMVG`Ah$&b|KdabHf>P<5+459?2aE&?roy^? z*Uqn>#zFFX<)kTmmbWni!v!&Veh5yh~Equ zs)XtWg7ofN9IT-CH%@QMxLg3Pf~4K69Utj@EDRH&WIhuy3`{IgZsx-L0#0obOk`Sj z1gV*d;YV2yJ`zM!0Jk$6o=M(-&Xcq%0}J3`&#jON5CilY-|Dx8G7xmz$3C-6oze&n zejx#)>5HdNmC&JlMN*bFDr==2C08AEnoeVVpC3S&Q9kzFG9~0gkvWp`Q{G6jke=Y& zTH9}4@4^&*K}6E;^aj7Win#G+JZh%En?k4>^JWT;pu#7nm#S@@oConV(0J$D$@RW| zR-qoprg$POcT%I3_sMx#3_3(ED+06Jg0sVU<}wqq$ojkQIzgi~KoU=$l#Y^ym$JEoUE`;c|DQk0H!TV_rsEhn=L!lw{V* zrRAD!5}3jx_>^Z{9IM}VwLg_eXB7LzT<}s`@p&sLBGM^4W&h;--kSh-kn(1Q!ERor zcJYAgySIloFaj>v;f+!btfCzF&`}@NWZ4@NAYt)r*sPEWedmW`(Mfz;V-1U(*)#!* z(t&}*V+}zzsEJj0toHT_>G#_V`sX)RSO{v>Cvo}j_isZ8A!aUjFH7T$76`(=ojb`Q zIpFj<<>(pa+U%{n7@jkZC?P>W&=H#gQ~@g-FTvIwjw0|fU$UO!QeVN?B`!XBnsf5)fNrAHWDeWJ^H)gYIv-a@b?MPI z`ta-VZQ`$zc~LjBCHVICEcqn@8)HJ>vc~)IWgTJ$p3|+`;m5qoS94PCG?e2d|K>G7 z>e7(5erRwmWr>59Sa6pS5;>BZk#Dvg>Fsqrsv+_dE?ce-bd|jv@wIGP=5?`jeKhx4 zYBS-*ZZ&sW<^(Rb>kuMy+qCX|wLC}Q9gcYDFh(%HGZ#SBzoBX2TM+Vfq%|6YPk%Eha93p^C z+Nxep+ycuaYnVpJA1h{Ma8gZdAG&nR2VD&YGc6|M`b@5(psFXT1AZ{GahjpNJmS*; zfxx}XznV&Kw!zme=3vl%Pq*zFI9hazRX7 zGuf;QMQJPe_w$RDoCMWJ)wEIVOo0?Mts=t)o?4w&tdyzQy=3l~yPxmPv6G1+sl}Ack5ev<3vqd}J=TP%U(cty=@xA#*Mb@WWGLoo90jGEg7LQ*}ZtE5i9RN z2bUPSl98r=TYuP{^qla1sL5z{_*BLEZeK&lu|_|iPkdW> znB1iLIGU}6SSgWgmx1fy|5$*gLEPk9#TW0%Ys8lP@56=Hb(^Mp{a`2Sfx3>F(}s1cs1K=?3Ypp&4f0`F!8&`QiKr=h|nVwbs7( zapJnX>vD;wUq!|Ss|OQA096KHIGS`!OK#%IE=}b^rL6EavC@6`_1lEwA)S@+RtUDi z^QL%)$pe{4_J9BavJs=GM*UW#8F4M4p8d0VVo*2uF_hlI?9(kHA9AOO>=Z`_FDu)- zj?`VqdVsaO%k_EBAT98b6T1C7Z;)0>5++Rn&f9we0Uv|MuC^$^mwLd<-cX=0w(B@! zK;Afv4}Ht`idn6fEBz_11u|R?5sxT5pFpZtb5bd8zDL>Mvd3%eG&`lduo4q!5R8%h z^ivPT%=zzw<04(3=DimqHPB>-(ZM3ZCG7h1JFbNH7LLzdcE`+D#U1Eom;&RLw_E4nueP| zYxOeW;jdhJgo0bA=#LVhG@NuS_9jsz!K0P#l*AxT;R-!N^}KmQ!-REV)PxFK9OOD( z7lXgS4p7A;JMEwEYmlj8gjMTAl%X}Sk5a}+l$Dv<6|NRRl2e<;8%MmY#0x?$W{0{2 zSN@2W;Zpu#iM3c-m>qSde+1JbP``P}hPZRdM`CYSBqizxH_$daU6)Pp+lTrib!C90 zLu(n%@tk!HyDyKnIMRB25et_IKc{YB5nJZ^>8PHyD%>VRQ z02qls^d%Y(oW;;hRG{b6D*OyjEHgdg%MVFH6LIJ%X-O&R6Sr`~N=)MeT(_pZh=bt&RT3@bmnd8 z(!w1c8WT~`Gf~lxGC(MlB|2sBi3RoL09E(0AC>wID>@bF9g_+0kj~ItzA3bZSbyZ z`V;IROW^AAR3rIyn5q#r1+er9e|Zp` z=Hk{ik4JGQF8L-R+(;}9{us~=4~pA=H9yS#80=B*&k;68nKcuSx#EoDCzRI*m8gdO z7Hb?xbH3kCl^5|$?%;-H+y0t2a_6^DJdsn#`P9=64KW0{8&MM)xHdDNDNMq@qb0Qj z^vJ(_{r~BC$=?5P`5OFL-tTHF;96SgVL<~~?Lu~Okmzhc!=*K5 zQ6YsKB&B|`e&H)oV^~G5h78$%HOkfVe+Q_gMEsbZru>4dK>cq69Aw+15aqAxed?#7 z%r*8Ls5v7p>4CKpMy+LxJEYb=ZM|GCX&!()CZ59plM&^P7y2_@#U+9yvyLExcEUyM zz`#Tev~s0fL6CVj`@EQ+5q{Vz&7pJ@vp)R}lJ!ahyoK6bM{EV%V?$op(qIo~PeAFg zl1-ykm?6}B>Poui8LQ%%$Tr5m)|~SksBC61eD^esjsqE&Aguj-XXtu3Ii3rPr9Ck@12G_LTei@Ku2)GgkmT{* zl+?sNa18o+^wpKvUkpjZ&TYNZW(hWxG`ieD$y6ONq|2P57fu{$i5*kcY=<#i7j1Kk zodD}DEPq(}>D;bv4B(u~A0#&<$fzZD3zQe{QX>VpK7ze!v6(eT7t=Jz)&Ow? zvo#@C!x?v?J6daloBh~PSJ=ZZ<1dJz`r>8*z_)itsn}MVhPgS?m}d(~P?#&hG~gBd|z(_IoN_^itiFw`^f@$@jYAIB{YFuyf+Es~ty>@%ZWodOLIB8X;_uuL*aD)bPQlhDikx zTa%cc-|TbUXT|k8PYNzc zEj+;A!$4nuC{X(V_Tj}m7x>`-#0lHEe0u;yMf}kUuqY}%)4D7RyNo4=jY0AnVa_;h zRHOV$b#ebhpX!tLY0taGrO*zq#_O>LU80E_DR>{J?LU81GzDd791Fjom9e~bBz8Ii zZKD;xDR~20BV0t2MTajh*AiA5ay&FHhA%fBBICaDrV>%Pav%z&Jj=f_w4P58j6CMN z{_Y*VhD!f;x1?WhV4qQ;PdC6osRxMCx(mUBz$8p+N{ZSs9u)ft=~O#Vl;3zDQV^CI?n={HHI6NT~j2J5gDBC zJ$bgYuW52k*68w&bY(3r_xQ3e^5NV*2m_( z#iDmyXNNyy_16HEf~4nRgM8YtX-Z=9C8iW1c9MXlf{%d6S^5&jZshf^k4(ltG>H~u zc?xu4KRHny=?`KPCgkpWd+3UJz{; zB#GUk9>QZ{rw~@p4Z}YGeo2FgWI)p`L%uxWJ$c2a*+JU8-q;Pi*`v(euYY?`J;{1L z7j=4Bpd#`^xt@lfMm_eU@u8g*Ob}z~_6`4+!%EuPCz3C{83=AHadwJ(siBfPUUKVT z0NRibloD+&4-xTC1$up8$Tg-0oF0cnWB%%sOVy7v!B3+O*|OYYhtaHk17)=+CEzYn+jCt-iNjU?x&z;x_@)*bfGm(>fR{R()P3@HSF!res$=epo_C5+tc2OML{c7>OCmR zVjU%MDj>b;d&hZWYnSny7<_O~!e26~fKV#M-ue2~-1#&40}n7=Ecn(}6gU0N~<<={WS#l?xWOPYDPah0C9O%O^KLH~{l$IQdn{ z$?g+OQ4i>GC0SQe)A8m|5pA&bR(LCBDXa0{r6z?K`HHZr%p(-?}v$V_hR^>BzABL=K_j`2oN(ZTzbj?XpR_8K;aGk9Asz?sC zNDoy@-IP!!UMQ^^`{uJ@9-%oJUi!qyyjH7Fx_`eQ->{SBU6QjH}Zm2@$B*z z)ePOx=GG9G@X-i05U~4#4MeKYl$J&v*~eNL9>!1f_^LR!Oeg)8ynf-;!CZOhRI>z- znMKD&7cU?pV}Y+WnT94kF7!vG;Ka{vHRU~(PAD%CnxYAcAW+C z6LUXjFZfsLm5MY)7-+Sa@fl?CD59~FpK1B?o(|3%&~{#4NrCs*|7EL!NnuOF#*iDhGQsp;Gas~P zptQa9y8FV`2ND3|nL@Xm7r@dI^`Av(ynvmMVMx~k7*>AbIs*NyYHoBdy^O9q%+5!* zkktM|i&J9>Wp;J4OoG@Z6n%z-qT6VT3R7e!M-MM`XVeB5rL9OVMDY54DgBfr(35J6gcao_RHEucBq8MoEPKs>oHRC}QI^!ru&Fr`n9Fk@c2(+;= zR5@50YHLe{Uie${f*x>LMgGLRal{Pry#aCiu*yhL5^Pcpp-dr+WIy45L0y7g6|Z6& zzR1aw-sP76i@x0wPTIMvyG-$(v%_edj^f~KkrCY4g?#746{PBR$|=XB$6_QuMA}lX zVngr<{T}|SxVWc|OEMa<&vU;W6{SVVss(vsY^2uqy07?XVK#;LBpK1wG^@S~F_)uB z`JaGpL0?~EO*)4uA1^VNI!;jiLimLaq7cQIsXl&7@4V~uMfit7Wfb&3x-{j1OsXjC zRqNvK)IVYY^dMj9zAf63OEJ6SCo($Et_Jn0fe|Fpbr@6b1gy=G6DL zjZkWm*LHeddhU~Xk+XP$2-j-MqMMT_}c|8g4FvCSv%`5w{+@FEB2I|3R^aU5B9un zbMw$^TprpSEX|*Q?k{m;KP{ZhQU*s>xJMr>6a@) z*uMcah>aCXl(ckkm|y|#;i2qb8qKP?T)g+o^rvWFgjZXg__mZLWNuN){jQxF5PnoO0kDp~ z3U2<@6YEPtlw0`S^20KN!iw#2xL)uKU`*#tJw9f+YmV1L!P%N4U6DfyiQSacM|2YW z>MYwA@;{CBGY>3p_;rm3DAx!}*8}pr1xu6Y8-G}Votr#H5IPoF2TYK@Ibl`QwAi9( z7bT4{EciVfls4~CqO+-}G;tCz)kq#H8^|&+tzle!CA@pbM6BV%@eg8WOra^xNHuJisOax-?2cFfV zuD!W#e1JMHmu93>4r$e}kQDuJgB=vudp$My`%A(C2H79#6Pm^zpuuQG8xt2wIbWR` zrTzzE78k zu>1*N6J%?28ulv%!LAc__FF0qR)E>=Jgi;U2tz>3K3hzFtqaLdxdHV8l$L7oM_RzP z(LVZt-8cBb!{6%_*z8#wF)6`BQ86?z()%>`6u4yVh^vD7NkSimH4jzN^kdNuR%U%T zUwS7_sO(mLMH;g{wxjLPP}ChRb;lmw$`A~_YyKPmOv%A{MOuhF@)`u8K|zu_ho`d4 zU&sT4UWE{0!OE*3_HxCUEr6n{68n_|m1|!pa2Ug5K>PPMTZ?50?9@8&@vi>`Dgfsn zFg%1fJ}+aEu=kC6q=9^mT8Gm+h2)#txc0N(9kM| zhfa-EBRQjId_#{_9=jOiVAxHabfX-_CG^#^)1~8vVB&aJL7zEC1n{Yk)6#-tf|!nN zU*_+JmOj?Z!-utLRg+pXZE^LO-|Ps>gmTi?4sGF5hg6#MyHQh$co)-cUI@re%F3xd z*Z?zrE`7bMvOkQm?)l9gL7Q(wg&j)HRzCU4^w_ad!mToN)Mg0~1Jh(T4R?dY+J2+n zkc6a@C!(!A`D<+h1~F@!cX^9+?CbaG4^`Sl$X$dFf7QQ$*HywQlWW<(yXaCKeR`=% z27!Qvp{DmsYBd0n;@KPq)|z5R27gUWy;-^eibn23Jr%I`)U?8E z%xqw~eal!UyElRo*`5)7+e43h9JYjl3qo)fH&*oJ-F~&n<(Q5;94_OA)olg77NJ5n z;JcI48)0k0PMT`3f_fTf3W|tK^gp^;}4e{RH2CTc^1CDaiVq9O$xy2X2U8NCmLpyRLBO-nOB~MP( z4{>HnY~RYyRZ@L4Mp;#d?`1=`QMvGQj^~msIr3mCnx&?Z$15wobcG(r_{MVmr+?9I z!8oBCFKLgkdoC#nySc5a8)<8}p-uY~{{$Mp!TSWA29h4+K{rROH|p5|!!zRPu$HU3 zv8uk{m}hC4dv-A1_1D_{E%5Ux!lQ5R$l#HIS5Gmiba2SZVJS|QE0JJ+-+mK>u$8%$ zb8X9INW4P=xojk{vKu8n`YA3lD7rT|aEh^sC)`rp8tJf5dg{k3q+1ei6`TSek{y(0 zY-Y2_c7QYLf*?D)WQU(GeezWQn`s2XUq?JlNVLWSWa}HJ249$l!NS(pk1p9jewmO_ zNSp%g+>&`3%p@1K9a7|FQ7ga_%WFpOIcS&bZMMpN9K7G9T_9C{uM?11A_I=kWqTg; zWZ_L3iMtEBp+y`VXxyPQqNLP9-1>HcXi6$Bb@?gTT^N@sUuZ%UE1u0#x>PnZ^qWdi zj1gwevJV$K{uWT_KB;&`79X=Gd?KHk2@O&7`4GRcV0(+<>~Gt7*DJ!V+<-dqQX0L$ zt23VFSij`uFDoRY)~x>8H9Hz^xg&*wOm_RO_QSQ!d%4U!FLybz;mvI4tY|+j=0mWtqv$nD# zC3;1l&*{&}u<;57O|1oXxro>?@vr0<1k$Yj=y*_u z5p*KCyFduG^|O_~pC!@_*B&nHzK(Xscxrzp;0?PVo*XV5T1-@l zsHW~ZH>tsr@gWscUeW6*UZU`}^A@(0>gbmhh|3!-hyKApMaFBxrHWe$j+VQZo`d1p zVC=x#E)_ojVp$o*e|GpV(&7IGG7#W-MR=d~QfDwqtr@W*@Mtyb^f(S(clJ@)_tjLT1~kAeQ%gk1XnrdHhW0s=m|m8JLT{5 z4NiVu4bNi^eujrM-w92DzxLKDs;m;R#iLm^N|mdm)G(}B3Q_C-k9TvOz$dn`q*2Ata2Byhr zeao}{7j;w3*ixJKi<<4_QG-r3ukH9=)&D*N7$u097jA#@=PgL9q?U6h0dB!`3VrPl z?HZ~-_-YTs3gLU0W~9cSJi-u&-zW^+0ZC#;(G-HbLTaQm4FMeGZ145oMLl0SmK?6+ zXqA0093=acx{T_VrqVH{opx`N<_HqBQ>tk(;?9Tn z*3UFQd62H7uX+ClkBz6QO`0c}+mJY_5hKXCo2E6}h822ncbA1{X(FEGHlI_y}WdUygWvO1ngFm|&`}G?6L%jqaA80{AU>j-0 z8ks+*+K3kO1-W?_KKGYM$rxAv$s2ji5SWl8>>+v|s8@vgN+j@jsVSy)jr3R90YTp+&S7bD>5Af1_#AiUINYpc^%&h@y}s|CU=)<6uFecK6H6^q z+AEyYr^#O`6u!##%n1wJI&*xq=r541_ZMRhj61&Inh!m)`h|SxKM@oa`VJ+0k)&nz zFl^cJMuyybIY5>j6kFKBlz zfslo#xz_*<@m_Ed&42Ode^0RHX4p%qY;YF@PeB(4qO&mPoEtiT>81bbd}u^2ha%)w z@8ud>>uUz}K+N!b_@K!v*8<=}tB4tJiI2rImr=Ul|CJ(0!ySA3>}Hbv(>tpSC*;cz z|688{Zf?BFh9}{=(Ahr*K0-@xi*SC`4ixkM;Kx~eplc!tLz(zv#^pFuq6rHScH($N zYgb7l`!n7hr~(a=<kkcLvX5x7dL%tIW`1(ki=0a+G}V&zMw0%$F6=^yj`(Tc zzn$~5#WFfLzs)^4!8Fms`QrO!Fph}{bfpj3w4-WBP;f@{-#}*y_KWK^uRg(;|6`;S zyg%*!&c<{Z{LT6E?MERxdws@_B1%*uhHU-CQ1fK5gg#P5I(KQ8WY>FR$RQrj^`+GM zE?i8jhh`Z=HCEs@^neM}JbxS(U;m5VXYmt-fOlD6dK!%Eq`fC65qRJ3awydI54a0m zoucf>$DJa`ZH|={W^YY#-rgF-#l0Mx999b!5nQ$Svfs*Uzn;<2p1Lo7+}cCh;6t(J zT&Settxog)6M8;xk66Ub+fz@Ka{)A0P7RwfL-uhmEsl35Y&hO?5+ zzE&b0@thgLdO&d?*fkiu>WhjbCG81c6?Xui1ObYHfgo%M(yN~>G!1e4u?v17g|(s6 zV<1Dj9Zd;m!|^e6fxBi{ET=!`9DHxC1m){5%_&sQ+o1aoZffG$7CDD`$iC0Bd1Koc zy8o1vC_ChYhKA!yb4?mB;;VJK>O5o$zVn+sV%<>|Je|!9^0PYRu1F`eeGWI8yl`x^ zQVydo>96>hGUZwqCkNjC>*+<|7KSuy_(P4IFZhDJOiA81F!9X;8(m1hp+U7Y zk_zW=S)S3Sko3Xo5;nv~^CVD$wyW0c;q6bge7O{c_w-1uR_!J4JLl#|qj;b0P!b|_ zIS@GaxO8VFh}n1QN8?QpJT|JAHqR_fakY)epF&2WK5=P|+GbBQLbwxkyO#JCG>|^+ zkIDCdEQyNW!m_aGlh{#yl82*(5f+pf8+(=cNa{Yt`}z}0*sLIDIHPoxqc*O}KZ$7H z(BREmvf1NoHEBn%f%&p*8@2jGJhrkEROW@-4hh1f5#2(Mwv5FGOc3-`UEBytWZo$u z0>8#hNK^SFpq>^hxE0ekF?q2|)=82Iic|0)A_!S(J0ot8^U-6yr(BWlrzw{tT^&L< zLA=h45r&NqXtIc?zWa!Dcb@#T<+kqj z4imDrwJUO17d0iQA@OD#f~2hb`1VTZmk-W((}AZF-OzPJj2?QrqnX>T>fg?9 zD~V@rFmK$-vo{Al+_Z17&IexXkquRT7in1P5e!AQ7QJ`U#lH zv#ZFNhCAx7eOiHA&nFn3hzBboZUu}mk{`d<(tG`jL`2IZDM{j!Y7Dh>n}VBt2(vR} zG}Ov;aBJ6;i(BuWusob!fS=~5XVdG?Z#=0n{TZl6-wPA#K>dh$m(F%;s91~J1K(3m%^0H zLywz6O;5%hl4@cz2EtlIN*L-TR=a;yo9vY$7St=CVZ~c+VR^;P9Hkf!faDy=TagqzA{=R3Xod@QF1Neg?GXr^G;N1C=8IO+3l@`Dn zi*2M=aD1F+Pi`CcO{u`R{8=-Un#CeM^BDEFaic>EdX?2f%|~!a`aTGgC5DuBl;djh zYIq|0t6&zA%p$&iGXXk|feHRf4r@yjA-C1P4D3wRM_WxZIro@C$_UZz#@~}2=LO3O z+F;h&nF;U$WJMAmxSC@+H!c3}T{7*(Ntm-4bGXL$psc%)I}6;f!=IZUCaKLTjwWU6 z7MPgAMsoVS2rh}PtCox*qr=8sKz|rKcmu<`gTxj1LVlw{aa1_%4b3>0e=vu>30@Na zvDLy2)43OO-|lU!^Dz2O1C3fLm8y#9XV!n~avbgDuvNxX*~oB&K)wwWF8l;vQc>5m zne>f-617!+ zogZYOl?QM;H392*bX~KY&TxQXSiT@oJSg95$XS*8LYc2cz3dOJRJ&!>h4T4EM{yo6py<}-L7(o%$b{3_MVrYUi6 zRl6GrG^QCOOp1CMyc9X|h-uNRLlad?oOV5*}YAIAJVN_o~!|9BJ2E=@A^oL5DK z6fDCi^JzI({KkkV9{kWzD5k=`S-fJCPP<0yNgw)?VuO)Wn2fd^9S<}WSs54#3r%$$A!0(lWIhigRoVWQv#sDU-L_BCTU%BS%vzMld{$Oz zbF8VmE_;YX0QkNw;enE2{d{;2Xg@p zns>WgmrbvNwt6q}5@@9~S7APL9@?$*P{gp4i4P4KF@z0pi*)RO>YI)hdzy*9_BCMFD8`n6aMP78!#(x zA^FrWF!H4r8DJD2U^{0U#o3JH`-$Yh{Tl}2IzO(T)V=Ry7(ov9d=E|egE6uh+5knS zs(=h&uL59563R%<3m+dTBish{?ZfUO(4es~NiT0pUYpiwJ8$t0V9nY%Yje&6x)L?@ zprrk+A&b67pq*370&CFFe&DC-@ODfcib81bH~kY+Ev48vbK9oo^kxdeGjODFQej=7 zYGTf_iGaj(61>#fQjpkBW@+a8EZ&xU|A3^0w5h2xr$xiroUf{@%Jmd22m}TE9-v|1 zC+7gBw;u8Q$V)9ks2*8NDXD;HgehTTVrWZN<7lqDP`pVFp zCeWVh*)g+<>}`{fUpGD>$H?5LyZ{n#qX`lw$W%8roSp9-Ga^%tvBgYb;H;=>Pr=qO z{pCqUiehJ$^TzBDqi(uLAjDZC?HHOHNhisIic&xU#ni22PO!1GOAj3opUcD=fljC~ zX$S43O$6G_xzsLHp9SU!B-zd*zGL4?D%~5w_3RJ#q{EEY9}uL7`Sby(swvq|RpNJv zV#5=e`mOrIv1P^{P{qJoB3^#tl(#Y7X|U3} zMbKolTb$F*qhA9@Sndn4v=RU|8bhUT3)X8ZDD`ihm$ky?Lb=ep)2TUvF zhITF^PLq2I69~2MG-W)HiW9%?V_9blhfFND=`>^;J1viT=UX80Bd%RPU%chTH%7jf zFh-hsu#Nj1Dt3y%XoZTj121b^n|zPYlrQfXuP&=j_i0JDl}<`KAp!O$q&$bSK(rn2 z==S034i_ri-wUmi;V^I8teEexbL{=B*taSbFi#g}sC*(Lf`UsBwY>`m6 zku%zy=*z7(G|rlCCSt;=BzO%lPbIbMHfe}YYgvmSWg9O^G(40Wmye7d1nHznF%)G= zTe=2;Ifs(T>Q4Xo_s8NWHeL0mwl}{1FypDmqIJ;uN~A1I+V|wdz2w~LYR~t{_s+)9 zydF68WPm!OfyHkML^OG-j*ml;X3H;xcK((MBneg9t(iP4>o@dzLyk`Pb$Eqwi#|Mh6dh0@ z-)LMATpw})24h5N1zD-{-cbHpjbKV>{TZ$+j$mTh+9FAfhX>B|9GB^P4880aJbdAT zT5auA1(w2K>Ep2E*St_5l{>%g#tp2of;pcbmVE*G`Of?MOU*v8!E^vD&0gzrSisv4 zbK?$)ewuDrTd8kvA#Bwr$~*XL$?{xdcET^RgtSoqS=2t~yHRj4H)}jcbtM{SMXK%7 zohK{BX4!49)pZ2hTrrd_N>z1P<~NS}v@RlZdygRyN_uIUlM zS_YdtlSD7Of&hcr!47CD)#oecYed|(Chi_r*_-WpoWMx)K*$cn42~UuP4dFF0_8%1 zPZ*)VPXS|gyE)JfD8!o=+7_86GTm#)UjBmNv^f-tZW)n3ZHw zA${e1r|zt(B7QrwD7sRgo2qoHsOYG2)I;}ERYlo;<~rLCKi1iiYn}Q2_ue8^)0d#R ziL?IBj4Zqw6 z@yh{zu}{1cb=;0QQ#fRSz`EgqaDh0E+0u~J+a3q=5-XEb%Y8z~&`TpCanru-LT5Fd zw7`j|U1~?GJgWx{M1Ls)VlfVJ2o^+P^PvJk|)QAElElIs&AXSSufB}lvYM6((+$HCmu$f>_7RjnnTXIIupqW8?PDmfyMsik@U8W$#%RHYc_EZM<6 zg9y-o76MWm*M z8~K;FH~*nk9?Ut;fqXEz3+Xf%Mu>~r1&}@O7nnEBZLYUj<_#z8E0PQG2fW$L@p8Y- zNUG63p$`r=HY|9bC3L?UrZ26(E0nWCteaA%eXE-1Dd&!@$veY4x1wQcv102MQt>V8 zr`XnGJQty1W=>*6U@>+mhiR}8?$ESM;1+RIrv0XmthH}LjD1CSEmf;#1!uuW`r6-# z2i%}4L?M;wMyH?aN;eRWRFb&lw_*uW?T|*hFQKIl-+ac4FTNsUCi(F(#!2Vt7qEtC zP5p9LU1g=y{3P6a0@Og<)FIuuz3o2OuNB*Lx?7(mbkOn$v|(aPPB6gg35^KX54J%3 zm$O#LRnBK9g)=jkd}?OhQto%Z(th4ZxJ>3PsDnsEHA}R*d*B7!EbeZP zds3~>Bd&lM`w~)Xqc#3)^ju?6S68n3hPp`j`-lD8CI3t{4|)3rw71VK-?2V?g~HkX z5z4sBo*YSf4XJsiZ&&|O&=hOir)YS{z<3@aA8nq#hD3NKM0~Ed^*Tr1g#6>>%Mb{Bsdkukihs~g%onFxJxO5X#0vSYwBv5$< zL^b()xxsV}&yC^(fCi%#9&bv3_LE9@Qf{bGBc<_}pp0>1EE0Rptt}eydFkx#djLT|k>C5_5n$!P+ zBbPTfumMCEIleFF3mOVEv|3}$$fpzIszWBk(gV{78uy6V2>7n;#w&VHt&uGcj%qL& z%h~g9uug3v6&EL6-b1L&tYn;i|BJbSn<>2bn(Vg3&|S{=2ETRWTxiTm2!abc~$ z<-Cc5O2)RyS4rVia8jcM9<&fLtet_`9sceGH#53xvqZFc*1h3JVbz?0$JCG&#N%}c z+}N^4--||_#Y@g8JpBVCSIJqNmg1#9 z+uNq(t85HMU)T2AD!l8+wF%hsaXPlEAE{f`O>vQqG=jH z#_EIW%%9G_h6w6X+Dn5>PWa<|Ivb|Kh@(5)u8o#ZHtAj^oUPYPbT635q&NBAQEYp9 zkjSzBhp&llF~H@Tp0P*c&%^XBjMnl2gbDdw`~3S8R1a}{9FCR%agm;z+@LMHjhKLs z+N97veS}8bnsPMp9JzeMZEQ<}{b>&RBJCX((DLr-GeXD)*_-_QX>!-23K3e*@pW)Z``-2XlWB_4!Pff)3FABm(Fg(J$wc&AfcUMR9_<;Cl zyaowX;#_)%WfRr_*?l~$em1r^x_Z*U0+3P&brs_?Af?hd9S=G2jj^K%y)Q!lC^s+H zdgT+5mpJiN;ZI=#vf6WVIB$sxk*GC~nvy6>fN+H3gT?4O&`d}j;Qdg=KQtO(&vb0 z@67r4u|!3-_up^uYSBG{XK^Iw#;Nnf8CpTtGRjZ!c1JE3w~jlS{)(fo3Q0LXvZk7y z8TFoU(oF|Dd|?6EQ?!epOH~Ma@2biFVZ5+KA?NKhe`Sv1I$|e{2V+~<*ASU9H(!hm z?23DPe|FWow|*jtB*Du<@<4f2CrPK8=VIpXZ{%LrNwH=`ujoxFqeW7u2s(F=Z8|@{ zz8W=|ZkLA}AGSe~c4)hETmp#CgETQ0mh>`zdB0=L2SUh|Z+!QLC3xwNUcxPOx!(N=QHi4rP zCd;Ln0DqX#4t)FHuc(zgEVE_@7Gt|4r|sFP&He9yTj7q|510W8%HB0J#RHtC`WWx= z2lQ;T=Z^8}`PM_9UEzdcHmU)bIsh|rQykyWHkUUIb>^_bm*F@i@e{S%B7%0znX>mX zBcodgV1P>U6JqJKFr!&nho5#9k-C&M6p2>^wrQ(81Ig%Fvgmyo|EmZ`-_@8w%|TC{ za2i8!`5|pQT`$=u=w&N}78cC;%6N8b2-R2w7WIPYQ06hRV;vb%Ugb~;r_*c4TLNG$ zzjTNvH`%xwOVRdf1YiV%&urptSXg7J6_q80x~LI975`Nw9p7_r$0cRdpG1#8%q#{e zm>%dLVHPzMGZTn1&oTQEm^;Q6%Y&P7PXtNIbLXDJ5;BFY*wL~M)ba>Dj!N}2%f-h2Cw&B9QO*06j8Q+}#$6Lz)rV2+#R5KC9~QM-64^-?^{7;)}*It;!u zMx~#K0>20>>T^#qHOjc0&y%*4Lf&6=T+hm2y%Q|19r&bb-5(Zf&g0%n6r4zGIJW z%a7hIpJ~Bc+K8nk$%#1gUSflvxU-lnFL@_OxJB}dCm?2XjwiEKw5qLgW2OGIJ8rv~ zcLDZEQKBJY5D}59o@|%nBgCFHDEyH#msZ?1-e9rkizqc{-Q1OL+J#SPk2=?ot22Zt zSf-6on-*V9r};mOhj-8Y^Ww&)CAv0sxpv+$f;}vmK;c-$Gy=veo|^(Vlpe0PvIE{#@0)+CwH_I~?ffMNh*VoB^%S)m(56rv`|aE*1ZV5x@k-hSAn0Gm zu{HhRU>P*ZYnVrLXMI8tzcjlT;LgJn;v)Tv{p()=(pa_pT=-;}S*@%^2=3`=PK=de z24K-xaaSmkQ8eL8c3&vR8%bNQJ;j2=BDvRKvoAb`+jBv4Ob-O}!nM0>mx_O;ucU&n zucIIH;6FIf%k_Yzf?qI1KlqGRnr0kE28w#|p?rL}=m+y)!`iuBVj+2e`Q1z016u6> zF+!*-I8!nS_U;o@<+V8#sJtq@juqD;AyRa3r}YKFe$}r_4d=;MVBCI9!(DPLZBm5M zX>W$f)s=LVMB7B5uhAxKgqO-T-&A?Dd?L#->LP8DdF~^v|8)DG4_K;iE`uCVGP;>6 zSax;1Lh>h&!_YQ#OR=a6T}N{k$h9 z=EsM&;R!Lyv`iT%u76zmU0!jpE=oSa$(Q6@(QkgPEGH`*b(*~hV_3>kTb=m+rl=uk zGVewi`FTQA?a2@PfnPiFXP$1)r5}g$fL(cQQ0bqMu-HYYaIa>;GU{FifcYbDXEM$(Be&=&OJ<0@3ouY(Z_ha zd(kWh1D3xJ^X4`(>;u|7;o(5VXKVb9O7_iNdYd)LJ|u1tjB~hSl9CfmGF-}rY|!oH zQ5%>&w?}%mTCgj9WVVPjk`fiDj$x+fOq4sPI3hxvQw`Xk3}MDXnxpx@EWj6^zNQ_| zB<}OO&En!pcV4=K`UYKq@`;8FiE`|}0BM~$rQEH@Fme24fs3~xz9XvqQWufp;RsWg zKB%~R+P?r*uAbA8fwqVcQ$wi1_Lf1zK861(Tt@m#0hW?Rkq6 zLNDPt!Q7u~$#A+13?bQJduvt8=q@><3CAYHdKYzrvcJbTu2&9Ux#{h&%;!fZ&*j|k z7Q(9vGh)T$j9v6xO7$3+m}By23e8vN3DO_+Lp2d^jz}QsfYIdAA2merj(-xhrlp{M zA@1e6$uf(~U#9L}e{!*l&$lIZsi$DG+Q}+2zKGFCmAhIF9AX*f?l&aHB{Sp+b}~us z3o5t1|9=3hKvcg1y^OYFKeMcp&9#ypt8gwMX>o(;F8vw=*GEl&TD)kQW<`(rkG1kb zm)ojS4j)n!8bKBM^v&KV`WpFjM2;`OgR?K17DHFplzfm{6T*8*sRb88uYDba$Ep;5#X9l zc*D#oNQJYq?_!*1!<4}j2(Ye0*!AMRel(R6_D~9=&?@ zavp~I_pj<;#xOIXfm8bb8aOJvpC7-*^8X?7>#ridT!DXYE&ns=AC2r^!mfz<2QmM+ zVE(td{DbALwEXjiznMwD^(J--q%H~eg0Ye@2UWc^KVPH5gTF4U41=V*3Cu3>eQ_xx zSciVf5CdUtI=g6QHZW$`)4eiZ0}#lhz!lVymBP*~BD;?rTeofVH# z?Gj6}&+is}&9G}|o89RMoXgu5h}-B}2jYH{_U5?^1rRKk7fVwi1~l<<$s=&WDPjax_JhkN|M`#xYKoaBW21a zzfNNQP3j-K{2vF-2IzA*Q*LQw?RMt+F3iqpVrK39N%J$py}iCDlpP6r&)VjbVCLHv zX*yps)PI`6HGd#xeD!DdS$-ywb>1tj1Dq0?F%Dj4JCVYg=E=^l7-OsNa?1u+<-r!H znTSZrEm#aXv48wt!0A>8HiE5|R(;0uRTFew0qR$3Hs7Tm@BV$zw8-@7`I(ue4fw8QwHseUNX?9Wb@~8guOxi@BFnBL0)m16gf{Lm+C3oD=vE9 zr_50nIEj#hiWQP*bTJA!wR(oB{_(paA5^Mmxs@s{eWi#E&S5BcZ;B&~b=#MzpARf! zYo<;)*I;1f0@hM&vzj+$fG8j3a5cmrpfrS@oHXiu3v14TsUT8vJlAfIXl=6-*puhU zBR^gKvxtcM`6Kw(J*yt|jn_8I=5j$);U7Kx(xgTLG4v_q6{SWwpp)y!csM)1CgvlQ zZc5?U0Jzd>BiVn}z`yKL zckQ7h5BA0ihZfNkOU zR*Q6iV<>m6t9*h4193(SG$V<8hv$brj`DHZ_fUY6VBPi8*Sj`>bt%Abf z+YP1(mdhGrKWt1{i@5h z$jkLTL!&aIM`s=^|J)Sc0|j2KiF$juyz3Fv98 z$!f_4sMN}ud@~nMA1Q6fV<9bvRj515P;&wT|9S!d2>ko7gvurLceXI?Fw~lVm-vj4v}^G|_)+ov-BBynZ`|N3)3&hkG( z*(aDTp8qEAg=GJw?>cmE!=jpDyesU+b)PbaBdzx@=^>BBcASic4A(RSugWeC*;$GL%)mhRQy7|i4k|nO zB$Ee>z!hk5LF8Hcr$dI!HRHa@Bg8VZ zsos_9p^F2I4?SKcI-1l%LGwa=%nYEAL8Irst1h#>Yb?@iMoeQCr9%)#g3w}Ld)iaw z&QPlq1JC2VgLoBSb^&Pk0S}i&$qZVAXo0qJKX6S|A+I8+*N8gW9&!$9#6XX?^k zY`)o))t5#eBH@HBhS>&VJx>Qv0}cO^`P~}>igI4nhI3v4y#~cnR1(b~nE!i6>6iT+ zB`A&w2M@0svsBtOpY}eFJPy#oGSmWKWdN?^GKz8*im3T}B@rJTy`v;g(v5|p3rIC! zT+FZ?Hef={;sQy-JF*3Y`b(u)VpASA(j3JXLvpT5_|Kfy<*C+KpU*B;dLh{p;qy_D z7DYfi@O;@#;^74~7d^ROg2LsTEMb2rw7fkf{`~|1BJ$6(!9~|0p3O6uLrt>b`ukkV z8a&}xY|28Ck`>TnzGwt1{=+e@WjLkI` zqLhZ&QrqWHpMKt?dM;>42)wqWJIi5yB2*cJ>*`vFH+4uIi$gRsW%Kk->fMDIg;XuT z{wN5hnPDl`dC2m2ddTxUj}3u6rUd~4(0H1wO7ynK*b}jdAA}ZoM8r;#+D%!(sSen! zD{_2a`&lEAM=;>=-Tm%U3Glb@Lp}drFWLVmEdTELSJ}Ta|0_FS`uw+5b*fc=WBJD! z>USpp4`1rwnNBnRsBptbsOJ=O3PlZPN6JuVk!ZzEOo2x2xzG^O;Z4IV(*zq(_s&^_zhtnG6-jDSZA_!Z8&MJI(K(LD0w9VVO_JA{Rj1b| zetfn{WzX)LB7&Ezq^z8Ab}sipR*@Jp{+A46lpx%!1Xg9f8X!Ou6#DfapQ0I{oCzVj zI3LU8xdVKjw!G4sdGW#ng^>)b)P4vnuKQ4fpiL#L{=8^L$I3p)X0bEUye?U!Bw5Dx ztmHO5^G7w@Y~bXYJ7Z?mtF0l2fu2|?mlQ5Y;sj++fXWR?T2#u84;pAyzY24gkdmG{LElmVgV@f1 zz)e`IoEZawBbaRt7aJm8V}=EaMPS$lXo$+$R`Lu6{M*0$e|}c|<(pN1cgi+l+5ckt zwF+?j{iSvqDyTCAFh&zaYVhgF@{HQQpinBldbSDT>)cRgh%Vm?6pWb`(B?yZ=aI_F z6kREPO%d^Mw3t?jLW3oK<$E>#_W?^F?3 z=7h8qak=h2bv|V%;&=|dB+~`Jb+H<+33{DmlRKDxP~gD^)m&3@#(<;pR*0ql>;3>t{~yCbm+L z|790+46T=i59%bqAkV))5dW9RxJM2t#Pj2F_dh-VZ!G^Wzt-}91_I)3+5ep?*=}*x zU!BbV4U_;H>k#13tF1e~LxVS9cdfPDNF7b_$`iZ4@|GUUE$4F_6msWCDEuB&Mr$U8 z0#(QYy(6UWkY>PEXC#TI#5NK0186yCHbDlGqMS6u%Yiy-3H=ae3<9&(Y9$!60FwX| ztdvzy{Zi6JA{Jh*G$Q{nHk^zcCdf3dsSVo#qqZXxV4FVerC7Ob(7HG3Z-2p3!MvjY zxS!+u_{GQ1ncc--fcVce}Yd%@^koQsXcP{-e zXT{$gqym_2Cu8{^KL2%nj;g$I)jiX^>fdJeEsS8bpB@x55%BKWd*8^fcZc)w*- z8WMc)&@4x(Z-!{Ysu~vxjOLQhT6udi{s}Y}V0-fPOGns|?P~(;85UV*>`=V94}N6$ zDE`qu_{U%DVZ`@8R98rpYQAU@q>u&xeU`$G)Aew(+p2i8An0p{hk4y!8lYegn@sig z4JHH`?~w8GoNXU6|2YExzWl4l%fCroZ=b^aOG>(Ssozfq|Gq7TYsg>6FuJh?VE$Zj z0t0k^NYW-tsd9k=o)a^qVsTy7={vUU(w54}Ha}3Gy_U;nIop^%NrdGWyRA4ax zCnFle6CY^$U~oUz^xkKboG;M82_AN%23~2fm7WI^&=8-m%WYHqjBK?+J7_L7Kx{t8 zWBvxt!Fi;*V$=Gxv1ARV^|V_rRzRw!VwE*7u{5UzYWLW>uc=aoU;FKt^@x@)t~zM&Fhbln!lHM=ABi4X9en!_J4Z*r|%zvI|CZ!OTxROviVtL?Nn=+ z$M)HVC|qB5BR||ayS((>ik~fmpN|N|hYJTnn;KdSDm54lHb-W=KSHu%rtF&K-t^p- zNj3e&*g#H}KDLUi`mb^4EIKuuxVvIg6*;^Gd-!Tv zH+0#xnpu`NrLKRXT0OG4)0EbgJ15h`Lys&relJ!`xOJv_p27JIw(n;H^ZDhFY_%Hu zqovj+)gY!1?BMGOGtK|_-^$?d=gtJrl4ItxHpSTO)y8xM1HQbEKSD*dmB3GTx-S0V z_%BR+|9*sf=mmc&=uFbv&cO#T3P3JGe&AaRYbReRmoJBX(P!Y-(<`6#;hg8q`!4qQ z8TR<>nE`OQ{4dXc6Zl6AKUbbj=KqGmdg=0y(+7Jl|D)c@s{XbqdkyKczMVtvMkmb{ zOZK15@;@HfTeLEjvehq-zRKo2p}(7V%TOyx{ue%dht?aNm!@qSJ!8Wy%$O@$8z6d$ z3^EYU^l$;rts<~wMdf7Ompy>eh?%)hmP}d7&wQ_8X}|QEu#UTtW;|;K=R=$Vyd=cM z199?P=l7+q5EMKD*iI!w#x{e(_W43?kw*@}2>sg-*pJtAhn++Fd3|jWxu4(LM#JF# zF@Ev!^Yh=I!GM2b%>OsvoPmE|$A&ZaWGw&0(!V3wKU)D95O_y`C;R+Y;2%zK==i)h zY}5L5J3+RY_8&*!A2#y*$EwdffGm}n7x0}9Ckev~1=O-j=fAKTWw#UYeZ)TeFvYpZ zJx%SG$}Y0>euath`2k&gpmOd~y;6*c+WBq$(8mNU;v1!%}$>Fkg2}#h$st43RjON!}^#)c; z4_Qajd(7u+0VT7qa6A!9H&udpVeiilt4bvunoLe=Goha^=Zwu9lvws0Cp1jekP-{R z_gCW!b^E`l6XRYJy!0#6T0D=G5h3lmqB_@Co_C8zd04zCxgSYZRVbDu)QeekyWH9_NNdv;0 zfQCeD*o8TMeq1d7U;ZlYAKtIQcQF58MyrwizqR~t&GNr3PwPzk4~W-wuvi-{@>BN8 z47)uSypy<8Ocf#>bcWC&lc)qxdktr(zunUI`78T0gsYP>^kl7ZE32+33-H{WNo%o& z1P=~YU7yZi+DrnFXrO@>)2#CyD^w=g0F*2Ah(HTW1;Faq^(=+*jd5S%`J~=}BLK8Z zpRx000thrbfqI8uScCgb`Nq;vPoTWMf zP%cNC8Xk^nwCPyH%qkVRED>4jp+NdY__zuQ7h8irEq$4Cw23F2bD1)0Q2bm1Mv8sW zk*;Buhu2){5M4+V<>-T;>(12*32OY!Wwz`O7)~Bc!6;t?J-i-lA?3QbEGUIq;=oH} zS}uggc84z;QPRsfk0Nc^nPJ<*_I82*tK3?7UaqUm^w(2ZgUTjYrDYf-CcxBC$ThW| z05>Y6dHj2aNQ)wCs2Le=mBbh`T&eqmHXCu+~P{QU6YqwlRUo&cP0m@Ph z^P)m(0yQ8IKm`c>j$pgg@ivOJsAg+E3S816U;jB9px8HXF2~UF@?zFRk))-G*qKC6AYcdDZY7z5dpJEC4`8 zeBlULjY!FhC8zT46+;h;^vg@G-q9CM?u91_mqj0EPQbb$9QPUz$;@MD`tP>a_&x0L zr?JI{=e*l6|3A$0f19b+klL#i^0y?fx3d=ThPC{U;r8XWmVc1!f295Y|Lna>uXXE{ z7B-%DuD#F2MU2a)Vj?9HmXcngLPAM5$}vBHbRrZfUEGM2W~B6>5ve2u9YAH#p#dTd zL_`B|1dasFYLF5sDF`A=8(USJ%Xhxp-fKQ-%=hw)%UpYZJ}%1kIj7|MZhNo2E_04| zjPcwK6F{42K88743mae^;8ZH9dem<=+90?PkKl?V3dUMfcV=1MhiJ93>_G?(80C&#{n9s8f)W1LWHg*cM z5BE2QuZ;o!h=%`c_;)V|y{4U9ur&XdsQDMy|GT*?=(PX-ciSe5P#f<4%kWSChkjkD zhH(ArHLTGPZQOsshcct=C-sTOdUKzeUkjXmOxh)4gYFitvYSAp- zg=jIMM)nhgf-jIi+yr4O#&c>;v7+uwmKU(ZyBMq{Ko$!gdo*)#eY&s-+v53if?my` zxhzpoV?8g`Lx2VSyOXfrVx~UH0(e)-@Nk0(a}93d$N=B^zJOC8la`N)Q0%fYXNr$dBT@99LPe=kZ&N!CyZyPjHy{?^ycqFUjv358Gnt#r z%w{Nxw`}KCU z`y8zB6`lQq;osZWnf6}{|94`BwT!PM_DYBUO){JTC&ADLMY<99;v zvfe!qgQvOm_kpM48XT8=E5=Ac4{Zo&K5Jy4?vzG^O3ibIEneskQzYf2<0Sge7iV9! zI%shD+|9J97w>Q$x@+AqZ*w5)`u{d)+M?aId;V_;Y*D~Pn zUd)KRUWX9k-TF071iy@;L9r+Lkn&L0K_K`F96kkF2Xel>b8ijE0vJuTg!>nO0+%ub zO9E9#zm>>B$YM3tdFqC?icWA2XDeDxJygc>a6GX{#AQSS8L0TciMd?#1d!LSn$pOE zfPc4~!6Fxnp(;5H#|-V%MlrRN&#hoQz0|76v^>n7>kt_7&K&hyy&<_oGa4|5-p z(!9g8gW1F&Tuwc8U<@RxE7sv(5o4!6H$Qo+h8-~;Nh1hX$_A5r<63|#xq!g|j>WYS z>F{U7iSnX>M^hE0)gl7;g^KqCiUS$Taeeh1N)KmBlK^k6x8{c%@+4pkz^bMVIPNrk zU&+)D-ZCJ3a)L`0#4IzXE$m`gFl^lA1;5OhEGadh3`|tUB}&xKC!!i!Tiio zyc)nSS|q`W@Uhbr<`1+NJ_V*}u8i~i=&XHqXgOz`NrsRTC(^2zf8)RV_*13@Kp*`6 zLB1|fJW043;2mw_As(EC(U7lwat zGV(9fe24G{WBN80}|{JV4m9R0h^%+OW?GZNSG@G3d)5QCb2_2cC5 zY4h6U+Exb^%c7*4YxJNNmR!ZZs1gFZ;6yZAXa^DFoC0-kZopY&agTddB7uTwAO#8G zY=$cJuT?`T0pt!3iwRFhg#<>gsF%teSu%&*-=Shrh$c&(j^DX! z^TokLk+@08V}}iA_K_5D3~fh@hZ7kc~x3~7K$4|aC2K+-F z{;w~;IB5T`mf_!}F#J;qR6_nYO#)bnCnfE_M@S9{!PaEp?@NM-{IfHl`d~2RPzX)r zp#QnunV|QT`V--H3%2^cIk_EUy~~9Pak4H5001BWNkln&>$0Vnt}Dct9s?u1y;d@?rdyIDL^D^TNCo^Lf7~|!o#!nBvZ=J@M#)-Q3=L0N ztju(DXwJKxMG~T5zL=#A5#=0F8QQ#GIKiqpFe+W1OmC`Z*wNn)DFTvykV+r8FdsnY z(tlhd$XfFdkTI8j@FXBs4*!)_gWe$2U3hL0sLU6-MPgbsIYuO1bT~q){a`N~pM@}i z0C(#-^+c_P_cexbk{a^RAg_)L3b|Nf*2vk2k7UD#(>u*yp(hDURMmY%w~b@nlFeNE9YZS*B$0!3>ucN#Pqv=;rR$m*^pHIl4^va20}IjOj}5|U(0d>#+#l+!y!Y@ z9(#~{GjvAnVayf&dmmT(c6+q{6j%G#yx7~X@bI4v|M*T(e~N%zs^LF4{Ey!cbE~QO zA1Hr24x8by-rPd=h-lk7?Vn`OxE@pfLT+u*+?$=H+#UbK&`uC?2H||!%ahX2P{iOP zN1UTfS^-vTLRzHr&3!T9$p~WlvvP;&=>CJ~4GVJ=9lud!x^{jJ&KXZ`hk?FsPn{4W{)3GH8p|LNYZEP$x_ zherN|#1k?6+uBML*hZSfU;vn{q>0uW({6S;sjN_xOOQ-q;Hdk~x}U|dSbg(&R^Mt- zE~|*^7>jJ4_Q`^!wW8AD_n|{4@1$Dlr-GoHRLZ(a0maZQq2vL58mvQyxFXE|B5ImG zDsJs8D897#^1=_QvepZwLI-n3LDHDwulPyJRbn6YKrD#Cym8FLnovs>*3 zs-gb&H%8yd>`PDsRvO?rOfU(Hre8$nGnDLWx)cXGr+=hm$)V9kkjuoZZ$PhY zB%o{UhL|snljrHqeYr_tmQCx#K$0>ra$Km7w?q^7mgHTLSeHhNP4L-@q*{dg4rQ&*y27qTaoSu2W zLgaGposs$N`aGk(1Qz)#b~acbcjIs-D(be=i|#OXGh z8^p)0TyHWAamyQQ4=jpS|0bILdnX4N4*zTT-!$qE z3-N5Wn(GbT?SJF32xz^LT3OG1_{S=oEgt;PIFJ7Mx6qif-f&hrK03`@rV%DoELH-X z4D@;+aT&;!kt@#GT4M_R3CPk)7s-z(!F~+YO054G3MCPOm&DFmUAyG8B2!G(!cCL#1f*f2L}-U8-wsJH5Y&-w8N}J(@pBVm?$Unr)PnMec=ezE4qW&kx z_tFplXm;t&{#*Aq*$h2qvZMcfaK&VqtRa38V3cMmE+<@W#&g~QOS3K4Owdl;^79f< z8|x?^aBOpj=6fS84{oaWj~a?CTC$=h+m5t>X=cct-z;FKOC%eJ^>QlwJ z=4w1=QSbzh>-0uC8S+`7{ivk@tm!~UpH2G^kM^DI(Y}q{wy!kuKMeoaX{e%CEs*~^ zjM%Gz{EOya5iqDppwRwDQ@tIH@G$q=dSl#pP^gF7|Iq(q#9swUjz*TuONiYZ5M%hK zg`Ui_f5faVX**HC7f=dVpxRaU4+D2k*WnHYQly(gK@=Du$OaY~pokzs4z}K2a1Ex@ z%gS@(jNgkapZ@n`T1e9&UzXtvMhhKEvojvo5?bP30D_Z9Ks9J#@&J+#G?_2kpOd`!9z7i%T^LehyLdUm^d1T^emeJFb&3B0mJ^pWQnNgwL+lnc_9!ANPC#y{nc~nC1JV@1N$rO*mjn16v5?c}z+ess zQA8&@sm0B&LaUbYz16hL#zHUE^RV9)lR(lRGR~l_f;PvwqznXB{Z?Rr6-#EsXgCL| z6|xW4)Z^yB9#K3LmqLZ|KDRoZBKo}DN@`LR0^&Bz840+49-(zM%dP_M9i<=KmF*T+ z9ggIe`~kdR-XXT|ARMQcP+n#mqz4%cI%jT!b0fy+Ur`uqCXP!N6{% znq|B9gmb|(uZaLQgBFZzPv&9-C90fXZdZHepUX3g@snzeY~62xBO=)lfAyn}Kif|i z0R21up1UDWpTrH+y~^`^YHN1mHM58(OlB+|Gf0KUJ)h#8{}2!M8+c>?Nqe*p?JLwo zKV|qAGO8W&kEQ9qcU}N8uyif+wzWC%tLA^2q1i(G54t~(;lCkkvWMOkg4jB9X1F07 zh}q4WvrE~+77oY^2=u$V{b6bV8>!o*6kT>~}!J>Y5dbcKQaJs?*; zuNoaLFa&ZqN{$B*OpD-;F?gnejn@W7U)g}XnM8pV++ldV>(ESA!w6V^08SREO`K;G zrU#<)$!#~T0e@@mU1AQF+H;FwhHUDw=AJ+koKie?=8+DFL2GH-bv0NIu^MR7k ztTRWvhaQc~@GsCSL1}VoILWz%Ls9nXYzJLSs?D>f6^96?>E0>^ow5X^z~SEFNCyWQ z;8L(S?6iYF$+BaJG=zKq=xQCIqa5dgMt=Z<`6#IITB8}IV<61I;W>8sEG)tpJYB-O zSG|0kxGqTRGMyI^ZQQ|v&4?@W|QNA+H%Up}5>^+4OJakDjeB;^uBoYe*!5fIq zkSy61hHG}pGU$^!d`n)O@Y<(1;%uNy$bt$$+9|Oh+SW$LOG1Y*yAgT8$if&x*%YYg zLdLuda7-o7o>)7x;~s*fiV$2&l$CLm7Mn574bEUVUTlGx*L%_#N$TEoxz3^%J=}2! zgSwY*Aq{)(eorENzut=1Q!ep5JpxLtKPxUl@ligt>MNsC=o1%UHFKA1>5Wj9wJuJ{ zYq+;En-eEIwd ztc-#tSS2*ZEv4S1)$S>!eDMkPL;2~{M^yD?ES6szcKZNV`!*i!*Kn~f2;09Z!~cuV zMf1Og|BEyBGl$}<=Ktat0bcVzO|LrD|6F!GaVh;MF37(BFSKe#N zwPqfZqvn4hz@jt7(#d-3lYNS(GS}Hd=JC>q0%a@9d;3;Y-L8WKz)m~#ZXvTGB9qk-D3KIWj?Xk2266i5qwCX%_NSPzXsS&8k&zaY~&#apxNGsw%s@xDUR9zvqe=IuylV;P5!P0 zlxa7!ZVY%_5#O*Empl6k3!2_}_`kmVqHF$N%;EnG`PUSb`-=9j(SIlz$J-Vo|$84q+=mM%18h5Yy)zdkJ%K zf#8v{Dqw8N;_$>Gxz8h`(Tywuo1tLIU%4n%MnpPf|wUMj#43d*!#n?L*aVo6O5fZzPlPd_)a-$B$_@f;lR=QqoxbR~^0y&YL6 z10*waODpS=i2%#Y7qHsS(B8*`eWyLxAG5vOjQr{i|8H&oLWX}^wEqj%z`w~-;C^WS zo2UKXwXistNWVn?_3v4RSKamB+A{tVJ?o0W>V>^66m>2Kur6eVoh#I(jm(D5j`9s3 z_Y^kKYb&fpf;AJsJX&QIvOnl=%t~pA;c5%c_k@BxES;FG3!3$z=h-rJrD9PV*T#A@ zC!;7qka()e2yz*690O-YUNs!@KC0{8(xKb!)grKlh+Awp&q6^e_@Tw@b3)yUr~+4@ZY=v;H9+{^|#px@~`Hn;(an5 z{%x9{&M4Hu4A2X+Ac9dGv2t@Bd83kjOb$kCvaeu>bIf+7W&z=n8wXp0~3RSw9W8GHaD5MlY+k@hD=aYm2;;amOeo3-EC z7a-hMW;t2NNg49gMA7lIIA{N{4fM4nak43QJxkhKtz$IAe&9P6_cG3MV&db zEw+j-J^&O^d{nhmXNQQrJ-0*)dRR5thz7yL2(ERJ)-vf5nnxp-% z*uX_=9 z^3Eau@PD_}!~gVZ=wG{SW_RX?{}J7{joRi6P#42w($1S4*pQs=FqCRZYx9DPw+H+V zv&eFb_8lw+(?!FD%dVcJLvJiztvaPNpjb2r!yz=42#o| cso19rr-{3$^h;XuAs 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 ua2LS03ET_dK_Y*7 + +int main() { + return (int) LoadLibraryA; +}

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