// File: readmapping[P]alfalfa/src/dp.cpp
// Function: dynProg::dpBandStatic(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, boundaries&, dp_type const&, outputType const&, dp_output&, int, int, bool)
int dynProg::dpBandStatic( const string&     ref,
        const string&     query,
        boundaries& offset,
        const dp_type&    type,
        const outputType& oType,
        dp_output&  output,
        int minbandS,
        int maxbandS,
        bool print)
{
    L1 = offset.refE-offset.refB+1;
    L2 = offset.queryE-offset.queryB+1;
    bandSize = minbandS;
    banded = true;
    assert(L1 >=0 && L2 >= 0 && bandSize >0);
    assert(!type.local);
    assert((!type.freeQueryB && !type.freeRefB) || (!type.freeQueryE && !type.freeRefE));
    //IF no free start at begin:
    //possible end of alignment should be accessible for traceback: 
    //range of allowed traceback startpositions should have a non-empty intersection
    //with the band, otherwise: give bad alignment and return
    //ELSE IF free start at begin in cols or rows: (resulting in no free ending):
    //check range of starting point (0,0) lies in range of band if rows or columns were not free
    if((type.freeQueryB && !type.freeRefB && L2 + bandSize < L1) ||
            (type.freeRefB && !type.freeQueryB && L2 - bandSize > L1) ||
            (!(type.freeQueryB || type.freeRefB) && !type.freeRefE && L2 + bandSize < L1) ||
            (!(type.freeQueryB || type.freeRefB) && !type.freeQueryE && L2 - bandSize > L1)){
        if(max(L2,L1) - min(L2,L1) < maxbandS){
            bandSize = max(L2,L1) - min(L2,L1);
            if(print) cerr << "adjusted bandSize to " << bandSize << endl;
        }
        else{
            if(print) cerr << "possible end of alignment would lay beyond the dimensions of the matrix" << endl;
            output.dpScore = scores.mismatch*query.length();
            output.editDist = query.length();
            return 1;
        }
    }
    bool backward = (type.freeQueryB || type.freeRefB) && !type.local;
    //build matrices
    updateMatrix(type, backward, print);
    bool affine = scores.openGap != 0;
    if(print)
        cerr << "fill DP matrix" << endl;
    //dp
    if(affine)
        dpFillStatic(ref, query, !backward, offset, type);
    else
        dpFillOptStatic(ref, query, !backward, offset, type);
    if(print){
        //print_matrices(ref, query, offset, false);
    }
    //traceback and output
    int        i = min(L2,L1+bandSize), j = min(L1,L2+bandSize);
    if(print)
        cerr << "find traceback position" << endl;
    //find beginPosition for traceBack and find dpScore
    findTraceBackPosStatic(&i,&j,type);
    if(print)
        cerr << "tracebackpos is " << i << ", " << j << endl;
    output.dpScore = M[i][j];
    if(print)
        cerr << "dp score is " << output.dpScore << endl;
    //Next is for output only
    if(oType>DPSCORE){
        //Alter boundaries to return the new positions when free gaps were introduced.
        if(type.freeQueryE && i < L2)
            offset.queryE = offset.queryB+i-1;
        if(type.freeRefE && j < L1)
            offset.refE = offset.refB+j-1;
        if(type.freeQueryB && i < L2)
            offset.queryB = offset.queryE-i+1;
        if(type.freeRefB && j < L1)
            offset.refB = offset.refE-j+1;
        //traceBack
        if(print)
                cerr << "search trace" << endl;
        std::stringstream ss;
        if(affine)
            dpTraceBackStatic(i, j, output, ss, offset, !backward, ref, query);
        else
            dpTraceBackOptStatic(i, j, type, output, ss, offset, !backward, ref, query);
        if(print)
                cerr << "trace ended at position " << i << ", " << j << endl;
        assert(j ==0 && i==0);
        //Errorstring output
        if(oType == ERRORSTRING || oType == ALL){
            if(print)
                cerr << "write errorstring to cigar vector" << endl;
            string errorString = ss.str();
            if(!backward)
                reverse( errorString.begin(), errorString.end() );
            //create output: errorString
            int iter = 0;
            int temp;
            int errorStringLength = errorString.length();
            while(iter < errorStringLength){
                temp = iter;
                while(iter+1 < errorStringLength && errorString[iter+1]==errorString[temp])
                    iter++;
                iter++;
                output.cigarChars.push_back(errorString[temp]);
                output.cigarLengths.push_back(iter-temp);
            }
        }
    }
    //change boundaries for local and freeGap types to return changed free boundaries.
    if(print)
        cerr << "DP finished" << endl;

    return 0;
}

// Assembly:
subq $0x2c8, %rsp            # imm = 0x2C8
movb 0x2e8(%rsp), %al
movl 0x2e0(%rsp), %r10d
movl 0x2d8(%rsp), %r10d
movq 0x2d0(%rsp), %r10
movq %rdi, 0x2b8(%rsp)
movq %rsi, 0x2b0(%rsp)
movq %rdx, 0x2a8(%rsp)
movq %rcx, 0x2a0(%rsp)
movq %r8, 0x298(%rsp)
movq %r9, 0x290(%rsp)
andb $0x1, %al
movb %al, 0x28f(%rsp)
movq 0x2b8(%rsp), %rax
movq %rax, 0x98(%rsp)
movq 0x2a0(%rsp), %rcx
movq 0x8(%rcx), %rcx
movq 0x2a0(%rsp), %rdx
subq (%rdx), %rcx
addq $0x1, %rcx
movl %ecx, 0x20(%rax)
movq 0x2a0(%rsp), %rcx
movl 0x14(%rcx), %ecx
movq 0x2a0(%rsp), %rdx
subl 0x10(%rdx), %ecx
addl $0x1, %ecx
movl %ecx, 0x24(%rax)
movl 0x2d8(%rsp), %ecx
movl %ecx, 0x28(%rax)
movb $0x1, 0x34(%rax)
movq 0x298(%rsp), %rax
testb $0x1, 0x2(%rax)
je 0x368b9
movq 0x298(%rsp), %rax
testb $0x1, (%rax)
jne 0x368b9
movq 0x98(%rsp), %rcx
movl 0x24(%rcx), %eax
addl 0x28(%rcx), %eax
cmpl 0x20(%rcx), %eax
jl 0x36973
movq 0x298(%rsp), %rax
testb $0x1, (%rax)
je 0x368eb
movq 0x298(%rsp), %rax
testb $0x1, 0x2(%rax)
jne 0x368eb
movq 0x98(%rsp), %rcx
movl 0x24(%rcx), %eax
subl 0x28(%rcx), %eax
cmpl 0x20(%rcx), %eax
jg 0x36973
movq 0x298(%rsp), %rax
testb $0x1, 0x2(%rax)
jne 0x36927
movq 0x298(%rsp), %rax
testb $0x1, (%rax)
jne 0x36927
movq 0x298(%rsp), %rax
testb $0x1, 0x1(%rax)
jne 0x36927
movq 0x98(%rsp), %rcx
movl 0x24(%rcx), %eax
addl 0x28(%rcx), %eax
cmpl 0x20(%rcx), %eax
jl 0x36973
movq 0x298(%rsp), %rax
testb $0x1, 0x2(%rax)
jne 0x36af1
movq 0x298(%rsp), %rax
testb $0x1, (%rax)
jne 0x36af1
movq 0x298(%rsp), %rax
testb $0x1, 0x3(%rax)
jne 0x36af1
movq 0x98(%rsp), %rcx
movl 0x24(%rcx), %eax
subl 0x28(%rcx), %eax
cmpl 0x20(%rcx), %eax
jle 0x36af1
movq 0x98(%rsp), %rsi
movq %rsi, %rdi
addq $0x24, %rdi
addq $0x20, %rsi
callq 0x14d40
movq 0x98(%rsp), %rsi
movl (%rax), %eax
movl %eax, 0x94(%rsp)
movq %rsi, %rdi
addq $0x24, %rdi
addq $0x20, %rsi
callq 0xc080
movq %rax, %rcx
movl 0x94(%rsp), %eax
subl (%rcx), %eax
cmpl 0x2e0(%rsp), %eax
jge 0x36a59
movq 0x98(%rsp), %rsi
movq %rsi, %rdi
addq $0x24, %rdi
addq $0x20, %rsi
callq 0x14d40
movq 0x98(%rsp), %rsi
movl (%rax), %eax
movl %eax, 0x90(%rsp)
movq %rsi, %rdi
addq $0x24, %rdi
addq $0x20, %rsi
callq 0xc080
movl 0x90(%rsp), %ecx
movq %rax, %rdx
movq 0x98(%rsp), %rax
subl (%rdx), %ecx
movl %ecx, 0x28(%rax)
testb $0x1, 0x28f(%rsp)
je 0x36a54
movq 0x605ca(%rip), %rdi     # 0x96ff0
leaq 0x46f0f(%rip), %rsi     # 0x7d93c
callq 0x8360
movq %rax, %rdi
movq 0x98(%rsp), %rax
movl 0x28(%rax), %esi
callq 0x8710
movq %rax, %rdi
movq 0x60561(%rip), %rsi     # 0x96fb0
callq 0x83b0
jmp 0x36aef
testb $0x1, 0x28f(%rsp)
je 0x36a85
movq 0x60586(%rip), %rdi     # 0x96ff0
leaq 0x46ee1(%rip), %rsi     # 0x7d952
callq 0x8360
movq %rax, %rdi
movq 0x60530(%rip), %rsi     # 0x96fb0
callq 0x83b0
movq 0x98(%rsp), %rax
movq 0x38(%rax), %rax
movslq 0x4(%rax), %rax
movq %rax, 0x88(%rsp)
movq 0x2a8(%rsp), %rdi
callq 0x8630
movq %rax, %rcx
movq 0x88(%rsp), %rax
imulq %rcx, %rax
movl %eax, %ecx
movq 0x2d0(%rsp), %rax
movl %ecx, 0x4(%rax)
movq 0x2a8(%rsp), %rdi
callq 0x8630
movl %eax, %ecx
movq 0x2d0(%rsp), %rax
movl %ecx, (%rax)
movl $0x1, 0x2c4(%rsp)
jmp 0x3733b
jmp 0x36af1
movq 0x298(%rsp), %rax
testb $0x1, 0x2(%rax)
jne 0x36b15
movq 0x298(%rsp), %rcx
xorl %eax, %eax
testb $0x1, (%rcx)
movb %al, 0x87(%rsp)
je 0x36b29
movq 0x298(%rsp), %rax
movb 0x4(%rax), %al
xorb $-0x1, %al
movb %al, 0x87(%rsp)
movq 0x98(%rsp), %rdi
movb 0x87(%rsp), %al
andb $0x1, %al
movb %al, 0x28e(%rsp)
movq 0x298(%rsp), %rsi
movb 0x28e(%rsp), %cl
movb 0x28f(%rsp), %al
andb $0x1, %cl
andb $0x1, %al
movzbl %cl, %edx
movzbl %al, %ecx
callq 0x31920
movq 0x98(%rsp), %rax
movq 0x38(%rax), %rax
cmpl $0x0, 0x8(%rax)
setne %al
andb $0x1, %al
movb %al, 0x28d(%rsp)
testb $0x1, 0x28f(%rsp)
je 0x36baf
movq 0x6045c(%rip), %rdi     # 0x96ff0
leaq 0x46dff(%rip), %rsi     # 0x7d99a
callq 0x8360
movq %rax, %rdi
movq 0x60406(%rip), %rsi     # 0x96fb0
callq 0x83b0
testb $0x1, 0x28d(%rsp)
je 0x36bf7
movq 0x98(%rsp), %rdi
movq 0x2b0(%rsp), %rsi
movq 0x2a8(%rsp), %rdx
movb 0x28e(%rsp), %al
xorb $-0x1, %al
movq 0x2a0(%rsp), %r8
movq 0x298(%rsp), %r9
movzbl %al, %ecx
andl $0x1, %ecx
callq 0x32140
jmp 0x36c33
movq 0x98(%rsp), %rdi
movq 0x2b0(%rsp), %rsi
movq 0x2a8(%rsp), %rdx
movb 0x28e(%rsp), %al
xorb $-0x1, %al
movq 0x2a0(%rsp), %r8
movq 0x298(%rsp), %r9
movzbl %al, %ecx
andl $0x1, %ecx
callq 0x33500
testb $0x1, 0x28f(%rsp)
je 0x36c3f
jmp 0x36c3f
movq 0x98(%rsp), %rcx
movq %rcx, %rdi
addq $0x24, %rdi
movl 0x20(%rcx), %eax
addl 0x28(%rcx), %eax
movl %eax, 0x284(%rsp)
leaq 0x284(%rsp), %rsi
callq 0xc080
movq 0x98(%rsp), %rcx
movl (%rax), %eax
movl %eax, 0x288(%rsp)
movq %rcx, %rdi
addq $0x20, %rdi
movl 0x24(%rcx), %eax
addl 0x28(%rcx), %eax
movl %eax, 0x27c(%rsp)
leaq 0x27c(%rsp), %rsi
callq 0xc080
movl (%rax), %eax
movl %eax, 0x280(%rsp)
testb $0x1, 0x28f(%rsp)
je 0x36ccf
movq 0x6033c(%rip), %rdi     # 0x96ff0
leaq 0x46cee(%rip), %rsi     # 0x7d9a9
callq 0x8360
movq %rax, %rdi
movq 0x602e6(%rip), %rsi     # 0x96fb0
callq 0x83b0
movq 0x98(%rsp), %rdi
movq 0x298(%rsp), %rcx
leaq 0x288(%rsp), %rsi
leaq 0x280(%rsp), %rdx
callq 0x31ca0
testb $0x1, 0x28f(%rsp)
je 0x36d4d
movq 0x602eb(%rip), %rdi     # 0x96ff0
leaq 0x46cb5(%rip), %rsi     # 0x7d9c1
callq 0x8360
movq %rax, %rdi
movl 0x288(%rsp), %esi
callq 0x8710
movq %rax, %rdi
leaq 0x46bb3(%rip), %rsi     # 0x7d8dd
callq 0x8360
movq %rax, %rdi
movl 0x280(%rsp), %esi
callq 0x8710
movq %rax, %rdi
movq 0x60268(%rip), %rsi     # 0x96fb0
callq 0x83b0
movq 0x98(%rsp), %rax
movq (%rax), %rax
movslq 0x288(%rsp), %rcx
movq (%rax,%rcx,8), %rax
movslq 0x280(%rsp), %rcx
movl (%rax,%rcx,4), %ecx
movq 0x2d0(%rsp), %rax
movl %ecx, 0x4(%rax)
testb $0x1, 0x28f(%rsp)
je 0x36db9
movq 0x60265(%rip), %rdi     # 0x96ff0
leaq 0x46c40(%rip), %rsi     # 0x7d9d2
callq 0x8360
movq %rax, %rdi
movq 0x2d0(%rsp), %rax
movl 0x4(%rax), %esi
callq 0x8710
movq %rax, %rdi
movq 0x601fc(%rip), %rsi     # 0x96fb0
callq 0x83b0
movq 0x290(%rsp), %rax
cmpl $0x0, (%rax)
jle 0x37304
movq 0x298(%rsp), %rax
testb $0x1, 0x3(%rax)
je 0x36e0c
movq 0x98(%rsp), %rcx
movl 0x288(%rsp), %eax
cmpl 0x24(%rcx), %eax
jge 0x36e0c
movq 0x2a0(%rsp), %rax
movl 0x10(%rax), %ecx
addl 0x288(%rsp), %ecx
subl $0x1, %ecx
movq 0x2a0(%rsp), %rax
movl %ecx, 0x14(%rax)
movq 0x298(%rsp), %rax
testb $0x1, 0x1(%rax)
je 0x36e54
movq 0x98(%rsp), %rcx
movl 0x280(%rsp), %eax
cmpl 0x20(%rcx), %eax
jge 0x36e54
movq 0x2a0(%rsp), %rax
movq (%rax), %rcx
movslq 0x280(%rsp), %rax
addq %rax, %rcx
subq $0x1, %rcx
movq 0x2a0(%rsp), %rax
movq %rcx, 0x8(%rax)
movq 0x298(%rsp), %rax
testb $0x1, 0x2(%rax)
je 0x36e96
movq 0x98(%rsp), %rcx
movl 0x288(%rsp), %eax
cmpl 0x24(%rcx), %eax
jge 0x36e96
movq 0x2a0(%rsp), %rax
movl 0x14(%rax), %ecx
subl 0x288(%rsp), %ecx
addl $0x1, %ecx
movq 0x2a0(%rsp), %rax
movl %ecx, 0x10(%rax)
movq 0x298(%rsp), %rax
testb $0x1, (%rax)
je 0x36edd
movq 0x98(%rsp), %rcx
movl 0x280(%rsp), %eax
cmpl 0x20(%rcx), %eax
jge 0x36edd
movq 0x2a0(%rsp), %rax
movq 0x8(%rax), %rcx
movslq 0x280(%rsp), %rax
subq %rax, %rcx
addq $0x1, %rcx
movq 0x2a0(%rsp), %rax
movq %rcx, (%rax)
testb $0x1, 0x28f(%rsp)
je 0x36f09
movq 0x60102(%rip), %rdi     # 0x96ff0
leaq 0x46aea(%rip), %rsi     # 0x7d9df
callq 0x8360
movq %rax, %rdi
movq 0x600ac(%rip), %rsi     # 0x96fb0
callq 0x83b0
leaq 0xf0(%rsp), %rdi
callq 0x8260
testb $0x1, 0x28d(%rsp)
je 0x36fa5
movq 0x98(%rsp), %rdi
movq 0x2d0(%rsp), %rcx
movq 0x2a0(%rsp), %r9
movb 0x28e(%rsp), %dl
notb %dl
movq 0x2b0(%rsp), %rsi
movq 0x2a8(%rsp), %r8
movq %rsp, %rax
movq %r8, 0x10(%rax)
movq %rsi, 0x8(%rax)
movzbl %dl, %edx
andl $0x1, %edx
movl %edx, (%rax)
leaq 0x288(%rsp), %rsi
leaq 0x280(%rsp), %rdx
leaq 0xf0(%rsp), %r8
callq 0x349f0
jmp 0x36f87
jmp 0x37019
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xe8(%rsp)
movl %eax, 0xe4(%rsp)
jmp 0x372f5
movq 0x98(%rsp), %rdi
movq 0x298(%rsp), %rcx
movq 0x2d0(%rsp), %r8
movq 0x2a0(%rsp), %rdx
movb 0x28e(%rsp), %sil
notb %sil
movq 0x2b0(%rsp), %r9
movq 0x2a8(%rsp), %r10
movq %rsp, %rax
movq %r10, 0x18(%rax)
movq %r9, 0x10(%rax)
movzbl %sil, %esi
andl $0x1, %esi
movl %esi, 0x8(%rax)
movq %rdx, (%rax)
leaq 0x288(%rsp), %rsi
leaq 0x280(%rsp), %rdx
leaq 0xf0(%rsp), %r9
callq 0x35910
jmp 0x37017
jmp 0x37019
testb $0x1, 0x28f(%rsp)
je 0x3709a
movq 0x5ffc6(%rip), %rdi     # 0x96ff0
leaq 0x469bb(%rip), %rsi     # 0x7d9ec
callq 0x8360
movq %rax, 0x78(%rsp)
jmp 0x3703d
movq 0x78(%rsp), %rdi
movl 0x288(%rsp), %esi
callq 0x8710
movq %rax, 0x70(%rsp)
jmp 0x37055
movq 0x70(%rsp), %rdi
leaq 0x4687c(%rip), %rsi     # 0x7d8dd
callq 0x8360
movq %rax, 0x68(%rsp)
jmp 0x3706d
movq 0x68(%rsp), %rdi
movl 0x280(%rsp), %esi
callq 0x8710
movq %rax, 0x60(%rsp)
jmp 0x37085
movq 0x60(%rsp), %rdi
movq 0x5ff1f(%rip), %rsi     # 0x96fb0
callq 0x83b0
jmp 0x37098
jmp 0x3709a
movq 0x290(%rsp), %rax
cmpl $0x3, (%rax)
je 0x370b8
movq 0x290(%rsp), %rax
cmpl $0x4, (%rax)
jne 0x372e6
testb $0x1, 0x28f(%rsp)
je 0x370f1
movq 0x5ff27(%rip), %rdi     # 0x96ff0
leaq 0x46935(%rip), %rsi     # 0x7da05
callq 0x8360
movq %rax, 0x58(%rsp)
jmp 0x370dc
movq 0x58(%rsp), %rdi
movq 0x5fec8(%rip), %rsi     # 0x96fb0
callq 0x83b0
jmp 0x370ef
jmp 0x370f1
leaq 0xc0(%rsp), %rdi
leaq 0xf0(%rsp), %rsi
callq 0x8350
jmp 0x37108
testb $0x1, 0x28e(%rsp)
jne 0x3717d
leaq 0xc0(%rsp), %rdi
movq %rdi, 0x50(%rsp)
callq 0x8310
movq 0x50(%rsp), %rdi
movq %rax, 0xb8(%rsp)
callq 0x81e0
movq %rax, 0xb0(%rsp)
movq 0xb8(%rsp), %rdi
movq 0xb0(%rsp), %rsi
callq 0xe110
jmp 0x37155
jmp 0x3717d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xe8(%rsp)
movl %eax, 0xe4(%rsp)
leaq 0xc0(%rsp), %rdi
callq 0x8858
jmp 0x372f5
movl $0x0, 0xac(%rsp)
leaq 0xc0(%rsp), %rdi
callq 0x8630
movl %eax, 0xa4(%rsp)
movl 0xac(%rsp), %eax
cmpl 0xa4(%rsp), %eax
jge 0x372d9
movl 0xac(%rsp), %eax
movl %eax, 0xa8(%rsp)
movl 0xac(%rsp), %ecx
addl $0x1, %ecx
xorl %eax, %eax
cmpl 0xa4(%rsp), %ecx
movb %al, 0x4f(%rsp)
jge 0x37234
movl 0xac(%rsp), %eax
incl %eax
movslq %eax, %rsi
leaq 0xc0(%rsp), %rdi
callq 0x8830
movq %rax, 0x40(%rsp)
jmp 0x371f7
movq 0x40(%rsp), %rax
movsbl (%rax), %eax
movl %eax, 0x34(%rsp)
movslq 0xa8(%rsp), %rsi
leaq 0xc0(%rsp), %rdi
callq 0x8830
movq %rax, 0x38(%rsp)
jmp 0x3721f
movl 0x34(%rsp), %eax
movq 0x38(%rsp), %rcx
movsbl (%rcx), %ecx
cmpl %ecx, %eax
sete %al
movb %al, 0x4f(%rsp)
movb 0x4f(%rsp), %al
testb $0x1, %al
jne 0x3723e
jmp 0x37254
movl 0xac(%rsp), %eax
addl $0x1, %eax
movl %eax, 0xac(%rsp)
jmp 0x371be
movl 0xac(%rsp), %eax
incl %eax
movl %eax, 0xac(%rsp)
movq 0x2d0(%rsp), %rax
addq $0x8, %rax
movq %rax, 0x20(%rsp)
movslq 0xa8(%rsp), %rsi
leaq 0xc0(%rsp), %rdi
callq 0x8830
movq %rax, 0x28(%rsp)
jmp 0x37291
movq 0x28(%rsp), %rsi
movq 0x20(%rsp), %rdi
callq 0x39060
jmp 0x372a2
movq 0x2d0(%rsp), %rdi
addq $0x20, %rdi
movl 0xac(%rsp), %eax
movl 0xa8(%rsp), %ecx
subl %ecx, %eax
movl %eax, 0xa0(%rsp)
leaq 0xa0(%rsp), %rsi
callq 0x390d0
jmp 0x372d4
jmp 0x3719c
leaq 0xc0(%rsp), %rdi
callq 0x8858
leaq 0xf0(%rsp), %rdi
callq 0x8290
jmp 0x37304
leaq 0xf0(%rsp), %rdi
callq 0x8290
jmp 0x3734a
testb $0x1, 0x28f(%rsp)
je 0x37330
movq 0x5fcdb(%rip), %rdi     # 0x96ff0
leaq 0x4670b(%rip), %rsi     # 0x7da27
callq 0x8360
movq %rax, %rdi
movq 0x5fc85(%rip), %rsi     # 0x96fb0
callq 0x83b0
movl $0x0, 0x2c4(%rsp)
movl 0x2c4(%rsp), %eax
addq $0x2c8, %rsp            # imm = 0x2C8
retq
movq 0xe8(%rsp), %rdi
callq 0x8730
nopw (%rax,%rax)