// Path: src/main/java/edu/umd/marbl/mhap/align/Alignment.java
// public enum Operation
// {
// 	MATCH,
// 	INSERT,
// 	DELETE;
// }


import edu.umd.marbl.mhap.align.Alignment.Operation;
import java.util.ArrayList;
import java.util.Collections;
					maxI = i;
					maxJ = j;
				}
			}
		}
		
		float score = maxValue;
				
		int a1 = 0;
		int a2 = Math.max(0, maxI-1);
		int b1 = 0;
		int b2 = Math.max(0, maxJ-1);

		if (storePath)
		{
			//figure out the path
			ArrayList<Alignment.Operation> backOperations = new ArrayList<>(a.length()+b.length());
			
			int i = maxI;
			int j = maxJ;
			while (i>0 && j>0)
			{
				if ((P[i][j]>=Q[i][j] && P[i][j]==D[i][j]) || j==0)
				{
					backOperations.add(Operation.DELETE);
					i--;
				}
				else
				if (Q[i][j]==D[i][j] || i==0)
				{
// Path: src/main/java/edu/umd/marbl/mhap/align/Alignment.java
// public enum Operation
// {
// 	MATCH,
// 	INSERT,
// 	DELETE;
// }


// Path: src/main/java/edu/umd/marbl/mhap/align/Aligner.java
import edu.umd.marbl.mhap.align.Alignment.Operation;
import java.util.ArrayList;
import java.util.Collections;

					maxI = i;
					maxJ = j;
				}
			}
		}
		
		float score = maxValue;
				
		int a1 = 0;
		int a2 = Math.max(0, maxI-1);
		int b1 = 0;
		int b2 = Math.max(0, maxJ-1);

		if (storePath)
		{
			//figure out the path
			ArrayList<Alignment.Operation> backOperations = new ArrayList<>(a.length()+b.length());
			
			int i = maxI;
			int j = maxJ;
			while (i>0 && j>0)
			{
				if ((P[i][j]>=Q[i][j] && P[i][j]==D[i][j]) || j==0)
				{
					backOperations.add(Operation.DELETE);
					i--;
				}
				else
				if (Q[i][j]==D[i][j] || i==0)
				{
					backOperations.add(Operation.INSERT);