// File: alfanick[P]rest-cpp/src/rest/json.hpp
// Function: nlohmann::basic_json<std::map, std::vector, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, bool, long, double, std::allocator>::dump(std::ostream&, bool, unsigned int, unsigned int) const
void dump(std::ostream& o,
              const bool pretty_print,
              const unsigned int indent_step,
              const unsigned int current_indent = 0) const
    {
        // variable to hold indentation for recursive calls
        unsigned int new_indent = current_indent;

        switch (m_type)
        {
            case value_t::object:
            {
                assert(m_value.object != nullptr);

                if (m_value.object->empty())
                {
                    o << "{}";
                    return;
                }

                o << "{";

                // increase indentation
                if (pretty_print)
                {
                    new_indent += indent_step;
                    o << "\n";
                }

                for (auto i = m_value.object->cbegin(); i != m_value.object->cend(); ++i)
                {
                    if (i != m_value.object->cbegin())
                    {
                        o << (pretty_print ? ",\n" : ",");
                    }
                    o << string_t(new_indent, ' ') << "\""
                      << escape_string(i->first) << "\":"
                      << (pretty_print ? " " : "");
                    i->second.dump(o, pretty_print, indent_step, new_indent);
                }

                // decrease indentation
                if (pretty_print)
                {
                    new_indent -= indent_step;
                    o << "\n";
                }

                o << string_t(new_indent, ' ') + "}";
                return;
            }

            case value_t::array:
            {
                assert(m_value.array != nullptr);

                if (m_value.array->empty())
                {
                    o << "[]";
                    return;
                }

                o << "[";

                // increase indentation
                if (pretty_print)
                {
                    new_indent += indent_step;
                    o << "\n";
                }

                for (auto i = m_value.array->cbegin(); i != m_value.array->cend(); ++i)
                {
                    if (i != m_value.array->cbegin())
                    {
                        o << (pretty_print ? ",\n" : ",");
                    }
                    o << string_t(new_indent, ' ');
                    i->dump(o, pretty_print, indent_step, new_indent);
                }

                // decrease indentation
                if (pretty_print)
                {
                    new_indent -= indent_step;
                    o << "\n";
                }

                o << string_t(new_indent, ' ') << "]";
                return;
            }

            case value_t::string:
            {
                assert(m_value.string != nullptr);
                o << string_t("\"") << escape_string(*m_value.string) << "\"";
                return;
            }

            case value_t::boolean:
            {
                o << (m_value.boolean ? "true" : "false");
                return;
            }

            case value_t::number_integer:
            {
                o << m_value.number_integer;
                return;
            }

            case value_t::number_float:
            {
                // If the number is an integer then output as a fixed with with
                // precision 1 to output "0.0", "1.0" etc as expected for some
                // round trip tests otherwise  15 digits of precision allows
                // round-trip IEEE 754 string->double->string; to be safe, we
                // read this value from
                // std::numeric_limits<number_float_t>::digits10
                if (std::fmod(m_value.number_float, 1) == 0)
                {
                    o << std::fixed << std::setprecision(1);
                }
                else
                {
                    // std::defaultfloat not supported in gcc version < 5
                    o.unsetf(std::ios_base::floatfield);
                    o << std::setprecision(std::numeric_limits<double>::digits10);
                }
                o << m_value.number_float;
                return;
            }

            case value_t::discarded:
            {
                o << "<discarded>";
                return;
            }

            case value_t::null:
            {
                o << "null";
                return;
            }
        }
    }

// Assembly:
subq $0x268, %rsp            # imm = 0x268
movb %dl, %al
movq %rdi, 0x260(%rsp)
movq %rsi, 0x258(%rsp)
andb $0x1, %al
movb %al, 0x257(%rsp)
movl %ecx, 0x250(%rsp)
movl %r8d, 0x24c(%rsp)
movq 0x260(%rsp), %rax
movq %rax, 0xc8(%rsp)
movl 0x24c(%rsp), %ecx
movl %ecx, 0x248(%rsp)
movzbl (%rax), %eax
movq %rax, 0xd0(%rsp)
subq $0x7, %rax
ja 0xdf9ff
movq 0xd0(%rsp), %rax
leaq 0x7d0d(%rip), %rcx      # 0xe6c50
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0xc8(%rsp), %rax
cmpq $0x0, 0x8(%rax)
je 0xdef5d
jmp 0xdef7c
leaq 0x5d55(%rip), %rdi      # 0xe4cb9
leaq 0x541c(%rip), %rsi      # 0xe4387
movl $0x1588, %edx           # imm = 0x1588
leaq 0x7dca(%rip), %rcx      # 0xe6d41
callq 0x90c40
movq 0xc8(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x95040
testb $0x1, %al
jne 0xdef93
jmp 0xdefac
movq 0x258(%rsp), %rdi
leaq 0x7eca(%rip), %rsi      # 0xe6e6c
callq 0x930c0
jmp 0xdf9ff
movq 0x258(%rsp), %rdi
leaq 0x7eb4(%rip), %rsi      # 0xe6e6f
callq 0x930c0
testb $0x1, 0x257(%rsp)
je 0xdeff3
movl 0x250(%rsp), %eax
addl 0x248(%rsp), %eax
movl %eax, 0x248(%rsp)
movq 0x258(%rsp), %rdi
leaq 0x7ccf(%rip), %rsi      # 0xe6cbd
callq 0x930c0
movq 0xc8(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x96130
movq %rax, 0x240(%rsp)
movq 0xc8(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x91d90
movq %rax, 0x238(%rsp)
leaq 0x240(%rsp), %rdi
leaq 0x238(%rsp), %rsi
callq 0x8e2b0
testb $0x1, %al
jne 0xdf043
jmp 0xdf2a3
movq 0xc8(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x96130
movq %rax, 0x230(%rsp)
leaq 0x240(%rsp), %rdi
leaq 0x230(%rsp), %rsi
callq 0x8e2b0
testb $0x1, %al
jne 0xdf077
jmp 0xdf0a0
movq 0x258(%rsp), %rdi
movb 0x257(%rsp), %cl
leaq 0x7de7(%rip), %rsi      # 0xe6e74
leaq 0x7ddd(%rip), %rax      # 0xe6e71
testb $0x1, %cl
cmovneq %rax, %rsi
callq 0x930c0
movq 0x258(%rsp), %rax
movq %rax, 0xb0(%rsp)
movl 0x248(%rsp), %eax
movq %rax, 0xb8(%rsp)
leaq 0x20f(%rsp), %rdi
movq %rdi, 0xc0(%rsp)
callq 0x98200
movq 0xb8(%rsp), %rsi
movq 0xc0(%rsp), %rcx
leaq 0x210(%rsp), %rdi
movl $0x20, %edx
callq 0x90d00
jmp 0xdf0f8
movq 0xb0(%rsp), %rdi
leaq 0x210(%rsp), %rsi
callq 0x925d0
movq %rax, 0xa8(%rsp)
jmp 0xdf117
movq 0xa8(%rsp), %rdi
leaq 0x74f2(%rip), %rsi      # 0xe6618
callq 0x930c0
movq %rax, 0xa0(%rsp)
jmp 0xdf135
leaq 0x240(%rsp), %rdi
callq 0x916e0
movq %rax, %rsi
leaq 0x1d8(%rsp), %rdi
movq %rdi, 0x90(%rsp)
callq 0x912d0
movq 0xa0(%rsp), %rdi
movq 0x90(%rsp), %rsi
callq 0x925d0
movq %rax, 0x98(%rsp)
jmp 0xdf179
movq 0x98(%rsp), %rdi
leaq 0x7cee(%rip), %rsi      # 0xe6e76
callq 0x930c0
movq %rax, 0x88(%rsp)
jmp 0xdf197
movq 0x88(%rsp), %rdi
movb 0x257(%rsp), %cl
leaq 0x5f97(%rip), %rax      # 0xe5144
leaq 0x55b0(%rip), %rsi      # 0xe4764
testb $0x1, %cl
cmovneq %rax, %rsi
callq 0x930c0
jmp 0xdf1c2
leaq 0x1d8(%rsp), %rdi
callq 0x99830
leaq 0x210(%rsp), %rdi
callq 0x99830
leaq 0x20f(%rsp), %rdi
callq 0x938a0
leaq 0x240(%rsp), %rdi
callq 0x916e0
movq %rax, %rdi
addq $0x20, %rdi
movq 0x258(%rsp), %rsi
movb 0x257(%rsp), %al
movl 0x250(%rsp), %ecx
movl 0x248(%rsp), %r8d
andb $0x1, %al
movzbl %al, %edx
callq 0x8d410
leaq 0x240(%rsp), %rdi
callq 0x94b40
jmp 0xdf00c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x200(%rsp)
movl %eax, 0x1fc(%rsp)
jmp 0xdf291
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x200(%rsp)
movl %eax, 0x1fc(%rsp)
jmp 0xdf284
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x200(%rsp)
movl %eax, 0x1fc(%rsp)
leaq 0x1d8(%rsp), %rdi
callq 0x99830
leaq 0x210(%rsp), %rdi
callq 0x99830
leaq 0x20f(%rsp), %rdi
callq 0x938a0
jmp 0xdfa07
testb $0x1, 0x257(%rsp)
je 0xdf2d8
movl 0x250(%rsp), %ecx
movl 0x248(%rsp), %eax
subl %ecx, %eax
movl %eax, 0x248(%rsp)
movq 0x258(%rsp), %rdi
leaq 0x79ea(%rip), %rsi      # 0xe6cbd
callq 0x930c0
movq 0x258(%rsp), %rax
movq %rax, 0x70(%rsp)
movl 0x248(%rsp), %eax
movq %rax, 0x78(%rsp)
leaq 0x197(%rsp), %rdi
movq %rdi, 0x80(%rsp)
callq 0x98200
movq 0x78(%rsp), %rsi
movq 0x80(%rsp), %rcx
leaq 0x198(%rsp), %rdi
movl $0x20, %edx
callq 0x90d00
jmp 0xdf327
leaq 0x7b3f(%rip), %rdx      # 0xe6e6d
leaq 0x1b8(%rsp), %rdi
leaq 0x198(%rsp), %rsi
callq 0x8df90
jmp 0xdf345
movq 0x70(%rsp), %rdi
leaq 0x1b8(%rsp), %rsi
callq 0x925d0
jmp 0xdf359
leaq 0x1b8(%rsp), %rdi
callq 0x99830
leaq 0x198(%rsp), %rdi
callq 0x99830
leaq 0x197(%rsp), %rdi
callq 0x938a0
jmp 0xdf9ff
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x200(%rsp)
movl %eax, 0x1fc(%rsp)
jmp 0xdf3df
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x200(%rsp)
movl %eax, 0x1fc(%rsp)
jmp 0xdf3d2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x200(%rsp)
movl %eax, 0x1fc(%rsp)
leaq 0x1b8(%rsp), %rdi
callq 0x99830
leaq 0x198(%rsp), %rdi
callq 0x99830
leaq 0x197(%rsp), %rdi
callq 0x938a0
jmp 0xdfa07
movq 0xc8(%rsp), %rax
cmpq $0x0, 0x8(%rax)
je 0xdf402
jmp 0xdf421
leaq 0x5a29(%rip), %rdi      # 0xe4e32
leaq 0x4f77(%rip), %rsi      # 0xe4387
movl $0x15b2, %edx           # imm = 0x15B2
leaq 0x7925(%rip), %rcx      # 0xe6d41
callq 0x90c40
movq 0xc8(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x97140
testb $0x1, %al
jne 0xdf438
jmp 0xdf451
movq 0x258(%rsp), %rdi
leaq 0x7a32(%rip), %rsi      # 0xe6e79
callq 0x930c0
jmp 0xdf9ff
movq 0x258(%rsp), %rdi
leaq 0x7a1c(%rip), %rsi      # 0xe6e7c
callq 0x930c0
testb $0x1, 0x257(%rsp)
je 0xdf498
movl 0x250(%rsp), %eax
addl 0x248(%rsp), %eax
movl %eax, 0x248(%rsp)
movq 0x258(%rsp), %rdi
leaq 0x782a(%rip), %rsi      # 0xe6cbd
callq 0x930c0
movq 0xc8(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x934b0
movq %rax, 0x188(%rsp)
movq 0xc8(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x8f950
movq %rax, 0x180(%rsp)
leaq 0x188(%rsp), %rdi
leaq 0x180(%rsp), %rsi
callq 0x95780
testb $0x1, %al
jne 0xdf4e8
jmp 0xdf64f
movq 0xc8(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x934b0
movq %rax, 0x178(%rsp)
leaq 0x188(%rsp), %rdi
leaq 0x178(%rsp), %rsi
callq 0x95780
testb $0x1, %al
jne 0xdf51c
jmp 0xdf545
movq 0x258(%rsp), %rdi
movb 0x257(%rsp), %cl
leaq 0x7942(%rip), %rsi      # 0xe6e74
leaq 0x7938(%rip), %rax      # 0xe6e71
testb $0x1, %cl
cmovneq %rax, %rsi
callq 0x930c0
movq 0x258(%rsp), %rax
movq %rax, 0x58(%rsp)
movl 0x248(%rsp), %eax
movq %rax, 0x60(%rsp)
leaq 0x157(%rsp), %rdi
movq %rdi, 0x68(%rsp)
callq 0x98200
movq 0x60(%rsp), %rsi
movq 0x68(%rsp), %rcx
leaq 0x158(%rsp), %rdi
movl $0x20, %edx
callq 0x90d00
jmp 0xdf58e
movq 0x58(%rsp), %rdi
leaq 0x158(%rsp), %rsi
callq 0x925d0
jmp 0xdf5a2
leaq 0x158(%rsp), %rdi
callq 0x99830
leaq 0x157(%rsp), %rdi
callq 0x938a0
leaq 0x188(%rsp), %rdi
callq 0x92c00
movq %rax, %rdi
movq 0x258(%rsp), %rsi
movb 0x257(%rsp), %al
movl 0x250(%rsp), %ecx
movl 0x248(%rsp), %r8d
andb $0x1, %al
movzbl %al, %edx
callq 0x8d410
leaq 0x188(%rsp), %rdi
callq 0x92150
jmp 0xdf4b1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x200(%rsp)
movl %eax, 0x1fc(%rsp)
jmp 0xdf63d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x200(%rsp)
movl %eax, 0x1fc(%rsp)
leaq 0x158(%rsp), %rdi
callq 0x99830
leaq 0x157(%rsp), %rdi
callq 0x938a0
jmp 0xdfa07
testb $0x1, 0x257(%rsp)
je 0xdf684
movl 0x250(%rsp), %ecx
movl 0x248(%rsp), %eax
subl %ecx, %eax
movl %eax, 0x248(%rsp)
movq 0x258(%rsp), %rdi
leaq 0x763e(%rip), %rsi      # 0xe6cbd
callq 0x930c0
movq 0x258(%rsp), %rax
movq %rax, 0x40(%rsp)
movl 0x248(%rsp), %eax
movq %rax, 0x48(%rsp)
leaq 0x12f(%rsp), %rdi
movq %rdi, 0x50(%rsp)
callq 0x98200
movq 0x48(%rsp), %rsi
movq 0x50(%rsp), %rcx
leaq 0x130(%rsp), %rdi
movl $0x20, %edx
callq 0x90d00
jmp 0xdf6cd
movq 0x40(%rsp), %rdi
leaq 0x130(%rsp), %rsi
callq 0x925d0
movq %rax, 0x38(%rsp)
jmp 0xdf6e6
movq 0x38(%rsp), %rdi
leaq 0x70d3(%rip), %rsi      # 0xe67c5
callq 0x930c0
jmp 0xdf6f9
leaq 0x130(%rsp), %rdi
callq 0x99830
leaq 0x12f(%rsp), %rdi
callq 0x938a0
jmp 0xdf9ff
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x200(%rsp)
movl %eax, 0x1fc(%rsp)
jmp 0xdf74f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x200(%rsp)
movl %eax, 0x1fc(%rsp)
leaq 0x130(%rsp), %rdi
callq 0x99830
leaq 0x12f(%rsp), %rdi
callq 0x938a0
jmp 0xdfa07
movq 0xc8(%rsp), %rax
cmpq $0x0, 0x8(%rax)
je 0xdf772
jmp 0xdf791
leaq 0x56d8(%rip), %rdi      # 0xe4e51
leaq 0x4c07(%rip), %rsi      # 0xe4387
movl $0x15da, %edx           # imm = 0x15DA
leaq 0x75b5(%rip), %rcx      # 0xe6d41
callq 0x90c40
movq 0x258(%rsp), %rax
movq %rax, 0x28(%rsp)
leaq 0x107(%rsp), %rdi
movq %rdi, 0x30(%rsp)
callq 0x98200
movq 0x30(%rsp), %rdx
leaq 0x6e5c(%rip), %rsi      # 0xe6618
leaq 0x108(%rsp), %rdi
callq 0x95700
jmp 0xdf7cb
movq 0x28(%rsp), %rdi
leaq 0x108(%rsp), %rsi
callq 0x925d0
movq %rax, 0x20(%rsp)
jmp 0xdf7e4
movq 0xc8(%rsp), %rax
movq 0x8(%rax), %rsi
leaq 0xe0(%rsp), %rdi
movq %rdi, 0x10(%rsp)
callq 0x912d0
movq 0x20(%rsp), %rdi
movq 0x10(%rsp), %rsi
callq 0x925d0
movq %rax, 0x18(%rsp)
jmp 0xdf818
movq 0x18(%rsp), %rdi
leaq 0x6df4(%rip), %rsi      # 0xe6618
callq 0x930c0
jmp 0xdf82b
leaq 0xe0(%rsp), %rdi
callq 0x99830
leaq 0x108(%rsp), %rdi
callq 0x99830
leaq 0x107(%rsp), %rdi
callq 0x938a0
jmp 0xdf9ff
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x200(%rsp)
movl %eax, 0x1fc(%rsp)
jmp 0xdf8b1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x200(%rsp)
movl %eax, 0x1fc(%rsp)
jmp 0xdf8a4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x200(%rsp)
movl %eax, 0x1fc(%rsp)
leaq 0xe0(%rsp), %rdi
callq 0x99830
leaq 0x108(%rsp), %rdi
callq 0x99830
leaq 0x107(%rsp), %rdi
callq 0x938a0
jmp 0xdfa07
movq 0xc8(%rsp), %rax
movq 0x258(%rsp), %rdi
movb 0x8(%rax), %cl
leaq 0x6acb(%rip), %rsi      # 0xe63a8
leaq 0x759a(%rip), %rax      # 0xe6e7e
testb $0x1, %cl
cmovneq %rax, %rsi
callq 0x930c0
jmp 0xdf9ff
movq 0xc8(%rsp), %rax
movq 0x258(%rsp), %rdi
movq 0x8(%rax), %rsi
callq 0x98650
jmp 0xdf9ff
movq 0xc8(%rsp), %rax
vmovsd 0x8(%rax), %xmm0
movl $0x1, %edi
callq 0x93d60
vpxor %xmm1, %xmm1, %xmm1
vucomisd %xmm1, %xmm0
jne 0xdf973
jp 0xdf973
movq 0x258(%rsp), %rdi
movq 0x2650b(%rip), %rsi     # 0x105e50
callq 0x8eb90
movq %rax, 0x8(%rsp)
movl $0x1, %edi
callq 0x98f30
movq 0x8(%rsp), %rdi
movl %eax, 0xdc(%rsp)
movl 0xdc(%rsp), %esi
callq 0x96f90
jmp 0xdf9b9
movq 0x258(%rsp), %rdi
movq (%rdi), %rax
addq -0x18(%rax), %rdi
movl $0x104, %esi            # imm = 0x104
callq 0x94760
movq 0x258(%rsp), %rax
movq %rax, (%rsp)
movl $0xf, %edi
callq 0x98f30
movq (%rsp), %rdi
movl %eax, 0xd8(%rsp)
movl 0xd8(%rsp), %esi
callq 0x96f90
movq 0xc8(%rsp), %rax
movq 0x258(%rsp), %rdi
vmovsd 0x8(%rax), %xmm0
callq 0x98ef0
jmp 0xdf9ff
movq 0x258(%rsp), %rdi
leaq 0x749f(%rip), %rsi      # 0xe6e83
callq 0x930c0
jmp 0xdf9ff
movq 0x258(%rsp), %rdi
leaq 0x4efa(%rip), %rsi      # 0xe48f4
callq 0x930c0
addq $0x268, %rsp            # imm = 0x268
retq
movq 0x200(%rsp), %rdi
callq 0x981c0
nopw %cs:(%rax,%rax)
nop