diff --git a/third_party/swtpm/patches/0001-bazel-compat-glib.h-glib-glib.h.patch b/third_party/swtpm/patches/0001-bazel-compat-glib.h-glib-glib.h.patch
new file mode 100644
index 0000000..de98cd3
--- /dev/null
+++ b/third_party/swtpm/patches/0001-bazel-compat-glib.h-glib-glib.h.patch
@@ -0,0 +1,197 @@
+From c7932ca7f91b92002048e0e59470b0af6156aa8d Mon Sep 17 00:00:00 2001
+From: Serge Bazanski <serge@monogon.tech>
+Date: Tue, 4 Jun 2024 11:59:31 +0200
+Subject: [PATCH 1/4] bazel compat: <glib.h> -> "glib/glib.h"
+
+---
+ src/swtpm/cuse_tpm.c                    | 2 +-
+ src/swtpm/threadpool.c                  | 2 +-
+ src/swtpm_localca/swtpm_localca.c       | 2 +-
+ src/swtpm_localca/swtpm_localca.h       | 2 +-
+ src/swtpm_localca/swtpm_localca_utils.h | 2 +-
+ src/swtpm_setup/swtpm.c                 | 2 +-
+ src/swtpm_setup/swtpm.h                 | 2 +-
+ src/swtpm_setup/swtpm_setup.c           | 6 +++---
+ src/swtpm_setup/swtpm_setup.h           | 2 +-
+ src/swtpm_setup/swtpm_setup_utils.c     | 2 +-
+ src/swtpm_setup/swtpm_setup_utils.h     | 2 +-
+ src/utils/swtpm_utils.c                 | 2 +-
+ src/utils/swtpm_utils.h                 | 2 +-
+ 13 files changed, 15 insertions(+), 15 deletions(-)
+
+diff --git a/src/swtpm/cuse_tpm.c b/src/swtpm/cuse_tpm.c
+index 5977b63..4bcc503 100644
+--- a/src/swtpm/cuse_tpm.c
++++ b/src/swtpm/cuse_tpm.c
+@@ -56,7 +56,7 @@
+ 
+ #include <fuse/cuse_lowlevel.h>
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ 
+ #include <libtpms/tpm_library.h>
+ #include <libtpms/tpm_tis.h>
+diff --git a/src/swtpm/threadpool.c b/src/swtpm/threadpool.c
+index 770c16a..95d0085 100644
+--- a/src/swtpm/threadpool.c
++++ b/src/swtpm/threadpool.c
+@@ -37,7 +37,7 @@
+ 
+ #include <stdbool.h>
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ 
+ #include "threadpool.h"
+ 
+diff --git a/src/swtpm_localca/swtpm_localca.c b/src/swtpm_localca/swtpm_localca.c
+index 3a9fa6f..2842f22 100644
+--- a/src/swtpm_localca/swtpm_localca.c
++++ b/src/swtpm_localca/swtpm_localca.c
+@@ -22,7 +22,7 @@
+ #include <sys/stat.h>
+ #include <sys/types.h>
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ 
+ #include <gmp.h>
+ 
+diff --git a/src/swtpm_localca/swtpm_localca.h b/src/swtpm_localca/swtpm_localca.h
+index c1cb19f..e203a4d 100644
+--- a/src/swtpm_localca/swtpm_localca.h
++++ b/src/swtpm_localca/swtpm_localca.h
+@@ -10,7 +10,7 @@
+ #ifndef SWTPM_LOCALCA_H
+ #define SWTPM_LOCALCA_H
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ 
+ extern gchar *gl_LOGFILE;
+ 
+diff --git a/src/swtpm_localca/swtpm_localca_utils.h b/src/swtpm_localca/swtpm_localca_utils.h
+index 2fd33b8..487738a 100644
+--- a/src/swtpm_localca/swtpm_localca_utils.h
++++ b/src/swtpm_localca/swtpm_localca_utils.h
+@@ -10,7 +10,7 @@
+ #ifndef SWTPM_LOCALCA_UTILS_H
+ #define SWTPM_LOCALCA_UTILS_H
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ 
+ gchar *get_config_value(gchar **config_file_lines, const gchar *varname, const gchar *fallback);
+ int get_config_envvars(gchar **config_file_lines, gchar  ***env);
+diff --git a/src/swtpm_setup/swtpm.c b/src/swtpm_setup/swtpm.c
+index 822215e..66eac0b 100644
+--- a/src/swtpm_setup/swtpm.c
++++ b/src/swtpm_setup/swtpm.c
+@@ -21,7 +21,7 @@
+ #include <sys/wait.h>
+ #include <unistd.h>
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ 
+ #include <openssl/bn.h>
+ #include <openssl/evp.h>
+diff --git a/src/swtpm_setup/swtpm.h b/src/swtpm_setup/swtpm.h
+index 2f81dce..1377d38 100644
+--- a/src/swtpm_setup/swtpm.h
++++ b/src/swtpm_setup/swtpm.h
+@@ -10,7 +10,7 @@
+ #ifndef SWTPM_SETUP_SWTPM_H
+ #define SWTPM_SETUP_SWTPM_H
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ #include <pwd.h>
+ 
+ #include <openssl/sha.h>
+diff --git a/src/swtpm_setup/swtpm_setup.c b/src/swtpm_setup/swtpm_setup.c
+index 8f87ad4..96e8b9f 100644
+--- a/src/swtpm_setup/swtpm_setup.c
++++ b/src/swtpm_setup/swtpm_setup.c
+@@ -23,9 +23,9 @@
+ #include <sys/types.h>
+ #include <sys/wait.h>
+ 
+-#include <glib.h>
+-#include <glib/gstdio.h>
+-#include <glib/gprintf.h>
++#include "glib/glib.h"
++#include "glib/gstdio.h"
++#include "glib/gprintf.h"
+ 
+ #include <glib-object.h>
+ #include <json-glib/json-glib.h>
+diff --git a/src/swtpm_setup/swtpm_setup.h b/src/swtpm_setup/swtpm_setup.h
+index 913b36f..b87e501 100644
+--- a/src/swtpm_setup/swtpm_setup.h
++++ b/src/swtpm_setup/swtpm_setup.h
+@@ -10,7 +10,7 @@
+ #ifndef SWTPM_SETUP_H
+ #define SWTPM_SETUP_H
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ 
+ extern gchar *gl_LOGFILE;
+ 
+diff --git a/src/swtpm_setup/swtpm_setup_utils.c b/src/swtpm_setup/swtpm_setup_utils.c
+index 923e175..eddae73 100644
+--- a/src/swtpm_setup/swtpm_setup_utils.c
++++ b/src/swtpm_setup/swtpm_setup_utils.c
+@@ -17,7 +17,7 @@
+ #include <sys/utsname.h>
+ #include <unistd.h>
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ 
+ #include "swtpm_conf.h"
+ #include "swtpm_utils.h"
+diff --git a/src/swtpm_setup/swtpm_setup_utils.h b/src/swtpm_setup/swtpm_setup_utils.h
+index d074d3a..6c4be5e 100644
+--- a/src/swtpm_setup/swtpm_setup_utils.h
++++ b/src/swtpm_setup/swtpm_setup_utils.h
+@@ -10,7 +10,7 @@
+ #ifndef SWTPM_SETUP_UTILS_H
+ #define SWTPM_SETUP_UTILS_H
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ 
+ gchar *get_config_value(gchar **config_file_lines, const gchar *configname);
+ int create_config_files(gboolean overwrite, gboolean root_flag,
+diff --git a/src/utils/swtpm_utils.c b/src/utils/swtpm_utils.c
+index 35a4243..db32615 100644
+--- a/src/utils/swtpm_utils.c
++++ b/src/utils/swtpm_utils.c
+@@ -20,7 +20,7 @@
+ #include <string.h>
+ #include <unistd.h>
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ 
+ #include "swtpm_utils.h"
+ 
+diff --git a/src/utils/swtpm_utils.h b/src/utils/swtpm_utils.h
+index 22f1f4b..78ef97b 100644
+--- a/src/utils/swtpm_utils.h
++++ b/src/utils/swtpm_utils.h
+@@ -12,7 +12,7 @@
+ 
+ #include <pwd.h>
+ 
+-#include <glib.h>
++#include "glib/glib.h"
+ 
+ #define min(X,Y) ((X) < (Y) ? (X) : (Y))
+ #define ARRAY_LEN(a) (sizeof(a) / sizeof((a)[0]))
+-- 
+2.42.0
+
diff --git a/third_party/swtpm/patches/0002-swtpm_localca-replace-gmp-mpz-dependency-with-boring.patch b/third_party/swtpm/patches/0002-swtpm_localca-replace-gmp-mpz-dependency-with-boring.patch
new file mode 100644
index 0000000..21a2552
--- /dev/null
+++ b/third_party/swtpm/patches/0002-swtpm_localca-replace-gmp-mpz-dependency-with-boring.patch
@@ -0,0 +1,80 @@
+From 9410d7d0e3093380bb9d5cff3241107ff55435dd Mon Sep 17 00:00:00 2001
+From: Serge Bazanski <serge@monogon.tech>
+Date: Tue, 4 Jun 2024 12:06:17 +0200
+Subject: [PATCH 2/4] swtpm_localca: replace gmp/mpz dependency with boringssl
+ bignum
+
+---
+ src/swtpm_localca/swtpm_localca.c | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+diff --git a/src/swtpm_localca/swtpm_localca.c b/src/swtpm_localca/swtpm_localca.c
+index 2842f22..d42d3a2 100644
+--- a/src/swtpm_localca/swtpm_localca.c
++++ b/src/swtpm_localca/swtpm_localca.c
+@@ -24,7 +24,8 @@
+ 
+ #include "glib/glib.h"
+ 
+-#include <gmp.h>
++#include <openssl/bn.h>
++#include <openssl/crypto.h>
+ 
+ #include "swtpm_conf.h"
+ #include "swtpm_utils.h"
+@@ -313,7 +314,8 @@ static int get_next_serial(const gchar *certserial, const gchar *lockfile,
+     g_autofree gchar *buffer = NULL;
+     char serialbuffer[50];
+     size_t buffer_len;
+-    mpz_t serial;
++    BIGNUM *serial = BN_new();
++    char *serial_dec = NULL;
+     int lockfd;
+     int ret = 1;
+ 
+@@ -328,22 +330,18 @@ static int get_next_serial(const gchar *certserial, const gchar *lockfile,
+     if (read_file(certserial, &buffer, &buffer_len) != 0)
+         goto error;
+ 
+-    mpz_init(serial);
+-
+     if (buffer_len > 0 && buffer_len <= 49) {
+         memcpy(serialbuffer, buffer, buffer_len);
+         serialbuffer[buffer_len] = 0;
+ 
+-        if (gmp_sscanf(serialbuffer, "%Zu", serial) != 1)
+-            goto new_serial;
+-        mpz_add_ui(serial, serial, 1);
+-
+-        if ((mpz_sizeinbase(serial, 2) + 7) / 8 > 20)
++        if (BN_dec2bn(&serial, serialbuffer) == 0)
+             goto new_serial;
++        BN_add_word(serial, 1);
+ 
+-        if (gmp_snprintf(serialbuffer,
++        serial_dec = BN_bn2dec(serial);
++        if (snprintf(serialbuffer,
+                          sizeof(serialbuffer),
+-                         "%Zu", serial) >= (int)sizeof(serialbuffer))
++                         "%s", serial_dec) >= (int)sizeof(serialbuffer))
+             goto new_serial;
+     } else {
+ new_serial:
+@@ -356,10 +354,12 @@ new_serial:
+     write_file(certserial, (unsigned char *)*serial_str, strlen(*serial_str));
+     ret = 0;
+ 
+-    mpz_clear(serial);
+-
+ error:
+     unlock_file(lockfd);
++    if (serial_dec) {
++        OPENSSL_free(serial_dec);
++    }
++    BN_free(serial);
+ 
+     return ret;
+ }
+-- 
+2.42.0
+
diff --git a/third_party/swtpm/patches/0003-swtpm_setup-replace-dep-on-JSON-GLib-with-sheredom-j.patch b/third_party/swtpm/patches/0003-swtpm_setup-replace-dep-on-JSON-GLib-with-sheredom-j.patch
new file mode 100644
index 0000000..5d13017
--- /dev/null
+++ b/third_party/swtpm/patches/0003-swtpm_setup-replace-dep-on-JSON-GLib-with-sheredom-j.patch
@@ -0,0 +1,3681 @@
+From be2cc81e58d33e09aef534d517c5dda0d7f12272 Mon Sep 17 00:00:00 2001
+From: Serge Bazanski <serge@monogon.tech>
+Date: Tue, 4 Jun 2024 12:49:01 +0200
+Subject: [PATCH 3/4] swtpm_setup: replace dep on JSON-GLib with
+ sheredom/json.h
+
+Turns out swtpm_setup requests capability info from `swtpm` by shelling
+out to it then parsing JSON output.
+
+Pulling in JSON-Glib as a library sounds like pain. Let's just use a
+simple single-file JSON parser library.
+
+There will be no comment on using JSON for this from me.
+---
+ include/json.h                | 3462 +++++++++++++++++++++++++++++++++
+ src/swtpm_setup/swtpm_setup.c |  150 +-
+ 2 files changed, 3554 insertions(+), 58 deletions(-)
+ create mode 100644 include/json.h
+
+diff --git a/include/json.h b/include/json.h
+new file mode 100644
+index 0000000..7116d85
+--- /dev/null
++++ b/include/json.h
+@@ -0,0 +1,3462 @@
++/*
++   The latest version of this library is available on GitHub;
++   https://github.com/sheredom/json.h.
++*/
++
++/*
++   This is free and unencumbered software released into the public domain.
++
++   Anyone is free to copy, modify, publish, use, compile, sell, or
++   distribute this software, either in source code form or as a compiled
++   binary, for any purpose, commercial or non-commercial, and by any
++   means.
++
++   In jurisdictions that recognize copyright laws, the author or authors
++   of this software dedicate any and all copyright interest in the
++   software to the public domain. We make this dedication for the benefit
++   of the public at large and to the detriment of our heirs and
++   successors. We intend this dedication to be an overt act of
++   relinquishment in perpetuity of all present and future rights to this
++   software under copyright law.
++
++   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 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.
++
++   For more information, please refer to <http://unlicense.org/>.
++*/
++
++#ifndef SHEREDOM_JSON_H_INCLUDED
++#define SHEREDOM_JSON_H_INCLUDED
++
++#if defined(_MSC_VER)
++#pragma warning(push)
++
++/* disable warning: no function prototype given: converting '()' to '(void)' */
++#pragma warning(disable : 4255)
++
++/* disable warning: '__cplusplus' is not defined as a preprocessor macro,
++ * replacing with '0' for '#if/#elif' */
++#pragma warning(disable : 4668)
++
++/* disable warning: 'bytes padding added after construct' */
++#pragma warning(disable : 4820)
++#endif
++
++#include <stddef.h>
++#include <string.h>
++
++#if defined(__TINYC__)
++#define JSON_ATTRIBUTE(a) __attribute((a))
++#else
++#define JSON_ATTRIBUTE(a) __attribute__((a))
++#endif
++
++#if defined(_MSC_VER) || defined(__WATCOMC__)
++#define json_weak __inline
++#elif defined(__clang__) || defined(__GNUC__) || defined(__TINYC__)
++#define json_weak JSON_ATTRIBUTE(weak)
++#else
++#error Non clang, non gcc, non MSVC, non tcc, non WATCOM compiler found!
++#endif
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++struct json_value_s;
++struct json_parse_result_s;
++
++enum json_parse_flags_e {
++  json_parse_flags_default = 0,
++
++  /* allow trailing commas in objects and arrays. For example, both [true,] and
++     {"a" : null,} would be allowed with this option on. */
++  json_parse_flags_allow_trailing_comma = 0x1,
++
++  /* allow unquoted keys for objects. For example, {a : null} would be allowed
++     with this option on. */
++  json_parse_flags_allow_unquoted_keys = 0x2,
++
++  /* allow a global unbracketed object. For example, a : null, b : true, c : {}
++     would be allowed with this option on. */
++  json_parse_flags_allow_global_object = 0x4,
++
++  /* allow objects to use '=' instead of ':' between key/value pairs. For
++     example, a = null, b : true would be allowed with this option on. */
++  json_parse_flags_allow_equals_in_object = 0x8,
++
++  /* allow that objects don't have to have comma separators between key/value
++     pairs. */
++  json_parse_flags_allow_no_commas = 0x10,
++
++  /* allow c-style comments (either variants) to be ignored in the input JSON
++     file. */
++  json_parse_flags_allow_c_style_comments = 0x20,
++
++  /* deprecated flag, unused. */
++  json_parse_flags_deprecated = 0x40,
++
++  /* record location information for each value. */
++  json_parse_flags_allow_location_information = 0x80,
++
++  /* allow strings to be 'single quoted'. */
++  json_parse_flags_allow_single_quoted_strings = 0x100,
++
++  /* allow numbers to be hexadecimal. */
++  json_parse_flags_allow_hexadecimal_numbers = 0x200,
++
++  /* allow numbers like +123 to be parsed. */
++  json_parse_flags_allow_leading_plus_sign = 0x400,
++
++  /* allow numbers like .0123 or 123. to be parsed. */
++  json_parse_flags_allow_leading_or_trailing_decimal_point = 0x800,
++
++  /* allow Infinity, -Infinity, NaN, -NaN. */
++  json_parse_flags_allow_inf_and_nan = 0x1000,
++
++  /* allow multi line string values. */
++  json_parse_flags_allow_multi_line_strings = 0x2000,
++
++  /* allow simplified JSON to be parsed. Simplified JSON is an enabling of a set
++     of other parsing options. */
++  json_parse_flags_allow_simplified_json =
++      (json_parse_flags_allow_trailing_comma |
++       json_parse_flags_allow_unquoted_keys |
++       json_parse_flags_allow_global_object |
++       json_parse_flags_allow_equals_in_object |
++       json_parse_flags_allow_no_commas),
++
++  /* allow JSON5 to be parsed. JSON5 is an enabling of a set of other parsing
++     options. */
++  json_parse_flags_allow_json5 =
++      (json_parse_flags_allow_trailing_comma |
++       json_parse_flags_allow_unquoted_keys |
++       json_parse_flags_allow_c_style_comments |
++       json_parse_flags_allow_single_quoted_strings |
++       json_parse_flags_allow_hexadecimal_numbers |
++       json_parse_flags_allow_leading_plus_sign |
++       json_parse_flags_allow_leading_or_trailing_decimal_point |
++       json_parse_flags_allow_inf_and_nan |
++       json_parse_flags_allow_multi_line_strings)
++};
++
++/* Parse a JSON text file, returning a pointer to the root of the JSON
++ * structure. json_parse performs 1 call to malloc for the entire encoding.
++ * Returns 0 if an error occurred (malformed JSON input, or malloc failed). */
++json_weak struct json_value_s *json_parse(const void *src, size_t src_size);
++
++/* Parse a JSON text file, returning a pointer to the root of the JSON
++ * structure. json_parse performs 1 call to alloc_func_ptr for the entire
++ * encoding. Returns 0 if an error occurred (malformed JSON input, or malloc
++ * failed). If an error occurred, the result struct (if not NULL) will explain
++ * the type of error, and the location in the input it occurred. If
++ * alloc_func_ptr is null then malloc is used. */
++json_weak struct json_value_s *
++json_parse_ex(const void *src, size_t src_size, size_t flags_bitset,
++              void *(*alloc_func_ptr)(void *, size_t), void *user_data,
++              struct json_parse_result_s *result);
++
++/* Extracts a value and all the data that makes it up into a newly created
++ * value. json_extract_value performs 1 call to malloc for the entire encoding.
++ */
++json_weak struct json_value_s *
++json_extract_value(const struct json_value_s *value);
++
++/* Extracts a value and all the data that makes it up into a newly created
++ * value. json_extract_value performs 1 call to alloc_func_ptr for the entire
++ * encoding. If alloc_func_ptr is null then malloc is used. */
++json_weak struct json_value_s *
++json_extract_value_ex(const struct json_value_s *value,
++                      void *(*alloc_func_ptr)(void *, size_t), void *user_data);
++
++/* Write out a minified JSON utf-8 string. This string is an encoding of the
++ * minimal string characters required to still encode the same data.
++ * json_write_minified performs 1 call to malloc for the entire encoding. Return
++ * 0 if an error occurred (malformed JSON input, or malloc failed). The out_size
++ * parameter is optional as the utf-8 string is null terminated. */
++json_weak void *json_write_minified(const struct json_value_s *value,
++                                    size_t *out_size);
++
++/* Write out a pretty JSON utf-8 string. This string is encoded such that the
++ * resultant JSON is pretty in that it is easily human readable. The indent and
++ * newline parameters allow a user to specify what kind of indentation and
++ * newline they want (two spaces / three spaces / tabs? \r, \n, \r\n ?). Both
++ * indent and newline can be NULL, indent defaults to two spaces ("  "), and
++ * newline defaults to linux newlines ('\n' as the newline character).
++ * json_write_pretty performs 1 call to malloc for the entire encoding. Return 0
++ * if an error occurred (malformed JSON input, or malloc failed). The out_size
++ * parameter is optional as the utf-8 string is null terminated. */
++json_weak void *json_write_pretty(const struct json_value_s *value,
++                                  const char *indent, const char *newline,
++                                  size_t *out_size);
++
++/* Reinterpret a JSON value as a string. Returns null is the value was not a
++ * string. */
++json_weak struct json_string_s *
++json_value_as_string(struct json_value_s *const value);
++
++/* Reinterpret a JSON value as a number. Returns null is the value was not a
++ * number. */
++json_weak struct json_number_s *
++json_value_as_number(struct json_value_s *const value);
++
++/* Reinterpret a JSON value as an object. Returns null is the value was not an
++ * object. */
++json_weak struct json_object_s *
++json_value_as_object(struct json_value_s *const value);
++
++/* Reinterpret a JSON value as an array. Returns null is the value was not an
++ * array. */
++json_weak struct json_array_s *
++json_value_as_array(struct json_value_s *const value);
++
++/* Whether the value is true. */
++json_weak int json_value_is_true(const struct json_value_s *const value);
++
++/* Whether the value is false. */
++json_weak int json_value_is_false(const struct json_value_s *const value);
++
++/* Whether the value is null. */
++json_weak int json_value_is_null(const struct json_value_s *const value);
++
++/* The various types JSON values can be. Used to identify what a value is. */
++typedef enum json_type_e {
++  json_type_string,
++  json_type_number,
++  json_type_object,
++  json_type_array,
++  json_type_true,
++  json_type_false,
++  json_type_null
++
++} json_type_t;
++
++/* A JSON string value. */
++typedef struct json_string_s {
++  /* utf-8 string */
++  const char *string;
++  /* The size (in bytes) of the string */
++  size_t string_size;
++
++} json_string_t;
++
++/* A JSON string value (extended). */
++typedef struct json_string_ex_s {
++  /* The JSON string this extends. */
++  struct json_string_s string;
++
++  /* The character offset for the value in the JSON input. */
++  size_t offset;
++
++  /* The line number for the value in the JSON input. */
++  size_t line_no;
++
++  /* The row number for the value in the JSON input, in bytes. */
++  size_t row_no;
++
++} json_string_ex_t;
++
++/* A JSON number value. */
++typedef struct json_number_s {
++  /* ASCII string containing representation of the number. */
++  const char *number;
++  /* the size (in bytes) of the number. */
++  size_t number_size;
++
++} json_number_t;
++
++/* an element of a JSON object. */
++typedef struct json_object_element_s {
++  /* the name of this element. */
++  struct json_string_s *name;
++  /* the value of this element. */
++  struct json_value_s *value;
++  /* the next object element (can be NULL if the last element in the object). */
++  struct json_object_element_s *next;
++
++} json_object_element_t;
++
++/* a JSON object value. */
++typedef struct json_object_s {
++  /* a linked list of the elements in the object. */
++  struct json_object_element_s *start;
++  /* the number of elements in the object. */
++  size_t length;
++
++} json_object_t;
++
++/* an element of a JSON array. */
++typedef struct json_array_element_s {
++  /* the value of this element. */
++  struct json_value_s *value;
++  /* the next array element (can be NULL if the last element in the array). */
++  struct json_array_element_s *next;
++
++} json_array_element_t;
++
++/* a JSON array value. */
++typedef struct json_array_s {
++  /* a linked list of the elements in the array. */
++  struct json_array_element_s *start;
++  /* the number of elements in the array. */
++  size_t length;
++
++} json_array_t;
++
++/* a JSON value. */
++typedef struct json_value_s {
++  /* a pointer to either a json_string_s, json_number_s, json_object_s, or. */
++  /* json_array_s. Should be cast to the appropriate struct type based on what.
++   */
++  /* the type of this value is. */
++  void *payload;
++  /* must be one of json_type_e. If type is json_type_true, json_type_false, or.
++   */
++  /* json_type_null, payload will be NULL. */
++  size_t type;
++
++} json_value_t;
++
++/* a JSON value (extended). */
++typedef struct json_value_ex_s {
++  /* the JSON value this extends. */
++  struct json_value_s value;
++
++  /* the character offset for the value in the JSON input. */
++  size_t offset;
++
++  /* the line number for the value in the JSON input. */
++  size_t line_no;
++
++  /* the row number for the value in the JSON input, in bytes. */
++  size_t row_no;
++
++} json_value_ex_t;
++
++/* a parsing error code. */
++enum json_parse_error_e {
++  /* no error occurred (huzzah!). */
++  json_parse_error_none = 0,
++
++  /* expected either a comma or a closing '}' or ']' to close an object or. */
++  /* array! */
++  json_parse_error_expected_comma_or_closing_bracket,
++
++  /* colon separating name/value pair was missing! */
++  json_parse_error_expected_colon,
++
++  /* expected string to begin with '"'! */
++  json_parse_error_expected_opening_quote,
++
++  /* invalid escaped sequence in string! */
++  json_parse_error_invalid_string_escape_sequence,
++
++  /* invalid number format! */
++  json_parse_error_invalid_number_format,
++
++  /* invalid value! */
++  json_parse_error_invalid_value,
++
++  /* reached end of buffer before object/array was complete! */
++  json_parse_error_premature_end_of_buffer,
++
++  /* string was malformed! */
++  json_parse_error_invalid_string,
++
++  /* a call to malloc, or a user provider allocator, failed. */
++  json_parse_error_allocator_failed,
++
++  /* the JSON input had unexpected trailing characters that weren't part of the.
++     JSON value. */
++  json_parse_error_unexpected_trailing_characters,
++
++  /* catch-all error for everything else that exploded (real bad chi!). */
++  json_parse_error_unknown
++};
++
++/* error report from json_parse_ex(). */
++typedef struct json_parse_result_s {
++  /* the error code (one of json_parse_error_e). */
++  size_t error;
++
++  /* the character offset for the error in the JSON input. */
++  size_t error_offset;
++
++  /* the line number for the error in the JSON input. */
++  size_t error_line_no;
++
++  /* the row number for the error, in bytes. */
++  size_t error_row_no;
++
++} json_parse_result_t;
++
++#ifdef __cplusplus
++} /* extern "C". */
++#endif
++
++#include <stdlib.h>
++
++#if defined(_MSC_VER)
++#pragma warning(pop)
++#endif
++
++#if defined(_MSC_VER) && (_MSC_VER < 1920)
++#define json_uintmax_t unsigned __int64
++#else
++#include <inttypes.h>
++#define json_uintmax_t uintmax_t
++#endif
++
++#if defined(_MSC_VER)
++#define json_strtoumax _strtoui64
++#else
++#define json_strtoumax strtoumax
++#endif
++
++#if defined(__cplusplus) && (__cplusplus >= 201103L)
++#define json_null nullptr
++#else
++#define json_null 0
++#endif
++
++#if defined(__clang__)
++#pragma clang diagnostic push
++
++/* we do one big allocation via malloc, then cast aligned slices of this for. */
++/* our structures - we don't have a way to tell the compiler we know what we. */
++/* are doing, so disable the warning instead! */
++#pragma clang diagnostic ignored "-Wcast-align"
++
++/* We use C style casts everywhere. */
++#pragma clang diagnostic ignored "-Wold-style-cast"
++
++/* We need long long for strtoull. */
++#pragma clang diagnostic ignored "-Wc++11-long-long"
++
++/* Who cares if nullptr doesn't work with C++98, we don't use it there! */
++#pragma clang diagnostic ignored "-Wc++98-compat"
++#pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
++
++#if __has_warning("-Wunsafe-buffer-usage")
++#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
++#endif
++
++#elif defined(_MSC_VER)
++#pragma warning(push)
++
++/* disable 'function selected for inline expansion' warning. */
++#pragma warning(disable : 4711)
++
++/* disable '#pragma warning: there is no warning number' warning. */
++#pragma warning(disable : 4619)
++
++/* disable 'warning number not a valid compiler warning' warning. */
++#pragma warning(disable : 4616)
++
++/* disable 'Compiler will insert Spectre mitigation for memory load if
++ * /Qspectre. */
++/* switch specified' warning. */
++#pragma warning(disable : 5045)
++#endif
++
++struct json_parse_state_s {
++  const char *src;
++  size_t size;
++  size_t offset;
++  size_t flags_bitset;
++  char *data;
++  char *dom;
++  size_t dom_size;
++  size_t data_size;
++  size_t line_no;     /* line counter for error reporting. */
++  size_t line_offset; /* (offset-line_offset) is the character number (in
++                         bytes). */
++  size_t error;
++};
++
++json_weak int json_hexadecimal_digit(const char c);
++int json_hexadecimal_digit(const char c) {
++  if ('0' <= c && c <= '9') {
++    return c - '0';
++  }
++  if ('a' <= c && c <= 'f') {
++    return c - 'a' + 10;
++  }
++  if ('A' <= c && c <= 'F') {
++    return c - 'A' + 10;
++  }
++  return -1;
++}
++
++json_weak int json_hexadecimal_value(const char *c, const unsigned long size,
++                                     unsigned long *result);
++int json_hexadecimal_value(const char *c, const unsigned long size,
++                           unsigned long *result) {
++  const char *p;
++  int digit;
++
++  if (size > sizeof(unsigned long) * 2) {
++    return 0;
++  }
++
++  *result = 0;
++  for (p = c; (unsigned long)(p - c) < size; ++p) {
++    *result <<= 4;
++    digit = json_hexadecimal_digit(*p);
++    if (digit < 0 || digit > 15) {
++      return 0;
++    }
++    *result |= (unsigned char)digit;
++  }
++  return 1;
++}
++
++json_weak int json_skip_whitespace(struct json_parse_state_s *state);
++int json_skip_whitespace(struct json_parse_state_s *state) {
++  size_t offset = state->offset;
++  const size_t size = state->size;
++  const char *const src = state->src;
++
++  if (offset >= state->size) {
++    return 0;
++  }
++
++  /* the only valid whitespace according to ECMA-404 is ' ', '\n', '\r' and
++   * '\t'. */
++  switch (src[offset]) {
++  default:
++    return 0;
++  case ' ':
++  case '\r':
++  case '\t':
++  case '\n':
++    break;
++  }
++
++  do {
++    switch (src[offset]) {
++    default:
++      /* Update offset. */
++      state->offset = offset;
++      return 1;
++    case ' ':
++    case '\r':
++    case '\t':
++      break;
++    case '\n':
++      state->line_no++;
++      state->line_offset = offset;
++      break;
++    }
++
++    offset++;
++  } while (offset < size);
++
++  /* Update offset. */
++  state->offset = offset;
++  return 1;
++}
++
++json_weak int json_skip_c_style_comments(struct json_parse_state_s *state);
++int json_skip_c_style_comments(struct json_parse_state_s *state) {
++  /* to have a C-style comment we need at least 2 characters of space */
++  if ((state->offset + 2) > state->size) {
++    return 0;
++  }
++
++  /* do we have a comment? */
++  if ('/' == state->src[state->offset]) {
++    if ('/' == state->src[state->offset + 1]) {
++      /* we had a comment of the form // */
++
++      /* skip first '/' */
++      state->offset++;
++
++      /* skip second '/' */
++      state->offset++;
++
++      while (state->offset < state->size) {
++        switch (state->src[state->offset]) {
++        default:
++          /* skip the character in the comment */
++          state->offset++;
++          break;
++        case '\n':
++          /* if we have a newline, our comment has ended! Skip the newline */
++          state->offset++;
++
++          /* we entered a newline, so move our line info forward */
++          state->line_no++;
++          state->line_offset = state->offset;
++          return 1;
++        }
++      }
++
++      /* we reached the end of the JSON file! */
++      return 1;
++    } else if ('*' == state->src[state->offset + 1]) {
++      /* we had a comment in the C-style long form */
++
++      /* skip '/' */
++      state->offset++;
++
++      /* skip '*' */
++      state->offset++;
++
++      while (state->offset + 1 < state->size) {
++        if (('*' == state->src[state->offset]) &&
++            ('/' == state->src[state->offset + 1])) {
++          /* we reached the end of our comment! */
++          state->offset += 2;
++          return 1;
++        } else if ('\n' == state->src[state->offset]) {
++          /* we entered a newline, so move our line info forward */
++          state->line_no++;
++          state->line_offset = state->offset;
++        }
++
++        /* skip character within comment */
++        state->offset++;
++      }
++
++      /* comment wasn't ended correctly which is a failure */
++      return 1;
++    }
++  }
++
++  /* we didn't have any comment, which is ok too! */
++  return 0;
++}
++
++json_weak int json_skip_all_skippables(struct json_parse_state_s *state);
++int json_skip_all_skippables(struct json_parse_state_s *state) {
++  /* skip all whitespace and other skippables until there are none left. note
++   * that the previous version suffered from read past errors should. the
++   * stream end on json_skip_c_style_comments eg. '{"a" ' with comments flag.
++   */
++
++  int did_consume = 0;
++  const size_t size = state->size;
++
++  if (json_parse_flags_allow_c_style_comments & state->flags_bitset) {
++    do {
++      if (state->offset == size) {
++        state->error = json_parse_error_premature_end_of_buffer;
++        return 1;
++      }
++
++      did_consume = json_skip_whitespace(state);
++
++      /* This should really be checked on access, not in front of every call.
++       */
++      if (state->offset >= size) {
++        state->error = json_parse_error_premature_end_of_buffer;
++        return 1;
++      }
++
++      did_consume |= json_skip_c_style_comments(state);
++    } while (0 != did_consume);
++  } else {
++    do {
++      if (state->offset == size) {
++        state->error = json_parse_error_premature_end_of_buffer;
++        return 1;
++      }
++
++      did_consume = json_skip_whitespace(state);
++    } while (0 != did_consume);
++  }
++
++  if (state->offset == size) {
++    state->error = json_parse_error_premature_end_of_buffer;
++    return 1;
++  }
++
++  return 0;
++}
++
++json_weak int json_get_value_size(struct json_parse_state_s *state,
++                                  int is_global_object);
++
++json_weak int json_get_string_size(struct json_parse_state_s *state,
++                                   size_t is_key);
++int json_get_string_size(struct json_parse_state_s *state, size_t is_key) {
++  size_t offset = state->offset;
++  const size_t size = state->size;
++  size_t data_size = 0;
++  const char *const src = state->src;
++  const int is_single_quote = '\'' == src[offset];
++  const char quote_to_use = is_single_quote ? '\'' : '"';
++  const size_t flags_bitset = state->flags_bitset;
++  unsigned long codepoint;
++  unsigned long high_surrogate = 0;
++
++  if ((json_parse_flags_allow_location_information & flags_bitset) != 0 &&
++      is_key != 0) {
++    state->dom_size += sizeof(struct json_string_ex_s);
++  } else {
++    state->dom_size += sizeof(struct json_string_s);
++  }
++
++  if ('"' != src[offset]) {
++    /* if we are allowed single quoted strings check for that too. */
++    if (!((json_parse_flags_allow_single_quoted_strings & flags_bitset) &&
++          is_single_quote)) {
++      state->error = json_parse_error_expected_opening_quote;
++      state->offset = offset;
++      return 1;
++    }
++  }
++
++  /* skip leading '"' or '\''. */
++  offset++;
++
++  while ((offset < size) && (quote_to_use != src[offset])) {
++    /* add space for the character. */
++    data_size++;
++
++    switch (src[offset]) {
++    default:
++      break;
++    case '\0':
++    case '\t':
++      state->error = json_parse_error_invalid_string;
++      state->offset = offset;
++      return 1;
++    }
++
++    if ('\\' == src[offset]) {
++      /* skip reverse solidus character. */
++      offset++;
++
++      if (offset == size) {
++        state->error = json_parse_error_premature_end_of_buffer;
++        state->offset = offset;
++        return 1;
++      }
++
++      switch (src[offset]) {
++      default:
++        state->error = json_parse_error_invalid_string_escape_sequence;
++        state->offset = offset;
++        return 1;
++      case '"':
++      case '\\':
++      case '/':
++      case 'b':
++      case 'f':
++      case 'n':
++      case 'r':
++      case 't':
++        /* all valid characters! */
++        offset++;
++        break;
++      case 'u':
++        if (!(offset + 5 < size)) {
++          /* invalid escaped unicode sequence! */
++          state->error = json_parse_error_invalid_string_escape_sequence;
++          state->offset = offset;
++          return 1;
++        }
++
++        codepoint = 0;
++        if (!json_hexadecimal_value(&src[offset + 1], 4, &codepoint)) {
++          /* escaped unicode sequences must contain 4 hexadecimal digits! */
++          state->error = json_parse_error_invalid_string_escape_sequence;
++          state->offset = offset;
++          return 1;
++        }
++
++        /* Valid sequence!
++         * see: https://en.wikipedia.org/wiki/UTF-8#Invalid_code_points.
++         *      1       7       U + 0000        U + 007F        0xxxxxxx.
++         *      2       11      U + 0080        U + 07FF        110xxxxx
++         * 10xxxxxx.
++         *      3       16      U + 0800        U + FFFF        1110xxxx
++         * 10xxxxxx        10xxxxxx.
++         *      4       21      U + 10000       U + 10FFFF      11110xxx
++         * 10xxxxxx        10xxxxxx        10xxxxxx.
++         * Note: the high and low surrogate halves used by UTF-16 (U+D800
++         * through U+DFFF) and code points not encodable by UTF-16 (those after
++         * U+10FFFF) are not legal Unicode values, and their UTF-8 encoding must
++         * be treated as an invalid byte sequence. */
++
++        if (high_surrogate != 0) {
++          /* we previously read the high half of the \uxxxx\uxxxx pair, so now
++           * we expect the low half. */
++          if (codepoint >= 0xdc00 &&
++              codepoint <= 0xdfff) { /* low surrogate range. */
++            data_size += 3;
++            high_surrogate = 0;
++          } else {
++            state->error = json_parse_error_invalid_string_escape_sequence;
++            state->offset = offset;
++            return 1;
++          }
++        } else if (codepoint <= 0x7f) {
++          data_size += 0;
++        } else if (codepoint <= 0x7ff) {
++          data_size += 1;
++        } else if (codepoint >= 0xd800 &&
++                   codepoint <= 0xdbff) { /* high surrogate range. */
++          /* The codepoint is the first half of a "utf-16 surrogate pair". so we
++           * need the other half for it to be valid: \uHHHH\uLLLL. */
++          if (offset + 11 > size || '\\' != src[offset + 5] ||
++              'u' != src[offset + 6]) {
++            state->error = json_parse_error_invalid_string_escape_sequence;
++            state->offset = offset;
++            return 1;
++          }
++          high_surrogate = codepoint;
++        } else if (codepoint >= 0xd800 &&
++                   codepoint <= 0xdfff) { /* low surrogate range. */
++          /* we did not read the other half before. */
++          state->error = json_parse_error_invalid_string_escape_sequence;
++          state->offset = offset;
++          return 1;
++        } else {
++          data_size += 2;
++        }
++        /* escaped codepoints after 0xffff are supported in json through utf-16
++         * surrogate pairs: \uD83D\uDD25 for U+1F525. */
++
++        offset += 5;
++        break;
++      }
++    } else if (('\r' == src[offset]) || ('\n' == src[offset])) {
++      if (!(json_parse_flags_allow_multi_line_strings & flags_bitset)) {
++        /* invalid escaped unicode sequence! */
++        state->error = json_parse_error_invalid_string_escape_sequence;
++        state->offset = offset;
++        return 1;
++      }
++
++      offset++;
++    } else {
++      /* skip character (valid part of sequence). */
++      offset++;
++    }
++  }
++
++  /* If the offset is equal to the size, we had a non-terminated string! */
++  if (offset == size) {
++    state->error = json_parse_error_premature_end_of_buffer;
++    state->offset = offset - 1;
++    return 1;
++  }
++
++  /* skip trailing '"' or '\''. */
++  offset++;
++
++  /* add enough space to store the string. */
++  state->data_size += data_size;
++
++  /* one more byte for null terminator ending the string! */
++  state->data_size++;
++
++  /* update offset. */
++  state->offset = offset;
++
++  return 0;
++}
++
++json_weak int is_valid_unquoted_key_char(const char c);
++int is_valid_unquoted_key_char(const char c) {
++  return (('0' <= c && c <= '9') || ('a' <= c && c <= 'z') ||
++          ('A' <= c && c <= 'Z') || ('_' == c));
++}
++
++json_weak int json_get_key_size(struct json_parse_state_s *state);
++int json_get_key_size(struct json_parse_state_s *state) {
++  const size_t flags_bitset = state->flags_bitset;
++
++  if (json_parse_flags_allow_unquoted_keys & flags_bitset) {
++    size_t offset = state->offset;
++    const size_t size = state->size;
++    const char *const src = state->src;
++    size_t data_size = state->data_size;
++
++    /* if we are allowing unquoted keys, first grok for a quote... */
++    if ('"' == src[offset]) {
++      /* ... if we got a comma, just parse the key as a string as normal. */
++      return json_get_string_size(state, 1);
++    } else if ((json_parse_flags_allow_single_quoted_strings & flags_bitset) &&
++               ('\'' == src[offset])) {
++      /* ... if we got a comma, just parse the key as a string as normal. */
++      return json_get_string_size(state, 1);
++    } else {
++      while ((offset < size) && is_valid_unquoted_key_char(src[offset])) {
++        offset++;
++        data_size++;
++      }
++
++      /* one more byte for null terminator ending the string! */
++      data_size++;
++
++      if (json_parse_flags_allow_location_information & flags_bitset) {
++        state->dom_size += sizeof(struct json_string_ex_s);
++      } else {
++        state->dom_size += sizeof(struct json_string_s);
++      }
++
++      /* update offset. */
++      state->offset = offset;
++
++      /* update data_size. */
++      state->data_size = data_size;
++
++      return 0;
++    }
++  } else {
++    /* we are only allowed to have quoted keys, so just parse a string! */
++    return json_get_string_size(state, 1);
++  }
++}
++
++json_weak int json_get_object_size(struct json_parse_state_s *state,
++                                   int is_global_object);
++int json_get_object_size(struct json_parse_state_s *state,
++                         int is_global_object) {
++  const size_t flags_bitset = state->flags_bitset;
++  const char *const src = state->src;
++  const size_t size = state->size;
++  size_t elements = 0;
++  int allow_comma = 0;
++  int found_closing_brace = 0;
++
++  if (is_global_object) {
++    /* if we found an opening '{' of an object, we actually have a normal JSON
++     * object at the root of the DOM... */
++    if (!json_skip_all_skippables(state) && '{' == state->src[state->offset]) {
++      /* . and we don't actually have a global object after all! */
++      is_global_object = 0;
++    }
++  }
++
++  if (!is_global_object) {
++    if ('{' != src[state->offset]) {
++      state->error = json_parse_error_unknown;
++      return 1;
++    }
++
++    /* skip leading '{'. */
++    state->offset++;
++  }
++
++  state->dom_size += sizeof(struct json_object_s);
++
++  if ((state->offset == size) && !is_global_object) {
++    state->error = json_parse_error_premature_end_of_buffer;
++    return 1;
++  }
++
++  do {
++    if (!is_global_object) {
++      if (json_skip_all_skippables(state)) {
++        state->error = json_parse_error_premature_end_of_buffer;
++        return 1;
++      }
++
++      if ('}' == src[state->offset]) {
++        /* skip trailing '}'. */
++        state->offset++;
++
++        found_closing_brace = 1;
++
++        /* finished the object! */
++        break;
++      }
++    } else {
++      /* we don't require brackets, so that means the object ends when the input
++       * stream ends! */
++      if (json_skip_all_skippables(state)) {
++        break;
++      }
++    }
++
++    /* if we parsed at least one element previously, grok for a comma. */
++    if (allow_comma) {
++      if (',' == src[state->offset]) {
++        /* skip comma. */
++        state->offset++;
++        allow_comma = 0;
++      } else if (json_parse_flags_allow_no_commas & flags_bitset) {
++        /* we don't require a comma, and we didn't find one, which is ok! */
++        allow_comma = 0;
++      } else {
++        /* otherwise we are required to have a comma, and we found none. */
++        state->error = json_parse_error_expected_comma_or_closing_bracket;
++        return 1;
++      }
++
++      if (json_parse_flags_allow_trailing_comma & flags_bitset) {
++        continue;
++      } else {
++        if (json_skip_all_skippables(state)) {
++          state->error = json_parse_error_premature_end_of_buffer;
++          return 1;
++        }
++      }
++    }
++
++    if (json_get_key_size(state)) {
++      /* key parsing failed! */
++      state->error = json_parse_error_invalid_string;
++      return 1;
++    }
++
++    if (json_skip_all_skippables(state)) {
++      state->error = json_parse_error_premature_end_of_buffer;
++      return 1;
++    }
++
++    if (json_parse_flags_allow_equals_in_object & flags_bitset) {
++      const char current = src[state->offset];
++      if ((':' != current) && ('=' != current)) {
++        state->error = json_parse_error_expected_colon;
++        return 1;
++      }
++    } else {
++      if (':' != src[state->offset]) {
++        state->error = json_parse_error_expected_colon;
++        return 1;
++      }
++    }
++
++    /* skip colon. */
++    state->offset++;
++
++    if (json_skip_all_skippables(state)) {
++      state->error = json_parse_error_premature_end_of_buffer;
++      return 1;
++    }
++
++    if (json_get_value_size(state, /* is_global_object = */ 0)) {
++      /* value parsing failed! */
++      return 1;
++    }
++
++    /* successfully parsed a name/value pair! */
++    elements++;
++    allow_comma = 1;
++  } while (state->offset < size);
++
++  if ((state->offset == size) && !is_global_object && !found_closing_brace) {
++    state->error = json_parse_error_premature_end_of_buffer;
++    return 1;
++  }
++
++  state->dom_size += sizeof(struct json_object_element_s) * elements;
++
++  return 0;
++}
++
++json_weak int json_get_array_size(struct json_parse_state_s *state);
++int json_get_array_size(struct json_parse_state_s *state) {
++  const size_t flags_bitset = state->flags_bitset;
++  size_t elements = 0;
++  int allow_comma = 0;
++  const char *const src = state->src;
++  const size_t size = state->size;
++
++  if ('[' != src[state->offset]) {
++    /* expected array to begin with leading '['. */
++    state->error = json_parse_error_unknown;
++    return 1;
++  }
++
++  /* skip leading '['. */
++  state->offset++;
++
++  state->dom_size += sizeof(struct json_array_s);
++
++  while (state->offset < size) {
++    if (json_skip_all_skippables(state)) {
++      state->error = json_parse_error_premature_end_of_buffer;
++      return 1;
++    }
++
++    if (']' == src[state->offset]) {
++      /* skip trailing ']'. */
++      state->offset++;
++
++      state->dom_size += sizeof(struct json_array_element_s) * elements;
++
++      /* finished the object! */
++      return 0;
++    }
++
++    /* if we parsed at least once element previously, grok for a comma. */
++    if (allow_comma) {
++      if (',' == src[state->offset]) {
++        /* skip comma. */
++        state->offset++;
++        allow_comma = 0;
++      } else if (!(json_parse_flags_allow_no_commas & flags_bitset)) {
++        state->error = json_parse_error_expected_comma_or_closing_bracket;
++        return 1;
++      }
++
++      if (json_parse_flags_allow_trailing_comma & flags_bitset) {
++        allow_comma = 0;
++        continue;
++      } else {
++        if (json_skip_all_skippables(state)) {
++          state->error = json_parse_error_premature_end_of_buffer;
++          return 1;
++        }
++      }
++    }
++
++    if (json_get_value_size(state, /* is_global_object = */ 0)) {
++      /* value parsing failed! */
++      return 1;
++    }
++
++    /* successfully parsed an array element! */
++    elements++;
++    allow_comma = 1;
++  }
++
++  /* we consumed the entire input before finding the closing ']' of the array!
++   */
++  state->error = json_parse_error_premature_end_of_buffer;
++  return 1;
++}
++
++json_weak int json_get_number_size(struct json_parse_state_s *state);
++int json_get_number_size(struct json_parse_state_s *state) {
++  const size_t flags_bitset = state->flags_bitset;
++  size_t offset = state->offset;
++  const size_t size = state->size;
++  int had_leading_digits = 0;
++  const char *const src = state->src;
++
++  state->dom_size += sizeof(struct json_number_s);
++
++  if ((json_parse_flags_allow_hexadecimal_numbers & flags_bitset) &&
++      (offset + 1 < size) && ('0' == src[offset]) &&
++      (('x' == src[offset + 1]) || ('X' == src[offset + 1]))) {
++    /* skip the leading 0x that identifies a hexadecimal number. */
++    offset += 2;
++
++    /* consume hexadecimal digits. */
++    while ((offset < size) && (('0' <= src[offset] && src[offset] <= '9') ||
++                               ('a' <= src[offset] && src[offset] <= 'f') ||
++                               ('A' <= src[offset] && src[offset] <= 'F'))) {
++      offset++;
++    }
++  } else {
++    int found_sign = 0;
++    int inf_or_nan = 0;
++
++    if ((offset < size) &&
++        (('-' == src[offset]) ||
++         ((json_parse_flags_allow_leading_plus_sign & flags_bitset) &&
++          ('+' == src[offset])))) {
++      /* skip valid leading '-' or '+'. */
++      offset++;
++
++      found_sign = 1;
++    }
++
++    if (json_parse_flags_allow_inf_and_nan & flags_bitset) {
++      const char inf[9] = "Infinity";
++      const size_t inf_strlen = sizeof(inf) - 1;
++      const char nan[4] = "NaN";
++      const size_t nan_strlen = sizeof(nan) - 1;
++
++      if (offset + inf_strlen < size) {
++        int found = 1;
++        size_t i;
++        for (i = 0; i < inf_strlen; i++) {
++          if (inf[i] != src[offset + i]) {
++            found = 0;
++            break;
++          }
++        }
++
++        if (found) {
++          /* We found our special 'Infinity' keyword! */
++          offset += inf_strlen;
++
++          inf_or_nan = 1;
++        }
++      }
++
++      if (offset + nan_strlen < size) {
++        int found = 1;
++        size_t i;
++        for (i = 0; i < nan_strlen; i++) {
++          if (nan[i] != src[offset + i]) {
++            found = 0;
++            break;
++          }
++        }
++
++        if (found) {
++          /* We found our special 'NaN' keyword! */
++          offset += nan_strlen;
++
++          inf_or_nan = 1;
++        }
++      }
++
++      if (inf_or_nan) {
++        if (offset < size) {
++          switch (src[offset]) {
++          default:
++            break;
++          case '0':
++          case '1':
++          case '2':
++          case '3':
++          case '4':
++          case '5':
++          case '6':
++          case '7':
++          case '8':
++          case '9':
++          case 'e':
++          case 'E':
++            /* cannot follow an inf or nan with digits! */
++            state->error = json_parse_error_invalid_number_format;
++            state->offset = offset;
++            return 1;
++          }
++        }
++      }
++    }
++
++    if (found_sign && !inf_or_nan && (offset < size) &&
++        !('0' <= src[offset] && src[offset] <= '9')) {
++      /* check if we are allowing leading '.'. */
++      if (!(json_parse_flags_allow_leading_or_trailing_decimal_point &
++            flags_bitset) ||
++          ('.' != src[offset])) {
++        /* a leading '-' must be immediately followed by any digit! */
++        state->error = json_parse_error_invalid_number_format;
++        state->offset = offset;
++        return 1;
++      }
++    }
++
++    if ((offset < size) && ('0' == src[offset])) {
++      /* skip valid '0'. */
++      offset++;
++
++      /* we need to record whether we had any leading digits for checks later.
++       */
++      had_leading_digits = 1;
++
++      if ((offset < size) && ('0' <= src[offset] && src[offset] <= '9')) {
++        /* a leading '0' must not be immediately followed by any digit! */
++        state->error = json_parse_error_invalid_number_format;
++        state->offset = offset;
++        return 1;
++      }
++    }
++
++    /* the main digits of our number next. */
++    while ((offset < size) && ('0' <= src[offset] && src[offset] <= '9')) {
++      offset++;
++
++      /* we need to record whether we had any leading digits for checks later.
++       */
++      had_leading_digits = 1;
++    }
++
++    if ((offset < size) && ('.' == src[offset])) {
++      offset++;
++
++      if ((offset >= size) || !('0' <= src[offset] && src[offset] <= '9')) {
++        if (!(json_parse_flags_allow_leading_or_trailing_decimal_point &
++              flags_bitset) ||
++            !had_leading_digits) {
++          /* a decimal point must be followed by at least one digit. */
++          state->error = json_parse_error_invalid_number_format;
++          state->offset = offset;
++          return 1;
++        }
++      }
++
++      /* a decimal point can be followed by more digits of course! */
++      while ((offset < size) && ('0' <= src[offset] && src[offset] <= '9')) {
++        offset++;
++      }
++    }
++
++    if ((offset < size) && ('e' == src[offset] || 'E' == src[offset])) {
++      /* our number has an exponent! Skip 'e' or 'E'. */
++      offset++;
++
++      if ((offset < size) && ('-' == src[offset] || '+' == src[offset])) {
++        /* skip optional '-' or '+'. */
++        offset++;
++      }
++
++      if ((offset < size) && !('0' <= src[offset] && src[offset] <= '9')) {
++        /* an exponent must have at least one digit! */
++        state->error = json_parse_error_invalid_number_format;
++        state->offset = offset;
++        return 1;
++      }
++
++      /* consume exponent digits. */
++      do {
++        offset++;
++      } while ((offset < size) && ('0' <= src[offset] && src[offset] <= '9'));
++    }
++  }
++
++  if (offset < size) {
++    switch (src[offset]) {
++    case ' ':
++    case '\t':
++    case '\r':
++    case '\n':
++    case '}':
++    case ',':
++    case ']':
++      /* all of the above are ok. */
++      break;
++    case '=':
++      if (json_parse_flags_allow_equals_in_object & flags_bitset) {
++        break;
++      }
++
++      state->error = json_parse_error_invalid_number_format;
++      state->offset = offset;
++      return 1;
++    default:
++      state->error = json_parse_error_invalid_number_format;
++      state->offset = offset;
++      return 1;
++    }
++  }
++
++  state->data_size += offset - state->offset;
++
++  /* one more byte for null terminator ending the number string! */
++  state->data_size++;
++
++  /* update offset. */
++  state->offset = offset;
++
++  return 0;
++}
++
++json_weak int json_get_value_size(struct json_parse_state_s *state,
++                                  int is_global_object);
++int json_get_value_size(struct json_parse_state_s *state,
++                        int is_global_object) {
++  const size_t flags_bitset = state->flags_bitset;
++  const char *const src = state->src;
++  size_t offset;
++  const size_t size = state->size;
++
++  if (json_parse_flags_allow_location_information & flags_bitset) {
++    state->dom_size += sizeof(struct json_value_ex_s);
++  } else {
++    state->dom_size += sizeof(struct json_value_s);
++  }
++
++  if (is_global_object) {
++    return json_get_object_size(state, /* is_global_object = */ 1);
++  } else {
++    if (json_skip_all_skippables(state)) {
++      state->error = json_parse_error_premature_end_of_buffer;
++      return 1;
++    }
++
++    /* can cache offset now. */
++    offset = state->offset;
++
++    switch (src[offset]) {
++    case '"':
++      return json_get_string_size(state, 0);
++    case '\'':
++      if (json_parse_flags_allow_single_quoted_strings & flags_bitset) {
++        return json_get_string_size(state, 0);
++      } else {
++        /* invalid value! */
++        state->error = json_parse_error_invalid_value;
++        return 1;
++      }
++    case '{':
++      return json_get_object_size(state, /* is_global_object = */ 0);
++    case '[':
++      return json_get_array_size(state);
++    case '-':
++    case '0':
++    case '1':
++    case '2':
++    case '3':
++    case '4':
++    case '5':
++    case '6':
++    case '7':
++    case '8':
++    case '9':
++      return json_get_number_size(state);
++    case '+':
++      if (json_parse_flags_allow_leading_plus_sign & flags_bitset) {
++        return json_get_number_size(state);
++      } else {
++        /* invalid value! */
++        state->error = json_parse_error_invalid_number_format;
++        return 1;
++      }
++    case '.':
++      if (json_parse_flags_allow_leading_or_trailing_decimal_point &
++          flags_bitset) {
++        return json_get_number_size(state);
++      } else {
++        /* invalid value! */
++        state->error = json_parse_error_invalid_number_format;
++        return 1;
++      }
++    default:
++      if ((offset + 4) <= size && 't' == src[offset + 0] &&
++          'r' == src[offset + 1] && 'u' == src[offset + 2] &&
++          'e' == src[offset + 3]) {
++        state->offset += 4;
++        return 0;
++      } else if ((offset + 5) <= size && 'f' == src[offset + 0] &&
++                 'a' == src[offset + 1] && 'l' == src[offset + 2] &&
++                 's' == src[offset + 3] && 'e' == src[offset + 4]) {
++        state->offset += 5;
++        return 0;
++      } else if ((offset + 4) <= size && 'n' == state->src[offset + 0] &&
++                 'u' == state->src[offset + 1] &&
++                 'l' == state->src[offset + 2] &&
++                 'l' == state->src[offset + 3]) {
++        state->offset += 4;
++        return 0;
++      } else if ((json_parse_flags_allow_inf_and_nan & flags_bitset) &&
++                 (offset + 3) <= size && 'N' == src[offset + 0] &&
++                 'a' == src[offset + 1] && 'N' == src[offset + 2]) {
++        return json_get_number_size(state);
++      } else if ((json_parse_flags_allow_inf_and_nan & flags_bitset) &&
++                 (offset + 8) <= size && 'I' == src[offset + 0] &&
++                 'n' == src[offset + 1] && 'f' == src[offset + 2] &&
++                 'i' == src[offset + 3] && 'n' == src[offset + 4] &&
++                 'i' == src[offset + 5] && 't' == src[offset + 6] &&
++                 'y' == src[offset + 7]) {
++        return json_get_number_size(state);
++      }
++
++      /* invalid value! */
++      state->error = json_parse_error_invalid_value;
++      return 1;
++    }
++  }
++}
++
++json_weak void json_parse_value(struct json_parse_state_s *state,
++                                int is_global_object,
++                                struct json_value_s *value);
++
++json_weak void json_parse_string(struct json_parse_state_s *state,
++                                 struct json_string_s *string);
++void json_parse_string(struct json_parse_state_s *state,
++                       struct json_string_s *string) {
++  size_t offset = state->offset;
++  size_t bytes_written = 0;
++  const char *const src = state->src;
++  const char quote_to_use = '\'' == src[offset] ? '\'' : '"';
++  char *data = state->data;
++  unsigned long high_surrogate = 0;
++  unsigned long codepoint;
++
++  string->string = data;
++
++  /* skip leading '"' or '\''. */
++  offset++;
++
++  while (quote_to_use != src[offset]) {
++    if ('\\' == src[offset]) {
++      /* skip the reverse solidus. */
++      offset++;
++
++      switch (src[offset++]) {
++      default:
++        return; /* we cannot ever reach here. */
++      case 'u': {
++        codepoint = 0;
++        if (!json_hexadecimal_value(&src[offset], 4, &codepoint)) {
++          return; /* this shouldn't happen as the value was already validated.
++                   */
++        }
++
++        offset += 4;
++
++        if (codepoint <= 0x7fu) {
++          data[bytes_written++] = (char)codepoint; /* 0xxxxxxx. */
++        } else if (codepoint <= 0x7ffu) {
++          data[bytes_written++] =
++              (char)(0xc0u | (codepoint >> 6)); /* 110xxxxx. */
++          data[bytes_written++] =
++              (char)(0x80u | (codepoint & 0x3fu)); /* 10xxxxxx. */
++        } else if (codepoint >= 0xd800 &&
++                   codepoint <= 0xdbff) { /* high surrogate. */
++          high_surrogate = codepoint;
++          continue; /* we need the low half to form a complete codepoint. */
++        } else if (codepoint >= 0xdc00 &&
++                   codepoint <= 0xdfff) { /* low surrogate. */
++          /* combine with the previously read half to obtain the complete
++           * codepoint. */
++          const unsigned long surrogate_offset =
++              0x10000u - (0xD800u << 10) - 0xDC00u;
++          codepoint = (high_surrogate << 10) + codepoint + surrogate_offset;
++          high_surrogate = 0;
++          data[bytes_written++] =
++              (char)(0xF0u | (codepoint >> 18)); /* 11110xxx. */
++          data[bytes_written++] =
++              (char)(0x80u | ((codepoint >> 12) & 0x3fu)); /* 10xxxxxx. */
++          data[bytes_written++] =
++              (char)(0x80u | ((codepoint >> 6) & 0x3fu)); /* 10xxxxxx. */
++          data[bytes_written++] =
++              (char)(0x80u | (codepoint & 0x3fu)); /* 10xxxxxx. */
++        } else {
++          /* we assume the value was validated and thus is within the valid
++           * range. */
++          data[bytes_written++] =
++              (char)(0xe0u | (codepoint >> 12)); /* 1110xxxx. */
++          data[bytes_written++] =
++              (char)(0x80u | ((codepoint >> 6) & 0x3fu)); /* 10xxxxxx. */
++          data[bytes_written++] =
++              (char)(0x80u | (codepoint & 0x3fu)); /* 10xxxxxx. */
++        }
++      } break;
++      case '"':
++        data[bytes_written++] = '"';
++        break;
++      case '\\':
++        data[bytes_written++] = '\\';
++        break;
++      case '/':
++        data[bytes_written++] = '/';
++        break;
++      case 'b':
++        data[bytes_written++] = '\b';
++        break;
++      case 'f':
++        data[bytes_written++] = '\f';
++        break;
++      case 'n':
++        data[bytes_written++] = '\n';
++        break;
++      case 'r':
++        data[bytes_written++] = '\r';
++        break;
++      case 't':
++        data[bytes_written++] = '\t';
++        break;
++      case '\r':
++        data[bytes_written++] = '\r';
++
++        /* check if we have a "\r\n" sequence. */
++        if ('\n' == src[offset]) {
++          data[bytes_written++] = '\n';
++          offset++;
++        }
++
++        break;
++      case '\n':
++        data[bytes_written++] = '\n';
++        break;
++      }
++    } else {
++      /* copy the character. */
++      data[bytes_written++] = src[offset++];
++    }
++  }
++
++  /* skip trailing '"' or '\''. */
++  offset++;
++
++  /* record the size of the string. */
++  string->string_size = bytes_written;
++
++  /* add null terminator to string. */
++  data[bytes_written++] = '\0';
++
++  /* move data along. */
++  state->data += bytes_written;
++
++  /* update offset. */
++  state->offset = offset;
++}
++
++json_weak void json_parse_key(struct json_parse_state_s *state,
++                              struct json_string_s *string);
++void json_parse_key(struct json_parse_state_s *state,
++                    struct json_string_s *string) {
++  if (json_parse_flags_allow_unquoted_keys & state->flags_bitset) {
++    const char *const src = state->src;
++    char *const data = state->data;
++    size_t offset = state->offset;
++
++    /* if we are allowing unquoted keys, check for quoted anyway... */
++    if (('"' == src[offset]) || ('\'' == src[offset])) {
++      /* ... if we got a quote, just parse the key as a string as normal. */
++      json_parse_string(state, string);
++    } else {
++      size_t size = 0;
++
++      string->string = state->data;
++
++      while (is_valid_unquoted_key_char(src[offset])) {
++        data[size++] = src[offset++];
++      }
++
++      /* add null terminator to string. */
++      data[size] = '\0';
++
++      /* record the size of the string. */
++      string->string_size = size++;
++
++      /* move data along. */
++      state->data += size;
++
++      /* update offset. */
++      state->offset = offset;
++    }
++  } else {
++    /* we are only allowed to have quoted keys, so just parse a string! */
++    json_parse_string(state, string);
++  }
++}
++
++json_weak void json_parse_object(struct json_parse_state_s *state,
++                                 int is_global_object,
++                                 struct json_object_s *object);
++void json_parse_object(struct json_parse_state_s *state, int is_global_object,
++                       struct json_object_s *object) {
++  const size_t flags_bitset = state->flags_bitset;
++  const size_t size = state->size;
++  const char *const src = state->src;
++  size_t elements = 0;
++  int allow_comma = 0;
++  struct json_object_element_s *previous = json_null;
++
++  if (is_global_object) {
++    /* if we skipped some whitespace, and then found an opening '{' of an. */
++    /* object, we actually have a normal JSON object at the root of the DOM...
++     */
++    if ('{' == src[state->offset]) {
++      /* . and we don't actually have a global object after all! */
++      is_global_object = 0;
++    }
++  }
++
++  if (!is_global_object) {
++    /* skip leading '{'. */
++    state->offset++;
++  }
++
++  (void)json_skip_all_skippables(state);
++
++  /* reset elements. */
++  elements = 0;
++
++  while (state->offset < size) {
++    struct json_object_element_s *element = json_null;
++    struct json_string_s *string = json_null;
++    struct json_value_s *value = json_null;
++
++    if (!is_global_object) {
++      (void)json_skip_all_skippables(state);
++
++      if ('}' == src[state->offset]) {
++        /* skip trailing '}'. */
++        state->offset++;
++
++        /* finished the object! */
++        break;
++      }
++    } else {
++      if (json_skip_all_skippables(state)) {
++        /* global object ends when the file ends! */
++        break;
++      }
++    }
++
++    /* if we parsed at least one element previously, grok for a comma. */
++    if (allow_comma) {
++      if (',' == src[state->offset]) {
++        /* skip comma. */
++        state->offset++;
++        allow_comma = 0;
++        continue;
++      }
++    }
++
++    element = (struct json_object_element_s *)state->dom;
++
++    state->dom += sizeof(struct json_object_element_s);
++
++    if (json_null == previous) {
++      /* this is our first element, so record it in our object. */
++      object->start = element;
++    } else {
++      previous->next = element;
++    }
++
++    previous = element;
++
++    if (json_parse_flags_allow_location_information & flags_bitset) {
++      struct json_string_ex_s *string_ex =
++          (struct json_string_ex_s *)state->dom;
++      state->dom += sizeof(struct json_string_ex_s);
++
++      string_ex->offset = state->offset;
++      string_ex->line_no = state->line_no;
++      string_ex->row_no = state->offset - state->line_offset;
++
++      string = &(string_ex->string);
++    } else {
++      string = (struct json_string_s *)state->dom;
++      state->dom += sizeof(struct json_string_s);
++    }
++
++    element->name = string;
++
++    (void)json_parse_key(state, string);
++
++    (void)json_skip_all_skippables(state);
++
++    /* skip colon or equals. */
++    state->offset++;
++
++    (void)json_skip_all_skippables(state);
++
++    if (json_parse_flags_allow_location_information & flags_bitset) {
++      struct json_value_ex_s *value_ex = (struct json_value_ex_s *)state->dom;
++      state->dom += sizeof(struct json_value_ex_s);
++
++      value_ex->offset = state->offset;
++      value_ex->line_no = state->line_no;
++      value_ex->row_no = state->offset - state->line_offset;
++
++      value = &(value_ex->value);
++    } else {
++      value = (struct json_value_s *)state->dom;
++      state->dom += sizeof(struct json_value_s);
++    }
++
++    element->value = value;
++
++    json_parse_value(state, /* is_global_object = */ 0, value);
++
++    /* successfully parsed a name/value pair! */
++    elements++;
++    allow_comma = 1;
++  }
++
++  /* if we had at least one element, end the linked list. */
++  if (previous) {
++    previous->next = json_null;
++  }
++
++  if (0 == elements) {
++    object->start = json_null;
++  }
++
++  object->length = elements;
++}
++
++json_weak void json_parse_array(struct json_parse_state_s *state,
++                                struct json_array_s *array);
++void json_parse_array(struct json_parse_state_s *state,
++                      struct json_array_s *array) {
++  const char *const src = state->src;
++  const size_t size = state->size;
++  size_t elements = 0;
++  int allow_comma = 0;
++  struct json_array_element_s *previous = json_null;
++
++  /* skip leading '['. */
++  state->offset++;
++
++  (void)json_skip_all_skippables(state);
++
++  /* reset elements. */
++  elements = 0;
++
++  do {
++    struct json_array_element_s *element = json_null;
++    struct json_value_s *value = json_null;
++
++    (void)json_skip_all_skippables(state);
++
++    if (']' == src[state->offset]) {
++      /* skip trailing ']'. */
++      state->offset++;
++
++      /* finished the array! */
++      break;
++    }
++
++    /* if we parsed at least one element previously, grok for a comma. */
++    if (allow_comma) {
++      if (',' == src[state->offset]) {
++        /* skip comma. */
++        state->offset++;
++        allow_comma = 0;
++        continue;
++      }
++    }
++
++    element = (struct json_array_element_s *)state->dom;
++
++    state->dom += sizeof(struct json_array_element_s);
++
++    if (json_null == previous) {
++      /* this is our first element, so record it in our array. */
++      array->start = element;
++    } else {
++      previous->next = element;
++    }
++
++    previous = element;
++
++    if (json_parse_flags_allow_location_information & state->flags_bitset) {
++      struct json_value_ex_s *value_ex = (struct json_value_ex_s *)state->dom;
++      state->dom += sizeof(struct json_value_ex_s);
++
++      value_ex->offset = state->offset;
++      value_ex->line_no = state->line_no;
++      value_ex->row_no = state->offset - state->line_offset;
++
++      value = &(value_ex->value);
++    } else {
++      value = (struct json_value_s *)state->dom;
++      state->dom += sizeof(struct json_value_s);
++    }
++
++    element->value = value;
++
++    json_parse_value(state, /* is_global_object = */ 0, value);
++
++    /* successfully parsed an array element! */
++    elements++;
++    allow_comma = 1;
++  } while (state->offset < size);
++
++  /* end the linked list. */
++  if (previous) {
++    previous->next = json_null;
++  }
++
++  if (0 == elements) {
++    array->start = json_null;
++  }
++
++  array->length = elements;
++}
++
++json_weak void json_parse_number(struct json_parse_state_s *state,
++                                 struct json_number_s *number);
++void json_parse_number(struct json_parse_state_s *state,
++                       struct json_number_s *number) {
++  const size_t flags_bitset = state->flags_bitset;
++  size_t offset = state->offset;
++  const size_t size = state->size;
++  size_t bytes_written = 0;
++  const char *const src = state->src;
++  char *data = state->data;
++
++  number->number = data;
++
++  if (json_parse_flags_allow_hexadecimal_numbers & flags_bitset) {
++    if (('0' == src[offset]) &&
++        (('x' == src[offset + 1]) || ('X' == src[offset + 1]))) {
++      /* consume hexadecimal digits. */
++      while ((offset < size) &&
++             (('0' <= src[offset] && src[offset] <= '9') ||
++              ('a' <= src[offset] && src[offset] <= 'f') ||
++              ('A' <= src[offset] && src[offset] <= 'F') ||
++              ('x' == src[offset]) || ('X' == src[offset]))) {
++        data[bytes_written++] = src[offset++];
++      }
++    }
++  }
++
++  while (offset < size) {
++    int end = 0;
++
++    switch (src[offset]) {
++    case '0':
++    case '1':
++    case '2':
++    case '3':
++    case '4':
++    case '5':
++    case '6':
++    case '7':
++    case '8':
++    case '9':
++    case '.':
++    case 'e':
++    case 'E':
++    case '+':
++    case '-':
++      data[bytes_written++] = src[offset++];
++      break;
++    default:
++      end = 1;
++      break;
++    }
++
++    if (0 != end) {
++      break;
++    }
++  }
++
++  if (json_parse_flags_allow_inf_and_nan & flags_bitset) {
++    const size_t inf_strlen = 8; /* = strlen("Infinity");. */
++    const size_t nan_strlen = 3; /* = strlen("NaN");. */
++
++    if (offset + inf_strlen < size) {
++      if ('I' == src[offset]) {
++        size_t i;
++        /* We found our special 'Infinity' keyword! */
++        for (i = 0; i < inf_strlen; i++) {
++          data[bytes_written++] = src[offset++];
++        }
++      }
++    }
++
++    if (offset + nan_strlen < size) {
++      if ('N' == src[offset]) {
++        size_t i;
++        /* We found our special 'NaN' keyword! */
++        for (i = 0; i < nan_strlen; i++) {
++          data[bytes_written++] = src[offset++];
++        }
++      }
++    }
++  }
++
++  /* record the size of the number. */
++  number->number_size = bytes_written;
++  /* add null terminator to number string. */
++  data[bytes_written++] = '\0';
++  /* move data along. */
++  state->data += bytes_written;
++  /* update offset. */
++  state->offset = offset;
++}
++
++json_weak void json_parse_value(struct json_parse_state_s *state,
++                                int is_global_object,
++                                struct json_value_s *value);
++void json_parse_value(struct json_parse_state_s *state, int is_global_object,
++                      struct json_value_s *value) {
++  const size_t flags_bitset = state->flags_bitset;
++  const char *const src = state->src;
++  const size_t size = state->size;
++  size_t offset;
++
++  (void)json_skip_all_skippables(state);
++
++  /* cache offset now. */
++  offset = state->offset;
++
++  if (is_global_object) {
++    value->type = json_type_object;
++    value->payload = state->dom;
++    state->dom += sizeof(struct json_object_s);
++    json_parse_object(state, /* is_global_object = */ 1,
++                      (struct json_object_s *)value->payload);
++  } else {
++    switch (src[offset]) {
++    case '"':
++    case '\'':
++      value->type = json_type_string;
++      value->payload = state->dom;
++      state->dom += sizeof(struct json_string_s);
++      json_parse_string(state, (struct json_string_s *)value->payload);
++      break;
++    case '{':
++      value->type = json_type_object;
++      value->payload = state->dom;
++      state->dom += sizeof(struct json_object_s);
++      json_parse_object(state, /* is_global_object = */ 0,
++                        (struct json_object_s *)value->payload);
++      break;
++    case '[':
++      value->type = json_type_array;
++      value->payload = state->dom;
++      state->dom += sizeof(struct json_array_s);
++      json_parse_array(state, (struct json_array_s *)value->payload);
++      break;
++    case '-':
++    case '+':
++    case '0':
++    case '1':
++    case '2':
++    case '3':
++    case '4':
++    case '5':
++    case '6':
++    case '7':
++    case '8':
++    case '9':
++    case '.':
++      value->type = json_type_number;
++      value->payload = state->dom;
++      state->dom += sizeof(struct json_number_s);
++      json_parse_number(state, (struct json_number_s *)value->payload);
++      break;
++    default:
++      if ((offset + 4) <= size && 't' == src[offset + 0] &&
++          'r' == src[offset + 1] && 'u' == src[offset + 2] &&
++          'e' == src[offset + 3]) {
++        value->type = json_type_true;
++        value->payload = json_null;
++        state->offset += 4;
++      } else if ((offset + 5) <= size && 'f' == src[offset + 0] &&
++                 'a' == src[offset + 1] && 'l' == src[offset + 2] &&
++                 's' == src[offset + 3] && 'e' == src[offset + 4]) {
++        value->type = json_type_false;
++        value->payload = json_null;
++        state->offset += 5;
++      } else if ((offset + 4) <= size && 'n' == src[offset + 0] &&
++                 'u' == src[offset + 1] && 'l' == src[offset + 2] &&
++                 'l' == src[offset + 3]) {
++        value->type = json_type_null;
++        value->payload = json_null;
++        state->offset += 4;
++      } else if ((json_parse_flags_allow_inf_and_nan & flags_bitset) &&
++                 (offset + 3) <= size && 'N' == src[offset + 0] &&
++                 'a' == src[offset + 1] && 'N' == src[offset + 2]) {
++        value->type = json_type_number;
++        value->payload = state->dom;
++        state->dom += sizeof(struct json_number_s);
++        json_parse_number(state, (struct json_number_s *)value->payload);
++      } else if ((json_parse_flags_allow_inf_and_nan & flags_bitset) &&
++                 (offset + 8) <= size && 'I' == src[offset + 0] &&
++                 'n' == src[offset + 1] && 'f' == src[offset + 2] &&
++                 'i' == src[offset + 3] && 'n' == src[offset + 4] &&
++                 'i' == src[offset + 5] && 't' == src[offset + 6] &&
++                 'y' == src[offset + 7]) {
++        value->type = json_type_number;
++        value->payload = state->dom;
++        state->dom += sizeof(struct json_number_s);
++        json_parse_number(state, (struct json_number_s *)value->payload);
++      }
++      break;
++    }
++  }
++}
++
++struct json_value_s *
++json_parse_ex(const void *src, size_t src_size, size_t flags_bitset,
++              void *(*alloc_func_ptr)(void *user_data, size_t size),
++              void *user_data, struct json_parse_result_s *result) {
++  struct json_parse_state_s state;
++  void *allocation;
++  struct json_value_s *value;
++  size_t total_size;
++  int input_error;
++
++  if (result) {
++    result->error = json_parse_error_none;
++    result->error_offset = 0;
++    result->error_line_no = 0;
++    result->error_row_no = 0;
++  }
++
++  if (json_null == src) {
++    /* invalid src pointer was null! */
++    return json_null;
++  }
++
++  state.src = (const char *)src;
++  state.size = src_size;
++  state.offset = 0;
++  state.line_no = 1;
++  state.line_offset = 0;
++  state.error = json_parse_error_none;
++  state.dom_size = 0;
++  state.data_size = 0;
++  state.flags_bitset = flags_bitset;
++
++  input_error = json_get_value_size(
++      &state, (int)(json_parse_flags_allow_global_object & state.flags_bitset));
++
++  if (0 == input_error) {
++    json_skip_all_skippables(&state);
++
++    if (state.offset != state.size) {
++      /* our parsing didn't have an error, but there are characters remaining in
++       * the input that weren't part of the JSON! */
++
++      state.error = json_parse_error_unexpected_trailing_characters;
++      input_error = 1;
++    }
++  }
++
++  if (input_error) {
++    /* parsing value's size failed (most likely an invalid JSON DOM!). */
++    if (result) {
++      result->error = state.error;
++      result->error_offset = state.offset;
++      result->error_line_no = state.line_no;
++      result->error_row_no = state.offset - state.line_offset;
++    }
++    return json_null;
++  }
++
++  /* our total allocation is the combination of the dom and data sizes (we. */
++  /* first encode the structure of the JSON, and then the data referenced by. */
++  /* the JSON values). */
++  total_size = state.dom_size + state.data_size;
++
++  if (json_null == alloc_func_ptr) {
++    allocation = malloc(total_size);
++  } else {
++    allocation = alloc_func_ptr(user_data, total_size);
++  }
++
++  if (json_null == allocation) {
++    /* malloc failed! */
++    if (result) {
++      result->error = json_parse_error_allocator_failed;
++      result->error_offset = 0;
++      result->error_line_no = 0;
++      result->error_row_no = 0;
++    }
++
++    return json_null;
++  }
++
++  /* reset offset so we can reuse it. */
++  state.offset = 0;
++
++  /* reset the line information so we can reuse it. */
++  state.line_no = 1;
++  state.line_offset = 0;
++
++  state.dom = (char *)allocation;
++  state.data = state.dom + state.dom_size;
++
++  if (json_parse_flags_allow_location_information & state.flags_bitset) {
++    struct json_value_ex_s *value_ex = (struct json_value_ex_s *)state.dom;
++    state.dom += sizeof(struct json_value_ex_s);
++
++    value_ex->offset = state.offset;
++    value_ex->line_no = state.line_no;
++    value_ex->row_no = state.offset - state.line_offset;
++
++    value = &(value_ex->value);
++  } else {
++    value = (struct json_value_s *)state.dom;
++    state.dom += sizeof(struct json_value_s);
++  }
++
++  json_parse_value(
++      &state, (int)(json_parse_flags_allow_global_object & state.flags_bitset),
++      value);
++
++  return (struct json_value_s *)allocation;
++}
++
++struct json_value_s *json_parse(const void *src, size_t src_size) {
++  return json_parse_ex(src, src_size, json_parse_flags_default, json_null,
++                       json_null, json_null);
++}
++
++struct json_extract_result_s {
++  size_t dom_size;
++  size_t data_size;
++};
++
++struct json_value_s *json_extract_value(const struct json_value_s *value) {
++  return json_extract_value_ex(value, json_null, json_null);
++}
++
++json_weak struct json_extract_result_s
++json_extract_get_number_size(const struct json_number_s *const number);
++json_weak struct json_extract_result_s
++json_extract_get_string_size(const struct json_string_s *const string);
++json_weak struct json_extract_result_s
++json_extract_get_object_size(const struct json_object_s *const object);
++json_weak struct json_extract_result_s
++json_extract_get_array_size(const struct json_array_s *const array);
++json_weak struct json_extract_result_s
++json_extract_get_value_size(const struct json_value_s *const value);
++
++struct json_extract_result_s
++json_extract_get_number_size(const struct json_number_s *const number) {
++  struct json_extract_result_s result;
++  result.dom_size = sizeof(struct json_number_s);
++  result.data_size = number->number_size;
++  return result;
++}
++
++struct json_extract_result_s
++json_extract_get_string_size(const struct json_string_s *const string) {
++  struct json_extract_result_s result;
++  result.dom_size = sizeof(struct json_string_s);
++  result.data_size = string->string_size + 1;
++  return result;
++}
++
++struct json_extract_result_s
++json_extract_get_object_size(const struct json_object_s *const object) {
++  struct json_extract_result_s result;
++  size_t i;
++  const struct json_object_element_s *element = object->start;
++
++  result.dom_size = sizeof(struct json_object_s) +
++                    (sizeof(struct json_object_element_s) * object->length);
++  result.data_size = 0;
++
++  for (i = 0; i < object->length; i++) {
++    const struct json_extract_result_s string_result =
++        json_extract_get_string_size(element->name);
++    const struct json_extract_result_s value_result =
++        json_extract_get_value_size(element->value);
++
++    result.dom_size += string_result.dom_size;
++    result.data_size += string_result.data_size;
++
++    result.dom_size += value_result.dom_size;
++    result.data_size += value_result.data_size;
++
++    element = element->next;
++  }
++
++  return result;
++}
++
++struct json_extract_result_s
++json_extract_get_array_size(const struct json_array_s *const array) {
++  struct json_extract_result_s result;
++  size_t i;
++  const struct json_array_element_s *element = array->start;
++
++  result.dom_size = sizeof(struct json_array_s) +
++                    (sizeof(struct json_array_element_s) * array->length);
++  result.data_size = 0;
++
++  for (i = 0; i < array->length; i++) {
++    const struct json_extract_result_s value_result =
++        json_extract_get_value_size(element->value);
++
++    result.dom_size += value_result.dom_size;
++    result.data_size += value_result.data_size;
++
++    element = element->next;
++  }
++
++  return result;
++}
++
++struct json_extract_result_s
++json_extract_get_value_size(const struct json_value_s *const value) {
++  struct json_extract_result_s result = {0, 0};
++
++  switch (value->type) {
++  default:
++    break;
++  case json_type_object:
++    result = json_extract_get_object_size(
++        (const struct json_object_s *)value->payload);
++    break;
++  case json_type_array:
++    result = json_extract_get_array_size(
++        (const struct json_array_s *)value->payload);
++    break;
++  case json_type_number:
++    result = json_extract_get_number_size(
++        (const struct json_number_s *)value->payload);
++    break;
++  case json_type_string:
++    result = json_extract_get_string_size(
++        (const struct json_string_s *)value->payload);
++    break;
++  }
++
++  result.dom_size += sizeof(struct json_value_s);
++
++  return result;
++}
++
++struct json_extract_state_s {
++  char *dom;
++  char *data;
++};
++
++json_weak void json_extract_copy_value(struct json_extract_state_s *const state,
++                                       const struct json_value_s *const value);
++void json_extract_copy_value(struct json_extract_state_s *const state,
++                             const struct json_value_s *const value) {
++  struct json_string_s *string;
++  struct json_number_s *number;
++  struct json_object_s *object;
++  struct json_array_s *array;
++  struct json_value_s *new_value;
++
++  memcpy(state->dom, value, sizeof(struct json_value_s));
++  new_value = (struct json_value_s *)state->dom;
++  state->dom += sizeof(struct json_value_s);
++  new_value->payload = state->dom;
++
++  if (json_type_string == value->type) {
++    memcpy(state->dom, value->payload, sizeof(struct json_string_s));
++    string = (struct json_string_s *)state->dom;
++    state->dom += sizeof(struct json_string_s);
++
++    memcpy(state->data, string->string, string->string_size + 1);
++    string->string = state->data;
++    state->data += string->string_size + 1;
++  } else if (json_type_number == value->type) {
++    memcpy(state->dom, value->payload, sizeof(struct json_number_s));
++    number = (struct json_number_s *)state->dom;
++    state->dom += sizeof(struct json_number_s);
++
++    memcpy(state->data, number->number, number->number_size);
++    number->number = state->data;
++    state->data += number->number_size;
++  } else if (json_type_object == value->type) {
++    struct json_object_element_s *element;
++    size_t i;
++
++    memcpy(state->dom, value->payload, sizeof(struct json_object_s));
++    object = (struct json_object_s *)state->dom;
++    state->dom += sizeof(struct json_object_s);
++
++    element = object->start;
++    object->start = (struct json_object_element_s *)state->dom;
++
++    for (i = 0; i < object->length; i++) {
++      struct json_value_s *previous_value;
++      struct json_object_element_s *previous_element;
++
++      memcpy(state->dom, element, sizeof(struct json_object_element_s));
++      element = (struct json_object_element_s *)state->dom;
++      state->dom += sizeof(struct json_object_element_s);
++
++      string = element->name;
++      memcpy(state->dom, string, sizeof(struct json_string_s));
++      string = (struct json_string_s *)state->dom;
++      state->dom += sizeof(struct json_string_s);
++      element->name = string;
++
++      memcpy(state->data, string->string, string->string_size + 1);
++      string->string = state->data;
++      state->data += string->string_size + 1;
++
++      previous_value = element->value;
++      element->value = (struct json_value_s *)state->dom;
++      json_extract_copy_value(state, previous_value);
++
++      previous_element = element;
++      element = element->next;
++
++      if (element) {
++        previous_element->next = (struct json_object_element_s *)state->dom;
++      }
++    }
++  } else if (json_type_array == value->type) {
++    struct json_array_element_s *element;
++    size_t i;
++
++    memcpy(state->dom, value->payload, sizeof(struct json_array_s));
++    array = (struct json_array_s *)state->dom;
++    state->dom += sizeof(struct json_array_s);
++
++    element = array->start;
++    array->start = (struct json_array_element_s *)state->dom;
++
++    for (i = 0; i < array->length; i++) {
++      struct json_value_s *previous_value;
++      struct json_array_element_s *previous_element;
++
++      memcpy(state->dom, element, sizeof(struct json_array_element_s));
++      element = (struct json_array_element_s *)state->dom;
++      state->dom += sizeof(struct json_array_element_s);
++
++      previous_value = element->value;
++      element->value = (struct json_value_s *)state->dom;
++      json_extract_copy_value(state, previous_value);
++
++      previous_element = element;
++      element = element->next;
++
++      if (element) {
++        previous_element->next = (struct json_array_element_s *)state->dom;
++      }
++    }
++  }
++}
++
++struct json_value_s *json_extract_value_ex(const struct json_value_s *value,
++                                           void *(*alloc_func_ptr)(void *,
++                                                                   size_t),
++                                           void *user_data) {
++  void *allocation;
++  struct json_extract_result_s result;
++  struct json_extract_state_s state;
++  size_t total_size;
++
++  if (json_null == value) {
++    /* invalid value was null! */
++    return json_null;
++  }
++
++  result = json_extract_get_value_size(value);
++  total_size = result.dom_size + result.data_size;
++
++  if (json_null == alloc_func_ptr) {
++    allocation = malloc(total_size);
++  } else {
++    allocation = alloc_func_ptr(user_data, total_size);
++  }
++
++  state.dom = (char *)allocation;
++  state.data = state.dom + result.dom_size;
++
++  json_extract_copy_value(&state, value);
++
++  return (struct json_value_s *)allocation;
++}
++
++struct json_string_s *json_value_as_string(struct json_value_s *const value) {
++  if (value->type != json_type_string) {
++    return json_null;
++  }
++
++  return (struct json_string_s *)value->payload;
++}
++
++struct json_number_s *json_value_as_number(struct json_value_s *const value) {
++  if (value->type != json_type_number) {
++    return json_null;
++  }
++
++  return (struct json_number_s *)value->payload;
++}
++
++struct json_object_s *json_value_as_object(struct json_value_s *const value) {
++  if (value->type != json_type_object) {
++    return json_null;
++  }
++
++  return (struct json_object_s *)value->payload;
++}
++
++struct json_array_s *json_value_as_array(struct json_value_s *const value) {
++  if (value->type != json_type_array) {
++    return json_null;
++  }
++
++  return (struct json_array_s *)value->payload;
++}
++
++int json_value_is_true(const struct json_value_s *const value) {
++  return value->type == json_type_true;
++}
++
++int json_value_is_false(const struct json_value_s *const value) {
++  return value->type == json_type_false;
++}
++
++int json_value_is_null(const struct json_value_s *const value) {
++  return value->type == json_type_null;
++}
++
++json_weak int
++json_write_minified_get_value_size(const struct json_value_s *value,
++                                   size_t *size);
++
++json_weak int json_write_get_number_size(const struct json_number_s *number,
++                                         size_t *size);
++int json_write_get_number_size(const struct json_number_s *number,
++                               size_t *size) {
++  json_uintmax_t parsed_number;
++  size_t i;
++
++  if (number->number_size >= 2) {
++    switch (number->number[1]) {
++    default:
++      break;
++    case 'x':
++    case 'X':
++      /* the number is a json_parse_flags_allow_hexadecimal_numbers hexadecimal
++       * so we have to do extra work to convert it to a non-hexadecimal for JSON
++       * output. */
++      parsed_number = json_strtoumax(number->number, json_null, 0);
++
++      i = 0;
++
++      while (0 != parsed_number) {
++        parsed_number /= 10;
++        i++;
++      }
++
++      *size += i;
++      return 0;
++    }
++  }
++
++  /* check to see if the number has leading/trailing decimal point. */
++  i = 0;
++
++  /* skip any leading '+' or '-'. */
++  if ((i < number->number_size) &&
++      (('+' == number->number[i]) || ('-' == number->number[i]))) {
++    i++;
++  }
++
++  /* check if we have infinity. */
++  if ((i < number->number_size) && ('I' == number->number[i])) {
++    const char *inf = "Infinity";
++    size_t k;
++
++    for (k = i; k < number->number_size; k++) {
++      const char c = *inf++;
++
++      /* Check if we found the Infinity string! */
++      if ('\0' == c) {
++        break;
++      } else if (c != number->number[k]) {
++        break;
++      }
++    }
++
++    if ('\0' == *inf) {
++      /* Inf becomes 1.7976931348623158e308 because JSON can't support it. */
++      *size += 22;
++
++      /* if we had a leading '-' we need to record it in the JSON output. */
++      if ('-' == number->number[0]) {
++        *size += 1;
++      }
++    }
++
++    return 0;
++  }
++
++  /* check if we have nan. */
++  if ((i < number->number_size) && ('N' == number->number[i])) {
++    const char *nan = "NaN";
++    size_t k;
++
++    for (k = i; k < number->number_size; k++) {
++      const char c = *nan++;
++
++      /* Check if we found the NaN string! */
++      if ('\0' == c) {
++        break;
++      } else if (c != number->number[k]) {
++        break;
++      }
++    }
++
++    if ('\0' == *nan) {
++      /* NaN becomes 1 because JSON can't support it. */
++      *size += 1;
++
++      return 0;
++    }
++  }
++
++  /* if we had a leading decimal point. */
++  if ((i < number->number_size) && ('.' == number->number[i])) {
++    /* 1 + because we had a leading decimal point. */
++    *size += 1;
++    goto cleanup;
++  }
++
++  for (; i < number->number_size; i++) {
++    const char c = number->number[i];
++    if (!('0' <= c && c <= '9')) {
++      break;
++    }
++  }
++
++  /* if we had a trailing decimal point. */
++  if ((i + 1 == number->number_size) && ('.' == number->number[i])) {
++    /* 1 + because we had a trailing decimal point. */
++    *size += 1;
++    goto cleanup;
++  }
++
++cleanup:
++  *size += number->number_size; /* the actual string of the number. */
++
++  /* if we had a leading '+' we don't record it in the JSON output. */
++  if ('+' == number->number[0]) {
++    *size -= 1;
++  }
++
++  return 0;
++}
++
++json_weak int json_write_get_string_size(const struct json_string_s *string,
++                                         size_t *size);
++int json_write_get_string_size(const struct json_string_s *string,
++                               size_t *size) {
++  size_t i;
++  for (i = 0; i < string->string_size; i++) {
++    switch (string->string[i]) {
++    case '"':
++    case '\\':
++    case '\b':
++    case '\f':
++    case '\n':
++    case '\r':
++    case '\t':
++      *size += 2;
++      break;
++    default:
++      *size += 1;
++      break;
++    }
++  }
++
++  *size += 2; /* need to encode the surrounding '"' characters. */
++
++  return 0;
++}
++
++json_weak int
++json_write_minified_get_array_size(const struct json_array_s *array,
++                                   size_t *size);
++int json_write_minified_get_array_size(const struct json_array_s *array,
++                                       size_t *size) {
++  struct json_array_element_s *element;
++
++  *size += 2; /* '[' and ']'. */
++
++  if (1 < array->length) {
++    *size += array->length - 1; /* ','s seperate each element. */
++  }
++
++  for (element = array->start; json_null != element; element = element->next) {
++    if (json_write_minified_get_value_size(element->value, size)) {
++      /* value was malformed! */
++      return 1;
++    }
++  }
++
++  return 0;
++}
++
++json_weak int
++json_write_minified_get_object_size(const struct json_object_s *object,
++                                    size_t *size);
++int json_write_minified_get_object_size(const struct json_object_s *object,
++                                        size_t *size) {
++  struct json_object_element_s *element;
++
++  *size += 2; /* '{' and '}'. */
++
++  *size += object->length; /* ':'s seperate each name/value pair. */
++
++  if (1 < object->length) {
++    *size += object->length - 1; /* ','s seperate each element. */
++  }
++
++  for (element = object->start; json_null != element; element = element->next) {
++    if (json_write_get_string_size(element->name, size)) {
++      /* string was malformed! */
++      return 1;
++    }
++
++    if (json_write_minified_get_value_size(element->value, size)) {
++      /* value was malformed! */
++      return 1;
++    }
++  }
++
++  return 0;
++}
++
++json_weak int
++json_write_minified_get_value_size(const struct json_value_s *value,
++                                   size_t *size);
++int json_write_minified_get_value_size(const struct json_value_s *value,
++                                       size_t *size) {
++  switch (value->type) {
++  default:
++    /* unknown value type found! */
++    return 1;
++  case json_type_number:
++    return json_write_get_number_size((struct json_number_s *)value->payload,
++                                      size);
++  case json_type_string:
++    return json_write_get_string_size((struct json_string_s *)value->payload,
++                                      size);
++  case json_type_array:
++    return json_write_minified_get_array_size(
++        (struct json_array_s *)value->payload, size);
++  case json_type_object:
++    return json_write_minified_get_object_size(
++        (struct json_object_s *)value->payload, size);
++  case json_type_true:
++    *size += 4; /* the string "true". */
++    return 0;
++  case json_type_false:
++    *size += 5; /* the string "false". */
++    return 0;
++  case json_type_null:
++    *size += 4; /* the string "null". */
++    return 0;
++  }
++}
++
++json_weak char *json_write_minified_value(const struct json_value_s *value,
++                                          char *data);
++
++json_weak char *json_write_number(const struct json_number_s *number,
++                                  char *data);
++char *json_write_number(const struct json_number_s *number, char *data) {
++  json_uintmax_t parsed_number, backup;
++  size_t i;
++
++  if (number->number_size >= 2) {
++    switch (number->number[1]) {
++    default:
++      break;
++    case 'x':
++    case 'X':
++      /* The number is a json_parse_flags_allow_hexadecimal_numbers hexadecimal
++       * so we have to do extra work to convert it to a non-hexadecimal for JSON
++       * output. */
++      parsed_number = json_strtoumax(number->number, json_null, 0);
++
++      /* We need a copy of parsed number twice, so take a backup of it. */
++      backup = parsed_number;
++
++      i = 0;
++
++      while (0 != parsed_number) {
++        parsed_number /= 10;
++        i++;
++      }
++
++      /* Restore parsed_number to its original value stored in the backup. */
++      parsed_number = backup;
++
++      /* Now use backup to take a copy of i, or the length of the string. */
++      backup = i;
++
++      do {
++        *(data + i - 1) = '0' + (char)(parsed_number % 10);
++        parsed_number /= 10;
++        i--;
++      } while (0 != parsed_number);
++
++      data += backup;
++
++      return data;
++    }
++  }
++
++  /* check to see if the number has leading/trailing decimal point. */
++  i = 0;
++
++  /* skip any leading '-'. */
++  if ((i < number->number_size) &&
++      (('+' == number->number[i]) || ('-' == number->number[i]))) {
++    i++;
++  }
++
++  /* check if we have infinity. */
++  if ((i < number->number_size) && ('I' == number->number[i])) {
++    const char *inf = "Infinity";
++    size_t k;
++
++    for (k = i; k < number->number_size; k++) {
++      const char c = *inf++;
++
++      /* Check if we found the Infinity string! */
++      if ('\0' == c) {
++        break;
++      } else if (c != number->number[k]) {
++        break;
++      }
++    }
++
++    if ('\0' == *inf++) {
++      const char *dbl_max;
++
++      /* if we had a leading '-' we need to record it in the JSON output. */
++      if ('-' == number->number[0]) {
++        *data++ = '-';
++      }
++
++      /* Inf becomes 1.7976931348623158e308 because JSON can't support it. */
++      for (dbl_max = "1.7976931348623158e308"; '\0' != *dbl_max; dbl_max++) {
++        *data++ = *dbl_max;
++      }
++
++      return data;
++    }
++  }
++
++  /* check if we have nan. */
++  if ((i < number->number_size) && ('N' == number->number[i])) {
++    const char *nan = "NaN";
++    size_t k;
++
++    for (k = i; k < number->number_size; k++) {
++      const char c = *nan++;
++
++      /* Check if we found the NaN string! */
++      if ('\0' == c) {
++        break;
++      } else if (c != number->number[k]) {
++        break;
++      }
++    }
++
++    if ('\0' == *nan++) {
++      /* NaN becomes 0 because JSON can't support it. */
++      *data++ = '0';
++      return data;
++    }
++  }
++
++  /* if we had a leading decimal point. */
++  if ((i < number->number_size) && ('.' == number->number[i])) {
++    i = 0;
++
++    /* skip any leading '+'. */
++    if ('+' == number->number[i]) {
++      i++;
++    }
++
++    /* output the leading '-' if we had one. */
++    if ('-' == number->number[i]) {
++      *data++ = '-';
++      i++;
++    }
++
++    /* insert a '0' to fix the leading decimal point for JSON output. */
++    *data++ = '0';
++
++    /* and output the rest of the number as normal. */
++    for (; i < number->number_size; i++) {
++      *data++ = number->number[i];
++    }
++
++    return data;
++  }
++
++  for (; i < number->number_size; i++) {
++    const char c = number->number[i];
++    if (!('0' <= c && c <= '9')) {
++      break;
++    }
++  }
++
++  /* if we had a trailing decimal point. */
++  if ((i + 1 == number->number_size) && ('.' == number->number[i])) {
++    i = 0;
++
++    /* skip any leading '+'. */
++    if ('+' == number->number[i]) {
++      i++;
++    }
++
++    /* output the leading '-' if we had one. */
++    if ('-' == number->number[i]) {
++      *data++ = '-';
++      i++;
++    }
++
++    /* and output the rest of the number as normal. */
++    for (; i < number->number_size; i++) {
++      *data++ = number->number[i];
++    }
++
++    /* insert a '0' to fix the trailing decimal point for JSON output. */
++    *data++ = '0';
++
++    return data;
++  }
++
++  i = 0;
++
++  /* skip any leading '+'. */
++  if ('+' == number->number[i]) {
++    i++;
++  }
++
++  for (; i < number->number_size; i++) {
++    *data++ = number->number[i];
++  }
++
++  return data;
++}
++
++json_weak char *json_write_string(const struct json_string_s *string,
++                                  char *data);
++char *json_write_string(const struct json_string_s *string, char *data) {
++  size_t i;
++
++  *data++ = '"'; /* open the string. */
++
++  for (i = 0; i < string->string_size; i++) {
++    switch (string->string[i]) {
++    case '"':
++      *data++ = '\\'; /* escape the control character. */
++      *data++ = '"';
++      break;
++    case '\\':
++      *data++ = '\\'; /* escape the control character. */
++      *data++ = '\\';
++      break;
++    case '\b':
++      *data++ = '\\'; /* escape the control character. */
++      *data++ = 'b';
++      break;
++    case '\f':
++      *data++ = '\\'; /* escape the control character. */
++      *data++ = 'f';
++      break;
++    case '\n':
++      *data++ = '\\'; /* escape the control character. */
++      *data++ = 'n';
++      break;
++    case '\r':
++      *data++ = '\\'; /* escape the control character. */
++      *data++ = 'r';
++      break;
++    case '\t':
++      *data++ = '\\'; /* escape the control character. */
++      *data++ = 't';
++      break;
++    default:
++      *data++ = string->string[i];
++      break;
++    }
++  }
++
++  *data++ = '"'; /* close the string. */
++
++  return data;
++}
++
++json_weak char *json_write_minified_array(const struct json_array_s *array,
++                                          char *data);
++char *json_write_minified_array(const struct json_array_s *array, char *data) {
++  struct json_array_element_s *element = json_null;
++
++  *data++ = '['; /* open the array. */
++
++  for (element = array->start; json_null != element; element = element->next) {
++    if (element != array->start) {
++      *data++ = ','; /* ','s seperate each element. */
++    }
++
++    data = json_write_minified_value(element->value, data);
++
++    if (json_null == data) {
++      /* value was malformed! */
++      return json_null;
++    }
++  }
++
++  *data++ = ']'; /* close the array. */
++
++  return data;
++}
++
++json_weak char *json_write_minified_object(const struct json_object_s *object,
++                                           char *data);
++char *json_write_minified_object(const struct json_object_s *object,
++                                 char *data) {
++  struct json_object_element_s *element = json_null;
++
++  *data++ = '{'; /* open the object. */
++
++  for (element = object->start; json_null != element; element = element->next) {
++    if (element != object->start) {
++      *data++ = ','; /* ','s seperate each element. */
++    }
++
++    data = json_write_string(element->name, data);
++
++    if (json_null == data) {
++      /* string was malformed! */
++      return json_null;
++    }
++
++    *data++ = ':'; /* ':'s seperate each name/value pair. */
++
++    data = json_write_minified_value(element->value, data);
++
++    if (json_null == data) {
++      /* value was malformed! */
++      return json_null;
++    }
++  }
++
++  *data++ = '}'; /* close the object. */
++
++  return data;
++}
++
++json_weak char *json_write_minified_value(const struct json_value_s *value,
++                                          char *data);
++char *json_write_minified_value(const struct json_value_s *value, char *data) {
++  switch (value->type) {
++  default:
++    /* unknown value type found! */
++    return json_null;
++  case json_type_number:
++    return json_write_number((struct json_number_s *)value->payload, data);
++  case json_type_string:
++    return json_write_string((struct json_string_s *)value->payload, data);
++  case json_type_array:
++    return json_write_minified_array((struct json_array_s *)value->payload,
++                                     data);
++  case json_type_object:
++    return json_write_minified_object((struct json_object_s *)value->payload,
++                                      data);
++  case json_type_true:
++    data[0] = 't';
++    data[1] = 'r';
++    data[2] = 'u';
++    data[3] = 'e';
++    return data + 4;
++  case json_type_false:
++    data[0] = 'f';
++    data[1] = 'a';
++    data[2] = 'l';
++    data[3] = 's';
++    data[4] = 'e';
++    return data + 5;
++  case json_type_null:
++    data[0] = 'n';
++    data[1] = 'u';
++    data[2] = 'l';
++    data[3] = 'l';
++    return data + 4;
++  }
++}
++
++void *json_write_minified(const struct json_value_s *value, size_t *out_size) {
++  size_t size = 0;
++  char *data = json_null;
++  char *data_end = json_null;
++
++  if (json_null == value) {
++    return json_null;
++  }
++
++  if (json_write_minified_get_value_size(value, &size)) {
++    /* value was malformed! */
++    return json_null;
++  }
++
++  size += 1; /* for the '\0' null terminating character. */
++
++  data = (char *)malloc(size);
++
++  if (json_null == data) {
++    /* malloc failed! */
++    return json_null;
++  }
++
++  data_end = json_write_minified_value(value, data);
++
++  if (json_null == data_end) {
++    /* bad chi occurred! */
++    free(data);
++    return json_null;
++  }
++
++  /* null terminated the string. */
++  *data_end = '\0';
++
++  if (json_null != out_size) {
++    *out_size = size;
++  }
++
++  return data;
++}
++
++json_weak int json_write_pretty_get_value_size(const struct json_value_s *value,
++                                               size_t depth, size_t indent_size,
++                                               size_t newline_size,
++                                               size_t *size);
++
++json_weak int json_write_pretty_get_array_size(const struct json_array_s *array,
++                                               size_t depth, size_t indent_size,
++                                               size_t newline_size,
++                                               size_t *size);
++int json_write_pretty_get_array_size(const struct json_array_s *array,
++                                     size_t depth, size_t indent_size,
++                                     size_t newline_size, size_t *size) {
++  struct json_array_element_s *element;
++
++  *size += 1; /* '['. */
++
++  if (0 < array->length) {
++    /* if we have any elements we need to add a newline after our '['. */
++    *size += newline_size;
++
++    *size += array->length - 1; /* ','s seperate each element. */
++
++    for (element = array->start; json_null != element;
++         element = element->next) {
++      /* each element gets an indent. */
++      *size += (depth + 1) * indent_size;
++
++      if (json_write_pretty_get_value_size(element->value, depth + 1,
++                                           indent_size, newline_size, size)) {
++        /* value was malformed! */
++        return 1;
++      }
++
++      /* each element gets a newline too. */
++      *size += newline_size;
++    }
++
++    /* since we wrote out some elements, need to add a newline and indentation.
++     */
++    /* to the trailing ']'. */
++    *size += depth * indent_size;
++  }
++
++  *size += 1; /* ']'. */
++
++  return 0;
++}
++
++json_weak int
++json_write_pretty_get_object_size(const struct json_object_s *object,
++                                  size_t depth, size_t indent_size,
++                                  size_t newline_size, size_t *size);
++int json_write_pretty_get_object_size(const struct json_object_s *object,
++                                      size_t depth, size_t indent_size,
++                                      size_t newline_size, size_t *size) {
++  struct json_object_element_s *element;
++
++  *size += 1; /* '{'. */
++
++  if (0 < object->length) {
++    *size += newline_size; /* need a newline next. */
++
++    *size += object->length - 1; /* ','s seperate each element. */
++
++    for (element = object->start; json_null != element;
++         element = element->next) {
++      /* each element gets an indent and newline. */
++      *size += (depth + 1) * indent_size;
++      *size += newline_size;
++
++      if (json_write_get_string_size(element->name, size)) {
++        /* string was malformed! */
++        return 1;
++      }
++
++      *size += 3; /* seperate each name/value pair with " : ". */
++
++      if (json_write_pretty_get_value_size(element->value, depth + 1,
++                                           indent_size, newline_size, size)) {
++        /* value was malformed! */
++        return 1;
++      }
++    }
++
++    *size += depth * indent_size;
++  }
++
++  *size += 1; /* '}'. */
++
++  return 0;
++}
++
++json_weak int json_write_pretty_get_value_size(const struct json_value_s *value,
++                                               size_t depth, size_t indent_size,
++                                               size_t newline_size,
++                                               size_t *size);
++int json_write_pretty_get_value_size(const struct json_value_s *value,
++                                     size_t depth, size_t indent_size,
++                                     size_t newline_size, size_t *size) {
++  switch (value->type) {
++  default:
++    /* unknown value type found! */
++    return 1;
++  case json_type_number:
++    return json_write_get_number_size((struct json_number_s *)value->payload,
++                                      size);
++  case json_type_string:
++    return json_write_get_string_size((struct json_string_s *)value->payload,
++                                      size);
++  case json_type_array:
++    return json_write_pretty_get_array_size(
++        (struct json_array_s *)value->payload, depth, indent_size, newline_size,
++        size);
++  case json_type_object:
++    return json_write_pretty_get_object_size(
++        (struct json_object_s *)value->payload, depth, indent_size,
++        newline_size, size);
++  case json_type_true:
++    *size += 4; /* the string "true". */
++    return 0;
++  case json_type_false:
++    *size += 5; /* the string "false". */
++    return 0;
++  case json_type_null:
++    *size += 4; /* the string "null". */
++    return 0;
++  }
++}
++
++json_weak char *json_write_pretty_value(const struct json_value_s *value,
++                                        size_t depth, const char *indent,
++                                        const char *newline, char *data);
++
++json_weak char *json_write_pretty_array(const struct json_array_s *array,
++                                        size_t depth, const char *indent,
++                                        const char *newline, char *data);
++char *json_write_pretty_array(const struct json_array_s *array, size_t depth,
++                              const char *indent, const char *newline,
++                              char *data) {
++  size_t k, m;
++  struct json_array_element_s *element;
++
++  *data++ = '['; /* open the array. */
++
++  if (0 < array->length) {
++    for (k = 0; '\0' != newline[k]; k++) {
++      *data++ = newline[k];
++    }
++
++    for (element = array->start; json_null != element;
++         element = element->next) {
++      if (element != array->start) {
++        *data++ = ','; /* ','s seperate each element. */
++
++        for (k = 0; '\0' != newline[k]; k++) {
++          *data++ = newline[k];
++        }
++      }
++
++      for (k = 0; k < depth + 1; k++) {
++        for (m = 0; '\0' != indent[m]; m++) {
++          *data++ = indent[m];
++        }
++      }
++
++      data = json_write_pretty_value(element->value, depth + 1, indent, newline,
++                                     data);
++
++      if (json_null == data) {
++        /* value was malformed! */
++        return json_null;
++      }
++    }
++
++    for (k = 0; '\0' != newline[k]; k++) {
++      *data++ = newline[k];
++    }
++
++    for (k = 0; k < depth; k++) {
++      for (m = 0; '\0' != indent[m]; m++) {
++        *data++ = indent[m];
++      }
++    }
++  }
++
++  *data++ = ']'; /* close the array. */
++
++  return data;
++}
++
++json_weak char *json_write_pretty_object(const struct json_object_s *object,
++                                         size_t depth, const char *indent,
++                                         const char *newline, char *data);
++char *json_write_pretty_object(const struct json_object_s *object, size_t depth,
++                               const char *indent, const char *newline,
++                               char *data) {
++  size_t k, m;
++  struct json_object_element_s *element;
++
++  *data++ = '{'; /* open the object. */
++
++  if (0 < object->length) {
++    for (k = 0; '\0' != newline[k]; k++) {
++      *data++ = newline[k];
++    }
++
++    for (element = object->start; json_null != element;
++         element = element->next) {
++      if (element != object->start) {
++        *data++ = ','; /* ','s seperate each element. */
++
++        for (k = 0; '\0' != newline[k]; k++) {
++          *data++ = newline[k];
++        }
++      }
++
++      for (k = 0; k < depth + 1; k++) {
++        for (m = 0; '\0' != indent[m]; m++) {
++          *data++ = indent[m];
++        }
++      }
++
++      data = json_write_string(element->name, data);
++
++      if (json_null == data) {
++        /* string was malformed! */
++        return json_null;
++      }
++
++      /* " : "s seperate each name/value pair. */
++      *data++ = ' ';
++      *data++ = ':';
++      *data++ = ' ';
++
++      data = json_write_pretty_value(element->value, depth + 1, indent, newline,
++                                     data);
++
++      if (json_null == data) {
++        /* value was malformed! */
++        return json_null;
++      }
++    }
++
++    for (k = 0; '\0' != newline[k]; k++) {
++      *data++ = newline[k];
++    }
++
++    for (k = 0; k < depth; k++) {
++      for (m = 0; '\0' != indent[m]; m++) {
++        *data++ = indent[m];
++      }
++    }
++  }
++
++  *data++ = '}'; /* close the object. */
++
++  return data;
++}
++
++json_weak char *json_write_pretty_value(const struct json_value_s *value,
++                                        size_t depth, const char *indent,
++                                        const char *newline, char *data);
++char *json_write_pretty_value(const struct json_value_s *value, size_t depth,
++                              const char *indent, const char *newline,
++                              char *data) {
++  switch (value->type) {
++  default:
++    /* unknown value type found! */
++    return json_null;
++  case json_type_number:
++    return json_write_number((struct json_number_s *)value->payload, data);
++  case json_type_string:
++    return json_write_string((struct json_string_s *)value->payload, data);
++  case json_type_array:
++    return json_write_pretty_array((struct json_array_s *)value->payload, depth,
++                                   indent, newline, data);
++  case json_type_object:
++    return json_write_pretty_object((struct json_object_s *)value->payload,
++                                    depth, indent, newline, data);
++  case json_type_true:
++    data[0] = 't';
++    data[1] = 'r';
++    data[2] = 'u';
++    data[3] = 'e';
++    return data + 4;
++  case json_type_false:
++    data[0] = 'f';
++    data[1] = 'a';
++    data[2] = 'l';
++    data[3] = 's';
++    data[4] = 'e';
++    return data + 5;
++  case json_type_null:
++    data[0] = 'n';
++    data[1] = 'u';
++    data[2] = 'l';
++    data[3] = 'l';
++    return data + 4;
++  }
++}
++
++void *json_write_pretty(const struct json_value_s *value, const char *indent,
++                        const char *newline, size_t *out_size) {
++  size_t size = 0;
++  size_t indent_size = 0;
++  size_t newline_size = 0;
++  char *data = json_null;
++  char *data_end = json_null;
++
++  if (json_null == value) {
++    return json_null;
++  }
++
++  if (json_null == indent) {
++    indent = "  "; /* default to two spaces. */
++  }
++
++  if (json_null == newline) {
++    newline = "\n"; /* default to linux newlines. */
++  }
++
++  while ('\0' != indent[indent_size]) {
++    ++indent_size; /* skip non-null terminating characters. */
++  }
++
++  while ('\0' != newline[newline_size]) {
++    ++newline_size; /* skip non-null terminating characters. */
++  }
++
++  if (json_write_pretty_get_value_size(value, 0, indent_size, newline_size,
++                                       &size)) {
++    /* value was malformed! */
++    return json_null;
++  }
++
++  size += 1; /* for the '\0' null terminating character. */
++
++  data = (char *)malloc(size);
++
++  if (json_null == data) {
++    /* malloc failed! */
++    return json_null;
++  }
++
++  data_end = json_write_pretty_value(value, 0, indent, newline, data);
++
++  if (json_null == data_end) {
++    /* bad chi occurred! */
++    free(data);
++    return json_null;
++  }
++
++  /* null terminated the string. */
++  *data_end = '\0';
++
++  if (json_null != out_size) {
++    *out_size = size;
++  }
++
++  return data;
++}
++
++#if defined(__clang__)
++#pragma clang diagnostic pop
++#elif defined(_MSC_VER)
++#pragma warning(pop)
++#endif
++
++#endif /* SHEREDOM_JSON_H_INCLUDED. */
+diff --git a/src/swtpm_setup/swtpm_setup.c b/src/swtpm_setup/swtpm_setup.c
+index 96e8b9f..ade5e34 100644
+--- a/src/swtpm_setup/swtpm_setup.c
++++ b/src/swtpm_setup/swtpm_setup.c
+@@ -5,6 +5,7 @@
+  * Author: Stefan Berger, stefanb@linux.ibm.com
+  *
+  * Copyright (c) IBM Corporation, 2021
++ * Copyright (c) Monogon SE, 2024
+  */
+ 
+ #include "config.h"
+@@ -27,8 +28,7 @@
+ #include "glib/gstdio.h"
+ #include "glib/gprintf.h"
+ 
+-#include <glib-object.h>
+-#include <json-glib/json-glib.h>
++#include "json.h"
+ 
+ #include <libtpms/tpm_nvfilename.h>
+ 
+@@ -99,78 +99,112 @@ static int tpm_get_specs_and_attributes(struct swtpm *swtpm, gchar ***params)
+ {
+     int ret;
+     g_autofree gchar *json = NULL;
+-    JsonParser *jp = NULL;
+-    GError *error = NULL;
+-    JsonReader *jr = NULL;
+-    JsonNode *root;
+-    static const struct parse_rule {
+-         const char *node1;
+-         const char *node2;
+-         gboolean is_int;
+-         const char *optname;
+-    } parser_rules[7] = {
+-         {"TPMSpecification", "family", FALSE, "--tpm-spec-family"},
+-         {"TPMSpecification", "level", TRUE, "--tpm-spec-level"},
+-         {"TPMSpecification", "revision", TRUE, "--tpm-spec-revision"},
+-         {"TPMAttributes", "manufacturer", FALSE, "--tpm-manufacturer"},
+-         {"TPMAttributes", "model", FALSE, "--tpm-model"},
+-         {"TPMAttributes", "version", FALSE, "--tpm-version"},
+-         {NULL, NULL, FALSE, NULL},
+-    };
+-    size_t idx;
++    struct json_value_s *root = NULL;
++    struct json_object_s *obj = NULL;
++
++    *params = NULL;
+ 
+     ret = swtpm->cops->ctrl_get_tpm_specs_and_attrs(swtpm, &json);
+     if (ret != 0) {
+         logerr(gl_LOGFILE, "Could not get the TPM spec and attribute parameters.\n");
+-        return 1;
++        ret = 1;
++        goto error;
+     }
+ 
+-    jp = json_parser_new();
++    root = json_parse(json, strlen(json));
++    if (root == 0) {
++        logerr(gl_LOGFILE, "Could not parse JSON from TPM spec and attribute parameters.\n");
++        ret = 1;
++        goto error;
++    }
++    obj = json_value_as_object(root);
++    if (obj == NULL) {
++        logerr(gl_LOGFILE, "JSON root is not an object.\n");
++        ret = 1;
++        goto error;
++    }
+ 
+-    if (!json_parser_load_from_data(jp, json, -1, &error)) {
+-        logerr(gl_LOGFILE, "JSON parser failed: %s\n", error->message);
+-        g_error_free(error);
++    struct json_object_s *TPMSpecification = NULL;
++    struct json_object_s *TPMAttributes = NULL;
++    for (struct json_object_element_s *el = obj->start; el != NULL; el = el->next) {
++        if (strcmp(el->name->string, "TPMSpecification") == 0) {
++            TPMSpecification = json_value_as_object(el->value);
++            continue;
++        }
++        if (strcmp(el->name->string, "TPMAttributes") == 0) {
++            TPMAttributes = json_value_as_object(el->value);
++            continue;
++        }
++    }
++    if (TPMSpecification == NULL) {
++        logerr(gl_LOGFILE, "TPMSpecification not found in JSON.\n");
++        ret = 1;
++        goto error;
++    }
++    if (TPMAttributes == NULL) {
++        logerr(gl_LOGFILE, "TPMAttributes not found in JSON.\n");
++        ret = 1;
+         goto error;
+     }
+ 
+-    *params = NULL;
+-    root = json_parser_get_root(jp);
+-
+-    for (idx = 0; parser_rules[idx].node1 != NULL; idx++) {
+-        jr = json_reader_new(root);
+-        if (json_reader_read_member(jr, parser_rules[idx].node1) &&
+-            json_reader_read_member(jr, parser_rules[idx].node2)) {
+-            gchar *str;
+-
+-            if (parser_rules[idx].is_int)
+-                str = g_strdup_printf("%ld", (long)json_reader_get_int_value(jr));
+-            else
+-                str = g_strdup(json_reader_get_string_value(jr));
+-
+-            *params = concat_arrays(*params,
+-                                    (gchar*[]){
+-                                        g_strdup(parser_rules[idx].optname),
+-                                        str,
+-                                        NULL
+-                                    }, TRUE);
+-        } else {
+-            logerr(gl_LOGFILE, "Could not find [%s][%s] in '%s'\n",
+-                   parser_rules[idx].node1, parser_rules[idx].node2, json);
+-            ret = 1;
+-            break;
++    const char *spec_family = NULL;
++    const char *spec_level = NULL;
++    const char *spec_revision = NULL;
++    const char *attr_manufacturer = NULL;
++    const char *attr_model = NULL;
++    const char *attr_version = NULL;
++
++    for (struct json_object_element_s *el = TPMSpecification->start; el != NULL; el = el->next) {
++        if (strcmp(el->name->string, "family") == 0 && el->value->type == json_type_string) {
++            spec_family = json_value_as_string(el->value)->string;
++            continue;
++        }
++        if (strcmp(el->name->string, "level") == 0 && el->value->type == json_type_number) {
++            spec_level = json_value_as_number(el->value)->number;
++            continue;
++        }
++        if (strcmp(el->name->string, "revision") == 0 && el->value->type == json_type_number) {
++            spec_revision = json_value_as_number(el->value)->number;
++            continue;
++        }
++    }
++    for (struct json_object_element_s *el = TPMAttributes->start; el != NULL; el = el->next) {
++        if (strcmp(el->name->string, "manufacturer") == 0 && el->value->type == json_type_string) {
++            attr_manufacturer = json_value_as_string(el->value)->string;
++            continue;
++        }
++        if (strcmp(el->name->string, "model") == 0 && el->value->type == json_type_string) {
++            attr_model = json_value_as_string(el->value)->string;
++            continue;
++        }
++        if (strcmp(el->name->string, "version") == 0 && el->value->type == json_type_string) {
++            attr_version = json_value_as_string(el->value)->string;
++            continue;
+         }
+-        g_object_unref(jr);
+-        jr = NULL;
+     }
+ 
++    if (!spec_family) { logerr(gl_LOGFILE, "family not found in TPMSpecifiction.\n"); ret = 1; goto error; }
++    if (!spec_level) { logerr(gl_LOGFILE, "level not found in TPMSpecifiction.\n"); ret = 1; goto error; }
++    if (!spec_revision) { logerr(gl_LOGFILE, "revision not found in TPMSpecifiction.\n"); ret = 1; goto error; }
++    if (!attr_manufacturer) { logerr(gl_LOGFILE, "manufacturer not found in TPMAttributes.\n"); ret = 1; goto error; }
++    if (!attr_model) { logerr(gl_LOGFILE, "model not found in TPMAttributes.\n"); ret = 1; goto error; }
++    if (!attr_version) { logerr(gl_LOGFILE, "version not found in TPMAttributes.\n"); ret = 1; goto error; }
++
++    *params = concat_arrays(*params, (gchar*[]) {
++            g_strdup("--tpm-spec-family"), g_strdup(spec_family),
++            g_strdup("--tpm-spec-revision"), g_strdup(spec_revision),
++            g_strdup("--tpm-spec-level"), g_strdup(spec_level),
++            g_strdup("--tpm-manufacturer"), g_strdup(attr_manufacturer),
++            g_strdup("--tpm-model"), g_strdup(attr_model),
++            g_strdup("--tpm-version"), g_strdup(attr_version),
++            NULL }, TRUE);
++error:
+     if (ret) {
+         g_strfreev(*params);
+-        *params = NULL;
+-        g_object_unref(jr);
+     }
+-error:
+-    g_object_unref(jp);
+-
++    if (root) {
++        free(root);
++    }
+     return ret;
+ }
+ 
+-- 
+2.42.0
+
diff --git a/third_party/swtpm/patches/0004-bazel-support-implement.patch b/third_party/swtpm/patches/0004-bazel-support-implement.patch
new file mode 100644
index 0000000..15245c6
--- /dev/null
+++ b/third_party/swtpm/patches/0004-bazel-support-implement.patch
@@ -0,0 +1,212 @@
+From 3b2ea39444bf97d7847fdb1a3ca70f9d58ffe22a Mon Sep 17 00:00:00 2001
+From: Serge Bazanski <serge@monogon.tech>
+Date: Tue, 4 Jun 2024 15:10:02 +0200
+Subject: [PATCH 4/4] bazel support: implement
+
+---
+ .gitignore             |  2 -
+ BUILD.bazel            | 94 ++++++++++++++++++++++++++++++++++++++++++
+ WORKSPACE              |  0
+ include/config.h       |  8 ++++
+ include/swtpm.h        |  5 +++
+ src/swtpm/main.c       |  2 +-
+ src/utils/swtpm_conf.h | 22 ++++++++++
+ 7 files changed, 130 insertions(+), 3 deletions(-)
+ create mode 100644 BUILD.bazel
+ create mode 100644 WORKSPACE
+ create mode 100644 include/config.h
+ create mode 100644 include/swtpm.h
+ create mode 100644 src/utils/swtpm_conf.h
+
+diff --git a/.gitignore b/.gitignore
+index c669f06..9982dd0 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -35,7 +35,6 @@ Makefile
+ /m4/*
+ /.pc/*
+ /patches/*
+-/include/swtpm.h
+ /man/man3/*.3
+ /man/man5/*.5
+ /man/man8/*.8
+@@ -60,7 +59,6 @@ Makefile
+ /src/swtpm_ioctl/swtpm_ioctl
+ /src/swtpm_localca/swtpm_localca
+ /src/swtpm_setup/swtpm_setup
+-/src/utils/swtpm_conf.h
+ /test-driver
+ tests/*.log
+ tests/*.trs
+diff --git a/BUILD.bazel b/BUILD.bazel
+new file mode 100644
+index 0000000..acddc0e
+--- /dev/null
++++ b/BUILD.bazel
+@@ -0,0 +1,94 @@
++cc_binary(
++    name = "swtpm",
++    deps = [
++        "@libtpms//:libtpms_tpm2",
++        "@glib//glib",
++    ],
++    srcs = glob([
++        "src/swtpm/*.h",
++        "src/swtpm/*.c",
++        "src/utils/*.h",
++        "src/utils/*.c",
++        "include/*.h",
++        "include/swtpm/*.h",
++    ], [
++        # No CUSE support.
++        "src/swtpm/cuse_tpm.c",
++        # Only used in utils.
++        "src/utils/swtpm_utils.c",
++    ]),
++    copts = [
++        "-Iexternal/swtpm/include",
++        "-Iexternal/swtpm/include/swtpm",
++        "-Iexternal/swtpm/src/utils",
++    ],
++    visibility = [
++        "//visibility:public",
++    ],
++)
++
++cc_binary(
++    name = "swtpm_localca",
++    deps = [
++        "@libtpms//:libtpms_tpm2",
++        "@glib//glib",
++    ],
++    srcs = glob([
++        "src/swtpm_localca/*.h",
++        "src/swtpm_localca/*.c",
++        "include/*.h",
++        "include/swtpm/*.h",
++        "src/utils/*.h",
++        "src/utils/*.c",
++    ], []),
++    copts = [
++        "-Iexternal/swtpm/include",
++        "-Iexternal/swtpm/include/swtpm",
++        "-Iexternal/swtpm/src/utils",
++    ],
++    visibility = [
++        "//visibility:public",
++    ],
++)
++
++cc_binary(
++    name = "swtpm_setup",
++    deps = [
++        "@libtpms//:libtpms_tpm2",
++        "@glib//glib",
++    ],
++    srcs = glob([
++        "src/swtpm_setup/*.h",
++        "src/swtpm_setup/*.c",
++        "include/*.h",
++        "include/swtpm/*.h",
++        "src/utils/*.h",
++        "src/utils/*.c",
++    ], []),
++    copts = [
++        "-Iexternal/swtpm/include",
++        "-Iexternal/swtpm/include/swtpm",
++        "-Iexternal/swtpm/src/utils",
++    ],
++    visibility = [
++        "//visibility:public",
++    ],
++)
++
++cc_binary(
++    name = "swtpm_cert",
++    deps = [
++        "@boringssl//:ssl",
++    ],
++    srcs = glob([
++        "src/swtpm_cert/*.h",
++        "src/swtpm_cert/*.c",
++        "include/*.h",
++    ], []),
++    copts = [
++        "-Iexternal/swtpm/include",
++    ],
++    visibility = [
++        "//visibility:public",
++    ],
++)
+diff --git a/WORKSPACE b/WORKSPACE
+new file mode 100644
+index 0000000..e69de29
+diff --git a/include/config.h b/include/config.h
+new file mode 100644
+index 0000000..d3829d6
+--- /dev/null
++++ b/include/config.h
+@@ -0,0 +1,8 @@
++#pragma once
++#define _GNU_SOURCE
++
++#define VERSION "0.8.2-monogon"
++
++// A bunch of files in swtpm depend on stdint types but never include them.
++// Just inject them through here.
++#include <stdint.h>
+diff --git a/include/swtpm.h b/include/swtpm.h
+new file mode 100644
+index 0000000..2eddeec
+--- /dev/null
++++ b/include/swtpm.h
+@@ -0,0 +1,5 @@
++#pragma once
++
++#define SWTPM_VER_MAJOR 0
++#define SWTPM_VER_MINOR 8
++#define SWTPM_VER_MICRO 2
+diff --git a/src/swtpm/main.c b/src/swtpm/main.c
+index 4864e85..633ca33 100644
+--- a/src/swtpm/main.c
++++ b/src/swtpm/main.c
+@@ -83,7 +83,7 @@ int main(int argc, char **argv)
+     } else if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) {
+         usage(stdout, argv[0]);
+     } else if (!strcmp(argv[1], "-v") || !strcmp(argv[1], "--version")) {
+-        fprintf(stdout, "TPM emulator version %d.%d.%d, "
++        fprintf(stdout, "TPM emulator version %d.%d.%d-monogon, "
+                 "Copyright (c) 2014-2022 IBM Corp. and others\n",
+                 SWTPM_VER_MAJOR,
+                 SWTPM_VER_MINOR,
+diff --git a/src/utils/swtpm_conf.h b/src/utils/swtpm_conf.h
+new file mode 100644
+index 0000000..de8afdb
+--- /dev/null
++++ b/src/utils/swtpm_conf.h
+@@ -0,0 +1,22 @@
++/* SPDX-License-Identifier: BSD-3-Clause */
++/*
++ * swtpm_conf.h: Compile-time constants
++ *
++ * Author: Stefan Berger, stefanb@linux.ibm.com
++ *
++ * Copyright (c) IBM Corporation, 2021,2023
++ */
++
++#ifndef SWTPM_SETUP_CONF_H
++#define SWTPM_SETUP_CONF_H
++
++#define SWTPM_VER_MAJOR 0
++#define SWTPM_VER_MINOR 8
++#define SWTPM_VER_MICRO 2
++
++#define SYSCONFDIR "/unused"
++#define BINDIR "/unused"
++
++#define DEFAULT_PCR_BANKS "sha256"
++
++#endif /* SWTPM_SETUP_CONF_H */
+-- 
+2.42.0
+
diff --git a/third_party/swtpm/patches/BUILD.bazel b/third_party/swtpm/patches/BUILD.bazel
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/third_party/swtpm/patches/BUILD.bazel
