// File: /workspace/github_c_makefile_star2_O0/nilyang[P]redis-tdd-annotation/src/bitops.c
// Function: bitopCommand
void bitopCommand(redisClient *c) {
    char *opname = c->argv[1]->ptr;
    robj *o, *targetkey = c->argv[2];
    long op, j, numkeys;
    robj **objects;      /* Array of source objects. */
    unsigned char **src; /* Array of source strings pointers. */
    long *len, maxlen = 0; /* Array of length of src strings, and max len. */
    long minlen = 0;    /* Min len among the input keys. */
    unsigned char *res = NULL; /* Resulting string. */

    /* Parse the operation name. */
    // 读入 op 参数，确定要执行的操作
    if ((opname[0] == 'a' || opname[0] == 'A') && !strcasecmp(opname,"and"))
        op = BITOP_AND;
    else if((opname[0] == 'o' || opname[0] == 'O') && !strcasecmp(opname,"or"))
        op = BITOP_OR;
    else if((opname[0] == 'x' || opname[0] == 'X') && !strcasecmp(opname,"xor"))
        op = BITOP_XOR;
    else if((opname[0] == 'n' || opname[0] == 'N') && !strcasecmp(opname,"not"))
        op = BITOP_NOT;
    else {
        addReply(c,shared.syntaxerr);
        return;
    }

    /* Sanity check: NOT accepts only a single key argument. */
    // NOT 操作只能接受单个 key 输入
    if (op == BITOP_NOT && c->argc != 4) {
        addReplyError(c,"BITOP NOT must be called with a single source key.");
        return;
    }

    /* Lookup keys, and store pointers to the string objects into an array. */
    // 查找输入键，并将它们放入一个数组里面
    numkeys = c->argc - 3;
    // 字符串数组，保存 sds 值
    src = zmalloc(sizeof(unsigned char*) * numkeys);
    // 长度数组，保存 sds 的长度
    len = zmalloc(sizeof(long) * numkeys);
    // 对象数组，保存字符串对象
    objects = zmalloc(sizeof(robj*) * numkeys);
    for (j = 0; j < numkeys; j++) {

        // 查找对象
        o = lookupKeyRead(c->db,c->argv[j+3]);

        /* Handle non-existing keys as empty strings. */
        // 不存在的键被视为空字符串
        if (o == NULL) {
            objects[j] = NULL;
            src[j] = NULL;
            len[j] = 0;
            minlen = 0;
            continue;
        }

        /* Return an error if one of the keys is not a string. */
        // 键不是字符串类型，返回错误，放弃执行操作
        if (checkType(c,o,REDIS_STRING)) {
            for (j = j-1; j >= 0; j--) {
                if (objects[j])
                    decrRefCount(objects[j]);
            }
            zfree(src);
            zfree(len);
            zfree(objects);
            return;
        }

        // 记录对象
        objects[j] = getDecodedObject(o);
        // 记录 sds
        src[j] = objects[j]->ptr;
        // 记录 sds 长度
        len[j] = sdslen(objects[j]->ptr);
        
        // 记录目前最长 sds 的长度
        if (len[j] > maxlen) maxlen = len[j];

        // 记录目前最短 sds 的长度
        if (j == 0 || len[j] < minlen) minlen = len[j];
    }

    /* Compute the bit operation, if at least one string is not empty. */
    // 如果有至少一个非空字符串，那么执行计算
    if (maxlen) {

        // 根据最大长度，创建一个 sds ，该 sds 的所有位都被设置为 0
        res = (unsigned char*) sdsnewlen(NULL,maxlen);

        unsigned char output, byte;
        long i;

        /* Fast path: as far as we have data for all the input bitmaps we
         * can take a fast path that performs much better than the
         * vanilla algorithm. */
        // 在键的数量比较少时，进行优化
        j = 0;
        if (minlen && numkeys <= 16) {
            unsigned long *lp[16];
            unsigned long *lres = (unsigned long*) res;

            /* Note: sds pointer is always aligned to 8 byte boundary. */
            memcpy(lp,src,sizeof(unsigned long*)*numkeys);
            memcpy(res,src[0],minlen);

            /* Different branches per different operations for speed (sorry). */
            // 当要处理的位大于等于 32 位时
            // 每次载入 4*8 = 32 个位，然后对这些位进行计算，利用缓存，进行加速
            if (op == BITOP_AND) {
                while(minlen >= sizeof(unsigned long)*4) {
                    for (i = 1; i < numkeys; i++) {
                        lres[0] &= lp[i][0];
                        lres[1] &= lp[i][1];
                        lres[2] &= lp[i][2];
                        lres[3] &= lp[i][3];
                        lp[i]+=4;
                    }
                    lres+=4;
                    j += sizeof(unsigned long)*4;
                    minlen -= sizeof(unsigned long)*4;
                }
            } else if (op == BITOP_OR) {
                while(minlen >= sizeof(unsigned long)*4) {
                    for (i = 1; i < numkeys; i++) {
                        lres[0] |= lp[i][0];
                        lres[1] |= lp[i][1];
                        lres[2] |= lp[i][2];
                        lres[3] |= lp[i][3];
                        lp[i]+=4;
                    }
                    lres+=4;
                    j += sizeof(unsigned long)*4;
                    minlen -= sizeof(unsigned long)*4;
                }
            } else if (op == BITOP_XOR) {
                while(minlen >= sizeof(unsigned long)*4) {
                    for (i = 1; i < numkeys; i++) {
                        lres[0] ^= lp[i][0];
                        lres[1] ^= lp[i][1];
                        lres[2] ^= lp[i][2];
                        lres[3] ^= lp[i][3];
                        lp[i]+=4;
                    }
                    lres+=4;
                    j += sizeof(unsigned long)*4;
                    minlen -= sizeof(unsigned long)*4;
                }
            } else if (op == BITOP_NOT) {
                while(minlen >= sizeof(unsigned long)*4) {
                    lres[0] = ~lres[0];
                    lres[1] = ~lres[1];
                    lres[2] = ~lres[2];
                    lres[3] = ~lres[3];
                    lres+=4;
                    j += sizeof(unsigned long)*4;
                    minlen -= sizeof(unsigned long)*4;
                }
            }
        }

        /* j is set to the next byte to process by the previous loop. */
        // 以正常方式执行位运算
        for (; j < maxlen; j++) {
            output = (len[0] <= j) ? 0 : src[0][j];
            if (op == BITOP_NOT) output = ~output;
            // 遍历所有输入键，对所有输入的 scr[i][j] 字节进行运算
            for (i = 1; i < numkeys; i++) {
                // 如果数组的长度不足，那么相应的字节被假设为 0
                byte = (len[i] <= j) ? 0 : src[i][j];
                switch(op) {
                case BITOP_AND: output &= byte; break;
                case BITOP_OR:  output |= byte; break;
                case BITOP_XOR: output ^= byte; break;
                }
            }
            // 保存输出
            res[j] = output;
        }
    }

    // 释放资源
    for (j = 0; j < numkeys; j++) {
        if (objects[j])
            decrRefCount(objects[j]);
    }
    zfree(src);
    zfree(len);
    zfree(objects);

    /* Store the computed value into the target key */
    if (maxlen) {
        // 保存结果到指定键
        o = createObject(REDIS_STRING,res);
        setKey(c->db,targetkey,o);
        notifyKeyspaceEvent(REDIS_NOTIFY_STRING,"set",targetkey,c->db->id);
        decrRefCount(o);
    } else if (dbDelete(c->db,targetkey)) {
        // 输入为空，没有产生结果，仅仅删除指定键
        signalModifiedKey(c->db,targetkey);
        notifyKeyspaceEvent(REDIS_NOTIFY_GENERIC,"del",targetkey,c->db->id);
    }
    server.dirty++;
    addReplyLongLong(c,maxlen); /* Return the output string length in bytes. */
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x120, %rsp            # imm = 0x120
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq 0x38(%rax), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x10(%rbp)
movq -0x8(%rbp), %rax
movq 0x38(%rax), %rax
movq 0x10(%rax), %rax
movq %rax, -0x20(%rbp)
movq $0x0, -0x58(%rbp)
movq $0x0, -0x60(%rbp)
movq $0x0, -0x68(%rbp)
movq -0x10(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x61, %eax
je 0x77a33
movq -0x10(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x41, %eax
jne 0x77a55
movq -0x10(%rbp), %rdi
leaq 0x6782d(%rip), %rsi     # 0xdf26b
callq 0x1f2f0
cmpl $0x0, %eax
jne 0x77a55
movq $0x0, -0x28(%rbp)
jmp 0x77b1f
movq -0x10(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x6f, %eax
je 0x77a6d
movq -0x10(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x4f, %eax
jne 0x77a8f
movq -0x10(%rbp), %rdi
leaq 0x75615(%rip), %rsi     # 0xed08d
callq 0x1f2f0
cmpl $0x0, %eax
jne 0x77a8f
movq $0x1, -0x28(%rbp)
jmp 0x77b1d
movq -0x10(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x78, %eax
je 0x77aa7
movq -0x10(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x58, %eax
jne 0x77ac6
movq -0x10(%rbp), %rdi
leaq 0x7127d(%rip), %rsi     # 0xe8d2f
callq 0x1f2f0
cmpl $0x0, %eax
jne 0x77ac6
movq $0x2, -0x28(%rbp)
jmp 0x77b1b
movq -0x10(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x6e, %eax
je 0x77ade
movq -0x10(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x4e, %eax
jne 0x77afd
movq -0x10(%rbp), %rdi
leaq 0x7124a(%rip), %rsi     # 0xe8d33
callq 0x1f2f0
cmpl $0x0, %eax
jne 0x77afd
movq $0x3, -0x28(%rbp)
jmp 0x77b19
movq -0x8(%rbp), %rdi
leaq 0x9c648(%rip), %rax     # 0x114150
movq 0x80(%rax), %rsi
callq 0x35a70
jmp 0x783c8
jmp 0x77b1b
jmp 0x77b1d
jmp 0x77b1f
cmpq $0x3, -0x28(%rbp)
jne 0x77b45
movq -0x8(%rbp), %rax
cmpl $0x4, 0x30(%rax)
je 0x77b45
movq -0x8(%rbp), %rdi
leaq 0x711fc(%rip), %rsi     # 0xe8d37
callq 0x35d40
jmp 0x783c8
movq -0x8(%rbp), %rax
movl 0x30(%rax), %eax
subl $0x3, %eax
cltq
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rdi
shlq $0x3, %rdi
callq 0x2e130
movq %rax, -0x48(%rbp)
movq -0x38(%rbp), %rdi
shlq $0x3, %rdi
callq 0x2e130
movq %rax, -0x50(%rbp)
movq -0x38(%rbp), %rdi
shlq $0x3, %rdi
callq 0x2e130
movq %rax, -0x40(%rbp)
movq $0x0, -0x30(%rbp)
movq -0x30(%rbp), %rax
cmpq -0x38(%rbp), %rax
jge 0x77d31
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
movq -0x8(%rbp), %rax
movq 0x38(%rax), %rax
movq -0x30(%rbp), %rcx
movq 0x18(%rax,%rcx,8), %rsi
callq 0x3bed0
movq %rax, -0x18(%rbp)
cmpq $0x0, -0x18(%rbp)
jne 0x77c04
movq -0x40(%rbp), %rax
movq -0x30(%rbp), %rcx
movq $0x0, (%rax,%rcx,8)
movq -0x48(%rbp), %rax
movq -0x30(%rbp), %rcx
movq $0x0, (%rax,%rcx,8)
movq -0x50(%rbp), %rax
movq -0x30(%rbp), %rcx
movq $0x0, (%rax,%rcx,8)
movq $0x0, -0x60(%rbp)
jmp 0x77d20
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rsi
xorl %edx, %edx
callq 0x3abb0
cmpl $0x0, %eax
je 0x77c7b
movq -0x30(%rbp), %rax
subq $0x1, %rax
movq %rax, -0x30(%rbp)
cmpq $0x0, -0x30(%rbp)
jl 0x77c5b
movq -0x40(%rbp), %rax
movq -0x30(%rbp), %rcx
cmpq $0x0, (%rax,%rcx,8)
je 0x77c4b
movq -0x40(%rbp), %rax
movq -0x30(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
callq 0x3aaa0
jmp 0x77c4d
movq -0x30(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x30(%rbp)
jmp 0x77c24
movq -0x48(%rbp), %rdi
callq 0x2e3a0
movq -0x50(%rbp), %rdi
callq 0x2e3a0
movq -0x40(%rbp), %rdi
callq 0x2e3a0
jmp 0x783c8
movq -0x18(%rbp), %rdi
callq 0x3aef0
movq %rax, %rdx
movq -0x40(%rbp), %rax
movq -0x30(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movq -0x40(%rbp), %rax
movq -0x30(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq 0x8(%rax), %rdx
movq -0x48(%rbp), %rax
movq -0x30(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movq -0x40(%rbp), %rax
movq -0x30(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq 0x8(%rax), %rdi
callq 0x770a0
movq %rax, %rdx
movq -0x50(%rbp), %rax
movq -0x30(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movq -0x50(%rbp), %rax
movq -0x30(%rbp), %rcx
movq (%rax,%rcx,8), %rax
cmpq -0x58(%rbp), %rax
jle 0x77cf5
movq -0x50(%rbp), %rax
movq -0x30(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq %rax, -0x58(%rbp)
cmpq $0x0, -0x30(%rbp)
je 0x77d0e
movq -0x50(%rbp), %rax
movq -0x30(%rbp), %rcx
movq (%rax,%rcx,8), %rax
cmpq -0x60(%rbp), %rax
jge 0x77d1e
movq -0x50(%rbp), %rax
movq -0x30(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq %rax, -0x60(%rbp)
jmp 0x77d20
movq -0x30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x30(%rbp)
jmp 0x77b90
cmpq $0x0, -0x58(%rbp)
je 0x7829f
movq -0x58(%rbp), %rsi
xorl %eax, %eax
movl %eax, %edi
callq 0x2c000
movq %rax, -0x68(%rbp)
movq $0x0, -0x30(%rbp)
cmpq $0x0, -0x60(%rbp)
je 0x78165
cmpq $0x10, -0x38(%rbp)
jg 0x78165
movq -0x68(%rbp), %rax
movq %rax, -0x108(%rbp)
leaq -0x100(%rbp), %rdi
movq -0x48(%rbp), %rsi
movq -0x38(%rbp), %rdx
shlq $0x3, %rdx
callq 0x1fbf0
movq -0x68(%rbp), %rdi
movq -0x48(%rbp), %rax
movq (%rax), %rsi
movq -0x60(%rbp), %rdx
callq 0x1fbf0
cmpq $0x0, -0x28(%rbp)
jne 0x77ea6
jmp 0x77daf
cmpq $0x20, -0x60(%rbp)
jb 0x77ea1
movq $0x1, -0x78(%rbp)
movq -0x78(%rbp), %rax
cmpq -0x38(%rbp), %rax
jge 0x77e72
movq -0x78(%rbp), %rax
movq -0x100(%rbp,%rax,8), %rax
movq (%rax), %rcx
movq -0x108(%rbp), %rax
andq (%rax), %rcx
movq %rcx, (%rax)
movq -0x78(%rbp), %rax
movq -0x100(%rbp,%rax,8), %rax
movq 0x8(%rax), %rcx
movq -0x108(%rbp), %rax
andq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x78(%rbp), %rax
movq -0x100(%rbp,%rax,8), %rax
movq 0x10(%rax), %rcx
movq -0x108(%rbp), %rax
andq 0x10(%rax), %rcx
movq %rcx, 0x10(%rax)
movq -0x78(%rbp), %rax
movq -0x100(%rbp,%rax,8), %rax
movq 0x18(%rax), %rcx
movq -0x108(%rbp), %rax
andq 0x18(%rax), %rcx
movq %rcx, 0x18(%rax)
movq -0x78(%rbp), %rax
movq -0x100(%rbp,%rax,8), %rcx
addq $0x20, %rcx
movq %rcx, -0x100(%rbp,%rax,8)
movq -0x78(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x78(%rbp)
jmp 0x77dc2
movq -0x108(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x108(%rbp)
movq -0x30(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x30(%rbp)
movq -0x60(%rbp), %rax
subq $0x20, %rax
movq %rax, -0x60(%rbp)
jmp 0x77daf
jmp 0x78163
cmpq $0x1, -0x28(%rbp)
jne 0x77faa
jmp 0x77eb3
cmpq $0x20, -0x60(%rbp)
jb 0x77fa5
movq $0x1, -0x78(%rbp)
movq -0x78(%rbp), %rax
cmpq -0x38(%rbp), %rax
jge 0x77f76
movq -0x78(%rbp), %rax
movq -0x100(%rbp,%rax,8), %rax
movq (%rax), %rcx
movq -0x108(%rbp), %rax
orq (%rax), %rcx
movq %rcx, (%rax)
movq -0x78(%rbp), %rax
movq -0x100(%rbp,%rax,8), %rax
movq 0x8(%rax), %rcx
movq -0x108(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x78(%rbp), %rax
movq -0x100(%rbp,%rax,8), %rax
movq 0x10(%rax), %rcx
movq -0x108(%rbp), %rax
orq 0x10(%rax), %rcx
movq %rcx, 0x10(%rax)
movq -0x78(%rbp), %rax
movq -0x100(%rbp,%rax,8), %rax
movq 0x18(%rax), %rcx
movq -0x108(%rbp), %rax
orq 0x18(%rax), %rcx
movq %rcx, 0x18(%rax)
movq -0x78(%rbp), %rax
movq -0x100(%rbp,%rax,8), %rcx
addq $0x20, %rcx
movq %rcx, -0x100(%rbp,%rax,8)
movq -0x78(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x78(%rbp)
jmp 0x77ec6
movq -0x108(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x108(%rbp)
movq -0x30(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x30(%rbp)
movq -0x60(%rbp), %rax
subq $0x20, %rax
movq %rax, -0x60(%rbp)
jmp 0x77eb3
jmp 0x78161
cmpq $0x2, -0x28(%rbp)
jne 0x780ae
jmp 0x77fb7
cmpq $0x20, -0x60(%rbp)
jb 0x780a9
movq $0x1, -0x78(%rbp)
movq -0x78(%rbp), %rax
cmpq -0x38(%rbp), %rax
jge 0x7807a
movq -0x78(%rbp), %rax
movq -0x100(%rbp,%rax,8), %rax
movq (%rax), %rcx
movq -0x108(%rbp), %rax
xorq (%rax), %rcx
movq %rcx, (%rax)
movq -0x78(%rbp), %rax
movq -0x100(%rbp,%rax,8), %rax
movq 0x8(%rax), %rcx
movq -0x108(%rbp), %rax
xorq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x78(%rbp), %rax
movq -0x100(%rbp,%rax,8), %rax
movq 0x10(%rax), %rcx
movq -0x108(%rbp), %rax
xorq 0x10(%rax), %rcx
movq %rcx, 0x10(%rax)
movq -0x78(%rbp), %rax
movq -0x100(%rbp,%rax,8), %rax
movq 0x18(%rax), %rcx
movq -0x108(%rbp), %rax
xorq 0x18(%rax), %rcx
movq %rcx, 0x18(%rax)
movq -0x78(%rbp), %rax
movq -0x100(%rbp,%rax,8), %rcx
addq $0x20, %rcx
movq %rcx, -0x100(%rbp,%rax,8)
movq -0x78(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x78(%rbp)
jmp 0x77fca
movq -0x108(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x108(%rbp)
movq -0x30(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x30(%rbp)
movq -0x60(%rbp), %rax
subq $0x20, %rax
movq %rax, -0x60(%rbp)
jmp 0x77fb7
jmp 0x7815f
cmpq $0x3, -0x28(%rbp)
jne 0x7815d
jmp 0x780bb
cmpq $0x20, -0x60(%rbp)
jb 0x7815b
movq -0x108(%rbp), %rax
movq (%rax), %rcx
xorq $-0x1, %rcx
movq -0x108(%rbp), %rax
movq %rcx, (%rax)
movq -0x108(%rbp), %rax
movq 0x8(%rax), %rcx
xorq $-0x1, %rcx
movq -0x108(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x108(%rbp), %rax
movq 0x10(%rax), %rcx
xorq $-0x1, %rcx
movq -0x108(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x108(%rbp), %rax
movq 0x18(%rax), %rcx
xorq $-0x1, %rcx
movq -0x108(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x108(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x108(%rbp)
movq -0x30(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x30(%rbp)
movq -0x60(%rbp), %rax
subq $0x20, %rax
movq %rax, -0x60(%rbp)
jmp 0x780bb
jmp 0x7815d
jmp 0x7815f
jmp 0x78161
jmp 0x78163
jmp 0x78165
jmp 0x78167
movq -0x30(%rbp), %rax
cmpq -0x58(%rbp), %rax
jge 0x7829d
movq -0x50(%rbp), %rax
movq (%rax), %rax
cmpq -0x30(%rbp), %rax
jg 0x7818c
xorl %eax, %eax
movl %eax, -0x10c(%rbp)
jmp 0x781a1
movq -0x48(%rbp), %rax
movq (%rax), %rax
movq -0x30(%rbp), %rcx
movzbl (%rax,%rcx), %eax
movl %eax, -0x10c(%rbp)
movl -0x10c(%rbp), %eax
movb %al, -0x69(%rbp)
cmpq $0x3, -0x28(%rbp)
jne 0x781bb
movzbl -0x69(%rbp), %eax
xorl $-0x1, %eax
movb %al, -0x69(%rbp)
movq $0x1, -0x78(%rbp)
movq -0x78(%rbp), %rax
cmpq -0x38(%rbp), %rax
jge 0x7827e
movq -0x50(%rbp), %rax
movq -0x78(%rbp), %rcx
movq (%rax,%rcx,8), %rax
cmpq -0x30(%rbp), %rax
jg 0x781ed
xorl %eax, %eax
movl %eax, -0x110(%rbp)
jmp 0x78207
movq -0x48(%rbp), %rax
movq -0x78(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq -0x30(%rbp), %rcx
movzbl (%rax,%rcx), %eax
movl %eax, -0x110(%rbp)
movl -0x110(%rbp), %eax
movb %al, -0x6a(%rbp)
movq -0x28(%rbp), %rax
movq %rax, -0x118(%rbp)
testq %rax, %rax
je 0x78240
jmp 0x78222
movq -0x118(%rbp), %rax
subq $0x1, %rax
je 0x7824f
jmp 0x78231
movq -0x118(%rbp), %rax
subq $0x2, %rax
je 0x7825e
jmp 0x7826b
movzbl -0x6a(%rbp), %ecx
movzbl -0x69(%rbp), %eax
andl %ecx, %eax
movb %al, -0x69(%rbp)
jmp 0x7826b
movzbl -0x6a(%rbp), %ecx
movzbl -0x69(%rbp), %eax
orl %ecx, %eax
movb %al, -0x69(%rbp)
jmp 0x7826b
movzbl -0x6a(%rbp), %ecx
movzbl -0x69(%rbp), %eax
xorl %ecx, %eax
movb %al, -0x69(%rbp)
jmp 0x7826d
movq -0x78(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x78(%rbp)
jmp 0x781c3
movb -0x69(%rbp), %dl
movq -0x68(%rbp), %rax
movq -0x30(%rbp), %rcx
movb %dl, (%rax,%rcx)
movq -0x30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x30(%rbp)
jmp 0x78167
jmp 0x7829f
movq $0x0, -0x30(%rbp)
movq -0x30(%rbp), %rax
cmpq -0x38(%rbp), %rax
jge 0x782e1
movq -0x40(%rbp), %rax
movq -0x30(%rbp), %rcx
cmpq $0x0, (%rax,%rcx,8)
je 0x782d1
movq -0x40(%rbp), %rax
movq -0x30(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
callq 0x3aaa0
jmp 0x782d3
movq -0x30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x30(%rbp)
jmp 0x782a7
movq -0x48(%rbp), %rdi
callq 0x2e3a0
movq -0x50(%rbp), %rdi
callq 0x2e3a0
movq -0x40(%rbp), %rdi
callq 0x2e3a0
cmpq $0x0, -0x58(%rbp)
je 0x78352
movq -0x68(%rbp), %rsi
xorl %edi, %edi
callq 0x3a0d0
movq %rax, -0x18(%rbp)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
movq -0x20(%rbp), %rsi
movq -0x18(%rbp), %rdx
callq 0x3c2d0
movq -0x20(%rbp), %rdx
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movl 0x30(%rax), %ecx
movl $0x8, %edi
leaq 0x67214(%rip), %rsi     # 0xdf556
callq 0x814a0
movq -0x18(%rbp), %rdi
callq 0x3aaa0
jmp 0x7839b
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
movq -0x20(%rbp), %rsi
callq 0x3c4f0
cmpl $0x0, %eax
je 0x78399
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
movq -0x20(%rbp), %rsi
callq 0x3c3d0
movq -0x20(%rbp), %rdx
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movl 0x30(%rax), %ecx
movl $0x4, %edi
leaq 0x66171(%rip), %rsi     # 0xde505
callq 0x814a0
jmp 0x7839b
leaq 0x9b556(%rip), %rax     # 0x1138f8
movq 0x560(%rax), %rcx
addq $0x1, %rcx
leaq 0x9b544(%rip), %rax     # 0x1138f8
movq %rcx, 0x560(%rax)
movq -0x8(%rbp), %rdi
movq -0x58(%rbp), %rsi
callq 0x36480
addq $0x120, %rsp            # imm = 0x120
popq %rbp
retq
nopw %cs:(%rax,%rax)