// File: /workspace/github_cpp_makefile_star2_O2/theuni[P]libbtcnet/src/base32.cpp
// Function: EncodeBase32[abi:cxx11](unsigned char const*, unsigned long)
std::string EncodeBase32(const unsigned char* pch, size_t len)
{
    static const char* pbase32 = "abcdefghijklmnopqrstuvwxyz234567";

    std::string strRet = "";
    strRet.reserve((len + 4) / 5 * 8);

    int mode = 0, left = 0;
    const unsigned char* pchEnd = pch + len;

    while (pch < pchEnd) {
        int enc = *(pch++);
        switch (mode) {
        case 0: // we have no bits
            strRet += pbase32[enc >> 3];
            left = (enc & 7) << 2;
            mode = 1;
            break;

        case 1: // we have three bits
            strRet += pbase32[left | (enc >> 6)];
            strRet += pbase32[(enc >> 1) & 31];
            left = (enc & 1) << 4;
            mode = 2;
            break;

        case 2: // we have one bit
            strRet += pbase32[left | (enc >> 4)];
            left = (enc & 15) << 1;
            mode = 3;
            break;

        case 3: // we have four bits
            strRet += pbase32[left | (enc >> 7)];
            strRet += pbase32[(enc >> 2) & 31];
            left = (enc & 3) << 3;
            mode = 4;
            break;

        case 4: // we have two bits
            strRet += pbase32[left | (enc >> 5)];
            strRet += pbase32[enc & 31];
            mode = 0;
        }
    }

    static constexpr std::array<int, 5> nPadding{{0, 6, 4, 3, 1}};
    if (mode != 0) {
        strRet += pbase32[left];
        for (int n = 0; n < nPadding.at(mode); n++)
            strRet += '=';
    }

    return strRet;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rdx, %r14
movq %rsi, %r15
movq %rdi, %rbx
leaq 0xab3b(%rip), %rsi      # 0x118b2
leaq 0x7(%rsp), %rdx
callq 0x4150
leaq 0x4(%r14), %rax
xorl %ebp, %ebp
pushq $0x5
popq %rcx
xorl %edx, %edx
divq %rcx
leaq (,%rax,8), %rsi
movq %rbx, %rdi
callq 0x4590
addq %r15, %r14
xorl %r13d, %r13d
movl %ebp, %r12d
cmpq %r14, %r15
jae 0x6f05
incq %r15
cmpl $0x4, %ebp
ja 0x6da8
leaq 0x9520(%rip), %rcx      # 0x102e0
movslq (%rcx,%r12,4), %rax
addq %rcx, %rax
jmpq *%rax
movzbl -0x1(%r15), %r13d
movl %r13d, %eax
shrl $0x3, %eax
leaq 0x996d(%rip), %rcx      # 0x10748
movsbl (%rax,%rcx), %esi
movq %rbx, %rdi
callq 0x42f0
shll $0x2, %r13d
andl $0x1c, %r13d
pushq $0x1
popq %rax
movl %eax, %ebp
jmp 0x6da5
movzbl -0x1(%r15), %r12d
movl %r12d, %eax
shrl $0x5, %eax
orl %r13d, %eax
leaq 0x993d(%rip), %rcx      # 0x10748
movsbl (%rax,%rcx), %esi
movq %rbx, %rdi
callq 0x42f0
andl $0x1f, %r12d
leaq 0x9926(%rip), %rax      # 0x10748
movsbl (%r12,%rax), %esi
xorl %ebp, %ebp
movq %rbx, %rdi
callq 0x42f0
jmp 0x6da5
movzbl -0x1(%r15), %r12d
movl %r12d, %eax
shrl $0x4, %eax
orl %r13d, %eax
leaq 0x98fd(%rip), %rcx      # 0x10748
movsbl (%rax,%rcx), %esi
movq %rbx, %rdi
callq 0x42f0
addl %r12d, %r12d
andl $0x1e, %r12d
pushq $0x3
popq %rax
movl %eax, %ebp
movl %r12d, %r13d
jmp 0x6da5
movzbl -0x1(%r15), %r12d
movl %r12d, %eax
shrl $0x7, %eax
orl %r13d, %eax
leaq 0x98c8(%rip), %rcx      # 0x10748
movsbl (%rax,%rcx), %esi
movq %rbx, %rdi
callq 0x42f0
movl %r12d, %eax
shrl $0x2, %eax
andl $0x1f, %eax
leaq 0x98ac(%rip), %rcx      # 0x10748
movsbl (%rax,%rcx), %esi
movq %rbx, %rdi
callq 0x42f0
shll $0x3, %r12d
andl $0x18, %r12d
pushq $0x4
jmp 0x6efa
movzbl -0x1(%r15), %r12d
movl %r12d, %eax
shrl $0x6, %eax
orl %r13d, %eax
leaq 0x987f(%rip), %rcx      # 0x10748
movsbl (%rax,%rcx), %esi
movq %rbx, %rdi
callq 0x42f0
movl %r12d, %eax
shrl %eax
andl $0x1f, %eax
leaq 0x9864(%rip), %rcx      # 0x10748
movsbl (%rax,%rcx), %esi
movq %rbx, %rdi
callq 0x42f0
shll $0x4, %r12d
andl $0x10, %r12d
pushq $0x2
popq %rax
movl %eax, %ebp
movl %r12d, %r13d
jmp 0x6da5
testl %ebp, %ebp
je 0x6f4b
movl %r13d, %eax
leaq 0x9835(%rip), %rcx      # 0x10748
movsbl (%rax,%rcx), %esi
movq %rbx, %rdi
callq 0x42f0
xorl %r15d, %r15d
leaq 0x940b(%rip), %r14      # 0x10334
pushq $0x3d
popq %rbp
movq %r14, %rdi
movq %r12, %rsi
callq 0x7296
cmpl (%rax), %r15d
jge 0x6f4b
movq %rbx, %rdi
movl %ebp, %esi
callq 0x42f0
incl %r15d
jmp 0x6f2c
movq %rbx, %rax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
jmp 0x6f65
jmp 0x6f65
jmp 0x6f65
jmp 0x6f65
movq %rax, %r14
movq %rbx, %rdi
callq 0x41a0
movq %r14, %rdi
callq 0x4660