Using NetBeans IDE to Build Quick UI's

kaputmaltwormSoftware and s/w Development

Aug 15, 2012 (5 years ago)

267 views

Using NetBeans IDE to Build Quick UI’s

Ray Hylock,

GISo Tutorial



3/8/2011


We will be building the following application using the NetBeans IDE
.

It

s a simple nucleotide search tool
where we have as input a sequenc
e to search, a search sequence,
the direction of the input sequence (5




3




Forward


o
r 3




5




Reverse
), the maximum percent mismatch, the minimum

percent

GC
content, and whether or not the search sequence
indicates transitions.
If transitions are allowed
, then
the search sequence is case sensitive where a lower
-
case nucleotide indicates the
possibility

for a
transition (i.e., a


= A or G, c = C or T, g = A or G, a
nd t = C or T); otherwise case doesn

t matter.

The input
file may or may not be in FASTA format. The output is the matching nucleotide sequence from the input
file with an offset
to the start position

in the input sequence
, the p
ercent mismatch, and the
percent
gc
content
.

We also add three parameter presets to the menu bar.






INSTALLATION
STEPS

1.

Downloading and installing the latest NetBeans

IDE (using 6.9.1 in this demo)

a.

Go to:
http://netbeans.org/downloads/index.html

b.

Select the version you want

and save it somewhere

i.

This file is an installer on windows so you just delete it after instal
lation (not like
Eclipse)

ii.

I typically just download
ALL because I use the Java and C/C++ modules

c.

Install the file when the download is complete

d.

Run when installation is complete

e.

At any point in time, if you wish to run the project, you must first
execute

Clean and
Build then Run

i.

6.8 and earlier execute Build with Run, but for some reason, 6.9.1 doesn

t


CREATING A DESKTOP PROJECT

1.

File


New Project

2.

In the categories section, sel
ect Java

3.

In the projects section, select Java Desktop Application

4.

Next


Next


Name the project (e.g.,
Giso
Demo)



Finish

5.

You should now hav
e something that looks like the figure below

6.

In package gisodemo, you have the following files

a.

GisoDemoAboutBox
: This is an about box tied to Help


About

b.

GisoDemoApp: This is where the project is instantiated; do not modify unless you know
what you’re doing

c.

GisoDemoView: This is the interface class which provides Source and Design view

i.

Source: the underlying code
for the GUI

ii.

Design: the drag
-
and
-
drop view




BUILDING THE EXAMPLE INTERFACE

BUILDING THE INP
UT

1.

To being with our demo, we first want to make sure the palette is open

a.

If you do not see the Palette window, then Window


Palette




2.

Before we can continue on, we must first
set some code generation variables.

a.

Click in any part of the white space around the
application

b.

In the Form GisoDemoView


Properties panel

(below the Palette in the screenshot
from part a


Windows


Properties
)
,…

(in the following order)

i.

U
ncheck Use Local Variable

ii.

S
et

Variable Modifiers


Access = Private and

3.

First,

drag a Swing
Panel

object into the main panel (the central object)



place it
in the upper
half of pane with full width


4.

Next, in the Properties
window
,

click on border and select Titled Border
, change the
Border
option to EtchedBorder,

type “Input” into the Title

field and change th
e color
to black




5.

Next, we will drag a Swing Label and Combo Box control into the Input pane

a.

To change the variab
le name, right
-
click on the label and select Change variable name…
enter
“direction”

as the new name


6.

To change the text for jLabel1, simply double
-
click it and type Species

7.

To change the values in the combo box, click on it and in Properties select model

Type in
“Forward”

<enter>
“Reverse



8.

Next, we are going to add a series of Label and Spinner objects

(
Mismatch
,
GCMin
)

a.

To modify the Spinner elements, select Properties


model

i.

We want to use the Model Type number for both of these

ii.

Initial Value for
Mismatch

is 20, minimum is 0 and max is 100, step size 1

iii.

Initial Value for GCMin

is 70, minimum is 0 and max is 100, step size 1



b.

Set the variable names to
mismatch

and
gcmin
respectively

9.

We need to specify whether or not transitions are allowed (i.e., A


G and
C


T
)

a.

Drag a Check Box control next to max and name it Transitions

b.

Change the variable name to transitions

c.

If it is checked then that means allowed else disallowed


10.

We need to
specify a search sequence via an

input field

a.

Add a Label called Search String and a Text Field with a variable name of search

b.

Clear the default text by deleting everything in Properties


text


11.

Next, we are going to
add the controls to input a file from t
he File Choose (multi
-
step process)

a.

Drag a Swing Button control to the pane and change its text value (in properties) to
Select File


b.

Next, we will add a Label to the right of the select file where we will eventually display
the path to the selected file;

set
text to “empty”

i.

To change the variable name to fileName


c.

Instead of using the File Chooser palette option, we will create an action for the butto
n
to call the File Chooser from

i.

Select Source view


ii.

Under the method showAboutBox(), add the following

(you may have to add the
import to File)


private File inFile = null;


@Action

public void fileChooser(){

JFileChooser chooser = new JFileChooser("");

chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);

int returnVal = chooser.show
OpenDialog((
java.awt.Component)

null);

if (returnVal == JFileChooser.APPROVE_OPTION ){

inFile = chooser.getSelectedFile();

fileName.setText(inFile.getPath());

}

}

iii.

Return to the Design menu

iv.

Double
-
click the Select File button


Action = fileChooser

1.

This assigns the met
hod fileChooser to the button when it is pressed


12.

We will
r
ound out the input part with a
submission button

a.

A
dd a Button names Execute


b.

Add the following code below the fileChooser method

i.

The method execute sets initializes the progress bar

ii.

The class Task manages the progress bar and calls the runExecute method

iii.

The runExecute method is where the computation is done (we will be adding to
this later)


@Action

public void execute(){

statusAnimationLabel.setIcon(busyIcons[0]);

busyIconIndex = 0;


busyIconTimer.start();


progressBar.setVisible(true);


progressBar.setIndeterminate(true);


jButton1.setEnabled(false);


task = new Task(
);


task.addPropertyChangeListener(propertyChangeListener);


task.execute(); // just like
run
,

different from this
execute

}



private void runExecute() throws IOException{


String dir = this.direction.getSelected
Item().toString();


int mm = Integer.parseInt(this.mismatch.getValue().toString());


int gcm = Integer.parseInt(this.gcmin.getValue().toString());


boolean trans = this.transitions.isSelected();


String srch = this.search.getTex
t();

}


private Task task;

class Task extends SwingWorker<Void, Void> {

/*



* Main task. Executed in background thread.



*/


@Override


public Void doInBackground() throws IOException {



runExecute();


return null;



}



/*



* Executed in event dispatch thread



*/


public void done() {


// Beep


Toolkit.getDefaultToolkit().beep();



// reset the sta
tus bar


busyIconTimer.stop();


statusAnimationLabel.setIcon(idleIcon);


progressBar.setVisible(false);


progressBar.setValue(0);



// enable the execute button


jButton1.setEnabled(true);




}

}





/**




* Invoked when task's progress property changes.




*/

public void propertyChange(PropertyChangeEvent evt) {



if ("progress" == evt.getPropertyName()) {



int progress = (Integer) evt.getNewValue();



progressBar.setIndeterminate(false);



progressBar.setVisible(false);



progressBar.setValue(progress);





}




}

PropertyChangeListener propertyChangeListener = new
PropertyChangeListener() {



public void
propertyChange(PropertyChangeEvent propertyChangeEvent) {



String property = propertyChangeEvent.getPropertyName();

}

};

c.

Double
-
click on the button and set the action to

execute



BUILDING THE OUTPUT

1.

Add another Panel
below the input
and name it Output

2.

Drag a Table Control object into that new Output Pane

a.

Change the variable name to results


3.

Go to the source view and add the following
line
before

the execute method

(required import of
DefaultTableModel)

a.

The table model controls the jTable content


private DefaultTableModel model

= new DefaultTableModel();


4.

Let

s add a label for the total number in the result set

a.

Drag a Label between the top of the Table and the Panel

b.

Set the text to

---


c.

Change th
e variable name to resultsize


5.

Now we need to write th
e methods to
process the input

a.

Create a new package called
“compute”

with a new method named “Compute”

b.

Replace this class with the code provided at the end of this tutorial

c.

Go back to GisoDemo and enter the source view

i.

Add the

following code the
end

of the runE
xecute meth
od


results.setAutoCreateRowSorter(true);

model = new DefaultTableModel();

Compute c = new Compute(inF
ile, dir, trans, mm, gcm, srch,
model);

results.setModel(model);

this.resultsize.setText(model.getRowCount() + " Results");


6.

We need to assign the new DefaultTableModel to the jTable

a.

In design view, select the
jTable: Properties


model


Set jTable’s model property
using = Custom code, jTable1.setModel = model


7.

The last thing we

ll cover is the crea
tion of menu items with preset values

a.

In design vie
w, go to the Inspector window (lower
-
left) and right
-
click on menuBar


Add menu

b.

Change the variable name to presetMenu and set the text to Pres
ets

c.

Drag it to the second
position


d.

Right
-
click on presetMenu in the Inspector and add three menu items (
Add F
rom Palette


Menu I
tem
)

i.

Change the variable name to
noTrans
and set the text to
No Trans

ii.

Change the variable name to
trans

and set the text to
Trans

iii.

Change the variable name to
reverse

and set the text to
Reverse


e.

We need to add the actions to the source

(we still have to add the file from the GUI)



@Action


pub
lic void noTrans(){


this.direction.setSelectedIndex(0);


this.mismatch.setValue(25);


this.gcmin.setValue(25);


this.transitions.setSelected(false);


this.search.setText("ATGAAG");


}



@Action


public void trans(){


this.direction.setSelectedIndex(0);


this.mismatch.setValue(25);


this.gcmin.setValue(25);


this.transitions.setSelected(true);



this.search.setText("ATGAa
G");


}



@Action


public void
reverse(){


this.direction.setSelectedIndex(1);


this.mismatch.setValue(25);


this.gcmin.setValue(25);


this.transitions.setSelected(true);


this.search.setText("ATg
AAG");


}


f.

Back in the Design view, click on Prese
ts in the menu bar and add the appropriate action
to each of the menu items


8.

That

s it
! Clean and Build then Run (a sequence file is also provided in this document)

9.

Additionally, to change
the application title and About box, go to gisodemo.resources and edit
GisoDemoAboutBox
.properties

and GisoDemoApp.properties











COMPUTE.java

package compute;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileReader;

import java.io.IOException;

import javax.swing.table.DefaultTableModel;


/**


*


* @author Ray


*/

public class Compute {


StringBuilder sequence = null;


boolean transitions = false;


int mismatch = 0;


int gcmin = 0;


String search = null;


String direction = null;


DefaultTableModel model = null;



publi
c Compute(File f, String direction, boolean transitions, int mismatch,
int gcmin, String search, DefaultTableModel model) throws IOException{


this.direction = direction;


this.transitions = transitions;


this.mismatch = mismatch;



this.gcmin = gcmin;


this.search = search;


this.model = model;


this.sequence = new StringBuilder();


FileReader fr = new FileReader(f);


BufferedReader br = new BufferedReader(fr);


String s;


String seqHeader = "", accession = "";


while((s = br.readLine()) != null) {


if(s.charAt(0) == '>'){


seqHeader = s;


// 0=gi, 1=gi
-
number, 2=from datasource, 3=accession, 4=locus


Str
ing[] t = s.split("|");


accession = t[3];


} else {


sequence.append(s.toUpperCase());


}


}


fr.close();


if(direction.equalsIgnoreCase("REVERSE")){


StringBuilder t = ne
w StringBuilder();


for(int i=this.sequence.length()
-
1; i>=0; i
--
){


t.append(this.sequence.charAt(i));


}


this.sequence.delete(0, this.sequence.length());


this.sequence = t;


}


mo
del.addColumn("Match");


model.addColumn("Offset");


model.addColumn("Mismatch%");


model.addColumn("GC%");


this.compute(false);


}



private void compute(boolean sortKey) {


// iterate over the sequence


boolean loop = true;


int pos = 0;


while (loop) {


boolean match = false;


String v = sequence.substring(pos, pos + search.length());


if(transitions){


this.trans(v, search, pos);



} else {


this.exact(v, search.toUpperCase(), pos);


}


if (sequence.length()
-

search.length() == pos) {


loop = false;


}


pos++;


}


}



private void exact(St
ring v, String seq, int offset) {


double mis = 0.0d;


double gc = 0.0d;


boolean match = false;


StringBuilder s = new StringBuilder();


// compare each nucleotide


for (int i = 0; i < v.length(); i++) {



char n = seq.charAt(i); // the search sequence


char t = v.charAt(i);


s.append(t);


if(t == 'C' || t == 'G'){


gc += 100/v.length();


}


if(n != t){


mis += 100/v.length();


}


if (i + 1 == v.length()) {


if(mis <= this.mismatch && gc >= this.gcmin){


match = true;


}


}


}


if(match){



Object[] newRow = {s.toString(), offset, mis, gc};


model.addRow(newRow);


}


}



private void trans(String v, String seq, int offset) {


double mis = 0.0d;


double gc = 0.0d;


int length = v.length();



boolean match = false;


StringBuilder s = new StringBuilder();


// compare each nucleotide


for (int i = 0; i < length; i++) {


char n = seq.charAt(i); // the search sequence


char t = v.charAt(i);



s.append(t);


if(t == 'C' || t == 'G'){


gc += 100/length;


}


if(n == 'A' || n == 'C' || n == 'G' || n == 'T'){


if(n != t){


mis += 100/length;


}


} else if(n == 'a' || n == 'g'){


if(t == 'C' || t == 'T'){


mis += 100/length;


}


} else if(n == 'c' || n == 't'){


if(t == 'A' || t == 'G'){


mis +
= 100/length;


}


}



if (i + 1 == v.length()) {


if(mis <= this.mismatch && gc >= this.gcmin){


match = true;


}


}


}


if(match){


O
bject[] newRow = {s.toString(), offset, mis, gc};


model.addRow(newRow);


}


}

}
























SAMPLE SEQUENCE

>gi|gi
-
number|from|accession|locus

ATGACCGACCTCTTGAGAAGTGTTGTCACCGTAATTGATGTTTTCTACAA

ATACACCAAGCAAGATGGGGAGTGTGGCACACTGAGCAAGGGTGAACTAA

AGGAACTTCTGGAGAAAGAGCTTCATCCAGTTCTGAAGAACCCAGATGAT

CCAGACACAGTGGATGTCATCATGCATATGCTGGATCGAGATCATGACAG

AAGATTGGACTTTACTGAGTTTCTTTTGATGATATTCAAGCTGACTATGG

CCTGCAACAAGGTCCTCAGCAAAGAATACTGCAAAGCTTCAGGGTCAAAG

AAGCATAGGCGTGGTCACCGACACCAAGAAGAAGAAAGTGAAACAGAAGA

G
GATGAAGAGGATACACCAGGACATAAATCAGGTTACAGACATTCAAGTT

GGAGTGAGGGAGAGGAGCATGGATATAGTTCTGGGCACTCAAGGGGAACT

GTGAAATGTAGACATGGGTCCAACTCCAGGAGGCTAGGAAGACAAGGTAA

TTTATCCAGCTCTGGGAACCAAGAGGGATCTCAGAAAAGATACCACAGGT

CCAGCTGTGGTCATTCATGGAGTGGTGGCAAAGACAGACATGGTTCCAGC

TC
TGTAGAACTGAGAGAAAGAATAAACAAGTCACACATTAGCCCTTCTAG

GGAATCTGGGGAGGAGTATGAATCTGGATCTGGATCAAACAGTTGGGAAA

GGAAAGGTCATGGTGGTCTGTCATGTGGATTGGAGACTAGTGGGCATGAA

TCAAACTCTACTCAGTCAAGAATTAGAGAACAAAAGCTTGGGTCTAGCTG

TTCAGGTTCAGGAGACAGTGGGAGGCGAAGTCATGCATGTGGTTATAGCA

ATT
CAAGTGGGTGTGGAAGGCCACAAAATGCTTCAAGTTCTTGTCAGTCA

CATAGATTTGGAGGGCAAGGAAATCAATTTAGCTATATTCAGTCAGGCTG

TCAGTCAGGAATTAAGGGAGGACAAGGCCATGGCTGTGTCTCAGGAGGTC

AGCCCTCTGGATGTGGTCAACCTGAGTCTAACCCCTGTAGTCAGTCCTAT

AGTCAGAGAGGATATGGAGCTAGAGAAAATGGTCAACCACAGAACTGTGG

AGGA
CAATGGAGAACAGGCTCAAGTCAGTCCTCTTGCTGTGGACAATATG

GGTCTGGAGGTAGCCAGTCTTGTAGTAATGGTCAACATGAATATGGTTCC

TGTGGCCGCTTTTCAAACTCTTCTAGTTCAAATGAATTTTCCAAATGTGA

TCAATATGGGTCTGGTTCAAGTCAGTCTACTAGCTTTGAACAACATGGAA

CAGGCTTGAGTCAGTCCTCTGGGTTCGAACAACATGTATGTGGCTCAGGT

CAAAC
TTGTGGCCAGCATGAGTCTACATCAAGTCAATCCTTGGGCTATGA

CCAGCATGGGTCTAGCTCAGGTAAGACATCTGGCTTTGGACAACATGGGT

CTGGCTCAGGTCAGTCCTCTGGCTTTGGACAATGTGGGTCAGGCTCAGGT

CAGTCCTCTGGCTTTGGACAGCATGGGTCTGTCTCAGGACAATCCTCTGG

TTTTGGACAGCATGGGTCTGTCTCAGGACAATCCTCTGGTTTTGGACAAC

ATGAGTCTAGATCACGTCAGTCTAGCTATGGCCAACATGGTTCTGGCTCA

AGTCAATCATCTGGCTATGGCCAATATGGGTCTAGAGAGACATCTGGCTT

TGGACAACATGGGTTGGGCTCAGGTCAATCCACTGGCTTTGGCCAATATG

GATCGGGCTCAGGTCAGTCCTCTGGCTTTGGACAACATGGGTCTGGCTCA

GGACAATCCTCTGGCTTTGGACAACATGAGTCTAGATCAGGTCAGTCTAG

T
TATGGCCAACACAGTTCTGGCTCAAGTCAGTCATCTGGCTATGGCCAAC

ATGGGTCTAGACAGACATCTGGCTTTGGACAACATGGGTCAGGCTCAAGT

CAATCCACTGGCTTTGGCCAATATGGATCAGGCTCAGGTCAGTCCTCTGG

CTTTGGACAACATGTTTCTGGCTCAGGACAATCCTCTGGTTTTGGACAAC

ATGAGTCTAGATCAGGTCATTCTAGCTATGGCCAACATGGTTTTGGCTCA

AG
TCAATCATCTGGCTATGGTCAACATGGGTCAAGTTCAGGACAGACATC

TGGATTTGGACAACACGAGTTAAGCTCAGGTCAGTCTTCCAGCTTTGGCC

AACATGGATCAGGCTCAGGTCAGTCCTCTGGCTTTGGACAACATGGGTCT

GGCTCAGGACAATCCTCTGGCTTTGGACAACATGAGTCTAGATCAGGTCA

GTCTAGCTATGGCCAACACAGTTCTGGCTCAAGTCAGTCATCTGGCTATG

GCC
AACATGGGTCTAGACAGACATCTGGCTTTGGACAACATGGGTCAGGC

TCAAGTCAATCCACTGGCTTTGGCCAATATGGATCAGGCTCAGGTCAGTC

CGCTGGCTTTGGACAACATGGGTCTGGCTCAGGACAATCCTCTGGCTTTG

GACAGCATGAGTCTAGATCACATCAGTCCAGCTATGGCCAACATGGTTCT

GGCTCAAGTCAATCATCTGGCTATGGTCAACATGGGTCAAGTTCGGGACA

GACA
TCTGGCTTTGGACAACACAGGTCAAGCTCAGGTCAATACTCTGGCT

TTGGACAACATGGATCAGGCTCAGGTCAGTCCAGTGGCTTTGGACAACAT

GGGACTGGCTCAGGACAATACTCTGGTTTTGGACAACATGAGTCTAGATC

ACATCAGTCTAGCTATGGCCAACATGGTTCTGGCTCAAGTCAGTCATCTG

GCTATGGTCAACATGGGTCAAGTTCAGGACAGACTTTTGGATTTGGACAA

CACAGGTCAGGCTCAGGTCAATCCTCTGGCTTTGGCCAACATGGATCAGG

CTCAGGTCAGTCCTCTGGCTTTGGACAACATGAGTCAGGCTCAGGAAAAT

CCTCTGGCTTTGGACAGCATGAGTCTAGATCAAGTCAGTCTAATTATGGC

CAACATGGTTCTGGCTCAAGTCAGTCATCTGGCTATGGTCAACATGGGTC

TAGTTCAGGACAGACAACTGGCTTTGGACAACACAGGTCAAGCTCAGGCC

A
ATACTCAGGCTTTGGACAACATGGATCAGGCTCAGATCAGTCCTCTGGC

TTTGGACAACATGGGACTGGTTCAGGACAATCCTCTGGTTTTGGACAATA

TGAGTCTAGATCACGTCAGTCTAGCTATGGCCAACATGGTTCTGGCTCAA

GTCAATCATCTGGCTATGGTCAACATGGGTCAAATTCAGGACAGACATCT

GGATTTGGACAACACAGGCCAGGCTCAGGTCAGTCCTCTGGCTTTGGCCA

AT
ATGGATCGGGCTCAGGTCAGTCTTCTGGCTTTGGACAACATGGGTCAG

GCACAGGTAAATCCTCTGGCTTTGCACAGCATGAGTACAGATCAGGTCAG

TCTAGCTATGGCCAACATGGTACTGGCTCCAGTCAATCATCTGGCTGTGG

CCAACATGAGTCTGGCTCAGGTCCAACCACAAGTTTTGGACAGCATGTGT

CTGGCTCAGACAATTTCTCTAGTTCTGGACAACATATATCTGACTCAGGT

CAG
TCCACTGGATTTGGCCAATATGGTTCAGGCTCAGGTCAATCAACTGG

CTTGGGCCAGGGTGAATCTCAACAAGTAGAGTCAGGATCCACAGTTCATG

GGAGACAGGAAACTACTCATGGTCAGACAATAAATACCACTAGACATAGC

CAGTCTGGTCAAGGACAATCCACACAGACAGGGTCCAGGGTAACTAGAAG

ACGAAGATCTAGCCAAAGTGAGAACAGTGACAGTGAAGTGCACTCAAAGG

TCTC
ACACAGACATTCAGAACACATTCACACACAAGCTGGATCTCACTAC

CCAAAGTCAGGATCCACAGTTCGCAGAAGACAAGGAACTACTCATGGACA

GAGAGGAGATACCACTAGACATGGCCATTCTGGTCATGGACAGTCTACAC

AGACAGGTTCCAGAACATCTGGAAGACAGAGATTTAGCCACAGTGATGCC

ACTGACAGTGAAGTGCACTCAGGGGTCTCACATAGACCACACTCACAAGA

ACAAA
CTCACAGCCAAGCTGGATCTCAACATGGAGAGTCAGAATCCACAG

TTCATGAGAGACATGAAACTACTTATGGACAGACAGGAGAGGCCACTGGA

CATGGCCACTCTGGTCATGGACAGTCCACACAGAGAGGGTCCAGGACAAC

TGGAAGAAGGGGATCTGGCCATAGTGAGTCCAGTGACAGTGAAGTGCACT

CAGGGGGCTCACACAGACCACAATCACAAGAACAAACTCATGGCCAAGCC

GGATCTCAACATGGAGAGTCAGGATCCACAGTTCATGGGAGACACGGAAC

TACTCATGGACAGACAGGAGATACCACTAGACATGCCCACTATCATCATG

GAAAATCCACACAGAGAGGGTCCAGTACAACTGGAAGAAGGGGATCTGGC

CACAGTGAGTCCAGTGACAGTGAAGTGCACTCAGGGGGCTCGCACACACA

TTCAGGACACACTCACGGCCAAAGTGGATCTCAACATGGAGAGTCAGAAT

C
CATAATTCATGACAGACACAGAATTACTCATGGACAGACAGGAGATACC

ACTAGACATTCCTACTCTGGTCATGAACAAACCACACAGACAGGGTCCAG

GACAACTGGAAGACAGAGAACTAGCCACAGTGAGTCCACTGACAGTGAAG

TGCACTCAGGGGGCTCACACAGACCACACTCACGAGAACACACTTACGGC

CAAGCCGGATCTCAACATGAAGAGCCAGAATTCACAGTTCATGAGAGACA

CG
GAACTACTCATGGACAGATAGGAGATACCACTGGACATTCCCACTCTG

GTCATGGACAGTCCACACAGAGAGGGTCCAGGACAACTGGAAGACAGAGA

TCTAGCCACAGTGAGTCCAGTGACAGTGAAGTGCACTCAGGGGTCTCACA

CACACATACAGGACACACTCATGGTCAAGCTGGATCTCAACATGGACAGT

CAGAATCCATAGTTCCTGAGAGACATGGAACTACTCATGGACAGACAGGA

GAT
ACCACTAGACATGCCCACTATCATCATGGATTAACCACACAGACAGG

GTCCAGGACTACTGGAAGAAGGGGATCTGGCCACAGTGAGTACAGTGACA

GTGAAGGGTACTCAGGAGTCTCACATACACATTCAGGACACACTCATGGC

CAAGCCAGATCTCAACATGGAGAGTCAGAATCCATAGTTCATGAGAGACA

TGGAACTATACATGGACAGACAGGCGATACCACCAGACATGCCCACTCTG

GTCA
TGGACAGTCCACACAGACAGGGTCCAGGACCACTGGAAGAAGGTCA

TCTGGCCACAGTGAGTACAGTGACAGTGAAGGGCACTCAGGGTTCTCACA

AAGACCACACTCACGAGGACACACTCACGGCCAGGCTGGATCTCAACATG

GAGAGTCAGAATCCATAGTTGACGAGAGACATGGAACTACTCATGGACAG

ACAGGAGATACCAGTGGACATTCTCAATCTGGTCATGGACAGTCCACACA

GTCAG
GATCCAGTACAACTGGAAGAAGGAGATCTGGCCACAGTGAGTCCA

GTGACAGTGAAGTGCACTCAGGGGGCTCACATACACATTCAGGACACACA

CACAGCCAAGCCAGGTCTCAACATGGAGAGTCAGAATCCACAGTTCACAA

GAGACACCAAACTACTCATGGACAGACAGGAGATACCACTGAACATGGCC

ACCCTAGTCATGGACAAACCATACAGACAGGGTCCAGGACAACTGGAAGA

AGGGGATCTGGCCACAGTGAGTACAGTGACAGTGAAGGGCCCTCAGGGGT

CTCACACACACATTCAGGACACACTCACGGTCAAGCTGGATCTCACTATC

CAGAGTCAGGATCCTCAGTTCATGAGAGACACGGAACTACTCATGGACAA

ACAGCAGATACCACTAGACATGGCCACTCTGGTCATGGACAGTCCACACA

GAGAGGGTCCAGGACAACTGGAAGAAGGGCATCTGGCCACAGTGAGTACA

G
TGACAGTGAAGGGCACTCAGGGGTCTCACACACACATTCAGGACACGCT

CATGGCCAAGCCGGATCTCAACATGGAGAGTCAGGATCCTCAGTTCATGA

GAGACACGGAACTACTCATGGACAGACAGGAGATACCACTAGACATGCTC

ACTCTGGTCATGGACAGTCCACACAGAGAGGGTCAAGGACAGCTGGAAGA

AGGGGATCTGGCCACAGTGAGTCCAGTGACAGTGAAGTGCACTCAGGGGT

CT
CACACACACATTCAGGACACACTTATGGCCAAGCCAGATCTCAACATG

GAGAGTCAGGATCTGCCATTCACGGGAGACAGGGAACTATACATGGACAG

ACAGGAGATACCACTAGACATGGCCAGTCTGGTCATGGACAGTCCACACA

GACAGGTTCCAGGACAACTGGAAGACAAAGATCTAGTCACAGTGAGTCCA

GTGATAGTGAAGTGCACTCAGAGGCCTCACCCACACATTCAGGACACACT

CAC
AGCCAAGCCGGATCTCGACATGGACAGTCAGGATCCTCAGGTCATGG

GAGACAGGGAACTACTCATGGACAGACAGGAGATACCACTAGACATGCCC

ACTATGGTTATGGACAATCCACACAGAGAGGGTCCAGGACAACTGGAAGA

AGGGGATCTGGCCACAGTGAGTCCAGTGACAGTGAAGTGCACTCATGGGG

CTCACACACACATTCAGGACACATTCAGGGCCAAGCTGGATCTCAACAAA

GACA
GCCAGGATCCACAGTTCATGGGAGACTGGAAACTACTCATGGACAG

ACAGGAGATACCACTAGACATGGCCATTCTGGTTATGGACAATCCACACA

GACAGGTTCCAGATCTAGTAGAGCAAGTCATTTTCAGTCACATAGTAGTG

AAAGGCAAAGGCATGGATCAAGTCAGGTTTGGAAACATGGCAGCTATGGA

CCTGCAGAATATGACTATGGGCACACTGGGTATGGGCCTTCTGGTGGCAG

CAGAA
AAAGCATCAGTAATTCTCACCTTTCATGGTCAACAGACAGCACTG

CAAACAAGCAACTGTCTAGACATTGA