// File: mapbox[P]svg-tools/include/mapbox/svg/path_parser.hpp
// Function: mapbox::svg::PathParser<mapbox::svg::test::PathVertexReceiver>::operator()(char const*)
bool operator()(const char* str) {
        begin = str;
        cursor = str;
        error = PathParseErrorType::None;
        next = nullptr;

        char command;
        double x, y, x1, y1, x2, y2, xAxisRotation;
        bool relative, largeArcFlag, sweepFlag;

        skipWhitespace();
        while (*cursor) {
            command = *cursor++;
            relative = command >= 'a';
            skipWhitespace();

            if (command == 'Z' || command == 'z') { // closepath
                skipWhitespace();
                t.closePath();
                continue;
            }

            do {
                switch (command) {
                    case '\0':
                        break;
                    case 'M': case 'm': // moveto
                        if (!parseNumber(x)) return false;
                        if (!parseNumber(y)) return false;
                        t.moveTo(x, y, relative);
                        break;
                    case 'L': case 'l': // lineto
                        if (!parseNumber(x)) return false;
                        if (!parseNumber(y)) return false;
                        t.lineTo(x, y, relative);
                        break;
                    case 'H': case 'h': // horizontal lineto
                        if (!parseNumber(x)) return false;
                        t.horizontalLineTo(x, relative);
                        break;
                    case 'V': case 'v': // vertical lineto
                        if (!parseNumber(y)) return false;
                        t.verticalLineTo(y, relative);
                        break;
                    case 'C': case 'c': // curveto
                        if (!parseNumber(x1)) return false;
                        if (!parseNumber(y1)) return false;
                        if (!parseNumber(x2)) return false;
                        if (!parseNumber(y2)) return false;
                        if (!parseNumber(x)) return false;
                        if (!parseNumber(y)) return false;
                        t.curveTo(x1, y1, x2, y2, x, y, relative);
                        break;
                    case 'S': case 's': // smooth curveto
                        if (!parseNumber(x2)) return false;
                        if (!parseNumber(y2)) return false;
                        if (!parseNumber(x)) return false;
                        if (!parseNumber(y)) return false;
                        t.smoothCurveTo(x2, y2, x, y, relative);
                        break;
                    case 'Q': case 'q': // quadratic bezier curveto
                        if (!parseNumber(x1)) return false;
                        if (!parseNumber(y1)) return false;
                        if (!parseNumber(x)) return false;
                        if (!parseNumber(y)) return false;
                        t.quadraticCurveTo(x1, y1, x, y, relative);
                        break;
                    case 'T': case 't': // smooth quadratic bezier curveto
                        if (!parseNumber(x)) return false;
                        if (!parseNumber(y)) return false;
                        t.smoothQuadraticCurveTo(x, y, relative);
                        break;
                    case 'A': case 'a': // elliptical arc
                        if (!parseNumber(x1)) return false;
                        if (!parseNumber(y1)) return false;
                        if (!parseNumber(xAxisRotation)) return false;
                        if (!parseFlag(largeArcFlag)) return false;
                        if (!parseFlag(sweepFlag)) return false;
                        if (!parseNumber(x)) return false;
                        if (!parseNumber(y)) return false;
                        t.arc(x1, y1, xAxisRotation, largeArcFlag, sweepFlag, x, y, relative);
                        break;
                    default:
                        error = PathParseErrorType::CommandParsing;
                        return false;

                }
                // parse another instance of this command if there are more numbers
            } while ((*cursor >= '0' && *cursor <= '9') || *cursor == '.' || *cursor == '-');
        }
        return true;
    }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x80, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x10(%rbp), %rdi
movq %rdi, -0x68(%rbp)
movq -0x18(%rbp), %rax
movq %rax, 0x8(%rdi)
movq -0x18(%rbp), %rax
movq %rax, 0x10(%rdi)
movl $0x0, 0x20(%rdi)
movq $0x0, 0x18(%rdi)
callq 0x3c00
movq -0x68(%rbp), %rax
movq 0x10(%rax), %rax
cmpb $0x0, (%rax)
je 0x33ed
movq -0x68(%rbp), %rdi
movq 0x10(%rdi), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, 0x10(%rdi)
movb (%rax), %al
movb %al, -0x19(%rbp)
movsbl -0x19(%rbp), %eax
cmpl $0x61, %eax
setge %al
andb $0x1, %al
movb %al, -0x59(%rbp)
callq 0x3c00
movsbl -0x19(%rbp), %eax
cmpl $0x5a, %eax
je 0x2ece
movsbl -0x19(%rbp), %eax
cmpl $0x7a, %eax
jne 0x2ee5
movq -0x68(%rbp), %rdi
callq 0x3c00
movq -0x68(%rbp), %rax
movq (%rax), %rdi
callq 0x3c80
jmp 0x2e7f
jmp 0x2ee7
movsbl -0x19(%rbp), %eax
movl %eax, %ecx
movq %rcx, -0x70(%rbp)
subl $0x76, %eax
ja 0x337c
movq -0x70(%rbp), %rax
leaq 0x3163(%rip), %rcx      # 0x6068
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
jmp 0x338d
movq -0x68(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x2f2d
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rdi
leaq -0x30(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x2f47
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rax
movq (%rax), %rdi
movsd -0x28(%rbp), %xmm0
movsd -0x30(%rbp), %xmm1
movb -0x59(%rbp), %al
andb $0x1, %al
movzbl %al, %esi
callq 0x3d50
jmp 0x338d
movq -0x68(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x2f84
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rdi
leaq -0x30(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x2f9e
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rax
movq (%rax), %rdi
movsd -0x28(%rbp), %xmm0
movsd -0x30(%rbp), %xmm1
movb -0x59(%rbp), %al
andb $0x1, %al
movzbl %al, %esi
callq 0x3db0
jmp 0x338d
movq -0x68(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x2fdb
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rax
movq (%rax), %rdi
movsd -0x28(%rbp), %xmm0
movb -0x59(%rbp), %al
andb $0x1, %al
movzbl %al, %esi
callq 0x3e10
jmp 0x338d
movq -0x68(%rbp), %rdi
leaq -0x30(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x3013
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rax
movq (%rax), %rdi
movsd -0x30(%rbp), %xmm0
movb -0x59(%rbp), %al
andb $0x1, %al
movzbl %al, %esi
callq 0x3e60
jmp 0x338d
movq -0x68(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x304b
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rdi
leaq -0x40(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x3065
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rdi
leaq -0x48(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x307f
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x3099
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x30b3
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rdi
leaq -0x30(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x30cd
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rax
movq (%rax), %rdi
movsd -0x38(%rbp), %xmm0
movsd -0x40(%rbp), %xmm1
movsd -0x48(%rbp), %xmm2
movsd -0x50(%rbp), %xmm3
movsd -0x28(%rbp), %xmm4
movsd -0x30(%rbp), %xmm5
movb -0x59(%rbp), %al
andb $0x1, %al
movzbl %al, %esi
callq 0x3eb0
jmp 0x338d
movq -0x68(%rbp), %rdi
leaq -0x48(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x311e
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x3138
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x3152
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rdi
leaq -0x30(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x316c
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rax
movq (%rax), %rdi
movsd -0x48(%rbp), %xmm0
movsd -0x50(%rbp), %xmm1
movsd -0x28(%rbp), %xmm2
movsd -0x30(%rbp), %xmm3
movb -0x59(%rbp), %al
andb $0x1, %al
movzbl %al, %esi
callq 0x3f40
jmp 0x338d
movq -0x68(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x31b3
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rdi
leaq -0x40(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x31cd
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x31e7
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rdi
leaq -0x30(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x3201
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rax
movq (%rax), %rdi
movsd -0x38(%rbp), %xmm0
movsd -0x40(%rbp), %xmm1
movsd -0x28(%rbp), %xmm2
movsd -0x30(%rbp), %xmm3
movb -0x59(%rbp), %al
andb $0x1, %al
movzbl %al, %esi
callq 0x3fb0
jmp 0x338d
movq -0x68(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x3248
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rdi
leaq -0x30(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x3262
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rax
movq (%rax), %rdi
movsd -0x28(%rbp), %xmm0
movsd -0x30(%rbp), %xmm1
movb -0x59(%rbp), %al
andb $0x1, %al
movzbl %al, %esi
callq 0x4020
jmp 0x338d
movq -0x68(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x329f
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rdi
leaq -0x40(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x32b9
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rdi
leaq -0x58(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x32d3
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rdi
leaq -0x5a(%rbp), %rsi
callq 0x4080
testb $0x1, %al
jne 0x32ed
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rdi
leaq -0x5b(%rbp), %rsi
callq 0x4080
testb $0x1, %al
jne 0x3307
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x3321
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rdi
leaq -0x30(%rbp), %rsi
callq 0x3cb0
testb $0x1, %al
jne 0x333b
movb $0x0, -0x1(%rbp)
jmp 0x33f1
movq -0x68(%rbp), %rax
movq (%rax), %rdi
movsd -0x38(%rbp), %xmm0
movsd -0x40(%rbp), %xmm1
movsd -0x58(%rbp), %xmm2
movb -0x5a(%rbp), %dl
movb -0x5b(%rbp), %cl
movsd -0x28(%rbp), %xmm3
movsd -0x30(%rbp), %xmm4
movb -0x59(%rbp), %al
andb $0x1, %dl
andb $0x1, %cl
andb $0x1, %al
movzbl %dl, %esi
movzbl %cl, %edx
movzbl %al, %ecx
callq 0x4100
jmp 0x338d
movq -0x68(%rbp), %rax
movl $0x3, 0x20(%rax)
movb $0x0, -0x1(%rbp)
jmp 0x33f1
jmp 0x338f
movq -0x68(%rbp), %rax
movq 0x10(%rax), %rax
movsbl (%rax), %eax
cmpl $0x30, %eax
jl 0x33b4
movq -0x68(%rbp), %rax
movq 0x10(%rax), %rax
movsbl (%rax), %ecx
movb $0x1, %al
cmpl $0x39, %ecx
movb %al, -0x71(%rbp)
jle 0x33dd
movq -0x68(%rbp), %rax
movq 0x10(%rax), %rax
movsbl (%rax), %ecx
movb $0x1, %al
cmpl $0x2e, %ecx
movb %al, -0x71(%rbp)
je 0x33dd
movq -0x68(%rbp), %rax
movq 0x10(%rax), %rax
movsbl (%rax), %eax
cmpl $0x2d, %eax
sete %al
movb %al, -0x71(%rbp)
movb -0x71(%rbp), %al
testb $0x1, %al
jne 0x2ee7
jmp 0x2e7f
movb $0x1, -0x1(%rbp)
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x80, %rsp
popq %rbp
retq
nop