// File: karel-brinda[P]ococo/ext/htslib/cram/cram_encode.c
// Function: cram_encode_slice
static int cram_encode_slice(cram_fd *fd, cram_container *c,
			     cram_block_compression_hdr *h, cram_slice *s) {
    int rec, r = 0, last_pos;
    int embed_ref;
    enum cram_DS_ID id;

    embed_ref = fd->embed_ref && s->hdr->ref_seq_id != -1 ? 1 : 0;

    /*
     * Slice external blocks:
     * ID 0 => base calls (insertions, soft-clip)
     * ID 1 => qualities
     * ID 2 => names
     * ID 3 => TS (insert size), NP (next frag)
     * ID 4 => tag values
     * ID 6 => tag IDs (TN), if CRAM_V1.0
     * ID 7 => TD tag dictionary, if !CRAM_V1.0
     */

    /* Create cram slice header */
    s->hdr->ref_base_id = embed_ref ? DS_ref : -1;
    s->hdr->record_counter = c->num_records + c->record_counter;
    c->num_records += s->hdr->num_records;

    s->block = calloc(DS_END, sizeof(s->block[0]));
    s->hdr->block_content_ids = malloc(DS_END * sizeof(int32_t));
    if (!s->block || !s->hdr->block_content_ids)
	return -1;

    // Create first fixed blocks, always external.
    // CORE
    if (!(s->block[0] = cram_new_block(CORE, 0)))
	return -1;

    // TN block for CRAM v1
    if (CRAM_MAJOR_VERS(fd->version) == 1) {
	if (h->codecs[DS_TN]->codec == E_EXTERNAL) {
	    if (!(s->block[DS_TN] = cram_new_block(EXTERNAL,DS_TN))) return -1;
	    h->codecs[DS_TN]->external.content_id = DS_TN;
	} else {
	    s->block[DS_TN] = s->block[0];
	}
	s->block[DS_TN] = s->block[DS_TN];
    }

    // Embedded reference
    if (embed_ref) {
	if (!(s->block[DS_ref] = cram_new_block(EXTERNAL, DS_ref)))
	    return -1;
	s->ref_id = DS_ref; // needed?
	BLOCK_APPEND(s->block[DS_ref],
		     c->ref + c->first_base - c->ref_start,
		     c->last_base - c->first_base + 1);
    }

    /*
     * All the data-series blocks if appropriate. 
     */
    for (id = DS_BF; id < DS_TN; id++) {
	if (h->codecs[id] && (h->codecs[id]->codec == E_EXTERNAL ||
			      h->codecs[id]->codec == E_BYTE_ARRAY_STOP ||
			      h->codecs[id]->codec == E_BYTE_ARRAY_LEN)) {
	    switch (h->codecs[id]->codec) {
	    case E_EXTERNAL:
		if (!(s->block[id] = cram_new_block(EXTERNAL, id)))
		    return -1;
		h->codecs[id]->external.content_id = id;
		break;

	    case E_BYTE_ARRAY_STOP:
		if (!(s->block[id] = cram_new_block(EXTERNAL, id)))
		    return -1;
		h->codecs[id]->byte_array_stop.content_id = id;
		break;

	    case E_BYTE_ARRAY_LEN: {
		cram_codec *cc;

		cc = h->codecs[id]->e_byte_array_len.len_codec;
		if (cc->codec == E_EXTERNAL) {
		    int eid = cc->external.content_id;
		    if (!(s->block[eid] = cram_new_block(EXTERNAL, eid)))
			return -1;
		    cc->external.content_id = eid;
		    cc->out = s->block[eid];
		}

		cc = h->codecs[id]->e_byte_array_len.val_codec;
		if (cc->codec == E_EXTERNAL) {
		    int eid = cc->external.content_id;
		    if (!s->block[eid])
			if (!(s->block[eid] = cram_new_block(EXTERNAL, eid)))
			    return -1;
		    cc->external.content_id = eid;
		    cc->out = s->block[eid];
		}
		break;
	    }
	    default:
		break;
	    }
	} else {
	    if (!(id == DS_BB && !h->codecs[DS_BB]))
		s->block[id] = s->block[0];
	}
	if (h->codecs[id])
	    h->codecs[id]->out = s->block[id];
    }

    /* Encode reads */
    last_pos = s->hdr->ref_seq_start;
    for (rec = 0; rec < s->hdr->num_records; rec++) {
	cram_record *cr = &s->crecs[rec];
	if (cram_encode_slice_read(fd, c, h, s, cr, &last_pos) == -1)
	    return -1;
    }

    s->block[0]->uncomp_size = s->block[0]->byte + (s->block[0]->bit < 7);
    s->block[0]->comp_size = s->block[0]->uncomp_size;

    // Make sure the fixed blocks point to the correct sources
    s->block[DS_IN] = s->base_blk; s->base_blk = NULL;
    s->block[DS_QS] = s->qual_blk; s->qual_blk = NULL;
    s->block[DS_RN] = s->name_blk; s->name_blk = NULL;
    s->block[DS_SC] = s->soft_blk; s->soft_blk = NULL;
    s->block[DS_aux]= s->aux_blk;  s->aux_blk  = NULL;
    s->block[DS_aux_OQ]= s->aux_OQ_blk;  s->aux_OQ_blk  = NULL;
    s->block[DS_aux_BQ]= s->aux_BQ_blk;  s->aux_BQ_blk  = NULL;
    s->block[DS_aux_BD]= s->aux_BD_blk;  s->aux_BD_blk  = NULL;
    s->block[DS_aux_BI]= s->aux_BI_blk;  s->aux_BI_blk  = NULL;
    s->block[DS_aux_FZ]= s->aux_FZ_blk;  s->aux_FZ_blk  = NULL;
    s->block[DS_aux_oq]= s->aux_oq_blk;  s->aux_oq_blk  = NULL;
    s->block[DS_aux_os]= s->aux_os_blk;  s->aux_os_blk  = NULL;
    s->block[DS_aux_oz]= s->aux_oz_blk;  s->aux_oz_blk  = NULL;

    // Ensure block sizes are up to date.
    for (id = 1; id < DS_END; id++) {
	if (!s->block[id] || s->block[id] == s->block[0])
	    continue;

	if (s->block[id]->uncomp_size == 0)
	    BLOCK_UPLEN(s->block[id]);
    }

    // Compress it all
    if (cram_compress_slice(fd, s) == -1)
	return -1;

    // Collapse empty blocks and create hdr_block
    {
	int i, j;
	for (i = j = 1; i < DS_END; i++) {
	    if (!s->block[i] || s->block[i] == s->block[0])
		continue;
	    if (s->block[i]->uncomp_size == 0) {
		cram_free_block(s->block[i]);
		s->block[i] = NULL;
		continue;
	    }
	    s->block[j] = s->block[i];
	    s->hdr->block_content_ids[j-1] = s->block[i]->content_id;
	    j++;
	}
	s->hdr->num_content_ids = j-1;
	s->hdr->num_blocks = j;

	if (!(s->hdr_block = cram_encode_slice_header(fd, s)))
	    return -1;
    }

    return r ? -1 : 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x80, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movl $0x0, -0x30(%rbp)
movq -0x10(%rbp), %rcx
xorl %eax, %eax
cmpl $0x0, 0x208(%rcx)
movb %al, -0x61(%rbp)
je 0x38f05
movq -0x28(%rbp), %rax
movq (%rax), %rax
cmpl $-0x1, 0x4(%rax)
setne %al
movb %al, -0x61(%rbp)
movb -0x61(%rbp), %dl
xorl %eax, %eax
movl $0x1, %ecx
testb $0x1, %dl
cmovnel %ecx, %eax
movl %eax, -0x38(%rbp)
movl -0x38(%rbp), %edx
movl $0xffffffff, %ecx       # imm = 0xFFFFFFFF
movl $0xa, %eax
cmpl $0x0, %edx
cmovnel %eax, %ecx
movq -0x28(%rbp), %rax
movq (%rax), %rax
movl %ecx, 0x30(%rax)
movq -0x18(%rbp), %rax
movslq 0x20(%rax), %rcx
movq -0x18(%rbp), %rax
addq 0x10(%rax), %rcx
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq %rcx, 0x18(%rax)
movq -0x28(%rbp), %rax
movq (%rax), %rax
movl 0x10(%rax), %ecx
movq -0x18(%rbp), %rax
addl 0x20(%rax), %ecx
movl %ecx, 0x20(%rax)
movl $0x2f, %edi
movl $0x8, %esi
callq 0x4370
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x10(%rax)
movl $0xbc, %edi
callq 0x47a0
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq %rcx, 0x28(%rax)
movq -0x28(%rbp), %rax
cmpq $0x0, 0x10(%rax)
je 0x38faf
movq -0x28(%rbp), %rax
movq (%rax), %rax
cmpq $0x0, 0x28(%rax)
jne 0x38fbb
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x399eb
movl $0x5, %edi
xorl %esi, %esi
callq 0x45b10
movq -0x28(%rbp), %rcx
movq 0x10(%rcx), %rcx
movq %rax, (%rcx)
cmpq $0x0, %rax
jne 0x38fe4
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x399eb
movq -0x10(%rbp), %rax
movl 0xc(%rax), %eax
sarl $0x8, %eax
cmpl $0x1, %eax
jne 0x39083
movq -0x20(%rbp), %rax
movq 0x3b8(%rax), %rax
cmpl $0x1, (%rax)
jne 0x3904b
movl $0x4, %edi
movl $0x27, %esi
callq 0x45b10
movq -0x28(%rbp), %rcx
movq 0x10(%rcx), %rcx
movq %rax, 0x138(%rcx)
cmpq $0x0, %rax
jne 0x39037
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x399eb
movq -0x20(%rbp), %rax
movq 0x3b8(%rax), %rax
movl $0x27, 0x30(%rax)
jmp 0x39065
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rcx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, 0x138(%rax)
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x138(%rax), %rcx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, 0x138(%rax)
cmpl $0x0, -0x38(%rbp)
je 0x3928f
movl $0x4, %edi
movl $0xa, %esi
callq 0x45b10
movq -0x28(%rbp), %rcx
movq 0x10(%rcx), %rcx
movq %rax, 0x50(%rcx)
cmpq $0x0, %rax
jne 0x390ba
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x399eb
movq -0x28(%rbp), %rax
movl $0xa, 0xf8(%rax)
jmp 0x390ca
jmp 0x390cc
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x50(%rax), %rax
movq 0x28(%rax), %rax
movq -0x28(%rbp), %rcx
movq 0x10(%rcx), %rcx
movq 0x50(%rcx), %rcx
movq 0x30(%rcx), %rcx
movq -0x18(%rbp), %rdx
movl 0xa4(%rdx), %edx
movq -0x18(%rbp), %rsi
subl 0xa0(%rsi), %edx
addl $0x1, %edx
movslq %edx, %rdx
addq %rdx, %rcx
cmpq %rcx, %rax
ja 0x391f2
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x50(%rax), %rax
cmpq $0x0, 0x28(%rax)
je 0x3916b
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x50(%rax), %rax
movq 0x28(%rax), %xmm0
movaps 0x419a3(%rip), %xmm1    # 0x7aae0
punpckldq %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
movapd 0x419a7(%rip), %xmm1    # 0x7aaf0
subpd %xmm1, %xmm0
movaps %xmm0, %xmm1
unpckhpd %xmm0, %xmm0            # xmm0 = xmm0[1,1]
addsd %xmm1, %xmm0
movsd 0x42978(%rip), %xmm1    # 0x7bad8
mulsd %xmm1, %xmm0
movsd %xmm0, -0x70(%rbp)
jmp 0x3917a
movsd 0x4295d(%rip), %xmm0    # 0x7bad0
movsd %xmm0, -0x70(%rbp)
jmp 0x3917a
movsd -0x70(%rbp), %xmm0
movsd 0x41939(%rip), %xmm2    # 0x7aac0
movaps %xmm0, %xmm1
subsd %xmm2, %xmm1
cvttsd2si %xmm1, %rax
cvttsd2si %xmm0, %rcx
movq %rcx, %rdx
sarq $0x3f, %rdx
andq %rdx, %rax
orq %rax, %rcx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x50(%rax), %rax
movq %rcx, 0x28(%rax)
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x50(%rax), %rax
movq 0x20(%rax), %rdi
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x50(%rax), %rax
movq 0x28(%rax), %rsi
callq 0x4990
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x50(%rax), %rax
movq %rcx, 0x20(%rax)
jmp 0x390cc
jmp 0x391f4
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x50(%rax), %rax
movq 0x20(%rax), %rdi
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x50(%rax), %rax
addq 0x30(%rax), %rdi
movq -0x18(%rbp), %rax
movq 0xb0(%rax), %rsi
movq -0x18(%rbp), %rax
movslq 0xa0(%rax), %rax
addq %rax, %rsi
movq -0x18(%rbp), %rax
movslq 0x9c(%rax), %rcx
xorl %eax, %eax
subq %rcx, %rax
addq %rax, %rsi
movq -0x18(%rbp), %rax
movl 0xa4(%rax), %eax
movq -0x18(%rbp), %rcx
subl 0xa0(%rcx), %eax
addl $0x1, %eax
movslq %eax, %rdx
callq 0x4460
movq -0x18(%rbp), %rax
movl 0xa4(%rax), %eax
movq -0x18(%rbp), %rcx
subl 0xa0(%rcx), %eax
addl $0x1, %eax
movslq %eax, %rcx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x50(%rax), %rax
addq 0x30(%rax), %rcx
movq %rcx, 0x30(%rax)
jmp 0x3928f
movl $0xf, -0x3c(%rbp)
cmpl $0x27, -0x3c(%rbp)
jae 0x39541
movq -0x20(%rbp), %rax
movl -0x3c(%rbp), %ecx
cmpq $0x0, 0x280(%rax,%rcx,8)
je 0x394cd
movq -0x20(%rbp), %rax
movl -0x3c(%rbp), %ecx
movq 0x280(%rax,%rcx,8), %rax
cmpl $0x1, (%rax)
je 0x392f6
movq -0x20(%rbp), %rax
movl -0x3c(%rbp), %ecx
movq 0x280(%rax,%rcx,8), %rax
cmpl $0x5, (%rax)
je 0x392f6
movq -0x20(%rbp), %rax
movl -0x3c(%rbp), %ecx
movq 0x280(%rax,%rcx,8), %rax
cmpl $0x4, (%rax)
jne 0x394cd
movq -0x20(%rbp), %rax
movl -0x3c(%rbp), %ecx
movq 0x280(%rax,%rcx,8), %rax
movl (%rax), %eax
movl %eax, -0x74(%rbp)
subl $0x1, %eax
je 0x3932c
jmp 0x39311
movl -0x74(%rbp), %eax
subl $0x4, %eax
je 0x393bc
jmp 0x3931f
movl -0x74(%rbp), %eax
subl $0x5, %eax
je 0x39374
jmp 0x394c9
movl -0x3c(%rbp), %esi
movl $0x4, %edi
callq 0x45b10
movq -0x28(%rbp), %rcx
movq 0x10(%rcx), %rcx
movl -0x3c(%rbp), %edx
movq %rax, (%rcx,%rdx,8)
cmpq $0x0, %rax
jne 0x3935a
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x399eb
movl -0x3c(%rbp), %ecx
movq -0x20(%rbp), %rax
movl -0x3c(%rbp), %edx
movq 0x280(%rax,%rdx,8), %rax
movl %ecx, 0x30(%rax)
jmp 0x394cb
movl -0x3c(%rbp), %esi
movl $0x4, %edi
callq 0x45b10
movq -0x28(%rbp), %rcx
movq 0x10(%rcx), %rcx
movl -0x3c(%rbp), %edx
movq %rax, (%rcx,%rdx,8)
cmpq $0x0, %rax
jne 0x393a2
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x399eb
movl -0x3c(%rbp), %ecx
movq -0x20(%rbp), %rax
movl -0x3c(%rbp), %edx
movq 0x280(%rax,%rdx,8), %rax
movl %ecx, 0x34(%rax)
jmp 0x394cb
movq -0x20(%rbp), %rax
movl -0x3c(%rbp), %ecx
movq 0x280(%rax,%rcx,8), %rax
movq 0x48(%rax), %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
cmpl $0x1, (%rax)
jne 0x39437
movq -0x48(%rbp), %rax
movl 0x30(%rax), %eax
movl %eax, -0x4c(%rbp)
movl -0x4c(%rbp), %esi
movl $0x4, %edi
callq 0x45b10
movq -0x28(%rbp), %rcx
movq 0x10(%rcx), %rcx
movslq -0x4c(%rbp), %rdx
movq %rax, (%rcx,%rdx,8)
cmpq $0x0, %rax
jne 0x39415
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x399eb
movl -0x4c(%rbp), %ecx
movq -0x48(%rbp), %rax
movl %ecx, 0x30(%rax)
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movslq -0x4c(%rbp), %rcx
movq (%rax,%rcx,8), %rcx
movq -0x48(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x20(%rbp), %rax
movl -0x3c(%rbp), %ecx
movq 0x280(%rax,%rcx,8), %rax
movq 0x50(%rax), %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
cmpl $0x1, (%rax)
jne 0x394c7
movq -0x48(%rbp), %rax
movl 0x30(%rax), %eax
movl %eax, -0x50(%rbp)
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movslq -0x50(%rbp), %rcx
cmpq $0x0, (%rax,%rcx,8)
jne 0x394a5
movl -0x50(%rbp), %esi
movl $0x4, %edi
callq 0x45b10
movq -0x28(%rbp), %rcx
movq 0x10(%rcx), %rcx
movslq -0x50(%rbp), %rdx
movq %rax, (%rcx,%rdx,8)
cmpq $0x0, %rax
jne 0x394a3
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x399eb
jmp 0x394a5
movl -0x50(%rbp), %ecx
movq -0x48(%rbp), %rax
movl %ecx, 0x30(%rax)
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movslq -0x50(%rbp), %rcx
movq (%rax,%rcx,8), %rcx
movq -0x48(%rbp), %rax
movq %rcx, 0x8(%rax)
jmp 0x394cb
jmp 0x394cb
jmp 0x394fd
cmpl $0x25, -0x3c(%rbp)
jne 0x394e1
movq -0x20(%rbp), %rax
cmpq $0x0, 0x3a8(%rax)
je 0x394fb
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rdx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movl -0x3c(%rbp), %ecx
movq %rdx, (%rax,%rcx,8)
jmp 0x394fd
movq -0x20(%rbp), %rax
movl -0x3c(%rbp), %ecx
cmpq $0x0, 0x280(%rax,%rcx,8)
je 0x39531
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movl -0x3c(%rbp), %ecx
movq (%rax,%rcx,8), %rcx
movq -0x20(%rbp), %rax
movl -0x3c(%rbp), %edx
movq 0x280(%rax,%rdx,8), %rax
movq %rcx, 0x8(%rax)
jmp 0x39533
movl -0x3c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x3c(%rbp)
jmp 0x39296
movq -0x28(%rbp), %rax
movq (%rax), %rax
movl 0x8(%rax), %eax
movl %eax, -0x34(%rbp)
movl $0x0, -0x2c(%rbp)
movl -0x2c(%rbp), %eax
movq -0x28(%rbp), %rcx
movq (%rcx), %rcx
cmpl 0x10(%rcx), %eax
jge 0x395b6
movq -0x28(%rbp), %rax
movq 0x28(%rax), %rax
movslq -0x2c(%rbp), %rcx
imulq $0x70, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0x58(%rbp)
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0x28(%rbp), %rcx
movq -0x58(%rbp), %r8
leaq -0x34(%rbp), %r9
callq 0x3b380
cmpl $-0x1, %eax
jne 0x395a9
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x399eb
jmp 0x395ab
movl -0x2c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x2c(%rbp)
jmp 0x39555
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rax
movq 0x30(%rax), %rax
movq -0x28(%rbp), %rcx
movq 0x10(%rcx), %rcx
movq (%rcx), %rcx
cmpl $0x7, 0x38(%rcx)
setl %cl
andb $0x1, %cl
movzbl %cl, %ecx
movslq %ecx, %rcx
addq %rcx, %rax
movl %eax, %ecx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rax
movl %ecx, 0x14(%rax)
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rax
movl 0x14(%rax), %ecx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rax
movl %ecx, 0x10(%rax)
movq -0x28(%rbp), %rax
movq 0x78(%rax), %rcx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, 0x68(%rax)
movq -0x28(%rbp), %rax
movq $0x0, 0x78(%rax)
movq -0x28(%rbp), %rax
movq 0x70(%rax), %rcx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, 0x60(%rax)
movq -0x28(%rbp), %rax
movq $0x0, 0x70(%rax)
movq -0x28(%rbp), %rax
movq 0x60(%rax), %rcx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, 0x58(%rax)
movq -0x28(%rbp), %rax
movq $0x0, 0x60(%rax)
movq -0x28(%rbp), %rax
movq 0x80(%rax), %rcx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, 0x70(%rax)
movq -0x28(%rbp), %rax
movq $0x0, 0x80(%rax)
movq -0x28(%rbp), %rax
movq 0x88(%rax), %rcx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, 0x8(%rax)
movq -0x28(%rbp), %rax
movq $0x0, 0x88(%rax)
movq -0x28(%rbp), %rax
movq 0x90(%rax), %rcx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, 0x10(%rax)
movq -0x28(%rbp), %rax
movq $0x0, 0x90(%rax)
movq -0x28(%rbp), %rax
movq 0x98(%rax), %rcx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, 0x18(%rax)
movq -0x28(%rbp), %rax
movq $0x0, 0x98(%rax)
movq -0x28(%rbp), %rax
movq 0xa0(%rax), %rcx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, 0x20(%rax)
movq -0x28(%rbp), %rax
movq $0x0, 0xa0(%rax)
movq -0x28(%rbp), %rax
movq 0xa8(%rax), %rcx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, 0x28(%rax)
movq -0x28(%rbp), %rax
movq $0x0, 0xa8(%rax)
movq -0x28(%rbp), %rax
movq 0xb0(%rax), %rcx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, 0x30(%rax)
movq -0x28(%rbp), %rax
movq $0x0, 0xb0(%rax)
movq -0x28(%rbp), %rax
movq 0xb8(%rax), %rcx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, 0x38(%rax)
movq -0x28(%rbp), %rax
movq $0x0, 0xb8(%rax)
movq -0x28(%rbp), %rax
movq 0xc0(%rax), %rcx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, 0x40(%rax)
movq -0x28(%rbp), %rax
movq $0x0, 0xc0(%rax)
movq -0x28(%rbp), %rax
movq 0xc8(%rax), %rcx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, 0x48(%rax)
movq -0x28(%rbp), %rax
movq $0x0, 0xc8(%rax)
movl $0x1, -0x3c(%rbp)
cmpl $0x2f, -0x3c(%rbp)
jae 0x3988a
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movl -0x3c(%rbp), %ecx
cmpq $0x0, (%rax,%rcx,8)
je 0x3982a
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movl -0x3c(%rbp), %ecx
movq (%rax,%rcx,8), %rax
movq -0x28(%rbp), %rcx
movq 0x10(%rcx), %rcx
cmpq (%rcx), %rax
jne 0x3982c
jmp 0x3987c
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movl -0x3c(%rbp), %ecx
movq (%rax,%rcx,8), %rax
cmpl $0x0, 0x14(%rax)
jne 0x3987a
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movl -0x3c(%rbp), %ecx
movq (%rax,%rcx,8), %rax
movq 0x30(%rax), %rax
movl %eax, %ecx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movl -0x3c(%rbp), %edx
movq (%rax,%rdx,8), %rax
movl %ecx, 0x14(%rax)
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movl -0x3c(%rbp), %edx
movq (%rax,%rdx,8), %rax
movl %ecx, 0x10(%rax)
jmp 0x3987c
movl -0x3c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x3c(%rbp)
jmp 0x397f2
movq -0x10(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x3bba0
cmpl $-0x1, %eax
jne 0x398a8
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x399eb
movl $0x1, -0x60(%rbp)
movl $0x1, -0x5c(%rbp)
cmpl $0x2f, -0x5c(%rbp)
jge 0x39997
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movslq -0x5c(%rbp), %rcx
cmpq $0x0, (%rax,%rcx,8)
je 0x398f0
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movslq -0x5c(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq -0x28(%rbp), %rcx
movq 0x10(%rcx), %rcx
cmpq (%rcx), %rax
jne 0x398f5
jmp 0x39989
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movslq -0x5c(%rbp), %rcx
movq (%rax,%rcx,8), %rax
cmpl $0x0, 0x14(%rax)
jne 0x39936
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movslq -0x5c(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
callq 0x470c0
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movslq -0x5c(%rbp), %rcx
movq $0x0, (%rax,%rcx,8)
jmp 0x39989
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movslq -0x5c(%rbp), %rcx
movq (%rax,%rcx,8), %rdx
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movslq -0x60(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movslq -0x5c(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movl 0xc(%rax), %edx
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq 0x28(%rax), %rax
movl -0x60(%rbp), %ecx
subl $0x1, %ecx
movslq %ecx, %rcx
movl %edx, (%rax,%rcx,4)
movl -0x60(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x60(%rbp)
movl -0x5c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x5c(%rbp)
jmp 0x398b6
movl -0x60(%rbp), %ecx
subl $0x1, %ecx
movq -0x28(%rbp), %rax
movq (%rax), %rax
movl %ecx, 0x24(%rax)
movl -0x60(%rbp), %ecx
movq -0x28(%rbp), %rax
movq (%rax), %rax
movl %ecx, 0x20(%rax)
movq -0x10(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x338a0
movq -0x28(%rbp), %rcx
movq %rax, 0x8(%rcx)
cmpq $0x0, %rax
jne 0x399d8
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x399eb
movl -0x30(%rbp), %edx
xorl %eax, %eax
movl $0xffffffff, %ecx       # imm = 0xFFFFFFFF
cmpl $0x0, %edx
cmovnel %ecx, %eax
movl %eax, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x80, %rsp
popq %rbp
retq
nopw (%rax,%rax)