changeset 0:b386032d758d draft

planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/meme commit 42fa6e319cf1a97330818dc8c869871a32f0e7aa
author iuc
date Wed, 25 Apr 2018 12:13:22 -0400
parents
children cb8a2242bf03
files all_fasta.loc.sample dreme.xml fimo_wrapper.py macros.xml test-data/dreme1.html test-data/dreme1.txt test-data/dreme1.xml test-data/dreme2.html test-data/dreme2.txt test-data/dreme_test_sites.fa test-data/fimo_output_almost-gff_1.txt test-data/fimo_output_almost-gff_2.txt test-data/fimo_output_html_1.html test-data/fimo_output_html_2.html test-data/fimo_output_interval_1.txt test-data/fimo_output_interval_2.txt test-data/fimo_output_txt_1.txt test-data/fimo_output_txt_2.txt test-data/fimo_output_xml_1.xml test-data/fimo_output_xml_2.xml test-data/meme_input_1.fasta test-data/meme_output_html_1.html test-data/meme_output_html_2.html test-data/meme_output_txt_1.txt test-data/meme_output_txt_2.txt test-data/meme_output_xml_1.xml test-data/meme_output_xml_2.xml test-data/meme_psp_gen_reports_output.tabular test-data/meme_psp_protein_input.fasta test-data/motif1.gff test-data/output.memepsp test-data/phiX.fasta test-data/prior30.plib tool_data_table_conf.xml.sample
diffstat 34 files changed, 19462 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/all_fasta.loc.sample	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,18 @@
+#This file lists the locations and dbkeys of all the fasta files
+#under the "genome" directory (a directory that contains a directory
+#for each build). The script extract_fasta.py will generate the file
+#all_fasta.loc. This file has the format (white space characters are
+#TAB characters):
+#
+#<unique_build_id>	<dbkey>	<display_name>	<file_path>
+#
+#So, all_fasta.loc could look something like this:
+#
+#apiMel3	apiMel3	Honeybee (Apis mellifera): apiMel3	/path/to/genome/apiMel3/apiMel3.fa
+#hg19canon	hg19	Human (Homo sapiens): hg19 Canonical	/path/to/genome/hg19/hg19canon.fa
+#hg19full	hg19	Human (Homo sapiens): hg19 Full	/path/to/genome/hg19/hg19full.fa
+#
+#Your all_fasta.loc file should contain an entry for each individual
+#fasta file. So there will be multiple fasta files for each build,
+#such as with hg19 above.
+#
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dreme.xml	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,136 @@
+<tool id="meme_dreme" name="DREME" version="@WRAPPER_VERSION@.0">
+    <description>- Discriminative Regular Expression Motif Elicitation</description>
+    <macros>
+        <import>macros.xml</import>
+    </macros>
+    <expand macro="requirements" />
+    <command detect_errors="exit_code"><![CDATA[
+dreme
+    -o ./dreme_out
+    -p '$pos_fasta_file'
+    $norc
+    $alphabet_type
+    #if str( $neg_set_type.neg_set_type_selector ) == 'shuffle_negs':
+        -s '${$neg_set_type.pos_shuffle_seed}'
+    #elif str( $neg_set_type.neg_set_type_selector ) == 'supply_negs':
+        -n '${$neg_set_type.neg_fasta_file}'
+    #end if
+    #if str( $options_type.options_type_selector ) == 'advanced':
+        -e $options_type.e_value_thr
+        #if $options_type.stop_m_motifs
+            -m $options_type.stop_m_motifs
+        #end if
+        #if $options_type.stop_t_seconds
+            -t $options_type.stop_t_seconds
+        #end if
+        -g $options_type.nr_res_generalize
+        -mink $options_type.motif_min_k
+        -maxk $options_type.motif_max_k
+    #end if
+    ]]></command>
+    <inputs>
+        <param name="pos_fasta_file" type="data" format="fasta" label="Positive FASTA sequence file" argument="-p"
+               help="positive (primary) sequence file"/>
+        <param name="alphabet_type" type="select" label="Type of sequence alphabet">
+            <option value="-dna" selected="true">DNA (default)</option>
+            <option value="-rna">RNA</option>
+            <option value="-protein">Protein</option>
+        </param>
+        <param argument="-norc" label="Check reverse complement" type="boolean"
+               truevalue="" falsevalue="-norc" checked="False"
+               help="Search for motifs also on reverse complement strand"/>
+        <conditional name="neg_set_type">
+            <param name="neg_set_type_selector" type="select" label="Negative set definition">
+                <option value="shuffle_negs" selected="true">Shuffle positive sequences</option>
+                <option value="supply_negs">Supply negative sequences</option>
+            </param>
+            <when value="shuffle_negs">
+                <param name="pos_shuffle_seed" type="integer" value="1"
+                       label="Seed for shuffling positive sequences" argument="-s"
+                       help="(default: 1)"/>
+            </when>
+            <when value="supply_negs">
+                <param name="neg_fasta_file" type="data" format="fasta"
+                       label="Negative FASTA sequence file" argument="-n"
+                       help="negative (control) sequence file (default: positive sequences are shuffled to create the negative set)"/>
+            </when>
+        </conditional>
+        <conditional name="options_type">
+            <param name="options_type_selector" type="select" label="Options Configuration">
+                <option value="basic" selected="true">Basic</option>
+                <option value="advanced">Advanced</option>
+            </param>
+            <when value="basic" />
+            <when value="advanced">
+                <param name="e_value_thr" type="float" value="0.05"
+                       label="stop if motif E-value > e" argument="-e"
+                       help="stop if motif E-value > given threshold (default: 0.05)">
+                       <validator type="expression" message="Set e-value must be > 0.">value is not None and value > 0</validator>
+                </param>
+                <param name="motif_min_k" type="integer" value="3" min="1"
+                       label="Minimum width of core motif" argument="-mink"
+                       help="minimum width of core motif (default: 3)"/>
+                <param name="motif_max_k" type="integer" value="8" min="1"
+                       label="Maximum width of core motif" argument="-maxk"
+                       help="maximum width of core motif (default: 8)"/>
+                <param name="stop_m_motifs" type="integer" optional="True" min="1"
+                       label="Stop if m motifs have been output" argument="-m"
+                       help="stop if m motifs have been output (default: only stop at E-value threshold)"/>
+                <param name="stop_t_seconds" type="integer" optional="True" min="1"
+                       label="Stop if the specified time has elapsed" argument="-t"
+                       help="stop if the specified time has elapsed (default: only stop at E-value threshold)"/>
+                <param name="nr_res_generalize" type="integer" value="100" min="1"
+                       label="Number of REs to generalize" argument="-g"
+                       help="number of REs to generalize (default: 100) (Hint: Increasing n will make the motif search more thoroughly at some cost in speed)"/>
+            </when>
+        </conditional>
+        <param name="non_commercial_use" label="I certify that I am not using this tool for commercial purposes." type="boolean" truevalue="NON_COMMERCIAL_USE" falsevalue="COMMERCIAL_USE" checked="False">
+            <validator type="expression" message="This tool is only available for non-commercial use.">value == True</validator>
+        </param>
+    </inputs>
+    <outputs>
+        <data format="html" name="html_outfile" label="${tool.name} on ${on_string} (html)" from_work_dir="dreme_out/dreme.html"/>
+        <data format="txt" name="txt_outfile" label="${tool.name} on ${on_string} (text)" from_work_dir="dreme_out/dreme.txt"/>
+        <data format="memexml" name="xml_outfile" label="${tool.name} on ${on_string} (xml)" from_work_dir="dreme_out/dreme.xml"/>
+    </outputs>
+    <tests>
+        <test>
+            <param name="pos_fasta_file" value="dreme_test_sites.fa" ftype="fasta"/>
+            <param name="alphabet_type" value="-rna"/>
+            <param name="norc" value="false"/>
+            <param name="non_commercial_use" value="True"/>
+            <output name="html_outfile" file="dreme1.html" lines_diff="16"/>
+            <output name="txt_outfile" file="dreme1.txt" lines_diff="22"/>
+        </test>
+        <test>
+            <param name="pos_fasta_file" value="dreme_test_sites.fa" ftype="fasta"/>
+            <param name="alphabet_type" value="-rna"/>
+            <param name="norc" value="false"/>
+            <param name="options_type_selector" value="advanced"/>
+            <param name="e_value_thr" value="0.00001"/>
+            <param name="motif_min_k" value="4"/>
+            <param name="motif_max_k" value="10"/>
+            <param name="non_commercial_use" value="True"/>
+            <output name="html_outfile" file="dreme2.html" lines_diff="29"/>
+            <output name="txt_outfile" file="dreme2.txt" lines_diff="29"/>
+        </test>
+    </tests>
+    <help><![CDATA[
+    DREME (Discriminative Regular Expression Motif Elicitation) discovers short, ungapped motifs (recurring, fixed-length patterns) that are relatively enriched in your sequences compared with shuffled sequences or given control sequences.
+
+    DREME finds relatively short motifs (up to 8 positions) fast. The input to DREME is one or two sets of sequences. The control (-n parameter) sequences should be approximately the same length as the primary (-p parameter) sequences. If you do not provide a control set, the program shuffles the primary set to provide a control set. The program uses Fisher's Exact Test to determine significance of each motif found in the postive set as compared with its representation in the control set, using a significance threshold that may be set (-e parameter).
+
+    DREME achieves its high speed by restricting its search to regular expressions based on the IUPAC alphabet representing bases and ambiguous characters, and by using a heuristic estimate of generalised motifs' statistical significance.
+
+.. class:: infomark
+
+For detailed information on DREME, click here_, or view the license_.
+
+.. _here: http://meme-suite.org/doc/dreme.html
+.. _license: http://meme-suite.org/doc/copyright.html
+
+    ]]></help>
+    <citations>
+        <citation type="doi">10.1093/bioinformatics/btr261</citation>
+    </citations>
+</tool>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fimo_wrapper.py	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,194 @@
+#!/usr/bin/env python
+import argparse
+import os
+import shutil
+import string
+import subprocess
+import sys
+import tempfile
+
+BUFFSIZE = 1048576
+# Translation table for reverse Complement, with ambiguity codes.
+DNA_COMPLEMENT = string.maketrans("ACGTRYKMBDHVacgtrykmbdhv", "TGCAYRMKVHDBtgcayrmkvhdb")
+
+
+def get_stderr(tmp_stderr):
+    tmp_stderr.seek(0)
+    stderr = ''
+    try:
+        while True:
+            stderr += tmp_stderr.read(BUFFSIZE)
+            if not stderr or len(stderr) % BUFFSIZE != 0:
+                break
+    except OverflowError:
+        pass
+    return stderr
+
+
+def reverse(sequence):
+    # Reverse sequence string.
+    return sequence[::-1]
+
+
+def dna_complement(sequence):
+    # Complement DNA sequence string.
+    return sequence.translate(DNA_COMPLEMENT)
+
+
+def dna_reverse_complement(sequence):
+    # Returns the reverse complement of the sequence.
+    sequence = reverse(sequence)
+    return dna_complement(sequence)
+
+
+def stop_err(msg):
+    sys.stderr.write(msg)
+    sys.exit(1)
+
+
+parser = argparse.ArgumentParser()
+parser.add_argument('--input_motifs', dest='input_motifs', help='MEME output formatted files for input to fimo')
+parser.add_argument('--input_fasta', dest='input_fasta', help='Fassta sequence file')
+parser.add_argument('--options_type', dest='options_type', help='Basic or Advance options')
+parser.add_argument('--input_psp', dest='input_psp', default=None, help='File containing position specific priors')
+parser.add_argument('--input_prior_dist', dest='input_prior_dist', default=None, help='File containing binned distribution of priors')
+parser.add_argument('--alpha', dest='alpha', type=float, default=1.0, help='The alpha parameter for calculating position specific priors')
+parser.add_argument('--bgfile', dest='bgfile', default=None, help='Background file type, used only if not "default"')
+parser.add_argument('--max_strand', action='store_true', help='If matches on both strands at a given position satisfy the output threshold, only report the match for the strand with the higher score')
+parser.add_argument('--max_stored_scores', dest='max_stored_scores', type=int, help='Maximum score count to store')
+parser.add_argument('--motif', dest='motifs', action='append', default=[], help='Specify motif by id')
+parser.add_argument('--output_separate_motifs', dest='output_separate_motifs', default='no', help='Output one dataset per motif')
+parser.add_argument('--motif_pseudo', dest='motif_pseudo', type=float, default=0.1, help='Pseudocount to add to counts in motif matrix')
+parser.add_argument('--no_qvalue', action='store_true', help='Do not compute a q-value for each p-value')
+parser.add_argument('--norc', action='store_true', help='Do not score the reverse complement DNA strand')
+parser.add_argument('--output_path', dest='output_path', help='Output files directory')
+parser.add_argument('--parse_genomic_coord', dest='parse_genomic_coord', default='no', help='Check each sequence header for UCSC style genomic coordinates')
+parser.add_argument('--remove_duplicate_coords', dest='remove_duplicate_coords', default='no', help='Remove duplicate entries in unique GFF coordinates')
+parser.add_argument('--qv_thresh', action='store_true', help='Use q-values for the output threshold')
+parser.add_argument('--thresh', dest='thresh', type=float, help='p-value threshold')
+parser.add_argument('--gff_output', dest='gff_output', help='Gff output file')
+parser.add_argument('--html_output', dest='html_output', help='HTML output file')
+parser.add_argument('--interval_output', dest='interval_output', help='Interval output file')
+parser.add_argument('--txt_output', dest='txt_output', help='Text output file')
+parser.add_argument('--xml_output', dest='xml_output', help='XML output file')
+args = parser.parse_args()
+
+fimo_cmd_list = ['fimo']
+if args.options_type == 'advanced':
+    fimo_cmd_list.append('--alpha %4f' % args.alpha)
+    if args.bgfile is not None:
+        fimo_cmd_list.append('--bgfile "%s"' % args.bgfile)
+    if args.max_strand:
+        fimo_cmd_list.append('--max-strand')
+    fimo_cmd_list.append('--max-stored-scores %d' % args.max_stored_scores)
+    if len(args.motifs) > 0:
+        for motif in args.motifs:
+            fimo_cmd_list.append('--motif "%s"' % motif)
+    fimo_cmd_list.append('--motif-pseudo %4f' % args.motif_pseudo)
+    if args.no_qvalue:
+        fimo_cmd_list.append('--no-qvalue')
+    if args.norc:
+        fimo_cmd_list.append('--norc')
+    if args.parse_genomic_coord == 'yes':
+        fimo_cmd_list.append('--parse-genomic-coord')
+    if args.qv_thresh:
+        fimo_cmd_list.append('--qv-thresh')
+    fimo_cmd_list.append('--thresh %4f' % args.thresh)
+    if args.input_psp is not None:
+        fimo_cmd_list.append('--psp "%s"' % args.input_psp)
+    if args.input_prior_dist is not None:
+        fimo_cmd_list.append('--prior-dist "%s"' % args.input_prior_dist)
+fimo_cmd_list.append('--o "%s"' % (args.output_path))
+fimo_cmd_list.append('--verbosity 1')
+fimo_cmd_list.append(args.input_motifs)
+fimo_cmd_list.append(args.input_fasta)
+
+fimo_cmd = ' '.join(fimo_cmd_list)
+
+try:
+    tmp_stderr = tempfile.NamedTemporaryFile()
+    proc = subprocess.Popen(args=fimo_cmd, shell=True, stderr=tmp_stderr)
+    returncode = proc.wait()
+    if returncode != 0:
+        stderr = get_stderr(tmp_stderr)
+        stop_err(stderr)
+except Exception as e:
+    stop_err('Error running FIMO:\n%s' % e)
+
+shutil.move(os.path.join(args.output_path, 'fimo.txt'), args.txt_output)
+
+gff_file = os.path.join(args.output_path, 'fimo.gff')
+if args.remove_duplicate_coords == 'yes':
+    tmp_stderr = tempfile.NamedTemporaryFile()
+    # Identify and eliminating identical motif occurrences.  These
+    # are identical if the combination of chrom, start, end and
+    # motif id are identical.
+    cmd = 'sort -k1,1 -k4,4n -k5,5n -k9.1,9.6 -u -o %s %s' % (gff_file, gff_file)
+    proc = subprocess.Popen(args=cmd, stderr=tmp_stderr, shell=True)
+    returncode = proc.wait()
+    if returncode != 0:
+        stderr = get_stderr(tmp_stderr)
+        stop_err(stderr)
+    # Sort GFF output by a combination of chrom, score, start.
+    cmd = 'sort -k1,1 -k4,4n -k6,6n -o %s %s' % (gff_file, gff_file)
+    proc = subprocess.Popen(args=cmd, stderr=tmp_stderr, shell=True)
+    returncode = proc.wait()
+    if returncode != 0:
+        stderr = get_stderr(tmp_stderr)
+        stop_err(stderr)
+if args.output_separate_motifs == 'yes':
+    # Create the collection output directory.
+    collection_path = (os.path.join(os.getcwd(), 'output'))
+    # Keep track of motif occurrences.
+    header_line = None
+    motif_ids = []
+    file_handles = []
+    for line in open(gff_file, 'r'):
+        if line.startswith('#'):
+            if header_line is None:
+                header_line = line
+            continue
+        items = line.split('\t')
+        attribute = items[8]
+        attributes = attribute.split(';')
+        name = attributes[0]
+        motif_id = name.split('=')[1]
+        file_name = os.path.join(collection_path, 'MOTIF%s.gff' % motif_id)
+        if motif_id in motif_ids:
+            i = motif_ids.index(motif_id)
+            fh = file_handles[i]
+            fh.write(line)
+        else:
+            fh = open(file_name, 'wb')
+            if header_line is not None:
+                fh.write(header_line)
+            fh.write(line)
+            motif_ids.append(motif_id)
+            file_handles.append(fh)
+    for file_handle in file_handles:
+        file_handle.close()
+else:
+    shutil.move(gff_file, args.gff_output)
+shutil.move(os.path.join(args.output_path, 'fimo.xml'), args.xml_output)
+shutil.move(os.path.join(args.output_path, 'fimo.html'), args.html_output)
+
+out_file = open(args.interval_output, 'wb')
+out_file.write("#%s\n" % "\t".join(("chr", "start", "end", "pattern name", "score", "strand", "matched sequence", "p-value", "q-value")))
+for line in open(args.txt_output):
+    if line.startswith('#'):
+        continue
+    fields = line.rstrip("\n\r").split("\t")
+    start, end = int(fields[2]), int(fields[3])
+    sequence = fields[7]
+    if start > end:
+        # Flip start and end and set strand.
+        start, end = end, start
+        strand = "-"
+        # We want sequences relative to strand; FIMO always provides + stranded sequence.
+        sequence = dna_reverse_complement(sequence)
+    else:
+        strand = "+"
+    # Make 0-based start position.
+    start -= 1
+    out_file.write("%s\n" % "\t".join([fields[1], str(start), str(end), fields[0], fields[4], strand, sequence, fields[5], fields[6]]))
+out_file.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/macros.xml	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,11 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<macros>
+    <token name="@WRAPPER_VERSION@">4.11.2</token>
+    <xml name="requirements">
+        <requirements>
+            <requirement type="package" version="1.3.23">graphicsmagick</requirement>
+            <requirement type="package" version="4.11.2">meme</requirement>
+        </requirements>
+    </xml>
+</macros>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/dreme1.html	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,6199 @@
+<!DOCTYPE HTML>
+<html>
+  <head>
+    <meta charset="UTF-8">
+    <title>DREME</title>
+    <script>
+      // @JSON_VAR data
+      var data = {
+        "program": "dreme",
+        "version": "4.11.2",
+        "release": "Thu May 05 14:58:55 2016 -0700",
+        "cmd": [
+          "dreme", "-o", "./output", "-p",
+          "/tmp/tmpijN1y0/files/000/dataset_1.dat", "-norc", "-rna", "-s",
+          "1"
+        ],
+        "options": {
+          "revcomp": false,
+          "ngen": 100,
+          "add_pv_thresh": 0.01,
+          "seed": 1,
+          "stop": {
+            "evalue": "0.05"
+          }
+        },
+        "alphabet": {
+          "name": "RNA",
+          "like": "rna",
+          "ncore": 4,
+          "symbols": [
+            {
+              "symbol": "A",
+              "name": "Adenine",
+              "colour": "CC0000"
+            }, {
+              "symbol": "C",
+              "name": "Cytosine",
+              "colour": "0000CC"
+            }, {
+              "symbol": "G",
+              "name": "Guanine",
+              "colour": "FFB300"
+            }, {
+              "symbol": "U",
+              "aliases": "T",
+              "name": "Uracil",
+              "colour": "008000"
+            }, {
+              "symbol": "N",
+              "aliases": "X.",
+              "name": "Any base",
+              "equals": "ACGU"
+            }, {
+              "symbol": "V",
+              "name": "Not U",
+              "equals": "ACG"
+            }, {
+              "symbol": "H",
+              "name": "Not G",
+              "equals": "ACU"
+            }, {
+              "symbol": "D",
+              "name": "Not C",
+              "equals": "AGU"
+            }, {
+              "symbol": "B",
+              "name": "Not A",
+              "equals": "CGU"
+            }, {
+              "symbol": "M",
+              "name": "Amino",
+              "equals": "AC"
+            }, {
+              "symbol": "R",
+              "name": "Purine",
+              "equals": "AG"
+            }, {
+              "symbol": "W",
+              "name": "Weak",
+              "equals": "AU"
+            }, {
+              "symbol": "S",
+              "name": "Strong",
+              "equals": "CG"
+            }, {
+              "symbol": "Y",
+              "name": "Pyrimidine",
+              "equals": "CU"
+            }, {
+              "symbol": "K",
+              "name": "Keto",
+              "equals": "GU"
+            }
+          ]
+        },
+        "background": {
+          "freqs": [0.221, 0.245, 0.221, 0.312]
+        },
+        "sequence_db": {
+          "name": "dataset 1",
+          "file": "/tmp/tmpijN1y0/files/000/dataset_1.dat",
+          "lmod": "Tue Apr 24 13:55:48 CEST 2018",
+          "count": 1000
+        },
+        "control_db": {
+          "name": "shuffled positive sequences",
+          "from": "shuffled",
+          "count": 1000,
+          "freqs": [0.221, 0.245, 0.221, 0.312]
+        },
+        "motifs": [
+          {
+            "db": 0,
+            "id": "UUYUCY",
+            "alt": "MEME",
+            "len": 6,
+            "nsites": 459,
+            "evalue": "1.2e-013",
+            "p": 387,
+            "n": 210,
+            "pvalue": "2.6e-018",
+            "unerased_evalue": "1.2e-013",
+            "pwm": [
+              [0.000000, 0.000000, 0.000000, 1.000000], 
+              [0.000000, 0.000000, 0.000000, 1.000000], 
+              [0.000000, 0.294118, 0.000000, 0.705882], 
+              [0.000000, 0.000000, 0.000000, 1.000000], 
+              [0.000000, 1.000000, 0.000000, 0.000000], 
+              [0.000000, 0.474946, 0.000000, 0.525054]
+            ],
+            "matches": [
+              {
+                "seq": "UUUUCC",
+                "p": 147,
+                "n": 75,
+                "pvalue": "1.8e-007",
+                "evalue": "8.1e-003"
+              }, {
+                "seq": "UUUUCU",
+                "p": 155,
+                "n": 94,
+                "pvalue": "2.2e-005",
+                "evalue": "1.0e+000"
+              }, {
+                "seq": "UUCUCU",
+                "p": 94,
+                "n": 51,
+                "pvalue": "1.3e-004",
+                "evalue": "6.1e+000"
+              }, {
+                "seq": "UUCUCC",
+                "p": 75,
+                "n": 42,
+                "pvalue": "1.1e-003",
+                "evalue": "5.0e+001"
+              }
+            ]
+          }, {
+            "db": 0,
+            "id": "YAGG",
+            "alt": "MEME",
+            "len": 4,
+            "nsites": 793,
+            "evalue": "5.1e-012",
+            "p": 600,
+            "n": 416,
+            "pvalue": "1.1e-016",
+            "unerased_evalue": "2.4e-012",
+            "pwm": [
+              [0.000000, 0.692308, 0.000000, 0.307692], 
+              [1.000000, 0.000000, 0.000000, 0.000000], 
+              [0.000000, 0.000000, 1.000000, 0.000000], 
+              [0.000000, 0.000000, 1.000000, 0.000000]
+            ],
+            "matches": [
+              {
+                "seq": "CAGG",
+                "p": 441,
+                "n": 304,
+                "pvalue": "1.5e-010",
+                "evalue": "6.6e-006"
+              }, {
+                "seq": "UAGG",
+                "p": 232,
+                "n": 165,
+                "pvalue": "1.1e-004",
+                "evalue": "4.7e+000"
+              }
+            ]
+          }, {
+            "db": 0,
+            "id": "GAAGAW",
+            "alt": "MEME",
+            "len": 6,
+            "nsites": 89,
+            "evalue": "3.4e-005",
+            "p": 81,
+            "n": 22,
+            "pvalue": "8.2e-010",
+            "unerased_evalue": "3.5e-004",
+            "pwm": [
+              [0.000000, 0.000000, 1.000000, 0.000000], 
+              [1.000000, 0.000000, 0.000000, 0.000000], 
+              [1.000000, 0.000000, 0.000000, 0.000000], 
+              [0.000000, 0.000000, 1.000000, 0.000000], 
+              [1.000000, 0.000000, 0.000000, 0.000000], 
+              [0.494382, 0.000000, 0.000000, 0.505618]
+            ],
+            "matches": [
+              {
+                "seq": "GAAGAU",
+                "p": 45,
+                "n": 7,
+                "pvalue": "2.4e-008",
+                "evalue": "9.9e-004"
+              }, {
+                "seq": "GAAGAA",
+                "p": 40,
+                "n": 16,
+                "pvalue": "7.9e-004",
+                "evalue": "3.3e+001"
+              }
+            ]
+          }, {
+            "db": 0,
+            "id": "SMUGGA",
+            "alt": "MEME",
+            "len": 6,
+            "nsites": 119,
+            "evalue": "3.7e-003",
+            "p": 110,
+            "n": 47,
+            "pvalue": "9.1e-008",
+            "unerased_evalue": "2.6e-005",
+            "pwm": [
+              [0.000000, 0.529412, 0.470588, 0.000000], 
+              [0.428571, 0.571429, 0.000000, 0.000000], 
+              [0.000000, 0.000000, 0.000000, 1.000000], 
+              [0.000000, 0.000000, 1.000000, 0.000000], 
+              [0.000000, 0.000000, 1.000000, 0.000000], 
+              [1.000000, 0.000000, 0.000000, 0.000000]
+            ],
+            "matches": [
+              {
+                "seq": "GAUGGA",
+                "p": 22,
+                "n": 6,
+                "pvalue": "1.7e-003",
+                "evalue": "7.1e+001"
+              }, {
+                "seq": "GCUGGA",
+                "p": 33,
+                "n": 14,
+                "pvalue": "3.6e-003",
+                "evalue": "1.5e+002"
+              }, {
+                "seq": "CCUGGA",
+                "p": 32,
+                "n": 15,
+                "pvalue": "8.6e-003",
+                "evalue": "3.5e+002"
+              }, {
+                "seq": "CAUGGA",
+                "p": 29,
+                "n": 13,
+                "pvalue": "9.1e-003",
+                "evalue": "3.7e+002"
+              }
+            ]
+          }
+        ],
+        "runtime": {
+          "host": "ThinkPad-T450s",
+          "when": "Tue Apr 24 13:55:53 CEST 2018",
+          "cpu": 16.65,
+          "real": 16.65,
+          "stop": "evalue"
+        }
+      };
+    </script>
+    <script>
+var site_url = "";
+</script>
+    <script>
+
+/*
+ * $
+ *
+ * Shorthand function for getElementById
+ */
+function $(el) {
+  return document.getElementById(el);
+}
+
+
+/*
+ * See http://stackoverflow.com/a/5450113/66387
+ * Does string multiplication like the perl x operator.
+ */
+function string_mult(pattern, count) {
+    if (count < 1) return '';
+    var result = '';
+    while (count > 1) {
+        if (count & 1) result += pattern;
+        count >>= 1, pattern += pattern;
+    }
+    return result + pattern;
+}
+
+/*
+ * See http://stackoverflow.com/questions/814613/how-to-read-get-data-from-a-url-using-javascript
+ * Slightly modified with information from
+ * https://developer.mozilla.org/en/DOM/window.location
+ */
+function parse_params() {
+  "use strict";
+  var search, queryStart, queryEnd, query, params, nvPairs, i, nv, n, v;
+  search = window.location.search;
+  queryStart = search.indexOf("?") + 1;
+  queryEnd   = search.indexOf("#") + 1 || search.length + 1;
+  query      = search.slice(queryStart, queryEnd - 1);
+
+  if (query === search || query === "") return {};
+
+  params  = {};
+  nvPairs = query.replace(/\+/g, " ").split("&");
+
+  for (i = 0; i < nvPairs.length; i++) {
+    nv = nvPairs[i].split("=");
+    n  = decodeURIComponent(nv[0]);
+    v  = decodeURIComponent(nv[1]);
+    // allow a name to be used multiple times
+    // storing each value in the array
+    if (!(n in params)) {
+      params[n] = [];
+    }
+    params[n].push(nv.length === 2 ? v : null);
+  }
+  return params;
+}
+
+/*
+ * coords
+ *
+ * Calculates the x and y offset of an element.
+ * From http://www.quirksmode.org/js/findpos.html
+ * with alterations to take into account scrolling regions
+ */
+function coords(elem) {
+  var myX = myY = 0;
+  if (elem.getBoundingClientRect) {
+    var rect;
+    rect = elem.getBoundingClientRect();
+    myX = rect.left + ((typeof window.pageXOffset !== "undefined") ?
+        window.pageXOffset : document.body.scrollLeft);
+    myY = rect.top + ((typeof window.pageYOffset !== "undefined") ?
+        window.pageYOffset : document.body.scrollTop);
+  } else {
+    // this fall back doesn't properly handle absolutely positioned elements
+    // inside a scrollable box
+    var node;
+    if (elem.offsetParent) {
+      // subtract all scrolling
+      node = elem;
+      do {
+        myX -= node.scrollLeft ? node.scrollLeft : 0;
+        myY -= node.scrollTop ? node.scrollTop : 0;
+      } while (node = node.parentNode);
+      // this will include the page scrolling (which is unwanted) so add it back on
+      myX += (typeof window.pageXOffset !== "undefined") ? window.pageXOffset : document.body.scrollLeft;
+      myY += (typeof window.pageYOffset !== "undefined") ? window.pageYOffset : document.body.scrollTop;
+      // sum up offsets
+      node = elem;
+      do {
+        myX += node.offsetLeft;
+        myY += node.offsetTop;
+      } while (node = node.offsetParent);
+    }
+  }
+  return [myX, myY];
+}
+
+/*
+ * position_popup
+ *
+ * Positions a popup relative to an anchor element.
+ *
+ * The avaliable positions are:
+ * 0 - Centered below the anchor.
+ */
+function position_popup(anchor, popup, position) {
+  "use strict";
+  var a_x, a_y, a_w, a_h, p_x, p_y, p_w, p_h;
+  var a_xy, spacer, margin, scrollbar, page_w;
+  // define constants
+  spacer = 5;
+  margin = 15;
+  scrollbar = 15;
+  // define the positions and widths
+  a_xy = coords(anchor);
+  a_x = a_xy[0];
+  a_y = a_xy[1];
+  a_w = anchor.offsetWidth;
+  a_h = anchor.offsetHeight;
+  p_w = popup.offsetWidth;
+  p_h = popup.offsetHeight;
+  page_w = null;
+  if (window.innerWidth) {
+    page_w = window.innerWidth;
+  } else if (document.body) {
+    page_w = document.body.clientWidth;
+  }
+  // check the position type is defined
+  if (typeof position !== "number") {
+    position = 0;
+  }
+  // calculate the popup position
+  switch (position) {
+    case 1:
+      p_x = a_x + a_w + spacer;
+      p_y = a_y + (a_h / 2) - (p_h / 2);
+      break;
+    case 0:
+    default:
+      p_x = a_x + (a_w / 2) - (p_w / 2);
+      p_y = a_y + a_h + spacer;
+      break;
+  }
+  // constrain the popup position
+  if (p_x < margin) {
+    p_x = margin;
+  } else if (page_w != null && (p_x + p_w) > (page_w - margin - scrollbar)) {
+    p_x = page_w - margin - scrollbar - p_w;
+  }
+  if (p_y < margin) {
+    p_y = margin;
+  }
+  // position the popup
+  popup.style.left = p_x + "px";
+  popup.style.top = p_y + "px";
+}
+
+function lookup_help_popup(popup_id) {
+  var _body, pop, info;
+  pop = document.getElementById(popup_id);
+  if (pop == null) {
+    _body = document.getElementsByTagName("body")[0];
+    pop = document.createElement("div");
+    pop.className = "pop_content";
+    pop.id = popup_id;
+    pop.style.backgroundColor = "#FFC";
+    pop.style.borderColor = "black";
+    info = document.createElement("p");
+    info.style.fontWeight = "bold";
+    info.appendChild(document.createTextNode("Error: No popup for topic \"" + popup_id + "\"."));
+    pop.appendChild(info);
+    // this might cause problems with the menu, but as this only happens
+    // when something is already wrong I don't think that's too much of a problem
+    _body.insertBefore(pop, _body.firstChild);
+  }
+  if (document.getElementsByTagName('body')[0].hasAttribute("data-autobtns")) {
+    if (!/\bauto_buttons\b/.test(pop.className)) {
+      pop.className += " auto_buttons";
+      var back_btn_sec = document.createElement("div");
+      back_btn_sec.className = "nested_only pop_back_sec";
+      var back_btn = document.createElement("span");
+      back_btn.className = "pop_back";
+      back_btn.appendChild(document.createTextNode("<< back"));
+      back_btn.addEventListener("click", function(e) {
+        help_return();
+      }, false);
+      back_btn_sec.appendChild(back_btn);
+      pop.insertBefore(back_btn_sec, pop.firstChild);
+      var close_btn_sec = document.createElement("div");
+      close_btn_sec.className = "pop_close_sec";
+      var close_btn = document.createElement("span");
+      close_btn.className = "pop_close";
+      close_btn.appendChild(document.createTextNode("close"));
+      close_btn.addEventListener("click", function(e) {
+        help_popup();
+      }, false);
+      close_btn_sec.appendChild(close_btn);
+      pop.appendChild(close_btn_sec);
+    }
+  }
+  return pop;
+}
+
+/*
+ * help_popup
+ *
+ * Moves around help pop-ups so they appear
+ * below an activator.
+ */
+function help_popup(activator, popup_id) {
+  "use strict";
+  var pop;
+  // set default values
+  if (typeof help_popup.popup === "undefined") {
+    help_popup.popup = [];
+  }
+  if (typeof help_popup.activator === "undefined") {
+    help_popup.activator = null;
+  }
+  var last_pop = (help_popup.popup.length > 0 ? help_popup.popup[help_popup.popup.length - 1] : null);
+  if (typeof(activator) == "undefined") { // no activator so hide
+    if (last_pop != null) {
+      last_pop.style.display = 'none';
+      help_popup.popup = [];
+    }
+    return;
+  }
+  pop = lookup_help_popup(popup_id);
+  if (pop == last_pop) {
+    if (activator == help_popup.activator) {
+      //hide popup (as we've already shown it for the current help button)
+      last_pop.style.display = 'none';
+      help_popup.popup = [];
+      return; // toggling complete!
+    }
+  } else if (last_pop != null) {
+    //activating different popup so hide current one
+    last_pop.style.display = 'none';
+  }
+  help_popup.popup = [pop];
+  help_popup.activator = activator;
+  toggle_class(pop, "nested", false);
+  //must make the popup visible to measure it or it has zero width
+  pop.style.display = 'block';
+  position_popup(activator, pop);
+}
+
+/*
+ * help_refine
+ * 
+ * Intended for links within a help popup. Stores a stack of state so
+ * you can go back.
+ */
+function help_refine(popup_id) {
+  if (help_popup.popup == null || help_popup.popup.length == 0 || help_popup.activator == null) {
+    throw new Error("Can not refine a help popup when one is not shown!");
+  }
+  var pop = lookup_help_popup(popup_id);
+  var last_pop = help_popup.popup[help_popup.popup.length - 1];
+  if (pop == last_pop) return; // slightly odd, but no real cause for alarm
+  help_popup.popup.push(pop);
+  toggle_class(pop, "nested", true);
+  last_pop.style.display = "none";
+  //must make the popup visible to measure it or it has zero width
+  pop.style.display = "block";
+  position_popup(help_popup.activator, pop);
+}
+
+/*
+ * help_return
+ * 
+ * Intended for links within a help popup. Stores a stack of state so
+ * you can go back.
+ */
+function help_return() {
+  if (help_popup.popup == null || help_popup.popup.length == 0 || help_popup.activator == null) {
+    throw new Error("Can not return to a earlier help popup when one is not shown!");
+  }
+  var last_pop = help_popup.popup.pop();
+  last_pop.style.display = "none";
+  var pop = (help_popup.popup.length > 0 ? help_popup.popup[help_popup.popup.length - 1] : null);
+  if (pop != null) {
+    toggle_class(pop, "nested", help_popup.popup.length > 1);
+    pop.style.display = "block";
+    position_popup(help_popup.activator, pop);
+  } else {
+    help_popup.activator = null;
+  }
+}
+
+/*
+ * update_scroll_pad
+ *
+ * Creates padding at the bottom of the page to allow
+ * scrolling of anything into view.
+ */
+function update_scroll_pad() {
+  var page, pad;
+  page = (document.compatMode === "CSS1Compat") ? document.documentElement : document.body;
+  pad = $("scrollpad");
+  if (pad === null) {
+    pad = document.createElement("div");
+    pad.id = 'scrollpad';
+    document.getElementsByTagName('body')[0].appendChild(pad);
+  }
+  pad.style.height = Math.abs(page.clientHeight - 100) + "px";
+}
+
+function substitute_classes(node, remove, add) {
+  "use strict";
+  var list, all, i, cls, classes;
+  list = node.className.split(/\s+/);
+  all = {};
+  for (i = 0; i < list.length; i++) {
+    if (list[i].length > 0) all[list[i]] = true;
+  }
+  for (i = 0; i < remove.length; i++) {
+    if (all.hasOwnProperty(remove[i])) {
+      delete all[remove[i]];
+    }
+  }
+  for (i = 0; i < add.length; i++) {
+    all[add[i]] = true;
+  }
+  classes = "";
+  for (cls in all) {
+    classes += cls + " ";
+  }
+  node.className = classes;
+}
+
+/*
+ * toggle_class
+ *
+ * Adds or removes a class from the node. If the parameter 'enabled' is not 
+ * passed then the existence of the class will be toggled, otherwise it will be
+ * included if enabled is true.
+ */
+function toggle_class(node, cls, enabled) {
+  var classes = node.className;
+  var list = classes.replace(/^\s+/, '').replace(/\s+$/, '').split(/\s+/);
+  var found = false;
+  for (var i = 0; i < list.length; i++) {
+    if (list[i] == cls) {
+      list.splice(i, 1);
+      i--;
+      found = true;
+    }
+  }
+  if (typeof enabled == "undefined") {
+    if (!found) list.push(cls);
+  } else {
+    if (enabled) list.push(cls);
+  }
+  node.className = list.join(" ");
+}
+
+/*
+ * find_child
+ *
+ * Searches child nodes in depth first order and returns the first it finds
+ * with the className specified.
+ * TODO replace with querySelector
+ */
+function find_child(node, className) {
+  var pattern;
+  if (node == null || typeof node !== "object") {
+    return null;
+  }
+  if (typeof className === "string") {
+    pattern = new RegExp("\\b" + className + "\\b");
+  } else {
+    pattern = className;
+  }
+  if (node.nodeType == Node.ELEMENT_NODE && 
+      pattern.test(node.className)) {
+    return node;
+  } else {
+    var result = null;
+    for (var i = 0; i < node.childNodes.length; i++) {
+      result = find_child(node.childNodes[i], pattern);
+      if (result != null) break;
+    }
+    return result;
+  }
+}
+
+/*
+ * find_parent
+ *
+ * Searches parent nodes outwards from the node and returns the first it finds
+ * with the className specified.
+ */
+function find_parent(node, className) {
+  var pattern;
+  pattern = new RegExp("\\b" + className + "\\b");
+  do {
+    if (node.nodeType == Node.ELEMENT_NODE && 
+        pattern.test(node.className)) {
+      return node;
+    }
+  } while (node = node.parentNode);
+  return null;
+}
+
+/*
+ * find_parent_tag
+ *
+ * Searches parent nodes outwards from the node and returns the first it finds
+ * with the tag name specified. HTML tags should be specified in upper case.
+ */
+function find_parent_tag(node, tag_name) {
+  do {
+    if (node.nodeType == Node.ELEMENT_NODE && node.tagName == tag_name) {
+      return node;
+    }
+  } while (node = node.parentNode);
+  return null;
+}
+
+/*
+ * __toggle_help
+ *
+ * Uses the 'topic' property of the this object to
+ * toggle display of a help topic.
+ *
+ * This function is not intended to be called directly.
+ */
+function __toggle_help(e) {
+  if (!e) e = window.event;
+  if (e.type === "keydown") {
+    if (e.keyCode !== 13 && e.keyCode !== 32) {
+      return;
+    }
+    // stop a submit or something like that
+    e.preventDefault();
+  }
+
+  help_popup(this, this.getAttribute("data-topic"));
+}
+
+function setup_help_button(button) {
+  "use strict";
+  var topic;
+  if (button.hasAttribute("data-topic")) {
+    topic = button.getAttribute("data-topic");
+    if (document.getElementById(topic) != null) {
+      button.tabIndex = "0"; // make keyboard selectable
+      button.addEventListener("click", function() {
+        help_popup(button, topic);
+      }, false);
+      button.addEventListener("keydown", function(e) {
+        // toggle only on Enter or Spacebar, let other keys do their thing
+        if (e.keyCode !== 13 && e.keyCode !== 32) return;
+        // stop a submit or something like that
+        e.preventDefault();
+        help_popup(button, topic);
+      }, false);
+    } else {
+      button.style.visibility = "hidden";
+    }
+  }
+  button.className += " active";
+}
+
+/*
+ * help_button
+ *
+ * Makes a help button for the passed topic.
+ */
+function help_button(topic) {
+  var btn = document.createElement("div");
+  btn.className = "help";
+  btn.setAttribute("data-topic", topic);
+  setup_help_button(btn);
+  return btn;
+}
+
+/*
+ * prepare_download
+ *
+ * Sets the attributes of a link to setup a file download using the given content.
+ * If no link is provided then create one and click it.
+ */
+function prepare_download(content, mimetype, filename, link) {
+  "use strict";
+  // if no link is provided then create one and click it
+  var click_link = false;
+  if (!link) {
+    link = document.createElement("a");
+    click_link = true;
+  }
+  try {
+    // Use a BLOB to convert the text into a data URL.
+    // We could do this manually with a base 64 conversion.
+    // This will only be supported on modern browsers,
+    // hence the try block.
+    var blob = new Blob([content], {type: mimetype});
+    var reader = new FileReader();
+    reader.onloadend = function() {
+      // If we're lucky the browser will also support the download
+      // attribute which will let us suggest a file name to save the link.
+      // Otherwise it is likely that the filename will be unintelligible. 
+      link.setAttribute("download", filename);
+      link.href = reader.result;
+      if (click_link) {
+        // must add the link to click it
+        document.body.appendChild(link);
+        link.click();
+        document.body.removeChild(link);
+      }
+    }
+    reader.readAsDataURL(blob);
+  } catch (error) {
+    if (console && console.log) console.log(error);
+    // probably an old browser
+    link.href = "";
+    link.visible = false;
+  }
+}
+
+/*
+ * add_cell
+ *
+ * Add a cell to the table row.
+ */
+function add_cell(row, node, cls, click_action) {
+  var cell = row.insertCell(row.cells.length);
+  if (node) cell.appendChild(node);
+  if (cls && cls !== "") cell.className = cls;
+  if (click_action) cell.addEventListener("click", click_action, false);
+}
+
+/*
+ * add_header_cell
+ *
+ * Add a header cell to the table row.
+ */
+function add_header_cell(row, node, help_topic, cls, colspan) {
+  var th = document.createElement("th");
+  if (node) th.appendChild(node);
+  if (help_topic && help_topic !== "") th.appendChild(help_button(help_topic));
+  if (cls && cls !== "") th.className = cls;
+  if (typeof colspan == "number" && colspan > 1) th.colSpan = colspan;
+  row.appendChild(th);
+}
+
+/*
+ * add_text_cell
+ *
+ * Add a text cell to the table row.
+ */
+function add_text_cell(row, text, cls, action) {
+  var node = null;
+  if (typeof(text) != 'undefined') node = document.createTextNode(text);
+  add_cell(row, node, cls, action);
+}
+
+/*
+ * add_text_header_cell
+ *
+ * Add a text header cell to the table row.
+ */
+function add_text_header_cell(row, text, help_topic, cls, action, colspan) {
+  var node = null;
+  if (typeof(text) != 'undefined') {
+    var nbsp = (help_topic ? "\u00A0" : "");
+    var str = "" + text;
+    var parts = str.split(/\n/);
+    if (parts.length === 1) {
+      if (action) {
+        node = document.createElement("span");
+        node.appendChild(document.createTextNode(str + nbsp));
+      } else {
+        node = document.createTextNode(str + nbsp);
+      }
+    } else {
+      node = document.createElement("span");
+      for (var i = 0; i < parts.length; i++) {
+        if (i !== 0) {
+          node.appendChild(document.createElement("br"));
+        }
+        node.appendChild(document.createTextNode(parts[i]));
+      }
+    }
+    if (action) {
+      node.addEventListener("click", action, false);
+      node.style.cursor = "pointer";
+    }
+  }
+  add_header_cell(row, node, help_topic, cls, colspan);
+}
+
+function setup_help() {
+  "use strict";
+  var help_buttons, i;
+  help_buttons = document.querySelectorAll(".help:not(.active)");
+  for (i = 0; i < help_buttons.length; i++) {
+    setup_help_button(help_buttons[i]);
+  }
+}
+
+function setup_scrollpad() {
+  "use strict";
+  if (document.getElementsByTagName('body')[0].hasAttribute("data-scrollpad") && document.getElementById("scrollpad") == null) {
+    window.addEventListener("resize", update_scroll_pad, false);
+    update_scroll_pad();
+  }
+}
+
+// anon function to avoid polluting global scope
+(function() {
+  "use strict";
+  window.addEventListener("load", function load(evt) {
+    window.removeEventListener("load", load, false);
+    setup_help();
+    setup_scrollpad();
+  }, false);
+})();
+
+/*
+ *  make_link
+ *
+ *  Creates a text node and if a URL is specified it surrounds it with a link.
+ *  If the URL doesn't begin with "http://" it automatically adds it, as
+ *  relative links don't make much sense in this context.
+ */
+function make_link(text, url) {
+  var textNode = null;
+  var link = null;
+  if (typeof text !== "undefined" && text !== null) textNode = document.createTextNode(text);
+  if (typeof url === "string") {
+    if (url.indexOf("//") == -1) {
+      url = "http://" + url;
+    }
+    link = document.createElement('a');
+    link.href = url;
+    if (textNode) link.appendChild(textNode);
+    return link;
+  }
+  return textNode;
+}
+</script>
+    <script>
+function motif_logo_template(inputs) {
+  function _input(name) {
+    if (typeof inputs[name] === "undefined") {
+      throw new Error("Missing template variable: " + name);
+    }
+    return inputs[name];
+  }
+  return (
+"%!PS-Adobe-3.0 EPSF-3.0\n" +
+"%%Title: Sequence Logo : " + _input("TITLE") + "\n" +
+"%%Creator: " + _input("CREATOR") + "\n" +
+"%%CreationDate: " + _input("CREATIONDATE") + "\n" +
+"%%BoundingBox:   0  0  " + _input("BOUNDINGWIDTH") + " " + _input("BOUNDINGHEIGHT") + " \n" +
+"%%Pages: 0\n" +
+"%%DocumentFonts: \n" +
+"%%EndComments\n" +
+"\n" +
+"% ---- CONSTANTS ----\n" +
+"\/cmfactor 72 2.54 div def % defines points -> cm conversion\n" +
+"\/cm {cmfactor mul} bind def % defines centimeters\n" +
+"\n" +
+"% ---- VARIABLES ----\n" +
+"\n" +
+"% NA = Nucleic Acid, AA = Amino Acid\n" +
+"\/logoType (" + _input("LOGOTYPE") + ") def \n" +
+"\n" +
+"\/logoTitle (" + _input("TITLE") + ") def\n" +
+"\n" +
+"% Dimensions in cm\n" +
+"\/logoWidth " + _input("LOGOWIDTH") + " cm def\n" +
+"\/logoHeight " + _input("LOGOLINEHEIGHT") + " cm def\n" +
+"\/totalHeight " + _input("LOGOHEIGHT") + " cm def\n" +
+"\n" +
+"\/yaxis " + _input("YAXIS") + " def\n" +
+"\/yaxisLabel (" + _input("YAXISLABEL") + ") def\n" +
+"\/yaxisBits  " + _input("BARBITS") + " def % bits\n" +
+"\/yaxisTicBits " + _input("TICBITS") + " def\n" +
+"\n" +
+"\/xaxis " + _input("NUMBERING") + " def\n" +
+"\/xaxisLabel (" + _input("XAXISLABEL") + ") def\n" +
+"\/showEnds (" + _input("SHOWENDS") + ") def \n" +
+"\n" +
+"\/showFineprint true def\n" +
+"\/fineprint (" + _input("FINEPRINT") + ") def\n" +
+"\n" +
+"\/charsPerLine " + _input("CHARSPERLINE") + " def\n" +
+"\n" +
+"\/showingBox " + _input("SHOWINGBOX") + " def    \n" +
+"\/shrinking false def   % true falses\n" +
+"\/shrink  1.0 def\n" +
+"\/outline " + _input("OUTLINE") + " def\n" +
+"\n" +
+"\/IbeamFraction  " + _input("ERRORBARFRACTION") + " def\n" +
+"\/IbeamGray      0.50 def\n" +
+"\/IbeamLineWidth 0.5 def\n" +
+"\n" +
+"\/fontsize       " + _input("FONTSIZE") + " def\n" +
+"\/titleFontsize  " + _input("TITLEFONTSIZE") + " def\n" +
+"\/smallFontsize  " + _input("SMALLFONTSIZE") + " def\n" +
+"\n" +
+"\/topMargin      " + _input("TOPMARGIN") + " cm def\n" +
+"\/bottomMargin   " + _input("BOTTOMMARGIN") + " cm def\n" +
+"\n" +
+"\/defaultColor [0 0 0] def \n" +
+"\n" +
+_input("COLORDICT") + "\n" +
+"\n" +
+"\/colorDict fullColourDict def\n" +
+"\n" +
+"% ---- DERIVED PARAMETERS ----\n" +
+"\n" +
+"\/leftMargin\n" +
+"  fontsize 3.5 mul\n" +
+"\n" +
+"def \n" +
+"\n" +
+"\/rightMargin \n" +
+"  %Add extra room if showing ends\n" +
+"  showEnds (false) eq { fontsize}{fontsize 1.5 mul} ifelse\n" +
+"def\n" +
+"\n" +
+"\/yaxisHeight \n" +
+"  logoHeight \n" +
+"  bottomMargin sub  \n" +
+"  topMargin sub\n" +
+"def\n" +
+"\n" +
+"\/ticWidth fontsize 2 div def\n" +
+"\n" +
+"\/pointsPerBit yaxisHeight yaxisBits div  def\n" +
+"\n" +
+"\/stackMargin 1 def\n" +
+"\n" +
+"% Do not add space aroung characters if characters are boxed\n" +
+"\/charRightMargin \n" +
+"  showingBox { 0.0 } {stackMargin} ifelse\n" +
+"def\n" +
+"\n" +
+"\/charTopMargin \n" +
+"  showingBox { 0.0 } {stackMargin} ifelse\n" +
+"def\n" +
+"\n" +
+"\/charWidth\n" +
+"  logoWidth\n" +
+"  leftMargin sub\n" +
+"  rightMargin sub\n" +
+"  charsPerLine div\n" +
+"  charRightMargin sub\n" +
+"def\n" +
+"\n" +
+"\/charWidth4 charWidth 4 div def\n" +
+"\/charWidth2 charWidth 2 div def\n" +
+"\n" +
+"\/stackWidth \n" +
+"  charWidth charRightMargin add\n" +
+"def\n" +
+" \n" +
+"\/numberFontsize \n" +
+"  fontsize charWidth lt {fontsize}{charWidth} ifelse\n" +
+"def\n" +
+"\n" +
+"% movements to place 5'\/N and 3'\/C symbols\n" +
+"\/leftEndDeltaX  fontsize neg         def\n" +
+"\/leftEndDeltaY  fontsize 1.5 mul neg def\n" +
+"\/rightEndDeltaX fontsize 0.25 mul     def\n" +
+"\/rightEndDeltaY leftEndDeltaY        def\n" +
+"\n" +
+"% Outline width is proporional to charWidth, \n" +
+"% but no less that 1 point\n" +
+"\/outlinewidth \n" +
+"  charWidth 32 div dup 1 gt  {}{pop 1} ifelse\n" +
+"def\n" +
+"\n" +
+"\n" +
+"% ---- PROCEDURES ----\n" +
+"\n" +
+"\/StartLogo { \n" +
+"  % Save state\n" +
+"  save \n" +
+"  gsave \n" +
+"\n" +
+"  % Print Logo Title, top center \n" +
+"  gsave \n" +
+"    SetStringFont\n" +
+"\n" +
+"    logoWidth 2 div\n" +
+"    logoTitle\n" +
+"    stringwidth pop 2 div sub\n" +
+"    totalHeight\n" +
+"    titleFontsize sub\n" +
+"    moveto\n" +
+"\n" +
+"    logoTitle\n" +
+"    show\n" +
+"  grestore\n" +
+"\n" +
+"  % Print X-axis label, bottom center\n" +
+"  gsave\n" +
+"    SetStringFont\n" +
+"\n" +
+"    logoWidth 2 div\n" +
+"    xaxisLabel\n" +
+"    stringwidth pop 2 div sub\n" +
+"    0\n" +
+"    titleFontsize 3 div\n" +
+"    add\n" +
+"    moveto\n" +
+"\n" +
+"    xaxisLabel\n" +
+"    show\n" +
+"  grestore\n" +
+"\n" +
+"  % Show Fine Print\n" +
+"  showFineprint {\n" +
+"    gsave\n" +
+"      SetSmallFont\n" +
+"      logoWidth\n" +
+"        fineprint stringwidth pop sub\n" +
+"        smallFontsize sub\n" +
+"          smallFontsize 3 div\n" +
+"      moveto\n" +
+"    \n" +
+"      fineprint show\n" +
+"    grestore\n" +
+"  } if\n" +
+"\n" +
+"  % Move to lower left corner of last line, first stack\n" +
+"  leftMargin bottomMargin translate\n" +
+"\n" +
+"  % Move above first line ready for StartLine \n" +
+"  0 totalHeight translate\n" +
+"\n" +
+"  SetLogoFont\n" +
+"} bind def\n" +
+"\n" +
+"\/EndLogo { \n" +
+"  grestore \n" +
+"  showpage \n" +
+"  restore \n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/StartLine { \n" +
+"  % move down to the bottom of the line:\n" +
+"  0 logoHeight neg translate\n" +
+"  \n" +
+"  gsave \n" +
+"    yaxis { MakeYaxis } if\n" +
+"    xaxis { showEnds (true) eq {ShowLeftEnd} if } if\n" +
+"} bind def\n" +
+"\n" +
+"\/EndLine{ \n" +
+"    xaxis { showEnds (true) eq {ShowRightEnd} if } if\n" +
+"  grestore \n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/MakeYaxis {\n" +
+"  gsave    \n" +
+"    stackMargin neg 0 translate\n" +
+"    ShowYaxisBar\n" +
+"    ShowYaxisLabel\n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/ShowYaxisBar { \n" +
+"  gsave  \n" +
+"    SetStringFont\n" +
+"\n" +
+"    \/str 10 string def % string to hold number  \n" +
+"    \/smallgap stackMargin 2 div def\n" +
+"\n" +
+"    % Draw first tic and bar\n" +
+"    gsave    \n" +
+"      ticWidth neg 0 moveto \n" +
+"      ticWidth 0 rlineto \n" +
+"      0 yaxisHeight rlineto\n" +
+"      stroke\n" +
+"    grestore\n" +
+"\n" +
+"   \n" +
+"    % Draw the tics\n" +
+"    % initial increment limit proc for\n" +
+"    0 yaxisTicBits yaxisBits abs %cvi\n" +
+"    {\/loopnumber exch def\n" +
+"\n" +
+"      % convert the number coming from the loop to a string\n" +
+"      % and find its width\n" +
+"      loopnumber 10 str cvrs\n" +
+"      \/stringnumber exch def % string representing the number\n" +
+"\n" +
+"      stringnumber stringwidth pop\n" +
+"      \/numberwidth exch def % width of number to show\n" +
+"\n" +
+"      \/halfnumberheight\n" +
+"         stringnumber CharBoxHeight 2 div\n" +
+"      def\n" +
+"\n" +
+"      numberwidth % move back width of number\n" +
+"      neg loopnumber pointsPerBit mul % shift on y axis\n" +
+"      halfnumberheight sub % down half the digit\n" +
+"\n" +
+"      moveto % move back the width of the string\n" +
+"\n" +
+"      ticWidth neg smallgap sub % Move back a bit more  \n" +
+"      0 rmoveto % move back the width of the tic  \n" +
+"\n" +
+"      stringnumber show\n" +
+"      smallgap 0 rmoveto % Make a small gap  \n" +
+"\n" +
+"      % now show the tic mark\n" +
+"      0 halfnumberheight rmoveto % shift up again\n" +
+"      ticWidth 0 rlineto\n" +
+"      stroke\n" +
+"    } for\n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+"\/ShowYaxisLabel {\n" +
+"  gsave\n" +
+"    SetStringFont\n" +
+"\n" +
+"    % How far we move left depends on the size of\n" +
+"    % the tic labels.\n" +
+"    \/str 10 string def % string to hold number  \n" +
+"    yaxisBits yaxisTicBits div cvi yaxisTicBits mul \n" +
+"    str cvs stringwidth pop\n" +
+"    ticWidth 1.5 mul  add neg  \n" +
+"\n" +
+"\n" +
+"    yaxisHeight\n" +
+"    yaxisLabel stringwidth pop\n" +
+"    sub 2 div\n" +
+"\n" +
+"    translate\n" +
+"    90 rotate\n" +
+"    0 0 moveto\n" +
+"    yaxisLabel show\n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/StartStack {  % <stackNumber> startstack\n" +
+"  xaxis {MakeNumber}{pop} ifelse\n" +
+"  gsave\n" +
+"} bind def\n" +
+"\n" +
+"\/EndStack {\n" +
+"  grestore\n" +
+"  stackWidth 0 translate\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"% Draw a character whose height is proportional to symbol bits\n" +
+"\/MakeSymbol{ % charbits character MakeSymbol\n" +
+"  gsave\n" +
+"    \/char exch def\n" +
+"    \/bits exch def\n" +
+"\n" +
+"    \/bitsHeight \n" +
+"       bits pointsPerBit mul \n" +
+"    def\n" +
+"\n" +
+"    \/charHeight \n" +
+"       bitsHeight charTopMargin sub\n" +
+"       dup \n" +
+"       0.0 gt {}{pop 0.0} ifelse % if neg replace with zero \n" +
+"    def \n" +
+" \n" +
+"    charHeight 0.0 gt {\n" +
+"      char SetColor\n" +
+"      charWidth charHeight char ShowChar\n" +
+"\n" +
+"      showingBox { % Unfilled box\n" +
+"        0 0 charWidth charHeight false ShowBox\n" +
+"      } if\n" +
+"\n" +
+"\n" +
+"    } if\n" +
+"\n" +
+"  grestore\n" +
+"\n" +
+"  0 bitsHeight translate \n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/ShowChar { % <width> <height> <char> ShowChar\n" +
+"  gsave\n" +
+"    \/tc exch def    % The character\n" +
+"    \/ysize exch def % the y size of the character\n" +
+"    \/xsize exch def % the x size of the character\n" +
+"\n" +
+"    \/xmulfactor 1 def \n" +
+"    \/ymulfactor 1 def\n" +
+"    \/limmulfactor 0.01 def\n" +
+"    \/drawable true def\n" +
+"\n" +
+"  \n" +
+"    % if ysize is negative, make everything upside down!\n" +
+"    ysize 0 lt {\n" +
+"      % put ysize normal in this orientation\n" +
+"      \/ysize ysize abs def\n" +
+"      xsize ysize translate\n" +
+"      180 rotate\n" +
+"    } if\n" +
+"\n" +
+"    shrinking {\n" +
+"      xsize 1 shrink sub 2 div mul\n" +
+"        ysize 1 shrink sub 2 div mul translate \n" +
+"\n" +
+"      shrink shrink scale\n" +
+"    } if\n" +
+"\n" +
+"    % Calculate the font scaling factors\n" +
+"    % Loop twice to catch small correction due to first scaling\n" +
+"    2 {\n" +
+"      gsave\n" +
+"        xmulfactor ymulfactor scale\n" +
+"      \n" +
+"        ysize % desired size of character in points\n" +
+"        tc CharBoxHeight \n" +
+"        dup 0.0 ne {\n" +
+"          div % factor by which to scale up the character\n" +
+"          \/ymulfactor exch def\n" +
+"        } % end if\n" +
+"        {pop pop}\n" +
+"        ifelse\n" +
+"\n" +
+"        xsize % desired size of character in points\n" +
+"        tc CharBoxWidth  \n" +
+"        dup 0.0 ne {\n" +
+"          div % factor by which to scale up the character\n" +
+"          \/xmulfactor exch def\n" +
+"        } % end if\n" +
+"        {pop pop}\n" +
+"        ifelse\n" +
+"      grestore\n" +
+"      % if the multiplication factors get too small we need to avoid a crash\n" +
+"      xmulfactor limmulfactor lt {\n" +
+"        \/xmulfactor 1 def\n" +
+"        \/drawable false def\n" +
+"      } if\n" +
+"      ymulfactor limmulfactor lt {\n" +
+"        \/ymulfactor 1 def\n" +
+"        \/drawable false def\n" +
+"      } if\n" +
+"    } repeat\n" +
+"\n" +
+"    % Adjust horizontal position if the symbol is an I\n" +
+"    tc (I) eq {\n" +
+"      charWidth 2 div % half of requested character width\n" +
+"      tc CharBoxWidth 2 div % half of the actual character\n" +
+"      sub 0 translate\n" +
+"      % Avoid x scaling for I \n" +
+"      \/xmulfactor 1 def \n" +
+"    } if\n" +
+"\n" +
+"\n" +
+"    % ---- Finally, draw the character\n" +
+"    drawable { \n" +
+"      newpath\n" +
+"      xmulfactor ymulfactor scale\n" +
+"\n" +
+"      % Move lower left corner of character to start point\n" +
+"      tc CharBox pop pop % llx lly : Lower left corner\n" +
+"      exch neg exch neg\n" +
+"      moveto\n" +
+"\n" +
+"      outline {  % outline characters:\n" +
+"        outlinewidth setlinewidth\n" +
+"        tc true charpath\n" +
+"        gsave 1 setgray fill grestore\n" +
+"        clip stroke\n" +
+"      } { % regular characters\n" +
+"        tc show\n" +
+"      } ifelse\n" +
+"    } if\n" +
+"\n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/ShowBox { % x1 y1 x2 y2 filled ShowBox\n" +
+"  gsave\n" +
+"    \/filled exch def \n" +
+"    \/y2 exch def\n" +
+"    \/x2 exch def\n" +
+"    \/y1 exch def\n" +
+"    \/x1 exch def\n" +
+"    newpath\n" +
+"    x1 y1 moveto\n" +
+"    x2 y1 lineto\n" +
+"    x2 y2 lineto\n" +
+"    x1 y2 lineto\n" +
+"    closepath\n" +
+"\n" +
+"    clip\n" +
+"    \n" +
+"    filled {\n" +
+"      fill\n" +
+"    }{ \n" +
+"      0 setgray stroke   \n" +
+"    } ifelse\n" +
+"\n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/MakeNumber { % number MakeNumber\n" +
+"  gsave\n" +
+"    SetNumberFont\n" +
+"    stackWidth 0 translate\n" +
+"    90 rotate % rotate so the number fits\n" +
+"    dup stringwidth pop % find the length of the number\n" +
+"    neg % prepare for move\n" +
+"    stackMargin sub % Move back a bit\n" +
+"    charWidth (0) CharBoxHeight % height of numbers\n" +
+"    sub 2 div %\n" +
+"    moveto % move back to provide space\n" +
+"    show\n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/Ibeam{ % heightInBits Ibeam\n" +
+"  gsave\n" +
+"    % Make an Ibeam of twice the given height in bits\n" +
+"    \/height exch  pointsPerBit mul def \n" +
+"    \/heightDRAW height IbeamFraction mul def\n" +
+"\n" +
+"    IbeamLineWidth setlinewidth\n" +
+"    IbeamGray setgray \n" +
+"\n" +
+"    charWidth2 height neg translate\n" +
+"    ShowIbar\n" +
+"    newpath\n" +
+"      0 0 moveto\n" +
+"      0 heightDRAW rlineto\n" +
+"    stroke\n" +
+"    newpath\n" +
+"      0 height moveto\n" +
+"      0 height rmoveto\n" +
+"      currentpoint translate\n" +
+"    ShowIbar\n" +
+"    newpath\n" +
+"    0 0 moveto\n" +
+"    0 heightDRAW neg rlineto\n" +
+"    currentpoint translate\n" +
+"    stroke\n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/ShowIbar { % make a horizontal bar\n" +
+"  gsave\n" +
+"    newpath\n" +
+"      charWidth4 neg 0 moveto\n" +
+"      charWidth4 0 lineto\n" +
+"    stroke\n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/ShowLeftEnd {\n" +
+"  gsave\n" +
+"    SetStringFont\n" +
+"    leftEndDeltaX leftEndDeltaY moveto\n" +
+"    logoType (NA) eq {(5) show ShowPrime} if\n" +
+"    logoType (AA) eq {(N) show} if\n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/ShowRightEnd { \n" +
+"  gsave\n" +
+"    SetStringFont\n" +
+"    rightEndDeltaX rightEndDeltaY moveto\n" +
+"    logoType (NA) eq {(3) show ShowPrime} if\n" +
+"    logoType (AA) eq {(C) show} if\n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/ShowPrime {\n" +
+"  gsave\n" +
+"    SetPrimeFont\n" +
+"    (\\242) show \n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+" \n" +
+"\/SetColor{ % <char> SetColor\n" +
+"  dup colorDict exch known {\n" +
+"    colorDict exch get aload pop setrgbcolor\n" +
+"  } {\n" +
+"    pop\n" +
+"    defaultColor aload pop setrgbcolor\n" +
+"  } ifelse \n" +
+"} bind def\n" +
+"\n" +
+"% define fonts\n" +
+"\/SetTitleFont {\/Times-Bold findfont titleFontsize scalefont setfont} bind def\n" +
+"\/SetLogoFont  {\/Helvetica-Bold findfont charWidth  scalefont setfont} bind def\n" +
+"\/SetStringFont{\/Helvetica-Bold findfont fontsize scalefont setfont} bind def\n" +
+"\/SetPrimeFont {\/Symbol findfont fontsize scalefont setfont} bind def\n" +
+"\/SetSmallFont {\/Helvetica findfont smallFontsize scalefont setfont} bind def\n" +
+"\n" +
+"\/SetNumberFont {\n" +
+"    \/Helvetica-Bold findfont \n" +
+"    numberFontsize\n" +
+"    scalefont\n" +
+"    setfont\n" +
+"} bind def\n" +
+"\n" +
+"%Take a single character and return the bounding box\n" +
+"\/CharBox { % <char> CharBox <lx> <ly> <ux> <uy>\n" +
+"  gsave\n" +
+"    newpath\n" +
+"    0 0 moveto\n" +
+"    % take the character off the stack and use it here:\n" +
+"    true charpath \n" +
+"    flattenpath \n" +
+"    pathbbox % compute bounding box of 1 pt. char => lx ly ux uy\n" +
+"    % the path is here, but toss it away ...\n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"% The height of a characters bounding box\n" +
+"\/CharBoxHeight { % <char> CharBoxHeight <num>\n" +
+"  CharBox\n" +
+"  exch pop sub neg exch pop\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"% The width of a characters bounding box\n" +
+"\/CharBoxWidth { % <char> CharBoxHeight <num>\n" +
+"  CharBox\n" +
+"  pop exch pop sub neg \n" +
+"} bind def\n" +
+"\n" +
+"% Set the colour scheme to be faded to indicate trimming\n" +
+"\/MuteColour {\n" +
+"  \/colorDict mutedColourDict def\n" +
+"} def\n" +
+"\n" +
+"% Restore the colour scheme to the normal colours\n" +
+"\/RestoreColour {\n" +
+"  \/colorDict fullColourDict def\n" +
+"} def\n" +
+"\n" +
+"% Draw the background for a trimmed section\n" +
+"% takes the number of columns as a parameter\n" +
+"\/DrawTrimBg { % <num> DrawTrimBox\n" +
+"  \/col exch def\n" +
+"  \n" +
+"  \/boxwidth \n" +
+"    col stackWidth mul \n" +
+"  def\n" +
+" \n" +
+"  gsave\n" +
+"    0.97 setgray\n" +
+"\n" +
+"    newpath\n" +
+"    0 0 moveto\n" +
+"    boxwidth 0 rlineto\n" +
+"    0 yaxisHeight rlineto\n" +
+"    0 yaxisHeight lineto\n" +
+"    closepath\n" +
+"    \n" +
+"    fill\n" +
+"  grestore\n" +
+"} def\n" +
+"\n" +
+"\/DrawTrimEdge {\n" +
+"  gsave\n" +
+"    0.2 setgray\n" +
+"    [2] 0 setdash\n" +
+"\n" +
+"    newpath\n" +
+"    0 0 moveto\n" +
+"    0 yaxisHeight lineto\n" +
+"    \n" +
+"    stroke\n" +
+"\n" +
+"} def\n" +
+"\n" +
+"\n" +
+"% Deprecated names\n" +
+"\/startstack {StartStack} bind  def\n" +
+"\/endstack {EndStack}     bind def\n" +
+"\/makenumber {MakeNumber} bind def\n" +
+"\/numchar { MakeSymbol }  bind def\n" +
+"\n" +
+"%%EndProlog\n" +
+"\n" +
+"%%Page: 1 1\n" +
+"StartLogo\n" +
+"\n" +
+_input("DATA") + "\n" +
+"\n" +
+"EndLogo\n" +
+"\n" +
+"%%EOF\n"
+  );
+}</script>
+    <script>
+//======================================================================
+// start Alphabet object
+//======================================================================
+var Alphabet = function(alphabet, background) {
+  "use strict";
+  var i, j, sym, aliases, complement, comp_e_sym, ambigs, generate_background;
+  generate_background = (background == null);
+  if (generate_background) {
+    background = [];
+    for (i = 0; i < alphabet.ncore; i++) background[i] = 1.0 / alphabet.ncore;
+  } else if (alphabet.ncore != background.length) {
+    throw new Error("The background length does not match the alphabet length.");
+  }
+  this.name = alphabet.name;
+  this.like = (alphabet.like != null ? alphabet.like.toUpperCase() : null);
+  this.ncore = alphabet.ncore;
+  this.symbols = alphabet.symbols;
+  this.background = background;
+  this.genbg = generate_background;
+  this.encode = {};
+  this.encode2core = {};
+  this.complement = {};
+  // check if all symbols are same case
+  var seen_uc = false;
+  var seen_lc = false;
+  var check_case = function (syms) {
+    var s, sym;
+    if (typeof syms === "string") {
+      for (s = 0; s < syms.length; s++) {
+        sym = syms.charAt(s);
+        if (sym >= 'a' && sym <= 'z') seen_lc = true;
+        else if (sym >= 'A' && sym <= 'Z') seen_uc = true;
+      }
+    }
+  };
+  for (i = 0; i < this.symbols.length; i++) {
+    check_case(this.symbols[i].symbol);
+    check_case(this.symbols[i].aliases);
+  }
+  // now map symbols to indexes
+  var update_array = function(array, syms, index) {
+    var s, sym;
+    if (typeof syms === "string") {
+      for (s = 0; s < syms.length; s++) {
+        sym = syms.charAt(s);
+        array[sym] = index;
+        // when only a single case is used, then encode as case insensitive
+        if (seen_uc != seen_lc) {
+          if (sym >= 'a' && sym <= 'z') {
+            array[sym.toUpperCase()] = index;
+          } else if (sym >= 'A' && sym <= 'Z') {
+            array[sym.toLowerCase()] = index;
+          }
+        }
+      }
+    }
+  }
+  // map core symbols to index
+  for (i = 0; i < this.ncore; i++) {
+    update_array(this.encode2core, this.symbols[i].symbol, i);
+    update_array(this.encode, this.symbols[i].symbol, i);
+    update_array(this.encode2core, this.symbols[i].aliases, i);
+    update_array(this.encode, this.symbols[i].aliases, i);
+  }
+  // map ambigous symbols to index
+  ambigs = {};
+  for (i = this.ncore; i < this.symbols.length; i++) {
+    update_array(this.encode, this.symbols[i].symbol, i);
+    update_array(this.encode, this.symbols[i].aliases, i);
+    ambigs[this.symbols[i].equals] = i;
+  }
+  // determine complements
+  for (i = 0; i < this.ncore; i++) {
+    complement = this.symbols[i].complement;
+    if (typeof complement === "string") {
+      this.complement[i] = this.encode2core[complement];
+    }
+  }
+  next_symbol:
+  for (i = this.ncore; i < this.symbols.length; i++) {
+    complement = "";
+    for (j = 0; j < this.symbols[i].equals.length; j++) {
+      comp_e_sym = this.complement[this.encode2core[this.symbols[i].equals.charAt(j)]];
+      if (typeof comp_e_sym !== "number") continue next_symbol;
+      complement += this.symbols[comp_e_sym].symbol;
+    }
+    complement = complement.split("").sort().join("");
+    if (typeof ambigs[complement] === "number") {
+      this.complement[i] = ambigs[complement];
+    }
+  }
+  // determine case insensitivity
+  this.case_insensitive = true;
+  if (seen_uc == seen_lc) {
+    // when there is a mixture of cases it probably won't
+    // be case insensitive but we still need to check
+    loop:
+    for (i = 0; i < this.symbols.length; i++) {
+      sym = this.symbols[i].symbol;
+      if (sym >= 'A' && sym <= 'Z') {
+        if (this.encode[sym.toLowerCase()] != i) {
+          this.case_insensitive = false;
+          break loop;
+        }
+      } else if (sym >= 'a' && sym <= 'z') {
+        if (this.encode[sym.toUpperCase()] != i) {
+          this.case_insensitive = false;
+          break loop;
+        }
+      }
+      aliases = this.symbols[i].aliases;
+      if (aliases != null) {
+        for (j = 0; j < aliases.length; j++) {
+          sym = aliases.charAt(j);
+          if (sym >= 'A' && sym <= 'Z') {
+            if (this.encode[sym.toLowerCase()] != i) {
+              this.case_insensitive = false;
+              break loop;
+            }
+          } else if (sym >= 'a' && sym <= 'z') {
+            if (this.encode[sym.toUpperCase()] != i) {
+              this.case_insensitive = false;
+              break loop;
+            }
+          }
+        }
+      }
+    }
+  }
+  // normalise aliases to remove the prime symbol and eliminate
+  // the alternate cases when the alphabet is case insensitive
+  var seen, out;
+  for (i = 0; i < this.symbols.length; i++) {
+    sym = this.symbols[i].symbol;
+    aliases = this.symbols[i].aliases;
+    if (typeof aliases != "string") aliases = "";
+    seen = {};
+    out = [];
+    if (this.case_insensitive) {
+      sym = sym.toUpperCase();
+      aliases = aliases.toUpperCase();
+    }
+    seen[sym] = true;
+    for (j = 0; j < aliases.length; j++) {
+      if (!seen[aliases.charAt(j)]) {
+        seen[aliases.charAt(j)] = true;
+        out.push(aliases.charAt(j));
+      }
+    }
+    this.symbols[i].aliases = out.sort().join("");
+  }
+};
+// return the name of the alphabet
+Alphabet.prototype.get_alphabet_name = function() {
+  return this.name;
+};
+// return if the alphabet can be complemented
+Alphabet.prototype.has_complement = function() {
+  return (typeof this.symbols[0].complement === "string");
+};
+// return true if an uppercase letter has the same meaning as the lowercase form
+Alphabet.prototype.is_case_insensitive = function() {
+  return this.case_insensitive;
+};
+// return the information content of an alphabet letter
+Alphabet.prototype.get_ic = function() {
+  return Math.log(this.ncore) / Math.LN2;
+};
+// return the count of the core alphabet symbols
+Alphabet.prototype.get_size_core = function() {
+  return this.ncore;
+};
+// return the count of all alphabet symbols
+Alphabet.prototype.get_size_full = function() {
+  return this.symbols.length;
+};
+// return the symbol for the given alphabet index
+Alphabet.prototype.get_symbol = function(alph_index) {
+  "use strict";
+  if (alph_index < 0 || alph_index >= this.symbols.length) {
+    throw new Error("Alphabet index out of bounds");
+  }
+  return this.symbols[alph_index].symbol;
+};
+// return the aliases for the given alphabet index
+Alphabet.prototype.get_aliases = function(alph_index) {
+  "use strict";
+  if (alph_index < 0 || alph_index >= this.symbols.length) {
+    throw new Error("Alphabet index out of bounds");
+  }
+  var sym_obj = this.symbols[alph_index];
+  return (sym_obj.aliases != null ? sym_obj.aliases : "");
+};
+// return the name for the given alphabet index
+Alphabet.prototype.get_name = function(alph_index) {
+  "use strict";
+  var sym;
+  if (alph_index < 0 || alph_index >= this.symbols.length) {
+    throw new Error("Alphabet index out of bounds");
+  }
+  sym = this.symbols[alph_index];
+  return (typeof sym.name === "string" ? sym.name : sym.symbol);
+};
+// return the alphabet it is like or null
+Alphabet.prototype.get_like = function() {
+  "use strict";
+  return this.like;
+};
+// return the index of the complement for the given alphabet index
+Alphabet.prototype.get_complement = function(alph_index) {
+  var comp_e_sym = this.complement[alph_index];
+  if (typeof comp_e_sym === "number") {
+    return comp_e_sym;
+  } else {
+    return -1;
+  }
+};
+// return a string containing the core symbols
+Alphabet.prototype.get_symbols = function() {
+  "use strict";
+  var i, core_symbols;
+  core_symbols = "";
+  for (i = 0; i < this.ncore; i++) {
+    core_symbols += this.symbols[i].symbol;
+  }
+  return core_symbols;
+};
+// return if the background was not a uniform generated background
+Alphabet.prototype.has_bg = function() {
+  "use strict";
+  return !this.genbg;
+};
+// get the background frequency for the index
+Alphabet.prototype.get_bg_freq = function(alph_index) {
+  "use strict";
+  var freq, i, symbols;
+  if (alph_index >= 0) {
+    if (alph_index < this.ncore) {
+      return this.background[alph_index];
+    } else if (alph_index < this.symbols.length) {
+      freq = 0;
+      symbols = this.symbols[alph_index].equals;
+      for (i = 0; i < symbols.length; i++) {
+        freq += this.background[this.encode2core[symbols.charAt(i)]];
+      }
+      return freq;
+    } 
+  }
+  throw new Error("The alphabet index is out of range.");
+};
+// get the colour of the index
+Alphabet.prototype.get_colour = function(alph_index) {
+  "use strict";
+  if (alph_index < 0 || alph_index >= this.symbols.length) {
+    throw new Error("BAD_ALPHABET_INDEX");
+  }
+  if (typeof this.symbols[alph_index].colour != "string") {
+    return "black";
+  }
+  return "#" + this.symbols[alph_index].colour;
+};
+// get the rgb componets of the colour at the index
+Alphabet.prototype.get_rgb = function(alph_index) {
+  "use strict";
+  if (alph_index < 0 || alph_index >= this.symbols.length) {
+    throw new Error("BAD_ALPHABET_INDEX");
+  }
+  if (typeof this.symbols[alph_index].colour != "string") {
+    return {"red": 0, "green": 0, "blue": 0};
+  }
+  var colour = this.symbols[alph_index].colour;
+  var red = parseInt(colour.substr(0, 2), 16) / 255;
+  var green = parseInt(colour.substr(2, 2), 16) / 255;
+  var blue = parseInt(colour.substr(4, 2), 16) / 255;
+  return {"red": red, "green": green, "blue": blue};
+};
+// convert a symbol into the index
+Alphabet.prototype.get_index = function(letter) {
+  "use strict";
+  var alph_index;
+  alph_index = this.encode[letter];
+  if (typeof alph_index === "undefined") {
+    return -1;
+  }
+  return alph_index;
+};
+// convert a symbol into the list of core indexes that it equals
+Alphabet.prototype.get_indexes = function(letter) {
+  "use strict";
+  var alph_index, comprise_str, i, comprise_list;
+  alph_index = this.encode[letter];
+  if (typeof alph_index === "undefined") {
+    throw new Error("Unknown letter");
+  }
+  comprise_str = this.symbols[alph_index].equals;
+  comprise_list = [];
+  if (typeof comprise_str == "string") {
+    for (i = 0; i < comprise_str.length; i++) {
+      comprise_list.push(this.encode2core[comprise_str.charAt(i)]);
+    }
+  } else {
+    comprise_list.push(alph_index);
+  }
+  return comprise_list;
+};
+// check if a symbol is the primary way of representing the symbol in the alphabet
+Alphabet.prototype.is_prime_symbol = function(letter) {
+  var alph_index;
+  alph_index = this.encode[letter];
+  if (alph_index == null) return false;
+  if (this.is_case_insensitive()) {
+    return (this.symbols[alph_index].symbol.toUpperCase() == letter.toUpperCase());
+  } else {
+    return (this.symbols[alph_index].symbol == letter);
+  }
+};
+// compare 2 alphabets
+Alphabet.prototype.equals = function(other) {
+  "use strict";
+  var i, sym1, sym2;
+  // first check that it's actually an alphabet object
+  if (!(typeof other === "object" && other != null && other instanceof Alphabet)) {
+    return false;
+  }
+  // second shortcircuit if it's the same object
+  if (this === other) return true;
+  // compare
+  if (this.name !== other.name) return false;
+  if (this.ncore !== other.ncore) return false;
+  if (this.symbols.length !== other.symbols.length) return false;
+  for (i = 0; i < this.symbols.length; i++) {
+    sym1 = this.symbols[i];
+    sym2 = other.symbols[i];
+    if (sym1.symbol !== sym2.symbol) return false;
+    if (sym1.aliases !== sym2.aliases) return false;
+    if (sym1.name !== sym2.name) return false;
+    if (typeof sym1.colour !== typeof sym2.colour || 
+        (typeof sym1.colour === "string" && typeof sym2.colour === "string" &&
+         parseInt(sym1.colour, 16) != parseInt(sym2.colour, 16))) {
+      return false;
+    }
+    if (sym1.complement !== sym2.complement) return false;
+    if (sym1.equals !== sym2.equals) return false;
+  }
+  return true;
+};
+Alphabet.prototype.check_core_subset = function(super_alph) {
+  var complement_same = true;
+  var seen_set = {};
+  var sub_i, sub_symbol, super_i, super_symbol;
+  for (sub_i = 0; sub_i < this.ncore; sub_i++) {
+    sub_symbol = this.symbols[sub_i];
+    super_i = super_alph.encode[sub_symbol.symbol]; 
+    if (super_i == null) return 0;
+    super_symbol = super_alph.symbols[super_i];
+    if (seen_set[super_i]) return 0;
+    seen_set[super_i] = true;
+    // check complement
+    if (sub_symbol.complement != null && super_symbol.complement != null) {
+      if (super_alph.encode[sub_symbol.complement] != super_alph.encode[super_symbol.complement]) {
+        complement_same = false;
+      }
+    } else if (sub_symbol.complement != null || super_symbol.complement != null) {
+      complement_same = false;
+    }
+  }
+  return (complement_same ? 1 : -1);
+};
+// convert a sequence to its reverse complement
+Alphabet.prototype.invcomp_seq = function(seq) {
+  "use strict";
+  var syms, i, e_sym, comp_e_sym;
+  if (!this.has_complement()) throw new Error("Alphabet must be complementable");
+  syms = seq.split("");
+  for (i = 0; i < syms.length; i++) {
+    e_sym = this.encode[syms[i]];
+    if (typeof e_sym === "undefined") {
+      e_sym = this.ncore; // wildcard
+    }
+    comp_e_sym = this.complement[e_sym];
+    if (typeof comp_e_sym === "undefined") {
+      comp_e_sym = e_sym; // not complementable
+    }
+    syms[i] = this.symbols[comp_e_sym].symbol;
+  }
+  return syms.reverse().join("");
+};
+// convert the alphabet to the text version
+Alphabet.prototype.as_text = function() {
+  "use strict";
+  function name_as_text(name) {
+    var i, c, out;
+    out = "\"";
+    for (i = 0; i < name.length; i++) {
+      c = name.charAt(i);
+      if (c == "\"") {
+        out += "\\\"";
+      } else if (c == "/") {
+        out += "\\/";
+      } else if (c == "\\") {
+        out += "\\\\";
+      } else {
+        out += c;
+      }
+    }
+    out += "\"";
+    return out;
+  }
+  function symbol_as_text(sym) {
+    var out;
+    out = sym.symbol;
+    if (typeof sym.name === "string" && sym.name != sym.symbol) {
+      out += " " + name_as_text(sym.name);
+    }
+    if (typeof sym.colour === "string") {
+      out += " " + sym.colour;
+    }
+    return out;
+  }
+  var out, i, j, c, sym;
+  out = "";
+  // output core symbols with 2 way complements
+  for (i = 0; i < this.ncore; i++) {
+    c = this.complement[i];
+    if (typeof c === "number" && i < c && this.complement[c] === i) {
+      out += symbol_as_text(this.symbols[i]) + " ~ " + symbol_as_text(this.symbols[c]) + "\n";  
+    }
+  }
+  // output core symbols with no complement
+  for (i = 0; i < this.ncore; i++) {
+    if (typeof this.complement[i] === "undefined") {
+      out += symbol_as_text(this.symbols[i]) + "\n";
+    }
+  }
+  // output ambiguous symbols that have comprising characters
+  for (i = this.ncore; i < this.symbols.length; i++) {
+    if (this.symbols[i].equals.length == 0) break;
+    out += symbol_as_text(this.symbols[i]) + " = " + this.symbols[i].equals + "\n";
+    if (typeof this.symbols[i].aliases === "string") {
+      for (j = 0; j < this.symbols[i].aliases.length; j++) {
+        if (this.symbols[i].aliases.charAt(j) == this.symbols[i].symbol) continue;
+        out += this.symbols[i].aliases.charAt(j) + " = " + this.symbols[i].equals + "\n";
+      }
+    }
+  }
+  // output aliases of core symbols
+  for (i = 0; i < this.ncore; i++) {
+    if (typeof this.symbols[i].aliases === "string") {
+      for (j = 0; j < this.symbols[i].aliases.length; j++) {
+        if (this.symbols[i].aliases.charAt(j) == this.symbols[i].symbol) continue;
+        out += this.symbols[i].aliases.charAt(j) + " = " + this.symbols[i].symbol + "\n";
+      }
+    }
+  }
+  // output gap symbols
+  i = this.symbols.length - 1;
+  if (this.symbols[i].equals.length == 0) {
+    out += symbol_as_text(this.symbols[i]) + " =\n";
+    if (typeof this.symbols[i].aliases === "string") {
+      for (j = 0; j < this.symbols[i].aliases.length; j++) {
+        if (this.symbols[i].aliases.charAt(j) == this.symbols[i].symbol) continue;
+        out += this.symbols[i].aliases.charAt(j) + " =\n";
+      }
+    }
+  }
+  return out;
+};
+// output the alphabet as it appears in minimal MEME format
+Alphabet.prototype.as_meme = function() {
+  "use strict";
+  function name_as_text(name) {
+    var i, c, out;
+    out = "\"";
+    for (i = 0; i < name.length; i++) {
+      c = name.charAt(i);
+      if (c == "\"") {
+        out += "\\\"";
+      } else if (c == "/") {
+        out += "\\/";
+      } else if (c == "\\") {
+        out += "\\\\";
+      } else {
+        out += c;
+      }
+    }
+    out += "\"";
+    return out;
+  }
+  if (this.equals(AlphStd.DNA)) {
+    return "ALPHABET= ACGT\n";
+  } else if (this.equals(AlphStd.PROTEIN)) {
+    return "ALPHABET= ACDEFGHIKLMNPQRSTVWY\n";
+  } else {
+    return "ALPHABET" + 
+      (this.name != null ? " " + name_as_text(this.name) : "") + 
+      (this.like != null ? " " + this.like + "-LIKE" : "") + "\n" +
+      this.as_text() + "END ALPHABET\n";
+  }
+};
+
+// Returns a table showing all the letters in the alphabet
+Alphabet.prototype.as_table = function() {
+  "use strict";
+  var i, j, row, th, td, aliases, equals, sym;
+  var table = document.createElement("table");
+  // create the core symbol header
+  row = table.insertRow(table.rows.length);
+  th = document.createElement("th");
+  th.appendChild(document.createTextNode("Symbol(s)"));
+  row.appendChild(th);
+  th = document.createElement("th");
+  th.appendChild(document.createTextNode("Name"));
+  row.appendChild(th);
+  th = document.createElement("th");
+  if (this.has_complement()) {
+    th.appendChild(document.createTextNode("Complement"));
+  }
+  row.appendChild(th);
+  // list the core symbols
+  for (i = 0; i < this.ncore; i++) {
+    row = table.insertRow(table.rows.length);
+    td = document.createElement("td");
+    if (this.symbols[i].colour != null) {
+      td.style.color = '#' + this.symbols[i].colour;
+    }
+    td.appendChild(document.createTextNode(this.symbols[i].symbol));
+    aliases = this.get_aliases(i);
+    if (aliases.length > 0) {
+      td.appendChild(document.createTextNode(' ' + aliases.split('').join(' ')));
+    }
+    row.appendChild(td);
+    td = document.createElement("td");
+    if (this.symbols[i].name != null) {
+      td.appendChild(document.createTextNode(this.symbols[i].name));
+    }
+    row.appendChild(td);
+    td = document.createElement("td");
+    if (this.symbols[i].complement != null) {
+      td.style.color = this.get_colour(this.get_index(this.symbols[i].complement));
+      td.appendChild(document.createTextNode(this.symbols[i].complement));
+    }
+    row.appendChild(td);
+  }
+  // create the ambiguous symbol header
+  row = table.insertRow(table.rows.length);
+  th = document.createElement("th");
+  th.appendChild(document.createTextNode("Symbol(s)"));
+  row.appendChild(th);
+  th = document.createElement("th");
+  th.appendChild(document.createTextNode("Name"));
+  row.appendChild(th);
+  th = document.createElement("th");
+  th.appendChild(document.createTextNode("Matches"));
+  row.appendChild(th);
+  // list the ambiguous symbols
+  for (i = this.ncore; i < this.symbols.length; i++) {
+    row = table.insertRow(table.rows.length);
+    td = document.createElement("td");
+    if (this.symbols[i].colour != null) {
+      td.style.color = '#' + this.symbols[i].colour;
+    }
+    td.appendChild(document.createTextNode(this.symbols[i].symbol));
+    aliases = this.get_aliases(i);
+    if (aliases.length > 0) {
+      td.appendChild(document.createTextNode(' ' + aliases.split('').join(' ')));
+    }
+    row.appendChild(td);
+    td = document.createElement("td");
+    if (this.symbols[i].name != null) {
+      td.appendChild(document.createTextNode(this.symbols[i].name));
+    }
+    row.appendChild(td);
+    td = document.createElement("td");
+    equals = this.symbols[i].equals.split('');
+    for (j = 0; j < equals.length; j++) {
+      if (j != 0) td.appendChild(document.createTextNode(' '));
+      sym = document.createElement("span");
+      sym.style.color = this.get_colour(this.get_index(equals[j]));
+      sym.appendChild(document.createTextNode(equals[j]));
+      td.appendChild(sym);
+    }
+    row.appendChild(td);
+  }
+  return table;
+};
+
+// returns a dictionary of the colours for EPS
+Alphabet.prototype._as_eps_dict = function() {
+  "use strict";
+  var i, sym, rgb;
+  var out = "/fullColourDict <<\n";
+  for (i = 0; i < this.ncore; i++) {
+    sym = this.get_symbol(i);
+    sym = sym.replace(/\\/g, "\\\\");
+    sym = sym.replace(/\(/g, "\\(");
+    sym = sym.replace(/\)/g, "\\)");
+    rgb = this.get_rgb(i);
+    out += " (" + sym + ") [" + rgb.red.toFixed(4) + " " + rgb.green.toFixed(4) + " " + rgb.blue.toFixed(4) + "]\n";
+  }
+  out += ">> def\n";
+  out += "/mutedColourDict <<\n";
+  for (i = 0; i < this.ncore; i++) {
+    sym = this.get_symbol(i);
+    sym = sym.replace(/\\/g, "\\\\");
+    sym = sym.replace(/\(/g, "\\(");
+    sym = sym.replace(/\)/g, "\\)");
+    rgb = Alphabet.lighten_colour(this.get_rgb(i));
+    out += " (" + sym + ") [" + rgb.red.toFixed(4) + " " + rgb.green.toFixed(4) + " " + rgb.blue.toFixed(4) + "]\n";
+  }
+  out += ">> def\n";
+  return out;
+};
+
+// return the alphabet name or a list of primary symbols
+Alphabet.prototype.toString = function() {
+  "use strict";
+  if (this.name != null) {
+    return this.name;
+  } else {
+    return this.get_symbols();
+  }
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Helper functions
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+// Convert a colour specified in RGB colourspace values into LAB colourspace
+Alphabet.rgb2lab = function(rgb) {
+  "use strict";
+  var xyzHelper, labHelper;
+  // XYZ helper
+  xyzHelper = function(value) {
+    if (value > 0.0445) {
+      value = (value + 0.055) / 1.055;
+      value = Math.pow(value, 2.4);
+    } else {
+      value /= 12.92;
+    }
+    value *= 100;
+    return value;
+  };
+  // lab helper
+  labHelper = function(value) {
+    if (value > 0.008856) {
+      value = Math.pow(value, 1.0 / 3.0);
+    } else {
+      value = (7.787 * value) + (16.0 / 116.0);
+    }
+    return value;
+  };
+  // convert into XYZ colourspace
+  var c1, c2, c3;
+  if (typeof rgb == "number") {
+    c1 = xyzHelper(((rgb >> 16) & 0xFF) / 255.0);
+    c2 = xyzHelper(((rgb >> 8) & 0xFF) / 255.0);
+    c3 = xyzHelper((rgb & 0xFF) / 255.0);
+  } else {
+    c1 = xyzHelper(rgb.red);
+    c2 = xyzHelper(rgb.green);
+    c3 = xyzHelper(rgb.blue);
+  }
+  var x = (c1 * 0.4124) + (c2 * 0.3576) + (c3 * 0.1805);
+  var y = (c1 * 0.2126) + (c2 * 0.7152) + (c3 * 0.0722);
+  var z = (c1 * 0.0193) + (c2 * 0.1192) + (c3 * 0.9505);
+  // convert into Lab colourspace
+  c1 = labHelper(x / 95.047);
+  c2 = labHelper(y / 100.0);
+  c3 = labHelper(z / 108.883);
+  var l = (116.0 * c2) - 16;
+  var a = 500.0 * (c1 - c2);
+  var b = 200.0 * (c2 - c3);
+  return {"l": l, "a": a, "b": b};
+};
+
+// Convert a colour specified in HSV colourspace into RGB colourspace
+Alphabet.hsv2rgb = function(hue, sat, value, output_object) {
+  // achromatic (grey)
+  var r = value;
+  var g = value;
+  var b = value;
+  if (sat != 0) {
+    var h = hue / 60.0;
+    var i = Math.floor(h);
+    var f = h - i;
+    var p = value * (1.0 - sat);
+    var q = value * (1.0 - (sat * f));
+    var t = value * (1.0 - (sat * (1.0 - f)));
+    if (i == 0) {
+      r = value;
+      g = t;
+      b = p;
+    } else if (i == 1) {
+      r = q;
+      g = value;
+      b = p;
+    } else if (i == 2) {
+      r = p;
+      g = value;
+      b = t;
+    } else if (i == 3) {
+      r = p;
+      g = q;
+      b = value;
+    } else if (i == 4) {
+      r = t;
+      g = p;
+      b = value;
+    } else {
+      r = value;
+      g = p;
+      b = q;
+    }
+  }
+  if (output_object) {
+    return {"red": r, "green": g, "blue": b};
+  } else {
+    return (Math.floor(r * 255) << 15) | (Math.floor(g * 255) << 8) | (Math.floor(b * 255));
+  }
+};
+
+// Calculate a distance score between two colours in LAB colourspace
+Alphabet.lab_dist = function(lab1, lab2) {
+  var c1 = Math.sqrt((lab1.l * lab1.l) + (lab1.a * lab1.a));
+  var c2 = Math.sqrt((lab2.l * lab2.l) + (lab2.a * lab2.a));
+  var dc = c1 - c2;
+  var dl = lab1.l - lab2.l;
+  var da = lab1.a - lab2.a;
+  var db = lab1.b - lab2.b;
+  // we don't want NaN due to rounding errors so fudge things a bit...
+  var dh = 0;
+  var dh_squared = (da * da) + (db * db) - (dc * dc);
+  if (dh_squared > 0) {
+    dh = Math.sqrt(dh_squared);
+  }
+  var first = dl;
+  var second = dc / (1.0 + (0.045 * c1));
+  var third = dh / (1.0 + (0.015 * c1));
+  return Math.sqrt((first * first) + (second * second) + (third * third));
+};
+
+// convert an RGB value into a HSL value
+Alphabet.rgb2hsl = function(rgb) {
+  "use strict";
+  var min, max, delta, h, s, l, r, g, b;
+  if (typeof rgb == "number") {
+    r = ((rgb >> 16) & 0xFF) / 255.0;
+    g = ((rgb >> 8) & 0xFF) / 255.0;
+    b = (rgb & 0xFF) / 255.0;
+  } else {
+    r = rgb.red;
+    g = rgb.green;
+    b = rgb.blue;
+  }
+  min = Math.min(r, g, b);
+  max = Math.max(r, g, b);
+  delta = max - min;
+  l = min + (delta / 2);
+  if (max == min) {
+    h = 0; // achromatic (grayscale)
+    s = 0;
+  } else {
+    if (l > 0.5) {
+      s = delta / (2 - max - min);
+    } else {
+      s = delta / (max + min);
+    }
+    if (max == r) {
+      h = (g - b) / delta;
+      if (g < b) h += 6;
+    } else if (max == g) {
+      h = ((b - r) / delta) + 2;
+    } else {
+      h = ((r - g) / delta) + 4;
+    }
+    h /= 6;
+  }
+  return {"h": h, "s": s, "l": l};
+};
+
+// convert a HSL value into an RGB value
+Alphabet.hsl2rgb = function(hsl, output_object) {
+  "use strict";
+  function _hue(p, q, t) {
+    "use strict";
+    if (t < 0) t += 1;
+    else if (t > 1) t -= 1;
+    if (t < (1.0 / 6.0)) {
+      return p + ((q - p) * 6.0 * t);
+    } else if (t < 0.5) {
+      return q;
+    } else if (t < (2.0 / 3.0)) {
+      return p + ((q - p) * ((2.0 / 3.0) - t) * 6.0);
+    } else {
+      return p;
+    }
+  }
+  var r, g, b, p, q;
+  if (hsl.s == 0) {
+    // achromatic (grayscale)
+    r = hsl.l;
+    g = hsl.l;
+    b = hsl.l;
+  } else {
+    if (hsl.l < 0.5) {
+      q = hsl.l * (1 + hsl.s);
+    } else {
+      q = hsl.l + hsl.s - (hsl.l * hsl.s);
+    }
+    p = (2 * hsl.l) - q;
+    r = _hue(p, q, hsl.h + (1.0 / 3.0));
+    g = _hue(p, q, hsl.h);
+    b = _hue(p, q, hsl.h - (1.0 / 3.0));
+  }
+  if (output_object) {
+    return {"red": r, "green": g, "blue": b};
+  } else {
+    return (Math.floor(r * 255) << 15) | (Math.floor(g * 255) << 8) | (Math.floor(b * 255));
+  }
+};
+
+Alphabet.lighten_colour = function(rgb) {
+  "use strict";
+  var hsl = Alphabet.rgb2hsl(rgb);
+  hsl.l += (1.0 - hsl.l) * 2 / 3;
+  return Alphabet.hsl2rgb(hsl, typeof rgb != "number");
+};
+
+//======================================================================
+// end Alphabet object
+//======================================================================
+
+//======================================================================
+// start StandardAlphabet object
+//======================================================================
+
+// an extension of the alphabet object to support some additional fields 
+// only present in standard alphabets.
+var StandardAlphabet = function(enum_code, enum_name, alphabet_data) {
+  Alphabet.apply(this, [alphabet_data]);
+  this.enum_code = enum_code;
+  this.enum_name = enum_name;
+};
+StandardAlphabet.prototype = Alphabet.prototype;
+StandardAlphabet.prototype.constructor = StandardAlphabet;
+
+// A unique code for this standard alphabet.
+// This code will be a power of 2 to enable creation of bitsets for
+// a selection of standard alphabets.
+StandardAlphabet.prototype.get_code = function() {
+  return this.enum_code;
+};
+
+// A unique name for this standard alphabet.
+// this name will be all upper case and the same as the property that
+// refers to this alphabet in the AlphStd collection.
+StandardAlphabet.prototype.get_enum = function() {
+  return this.enum_name;
+};
+
+//======================================================================
+// end StandardAlphabet object
+//======================================================================
+
+// A collection of standard alphabets.
+var AlphStd = {
+  RNA: new StandardAlphabet(1, "RNA", {
+    "name": "RNA",
+    "like": "RNA",
+    "ncore": 4,
+    "symbols": [
+      {"symbol": "A", "name": "Adenine", "colour": "CC0000"},
+      {"symbol": "C", "name": "Cytosine", "colour": "0000CC"},
+      {"symbol": "G", "name": "Guanine", "colour": "FFB300"},
+      {"symbol": "U", "name": "Uracil", "colour": "008000",
+        "aliases": "T"},
+      {"symbol": "N", "name": "Any base", "equals": "ACGU", "aliases": "X."},
+      {"symbol": "V", "name": "Not U", "equals": "ACG"},
+      {"symbol": "H", "name": "Not G", "equals": "ACU"},
+      {"symbol": "D", "name": "Not C", "equals": "AGU"},
+      {"symbol": "B", "name": "Not A", "equals": "CGU"},
+      {"symbol": "M", "name": "Amino", "equals": "AC"},
+      {"symbol": "R", "name": "Purine", "equals": "AG"},
+      {"symbol": "W", "name": "Weak", "equals": "AU"}, 
+      {"symbol": "S", "name": "Strong", "equals": "CG"},
+      {"symbol": "Y", "name": "Pyrimidine", "equals": "CU"},
+      {"symbol": "K", "name": "Keto", "equals": "GU"}
+    ]
+  }), 
+  DNA: new StandardAlphabet(2, "DNA", {
+    "name": "DNA",
+    "like": "DNA",
+    "ncore": 4,
+    "symbols": [
+      {"symbol": "A", "name": "Adenine", "colour": "CC0000", "complement": "T"},
+      {"symbol": "C", "name": "Cytosine", "colour": "0000CC", "complement": "G"},
+      {"symbol": "G", "name": "Guanine", "colour": "FFB300", "complement": "C"},
+      {"symbol": "T", "name": "Thymine", "colour": "008000", "complement": "A",
+        "aliases": "U"},
+      {"symbol": "N", "name": "Any base", "equals": "ACGT", "aliases": "X."},
+      {"symbol": "V", "name": "Not T", "equals": "ACG"},
+      {"symbol": "H", "name": "Not G", "equals": "ACT"},
+      {"symbol": "D", "name": "Not C", "equals": "AGT"},
+      {"symbol": "B", "name": "Not A", "equals": "CGT"},
+      {"symbol": "M", "name": "Amino", "equals": "AC"},
+      {"symbol": "R", "name": "Purine", "equals": "AG"},
+      {"symbol": "W", "name": "Weak", "equals": "AT"}, 
+      {"symbol": "S", "name": "Strong", "equals": "CG"},
+      {"symbol": "Y", "name": "Pyrimidine", "equals": "CT"},
+      {"symbol": "K", "name": "Keto", "equals": "GT"}
+    ]
+  }), 
+  PROTEIN: new StandardAlphabet(4, "PROTEIN", {
+    "name": "Protein",
+    "like": "PROTEIN",
+    "ncore": 20,
+    "symbols": [
+      {"symbol": "A", "name": "Alanine", "colour": "0000CC"},
+      {"symbol": "C", "name": "Cysteine", "colour": "0000CC"},
+      {"symbol": "D", "name": "Aspartic acid", "colour": "FF00FF"},
+      {"symbol": "E", "name": "Glutamic acid", "colour": "FF00FF"},
+      {"symbol": "F", "name": "Phenylalanine", "colour": "0000CC"},
+      {"symbol": "G", "name": "Glycine", "colour": "FFB300"},
+      {"symbol": "H", "name": "Histidine", "colour": "FFCCCC"},
+      {"symbol": "I", "name": "Isoleucine", "colour": "0000CC"},
+      {"symbol": "K", "name": "Lysine", "colour": "CC0000"},
+      {"symbol": "L", "name": "Leucine", "colour": "0000CC"},
+      {"symbol": "M", "name": "Methionine", "colour": "0000CC"},
+      {"symbol": "N", "name": "Asparagine", "colour": "008000"},
+      {"symbol": "P", "name": "Proline", "colour": "FFFF00"},
+      {"symbol": "Q", "name": "Glutamine", "colour": "008000"},
+      {"symbol": "R", "name": "Arginine", "colour": "CC0000"},
+      {"symbol": "S", "name": "Serine", "colour": "008000"},
+      {"symbol": "T", "name": "Threonine", "colour": "008000"},
+      {"symbol": "V", "name": "Valine", "colour": "0000CC"},
+      {"symbol": "W", "name": "Tryptophan", "colour": "0000CC"},
+      {"symbol": "Y", "name": "Tyrosine", "colour": "33E6CC"},
+      {"symbol": "X", "name": "Any amino acid", "equals": "ACDEFGHIKLMNPQRSTVWY", "aliases": "*."},
+      {"symbol": "B", "name": "Asparagine or Aspartic acid", "equals": "DN"}, 
+      {"symbol": "Z", "name": "Glutamine or Glutamic acid", "equals": "EQ"}, 
+      {"symbol": "J", "name": "Leucine or Isoleucine", "equals": "IL"}
+    ]
+  })
+};
+
+//======================================================================
+// start Symbol object
+//======================================================================
+var Symbol = function(alph_index, scale, alphabet) {
+  "use strict";
+  //variable prototype
+  this.symbol = alphabet.get_symbol(alph_index);
+  this.scale = scale;
+  this.colour = alphabet.get_colour(alph_index);
+};
+
+Symbol.prototype.get_symbol = function() {
+  "use strict";
+  return this.symbol;
+};
+
+Symbol.prototype.get_scale = function() {
+  "use strict";
+  return this.scale;
+};
+
+Symbol.prototype.get_colour = function() {
+  "use strict";
+  return this.colour;
+};
+
+Symbol.prototype.toString = function() {
+  "use strict";
+  return this.symbol + " " + (Math.round(this.scale*1000)/10) + "%";
+};
+
+function compare_symbol(sym1, sym2) {
+  "use strict";
+  if (sym1.get_scale() < sym2.get_scale()) {
+    return -1;
+  } else if (sym1.get_scale() > sym2.get_scale()) {
+    return 1;
+  } else {
+    return 0;
+  }
+}
+//======================================================================
+// end Symbol object
+//======================================================================
+
+//======================================================================
+// start Pspm object
+//======================================================================
+var Pspm = function(matrix, name, ltrim, rtrim, nsites, evalue, pssm, alt) {
+  "use strict";
+  var row, col, data, row_sum, delta, evalue_re;
+  if (typeof name !== "string") {
+    name = "";
+  }
+  this.name = name;
+  //construct
+  if (matrix instanceof Pspm) {
+    // copy constructor
+    this.alph_length = matrix.alph_length;
+    this.motif_length = matrix.motif_length;
+    this.name = matrix.name;
+    this.alt = matrix.alt;
+    this.nsites = matrix.nsites;
+    this.evalue = matrix.evalue;
+    this.ltrim = matrix.ltrim;
+    this.rtrim = matrix.rtrim;
+    this.pspm = [];
+    for (row = 0; row < matrix.motif_length; row++) {
+      this.pspm[row] = [];
+      for (col = 0; col < matrix.alph_length; col++) {
+        this.pspm[row][col] = matrix.pspm[row][col];
+      }
+    }
+    if (matrix.pssm != null) {
+      this.pssm = [];
+      for (row = 0; row < matrix.motif_length; row++) {
+        this.pspm[row] = [];
+        for (col = 0; col < matrix.alph_length; col++) {
+          this.pssm[row][col] = matrix.pssm[row][col];
+        }
+      }
+    }
+  } else {
+    // check parameters
+    if (ltrim == null) {
+      ltrim = 0;
+    } else if (typeof ltrim !== "number" || ltrim % 1 !== 0 || ltrim < 0) {
+      throw new Error("ltrim must be a non-negative integer, got: " + ltrim);
+    }
+    if (rtrim == null) {
+      rtrim = 0;
+    } else if (typeof rtrim !== "number" || rtrim % 1 !== 0 || rtrim < 0) {
+      throw new Error("rtrim must be a non-negative integer, got: " + rtrim);
+    }
+    if (nsites != null) {
+      if (typeof nsites !== "number" || nsites < 0) {
+        throw new Error("nsites must be a positive number, got: " + nsites);
+      } else if (nsites == 0) {
+        nsites = null;
+      }
+    }
+    if (evalue != null) {
+      if (typeof evalue === "number") {
+        if (evalue < 0) {
+          throw new Error("evalue must be a non-negative number, got: " + evalue);
+        }
+      } else if (typeof evalue === "string") {
+        evalue_re = /^((?:[+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?)|inf)$/;
+        if (!evalue_re.test(evalue)) {
+          throw new Error("evalue must be a non-negative number, got: " + evalue);
+        }
+      } else {
+        throw new Error("evalue must be a non-negative number, got: " + evalue);
+      }
+    }
+    // set properties
+    this.name = name;
+    this.alt = alt;
+    this.nsites = nsites;
+    this.evalue = evalue;
+    this.ltrim = ltrim;
+    this.rtrim = rtrim;
+    if (typeof matrix === "string") {
+      // string constructor
+      data = parse_pspm_string(matrix);
+      this.alph_length = data["alph_length"];
+      this.motif_length = data["motif_length"];
+      this.pspm = data["pspm"];
+      if (this.evalue == null) {
+        if (data["evalue"] != null) {
+          this.evalue = data["evalue"];
+        } else {
+          this.evalue = 0;
+        }
+      }
+      if (this.nsites == null) {
+        if (typeof data["nsites"] === "number") {
+          this.nsites = data["nsites"];
+        } else {
+          this.nsites = 20;
+        }
+      }
+    } else {
+      // assume pspm is a nested array
+      this.motif_length = matrix.length;
+      this.alph_length = (matrix.length > 0 ? matrix[0].length : 0);
+      if (this.nsites == null) {
+        this.nsites = 20;
+      }
+      if (this.evalue == null) {
+        this.evalue = 0;
+      }
+      this.pspm = [];
+      // copy pspm and check
+      for (row = 0; row < this.motif_length; row++) {
+        if (this.alph_length != matrix[row].length) {
+          throw new Error("COLUMN_MISMATCH");
+        }
+        this.pspm[row] = [];
+        row_sum = 0;
+        for (col = 0; col < this.alph_length; col++) {
+          this.pspm[row][col] = matrix[row][col];
+          row_sum += this.pspm[row][col];
+        }
+        delta = 0.1;
+        if (isNaN(row_sum) || (row_sum > 1 && (row_sum - 1) > delta) || 
+            (row_sum < 1 && (1 - row_sum) > delta)) {
+          throw new Error("INVALID_SUM");
+        }
+      }
+      // copy pssm
+      if (pssm != null) {
+        this.pssm = [];
+        for (row = 0; row < this.motif_length; row++) {
+          this.pssm[row] = [];
+          for (col = 0; col < this.alph_length; col++) {
+            this.pssm[row][col] = pssm[row][col];
+          }
+        }
+      }
+    }
+  }
+};
+
+Pspm.prototype.copy = function() {
+  "use strict";
+  return new Pspm(this);
+};
+
+Pspm.prototype.reverse = function() {
+  "use strict";
+  var x, y, temp, temp_trim;
+  //reverse
+  x = 0;
+  y = this.motif_length-1;
+  while (x < y) {
+    temp = this.pspm[x];
+    this.pspm[x] = this.pspm[y];
+    this.pspm[y] = temp;
+    x++;
+    y--;
+  }
+  // reverse pssm (if defined)
+  if (typeof this.pssm !== "undefined") {
+    //reverse
+    x = 0;
+    y = this.motif_length-1;
+    while (x < y) {
+      temp = this.pssm[x];
+      this.pspm[x] = this.pssm[y];
+      this.pssm[y] = temp;
+      x++;
+      y--;
+    }
+  }
+  //swap triming
+  temp_trim = this.ltrim;
+  this.ltrim = this.rtrim;
+  this.rtrim = temp_trim;
+  return this; //allow function chaining...
+};
+
+Pspm.prototype.reverse_complement = function(alphabet) {
+  "use strict";
+  var x, y, temp, i, row, c, temp_trim;
+  if (this.alph_length != alphabet.get_size_core()) {
+    throw new Error("The alphabet size does not match the size of the pspm.");
+  }
+  if (!alphabet.has_complement()) {
+    throw new Error("The specified alphabet can not be complemented.");
+  }
+  // reverse motif
+  this.reverse();
+  //complement
+  for (x = 0; x < this.motif_length; x++) {
+    row = this.pspm[x];
+    for (i = 0; i < row.length; i++) {
+      c = alphabet.get_complement(i);
+      if (c < i) continue;
+      temp = row[i];
+      row[i] = row[c];
+      row[c] = temp;
+    }
+  }
+  // complement pssm (if defined)
+  if (typeof this.pssm !== "undefined") {
+    //complement
+    for (x = 0; x < this.motif_length; x++) {
+      row = this.pssm[x];
+      for (i = 0; i < row.length; i++) {
+        c = alphabet.get_complement(i);
+        if (c < i) continue;
+        temp = row[i];
+        row[i] = row[c];
+        row[c] = temp;
+      }
+    }
+  }
+  return this; //allow function chaining...
+};
+
+Pspm.prototype.get_stack = function(position, alphabet, ssc) {
+  "use strict";
+  var row, stack_ic, alphabet_ic, stack, i, sym;
+  if (this.alph_length != alphabet.get_size_core()) {
+    throw new Error("The alphabet size does not match the size of the pspm.");
+  }
+  row = this.pspm[position];
+  stack_ic = this.get_stack_ic(position, alphabet);
+  if (ssc) stack_ic -= this.get_error(alphabet);
+  alphabet_ic = alphabet.get_ic();
+  stack = [];
+  for (i = 0; i < this.alph_length; i++) {
+    sym = new Symbol(i, row[i]*stack_ic/alphabet_ic, alphabet);
+    if (sym.get_scale() <= 0) {
+      continue;
+    }
+    stack.push(sym);
+  }
+  stack.sort(compare_symbol);
+  return stack;
+};
+
+Pspm.prototype.get_stack_ic = function(position, alphabet) {
+  "use strict";
+  var row, H, i;
+  if (this.alph_length != alphabet.get_size_core()) {
+    throw new Error("The alphabet size does not match the size fo the pspm.");
+  }
+  row = this.pspm[position];
+  H = 0;
+  for (i = 0; i < this.alph_length; i++) {
+    if (row[i] === 0) {
+      continue;
+    }
+    H -= (row[i] * (Math.log(row[i]) / Math.LN2));
+  }
+  return alphabet.get_ic() - H;
+};
+
+Pspm.prototype.get_error = function(alphabet) {
+  "use strict";
+  if (this.nsites === 0) {
+    return 0;
+  }
+  return (alphabet.get_size_core()-1) / (2 * Math.LN2 * this.nsites);
+};
+
+Pspm.prototype.get_motif_length = function() {
+  "use strict";
+  return this.motif_length;
+};
+
+Pspm.prototype.get_alph_length = function() {
+  "use strict";
+  return this.alph_length;
+};
+
+Pspm.prototype.get_left_trim = function() {
+  "use strict";
+  return this.ltrim;
+};
+
+Pspm.prototype.get_right_trim = function() {
+  "use strict";
+  return this.rtrim;
+};
+
+Pspm.prototype.as_best_match = function(alphabet) {
+  "use strict";
+  var match, odds, best_odds, best_index;
+  var i, j;
+  match = "";
+  for (i = 0; i < this.motif_length; i++) {
+    best_index = 0;
+    best_odds = this.pspm[i][0] / alphabet.get_bg_freq(0);
+    for (j = 1; j < this.alph_length; j++) {
+      odds = this.pspm[i][j] / alphabet.get_bg_freq(j);
+      if (odds > best_odds) {
+        best_odds = odds;
+        best_index = j;
+      }
+    }
+    match += alphabet.get_symbol(best_index);
+  }
+  return match;
+};
+
+Pspm.prototype.as_count_matrix = function() {
+  "use strict";
+  var count, count_text, text;
+  var i, j;
+  text = "";
+  for (i = 0; i < this.motif_length; i++) {
+    if (i !== 0) {
+      text += "\n";
+    }
+    for (j = 0; j < this.alph_length; j++) {
+      if (j !== 0) {
+        text += " ";
+      }
+      count = Math.round(this.nsites * this.pspm[i][j]);
+      count_text = "" + count;
+      // pad up to length of 4
+      if (count_text.length < 4) {
+        text += (new Array(5 - count_text.length)).join(" ") + count_text;
+      } else {
+        text += count_text;
+      }
+    }
+  }
+  return text; 
+};
+
+Pspm.prototype.as_probability_matrix = function() {
+  "use strict";
+  var text;
+  var i, j;
+  text = "";
+  for (i = 0; i < this.motif_length; i++) {
+    if (i !== 0) {
+      text += "\n";
+    }
+    for (j = 0; j < this.alph_length; j++) {
+      if (j !== 0) {
+        text += " ";
+      }
+      text += this.pspm[i][j].toFixed(6);
+    }
+  }
+  return text; 
+};
+
+Pspm.prototype.as_score_matrix = function(alphabet, pseudo) {
+  "use strict";
+  var me, score, out, row, col, score_text;
+  me = this;
+  if (typeof this.pssm === "undefined") {
+    if (!(typeof alphabet === "object" && alphabet != null && alphabet instanceof Alphabet)) {
+      throw new Error("The alphabet is required to generate the pssm.");
+    }
+    if (typeof pseudo === "undefined") {
+      pseudo = 0.01;
+    } else if (typeof pseudo !== "number" || pseudo < 0) {
+      throw new Error("Expected positive number for pseudocount");
+    }
+    score = function(row, col) {
+      "use strict";
+      var p, bg, p2;
+      p = me.pspm[row][col];
+      bg = alphabet.get_bg_freq(col);
+      p2 = (p * me.nsites + bg * pseudo) / (me.nsites + pseudo);
+      return (p2 > 0 ? Math.round((Math.log(p2 / bg) / Math.LN2) * 100) : -10000);
+    };
+  } else {
+    score = function(row, col) {
+      "use strict";
+      return me.pssm[row][col];
+    };
+  }
+  out = "";
+  for (row = 0; row < this.motif_length; row++) {
+    for (col = 0; col < this.alph_length; col++) {
+      if (col !== 0) {
+        out += " ";
+      }
+      score_text = "" + score(row, col);
+      // pad out to 6 characters
+      if (score_text.length < 6) {
+        out += (new Array(7 - score_text.length)).join(" ") + score_text;
+      } else {
+        out += score_text;
+      }
+    }
+    out += "\n";
+  }
+  return out;
+}
+
+Pspm.prototype.as_pspm = function() {
+  "use strict";
+  return "letter-probability matrix: alength= " + this.alph_length + 
+      " w= " + this.motif_length + " nsites= " + this.nsites + 
+      " E= " + (typeof this.evalue === "number" ? 
+          this.evalue.toExponential() : this.evalue) + "\n" +
+      this.as_probability_matrix();
+};
+
+Pspm.prototype.as_pssm = function(alphabet, pseudo) {
+  "use strict";
+  return "log-odds matrix: alength= " + this.alph_length + 
+      " w= " + this.motif_length + 
+      " E= " + (typeof this.evalue == "number" ?
+          this.evalue.toExponential() : this.evalue) + "\n" +
+      this.as_score_matrix(alphabet, pseudo);
+};
+
+Pspm.prototype.as_meme = function(options) {
+  var with_header, with_pspm, with_pssm, version, alphabet, bg_source, pseudocount, strands;
+  var out, alen, i;
+  // get the options
+  if (typeof options !== "object" || options === null) {
+    options = {};
+  }
+  with_header = (typeof options["with_header"] === "boolean" ? options["with_header"] : false);
+  with_pspm = (typeof options["with_pspm"] === "boolean" ? options["with_pspm"] : false);
+  with_pssm = (typeof options["with_pssm"] === "boolean" ? options["with_pssm"] : false);
+  if (!with_pspm && !with_pssm) with_pspm = true;
+  if (with_header) {
+    if (typeof options["version"] === "string" && /^\d+(?:\.\d+){0,2}$/.test(options["version"])) {
+      version = options["version"];
+    } else if (typeof options["version"] === "number") {
+      version = options["version"].toFixed(0);
+    } else {
+      version = "4";
+    }
+    if (typeof options["strands"] === "number" && options["strands"] === 1) {
+      strands = 1;
+    } else {
+      strands = 2;
+    }
+    if (typeof options["bg_source"] === "string") {
+      bg_source = options["bg_source"];
+    } else {
+      bg_source = "unknown source";
+    }
+    if (typeof options["alphabet"] === "object" && options["alphabet"] != null
+        && options["alphabet"] instanceof Alphabet) {
+      alphabet = options["alphabet"];
+    } else {
+      throw new Error("The alphabet is required to generate the header.");
+    }
+  }
+  // now create the output
+  out = "";
+  if (with_header) {
+    out = "MEME version " + version + "\n\n";
+    out += alphabet.as_meme() + "\n";
+    if (alphabet.has_complement()) { // assume DNA has both strands unless otherwise specified
+      out += "strands: " + (strands === 1 ? "+" : "+ -") + "\n\n";
+    }
+    out += "Background letter frequencies (from " + bg_source + "):\n";
+    alen = alphabet.get_size_core();
+    for (i = 0; i < alen; i++) {
+      if (i !== 0) {
+        if (i % 9 === 0) { // maximum of nine entries per line
+          out += "\n";
+        } else {
+          out += " ";
+        }
+      }
+      out += alphabet.get_symbol(i) + " " + alphabet.get_bg_freq(i).toFixed(3);
+    }
+  }
+  out += "\n\n";
+  out += "MOTIF " + this.name + (this.alt == null ? "" : " " + this.alt);
+  if (with_pssm) {
+    out += "\n\n";
+    out += this.as_pssm(options["alphabet"], options["pseudocount"]);
+  }
+  if (with_pspm) {
+    out += "\n\n";
+    out += this.as_pspm();
+  }
+  return out;
+}
+
+Pspm.prototype.toString = function() {
+  "use strict";
+  var str, i, row;
+  str = "";
+  for (i = 0; i < this.pspm.length; i++) {
+    row = this.pspm[i];
+    str += row.join("\t") + "\n";
+  }
+  return str;
+};
+
+function parse_pspm_properties(str) {
+  "use strict";
+  var parts, i, eqpos, before, after, properties, prop, num, num_re;
+  num_re = /^((?:[+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?)|inf)$/;
+  parts = trim(str).split(/\s+/);
+  // split up words containing =
+  for (i = 0; i < parts.length;) {
+    eqpos = parts[i].indexOf("=");
+    if (eqpos != -1) {
+      before = parts[i].substr(0, eqpos);
+      after = parts[i].substr(eqpos+1);
+      if (before.length > 0 && after.length > 0) {
+        parts.splice(i, 1, before, "=", after);
+        i += 3;
+      } else if (before.length > 0) {
+        parts.splice(i, 1, before, "=");
+        i += 2;
+      } else if (after.length > 0) {
+        parts.splice(i, 1, "=", after);
+        i += 2;
+      } else {
+        parts.splice(i, 1, "=");
+        i++;
+      }
+    } else {
+      i++;
+    }
+  }
+  properties = {};
+  for (i = 0; i < parts.length; i += 3) {
+    if (parts.length - i < 3) {
+      throw new Error("Expected PSPM property was incomplete. "+
+          "Remaing parts are: " + parts.slice(i).join(" "));
+    }
+    if (parts[i+1] !== "=") {
+      throw new Error("Expected '=' in PSPM property between key and " +
+          "value but got " + parts[i+1]); 
+    }
+    prop = parts[i].toLowerCase();
+    num = parts[i+2];
+    if (!num_re.test(num)) {
+      throw new Error("Expected numeric value for PSPM property '" + 
+          prop + "' but got '" + num + "'");
+    }
+    properties[prop] = num;
+  }
+  return properties;
+}
+
+function parse_pspm_string(pspm_string) {
+  "use strict";
+  var header_re, lines, first_line, line_num, col_num, alph_length, 
+      motif_length, nsites, evalue, pspm, i, line, match, props, parts,
+      j, prob;
+  header_re = /^letter-probability\s+matrix:(.*)$/i;
+  lines = pspm_string.split(/\n/);
+  first_line = true;
+  line_num = 0;
+  col_num = 0;
+  alph_length;
+  motif_length;
+  nsites;
+  evalue;
+  pspm = [];
+  for (i = 0; i < lines.length; i++) {
+    line = trim(lines[i]);
+    if (line.length === 0) { 
+      continue;
+    }
+    // check the first line for a header though allow matrices without it
+    if (first_line) {
+      first_line = false;
+      match = header_re.exec(line);
+      if (match !== null) {
+        props = parse_pspm_properties(match[1]);
+        if (props.hasOwnProperty("alength")) {
+          alph_length = parseFloat(props["alength"]);
+          if (alph_length != 4 && alph_length != 20) {
+            throw new Error("PSPM property alength should be 4 or 20" +
+                " but got " + alph_length);
+          }
+        }
+        if (props.hasOwnProperty("w")) {
+          motif_length = parseFloat(props["w"]);
+          if (motif_length % 1 !== 0 || motif_length < 1) {
+            throw new Error("PSPM property w should be an integer larger " +
+                "than zero but got " + motif_length);
+          }
+        }
+        if (props.hasOwnProperty("nsites")) {
+          nsites = parseFloat(props["nsites"]);
+          if (nsites <= 0) {
+            throw new Error("PSPM property nsites should be larger than " +
+                "zero but got " + nsites);
+          }
+        }
+        if (props.hasOwnProperty("e")) {
+          evalue = props["e"];
+          if (evalue < 0) {
+            throw new Error("PSPM property evalue should be " +
+                "non-negative but got " + evalue);
+          }
+        }
+        continue;
+      }
+    }
+    pspm[line_num] = [];
+    col_num = 0;
+    parts = line.split(/\s+/);
+    for (j = 0; j < parts.length; j++) {
+      prob = parseFloat(parts[j]);
+      if (prob != parts[j] || prob < 0 || prob > 1) {
+        throw new Error("Expected probability but got '" + parts[j] + "'"); 
+      }
+      pspm[line_num][col_num] = prob;
+      col_num++;
+    }
+    line_num++;
+  }
+  if (typeof motif_length === "number") {
+    if (pspm.length != motif_length) {
+      throw new Error("Expected PSPM to have a motif length of " + 
+          motif_length + " but it was actually " + pspm.length);
+    }
+  } else {
+    motif_length = pspm.length;
+  }
+  if (typeof alph_length !== "number") {
+    alph_length = pspm[0].length;
+    if (alph_length != 4 && alph_length != 20) {
+      throw new Error("Expected length of first row in the PSPM to be " +
+          "either 4 or 20 but got " + alph_length);
+    }
+  }
+  for (i = 0; i < pspm.length; i++) {
+    if (pspm[i].length != alph_length) {
+      throw new Error("Expected PSPM row " + i + " to have a length of " + 
+          alph_length + " but the length was " + pspm[i].length);
+    }
+  }
+  return {"pspm": pspm, "motif_length": motif_length, 
+    "alph_length": alph_length, "nsites": nsites, "evalue": evalue};
+}
+//======================================================================
+// end Pspm object
+//======================================================================
+
+//======================================================================
+// start Logo object
+//======================================================================
+
+var Logo = function(alphabet, options) {
+  "use strict";
+  this.alphabet = alphabet;
+  this.fine_text = "";
+  this.x_axis = 1;
+  this.y_axis = true;
+  this.xlate_nsyms = 1;
+  this.xlate_start = null;
+  this.xlate_end = null;
+  this.pspm_list = [];
+  this.pspm_column = [];
+  this.rows = 0;
+  this.columns = 0;
+  if (typeof options === "string") {
+    // the old method signature had fine_text here so we support that
+    this.fine_text = options;
+  } else if (typeof options === "object" && options != null) {
+    this.fine_text = (typeof options.fine_text === "string" ? options.fine_text : "");
+    this.x_axis = (typeof options.x_axis === "boolean" ? (options.x_axis ? 1 : 0) : 1);
+    if (options.x_axis_hidden != null && options.x_axis_hidden) this.x_axis = -1;
+    this.y_axis = (typeof options.y_axis === "boolean" ? options.y_axis : true);
+    this.xlate_nsyms = (typeof options.xlate_nsyms === "number" ? options.xlate_nsyms : this.xlate_nsyms);
+    this.xlate_start = (typeof options.xlate_start === "number" ? options.xlate_start : this.xlate_start);
+    this.xlate_end = (typeof options.xlate_end === "number" ? options.xlate_end : this.xlate_end);
+  }
+};
+
+Logo.prototype.add_pspm = function(pspm, column) {
+  "use strict";
+  var col;
+  if (typeof column === "undefined") {
+    column = 0;
+  } else if (column < 0) {
+    throw new Error("Column index out of bounds.");
+  }
+  this.pspm_list[this.rows] = pspm;
+  this.pspm_column[this.rows] = column;
+  this.rows++;
+  col = column + pspm.get_motif_length();
+  if (col > this.columns) {
+    this.columns = col;
+  }
+};
+
+Logo.prototype.get_columns = function() {
+  "use strict";
+  return this.columns;
+};
+
+Logo.prototype.get_xlate_nsyms = function() {
+  "use strict";
+  return this.xlate_nsyms;
+};
+
+Logo.prototype.get_xlate_start = function() {
+  "use strict";
+  return (this.xlate_start != null ? this.xlate_start : 0);
+};
+
+Logo.prototype.get_xlate_end = function() {
+  "use strict";
+  return (this.xlate_end != null ? this.xlate_end : this.columns * this.xlate_nsyms);
+};
+
+Logo.prototype.get_xlate_columns = function() {
+  "use strict";
+  return this.get_xlate_end() - this.get_xlate_start();
+};
+
+Logo.prototype.get_rows = function() {
+  "use strict";
+  return this.rows;
+};
+
+Logo.prototype.get_pspm = function(row_index) {
+  "use strict";
+  if (row_index < 0 || row_index >= this.rows) {
+    throw new Error("INDEX_OUT_OF_BOUNDS");
+  }
+  return this.pspm_list[row_index];
+};
+
+Logo.prototype.get_offset = function(row_index) {
+  "use strict";
+  if (row_index < 0 || row_index >= this.rows) {
+    throw new Error("INDEX_OUT_OF_BOUNDS");
+  }
+  return this.pspm_column[row_index];
+};
+
+Logo.prototype._as_eps_data = function(ssc, errbars) {
+  var i, j, pos, stack_pos, pspm, stack, sym, out;
+  out = "";
+  for (i = 0; i < this.rows; i++) {
+    out += "\nStartLine\n";
+    // Indent
+    for (j = 0; j < this.pspm_column[i]; j++) {
+      out += "() startstack\nendstack\n\n";
+    }
+    pspm = this.pspm_list[i];
+    if (pspm.get_left_trim() > 0) {
+      out += "MuteColour\nDrawTrimEdge\n" + pspm.get_left_trim() + " DrawTrimBg\n";
+    }
+    for (pos = 0; pos < pspm.get_motif_length(); pos++) {
+      if (pos != 0 && pos == pspm.get_left_trim()) { // enable full colour
+        out += "DrawTrimEdge\nRestoreColour\n";
+      } else if (pos == (pspm.get_motif_length() - pspm.get_right_trim())) {
+        out += "MuteColour\n" + pspm.get_right_trim() + " DrawTrimBg\n";
+      }
+      out += "(" + (pos + 1) + ") startstack\n";
+      stack = pspm.get_stack(pos, this.alphabet, ssc);
+      for (stack_pos = 0; stack_pos < stack.length; stack_pos++) {
+        sym = stack[stack_pos];
+        out += " " + (sym.get_scale() * this.alphabet.get_ic()) + " (" + sym.get_symbol() + ") numchar\n";
+      }
+      if (errbars) {
+        out += " " + pspm.get_error(this.alphabet) + " Ibeam\n";
+      }
+      out += "endstack\n\n";
+    }
+    if (pspm.get_right_trim() > 0 || pspm.get_left_trim() == pspm.get_motif_length()) {
+      out += "RestoreColour\n";
+    }
+    out += "EndLine\n";
+  }
+  return out;
+};
+
+Logo.prototype.as_eps = function(options) {
+  "use strict";
+  if (this.xlate_nsyms != 1) throw new Error("Unsupported setting xlate_nsyms for EPS");
+  if (this.xlate_start != null) throw new Error("Unsupported setting xlate_start for EPS");
+  if (this.xlate_end != null) throw new Error("Unsupported setting xlate_end for EPS");
+
+  var LOGOHEIGHT = 7.5; // default height of line in cm
+  var cm2pts, height, width, now, ssc, errbars;
+  if (typeof options === "undefined") {
+    options = {};
+  }
+  cm2pts = 72 / 2.54;
+  if (typeof options.logo_height == "number") {
+    height = options.logo_height;
+  } else {
+    height = LOGOHEIGHT * this.rows;
+  }
+  if (typeof options.logo_width == "number") {
+    width = options.logo_width;
+  } else {
+    width = this.columns + 2;
+  }
+  now = new Date();
+  ssc = (typeof options.ssc == "boolean" ? options.ssc : false);
+  errbars = (typeof options.show_error_bar == "boolean" ? options.show_error_bar : ssc);
+  var values = {
+    "LOGOHEIGHT": height,
+    "LOGOWIDTH": width,
+    "BOUNDINGHEIGHT": Math.round(height * cm2pts),
+    "BOUNDINGWIDTH": Math.round(width * cm2pts),
+    "LOGOLINEHEIGHT": (height / this.rows),
+    "CHARSPERLINE": this.columns,
+    "BARBITS": this.alphabet.get_ic(),
+    "LOGOTYPE": (this.alphabet.has_complement() ? "NA" : "AA"),
+    "CREATIONDATE": now.getDate() + "." + (now.getMonth() + 1) + "." + now.getFullYear() + " " + now.getHours() + ":" + now.getMinutes() + ":" + now.getSeconds(),
+    "ERRORBARFRACTION": (typeof options.error_bar_fraction == "number" ? options.error_bar_fraction : 1.0),
+    "TICBITS": (typeof options.ticbits == "number" ? options.ticbits : 1.0),
+    "TITLE": (typeof options.title == "string" ? options.title : ""),
+    "FINEPRINT": (typeof options.fineprint == "string" ? options.fineprint : this.fine_text),
+    "XAXISLABEL": (typeof options.xaxislabel == "string" ? options.xaxislabel : ""),
+    "YAXISLABEL": (typeof options.yaxislabel == "string" ? options.yaxislabel : "bits"),
+    "SSC": ssc,
+    "YAXIS": (typeof options.show_y_axis == "boolean" ? options.show_y_axis : this.y_axis),
+    "SHOWENDS": (typeof options.show_ends == "boolean" ? options.show_ends : false),
+    "ERRBAR": errbars,
+    "OUTLINE": (typeof options.show_outline == "boolean" ? options.show_outline : false),
+    "NUMBERING": (typeof options.show_numbering == "boolean" ? options.show_numbering : this.x_axis != 0),
+    "SHOWINGBOX": (typeof options.show_box == "boolean" ? options.show_box : false),
+    "CREATOR": (typeof options.creator == "string" ? options.creator : "motif_logo.js"),
+    "FONTSIZE": (typeof options.label_font_size == "number" ? options.label_font_size : 12),
+    "TITLEFONTSIZE": (typeof options.title_font_size == "number" ? options.title_font_size : 12),
+    "SMALLFONTSIZE": (typeof options.small_font_size == "number" ? options.small_font_size : 6),
+    "TOPMARGIN" : (typeof options.top_margin == "number" ? options.top_margin : 0.9),
+    "BOTTOMMARGIN": (typeof options.bottom_margin == "number" ? options.bottom_margin : 0.9),
+    "COLORDICT": this.alphabet._as_eps_dict(),
+    "DATA": this._as_eps_data(ssc, errbars)
+  };
+  // now this requires that the script containing the template has been imported!
+  return motif_logo_template(values);
+};
+
+//======================================================================
+// end Logo object
+//======================================================================
+
+// calculate the exact size (in pixels) of an object drawn on the
+// canvas assuming that the background of the canvas is transparent.
+function canvas_bounds(ctx, cwidth, cheight) {
+  "use strict";
+  var data, r, c, top_line, bottom_line, left_line, right_line, 
+      txt_width, txt_height;
+
+  // extract the image data
+  data = ctx.getImageData(0, 0, cwidth, cheight).data;
+
+  // set initial values
+  top_line = -1; bottom_line = -1; left_line = -1; right_line = -1;
+  txt_width = 0; txt_height = 0;
+
+  // Find the top-most line with a non-transparent pixel
+  for (r = 0; r < cheight; r++) {
+    for (c = 0; c < cwidth; c++) {
+      if (data[r * cwidth * 4 + c * 4 + 3]) {
+        top_line = r;
+        break;
+      }
+    }
+    if (top_line != -1) {
+      break;
+    }
+  }
+  
+  // Only bother looking if we found at least one set pixel... 
+  if (top_line != -1) {
+
+    //find the last line with a non-transparent pixel
+    for (r = cheight-1; r >= top_line; r--) {
+      for(c = 0; c < cwidth; c++) {
+        if(data[r * cwidth * 4 + c * 4 + 3]) {
+          bottom_line = r;
+          break;
+        }
+      }
+      if (bottom_line != -1) {
+        break;
+      }
+    }
+    // calculate height
+    txt_height = bottom_line - top_line + 1;
+
+    // Find the left-most line with a non-transparent pixel
+    for (c = 0; c < cwidth; c++) {
+      for (r = top_line; r <= bottom_line; r++) {
+        if (data[r * cwidth * 4 + c * 4 + 3]) {
+          left_line = c;
+          break;
+        }
+      }
+      if (left_line != -1) {
+        break;
+      }
+    }
+
+    //find the right most line with a non-transparent pixel
+    for (c = cwidth-1; c >= left_line; c--) {
+      for(r = top_line; r <= bottom_line; r++) {
+        if(data[r * cwidth * 4 + c * 4 + 3]) {
+          right_line = c;
+          break;
+        }
+      }
+      if (right_line != -1) {
+        break;
+      }
+    }
+    txt_width = right_line - left_line + 1;
+  }
+
+  //return the bounds
+  return {bound_top: top_line, bound_bottom: bottom_line, 
+    bound_left: left_line, bound_right: right_line, width: txt_width, 
+    height: txt_height};
+}
+
+//======================================================================
+// start RasterizedAlphabet
+//======================================================================
+
+// Rasterize Alphabet
+// 1) Measure width of text at default font for all symbols in alphabet
+// 2) sort in width ascending
+// 3) Drop the top and bottom 10% (designed to ignore outliers like 'W' and 'I')
+// 4) Calculate the average as the maximum scaling factor (designed to stop I becoming a rectangular blob).
+// 5) Assume scale of zero would result in width of zero, interpolate scale required to make perfect width font
+// 6) Draw text onto temp canvas at calculated scale
+// 7) Find bounds of drawn text
+// 8) Paint on to another canvas at the desired height (but only scaling width to fit if larger).
+var RasterizedAlphabet = function(alphabet, logo_scale, font, width) {
+  "use strict";
+  var default_size, safety_pad, canvas, ctx, middle, baseline, widths, sizes,
+      i, sym, size, tenpercent, avg_width, scale, 
+      target_width, target_height;
+  //variable prototypes
+  this.alphabet = alphabet;
+  this.scale = logo_scale;
+  this.sym_cache = {};
+  this.stack_num_cache = [];
+  this.scale_num_cache = [];
+  // size of canvas
+  default_size = 60; // size of measuring canvas
+  safety_pad = 20; // pixels to pad around so we don't miss the edges
+  // create a canvas to do our measuring
+  canvas = document.createElement("canvas");
+  if (!canvas.getContext) throw new Error("No canvas support");
+  canvas.width = default_size + 2 * safety_pad;
+  canvas.height = default_size + 2 * safety_pad;
+  middle = Math.round(canvas.width / 2);
+  baseline = Math.round(canvas.height - safety_pad);
+  ctx = canvas.getContext('2d');
+  if (!supports_text(ctx)) throw new Error("Canvas does not support text");
+  ctx.font = font;
+  ctx.textAlign = "center";
+  ctx.translate(middle, baseline);
+  // list of widths
+  widths = [];
+  sizes = [];
+  //now measure each letter in the alphabet
+  for (i = 0; i < alphabet.get_size_core(); ++i) {
+    // reset the canvas
+    ctx.clearRect(0, 0, canvas.width, canvas.height);
+    ctx.fillStyle = alphabet.get_colour(i);
+    // draw the test text
+    ctx.fillText(alphabet.get_symbol(i), 0, 0);
+    //measure
+    size = canvas_bounds(ctx, canvas.width, canvas.height);
+    if (size.width === 0) throw new Error("Invisible symbol!");
+    widths.push(size.width);
+    sizes[i] = size;
+  }
+  //sort the widths
+  widths.sort(function(a,b) {return a - b;});
+  //drop 10% of the items off each end
+  tenpercent = Math.floor(widths.length / 10);
+  for (i = 0; i < tenpercent; ++i) {
+    widths.pop();
+    widths.shift();
+  }
+  //calculate average width
+  avg_width = 0;
+  for (i = 0; i < widths.length; ++i) {
+    avg_width += widths[i];
+  }
+  avg_width /= widths.length;
+  // calculate the target width
+  target_width = width * this.scale * 2;
+  // calculate scales
+  for (i = 0; i < alphabet.get_size_core(); ++i) {
+    sym = alphabet.get_symbol(i);
+    size = sizes[i];
+    // calculate scale
+    scale = target_width / Math.max(avg_width, size.width);
+    // estimate scaled height
+    target_height = size.height * scale;
+    // create an appropriately sized canvas
+    canvas = document.createElement("canvas");
+    canvas.width = target_width;
+    canvas.height = target_height + safety_pad * 2;
+    // calculate the middle
+    middle = Math.round(canvas.width / 2);
+    // calculate the baseline
+    baseline = Math.round(canvas.height - safety_pad);
+    // get the context and prepare to draw the rasterized text
+    ctx = canvas.getContext('2d');
+    ctx.font = font;
+    ctx.fillStyle = alphabet.get_colour(i);
+    ctx.textAlign = "center";
+    ctx.translate(middle, baseline);
+    ctx.save();
+    ctx.scale(scale, scale);
+    // draw the text
+    ctx.fillText(sym, 0, 0);
+    ctx.restore();
+    this.sym_cache[sym] = {"image": canvas, "size": canvas_bounds(ctx, canvas.width, canvas.height)};
+  }
+};
+
+RasterizedAlphabet.prototype.get_alphabet = function() {
+  return this.alphabet;
+};
+
+RasterizedAlphabet.prototype.get_scale = function() {
+  return this.scale;
+};
+
+RasterizedAlphabet.prototype.draw_stack_sym = function(ctx, letter, dx, dy, dWidth, dHeight) {
+  "use strict";
+  var entry, image, size;
+  entry = this.sym_cache[letter];
+  image = entry.image;
+  size = entry.size;
+  ctx.drawImage(image, 0, size.bound_top -1, image.width, size.height+1, dx, dy, dWidth, dHeight);
+};
+
+RasterizedAlphabet.prototype.draw_stack_num = function(ctx, font, stack_width, index) {
+  var image, image_ctx, text_length;
+  if (index >= this.stack_num_cache.length) {
+    image = document.createElement("canvas");
+    // measure the text
+    image_ctx = image.getContext('2d');
+    image_ctx.save();
+    image_ctx.font = font;
+    text_length = image_ctx.measureText("" + (index + 1)).width;
+    image_ctx.restore();
+    // resize the canvas to fit
+    image.width = Math.ceil(stack_width);
+    image.height = Math.ceil(text_length);
+    // draw the text
+    image_ctx = image.getContext('2d');
+    image_ctx.translate(Math.round(stack_width / 2), 0);
+    image_ctx.font = font;
+    image_ctx.textBaseline = "middle";
+    image_ctx.textAlign = "right";
+    image_ctx.rotate(-(Math.PI / 2));
+    image_ctx.fillText("" + (index + 1), 0, 0);
+    this.stack_num_cache[index] = image;
+  } else {
+    image = this.stack_num_cache[index];
+  }
+  ctx.drawImage(image, 0, 0);
+}
+
+RasterizedAlphabet.prototype.draw_scale_num = function(ctx, font, num) {
+  var image, image_ctx, text_size, m_length;
+  if (num >= this.scale_num_cache.length) {
+    image = document.createElement("canvas");
+    // measure the text
+    image_ctx = image.getContext('2d');
+    image_ctx.font = font;
+    text_size = image_ctx.measureText("" + num);
+    if (text_size.actualBoundingBoxAscent && text_size.actualBoundingBoxDesent) {
+      // resize the canvas to fit
+      image.width = Math.ceil(text_size.width);
+      image.height = Math.ceil(text_size.actualBoundingBoxAscent + text_size.actualBoundingBoxDesent);
+      // draw the text
+      image_ctx = image.getContext('2d');
+      image_ctx.font = font;
+      image_ctx.textAlign = "right";
+      image_ctx.fillText("" + num, image.width, text_size.actualBoundingBoxAscent);
+    } else {
+      // measure width of 'm' to approximate height, we double it later anyway
+      m_length = image_ctx.measureText("m").width;
+      // resize the canvas to fit
+      image.width = Math.ceil(text_size.width);
+      image.height = Math.ceil(2 * m_length);
+      // draw the text
+      image_ctx = image.getContext('2d');
+      image_ctx.font = font;
+      image_ctx.textAlign = "right";
+      image_ctx.textBaseline = "middle";
+      image_ctx.fillText("" + num, image.width, m_length);
+    }
+    this.scale_num_cache[num] = image;
+  } else {
+    image = this.scale_num_cache[num];
+  }
+  ctx.drawImage(image, -image.width, -Math.round(image.height / 2))
+}
+
+//======================================================================
+// end RasterizedAlphabet
+//======================================================================
+
+//======================================================================
+// start LogoMetrics object
+//======================================================================
+
+var LogoMetrics = function(ctx, logo_columns, logo_rows, has_names, has_finetext, x_axis, y_axis) {
+  "use strict";
+  var i, row_height;
+  //variable prototypes
+  this.pad_top = (has_names ? 5 : 0);
+  this.pad_left = (y_axis ? 10 : 0);
+  this.pad_right = (has_finetext ? 15 : 0);
+  this.pad_bottom = 0;
+  this.pad_middle = 20;
+  this.name_height = 14;
+  this.name_font = "bold " + this.name_height + "px Times, sans-serif";
+  this.name_spacer = 0;
+  this.y_axis = y_axis;
+  this.y_label = "bits";
+  this.y_label_height = 12;
+  this.y_label_font = "bold " + this.y_label_height + "px Helvetica, sans-serif";
+  this.y_label_spacer = 3;
+  this.y_num_height = 12;
+  this.y_num_width = 0;
+  this.y_num_font = "bold " + this.y_num_height + "px Helvetica, sans-serif";
+  this.y_tic_width = 5;
+  this.stack_pad_left = 0;
+  this.stack_font = "bold 25px Helvetica, sans-serif";
+  this.stack_height = 90;
+  this.stack_width = 26;
+  this.stacks_pad_right = 5;
+  this.x_axis = x_axis;
+  this.x_num_above = 2;
+  this.x_num_height = 12;
+  this.x_num_width = 0;
+  this.x_num_font = "bold " + this.x_num_height + "px Helvetica, sans-serif";
+  this.fine_txt_height = 6;
+  this.fine_txt_above = 2;
+  this.fine_txt_font = "normal " + this.fine_txt_height + "px Helvetica, sans-serif";
+  this.letter_metrics = new Array();
+  this.summed_width = 0;
+  this.summed_height = 0;
+  //calculate the width of the y axis numbers
+  ctx.font = this.y_num_font;
+  for (i = 0; i <= 2; i++) {
+    this.y_num_width = Math.max(this.y_num_width, ctx.measureText("" + i).width);
+  }
+  //calculate the width of the x axis numbers (but they are rotated so it becomes height)
+  if (x_axis == 1) {
+    ctx.font = this.x_num_font;
+    for (i = 1; i <= logo_columns; i++) {
+      this.x_num_width = Math.max(this.x_num_width, ctx.measureText("" + i).width);
+    }
+  } else if (x_axis == 0) {
+    this.x_num_height = 4;
+    this.x_num_width = 4;
+  } else {
+    this.x_num_height = 0;
+    this.x_num_width = 0;
+  }
+  
+  //calculate how much vertical space we want to draw this
+  //first we add the padding at the top and bottom since that's always there
+  this.summed_height += this.pad_top + this.pad_bottom;
+  //all except the last row have the same amount of space allocated to them
+  if (logo_rows > 1) {
+    row_height = this.stack_height + this.pad_middle;
+    if (has_names) {
+      row_height += this.name_height;
+      //the label is allowed to overlap into the spacer
+      row_height += Math.max(this.y_num_height/2, this.name_spacer); 
+      //the label is allowed to overlap the space used by the other label
+      row_height += Math.max(this.y_num_height/2, this.x_num_height + this.x_num_above); 
+    } else {
+      row_height += this.y_num_height/2; 
+      //the label is allowed to overlap the space used by the other label
+      row_height += Math.max(this.y_num_height/2, this.x_num_height + this.x_num_above); 
+    }
+    this.summed_height += row_height * (logo_rows - 1);
+  }
+  //the last row has the name and fine text below it but no padding
+  this.summed_height += this.stack_height + (this.y_axis ? this.y_num_height/2 : 0);
+
+  var fine_txt_total = (has_finetext ? this.fine_txt_height + this.fine_txt_above : 0);
+  if (has_names) {
+    this.summed_height += fine_txt_total + this.name_height;
+    this.summed_height += Math.max((this.y_axis ? this.y_num_height/2 : 0), 
+        this.x_num_height + this.x_num_above + this.name_spacer);
+  } else {
+    this.summed_height += Math.max((this.y_axis ? this.y_num_height/2 : 0), 
+        this.x_num_height + this.x_num_above + fine_txt_total);
+  }
+
+  //calculate how much horizontal space we want to draw this
+  //first add the padding at the left and right since that's always there
+  this.summed_width += this.pad_left + this.pad_right;
+  if (this.y_axis) {
+    //add on the space for the y-axis label
+    this.summed_width += this.y_label_height + this.y_label_spacer;
+    //add on the space for the y-axis
+    this.summed_width += this.y_num_width + this.y_tic_width;
+  }
+  //add on the space for the stacks
+  this.summed_width += (this.stack_pad_left + this.stack_width) * logo_columns;
+  //add on the padding after the stacks (an offset from the fine text)
+  this.summed_width += this.stacks_pad_right;
+
+};
+
+//======================================================================
+// end LogoMetrics object
+//======================================================================
+
+//found this trick at http://talideon.com/weblog/2005/02/detecting-broken-images-js.cfm
+function image_ok(img) {
+  "use strict";
+  // During the onload event, IE correctly identifies any images that
+  // weren't downloaded as not complete. Others should too. Gecko-based
+  // browsers act like NS4 in that they report this incorrectly.
+  if (!img.complete) {
+    return false;
+  }
+  // However, they do have two very useful properties: naturalWidth and
+  // naturalHeight. These give the true size of the image. If it failed
+  // to load, either of these should be zero.
+  if (typeof img.naturalWidth !== "undefined" && img.naturalWidth === 0) {
+    return false;
+  }
+  // No other way of checking: assume it's ok.
+  return true;
+}
+  
+function supports_text(ctx) {
+  "use strict";
+  if (!ctx.fillText) {
+    return false;
+  }
+  if (!ctx.measureText) {
+    return false;
+  }
+  return true;
+}
+
+//draws the scale, returns the width
+function draw_scale(ctx, metrics, alphabet_ic, raster) {
+  "use strict";
+  var tic_height, i;
+  tic_height = metrics.stack_height / alphabet_ic;
+  ctx.save();
+  ctx.translate(metrics.y_label_height, metrics.y_num_height/2);
+  //draw the axis label
+  ctx.save();
+  ctx.font = metrics.y_label_font;
+  ctx.translate(0, metrics.stack_height/2);
+  ctx.rotate(-(Math.PI / 2));
+  ctx.textAlign = "center";
+  ctx.fillText("bits", 0, 0);
+  ctx.restore();
+
+  ctx.translate(metrics.y_label_spacer + metrics.y_num_width, 0);
+
+  //draw the axis tics
+  ctx.save();
+  ctx.translate(0, metrics.stack_height);
+  for (i = 0; i <= alphabet_ic; i++) {
+    //draw the number
+    ctx.save();
+    ctx.translate(-1, 0);
+    raster.draw_scale_num(ctx, metrics.y_num_font, i);
+    ctx.restore();
+    //draw the tic
+    ctx.fillRect(0, -1, metrics.y_tic_width, 2);
+    //prepare for next tic
+    ctx.translate(0, -tic_height);
+  }
+  ctx.restore();
+
+  ctx.fillRect(metrics.y_tic_width - 2, 0, 2, metrics.stack_height)
+
+  ctx.restore();
+}
+
+function draw_stack_num(ctx, metrics, row_index, raster) {
+  "use strict";
+  ctx.save();
+  ctx.translate(0, Math.round(metrics.stack_height + metrics.x_num_above));
+  if (metrics.x_axis == 1) {
+    raster.draw_stack_num(ctx, metrics.x_num_font, metrics.stack_width, row_index);
+  } else if (metrics.x_axis == 0) {
+    // draw dots instead of the numbers (good for small logos)
+    ctx.beginPath();
+    var radius = Math.round(metrics.x_num_height / 2);
+    ctx.arc(Math.round(metrics.stack_width / 2), radius, radius, 0, 2 * Math.PI, false);
+    ctx.fill();
+  }
+  ctx.restore();
+}
+
+function draw_stack(ctx, metrics, symbols, raster) {
+  "use strict";
+  var preferred_pad, sym_min, i, sym, sym_height, pad;
+  preferred_pad = 0;
+  sym_min = 5;
+
+  ctx.save();//1
+  ctx.translate(0, metrics.stack_height);
+  for (i = 0; i < symbols.length; i++) {
+    sym = symbols[i];
+    sym_height = metrics.stack_height * sym.get_scale();
+    
+    pad = preferred_pad;
+    if (sym_height - pad < sym_min) {
+      pad = Math.min(pad, Math.max(0, sym_height - sym_min));
+    }
+    sym_height -= pad;
+
+    //translate to the correct position
+    ctx.translate(0, -(pad/2 + sym_height));
+
+    //draw
+    raster.draw_stack_sym(ctx, sym.get_symbol(), 0, 0, metrics.stack_width, sym_height);
+    //translate past the padding
+    ctx.translate(0, -(pad/2));
+  }
+  ctx.restore();//1
+}
+
+function draw_dashed_line(ctx, pattern, start, x1, y1, x2, y2) {
+  "use strict";
+  var x, y, len, i, dx, dy, tlen, theta, mulx, muly, lx, ly;
+  dx = x2 - x1;
+  dy = y2 - y1;
+  tlen = Math.pow(dx*dx + dy*dy, 0.5);
+  theta = Math.atan2(dy,dx);
+  mulx = Math.cos(theta);
+  muly = Math.sin(theta);
+  lx = [];
+  ly = [];
+  for (i = 0; i < pattern; ++i) {
+    lx.push(pattern[i] * mulx);
+    ly.push(pattern[i] * muly);
+  }
+  i = start;
+  x = x1;
+  y = y1;
+  len = 0;
+  ctx.beginPath();
+  while (len + pattern[i] < tlen) {
+    ctx.moveTo(x, y);
+    x += lx[i];
+    y += ly[i];
+    ctx.lineTo(x, y);
+    len += pattern[i];
+    i = (i + 1) % pattern.length;
+    x += lx[i];
+    y += ly[i];
+    len += pattern[i];
+    i = (i + 1) % pattern.length;
+  }
+  if (len < tlen) {
+    ctx.moveTo(x, y);
+    x += mulx * (tlen - len);
+    y += muly * (tlen - len);
+    ctx.lineTo(x, y);
+  }
+  ctx.stroke();
+}
+
+function draw_trim_background(ctx, metrics, left_start, left_end, left_divider, right_start, right_end, right_divider) {
+  "use strict";
+  var left_size = left_end - left_start;
+  var right_size = right_end - right_start;
+  var line_x;
+
+  ctx.save();//s8
+  ctx.fillStyle = "rgb(240, 240, 240)";
+  if (left_size > 0) {
+    ctx.fillRect(left_start * metrics.stack_width, 0, left_size * metrics.stack_width, metrics.stack_height);
+  }
+  if (right_size > 0) {
+    ctx.fillRect(right_start * metrics.stack_width, 0, right_size * metrics.stack_width, metrics.stack_height);
+  }
+  ctx.fillStyle = "rgb(51, 51, 51)";
+  if (left_size > 0 && left_divider) {
+    line_x = (left_end * metrics.stack_width) - 0.5;
+    draw_dashed_line(ctx, [3], 0, line_x, 0, line_x, metrics.stack_height);
+  }
+  if (right_size > 0 && right_divider) {
+    line_x = (right_start * metrics.stack_width) + 0.5;
+    draw_dashed_line(ctx, [3], 0, line_x, 0, line_x, metrics.stack_height);
+  }
+  ctx.restore();//s8
+}
+
+function size_logo_on_canvas(logo, canvas, show_names, scale) {
+  "use strict";
+  var draw_name, draw_finetext, metrics;
+  draw_name = (typeof show_names === "boolean" ? show_names : (logo.get_rows() > 1));
+  draw_finetext = (logo.fine_text.length > 0);
+  if (canvas.width !== 0 && canvas.height !== 0) {
+    return;
+  }
+  metrics = new LogoMetrics(canvas.getContext('2d'), 
+      logo.get_xlate_columns(), logo.get_rows(), draw_name, draw_finetext, logo.x_axis, logo.y_axis);
+  if (typeof scale == "number") {
+    //resize the canvas to fit the scaled logo
+    canvas.width = metrics.summed_width * scale;
+    canvas.height = metrics.summed_height * scale;
+  } else {
+    if (canvas.width === 0 && canvas.height === 0) {
+      canvas.width = metrics.summed_width;
+      canvas.height = metrics.summed_height;
+    } else if (canvas.width === 0) {
+      canvas.width = metrics.summed_width * (canvas.height / metrics.summed_height);
+    } else if (canvas.height === 0) {
+      canvas.height = metrics.summed_height * (canvas.width / metrics.summed_width);
+    }
+  }
+}
+
+function draw_logo_on_canvas(logo, canvas, show_names, scale) {
+  "use strict";
+  var i, draw_name, draw_finetext, ctx, metrics, raster, pspm_i, pspm, 
+      offset, col_index, motif_position, ssc;
+  ssc = false;
+  draw_name = (typeof show_names === "boolean" ? show_names : (logo.get_rows() > 1));
+  draw_finetext = (logo.fine_text.length > 0);
+  ctx = canvas.getContext('2d');
+  //assume that the user wants the canvas scaled equally so calculate what the best width for this image should be
+  metrics = new LogoMetrics(ctx, logo.get_xlate_columns(), logo.get_rows(), draw_name, draw_finetext, logo.x_axis, logo.y_axis);
+  if (typeof scale == "number") {
+    //resize the canvas to fit the scaled logo
+    canvas.width = metrics.summed_width * scale;
+    canvas.height = metrics.summed_height * scale;
+  } else {
+    if (canvas.width === 0 && canvas.height === 0) {
+      scale = 1;
+      canvas.width = metrics.summed_width;
+      canvas.height = metrics.summed_height;
+    } else if (canvas.width === 0) {
+      scale = canvas.height / metrics.summed_height;
+      canvas.width = metrics.summed_width * scale;
+    } else if (canvas.height === 0) {
+      scale = canvas.width / metrics.summed_width;
+      canvas.height = metrics.summed_height * scale;
+    } else {
+      scale = Math.min(canvas.width / metrics.summed_width, canvas.height / metrics.summed_height);
+    }
+  }
+  // cache the raster based on the assumption that we will be drawing a lot
+  // of logos the same size and alphabet
+  if (typeof draw_logo_on_canvas.raster_cache === "undefined") {
+    draw_logo_on_canvas.raster_cache = [];
+  }
+  for (i = 0; i < draw_logo_on_canvas.raster_cache.length; i++) {
+    raster = draw_logo_on_canvas.raster_cache[i];
+    if (raster.get_alphabet().equals(logo.alphabet) &&
+        Math.abs(raster.get_scale() - scale) < 0.1) break;
+    raster = null;
+  }
+  if (raster == null) {
+    raster = new RasterizedAlphabet(logo.alphabet, scale, metrics.stack_font, metrics.stack_width);
+    draw_logo_on_canvas.raster_cache.push(raster);
+  }
+  ctx = canvas.getContext('2d');
+  ctx.save();//s1
+  ctx.scale(scale, scale);
+  ctx.save();//s2
+  ctx.save();//s7
+  //create margin
+  ctx.translate(Math.round(metrics.pad_left), Math.round(metrics.pad_top));
+  for (pspm_i = 0; pspm_i < logo.get_rows(); ++pspm_i) {
+    pspm = logo.get_pspm(pspm_i);
+    offset = logo.get_offset(pspm_i);
+    //optionally draw name if this isn't the last row or is the only row 
+    if (draw_name && (logo.get_rows() == 1 || pspm_i != (logo.get_rows()-1))) {
+      ctx.save();//s4
+      ctx.translate(Math.round(metrics.summed_width/2), Math.round(metrics.name_height));
+      ctx.font = metrics.name_font;
+      ctx.textAlign = "center";
+      ctx.fillText(pspm.name, 0, 0);
+      ctx.restore();//s4
+      ctx.translate(0, Math.round(metrics.name_height + 
+          Math.min(0, metrics.name_spacer - metrics.y_num_height/2)));
+    }
+    //draw scale
+    if (logo.y_axis) draw_scale(ctx, metrics, logo.alphabet.get_ic(), raster);
+    ctx.save();//s5
+    //translate across past the scale
+    if (logo.y_axis) {
+      ctx.translate(Math.round(metrics.y_label_height + metrics.y_label_spacer + 
+        metrics.y_num_width + metrics.y_tic_width), Math.round(metrics.y_num_height / 2));
+    }
+    //draw the trimming background
+    if (pspm.get_left_trim() > 0 || pspm.get_right_trim() > 0) {
+      var left_start = offset * logo.get_xlate_nsyms();
+      var left_end = (offset + pspm.get_left_trim()) * logo.get_xlate_nsyms();
+      var left_divider = true;
+      if (left_end < logo.get_xlate_start() || left_start > logo.get_xlate_end()) {
+        // no overlap
+        left_start = 0;
+        left_end = 0;
+        left_divider = false;
+      } else {
+        if (left_start < logo.get_xlate_start()) {
+          left_start = logo.get_xlate_start();
+        }
+        if (left_end > logo.get_xlate_end()) {
+          left_end = logo.get_xlate_end();
+          left_divider = false;
+        }
+        left_start -= logo.get_xlate_start();
+        left_end -= logo.get_xlate_start();
+        if (left_end < left_start) {
+          left_start = 0;
+          left_end = 0;
+          left_divider = false;
+        }
+      }
+      var right_end = (offset + pspm.get_motif_length()) * logo.get_xlate_nsyms();
+      //var right_start = right_end - (pspm.get_left_trim() * logo.get_xlate_nsyms());
+      var right_start = right_end - (pspm.get_right_trim() * logo.get_xlate_nsyms());
+      var right_divider = true;
+      if (right_end < logo.get_xlate_start() || right_start > logo.get_xlate_end()) {
+        // no overlap
+        right_start = 0;
+        right_end = 0;
+        right_divider = false;
+      } else {
+        if (right_start < logo.get_xlate_start()) {
+          right_start = logo.get_xlate_start();
+          right_divider = false;
+        }
+        if (right_end > logo.get_xlate_end()) {
+          right_end = logo.get_xlate_end();
+        }
+        right_start -= logo.get_xlate_start();
+        right_end -= logo.get_xlate_start();
+        if (right_end < right_start) {
+          right_start = 0;
+          right_end = 0;
+          right_divider = false;
+        }
+      }
+      draw_trim_background(ctx, metrics, left_start, left_end, left_divider, right_start, right_end, right_divider);
+    }
+    //draw letters
+    var xlate_col;
+    for (xlate_col = logo.get_xlate_start(); xlate_col < logo.get_xlate_end(); xlate_col++) {
+      ctx.translate(metrics.stack_pad_left,0);
+      col_index = Math.floor(xlate_col / logo.get_xlate_nsyms());
+      if (xlate_col % logo.get_xlate_nsyms() == 0) {
+        if (col_index >= offset && col_index < (offset + pspm.get_motif_length())) {
+          motif_position = col_index - offset;
+          draw_stack_num(ctx, metrics, motif_position, raster);
+          draw_stack(ctx, metrics, pspm.get_stack(motif_position, logo.alphabet, ssc), raster);
+        }
+      } else {
+        if (col_index >= offset && col_index < (offset + pspm.get_motif_length())) {
+          ctx.save();// s5.1
+          ctx.translate(0, Math.round(metrics.stack_height));
+          // TODO draw a dot or dash or something to indicate continuity of the motif
+          ctx.restore(); //s5.1
+        }
+      }
+      ctx.translate(Math.round(metrics.stack_width), 0);
+    }
+    ctx.restore();//s5
+    ////optionally draw name if this is the last row but isn't the only row 
+    if (draw_name && (logo.get_rows() != 1 && pspm_i == (logo.get_rows()-1))) {
+      //translate vertically past the stack and axis's        
+      ctx.translate(0, metrics.y_num_height/2 + metrics.stack_height + 
+          Math.max(metrics.y_num_height/2, metrics.x_num_above + metrics.x_num_width + metrics.name_spacer));
+
+      ctx.save();//s6
+      ctx.translate(metrics.summed_width/2, metrics.name_height);
+      ctx.font = metrics.name_font;
+      ctx.textAlign = "center";
+      ctx.fillText(pspm.name, 0, 0);
+      ctx.restore();//s6
+      ctx.translate(0, metrics.name_height);
+    } else {
+      //translate vertically past the stack and axis's        
+      ctx.translate(0, metrics.y_num_height/2 + metrics.stack_height + 
+          Math.max(metrics.y_num_height/2, metrics.x_num_above + metrics.x_num_width));
+    }
+    //if not the last row then add middle padding
+    if (pspm_i != (logo.get_rows() -1)) {
+      ctx.translate(0, metrics.pad_middle);
+    }
+  }
+  ctx.restore();//s7
+  if (logo.fine_text.length > 0) {
+    ctx.translate(metrics.summed_width - metrics.pad_right, metrics.summed_height - metrics.pad_bottom);
+    ctx.font = metrics.fine_txt_font;
+    ctx.textAlign = "right";
+    ctx.fillText(logo.fine_text, 0,0);
+  }
+  ctx.restore();//s2
+  ctx.restore();//s1
+}
+
+function create_canvas(c_width, c_height, c_id, c_title, c_display) {
+  "use strict";
+  var canvas = document.createElement("canvas");
+  //check for canvas support before attempting anything
+  if (!canvas.getContext) {
+    return null;
+  }
+  var ctx = canvas.getContext('2d');
+  //check for html5 text drawing support
+  if (!supports_text(ctx)) {
+    return null;
+  }
+  //size the canvas
+  canvas.width = c_width;
+  canvas.height = c_height;
+  canvas.id = c_id;
+  canvas.title = c_title;
+  canvas.style.display = c_display;
+  return canvas;
+}
+
+function logo_1(alphabet, fine_text, pspm) {
+  "use strict";
+  var logo = new Logo(alphabet, fine_text);
+  logo.add_pspm(pspm);
+  return logo;
+}
+
+function logo_2(alphabet, fine_text, target, query, query_offset) {
+  "use strict";
+  var logo = new Logo(alphabet, fine_text);
+  if (query_offset < 0) {
+    logo.add_pspm(target, -query_offset);
+    logo.add_pspm(query);
+  } else {
+    logo.add_pspm(target);
+    logo.add_pspm(query, query_offset);
+  }      
+  return logo;
+}
+
+/*
+ * Specifies an alternate source for an image.
+ * If the image with the image_id specified has
+ * not loaded then a generated logo will be used 
+ * to replace it.
+ *
+ * Note that the image must either have dimensions
+ * or a scale must be set.
+ */
+function alternate_logo(logo, image_id, scale) {
+  "use strict";
+  var image = document.getElementById(image_id);
+  if (!image) {
+    alert("Can't find specified image id (" +  image_id + ")");
+    return;
+  }
+  //if the image has loaded then there is no reason to use the canvas
+  if (image_ok(image)) {
+    return;
+  }
+  //the image has failed to load so replace it with a canvas if we can.
+  var canvas = create_canvas(image.width, image.height, image_id, image.title, image.style.display);
+  if (canvas === null) {
+    return;
+  }
+  //draw the logo on the canvas
+  draw_logo_on_canvas(logo, canvas, null, scale);
+  //replace the image with the canvas
+  image.parentNode.replaceChild(canvas, image);
+}
+
+/*
+ * Specifes that the element with the specified id
+ * should be replaced with a generated logo.
+ */
+function replace_logo(logo, replace_id, scale, title_txt, display_style) {
+  "use strict";
+  var element = document.getElementById(replace_id);
+  if (!replace_id) {
+    alert("Can't find specified id (" + replace_id + ")");
+    return;
+  }
+  //found the element!
+  var canvas = create_canvas(50, 120, replace_id, title_txt, display_style);
+  if (canvas === null) {
+    return;
+  }
+  //draw the logo on the canvas
+  draw_logo_on_canvas(logo, canvas, null, scale);
+  //replace the element with the canvas
+  element.parentNode.replaceChild(canvas, element);
+}
+
+/*
+ * Fast string trimming implementation found at
+ * http://blog.stevenlevithan.com/archives/faster-trim-javascript
+ *
+ * Note that regex is good at removing leading space but
+ * bad at removing trailing space as it has to first go through
+ * the whole string.
+ */
+function trim (str) {
+  "use strict";
+  var ws, i;
+  str = str.replace(/^\s\s*/, '');
+  ws = /\s/; i = str.length;
+  while (ws.test(str.charAt(--i)));
+  return str.slice(0, i + 1);
+}
+</script>
+    <script>
+var current_motif = 0;
+var dreme_alphabet = new Alphabet(data.alphabet, data.control_db.freqs);
+
+/*
+ * Create a pspm for the given motif data
+ */
+function motif_pspm(m) {
+  return new Pspm(m.pwm, m.id, 0, 0, m.nsites, m.evalue);
+}
+
+/*
+ * Create a count matrix from the given motif data
+ */
+function motif_count_matrix(motif) {
+  return motif_pspm(motif).as_count_matrix();
+}
+
+/*
+ * Create a probablity matrix from the given motif data
+ */
+function motif_prob_matrix(motif) {
+  return motif_pspm(motif).as_probability_matrix();
+}
+
+/*
+ * Create a minimal meme format motif from the given motif data
+ */
+function motif_minimal_meme(motif) {
+  return motif_pspm(motif).as_meme({
+    "with_header": true, 
+    "with_pspm": true,
+    "with_pssm": false,
+    "version": data["version"],
+    "alphabet": dreme_alphabet,
+    "strands": (data.options.revcomp ? 2 : 1)
+  });
+}
+
+/*
+ * Fill in a template variable
+ */
+function set_tvar(template, tvar, value) {
+  var node;
+  node = find_child(template, tvar);
+  if (node === null) {
+    throw new Error("Template does not contain variable " + tvar);
+  }
+  node.innerHTML = "";
+  if (typeof value !== "object") {
+    node.appendChild(document.createTextNode(value));
+  } else {
+    node.appendChild(value);
+  }
+}
+
+/*
+ * Make a canvas with the motif logo drawn on it. 
+ */
+function make_logo(motif, height, rc) {
+  var pspm = new Pspm(motif["pwm"]);
+  if (rc) pspm = pspm.copy().reverse_complement(dreme_alphabet);
+  var logo = new Logo(dreme_alphabet);
+  logo.add_pspm(pspm, 0);
+  var canvas = document.createElement('canvas');
+  canvas.height = height;
+  canvas.width = 0;
+  draw_logo_on_canvas(logo, canvas, false);
+  return canvas;
+}
+
+/*
+ * Create a button designed to contain a single symbol
+ */
+function make_sym_btn(symbol, title, action) {
+  var box, sbox;
+  box = document.createElement("div");
+  box.tabIndex = 0;
+  box.className = "sym_btn";
+  sbox = document.createElement("span");
+  if (typeof symbol == "string") {
+    sbox.appendChild(document.createTextNode(symbol));
+  } else {
+    sbox.appendChild(symbol);
+  }
+  box.appendChild(sbox);
+  box.title = title;
+  box.addEventListener('click', action, false);
+  box.addEventListener('keydown', action, false);
+  return box;
+}
+
+/*
+ * Create a pair of text spans with different classes.
+ * This is useful when using CSS to only display one of them.
+ */
+function text_pair(txt1, cls1, txt2, cls2) {
+  var container, part1, part2;
+  container = document.createElement("span");
+  part1 = document.createElement("span");
+  part1.appendChild(document.createTextNode(txt1));
+  part1.className = cls1;
+  container.appendChild(part1);
+  part2 = document.createElement("span");
+  part2.appendChild(document.createTextNode(txt2));
+  part2.className = cls2;
+  container.appendChild(part2);
+  return container;
+}
+
+/*
+ * Make a colourised sequence.
+ */
+function make_seq(seq) {
+  var i, j, letter, lbox, sbox;
+  sbox = document.createElement("span");
+  for (i = 0; i < seq.length; i = j) {
+    letter = seq.charAt(i);
+    for (j = i+1; j < seq.length; j++) {
+      if (seq.charAt(j) !== letter) {
+        break;
+      }
+    }
+    lbox = document.createElement("span");
+    lbox.style.color = dreme_alphabet.get_colour(dreme_alphabet.get_index(letter));
+    lbox.appendChild(document.createTextNode(seq.substring(i, j)));
+    sbox.appendChild(lbox);
+  }
+  return sbox;
+}
+
+/*
+ * Create a description element taking into account the newlines in the source text.
+ */
+function make_description(text) {
+  var i, j, lines, p;
+  var container = document.createElement("div");
+  var paragraphs = text.split(/\n\n+/);
+  for (i = 0; i < paragraphs.length; i++) {
+    lines = paragraphs[i].split(/\n/);
+    p = document.createElement("p");
+    p.appendChild(document.createTextNode(lines[0]));
+    for (j = 1; j < lines.length; j++) {
+      p.appendChild(document.createElement("br"));
+      p.appendChild(document.createTextNode(lines[j]));
+    }
+    container.appendChild(p);
+  }
+  return container;
+}
+
+/*
+ * Make the table header for the discovered motifs.
+ */
+function make_motif_header() {
+  var row = document.createElement("tr");
+  add_text_header_cell(row, "", "", "motif_ordinal");
+  add_text_header_cell(row, "Motif", "pop_motifs_word", "motif_word");
+  add_text_header_cell(row, "Logo", "pop_motifs_logo", "motif_logo");
+  if (data.options.revcomp) {
+    add_text_header_cell(row, "RC Logo", "pop_motifs_rc_logo", "motif_logo");
+  }
+  add_text_header_cell(row, "E-value", "pop_motifs_evalue", "motif_evalue");
+  add_text_header_cell(row, "Unerased E-value", "pop_motifs_uevalue", "motif_evalue");
+  add_text_header_cell(row, "More", "pop_more", "motif_more");
+  add_text_header_cell(row, "Submit/Download", "pop_submit_dl", "motif_submit");
+  row.className = "more";
+  return row;
+}
+
+/*
+ * Make a compact motif summary row for the discovered motifs.
+ */
+function make_motif_row(tbody, ordinal, motif) {
+  var row = document.createElement("tr");
+  add_text_cell(row, "" + ordinal + ".", "motif_ordinal");
+  add_text_cell(row, motif["id"], "motif_word");
+  add_cell(row, make_logo(motif, 50, false), "motif_logo");
+  if (data.options.revcomp) {
+    add_cell(row, make_logo(motif, 50, true), "motif_logo");
+  }
+  add_text_cell(row, motif["evalue"], "motif_evalue");
+  add_text_cell(row, motif["unerased_evalue"], "motif_evalue");
+  add_cell(row, make_sym_btn(text_pair("\u21A7", "less", "\u21A5", "more"), "Show more information.", function(e) { toggle_class(tbody, "collapsed"); }, "\u21A5", ""), "motif_more");
+  add_cell(row, make_sym_btn("\u21E2", "Submit the motif to another MEME Suite program or download it.", function(e) { action_show_outpop(e, ordinal); }), "motif_submit");
+  return row;
+}
+
+/*
+ * Make a sortable table of enriched matching rows.
+ */
+function make_motif_words(motif) {
+  var row, i, match;
+  var table = document.createElement("table");
+  var thead = document.createElement("thead");
+  row = document.createElement("tr");
+  add_text_header_cell(row, "Word", "pop_match_word", "match_word", function(e) {sort_table(this, compare_words);});
+  add_text_header_cell(row, "Positives", "pop_match_pos", "match_count", function(e) {sort_table(this, compare_counts);});
+  add_text_header_cell(row, "Negatives", "pop_match_neg", "match_count", function(e) {sort_table(this, compare_counts);});
+  add_text_header_cell(row, "P-value", "pop_match_pval", "match_evalue", function(e) {sort_table(this, compare_evalues);});
+  add_text_header_cell(row, "E-value", "pop_match_eval", "match_evalue", function(e) {sort_table(this, compare_evalues);});
+  thead.appendChild(row);
+  table.appendChild(thead);
+  var tbody = document.createElement("tbody");
+  for (i = 0; i < motif.matches.length; i++) {
+    match = motif.matches[i];
+    row = document.createElement("tr");
+    add_cell(row, make_seq(match.seq), "match_word");
+    add_text_cell(row, match.p + " / " + data.sequence_db.count, "match_count");
+    add_text_cell(row, match.n + " / " + data.control_db.count, "match_count");
+    add_text_cell(row, match.pvalue, "match_evalue");
+    add_text_cell(row, match.evalue, "match_evalue");
+    tbody.appendChild(row);
+  }
+  table.appendChild(tbody);
+  return table;
+}
+
+/*
+ * Make an expanded view of a discovered motif.
+ */
+function make_motif_exp(tbody, ordinal, motif) {
+  "use strict";
+  var box, pspm, logo_box;
+  box = $("tmpl_motif_expanded").cloneNode(true);
+  toggle_class(box, "template", false);
+  box.id = "";
+  find_child(box, "tvar_logo").appendChild(make_logo(motif, 150, false));
+  if (data.options.revcomp) {
+    find_child(box, "tvar_rclogo").appendChild(make_logo(motif, 150, true));
+  }
+  set_tvar(box, "tvar_p", motif["p"]);
+  set_tvar(box, "tvar_p_total", data.sequence_db.count);
+  set_tvar(box, "tvar_n", motif["n"]);
+  set_tvar(box, "tvar_n_total", data.control_db.count);
+  set_tvar(box, "tvar_pvalue", motif["pvalue"]);
+  set_tvar(box, "tvar_evalue", motif["evalue"]);
+  set_tvar(box, "tvar_uevalue", motif["unerased_evalue"]);
+  set_tvar(box, "tvar_words", make_motif_words(motif));
+  var cell = document.createElement("td");
+  cell.colSpan = 8;
+  cell.appendChild(box);
+  var row = document.createElement("tr");
+  row.className = "more";
+  row.appendChild(cell);
+  return row;
+}
+
+/*
+ * Convert a string containing a scientific number into the log of that number
+ * without having an intermediate representation of the number.
+ * This is intended to avoid underflow problems with the tiny evalues that
+ * MEME and DREME can create.
+ */
+function sci2log(scinum) {
+  "use strict";
+  var ev_re, match, sig, exp;
+  ev_re = /^(.*)e(.*)$/;
+  if (match = ev_re.exec(scinum)) {
+    sig = parseFloat(match[1]);
+    exp = parseInt(match[2]);
+    return Math.log(sig) + (exp * Math.log(10));
+  }
+  return 0;
+}
+
+/*
+ * Create a table of discovered motifs. A fresh table body is used for each
+ * motif to make hiding/showing rows with css easier.
+ */
+function make_motifs() {
+  "use strict";
+  var i, row, tbody, motif, ordinal;
+  // make the motifs table
+  var container = $("motifs");
+  container.innerHTML = ""; // clear content
+  var table = document.createElement("table");
+  // add a header that is always shown
+  var thead = document.createElement("thead");
+  thead.appendChild(make_motif_header());
+  table.appendChild(thead);
+  for (i = 0; i < data.motifs.length; i++) {
+    ordinal = i + 1;
+    motif = data.motifs[i];
+    tbody = document.createElement("tbody");
+    tbody.className = "collapsed";
+    tbody.appendChild(make_motif_row(tbody, ordinal, motif));
+    tbody.appendChild(make_motif_exp(tbody, ordinal, motif));
+    // create a following header for every row except the last one
+    if ((i + 1) < data.motifs.length) tbody.appendChild(make_motif_header());
+    table.appendChild(tbody);
+  }
+  container.appendChild(table);
+}
+
+/*
+ * Create a table showing all the alphabet symbols, their names and frequencies.
+ */
+function make_alpha_bg(alph, freqs) {
+  function colour_symbol(index) {
+    var span = document.createElement("span");
+    span.appendChild(document.createTextNode(alph.get_symbol(index)));
+    span.style.color = alph.get_colour(index);
+    span.className = "alpha_symbol";
+    return span;
+  }
+  var table, thead, tbody, row, th, span, i;
+  // create table
+  table = document.createElement("table");
+  table.className = "inputs";
+  // create header
+  thead = document.createElement("thead");
+  table.appendChild(thead);
+  row = thead.insertRow(thead.rows.length);
+  if (alph.has_complement()) {
+    add_text_header_cell(row, "Name", "pop_alph_name");
+    add_text_header_cell(row, "Bg.", "pop_alph_control");
+    add_text_header_cell(row, "");
+    add_text_header_cell(row, "");
+    add_text_header_cell(row, "");
+    add_text_header_cell(row, "Bg.", "pop_alph_control");
+    add_text_header_cell(row, "Name", "pop_alph_name");
+  } else {
+    add_text_header_cell(row, "");
+    add_text_header_cell(row, "Name", "pop_alph_name");
+    add_text_header_cell(row, "Bg.", "pop_alph_control");
+  }
+  // add alphabet entries
+  tbody = document.createElement("tbody");
+  table.appendChild(tbody);
+  if (alph.has_complement()) {
+    for (i = 0; i < alph.get_size_core(); i++) {
+      var c = alph.get_complement(i);
+      if (i > c) continue;
+      row = tbody.insertRow(tbody.rows.length);
+      add_text_cell(row, alph.get_name(i));
+      add_text_cell(row, "" + freqs[i].toFixed(3));
+      add_cell(row, colour_symbol(i)); 
+      add_text_cell(row, "~");
+      add_cell(row, colour_symbol(c)); 
+      add_text_cell(row, "" + freqs[c].toFixed(3));
+      add_text_cell(row, alph.get_name(c));
+    }
+  } else {
+    for (i = 0; i < alph.get_size_core(); i++) {
+      row = tbody.insertRow(tbody.rows.length);
+      add_cell(row, colour_symbol(i)); 
+      add_text_cell(row, alph.get_name(i));
+      add_text_cell(row, "" + freqs[i].toFixed(3));
+    }
+  }
+  return table;
+}
+
+/*
+ * Updates the format download text in the popup.
+ * This is called when either the format or current motif changes.
+ */
+function update_outpop_format(index) {
+  var motif = data.motifs[index];
+  var fn = [motif_count_matrix, motif_prob_matrix, motif_minimal_meme];
+  var suffix = ["_counts.txt", "_freqs.txt", ".meme"];
+  var format = parseInt($("text_format").value);
+  var text = fn[format](motif);
+  prepare_download(text, "text/plain", motif.id + suffix[format], $("outpop_text_dl"));
+  $("outpop_text").value = text;
+}
+
+/*
+ * Updates the motif logos and format download text in the popup.
+ * This is called whenever the current motif changes.
+ */
+function update_outpop_motif(index) {
+  "use strict";
+  var motifs, motif, pspm, logo, canvas, num;
+  motifs = data["motifs"];
+  if (index < 0 || index >= motifs.length) {return;}
+  current_motif = index;
+  motif = motifs[index];
+  pspm = new Pspm(motif["pwm"]);
+  logo = new Logo(dreme_alphabet, "");
+  logo.add_pspm(pspm, 0);
+  canvas = $("outpop_logo");
+  canvas.width = canvas.width; // clear canvas
+  draw_logo_on_canvas(logo, canvas, false);
+  canvas = $("outpop_logo_rc");
+  canvas.width = canvas.width; // clear rc canvas
+  if (data.options.revcomp) {
+    pspm.reverse_complement(dreme_alphabet);
+    logo = new Logo(dreme_alphabet, "");
+    logo.add_pspm(pspm, 0);
+    draw_logo_on_canvas(logo, canvas, false);
+  }
+  num = $("outpop_num");
+  num.innerHTML = "";
+  num.appendChild(document.createTextNode("" + (index + 1)));
+  update_outpop_format(index);
+}
+
+
+/*
+ * Initialise and display the download popup.
+ */
+function action_show_outpop(e, ordinal) {
+  "use strict";
+  function init() {
+    "use strict";
+    var close_btn, next_btn, prev_btn, cancel_btn, do_btn;
+    var tab1, tab2, tab3;
+    var pnl1, pnl2, pnl3;
+    var format_list;
+    var tbl_submit, inputs, i, default_prog;
+    close_btn = $("outpop_close");
+    close_btn.addEventListener("click", action_hide_outpop, false);
+    close_btn.addEventListener("keydown", action_hide_outpop, false);
+    next_btn = $("outpop_next");
+    next_btn.addEventListener("click", action_outpop_next, false);
+    next_btn.addEventListener("keydown", action_outpop_next, false);
+    prev_btn = $("outpop_prev");
+    prev_btn.addEventListener("click", action_outpop_prev, false);
+    prev_btn.addEventListener("keydown", action_outpop_prev, false);
+    cancel_btn = $("outpop_cancel");
+    cancel_btn.addEventListener("click", action_hide_outpop, false);
+    do_btn = $("outpop_do");
+    do_btn.addEventListener("click", action_outpop_submit, false);
+    tab1 = $("outpop_tab_1");
+    tab1.tabIndex = 0;
+    tab1.addEventListener("click", action_outpop_tab, false);
+    tab1.addEventListener("keydown", action_outpop_tab, false);
+    tab2 = $("outpop_tab_2");
+    tab2.tabIndex = 0;
+    tab2.addEventListener("click", action_outpop_tab, false);
+    tab2.addEventListener("keydown", action_outpop_tab, false);
+    tab3 = $("outpop_tab_3");
+    tab3.tabIndex = 0;
+    tab3.addEventListener("click", action_outpop_tab, false);
+    tab3.addEventListener("keydown", action_outpop_tab, false);
+    pnl1 = $("outpop_pnl_1");
+    pnl2 = $("outpop_pnl_2");
+    pnl3 = $("outpop_pnl_3");
+    toggle_class(tab1, "activeTab", true);
+    toggle_class(tab2, "activeTab", false);
+    toggle_class(tab3, "activeTab", false);
+    pnl1.style.display = "block";
+    pnl2.style.display = "none";
+    pnl3.style.display = "none";
+    format_list = $("text_format");
+    format_list.addEventListener("change", action_outpop_format, false);
+    // setup program selection
+    tbl_submit = $("programs");
+    // when not dna, hide the inputs for programs that require dna motifs
+    toggle_class(tbl_submit, "alphabet_dna", dreme_alphabet.has_complement());//TODO FIXME alphabet_dna is a bad name for a field when allowing custom alphabets
+    // add a click listener for the radio buttons
+    inputs = tbl_submit.querySelectorAll("input[type='radio']");
+    for (i = 0; i < inputs.length; i++) {
+      inputs[i].addEventListener("click", action_outpop_program, false);
+    }
+    // ensure that a default program option is selected for DNA and Protein
+    default_prog = document.getElementById(dreme_alphabet.has_complement() ? "submit_tomtom" : "submit_fimo");
+    default_prog.checked = true;
+    action_outpop_program.call(default_prog);
+    // disable reverse-complement when not DNA
+    $("logo_rc_option").disabled = !dreme_alphabet.has_complement(); 
+    // set errorbars on when ssc is on
+    $("logo_ssc").addEventListener("change", action_outpop_ssc, false);
+  }
+  // store the focused element
+  action_hide_outpop.last_active = document.activeElement;
+  if (!e) e = window.event;
+  if (e.type === "keydown") {
+    if (e.keyCode !== 13 && e.keyCode !== 32) {
+      return;
+    }
+    // stop a submit or something like that
+    e.preventDefault();
+  }
+  // hide the help popup
+  help_popup();
+  // on first load initilize the popup
+  if (!action_show_outpop.ready) {
+    init();
+    action_show_outpop.ready = true;
+  }
+  update_outpop_motif(ordinal - 1);
+  // display the download popup
+  $("grey_out_page").style.display = "block";
+  $("download").style.display = "block";
+  $("outpop_close").focus();
+}
+
+/*
+ * Hide the download popup.
+ */
+function action_hide_outpop(e) {
+  if (!e) e = window.event;
+  if (e.type === "keydown") {
+    if (e.keyCode !== 13 && e.keyCode !== 32) {
+      return;
+    }
+    // stop a submit or something like that
+    e.preventDefault();
+  }
+  $("download").style.display = "none";
+  $("grey_out_page").style.display = "none";
+  if (typeof action_hide_outpop.last_active !== "undefined") {
+    action_hide_outpop.last_active.focus();
+  }
+}
+
+/*
+ * Show the next motif in the download popup.
+ */
+function action_outpop_next(e) {
+  if (!e) e = window.event;
+  if (e.type === "keydown") {
+    if (e.keyCode !== 13 && e.keyCode !== 32) {
+      return;
+    }
+    // stop a submit or something like that
+    e.preventDefault();
+  }
+  update_outpop_motif(current_motif + 1);
+}
+
+/*
+ * Show the previous motif in the download popup.
+ */
+function action_outpop_prev(e) {
+  if (!e) e = window.event;
+  if (e.type === "keydown") {
+    if (e.keyCode !== 13 && e.keyCode !== 32) {
+      return;
+    }
+    // stop a submit or something like that
+    e.preventDefault();
+  }
+  update_outpop_motif(current_motif - 1);
+}
+
+/*
+ * Highlight the selected row in the program list.
+ */
+function action_outpop_program() {
+  "use strict";
+  var table, tr, rows, i;
+  tr = find_parent_tag(this, "TR");
+  table = find_parent_tag(tr, "TABLE");
+  rows = table.querySelectorAll("tr");
+  for (i = 0; i < rows.length; i++) {
+    toggle_class(rows[i], "selected", rows[i] === tr);
+  }
+}
+
+/*
+ * Enable error bars when small sample correction is enabled.
+ */
+function action_outpop_ssc() {
+  "use strict";
+  $("logo_err").value = $("logo_ssc").value;
+}
+
+/*
+ * Submit the motif to the selected program.
+ */
+function action_outpop_submit(e) {
+  "use strict";
+  var form, input, program, motifs;
+  // find out which program is selected
+  var radios, i;
+  radios = document.getElementsByName("program");
+  program = "fimo"; // default to fimo, since it works with all alphabet types
+  for (i = 0; i < radios.length; i++) {
+    if (radios[i].checked) program = radios[i].value;
+  }
+
+  motifs = motif_minimal_meme(data.motifs[current_motif]);
+  form = document.createElement("form");
+  form.setAttribute("method", "post");
+  form.setAttribute("action", site_url + "/tools/" + program);
+  
+  input = document.createElement("input");
+  input.setAttribute("type", "hidden");
+  input.setAttribute("name", "motifs_embed");
+  input.setAttribute("value", motifs);
+  form.appendChild(input);
+
+  document.body.appendChild(form);
+  form.submit();
+  document.body.removeChild(form);
+}
+
+/*
+ * Download the format text.
+ * Wire the link containing the data URI text to a download button so it looks
+ * the same as the server submit stuff.
+ */
+function action_outpop_download_motif(e) {
+  $("outpop_text_dl").click();
+}
+
+/*
+ * Download the motif logo.
+ * The EPS format can be calculated locally in Javascript
+ */
+function action_outpop_download_logo(e) {
+  "use strict";
+  var pspm, logo, eps;
+  var logo_rc, logo_ssc, logo_width, logo_height;
+  var motif = data.motifs[current_motif];
+  if ($("logo_format").value == "0") { // EPS
+    logo_rc = ($("logo_rc").value == "1");
+    logo_ssc = ($("logo_ssc").value == "1");
+    logo_width = parseFloat($("logo_width").value);
+    if (isNaN(logo_width) || !isFinite(logo_width) || logo_width <= 0) logo_width = null;
+    logo_height = parseFloat($("logo_height").value);
+    if (isNaN(logo_height) || !isFinite(logo_height) || logo_height <= 0) logo_height = null;
+    // create a PSPM from the motif
+    pspm = motif_pspm(motif);
+    if (logo_rc) pspm.reverse_complement(dreme_alphabet);
+    logo = new Logo(dreme_alphabet);
+    logo.add_pspm(pspm, 0);
+    eps = logo.as_eps({"ssc": logo_ssc, "logo_width": logo_width, "logo_height": logo_height});
+    prepare_download(eps, "application/postscript", motif.id + ".eps");
+  } else {
+    $("logo_motifs").value = motif_minimal_meme(motif);
+    $("logo_form").submit();
+  }
+}
+
+/*
+ * Change the selected tab in the download popup.
+ */
+function action_outpop_tab(e) {
+  "use strict";
+  var tab1, tab2, tab3, pnl1, pnl2, pnl3, do_btn;
+  if (!e) e = window.event;
+  if (e.type === "keydown") {
+    if (e.keyCode !== 13 && e.keyCode !== 32) {
+      return;
+    }
+    // stop a submit or something like that
+    e.preventDefault();
+  }
+  tab1 = $("outpop_tab_1");
+  tab2 = $("outpop_tab_2");
+  tab3 = $("outpop_tab_3");
+  pnl1 = $("outpop_pnl_1");
+  pnl2 = $("outpop_pnl_2");
+  pnl3 = $("outpop_pnl_3");
+  do_btn = $("outpop_do");
+
+  toggle_class(tab1, "activeTab", (this === tab1));
+  toggle_class(tab2, "activeTab", (this === tab2));
+  toggle_class(tab3, "activeTab", (this === tab3));
+  pnl1.style.display = ((this === tab1) ? "block" : "none");
+  pnl2.style.display = ((this === tab2) ? "block" : "none");
+  pnl3.style.display = ((this === tab3) ? "block" : "none");
+  do_btn.value = ((this === tab1) ? "Submit" : "Download");
+  do_btn.removeEventListener("click", action_outpop_submit, false);
+  do_btn.removeEventListener("click", action_outpop_download_logo, false);
+  do_btn.removeEventListener("click", action_outpop_download_motif, false);
+  if (this === tab1) {
+    do_btn.addEventListener("click", action_outpop_submit, false);
+  } else if (this === tab2) {
+    do_btn.addEventListener("click", action_outpop_download_motif, false);
+  } else {
+    do_btn.addEventListener("click", action_outpop_download_logo, false);
+  }
+}
+
+/*
+ * Update the text in the download format popup.
+ */
+function action_outpop_format() {
+  update_outpop_format(current_motif);
+}
+
+/*
+ * Find all text nodes in the given container.
+ */
+function text_nodes(container) {
+  var textNodes = [];
+  var stack = [container];
+  // depth first search to maintain ordering when flattened 
+  while (stack.length > 0) {
+    var node = stack.pop();
+    if (node.nodeType == Node.TEXT_NODE) {
+      textNodes.push(node);
+    } else {
+      for (var i = node.childNodes.length-1; i >= 0; i--) {
+        stack.push(node.childNodes[i]);
+      }
+    }
+  }
+  return textNodes;
+}
+
+/*
+ * Get the text out of a specific text node.
+ */
+function node_text(node) {
+  if (node === undefined) {
+    return '';
+  } else if (node.textContent) {
+    return node.textContent;
+  } else if (node.innerText) {
+    return node.innerText;
+  } else {
+    return '';
+  }
+}
+
+/*
+ * Get the text contained within the element.
+ */
+function elem_text(elem, separator) {
+  if (separator === undefined) separator = '';
+  return text_nodes(elem).map(node_text).join(separator);
+}
+
+/*
+ * Sort all rows in the first table body based on the column of the given element and the comparison function.
+ * The sort is not very fast and is intended for small tables only.
+ */
+function sort_table(colEle, compare_function) {
+  //find the parent of colEle that is either a td or th
+  var i, j;
+  var cell = colEle;
+  while (true) {
+    if (cell == null) return;
+    if (cell.nodeType == Node.ELEMENT_NODE && 
+        (cell.tagName.toLowerCase() == "td" || cell.tagName.toLowerCase() == "th")) {
+      break;
+    }
+    cell = cell.parentNode;
+  }
+  //find the parent of cell that is a tr
+  var row = cell;
+  while (true) {
+    if (row == null) return;
+    if (row.nodeType == Node.ELEMENT_NODE && row.tagName.toLowerCase() == "tr") {
+      break;
+    }
+    row = row.parentNode;
+  }
+  //find the parent of row that is a table
+  var table = row;
+  while (true) {
+    if (table == null) return;
+    if (table.nodeType == Node.ELEMENT_NODE && table.tagName.toLowerCase() == "table") {
+      break;
+    }
+    table = table.parentNode;
+  }
+  var column_index = cell.cellIndex;
+  // do a bubble sort, because the tables are so small it doesn't matter
+  var change;
+  var trs = table.tBodies[0].getElementsByTagName('tr');
+  var already_sorted = true;
+  var reverse = false;
+  while (true) {
+    do {
+      change = false;
+      for (i = 0; i < trs.length -1; i++) {
+        var v1 = elem_text(trs[i].cells[column_index]);
+        var v2 = elem_text(trs[i+1].cells[column_index]);
+        if (reverse) {
+          var tmp = v1;
+          v1 = v2;
+          v2 = tmp;
+        }
+        if (compare_function(v1, v2) > 0) {
+          exchange(trs[i], trs[i+1], table);
+          change = true;
+          already_sorted = false;
+          trs = table.tBodies[0].getElementsByTagName('tr');
+        }
+      }
+    } while (change);
+    if (reverse) break;// we've sorted twice so exit
+    if (!already_sorted) break;// sort did something so exit
+    // when it's sorted one way already then sort the opposite way
+    reverse = true;
+  }
+  // put arrows on the headers
+  var headers = table.tHead.getElementsByTagName('tr');
+  for (i = 0; i < headers.length; i++) {
+    for (j = 0; j < headers[i].cells.length; j++) {
+      var cell = headers[i].cells[j];
+      var arrows = cell.getElementsByClassName("sort_arrow");
+      var arrow;
+      if (arrows.length == 0) {
+        arrow = document.createElement("span");
+        arrow.className = "sort_arrow";
+        cell.insertBefore(arrow, cell.firstChild);
+      } else {
+        arrow = arrows[0];
+      }
+      arrow.innerHTML = "";
+      if (j == column_index) {
+        arrow.appendChild(document.createTextNode(reverse ? "\u25B2" : "\u25BC"));
+      }
+    }
+  }
+}
+
+/*
+ * Swap two rows in a table.
+ */
+function exchange(oRowI, oRowJ, oTable) {
+  var i = oRowI.rowIndex;
+  var j = oRowJ.rowIndex;
+   if (i == j+1) {
+    oTable.tBodies[0].insertBefore(oRowI, oRowJ);
+  } if (j == i+1) {
+    oTable.tBodies[0].insertBefore(oRowJ, oRowI);
+  } else {
+    var tmpNode = oTable.tBodies[0].replaceChild(oRowI, oRowJ);
+    if(typeof(oRowI) != "undefined") {
+      oTable.tBodies[0].insertBefore(tmpNode, oRowI);
+    } else {
+      oTable.appendChild(tmpNode);
+    }
+  }
+}
+
+/*
+ * Compare two E-values which may be very small.
+ */
+function compare_evalues(v1, v2) {
+  var e1 = sci2log(v1);
+  var e2 = sci2log(v2);
+  if (e1 < e2) return -1;
+  else if (e1 > e2) return 1;
+  return 0;
+}
+
+/*
+ * Compare two counts.
+ */
+function compare_counts(v1, v2) {
+  var re = /(\d+)\s*\/\s*\d+/;
+  var m1 = re.exec(v1);
+  var m2 = re.exec(v2);
+  if (m1 == null && m2 == null) return 0;
+  if (m1 == null) return -1;
+  if (m2 == null) return 1;
+  return parseInt(m2[1]) - parseInt(m1[1]);
+}
+
+/*
+ * Compare two sequence words.
+ */
+function compare_words(v1, v2) {
+  return v1.localeCompare(v2);
+}
+
+
+</script>
+    <style>
+/* The following is the content of meme.css */
+body { background-color:white; font-size: 12px; font-family: Verdana, Arial, Helvetica, sans-serif;}
+
+div.help {
+  display: inline-block;
+  margin: 0px;
+  padding: 0px;
+  width: 12px;
+  height: 13px;
+  cursor: pointer;
+  background-image: url(data:image/gif;base64,R0lGODlhDAANAIABANR0AP///yH5BAEAAAEALAAAAAAMAA0AAAIdhI8Xy22MIFgv1DttrrJ7mlGNNo4c+aFg6SQuUAAAOw==);
+}
+
+div.help:hover {
+  background-image: url(data:image/gif;base64,R0lGODlhDAANAKEAANR0AP///9R0ANR0ACH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEAAAIALAAAAAAMAA0AAAIdDGynCe3PgoxONntvwqz2/z2K2ImjR0KhmSIZUgAAOw==);
+}
+
+p.spaced { line-height: 1.8em;}
+
+span.citation { font-family: "Book Antiqua", "Palatino Linotype", serif; color: #004a4d;}
+
+p.pad { padding-left: 30px; padding-top: 5px; padding-bottom: 10px;}
+
+td.jump { font-size: 13px; color: #ffffff; background-color: #00666a;
+  font-family: Georgia, "Times New Roman", Times, serif;}
+
+a.jump { margin: 15px 0 0; font-style: normal; font-variant: small-caps;
+  font-weight: bolder; font-family: Georgia, "Times New Roman", Times, serif;}
+
+h2.mainh {font-size: 1.5em; font-style: normal; margin: 15px 0 0;
+  font-variant: small-caps; font-family: Georgia, "Times New Roman", Times, serif;}
+
+h2.line {border-bottom: 1px solid #CCCCCC; font-size: 1.5em; font-style: normal;
+  margin: 15px 0 0; padding-bottom: 3px; font-variant: small-caps;
+  font-family: Georgia, "Times New Roman", Times, serif;}
+
+h4 {border-bottom: 1px solid #CCCCCC; font-size: 1.2em; font-style: normal;
+  margin: 10px 0 0; padding-bottom: 3px; font-family: Georgia, "Times New Roman", Times, serif;}
+
+h5 {margin: 0px}
+
+a.help { font-size: 9px; font-style: normal; text-transform: uppercase;
+  font-family: Georgia, "Times New Roman", Times, serif;}
+
+div.pad { padding-left: 30px; padding-top: 5px; padding-bottom: 10px;}
+
+div.pad1 { margin: 10px 5px;}
+
+div.pad2 { margin: 25px 5px 5px;}
+h2.pad2 { padding: 25px 5px 5px;}
+
+div.pad3 { padding: 5px 0px 10px 30px;}
+
+div.box { border: 2px solid #CCCCCC; padding:10px; overflow: hidden;}
+
+div.bar { border-left: 7px solid #00666a; padding:5px; margin-top:25px; }
+
+div.subsection {margin:25px 0px;}
+
+img {border:0px none;}
+
+th.majorth {text-align:left;}
+th.minorth {font-weight:normal; text-align:left; width:8em; padding: 3px 0px;}
+th.actionth {font-weight:normal; text-align:left;}
+
+.explain h5 {font-size:1em; margin-left: 1em;}
+
+div.doc {margin-left: 2em; margin-bottom: 3em;}
+
+th.trainingset {
+  border-bottom: thin dashed black; 
+  font-weight:normal; 
+  padding:0px 10px;
+}
+div.pop_content {
+  position:absolute;
+  z-index:50;
+  width:300px;
+  padding: 5px;
+  background: #E4ECEC;
+  font-size: 12px;
+  font-family: Arial;
+  border-style: double;
+  border-width: 3px;
+  border-color: #AA2244;
+  display:none;
+}
+
+div.pop_content > *:first-child {
+  margin-top: 0px;
+}
+
+div.pop_content h1, div.pop_content h2, div.pop_content h3, div.pop_content h4, 
+div.pop_content h5, div.pop_content h6, div.pop_content p {
+  margin: 0px;
+}
+
+div.pop_content p + h1, div.pop_content p + h2, div.pop_content p + h3, 
+div.pop_content p + h4, div.pop_content p + h5, div.pop_content p + h6 {
+  margin-top: 5px;
+}
+
+div.pop_content p + p {
+  margin-top: 5px;
+}
+
+div.pop_content > *:last-child {
+  margin-bottom: 0px;
+}
+
+div.pop_content div.pop_close {
+  /* old definition */
+  float:right;
+  bottom: 0;
+}
+
+div.pop_content span.pop_close, div.pop_content span.pop_back {
+  display: inline-block;
+  border: 2px outset #661429;
+  background-color: #CCC;
+  padding-left: 1px;
+  padding-right: 1px;
+  padding-top: 0px;
+  padding-bottom: 0px;
+  cursor: pointer;
+  color: #AA2244; /*#661429;*/
+  font-weight: bold;
+}
+
+div.pop_content span.pop_close:active, div.pop_content span.pop_back:active {
+  border-style: inset;
+}
+
+div.pop_content span.pop_close {
+  float:right;
+  /*border: 2px outset #AA002B;*/
+  /*color: #AA2244;*/
+}
+
+div.pop_content:not(.nested) .nested_only {
+  display: none;
+}
+
+div.pop_back_sec {
+  margin-bottom: 5px;
+}
+
+div.pop_close_sec {
+  margin-top: 5px;
+}
+
+table.hide_advanced tr.advanced {
+  display: none;
+}
+span.show_more {
+  display: none;
+}
+table.hide_advanced span.show_more {
+  display: inline;
+}
+table.hide_advanced span.show_less {
+  display: none;
+}
+
+
+/*****************************************************************************
+ * Program logo styling
+ ****************************************************************************/
+div.prog_logo {
+  border-bottom: 0.25em solid #0f5f60;
+  height: 4.5em;
+  width: 24em;
+  display:inline-block;
+}
+div.prog_logo img {
+  float:left;
+  width: 4em;
+  border-style: none;
+  margin-right: 0.2em;
+}
+div.prog_logo h1, div.prog_logo h1:hover, div.prog_logo h1:active, div.prog_logo h1:visited {
+  margin:0;
+  padding:0;
+  font-family: Arial, Helvetica,  sans-serif;
+  font-size: 3.2em;
+  line-height: 1em;
+  vertical-align: top;
+  display: block;
+  color: #026666;
+  letter-spacing: -0.06em;
+  text-shadow: 0.04em 0.06em 0.05em #666;
+}
+div.prog_logo h2, div.prog_logo h2:hover, div.prog_logo h2:active, div.prog_logo h2:visited {
+  display: block;
+  margin:0;
+  padding:0;
+  font-family: Helvetica, sans-serif;
+  font-size: 0.9em;
+  line-height: 1em;
+  letter-spacing: -0.06em;
+  color: black;
+}
+
+div.big.prog_logo {
+  font-size: 18px;
+}
+
+</style>
+    <style>
+/* dreme output specific css */
+div.header {
+  position: relative;
+  overflow: hidden;
+  margin-top: 15px;
+  margin-bottom: 5px;
+  margin-right: 3px;
+  margin-left: 3px;
+}
+div.header > h2 {
+  font-size: 1.5em;
+  font-style: normal;
+  margin: 0;
+  font-variant: small-caps; 
+  font-family: Georgia, "Times New Roman", Times, serif;
+}
+div.header > span {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+}
+
+div.template {
+  position: absolute;
+  z-index: 1;
+  left: 0;
+  top: 0;
+  visibility: hidden;
+}
+
+div.sym_btn {
+  display:inline-block;
+  text-decoration: underline;
+  cursor: pointer;
+  font-size: 20px;
+  line-height:20px; 
+  text-align: center;
+  width: 20px;
+  height: 20px;
+  color: blue;
+}
+div.sym_btn:hover {
+  color: white;
+  background-color: blue;
+}
+
+div.sym_btn.positioned {
+  position: absolute;
+  top: 0px;
+}
+
+div.box + div.box {
+  margin-top: 5px;
+}
+
+th.motif_ordinal {
+
+}
+td.motif_ordinal {
+  text-align: right;
+  padding-right: 10px;
+  font-weight: bold;
+  font-size: large;
+}
+th.motif_word {
+  padding-right: 10px;
+}
+td.motif_word {
+  font-size:15px; 
+  font-family: 'Courier New', Courier, monospace;
+  padding-right: 10px;
+}
+th.motif_logo {
+  padding-right: 10px;
+}
+td.motif_logo {
+  padding-right: 10px;
+}
+th.motif_evalue {
+  text-align:right;
+  padding-right: 10px;
+}
+td.motif_evalue {
+  text-align: right;
+  white-space: nowrap;
+  padding-right: 20px;
+}
+th.motif_more {
+  padding: 0 5px;
+}
+td.motif_more {
+  text-align: center;
+  padding: 0 5px;
+}
+th.motif_submit {
+  padding: 0 5px;
+}
+td.motif_submit {
+  text-align: center;
+  padding: 0 5px;
+}
+th.match_word {
+  padding-right: 10px;
+}
+td.match_word {
+  padding-right: 10px;
+  font-weight: bold;
+  font-size: large; 
+  font-family: 'Courier New', Courier, monospace;
+}
+th.match_evalue, th.match_count {
+  text-align: right;
+  padding-right: 10px;
+}
+td.match_evalue, td.match_count {
+  text-align: right;
+  white-space: nowrap;
+  padding-right: 20px;
+}
+
+div.tabArea {
+  font-size: 80%;
+  font-weight: bold;
+}
+
+.norc div.tabArea {
+  display: none;
+}
+
+span.tab, span.tab:visited {
+  cursor: pointer;
+  color: #888;
+  background-color: #ddd;
+  border: 2px solid #ccc;
+  padding: 2px 1em;
+  text-decoration: none;
+}
+span.tab.middle {
+  border-left-width: 0px;
+}
+div.tabArea.base span.tab {
+  border-top-width: 0px;
+}
+div.tabArea.top span.tab {
+  border-bottom-width: 0px;
+}
+
+span.tab:hover {
+  background-color: #bbb;
+  border-color: #bbb;
+  color: #666;
+}
+span.tab.activeTab, span.tab.activeTab:hover, span.tab.activeTab:visited {
+  background-color: white;
+  color: black;
+  cursor: default;
+}
+div.tabMain {
+  border: 2px solid #ccc;
+  background-color: white;
+  padding: 10px;
+}
+div.tabMain.base {
+  margin-top: 5px;
+  display: inline-block;
+  max-width: 98%;
+}
+
+div.tabMain.top {
+  margin-bottom: 5px;
+}
+
+div.grey_background {
+  position:fixed; 
+  z-index: 8;
+  background-color: #000;
+  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
+  opacity: 0.5;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+}
+
+div.popup_wrapper {
+  position:fixed; 
+  z-index:9;
+  width:100%; 
+  height:0; 
+  top:50%; 
+  left:0;
+}
+
+div.popup {
+  width: 600px; 
+  z-index:9;
+  margin-left: auto;
+  margin-right: auto;
+  padding: 5px;
+  background-color: #FFF;
+  border-style: double;
+  border-width: 5px;
+  border-color: #00666a;
+  position:relative; 
+}
+div.close {
+  cursor: pointer;
+  border: 1px solid black; 
+  width:15px; 
+  height:15px; 
+  line-height:15px; /* this causes vertical centering */
+  text-align:center; 
+  background-color:#FFF; 
+  color:#000; 
+  font-size:15px;
+  font-family:monospace;
+}
+
+div.close:hover {
+  color:#FFF;
+  background-color:#000; 
+}
+
+div.navnum {
+  width:100%; 
+  height:20px; 
+  line-height:20px; 
+  text-align:center; 
+  font-size:medium;
+}
+
+div.navarrow {
+  font-size: 30px;
+  text-decoration:none;
+  cursor: pointer;
+  -moz-user-select: none;  
+  -webkit-user-select: none;  
+  -ms-user-select: none;
+}
+
+div.navarrow > span.inactive {
+  display: inline;
+}
+div.navarrow > span.active {
+  display: none;
+}
+
+div.navarrow:hover > span.active {
+  display: inline;
+}
+div.navarrow:hover > span.inactive {
+  display: none;
+}
+
+table.programs {
+  width: 100%;
+}
+
+table.programs tr {
+  background-color: #EFE;
+}
+
+table.programs tr.selected {
+  background-color: #262;
+  color: #FFF;
+}
+
+table.programs tr.dna_only {
+  display: none;
+}
+
+table.programs.alphabet_dna tr.dna_only {
+  display: table-row;
+}
+
+table.inputs {
+  margin-top: 20px;
+  border-collapse:collapse;
+}
+table.inputs * td, table.inputs * th {
+  padding-left: 15px;
+  padding-right: 15px;
+  padding-top: 1px;
+  padding-bottom: 1px;
+}
+
+/* program settings */
+span.strand_none, span.strand_given, span.strand_both {
+  display: none;
+}
+td.none span.strand_none, td.given span.strand_given, td.both span.strand_both {
+  display: inline;
+}
+
+/* show the expanded motif only when the collapsed one is hidden */
+tbody *.less, tbody.collapsed *.more {
+  display: none;
+}
+
+tbody.collapsed *.less {
+  display: inline;
+}
+
+</style>
+  </head>
+  <body data-scrollpad="true">
+    <!--  -->
+    <div id="grey_out_page" class="grey_background" style="display:none;">
+    </div>
+
+    <!-- Help popups -->
+    <div class="pop_content" id="pop_">
+      <p>Help poup.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+
+    <div class="pop_content" id="pop_motifs_word">
+      <p>
+        The name of the motif uses the IUPAC codes for nucleotides which has 
+        a different letter to represent each of the 15 possible combinations.
+      </p>
+      <p>
+        The name is itself a representation of the motif though the position
+        weight matrix is not directly equalivant as it is generated from the
+        sites found that matched the letters given in the name.
+      </p>
+      <p>
+        <a id="doc_alphabets_url" href="#">
+        Read more about the MEME suite's use of the IUPAC alphabets.
+        </a>
+        <script>$("doc_alphabets_url").href = site_url + "/doc/alphabets.html";</script>
+      </p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_motifs_logo">
+      <p>The logo of the motif.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_motifs_rc_logo">
+      <p>The logo of the reverse complement motif.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_motifs_evalue">
+      <p>The E-value is the enrichment p-value times the number of candidate 
+        motifs tested.</p>
+      <p>The enrichment p-value is calculated using Fisher's Exact Test for 
+        enrichment of the motif in the positive sequences.</p>
+      <p>Note that the counts used in Fisher's Exact Test are made after 
+        erasing sites that match previously found motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_motifs_uevalue">
+      <p>The E-value of the motif calculated without erasing the sites of 
+        previously found motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_more">
+      <p>Show more information on the motif.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_submit_dl">
+      <p>Submit your motif to another MEME Suite program or download your motif.</p>
+      <h5>Supported Programs</h5>
+      <dl>
+        <dt>Tomtom</dt>
+        <dd>Tomtom is a tool for searching for similar known motifs. 
+          </dd>
+        <dt>MAST</dt>
+        <dd>MAST is a tool for searching biological sequence databases for 
+          sequences that contain one or more of a group of known motifs.
+          </dd>
+        <dt>FIMO</dt>
+        <dd>FIMO is a tool for searching biological sequence databases for 
+          sequences that contain one or more known motifs.
+          </dd>
+        <dt>GOMO</dt>
+        <dd>GOMO is a tool for identifying possible roles (Gene Ontology 
+          terms) for DNA binding motifs.
+          </dd>
+        <dt>SpaMo</dt>
+        <dd>SpaMo is a tool for inferring possible transcription factor
+          complexes by finding motifs with enriched spacings.
+          </dd>
+      </dl>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_motif_positives">
+      <p># positive sequences matching the motif / # positive sequences.</p>
+      <p>Note these counts are made after erasing sites that match previously
+        found motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_motif_negatives">
+      <p># negative sequences matching the motif / # negative sequences.</p>
+      <p>Note these counts are made after erasing sites that match previously
+        found motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_motif_pvalue">
+      <p>The p-value of Fisher's Exact Test for enrichment of the motif in 
+        the positive sequences.</p>
+      <p>Note that the counts used in Fisher's Exact Test are made after 
+        erasing sites that match previously found motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_motif_evalue">
+      <p>The E-value is the motif p-value times the number of candidate motifs 
+        tested.</p>
+      <p>Note that the p-value was calculated with counts made after 
+        erasing sites that match previously found motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_motif_uevalue">
+      <p>The E-value of the motif calculated without erasing the sites of 
+        previously found motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_match_word">
+      <p>All words matching the motif whose uncorrected p-value is less than
+      <span id="help_add_pv_thresh"></span>.</p>
+      <script>$("help_add_pv_thresh").innerHTML = data.options.add_pv_thresh;</script>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_match_pos">
+      <p># positive sequences with matches to the word / # positive sequences.</p>
+      <p>Note these counts are made after erasing sites that match previously
+        found motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_match_neg">
+      <p># negative sequences with matches to the word / # negative sequences.</p>
+      <p>Note these counts are made after erasing sites that match previously
+        found motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_match_pval">
+      <p>The p-value of Fisher's Exact Test for enrichment of the word in 
+        the positive sequences.</p>
+      <p>Note that the counts used in Fisher's Exact Test are made after 
+        erasing sites that match previously found motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_match_eval">
+      <p>The word p-value times the number of candidates tested.</p>
+      <p>Note that the p-value was calculated with counts made after 
+        erasing sites that match previously found motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+
+    <div class="pop_content" id="pop_seq_source">
+      <p>The sequence file used by DREME to find the motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_seq_alph">
+      <p>The alphabet of the sequences.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_seq_count">
+      <p>The count of the sequences.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+
+    <div class="pop_content" id="pop_alph_name">
+      <p>The name of the alphabet symbol.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+
+    <div class="pop_content" id="pop_alph_control">
+      <p>The frequency of the alphabet symbol in the control dataset.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+
+    <!-- templates -->
+
+    <div class="template box expanded_motif" id="tmpl_motif_expanded">
+      <div>
+        <span class="tvar_logo"></span>
+        <span class="tvar_rclogo"></span>
+      </div>
+      <h4>Details</h4>
+      <table class="details">
+        <thead>
+          <tr>
+            <th class="match_count">Positives <div class="help" data-topic="pop_motif_positives"></div></th>
+            <th class="match_count">Negatives <div class="help" data-topic="pop_motif_negatives"></div></th>
+            <th class="match_evalue">P-value <div class="help" data-topic="pop_motif_pvalue"></div></th>
+            <th class="match_evalue">E-value <div class="help" data-topic="pop_motif_evalue"></div></th>
+            <th class="match_evalue">Unerased E-value <div class="help" data-topic="pop_motif_uevalue"></div></th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td class="match_count">
+              <span class="tvar_p"></span> / <span class="tvar_p_total"></span>
+            </td>
+            <td class="match_count">
+              <span class="tvar_n"></span> / <span class="tvar_n_total"></span>
+            </td>
+            <td class="tvar_pvalue match_evalue"></td>
+            <td class="tvar_evalue match_evalue"></td>
+            <td class="tvar_uevalue match_evalue"></td>
+          </tr>
+        </tbody>
+      </table>
+      <h4>Enriched Matching Words</h4>
+      <div class="tvar_words"></div>
+    </div>
+
+
+    <div class="popup_wrapper">
+      <div class="popup" style="display:none; top: -150px;" id="download">
+        <div>
+          <div style="float:right; ">
+            <div id="outpop_close" class="close" tabindex="0">x</div>
+          </div>
+          <h2 class="mainh" style="margin:0; padding:0;">Submit or Download</h2>
+          <div style="clear:both"></div>
+        </div>
+          <div style="height:100px">
+            <div style="float:right; width: 30px;">
+              <div id="outpop_prev" class="navarrow" tabindex="0">
+                <span class="inactive">&#8679;</span><span class="active">&#11014;</span>
+              </div>
+              <div id="outpop_num" class="navnum"></div>
+              <div id="outpop_next" class="navarrow" tabindex="0">
+                <span class="inactive">&#8681;</span><span class="active">&#11015;</span>
+              </div>
+            </div>
+            <div id="logo_box" style="height: 100px; margin-right: 40px;">
+              <canvas id="outpop_logo" height="100" width="250"></canvas>
+              <canvas id="outpop_logo_rc" height="100" width="250"></canvas>
+            </div>
+          </div>
+          <div>
+            <!-- tabs start -->
+            <div class="tabArea top">
+              <span id="outpop_tab_1" class="tab">Submit Motif</span><span
+                id="outpop_tab_2" class="tab middle">Download Motif</span><span 
+                id="outpop_tab_3" class="tab middle">Download Logo</span>
+            </div>
+            <div class="tabMain top">
+              <!-- Submit to another program -->
+              <div id="outpop_pnl_1">
+                <h4 class="compact">Submit to program</h4>
+                <table id="programs" class="programs">
+                  <tr class="dna_only">
+                    <td><input type="radio" name="program" value="tomtom" id="submit_tomtom"></td>
+                    <td><label for="submit_tomtom">Tomtom</label></td>
+                    <td><label for="submit_tomtom">Find similar motifs in
+                        published libraries or a library you supply.</label></td>
+                  </tr>
+                  <tr>
+                    <td><input type="radio" name="program" value="fimo" id="submit_fimo"></td>
+                    <td><label for="submit_fimo">FIMO</label></td>
+                    <td><label for="submit_fimo">Find motif occurrences in
+                        sequence data.</label></td>
+                  </tr>
+                  <tr>
+                    <td><input type="radio" name="program" value="mast" id="submit_mast"></td>
+                    <td><label for="submit_mast">MAST</label></td>
+                    <td><label for="submit_mast">Rank sequences by affinity to
+                        groups of motifs.</label></td>
+                  </tr>
+                  <tr class="dna_only">
+                    <td><input type="radio" name="program" value="gomo" id="submit_gomo"></td>
+                    <td><label for="submit_gomo">GOMo</label></td>
+                    <td><label for="submit_gomo">Identify possible roles (Gene
+                        Ontology terms) for motifs.</label></td>
+                  </tr>
+                  <tr class="dna_only">
+                    <td><input type="radio" name="program" value="spamo" id="submit_spamo"></td>
+                    <td><label for="submit_spamo">SpaMo</label></td>
+                    <td><label for="submit_spamo">Find other motifs that are
+                        enriched at specific close spacings which might imply the existance of a complex.</label></td>
+                  </tr>
+                </table>
+              </div>
+              <!-- download text format  -->
+              <div id="outpop_pnl_2">
+                <div>
+                  <label for="text_format">Format:</label>
+                  <select id="text_format">
+                    <option value="0">Count Matrix</option>
+                    <option value="1">Probability Matrix</option>
+                    <option value="2">Minimal MEME</option>
+                  </select>
+                </div>
+                <textarea id="outpop_text" name="content"
+                  style="width:99%; white-space: pre; word-wrap: normal; overflow-x: scroll;" 
+                  rows="8" readonly="readonly" wrap="off"></textarea>
+                <a id="outpop_text_dl" download="meme.txt" href=""></a>
+              </div>
+              <!-- download logo format -->
+              <div id="outpop_pnl_3">
+                <form id="logo_form" method="post" action="">
+                  <script>$("logo_form").action = site_url + "/utilities/generate_logo";</script>
+                  <input type="hidden" name="program" value="DREME"/>
+                  <input type="hidden" id="logo_motifs" name="motifs" value=""/>
+                  <table>
+                    <tr>
+                      <td><label for="logo_format">Format:</label></td>
+                      <td>
+                        <select id="logo_format" name="png">
+                          <option value="1">PNG (for web)</option>
+                          <option value="0">EPS (for publication)</option>
+                        </select>
+                      </td>
+                    </tr>
+                    <tr>
+                      <td><label for="logo_rc">Orientation:</label></td>
+                      <td>
+                        <select id="logo_rc" name="rc1">
+                          <option value="0">Normal</option>
+                          <option value="1" id="logo_rc_option">Reverse Complement</option>
+                        </select>
+                      </td>
+                    </tr>
+                    <tr>
+                      <td><label for="logo_ssc">Small Sample Correction:</label></td>
+                      <td>
+                        <input type="hidden" id="logo_err" name="errbars" value="0"/>
+                        <select id="logo_ssc" name="ssc">
+                          <option value="0">Off</option>
+                          <option value="1">On</option>
+                        </select>
+                      </td>
+                    </tr>
+                    <tr>
+                      <td><label for="logo_width">Width:</label></td>
+                      <td>
+                        <input type="text" id="logo_width" size="4" placeholder="default" name="width"/>&nbsp;cm
+                      </td>
+                    </tr>
+                    <tr>
+                      <td><label for="logo_height">Height:</label></td>
+                      <td>
+                        <input type="text" id="logo_height" size="4" placeholder="default" name="height"/>&nbsp;cm
+                      </td>
+                    </tr>
+                  </table>
+                </form>
+              </div>
+              <!-- Buttons -->
+              <div>
+                <div style="float:left;">
+                  <input type="button" id="outpop_do" value="Submit" />
+                </div>
+                <div style="float:right;">
+                  <input id="outpop_cancel" type="button" value="Cancel" />
+                </div>
+                <div style="clear:both;"></div>
+              </div>
+            </div>
+        </div>
+      </div>
+    </div>
+
+
+
+    <!-- Page starts here -->
+    <div id="top" class="pad1">
+      <div class="prog_logo big">
+        <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAAAd0SU1FB9wLGwYBMoyhiwgAACAASURBVHja7Z13fFRV9sC/503JpIeaKFVREBQVEEFFQVcUuyDouuraFoVV17IrayPjDP4U3XXXhrpiXxuKKF1dV8WCiEgXRUAQlJIYAilMf+f3x3szmVSSkICyOR/eh8wr9717z7mn3XPOhRZogRbYLQiQJiJGy1D8D0LHjh1/XrZsmQK9gU3Ap0mE0QL7KTx411136Z///GdV1ZhpmvrYY4+pqsZUVceNG6dAz5Zh2j/hnpKSEtM0TVVVrfq/qmosFtMxY8Yo8CPQHejucDjyfm0dbZFp1WGaxmJ3ppSWSiQUIhQKIWJxehGhpKSE1LQ0uvfowQHZ2exYt65D8dq1qzUaXR2LxTYCP7UM4a8MVFWA9mY0+nLhmjV63LHH6vMvvKATJkzQfn366CtPPKEDjjtOV61apeeedZZqMKgaCKju2KFmYaFqJKJaWqqqqoACR/9a+u5sQT+IiD77zDPbKCnR00aOZPHSpcydO5fLf/972rdvTzgcZsEnnzDmqquYPmsW/PxzxbMOB4NPOokRZ5+tB3XrJsAUYKmqOkQkVuVVKUBGDRbGz/vSvPlfBHcVDpB7XP/+Gz9/5x1mzJ/P1i1buPbaa1m/fj1du3alW5curPvqqxobCoVCpKSkIO3a1Wc89bCuBy51OZwu1RgiBqGYGf1uw09/Bd5t4QDNT+wKfPXoxIl9jzm6gkt/OmsWn3/4oRIMyrfLlzPuzjvp27cvHTt2ZNGXX+K/7baaW8zJITM1lflz5wL8ZtWqVWm9evXaVcv7Q2cN6hM68tAuR2MIhirFpUEef+MdBFK1RQQ0v6g/MC9PLxk5Uq+/7joIBECSJmwwKKqKR4RTTjyR0885h2effZaNa9Ywa9YstKQkoQzGwSwuJhwIwK5ddO3a9b+9evWqjQPoSf16qUOQles2gYLL5WDaBwu5dtSw8L/eeKdFB2huaJWTo0NOOMF8wOs1qiG/QhfghtGj+dMNN4DblhJlZVBaWg35AIYI7NgBbjcbNmwwjz766I+WLl16OfCDfUs3YB3AAdke6d7tYNR2Jv6wuZA2rbIwxbFPxfD/jBn4t7vv5uUnnzRsTNelEEIoBKWl1qH1YM7hMAXffWcsWbBgMLAB+AgoAtYC5SJCp86dUTPG89M/ACASi1mDH4u2+AH2Bvzhpps+p3Xrmi+mp2Oa5h613y4nh1WLFuHxeHTq1KmDVbWVqjJjxozU4cOH88rsj1FXKteMOh3D4eQ/ny/hjnwfn32zyWUYxtAWK6D54YW1X355WbcePSr32elk1EUX8cYbb1gzvvG+BEzA2b49msQ1RARVZe7cuTzzjwl079qB6R8s4PhThjF58mQADjroIDZs2CAtBLAXFMEaTwaDe4R8ALKzEbcbVUVVE4hP/t/lctGnTx9+c8op3HvffQm9YubMmZx77rlic2Rzbw7I/5oreNzJgwapqqI7dqA7d1pHSUnyVG5Uw0MGD6agoCCB7IQ+kcQFIpEIkydPZszYsQmuoaqEw2H95JNPdOHChTHgervJT4DTWzhA08OjwGWT7r8/u3xXhckei8W47c47obwcMjMtsy9OEHUojdhI/M2oUXwwb16dIqKqJVFaWkJmZlal60OGDJk7b968M1SVsWPH8uSTTxYC7WmBvQIbV6xcGQK0aM0a3bRsmW5fu1b1559NLSzUakdBgXXYawC7A0CXLVtW7fzMmTOrnTNNU03T1OXLl5u1ia4WaA4lQbXVmDFjcoFcIHfJ0qUXqKqaBQXVCMC0kZ+MtNogEAjoli1bar0ef/bee++tiXDMFszsQ+jbt+/r1111leqOHZWJIBBQ7913azgc1qaAeABCVUKqQgBvAO8BL7RgZu9xhd6nnnpqNLpzp8559VXVkhL9ZOZM/X79+j1Bdm1sP2KaZix+rqioSBctWqSqejPw2KhRo+IPxjp06KC0rOg2p82AkE8O4zkbiAJ6ySWXVJLRjUW2qmqrVq30+eefr3RrFWYQf4+pqjpq1Khq7zYMY4/0g5agxppgPCnARcC1GPRFSUF5gAn0VNVz69vMkiVLWLNmDRdeeGGt93Tu3JmNGzfu1slkGAZbt24lNze30jWHw4Fpmo3GYwv7SIY7GYKD8UA/INteQFaKEL7iqBNPPPHYhjTXp08f+vTpU+O1rVu38sc//pE5c+ZgmiaGUbtLJu5HqMNdfYXT6VwdjUY/b+EAdXm9DMNlmmYrAA/I6SKe6ao/JM38v2Pw52oPrgV9Seu06RugTzT62ZogNzeXbdu2ISIYhpFmmmagxRNYC7Gbptlnw5Il29Z/9dW2H1ev3jpddQPwQ79+/f5k32NNsSpStdeSXonZ99JLL+0RAkWEG2+8samUU7Zt2xb3KKppmptbREAd43Vwly5fdDniCLS42DoRDILb3fnRiRPzLzzrrIdVlX9MeoKCw36GSMUIpaWlJVh0UVHRHiPt4YcfbhqKruxyFiDUIsfrhpWAfjprlpplZVZUb1UHTyBgRfnGD1Xt0KlTvR0++xIcDodecMEFCvxDVXv/79nrM2lnzuAanUWdnV8InzocDu104IGqO3aY+vPPWqOrt7BQdds2jcRijTLzmsg5VO93RCyCNa+88kotKCgosTnC6f8rIkD/PGcsQ044AYAZL9XOgkdfdlnxibEYuzZvjkpOjrN1q1Yc1Llz4p4Lzz+fcePH21qBidMwGDhwIA8++CAn2O1XZcWjR4/mmmuuoX///k2ruIjw9ttvc/755+9enjudAGIYBu3atctUVXr16vXOqlWrOovIpv169pszeX/yP/9Z+0xOPqLRymy+yvHp7Nl61tChetbQoTpt6tRaF2x+qSLh6quvTvw9adIkE3hrw4YNjv3WDNSZDEZ5/6Hl9zhvGjsWzKZbOykH0tu2Tdjie9H9XCmYpCHPjR49mqeffjqZi5iq+jQwVkTM/c4MVCUfcM564y6u+8ufmxRRV1xxxb6xWUUSR0Ofa2clqdgSzOTVV181otHoNTNnzjxjv9MBzBl0EeUUNeD9e2Dkfc/z53xPnUGeN4wezcFHHlmvwX1j1iwAJk6cuNf7tmLFit16CavCww8/jMPhSHZ+sWDBAi688EL97W9/O0tVPSIS2m9EgDmda8XgSRRFKvqjigooQh85h+Xx819BaxO2nQ/ODGAjrA5A9WyeTA4kg1y2UCnO75cOJ510Eh9//HGN10aOHKmLFi2a98MPP5y834gAEYaikIx8+7wAhpr8oabnpgMvA5/Av4C+1Y5bWMRoIJUXBg0apL8G5KsqH3/8cY0iUFWZOnWqnHfeeUNUtcPeJoBUwFPHkdoYbqQ+BBiitYVMWYs57iqnYskv0trEoGlzjXGMX7du3R3RaNMlcDz55JN1c7VGKrFVg1DjiE++duutt6phGAtV1dhbBHBW6+zM0iM6tSkccFTPwv6HH1o44KiehUd0ap34PahPr0Kga4MJ4CjOUWgjUgvxKIiDc8yZpMVPReEkrZ/uk2hz69atr7344ot2i3sOY8aMqRXJt99+e40yf9q0aU2iRHbs2FEGDhx4wPr1689sbiXwcDEck3My044ePWKo4dRwRjQUILPtgZRt34rDeTCxWJSs1rk8PmUOKSkeCYWCDSR5OiXQpLYggLCCS8TCv0CmmBWELtDNThPeKZBdzzdtuPrqqyU1NVXPPPNMsrKyqs26hkJtil12dnaN7HvEiBEN1kPatGnD9OnTOe+88yqdnzRpkoiIpzk5wMnZGWkrhxxz+HG3XHRqqsPplPKyMlxZ7dkVCODMaEtZeRlpOe3419S5dOt8ANFYrDHy/5i4wocgKH9Xg0MFvkiewVolqNKexu+p5TFIq+/7fve733Wcm5PzStzbJyK43e4mHbjbbrutmgyvmmdQX+jatSu1ia4tW7asbS4O0Mntcn5wxx9GaUlJiQQiiivFQKNhHAaEy8pwuj1kt8njqTfepXvXA+nToyvzvlzZCK2HYxGsf8oKPNxunE5U3+Kv6uBdBI8qHlEOB76sLiBQA04GfPV840/dIPDEV1/dd5lhXP0TLAmrzveIyKlnnXV3z549uSknp/Qf27dnDh06lGHDhu2RLG+M4ygOmzZt4swzz+SCCy6o8f7PPvtsS3MRwPI22Zn61LT3JRwoQw0noIg4UP0Wp8uNwzAQEbp3PZDB/Xqxs2xXwzs8B6dGcNvs3BST2+V0ogAynI/N6SwTYYCCC8FTnQEkwNEwqYNDwbgZCoAPROSBL6CLMXv2rctmz85eC5suX7Yss3fv5lmMi0QiqGo1ziMiZGdns2LFCjp37kynTp3w+/01EoqtDJY0FwEEI6FAzgF5OQw6vi/ZuZ2qsDTFYRj4n5pKSXmAwcc0cqBCHC0ODrFlf1TdLK6CqWUKA5IxvhwkDCfsoSY3AHhCLQKIZ+x4gNgy0KOgpP9RR5kh1QNVVZrafEx28lRF7M6dO+vFXbZt2zYzLiKbRQfof2QvBg/sh5HZlrJdAcp2BSgPBO0jRFnAUvaGDuhNWKVR+XhacQiwQkJsq9RRk9fFVgvjKCgHUTjY/j0TCNOApItnraacWAUgNgI9kr4n8Hu4HejxCVwhIufbkT9ah07RoD5PmTIFwzBqVCDrS2hjxozh0ksvzW1WP4DGPTGqlO/4GTEMMGMJRBticGiXA4hEYxAO1J17V7sCmJpkq70vw6shsrwWV6fadPGFQkSg+6dW9a7dQtuK7glgSAXxuA3IFbgnaQhmPvroo2kvvviiTJkyhfnz51ebsa+++mqD+nzRRRdVUxAbsu6hqvztb3/ToqKi9LfeessNuJqFAFJcTsx4UqXhsIY8o03i7x+3FfH1uk10ymvbKOTbLP4uxEaFWb3CVtw5ZP9f0yw37OttU6mkI9QK7SALONh+7geFTp9bhHBI8jsdkGkTQeDyyy+XRy6++MCJQ4aQ4jJwuxy4nQYOw2DqM4/w6KOPNsi/EJ/p4XCYYDCIiDBz5sz6IF9FhKysLFHVZ4YPH74DiDQLAfxnwTI8bhcA6QceCmrCrh1JyFGcDgebC7ZbMe+N0XohB0BNtkuUFdUNapYqrBTlWnawIPnRKm8z+sHO+rzTsPP3HfCdAcUKrRwWAcTZglj0WNmpNV+15OgLYMLYU/nsoYP4+w0D6NPzIFYu/YqbLDEhDZ3NW7duZf369agq55xzTr0IZ+TIkfTs2fMqEflns4qAXcEQD7000+pQeBehcMTqY0paJXZkGILDYbDw63UYTkcjGQGFMrJ6oUXjZEKEOEHOZbJcTsy+1wW018revtKvbGKqr3SzxYgA6tiNFxFg1nhy+x4coaA0g+8Lc1mxqSsOw8CMmYrAIYcc8pWIMGHCBD744IN4mjGzZ8+u9UM6d+5Mz5496yP7TWDh+PHj5c0337z5m2++eS75YnNYAUuBYcUlZRTtLKNtNjhTMyAWhkAJVCm57zAMPl60ktRUD4FG+Nu1jjUEYxQlVe51A22A4hDsTIEihdxwPXUAJ7QywWXP9gKgvQluhSyjMmEkOqmzOBqTawpLiKalf+WcumQkaZ7VRCMRwsEyycnKCq9bt+4e4G2v1wswbs2aNfcfcsghnH322XsU26CqFBQUGHl5eZMsCca/apSDTQxnAEsNw+Bfb7yDw+nAiIYs5ljDfguC4HQ5oQEeOX2LTsDRtgqwraHjIrDhBNgKfA+kOmFIPblNOhADchXuAGKm1auOSRbJarGqh6PT6YPJuTj4dvgDrPv7zJNp3+pHwsEQS77bqNlpLkrLylxVfBEP9OvXL7t169bFzzzzTKMJIO4YysvLU9216wWgNRDYGwQAdrFkj8dj6WmGUaupVx4MIohCDXK8ts45SMewuJdq40usaoUdbzRABDgU3hZrrwBxWs/GrdJLgamAQ+dyACnI1PlDNslZW5Z/tvxC98at82MSLg+nOwkhEvnHy+8QicYEeDP5JSUlJSXFxcVnXH311Yfcd999DepTfJFpxIgRiAgbFi+Oh8gJtWnCzQBvJ3ynBdvrObkaKPs18aDRAIRrfcVHLc9nWRYoOTbCU0LWgpJD4Zn+VoiBiIGDCA+tWt/5xElPnb/11uzhOfD6tNUb1sy654XZcx+c8v5MPPpM4Q0l5yb67k36tnyuwcsaYN2bb7652lbidzvjwUpIFZFvZ8yY8U9AFi1bJpgmpw4e7Hn8iSfa7y0C2BFXmMLRmGUFZOVZXKBKR9I8KbYzr/khDVphKYJxKGggAXSsgWhjapmBAfueoKTQ86ftbd4cNvZv342KPtj3b/4FC4C/AOfbxygC/BGYjJerKymY+dyNn6fwsR1g8eLFh4kFNdr+yev9IsLAgQMBnjFN8xawah8RCjH12Wfd2dnZf9pbBHCl9U1JXj61TfHUrEZX4tpTiMJRgEcrMPiuzbu7NcDqSDYHDCzF0p0w5WBtaSDd3fGKDwdc1/rO464bt+kZbmRrjY35yQMW4+VBNNH0kYnr3sS5/r17917bt29fzjzzzER0kmmaiAiHdu/OgL59WfzBB0QikUqv+L/HHoNWrcjOztY/33jjnap6dnNbAYmPq8S2DAcYTUdvWuGTq7PAnzmdozEpM4azNsmMe99G5nr791H1fGerJCL4RKCvEzpbcSd8Y99jOohFx7cfNf/JS9Yu5C4b+V5yUcZWoiA/d+NjCV4mIVxGPjvwVzJJ7yGfUvxMXLly5aH2uRduvfXW30+bNo1Vq1bN9Hg8Zxd8842069TJKoAdDlf65uVLl743b/bsUwcff7zx1xtvVBE5CpjV7ARAJbepQGlBHaK+gSqA4BZLoIeBGnOAzHcRCeJVAy9wElbd3jgU1TyhdwuH2Q+8HYMrndaagClgKBTbDao4gtnzTlr93YZ/sslm688AF+InM2l2tyKfAEIaPo7HyybCDALgrwzEzTx8pPR6rJesYlXyN1z+97///fKMjAyXx+OJANF2HTo4CNSaFX76I5Mn6+Djj+emcePkhWnTzli6ePH/NbcIALghMcBij7DhqHGkXbYTyOPxXFw/9sJVGveKhqkWSWK+TT8JsdJGfk1UmdKYDomle84Pw4VRCKj1uyPQmQo38I8pMe75eGqSVePnanxJyAfwUYyfVOAa+3enj679aMW9H99bFLwn+Ln6NWKapq66flWNxFlWVhZpqNiipIQ+3bufoKr/anYCcDqdyypZ+6oEgoGqwbuEI1Fuu/J8cjLTFOhUrw4ZpCS5X6uy/KEYzEfoJdVV/Y72gMQX0x0NHIc0gc3HQ2SQlXi5zrAcLO74esMxML8//LsBQ/U1+TyOFx3yxJCH7njjjpM9Lo+ISIZhGPVhjY7vvv66Tg722cKF4HKBKrfecIOKyEnNTgAulyvJTWmha9eW7xEUl9NRKcwpHImi2mCTrDboIVW2hEl65veSNCkUFoiFyH71fGc/S5dMNBKxiSgSg28bOVSfIUxC+fCREY+s59GKHIZ6Qu+1dRealq0FBectWLBAAXr26SM9DjnksCVLlvTdGzoAYhgEy3bgycgmvU0eGijhgHatq/mw60fsu9ccpGK5tyZiidp/L7bPXwakaP11ALcJHye1G8WS/+4YBBs1QD4U+Bo45U/+PzXK9e5yuSq6XD3aWIEZp40cKSUbNyrl5fLa5Mn06dMnrVk5gL0Vm+XtKy4EEVLSMkGEDZsLKsKi7aybmy85m2CwYWOoDSeUDvbfZQthmgF3S8NCvdVIcqfO5oznT2POfxww5Xj4jn0Dg6KRSJyd0uGgg2q8qbSs7IzNP/0ksViMjPR0Jk+e3LwcQERmqypqmrTueDCoJpb+K0W0CIgKu4JNU91E6yYE077+qgGt1FoXkPrQ0nJwhaBrhUqxsN/duLIBTz+YyL6DBWaSuR0Oh2vMZDZEPuzQu3eJqmYempe3CXikua2ADBGxAkOo0AUioSrmSkome6sWssI2+0vi9nz8w7IWWG7eWmGXpVekAz/Cyr5geCD2M5hL+IWAmiaFRUU1LiCZqiERWSYiAaDL3jADUVW6dcy1RlmsSOBoMgGoWg6iRkYFST3PKbDQ0tYHUF0/UIEsl4XcOtcRBCKTuMYNWg6aB/IK9Iv9UghARKo5gqrg46SsrKz2e8MVXAnHoJDexqbS5HAMgWBZk7J7Tfo/mfdErb46arLt6/MuAzmojPSVU7i4OwT7gsyDfr+oqlyqWrHbWS1QUlJSvldcwTWlMZmmSVp2a3YW7UiSylEUSE9NaeIPoFwAFdJFCRh7mAp/LLo5j9e+DZAxEPgDHFP6S0G8y+UCtxsxDFrl5OAwjB9i9UwwbRYCSE1NTVFV0jzuauxZq85XO7Pz+Rkf4XanEA7Xf1JJ7d66dUQZpk7mohyCtQCkdbUT3s1YCItag7YB9wg4KvhLmvnDkmoR2/L/jfo+21wi4OGYaeqNvzuLmGnaYeL2QDprZlE/7yhtsC9Aa+7RQkyOM0awNp4cqyYxo3osQPJvtxN+U/fbytdD/zN/aciPm9zxgwZyuuYiAAUkGAoTLN2BiAFlRVbwlMOdUFhcTme1Ldb2WBE6h4XG+RRW0gOcGAYcYfdXbeSLwncmPG/fuxsZNHj3PNXLoc2K6b9wYigSupwbGNug527nZrxMx8uBe4sAKsynnUVWSFgSbYgITofBh4u+xu1qvBTanQEvlf9ok6R6isKiGBzeiJjCuuD4ZhvIfN7DyTtRjT6vj+gk7iJGvrUEXQdBtsPL53qvrsbHefjYvNcJoE3nQzFj8awgC11tsjO57OzB/PDTNis82jSJRmON4TMOcXNCXaZbTQShMMMJJw5M8utT+e+KJmJEGvBF/ya/0rJz04Gf05hIevq49C4dHuwgOkEnTr94+pXG3UYxXsprQH4PrEDQITEz1mGvKoGVNP9YLCGI4/hwuxw899qHiQCRcCRK6a5Ag6phYWn4DkyOISnAIXFtFjlqkpcsEW1q+MgDI3tXlIOOV1o+A3im0uRQbuGeKtE8Xt6ASkEoG/BhpeH6MPEyGS95+GqJAtpTeIiNm9kssk3ye3ftfT3wb5SX8PIZJrOZwL3cxFCUTvh5FqB/Xv8ruZNcHDyBn6K9SgAJuW6HhyngcDj3SN5rZQO+ZtYRpZc4yNDqzy5OQj6KpS9QOd4PDCbhY2MVNjwNHyOqEMQBeNmAcjF+PsdysZ6FFR3cfJDKSyu2rTDwsxYvxUC7Nultvp7749z/e+ubt7hv6H3xYNO3T+t2WtclY5fcszeVwKpmScULDQc7Nm+o17NL4IAaiUoxRHfLHQ6KZ2mQTlShVy3WY827bFRFvsWGR9Rw3xZ8dMXP53h5Dx8BlEnNrvr7+R5hjv0NrVCuL7qtqMexHY+VNFcaqvoR+UTxcf7EoRPz97YVUAnh5TsqZ25Z6wG1Y3ARdPsSvozC+Fq8iy8ma/k1EolB3wSq04hRS9yfNOVChDKKfD7GT64d5CE1yOamLBjQm3y+sAniIfJR8vnD+Nnjh8pd0gc/zqlfTxXqSH5tdgIQh5NYknPHNGO07nCQlRHkMFizcUul+7+EEQrLgWMEMudXDuOOY62Iiiz002tBRq5URnQ8O2JHLZ/q+XRPRaKfnfg5iXyOAYIog2v4rqvx8h7eSvpG48BHCD8D8NolboQr8PM0afyH/yP7uSXP6cjDR6qIPLbPCKDs581ktM2rpIkbTjfZGWm4nE4Wrfo+ce30aPQ0gdelIk1suLPCfKvNDGxXTfGciaHKwBruj5kwt5bmfmoSVuAlHcGNn1uQJI+cl1S8BPDzND5Ow5fIB2gKOAkvgo8X8LIVH4KXdVf2uVLI54p94QhKhP6nt26PiGHrAla9gFgsyvUXDSMQDNOv18EJVt5F9US1F2xs5LqB3+7GE5ii06tk95aSJkJ2LSKiqkNnrcIcAy48sWZTsKGzshyYZn/gNXjJJp8XUVrjs4paNDn4OBl4CC9ulP72uW54KUCYXdejzWYFHNyhPSJimYGGEzSGQ6Ns27KJtq1y2BUKgcbo0eVAAqEwrbMyMIp3uqtYbS7g8M/BcVwVbV8FEUUx6KIx+gIfJC5mcCbQVuIpRy5q3WHTgMIoXNKPKra0lwwUL5L0XqsYXVHco4iSDfyIn8cT8t0K8boLL0OB2cBDwN0Im5uV1fqI70S1KencbncdbzYC2Fq0w1oRVAVPBlq+nSlzP+LIzq1p1+aYRKZQLFEfUCv7kSvs80tdcC8VSRyIEFOTXRikq5WVcYr5Jh8aF6Dm2xgoN2Hlo/5HlFOD82kLdsx9FehnvW5HFXOvLVao9yuAQRTFQRQoRVmAUGqXoC0CnHgZh9IJpTtesvDxNF6eQ/Hhr+Id9HIYVuyBAEvwsU/jCZptLSAQClcIanEQDEdZvbmYEjMlYRq63W6m/OdzAqEwRTvLksmgIMlec8bssiwJ2Mk6YGVivV8ZKS477l7JQ+hjhyGEENAwTir0it33WSgGvkH4FlhVMr4kHViG8D1CayAHP53x0wc/vfHRFZgBPAisw0suEKiG/HwUK5l0FfD1HiE/n3FNgahm4QDJAaEgEA3iSXFxxx9GgghqmoghqEKq221XXDLi4rnIztm7LE4ADhgO/DfR4qWY5vREHJGqcChwhU5nKvCICh5bh1ibrAQohBywsR7sNEZS8GeWL+sTVT1fRKYnIWAW8Cx+W977GW4j/jzgRdTOcfAyFzgN2IKvCU1AaRrcNRcHGNOtY57l7bM9gPEUIVEzyTsIwXAET4qb1tnpcc3RNGGjWCHcaiPy5K9qswbssvCi/E2Fb9XgAtFEINKcKq7gsEKjQpAqId9C+NkIHrxMJZ8rbcLZBrwOvIcQxcst+DgDHw58VTyNzQVeO9MI4E+cz1+rW0PNzgFEhB8LiiqigtQEhxuJhSElA8JWZdBIOMzFw04gEAqT17YV5s/FCEwOw/1uuFEgw9L36Bi1qm58DqBvISqsUOhvl4lVxMrSTSDf0hVMtf6PU44a0wAADOxJREFUn3I2qcD18YqtJ1js3Y/gs7dq86JNMuO9OFBS8e+GcL38AZiAz/ae3sIgfVD/DVwo98veNwMPaJNTMdMjAUhrXaurWFUZecoATNMkBl96rLy7Fyo8v2Q54KoEgQ1HxeRf8ZTqeLl4iXMEQTD5UiN8KyDFy+gOuAVGD6SGlbOmYcmLbUSk2cUeXE3UsgehG16OrOJFrIrVc/FxAF4EL7dKpqwTkUzJl6v3jR+g0lqAQLicJKldjWNErcgh0wFb+kFU4Lvk5VyF3E+pZEerUPtSrQg7RXAA6wrnkgrc1h9ea0YzrJ9tBu6yZ36sidotx8cylP/aJibkEyJ5BTSfyfiIb2t/JcpoRXfh5SGEW+pyPze7J9CMRSzEh8vt11X+lnhmcHFJGbtgmwkLbYTPxpbX9hMnpVvr2xb2f2IpymqtzUOovI6DHRRzZHgbT/SHvze7/PUlqZy+Jk528NMOr+3UEYL4WJbk2ppuE8Ig4EH8dMfaMfRW/Gys61uanQBKCjYj8WqhalZUDgXEcLD42/VEojEem/IuLpcz8aUGbLft7PipzCgk0seN64iqEJUaOI/d/Eo5n1K5nED/2v3/vzaovnI5nmKdoGWMYxTwHj5a4eVRfLyOb/fBLM1OAK7UNKLhoB2IZev0CfvOwdpNW4nFYjgEypTCATbCTYvdB5NYhgGc+kVyAoda8Xw1sIAdmKxkfwMf99j6Raatb/TAYCxw76Aeg/6CnzTyeRz4x742AxOQ2ToPrSNGPVEvwDA40TTzAeZDZwP+A/TQCnkPMESS6wka/KhKTLWyG1FMJhvDKWV/BCUdtXZCE6QNPl57/MvHp8/fNH+aPaAd8FV4TfeZK7hCyzdxuOrOVkn1uGmdlU7fguDOhTBArLp58Uze5AQfF3AmtoUg5bxDGisQjrb3CUSEsLIXAjL2FfjZBTyLl+s0omNV9XC5XT5iIifjJYqvYTjdK9vGWYtCUWKRcC1EAqaVMpYr8K5ABxvzPyu8lMQFDIE+iXZ/S7kq/1TTrk5v7Rs03TiXH9jfQXno5d++/FdLg+YW8nkJu0DnL44A4gpf8eYNSKisxpKx9se8FN/JS+FHE07TuPPHeqrs2zwrGijJ3HsT4d9qEkL5gihj+F8AofCSIy+ZLSJiHGCkImTga7jes3cIQBwI0LZL90T5uNQUN0n1+uJOI6ddSvI7gcEDYEnMEgfrDNh16ZVMuOyaymvqci7l4uCPAscS5UQZYVXr+kWCFw/5XNpErT2Bl3mQKA/bqHLre4cAnCnWHLZdww7D4PE33sPpMDBVCYYjyRtHLVc49RirkDMu+DkTplx/Mb5VnVmFn8+q0ddZlMl5LDdGNCiGf19o8UHgVbw82ARtTQBOAejVvtdCfAxvHAHk4yOfmXjrXTO/8X7BlIxEQfUtQ4sItg9y5KGdMU0zTsWLIzDk2KSghmPAPOxe5n9+KFvxVY///xUqcTEaUBl9N0QQA/j6uq+vNk1zTuMkSYU78SWEQpQZ+PlwT74rNTVVO7RvzUWnHR93BliewMxcKN2G4XDwwLzpDOvQhz7du7Jm4xZ6z/n46xNUj64WljWeS1Bi3NOMbtx9AfHFoyYA0zQLDcNot2ciwM+l+LgZYSNeFC+X4G1qEWFxggm5r+PY6CAtxY0gvDx7Hk+53RdUQ76X36HsqIz8+Zn7iTkn5DeByPJiNhb5NesAPtbZixkLgbHkN5VHTatSLa/O+RhPiguny8VmkUiVGTKSGC7uSQ5qXDQK3K79hgsIfcnn/AZwjYer/P4C355NUqfdkA+pISJWWY6fI8hnIjALP5820htklYhRZYO7gKtWnMorfMp5pwwkGI4kfAVJbP8iYDJBKuLJ+eIWYCZEOmCtE/z6wccK8rmMpP0V6pjpU/BxUdLvl/FZNY/2nAD8NdfUxcsg8ilE6IFyCV5W4KvfDluVIFwOqZmwcyuSYmA4LKI9uEP76hWtLLb/AlBi+Ym/NICnQB8FvRKMf+5nFv3h9UD+DnxJSnp+EwWb7NYM9PEpftqhBBC6AB3twMbdTPgqhWAMB5QUgOEg3eXh6TffQ0Qo2F6FlsZzMcrLdrybsOVQB+gLIK+CXAuOt2BA4X6Ffj9nkV9rsgp4ObkS8r1kIPRtqtcb9fzIAPA8ynm28vJinaJNhEAwnCAGQwwrLkuVVzM/AXFgqtIxtyLML3RuaBjCYwl1IepciCttEX89+Wt6z/kdyELo+2UT59b9UnSBTnWoTq/ZiBe8DEK5CB9L9i4BWNxgJX7uxctHwH/JR/FyYhJbOiX+ZyQa5dQB1qbQhsNBSeFPliQIlFVgT8HjdlG0s8yOCMZEWWR/1TpWn5rJc08fyf0fLGHFsC/gmOftJw8mn6f2G+RbBH2pHcxRVel7Fz/xfX4PQTkFfxPkFO6RJ9DHEPy8gHAqMA8vx9lX1sRr0LicTuZ9ZW1yoKaJM8WDqsmM7C+4qei8Srs0/LClEIfDIGVGynsIp+HmFe5eOJVpvkugJAbGRXDsU/ZglaL0wZ8U+frrVwQVH0uRiiLUSVCSxAmm4cff1K937sGH/9f2JBaTz834eZ58lgNHqipOO9RLVUnNbGU5AtOzeOfdJXhS3PHVPwxDCF4TRLbLQGLi5a4VCrumoOEfIethkDH2bFhUbdOFX+aMdgC/QdmF8AJWfkFOPcLCT8FLb3yVts9bYre5EpLkfjwFLZ9DgG74G7913p7HA/hpRT7r8PIwPrLx8qg8IDbRWmG7ajggFkVRHA4rUbRjbmvmZixma7diPE95UId+ESyb1xVCr8Gx38PCiRC8CU6M4OXf+DjmVzKjY8B7NpK6JbHzOVh7FK/Cz4QanvwUrVjqTngKrXE9osq9t5DPQIQVifI0+4wALCLoRj4R8jkaMEzsDaPsAD1JyYRdxYm9/qKeGMHLggzddjzlgRCPx94lFnr8jyAvQb/vYeEEcE7Ce2w7YAE+OjdgBrpQ2iEU1icmrllZe+UxOrMScoUsfElRSz6ieHkT7L4KP9Rg++cA3yRi/5tEBHiTskkra58K5FCRVJFVp+3px0U+EZQRsQGxQ9Z/UnCa3RErGFSE7Fg6ZZlBUtJcXLJtCAK0ykq3zcZYAI5dAgvvwBF7lbuOPQblM6TyTty78ZTFgHeAMfALthYsS6ojXlYB1wMz8KGChBQFL2vw0ZX8JP+Ml09QzsHfdMiPc4D7azFNFDgQiODjbnuAb0bwxNGKcritqMzBzyybCFbHesZSnfMrPLYhwrgEWpmZzB+0mq7rc3FJ5eVrd9qNzwWdb9/K1cMGk7F9O7ABfz02dsznLWA7wiZ8jVsT30dE8CPQCS9DUd4ARuoOvfH292/X+96574JEZpFVfHKUbYI3eXSz7IadrrQR3BqlE0IaVkxeCJ+dj5/PowijgFyUE4AhrlmuAZGzI+fesXkkgrI6awcHl+XwwAFvcvyMXmwpLOZ3ZwyC9Na4gsXc88xbRA+68TPOes4gs+hKrMIQB9jf9yjCw/iS4vy8ZAPHAq/gox2/ZogrdF6+xcdhtnjItJXHTsBIfM2X0+DcjRw7ogbNcztwpR2eHEM5AR834KUz8APCBZEhkb84J7pY/4dtFLp2MiDSn+ScTDNeNNL2GEZvimA8mPeymVW0EFiDErMVIAOftRN3Jflp+c4v+NUjP1lX8HEYXhaggM8eLC/rsfYoajYCkEZSbW+U9ggG8B5KCTADP5fhZYkUSh5l5LXrlMXBgVx+Ez0JgqXMT/+G0vcCDO53OKkeD2ZaNs+lvc62B0rR0bHbtJ1+AzjxMy1pZjyFtd9uJjAK+BTffpPoUZNIU1tHUGAw/hr9A/vYD1DZVhW8HIdyDfkoyunaVt+lLRRHykihE0TDoCZhiWCq0io7g03fLufLo8ro9+khvNd9GeHW0ZsQXsbHX2wl9HK7ysZMhEvw8R/2d7C8gr9JKIp7xQvd9J24C2UGWLlrKeoiKjFu2zycmGny3oIVnH1aX/xZr3PnllGoKve2mUrqI6ndAuMCG7Ayf0pQyvGTQQs0KzRHUOgw/CyPk9ag8p5cuv0UAhKh+KfvibYx+XDV19y5ZRTRcIiH8mbieMZJcHRwNMpbKCUoHVqQ/2slAB+D8CKe+z0XuF9wU2IGOCCYzbK0DSw8ooRdrYJsWlWEAu+3W4G37CLMo00Q0hA+x4/gb+aKWi3QrBwAfKiIFOKEHms74ED4MHsF3QMHkvdjNtt3lmkwFObbnVujTy59d6drvnOjpmm0Vp9EC/zKCMAGx2ZHzAyHYmXbC2JXLTgilrOmNHZc58xYaSDMP16cPsN4zXHk+sHbMsO7wl1wM67Jc+pboJmsgPrBAlXNKy8uIJN0XA7LMxiOmfGNnQpLS8tIeO/2cb28FmiBFmiBFmiBFmiBFmiBFmiBFmiB/wH4f+jryq6sRdUDAAAAAElFTkSuQmCC" alt="DREME Logo"/>
+        <h1>DREME</h1>
+        <h2>Discriminative Regular Expression Motif Elicitation</h2>
+      </div>
+      <p class="spaced">
+        For further information on how to interpret these results or to get a 
+        copy of the MEME software please access 
+        <a href="http://meme.nbcr.net/">http://meme.nbcr.net</a>. 
+      </p>
+      <p>
+        If you use DREME in your research please cite the following paper:<br />
+        <span class="citation">
+          Timothy L. Bailey, "DREME: Motif discovery in transcription factor ChIP-seq data", <i>Bioinformatics</i>, <b>27</b>(12):1653-1659, 2011.
+          <a href="http://bioinformatics.oxfordjournals.org/content/27/12/1653">[full text]</a>
+        </span>
+      </p>
+    </div>
+    <!-- navigation -->
+    <div class="pad2">
+      <a class="jump" href="#motifs_sec">Discovered Motifs</a>
+      &nbsp;&nbsp;|&nbsp;&nbsp;
+      <a class="jump" href="#inputs_sec">Inputs &amp; Settings</a>
+      &nbsp;&nbsp;|&nbsp;&nbsp;
+      <a class="jump" href="#info_sec">Program information</a>
+    </div>
+    <!-- alert the user when their browser is not up to the task -->
+    <noscript><h1 style="color:red">Javascript is required to view these results!</h1></noscript>
+    <h1 id="html5_warning" style="color:red; display:none;">Your browser does not support canvas!</h1>
+    <script>
+      if (!window.HTMLCanvasElement) $("html5_warning").style.display = "block";
+    </script>
+    <!-- description -->
+    <div id="description_section" style="display:none">
+      <div id="description" class="header">
+        <h2>Description</h2>
+      </div>
+      <div id="description_text" class="box">
+      </div>
+    </div>
+    <script>
+      if (data.description) {
+        $("description_text").innerHTML = "";
+        $("description_text").appendChild(make_description(data.description));
+        $("description_section").style.display = "block";
+      }
+    </script>
+    <!-- motifs -->
+    <div id="motifs_sec" class="header">
+      <h2>Discovered Motifs</h2>
+      <span><a href="#inputs_sec">Next</a>&nbsp;<a href="#">Top</a></span>
+    </div>
+    <div id="motifs" class="box">
+      <p>No motifs were discovered!</p>
+    </div>
+    <script>make_motifs();</script>
+    <!-- inputs and settings -->
+    <div id="inputs_sec" class="header">
+      <h2>Inputs &amp; Settings</h2>
+      <span><a href="#motifs_sec">Previous</a>&nbsp;<a href="#info_sec">Next</a>&nbsp;<a href="#">Top</a></span>
+    </div>
+    <div class="box">
+      <h4>Sequences</h4>
+      <table id="seq_info" class="inputs">
+        <tr><th>Source <div class="help" data-topic="pop_seq_source"></div></th>
+          <th>Alphabet <div class="help" data-topic="pop_seq_alph"></div></th>
+          <th>Sequence Count <div class="help" data-topic="pop_seq_count"></div></th>
+        </tr>
+        <tr>
+          <td id="ins_seq_source"></td>
+          <td id="ins_seq_alphabet"></td>
+          <td id="ins_seq_count"></td>
+        </tr>
+      </table>
+      <script>
+      {
+        var db = data.sequence_db;
+        $("ins_seq_source").innerHTML = db.file;
+        $("ins_seq_alphabet").innerHTML = dreme_alphabet.get_alphabet_name();
+        $("ins_seq_count").innerHTML = db.count;
+      }
+      </script>
+      <h4>Control Sequences</h4>
+      <table id="seq_info" class="inputs">
+        <tr><th>Source <div class="help" data-topic="pop_seq_source"></div></th>
+          <th>Sequence Count <div class="help" data-topic="pop_seq_count"></div></th>
+        </tr>
+        <tr>
+          <td id="ins_cseq_source"></td>
+          <td id="ins_cseq_count"></td>
+        </tr>
+      </table>
+      <script>
+      {
+        var db = data.control_db;
+        if (db.from == "shuffled") {
+          $("ins_cseq_source").innerHTML = "Shuffled Sequences";
+        } else {
+          $("ins_cseq_source").innerHTML = db.file;
+        }
+        $("ins_cseq_count").innerHTML = db.count;
+      }
+      </script>
+      <h4>Background</h4>
+      <span id="alpha_bg"></span>
+      <script>
+      {
+        $("alpha_bg").appendChild(make_alpha_bg(dreme_alphabet, data.control_db.freqs));
+      }
+      </script>
+      <h4>Other Settings</h4>
+      <table id="tbl_settings" class="inputs hide_advanced">
+        <tr>
+          <th>Strand Handling</th>
+          <td id="opt_strand">
+            <span class="strand_none">This alphabet only has one strand</span>
+            <span class="strand_given">Only the given strand is processed</span>
+            <span class="strand_both">Both the given and reverse complement strands are processed</span>
+          </td>
+        </tr>
+        <tr><th># REs to Generalize</th><td id="opt_ngen"></td></tr>
+        <tr><th>Shuffle Seed</th><td id="opt_seed"></td></tr>
+        <tr><th>E-value Threshold</th><td id="opt_stop_evalue"></td></tr>
+        <tr><th>Max Motif Count</th><td id="opt_stop_count"></td></tr>
+        <tr><th>Max Run Time</th><td id="opt_stop_time"></td></tr>
+      </table>
+      <script>
+      {
+        $("opt_strand").className = (dreme_alphabet.has_complement() ? (data.options.revcomp ? "both" : "given") : "none");
+        $("opt_ngen").innerHTML = data.options.ngen;
+        $("opt_seed").innerHTML = data.options.seed;
+        $("opt_stop_evalue").innerHTML = data.options.stop.evalue;
+        $("opt_stop_count").innerHTML = (typeof data.options.stop.count == "number" ? data.options.stop.count : "No maximum motif count.");
+        $("opt_stop_time").innerHTML = (typeof data.options.stop.time == "number" ? data.options.stop.time + " seconds." : "No maximum running time.");
+      }
+      </script>
+    </div>
+    <!-- list information on this program -->
+    <div id="info_sec" class="bar" style="position:relative">
+      <div style="position: absolute; right: 0;"><a href="#inputs_sec">Previous</a> <a href="#">Top</a></div>
+      <div class="subsection">
+        <h5 id="version">DREME version</h5>
+        <span id="ins_version"></span> 
+        (Release date: <span id="ins_release"></span>)<br>
+      </div>
+      <script>
+        $("ins_version").innerHTML = data["version"];
+        $("ins_release").innerHTML = data["release"];
+      </script>
+      <div class="subsection">
+        <h5 id="reference">Reference</h5>
+        <span class="citation">
+          Timothy L. Bailey, "DREME: Motif discovery in transcription factor ChIP-seq data", <i>Bioinformatics</i>, <b>27</b>(12):1653-1659, 2011.
+          <a href="http://bioinformatics.oxfordjournals.org/content/27/12/1653">[full text]</a>
+        </span>
+      </div>
+      <div class="subsection">
+        <h5 id="command">Command line</h5>
+        <textarea id="cmd" rows="3" style="width:100%;" readonly="readonly">
+        </textarea>
+        <script>$("cmd").value = data["cmd"].join(" ");</script>
+      </div>
+    </div>
+    
+  </body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/dreme1.txt	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,102 @@
+# DREME 4.12.0
+#     command: dreme -oc dreme_out -rna -norc -p dreme_test_sites.fa -e 0.05 -mink 3 -maxk 8
+#   positives: 1000 from dreme_test_sites.fa (Thu Apr 19 19:09:45 CEST 2018)
+#   negatives: 1000 from shuffled positives
+#        host: ThinkPad-T450s
+#        when: Thu Apr 19 19:11:17 CEST 2018
+
+MEME version 4.12.0
+
+ALPHABET "RNA" RNA-LIKE
+A "Adenine" CC0000
+C "Cytosine" 0000CC
+G "Guanine" FFB300
+U "Uracil" 008000
+N "Any base" = ACGU
+X = ACGU
+. = ACGU
+V "Not U" = ACG
+H "Not G" = ACU
+D "Not C" = AGU
+B "Not A" = CGU
+M "Amino" = AC
+R "Purine" = AG
+W "Weak" = AU
+S "Strong" = CG
+Y "Pyrimidine" = CU
+K "Keto" = GU
+T = U
+END ALPHABET
+
+Background letter frequencies (from dataset):
+A 0.221 C 0.245 G 0.221 U 0.312
+
+
+MOTIF UUYUCY DREME-1
+
+#             Word        Pos        Neg    P-value    E-value
+# BEST      UUYUCY        387        210   2.6e-018   1.2e-013
+#           UUUUCC        147         75   1.8e-007   8.1e-003
+#           UUUUCU        155         94   2.2e-005   1.0e+000
+#           UUCUCU         94         51   1.3e-004   6.1e+000
+#           UUCUCC         75         42   1.1e-003   5.0e+001
+
+letter-probability matrix: alength= 4 w= 6 nsites= 459 E= 1.2e-013
+0.000000 0.000000 0.000000 1.000000
+0.000000 0.000000 0.000000 1.000000
+0.000000 0.294118 0.000000 0.705882
+0.000000 0.000000 0.000000 1.000000
+0.000000 1.000000 0.000000 0.000000
+0.000000 0.474946 0.000000 0.525054
+
+
+MOTIF YAGG DREME-2
+
+#             Word        Pos        Neg    P-value    E-value
+# BEST        YAGG        600        416   1.1e-016   5.1e-012
+#             CAGG        441        304   1.5e-010   6.6e-006
+#             UAGG        232        165   1.1e-004   4.7e+000
+
+letter-probability matrix: alength= 4 w= 4 nsites= 793 E= 5.1e-012
+0.000000 0.692308 0.000000 0.307692
+1.000000 0.000000 0.000000 0.000000
+0.000000 0.000000 1.000000 0.000000
+0.000000 0.000000 1.000000 0.000000
+
+
+MOTIF GAAGAW DREME-3
+
+#             Word        Pos        Neg    P-value    E-value
+# BEST      GAAGAW         81         22   8.2e-010   3.4e-005
+#           GAAGAU         45          7   2.4e-008   9.9e-004
+#           GAAGAA         40         16   7.9e-004   3.3e+001
+
+letter-probability matrix: alength= 4 w= 6 nsites= 89 E= 3.4e-005
+0.000000 0.000000 1.000000 0.000000
+1.000000 0.000000 0.000000 0.000000
+1.000000 0.000000 0.000000 0.000000
+0.000000 0.000000 1.000000 0.000000
+1.000000 0.000000 0.000000 0.000000
+0.494382 0.000000 0.000000 0.505618
+
+
+MOTIF SMUGGA DREME-4
+
+#             Word        Pos        Neg    P-value    E-value
+# BEST      SMUGGA        110         47   9.1e-008   3.7e-003
+#           GAUGGA         22          6   1.7e-003   7.1e+001
+#           GCUGGA         33         14   3.6e-003   1.5e+002
+#           CCUGGA         32         15   8.6e-003   3.5e+002
+#           CAUGGA         29         13   9.1e-003   3.7e+002
+
+letter-probability matrix: alength= 4 w= 6 nsites= 119 E= 3.7e-003
+0.000000 0.529412 0.470588 0.000000
+0.428571 0.571429 0.000000 0.000000
+0.000000 0.000000 0.000000 1.000000
+0.000000 0.000000 1.000000 0.000000
+0.000000 0.000000 1.000000 0.000000
+1.000000 0.000000 0.000000 0.000000
+
+
+# Stopping reason: E-value threshold exceeded
+#    Running time: 13.45 seconds
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/dreme1.xml	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,32 @@
+<dreme version="4.12.0" release="Tue Jun 27 16:22:50 2017 -0700">
+  <model>
+    <command_line>dreme -oc dreme_out -rna -norc -p dreme_test_sites.fa -e 0</command_line>
+    <positives name="dreme test sites" count="1000" file="dreme_test_sites.fa" last_mod_date="Thu Apr 19 19:09:45 CEST 2018" />
+    <negatives name="shuffled positive sequences" count="1000" from="shuffled"/>
+    <alphabet name="RNA" like="rna">
+      <letter id="A" symbol="A" name="Adenine" colour="CC0000"/>
+      <letter id="C" symbol="C" name="Cytosine" colour="0000CC"/>
+      <letter id="G" symbol="G" name="Guanine" colour="FFB300"/>
+      <letter id="U" symbol="U" aliases="T" name="Uracil" colour="008000"/>
+      <letter id="N" symbol="N" aliases="X." equals="ACGU" name="Any base"/>
+      <letter id="V" symbol="V" equals="ACG" name="Not U"/>
+      <letter id="H" symbol="H" equals="ACU" name="Not G"/>
+      <letter id="D" symbol="D" equals="AGU" name="Not C"/>
+      <letter id="B" symbol="B" equals="CGU" name="Not A"/>
+      <letter id="M" symbol="M" equals="AC" name="Amino"/>
+      <letter id="R" symbol="R" equals="AG" name="Purine"/>
+      <letter id="W" symbol="W" equals="AU" name="Weak"/>
+      <letter id="S" symbol="S" equals="CG" name="Strong"/>
+      <letter id="Y" symbol="Y" equals="CU" name="Pyrimidine"/>
+      <letter id="K" symbol="K" equals="GU" name="Keto"/>
+    </alphabet>
+    <strands>none</strands>
+    <background A="0.221" C="0.245" G="0.221" U="0.312" from="dataset"/>
+    <stop evalue="0"/>
+    <ngen>100</ngen>
+    <add_pv_thresh>0.01</add_pv_thresh>
+    <seed>1</seed>
+    <host>ThinkPad-T450s</host>
+    <when>Thu Apr 19 19:40:08 CEST 2018</when>
+  </model>
+  <motifs>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/dreme2.html	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,6118 @@
+<!DOCTYPE HTML>
+<html>
+  <head>
+    <meta charset="UTF-8">
+    <title>DREME</title>
+    <script>
+      // @JSON_VAR data
+      var data = {
+        "program": "dreme",
+        "version": "4.12.0",
+        "release": "Tue Jun 27 16:22:50 2017 -0700",
+        "cmd": [
+          "dreme", "-oc", "dreme_out_adv", "-rna", "-norc", "-p",
+          "dreme_test_sites.fa", "-e", "0.00001", "-mink", "4", "-maxk", "10"
+        ],
+        "options": {
+          "revcomp": false,
+          "ngen": 100,
+          "add_pv_thresh": 0.01,
+          "seed": 1,
+          "stop": {
+            "evalue": "1e-05"
+          }
+        },
+        "alphabet": {
+          "name": "RNA",
+          "like": "rna",
+          "ncore": 4,
+          "symbols": [
+            {
+              "symbol": "A",
+              "name": "Adenine",
+              "colour": "CC0000"
+            }, {
+              "symbol": "C",
+              "name": "Cytosine",
+              "colour": "0000CC"
+            }, {
+              "symbol": "G",
+              "name": "Guanine",
+              "colour": "FFB300"
+            }, {
+              "symbol": "U",
+              "aliases": "T",
+              "name": "Uracil",
+              "colour": "008000"
+            }, {
+              "symbol": "N",
+              "aliases": "X.",
+              "name": "Any base",
+              "equals": "ACGU"
+            }, {
+              "symbol": "V",
+              "name": "Not U",
+              "equals": "ACG"
+            }, {
+              "symbol": "H",
+              "name": "Not G",
+              "equals": "ACU"
+            }, {
+              "symbol": "D",
+              "name": "Not C",
+              "equals": "AGU"
+            }, {
+              "symbol": "B",
+              "name": "Not A",
+              "equals": "CGU"
+            }, {
+              "symbol": "M",
+              "name": "Amino",
+              "equals": "AC"
+            }, {
+              "symbol": "R",
+              "name": "Purine",
+              "equals": "AG"
+            }, {
+              "symbol": "W",
+              "name": "Weak",
+              "equals": "AU"
+            }, {
+              "symbol": "S",
+              "name": "Strong",
+              "equals": "CG"
+            }, {
+              "symbol": "Y",
+              "name": "Pyrimidine",
+              "equals": "CU"
+            }, {
+              "symbol": "K",
+              "name": "Keto",
+              "equals": "GU"
+            }
+          ]
+        },
+        "background": {
+          "freqs": [0.221, 0.245, 0.221, 0.312]
+        },
+        "sequence_db": {
+          "name": "dreme test sites",
+          "file": "dreme_test_sites.fa",
+          "lmod": "Thu Apr 19 19:09:45 CEST 2018",
+          "count": 1000
+        },
+        "control_db": {
+          "name": "shuffled positive sequences",
+          "from": "shuffled",
+          "count": 1000,
+          "freqs": [0.221, 0.245, 0.221, 0.312]
+        },
+        "motifs": [
+          {
+            "db": 0,
+            "id": "UUYUCY",
+            "alt": "DREME-1",
+            "len": 6,
+            "nsites": 459,
+            "evalue": "3.3e-013",
+            "p": 387,
+            "n": 210,
+            "pvalue": "2.6e-018",
+            "unerased_evalue": "3.3e-013",
+            "pwm": [
+              [0.000000, 0.000000, 0.000000, 1.000000], 
+              [0.000000, 0.000000, 0.000000, 1.000000], 
+              [0.000000, 0.294118, 0.000000, 0.705882], 
+              [0.000000, 0.000000, 0.000000, 1.000000], 
+              [0.000000, 1.000000, 0.000000, 0.000000], 
+              [0.000000, 0.474946, 0.000000, 0.525054]
+            ],
+            "matches": [
+              {
+                "seq": "UUUUCC",
+                "p": 147,
+                "n": 75,
+                "pvalue": "1.8e-007",
+                "evalue": "2.2e-002"
+              }, {
+                "seq": "UUUUCU",
+                "p": 155,
+                "n": 94,
+                "pvalue": "2.2e-005",
+                "evalue": "2.8e+000"
+              }, {
+                "seq": "UUCUCU",
+                "p": 94,
+                "n": 51,
+                "pvalue": "1.3e-004",
+                "evalue": "1.7e+001"
+              }, {
+                "seq": "UUCUCC",
+                "p": 75,
+                "n": 42,
+                "pvalue": "1.1e-003",
+                "evalue": "1.4e+002"
+              }
+            ]
+          }, {
+            "db": 0,
+            "id": "YAGG",
+            "alt": "DREME-2",
+            "len": 4,
+            "nsites": 793,
+            "evalue": "1.4e-011",
+            "p": 600,
+            "n": 416,
+            "pvalue": "1.1e-016",
+            "unerased_evalue": "6.3e-012",
+            "pwm": [
+              [0.000000, 0.692308, 0.000000, 0.307692], 
+              [1.000000, 0.000000, 0.000000, 0.000000], 
+              [0.000000, 0.000000, 1.000000, 0.000000], 
+              [0.000000, 0.000000, 1.000000, 0.000000]
+            ],
+            "matches": [
+              {
+                "seq": "CAGG",
+                "p": 441,
+                "n": 304,
+                "pvalue": "1.5e-010",
+                "evalue": "1.8e-005"
+              }, {
+                "seq": "UAGG",
+                "p": 232,
+                "n": 165,
+                "pvalue": "1.1e-004",
+                "evalue": "1.3e+001"
+              }
+            ]
+          }
+        ],
+        "runtime": {
+          "host": "ThinkPad-T450s",
+          "when": "Tue Apr 24 18:44:36 CEST 2018",
+          "cpu": 18.17,
+          "real": 18.17,
+          "stop": "evalue"
+        }
+      };
+    </script>
+    <script>
+var site_url = "http://meme-suite.org";
+</script>
+    <script>
+
+/*
+ * $
+ *
+ * Shorthand function for getElementById
+ */
+function $(el) {
+  return document.getElementById(el);
+}
+
+
+/*
+ * See http://stackoverflow.com/a/5450113/66387
+ * Does string multiplication like the perl x operator.
+ */
+function string_mult(pattern, count) {
+    if (count < 1) return '';
+    var result = '';
+    while (count > 1) {
+        if (count & 1) result += pattern;
+        count >>= 1, pattern += pattern;
+    }
+    return result + pattern;
+}
+
+/*
+ * See http://stackoverflow.com/questions/814613/how-to-read-get-data-from-a-url-using-javascript
+ * Slightly modified with information from
+ * https://developer.mozilla.org/en/DOM/window.location
+ */
+function parse_params() {
+  "use strict";
+  var search, queryStart, queryEnd, query, params, nvPairs, i, nv, n, v;
+  search = window.location.search;
+  queryStart = search.indexOf("?") + 1;
+  queryEnd   = search.indexOf("#") + 1 || search.length + 1;
+  query      = search.slice(queryStart, queryEnd - 1);
+
+  if (query === search || query === "") return {};
+
+  params  = {};
+  nvPairs = query.replace(/\+/g, " ").split("&");
+
+  for (i = 0; i < nvPairs.length; i++) {
+    nv = nvPairs[i].split("=");
+    n  = decodeURIComponent(nv[0]);
+    v  = decodeURIComponent(nv[1]);
+    // allow a name to be used multiple times
+    // storing each value in the array
+    if (!(n in params)) {
+      params[n] = [];
+    }
+    params[n].push(nv.length === 2 ? v : null);
+  }
+  return params;
+}
+
+/*
+ * coords
+ *
+ * Calculates the x and y offset of an element.
+ * From http://www.quirksmode.org/js/findpos.html
+ * with alterations to take into account scrolling regions
+ */
+function coords(elem) {
+  var myX = myY = 0;
+  if (elem.getBoundingClientRect) {
+    var rect;
+    rect = elem.getBoundingClientRect();
+    myX = rect.left + ((typeof window.pageXOffset !== "undefined") ?
+        window.pageXOffset : document.body.scrollLeft);
+    myY = rect.top + ((typeof window.pageYOffset !== "undefined") ?
+        window.pageYOffset : document.body.scrollTop);
+  } else {
+    // this fall back doesn't properly handle absolutely positioned elements
+    // inside a scrollable box
+    var node;
+    if (elem.offsetParent) {
+      // subtract all scrolling
+      node = elem;
+      do {
+        myX -= node.scrollLeft ? node.scrollLeft : 0;
+        myY -= node.scrollTop ? node.scrollTop : 0;
+      } while (node = node.parentNode);
+      // this will include the page scrolling (which is unwanted) so add it back on
+      myX += (typeof window.pageXOffset !== "undefined") ? window.pageXOffset : document.body.scrollLeft;
+      myY += (typeof window.pageYOffset !== "undefined") ? window.pageYOffset : document.body.scrollTop;
+      // sum up offsets
+      node = elem;
+      do {
+        myX += node.offsetLeft;
+        myY += node.offsetTop;
+      } while (node = node.offsetParent);
+    }
+  }
+  return [myX, myY];
+}
+
+/*
+ * position_popup
+ *
+ * Positions a popup relative to an anchor element.
+ *
+ * The avaliable positions are:
+ * 0 - Centered below the anchor.
+ */
+function position_popup(anchor, popup, position) {
+  "use strict";
+  var a_x, a_y, a_w, a_h, p_x, p_y, p_w, p_h;
+  var a_xy, spacer, margin, scrollbar, page_w;
+  // define constants
+  spacer = 5;
+  margin = 15;
+  scrollbar = 15;
+  // define the positions and widths
+  a_xy = coords(anchor);
+  a_x = a_xy[0];
+  a_y = a_xy[1];
+  a_w = anchor.offsetWidth;
+  a_h = anchor.offsetHeight;
+  p_w = popup.offsetWidth;
+  p_h = popup.offsetHeight;
+  page_w = null;
+  if (window.innerWidth) {
+    page_w = window.innerWidth;
+  } else if (document.body) {
+    page_w = document.body.clientWidth;
+  }
+  // check the position type is defined
+  if (typeof position !== "number") {
+    position = 0;
+  }
+  // calculate the popup position
+  switch (position) {
+    case 1:
+      p_x = a_x + a_w + spacer;
+      p_y = a_y + (a_h / 2) - (p_h / 2);
+      break;
+    case 0:
+    default:
+      p_x = a_x + (a_w / 2) - (p_w / 2);
+      p_y = a_y + a_h + spacer;
+      break;
+  }
+  // constrain the popup position
+  if (p_x < margin) {
+    p_x = margin;
+  } else if (page_w != null && (p_x + p_w) > (page_w - margin - scrollbar)) {
+    p_x = page_w - margin - scrollbar - p_w;
+  }
+  if (p_y < margin) {
+    p_y = margin;
+  }
+  // position the popup
+  popup.style.left = p_x + "px";
+  popup.style.top = p_y + "px";
+}
+
+function lookup_help_popup(popup_id) {
+  var _body, pop, info;
+  pop = document.getElementById(popup_id);
+  if (pop == null) {
+    _body = document.getElementsByTagName("body")[0];
+    pop = document.createElement("div");
+    pop.className = "pop_content";
+    pop.id = popup_id;
+    pop.style.backgroundColor = "#FFC";
+    pop.style.borderColor = "black";
+    info = document.createElement("p");
+    info.style.fontWeight = "bold";
+    info.appendChild(document.createTextNode("Error: No popup for topic \"" + popup_id + "\"."));
+    pop.appendChild(info);
+    // this might cause problems with the menu, but as this only happens
+    // when something is already wrong I don't think that's too much of a problem
+    _body.insertBefore(pop, _body.firstChild);
+  }
+  if (document.getElementsByTagName('body')[0].hasAttribute("data-autobtns")) {
+    if (!/\bauto_buttons\b/.test(pop.className)) {
+      pop.className += " auto_buttons";
+      var back_btn_sec = document.createElement("div");
+      back_btn_sec.className = "nested_only pop_back_sec";
+      var back_btn = document.createElement("span");
+      back_btn.className = "pop_back";
+      back_btn.appendChild(document.createTextNode("<< back"));
+      back_btn.addEventListener("click", function(e) {
+        help_return();
+      }, false);
+      back_btn_sec.appendChild(back_btn);
+      pop.insertBefore(back_btn_sec, pop.firstChild);
+      var close_btn_sec = document.createElement("div");
+      close_btn_sec.className = "pop_close_sec";
+      var close_btn = document.createElement("span");
+      close_btn.className = "pop_close";
+      close_btn.appendChild(document.createTextNode("close"));
+      close_btn.addEventListener("click", function(e) {
+        help_popup();
+      }, false);
+      close_btn_sec.appendChild(close_btn);
+      pop.appendChild(close_btn_sec);
+    }
+  }
+  return pop;
+}
+
+/*
+ * help_popup
+ *
+ * Moves around help pop-ups so they appear
+ * below an activator.
+ */
+function help_popup(activator, popup_id) {
+  "use strict";
+  var pop;
+  // set default values
+  if (typeof help_popup.popup === "undefined") {
+    help_popup.popup = [];
+  }
+  if (typeof help_popup.activator === "undefined") {
+    help_popup.activator = null;
+  }
+  var last_pop = (help_popup.popup.length > 0 ? help_popup.popup[help_popup.popup.length - 1] : null);
+  if (typeof(activator) == "undefined") { // no activator so hide
+    if (last_pop != null) {
+      last_pop.style.display = 'none';
+      help_popup.popup = [];
+    }
+    return;
+  }
+  pop = lookup_help_popup(popup_id);
+  if (pop == last_pop) {
+    if (activator == help_popup.activator) {
+      //hide popup (as we've already shown it for the current help button)
+      last_pop.style.display = 'none';
+      help_popup.popup = [];
+      return; // toggling complete!
+    }
+  } else if (last_pop != null) {
+    //activating different popup so hide current one
+    last_pop.style.display = 'none';
+  }
+  help_popup.popup = [pop];
+  help_popup.activator = activator;
+  toggle_class(pop, "nested", false);
+  //must make the popup visible to measure it or it has zero width
+  pop.style.display = 'block';
+  position_popup(activator, pop);
+}
+
+/*
+ * help_refine
+ * 
+ * Intended for links within a help popup. Stores a stack of state so
+ * you can go back.
+ */
+function help_refine(popup_id) {
+  if (help_popup.popup == null || help_popup.popup.length == 0 || help_popup.activator == null) {
+    throw new Error("Can not refine a help popup when one is not shown!");
+  }
+  var pop = lookup_help_popup(popup_id);
+  var last_pop = help_popup.popup[help_popup.popup.length - 1];
+  if (pop == last_pop) return; // slightly odd, but no real cause for alarm
+  help_popup.popup.push(pop);
+  toggle_class(pop, "nested", true);
+  last_pop.style.display = "none";
+  //must make the popup visible to measure it or it has zero width
+  pop.style.display = "block";
+  position_popup(help_popup.activator, pop);
+}
+
+/*
+ * help_return
+ * 
+ * Intended for links within a help popup. Stores a stack of state so
+ * you can go back.
+ */
+function help_return() {
+  if (help_popup.popup == null || help_popup.popup.length == 0 || help_popup.activator == null) {
+    throw new Error("Can not return to a earlier help popup when one is not shown!");
+  }
+  var last_pop = help_popup.popup.pop();
+  last_pop.style.display = "none";
+  var pop = (help_popup.popup.length > 0 ? help_popup.popup[help_popup.popup.length - 1] : null);
+  if (pop != null) {
+    toggle_class(pop, "nested", help_popup.popup.length > 1);
+    pop.style.display = "block";
+    position_popup(help_popup.activator, pop);
+  } else {
+    help_popup.activator = null;
+  }
+}
+
+/*
+ * update_scroll_pad
+ *
+ * Creates padding at the bottom of the page to allow
+ * scrolling of anything into view.
+ */
+function update_scroll_pad() {
+  var page, pad;
+  page = (document.compatMode === "CSS1Compat") ? document.documentElement : document.body;
+  pad = $("scrollpad");
+  if (pad === null) {
+    pad = document.createElement("div");
+    pad.id = 'scrollpad';
+    document.getElementsByTagName('body')[0].appendChild(pad);
+  }
+  pad.style.height = Math.abs(page.clientHeight - 100) + "px";
+}
+
+function substitute_classes(node, remove, add) {
+  "use strict";
+  var list, all, i, cls, classes;
+  list = node.className.split(/\s+/);
+  all = {};
+  for (i = 0; i < list.length; i++) {
+    if (list[i].length > 0) all[list[i]] = true;
+  }
+  for (i = 0; i < remove.length; i++) {
+    if (all.hasOwnProperty(remove[i])) {
+      delete all[remove[i]];
+    }
+  }
+  for (i = 0; i < add.length; i++) {
+    all[add[i]] = true;
+  }
+  classes = "";
+  for (cls in all) {
+    classes += cls + " ";
+  }
+  node.className = classes;
+}
+
+/*
+ * toggle_class
+ *
+ * Adds or removes a class from the node. If the parameter 'enabled' is not 
+ * passed then the existence of the class will be toggled, otherwise it will be
+ * included if enabled is true.
+ */
+function toggle_class(node, cls, enabled) {
+  var classes = node.className;
+  var list = classes.replace(/^\s+/, '').replace(/\s+$/, '').split(/\s+/);
+  var found = false;
+  for (var i = 0; i < list.length; i++) {
+    if (list[i] == cls) {
+      list.splice(i, 1);
+      i--;
+      found = true;
+    }
+  }
+  if (typeof enabled == "undefined") {
+    if (!found) list.push(cls);
+  } else {
+    if (enabled) list.push(cls);
+  }
+  node.className = list.join(" ");
+}
+
+/*
+ * find_child
+ *
+ * Searches child nodes in depth first order and returns the first it finds
+ * with the className specified.
+ * TODO replace with querySelector
+ */
+function find_child(node, className) {
+  var pattern;
+  if (node == null || typeof node !== "object") {
+    return null;
+  }
+  if (typeof className === "string") {
+    pattern = new RegExp("\\b" + className + "\\b");
+  } else {
+    pattern = className;
+  }
+  if (node.nodeType == Node.ELEMENT_NODE && 
+      pattern.test(node.className)) {
+    return node;
+  } else {
+    var result = null;
+    for (var i = 0; i < node.childNodes.length; i++) {
+      result = find_child(node.childNodes[i], pattern);
+      if (result != null) break;
+    }
+    return result;
+  }
+}
+
+/*
+ * find_parent
+ *
+ * Searches parent nodes outwards from the node and returns the first it finds
+ * with the className specified.
+ */
+function find_parent(node, className) {
+  var pattern;
+  pattern = new RegExp("\\b" + className + "\\b");
+  do {
+    if (node.nodeType == Node.ELEMENT_NODE && 
+        pattern.test(node.className)) {
+      return node;
+    }
+  } while (node = node.parentNode);
+  return null;
+}
+
+/*
+ * find_parent_tag
+ *
+ * Searches parent nodes outwards from the node and returns the first it finds
+ * with the tag name specified. HTML tags should be specified in upper case.
+ */
+function find_parent_tag(node, tag_name) {
+  do {
+    if (node.nodeType == Node.ELEMENT_NODE && node.tagName == tag_name) {
+      return node;
+    }
+  } while (node = node.parentNode);
+  return null;
+}
+
+/*
+ * __toggle_help
+ *
+ * Uses the 'topic' property of the this object to
+ * toggle display of a help topic.
+ *
+ * This function is not intended to be called directly.
+ */
+function __toggle_help(e) {
+  if (!e) e = window.event;
+  if (e.type === "keydown") {
+    if (e.keyCode !== 13 && e.keyCode !== 32) {
+      return;
+    }
+    // stop a submit or something like that
+    e.preventDefault();
+  }
+
+  help_popup(this, this.getAttribute("data-topic"));
+}
+
+function setup_help_button(button) {
+  "use strict";
+  var topic;
+  if (button.hasAttribute("data-topic")) {
+    topic = button.getAttribute("data-topic");
+    if (document.getElementById(topic) != null) {
+      button.tabIndex = "0"; // make keyboard selectable
+      button.addEventListener("click", function() {
+        help_popup(button, topic);
+      }, false);
+      button.addEventListener("keydown", function(e) {
+        // toggle only on Enter or Spacebar, let other keys do their thing
+        if (e.keyCode !== 13 && e.keyCode !== 32) return;
+        // stop a submit or something like that
+        e.preventDefault();
+        help_popup(button, topic);
+      }, false);
+    } else {
+      button.style.visibility = "hidden";
+    }
+  }
+  button.className += " active";
+}
+
+/*
+ * help_button
+ *
+ * Makes a help button for the passed topic.
+ */
+function help_button(topic) {
+  var btn = document.createElement("div");
+  btn.className = "help";
+  btn.setAttribute("data-topic", topic);
+  setup_help_button(btn);
+  return btn;
+}
+
+/*
+ * prepare_download
+ *
+ * Sets the attributes of a link to setup a file download using the given content.
+ * If no link is provided then create one and click it.
+ */
+function prepare_download(content, mimetype, filename, link) {
+  "use strict";
+  // if no link is provided then create one and click it
+  var click_link = false;
+  if (!link) {
+    link = document.createElement("a");
+    click_link = true;
+  }
+  try {
+    // Use a BLOB to convert the text into a data URL.
+    // We could do this manually with a base 64 conversion.
+    // This will only be supported on modern browsers,
+    // hence the try block.
+    var blob = new Blob([content], {type: mimetype});
+    var reader = new FileReader();
+    reader.onloadend = function() {
+      // If we're lucky the browser will also support the download
+      // attribute which will let us suggest a file name to save the link.
+      // Otherwise it is likely that the filename will be unintelligible. 
+      link.setAttribute("download", filename);
+      link.href = reader.result;
+      if (click_link) {
+        // must add the link to click it
+        document.body.appendChild(link);
+        link.click();
+        document.body.removeChild(link);
+      }
+    }
+    reader.readAsDataURL(blob);
+  } catch (error) {
+    if (console && console.log) console.log(error);
+    // probably an old browser
+    link.href = "";
+    link.visible = false;
+  }
+}
+
+/*
+ * add_cell
+ *
+ * Add a cell to the table row.
+ */
+function add_cell(row, node, cls, click_action) {
+  var cell = row.insertCell(row.cells.length);
+  if (node) cell.appendChild(node);
+  if (cls && cls !== "") cell.className = cls;
+  if (click_action) cell.addEventListener("click", click_action, false);
+}
+
+/*
+ * add_header_cell
+ *
+ * Add a header cell to the table row.
+ */
+function add_header_cell(row, node, help_topic, cls, colspan) {
+  var th = document.createElement("th");
+  if (node) th.appendChild(node);
+  if (help_topic && help_topic !== "") th.appendChild(help_button(help_topic));
+  if (cls && cls !== "") th.className = cls;
+  if (typeof colspan == "number" && colspan > 1) th.colSpan = colspan;
+  row.appendChild(th);
+}
+
+/*
+ * add_text_cell
+ *
+ * Add a text cell to the table row.
+ */
+function add_text_cell(row, text, cls, action) {
+  var node = null;
+  if (typeof(text) != 'undefined') node = document.createTextNode(text);
+  add_cell(row, node, cls, action);
+}
+
+/*
+ * add_text_header_cell
+ *
+ * Add a text header cell to the table row.
+ */
+function add_text_header_cell(row, text, help_topic, cls, action, colspan) {
+  var node = null;
+  if (typeof(text) != 'undefined') {
+    var nbsp = (help_topic ? "\u00A0" : "");
+    var str = "" + text;
+    var parts = str.split(/\n/);
+    if (parts.length === 1) {
+      if (action) {
+        node = document.createElement("span");
+        node.appendChild(document.createTextNode(str + nbsp));
+      } else {
+        node = document.createTextNode(str + nbsp);
+      }
+    } else {
+      node = document.createElement("span");
+      for (var i = 0; i < parts.length; i++) {
+        if (i !== 0) {
+          node.appendChild(document.createElement("br"));
+        }
+        node.appendChild(document.createTextNode(parts[i]));
+      }
+    }
+    if (action) {
+      node.addEventListener("click", action, false);
+      node.style.cursor = "pointer";
+    }
+  }
+  add_header_cell(row, node, help_topic, cls, colspan);
+}
+
+function setup_help() {
+  "use strict";
+  var help_buttons, i;
+  help_buttons = document.querySelectorAll(".help:not(.active)");
+  for (i = 0; i < help_buttons.length; i++) {
+    setup_help_button(help_buttons[i]);
+  }
+}
+
+function setup_scrollpad() {
+  "use strict";
+  if (document.getElementsByTagName('body')[0].hasAttribute("data-scrollpad") && document.getElementById("scrollpad") == null) {
+    window.addEventListener("resize", update_scroll_pad, false);
+    update_scroll_pad();
+  }
+}
+
+// anon function to avoid polluting global scope
+(function() {
+  "use strict";
+  window.addEventListener("load", function load(evt) {
+    window.removeEventListener("load", load, false);
+    setup_help();
+    setup_scrollpad();
+  }, false);
+})();
+
+/*
+ *  make_link
+ *
+ *  Creates a text node and if a URL is specified it surrounds it with a link.
+ *  If the URL doesn't begin with "http://" it automatically adds it, as
+ *  relative links don't make much sense in this context.
+ */
+function make_link(text, url) {
+  var textNode = null;
+  var link = null;
+  if (typeof text !== "undefined" && text !== null) textNode = document.createTextNode(text);
+  if (typeof url === "string") {
+    if (url.indexOf("//") == -1) {
+      url = "http://" + url;
+    }
+    link = document.createElement('a');
+    link.href = url;
+    if (textNode) link.appendChild(textNode);
+    return link;
+  }
+  return textNode;
+}
+</script>
+    <script>
+function motif_logo_template(inputs) {
+  function _input(name) {
+    if (typeof inputs[name] === "undefined") {
+      throw new Error("Missing template variable: " + name);
+    }
+    return inputs[name];
+  }
+  return (
+"%!PS-Adobe-3.0 EPSF-3.0\n" +
+"%%Title: Sequence Logo : " + _input("TITLE") + "\n" +
+"%%Creator: " + _input("CREATOR") + "\n" +
+"%%CreationDate: " + _input("CREATIONDATE") + "\n" +
+"%%BoundingBox:   0  0  " + _input("BOUNDINGWIDTH") + " " + _input("BOUNDINGHEIGHT") + " \n" +
+"%%Pages: 0\n" +
+"%%DocumentFonts: \n" +
+"%%EndComments\n" +
+"\n" +
+"% ---- CONSTANTS ----\n" +
+"\/cmfactor 72 2.54 div def % defines points -> cm conversion\n" +
+"\/cm {cmfactor mul} bind def % defines centimeters\n" +
+"\n" +
+"% ---- VARIABLES ----\n" +
+"\n" +
+"% NA = Nucleic Acid, AA = Amino Acid\n" +
+"\/logoType (" + _input("LOGOTYPE") + ") def \n" +
+"\n" +
+"\/logoTitle (" + _input("TITLE") + ") def\n" +
+"\n" +
+"% Dimensions in cm\n" +
+"\/logoWidth " + _input("LOGOWIDTH") + " cm def\n" +
+"\/logoHeight " + _input("LOGOLINEHEIGHT") + " cm def\n" +
+"\/totalHeight " + _input("LOGOHEIGHT") + " cm def\n" +
+"\n" +
+"\/yaxis " + _input("YAXIS") + " def\n" +
+"\/yaxisLabel (" + _input("YAXISLABEL") + ") def\n" +
+"\/yaxisBits  " + _input("BARBITS") + " def % bits\n" +
+"\/yaxisTicBits " + _input("TICBITS") + " def\n" +
+"\n" +
+"\/xaxis " + _input("NUMBERING") + " def\n" +
+"\/xaxisLabel (" + _input("XAXISLABEL") + ") def\n" +
+"\/showEnds (" + _input("SHOWENDS") + ") def \n" +
+"\n" +
+"\/showFineprint true def\n" +
+"\/fineprint (" + _input("FINEPRINT") + ") def\n" +
+"\n" +
+"\/charsPerLine " + _input("CHARSPERLINE") + " def\n" +
+"\n" +
+"\/showingBox " + _input("SHOWINGBOX") + " def    \n" +
+"\/shrinking false def   % true falses\n" +
+"\/shrink  1.0 def\n" +
+"\/outline " + _input("OUTLINE") + " def\n" +
+"\n" +
+"\/IbeamFraction  " + _input("ERRORBARFRACTION") + " def\n" +
+"\/IbeamGray      0.50 def\n" +
+"\/IbeamLineWidth 0.5 def\n" +
+"\n" +
+"\/fontsize       " + _input("FONTSIZE") + " def\n" +
+"\/titleFontsize  " + _input("TITLEFONTSIZE") + " def\n" +
+"\/smallFontsize  " + _input("SMALLFONTSIZE") + " def\n" +
+"\n" +
+"\/topMargin      " + _input("TOPMARGIN") + " cm def\n" +
+"\/bottomMargin   " + _input("BOTTOMMARGIN") + " cm def\n" +
+"\n" +
+"\/defaultColor [0 0 0] def \n" +
+"\n" +
+_input("COLORDICT") + "\n" +
+"\n" +
+"\/colorDict fullColourDict def\n" +
+"\n" +
+"% ---- DERIVED PARAMETERS ----\n" +
+"\n" +
+"\/leftMargin\n" +
+"  fontsize 3.5 mul\n" +
+"\n" +
+"def \n" +
+"\n" +
+"\/rightMargin \n" +
+"  %Add extra room if showing ends\n" +
+"  showEnds (false) eq { fontsize}{fontsize 1.5 mul} ifelse\n" +
+"def\n" +
+"\n" +
+"\/yaxisHeight \n" +
+"  logoHeight \n" +
+"  bottomMargin sub  \n" +
+"  topMargin sub\n" +
+"def\n" +
+"\n" +
+"\/ticWidth fontsize 2 div def\n" +
+"\n" +
+"\/pointsPerBit yaxisHeight yaxisBits div  def\n" +
+"\n" +
+"\/stackMargin 1 def\n" +
+"\n" +
+"% Do not add space aroung characters if characters are boxed\n" +
+"\/charRightMargin \n" +
+"  showingBox { 0.0 } {stackMargin} ifelse\n" +
+"def\n" +
+"\n" +
+"\/charTopMargin \n" +
+"  showingBox { 0.0 } {stackMargin} ifelse\n" +
+"def\n" +
+"\n" +
+"\/charWidth\n" +
+"  logoWidth\n" +
+"  leftMargin sub\n" +
+"  rightMargin sub\n" +
+"  charsPerLine div\n" +
+"  charRightMargin sub\n" +
+"def\n" +
+"\n" +
+"\/charWidth4 charWidth 4 div def\n" +
+"\/charWidth2 charWidth 2 div def\n" +
+"\n" +
+"\/stackWidth \n" +
+"  charWidth charRightMargin add\n" +
+"def\n" +
+" \n" +
+"\/numberFontsize \n" +
+"  fontsize charWidth lt {fontsize}{charWidth} ifelse\n" +
+"def\n" +
+"\n" +
+"% movements to place 5'\/N and 3'\/C symbols\n" +
+"\/leftEndDeltaX  fontsize neg         def\n" +
+"\/leftEndDeltaY  fontsize 1.5 mul neg def\n" +
+"\/rightEndDeltaX fontsize 0.25 mul     def\n" +
+"\/rightEndDeltaY leftEndDeltaY        def\n" +
+"\n" +
+"% Outline width is proporional to charWidth, \n" +
+"% but no less that 1 point\n" +
+"\/outlinewidth \n" +
+"  charWidth 32 div dup 1 gt  {}{pop 1} ifelse\n" +
+"def\n" +
+"\n" +
+"\n" +
+"% ---- PROCEDURES ----\n" +
+"\n" +
+"\/StartLogo { \n" +
+"  % Save state\n" +
+"  save \n" +
+"  gsave \n" +
+"\n" +
+"  % Print Logo Title, top center \n" +
+"  gsave \n" +
+"    SetStringFont\n" +
+"\n" +
+"    logoWidth 2 div\n" +
+"    logoTitle\n" +
+"    stringwidth pop 2 div sub\n" +
+"    totalHeight\n" +
+"    titleFontsize sub\n" +
+"    moveto\n" +
+"\n" +
+"    logoTitle\n" +
+"    show\n" +
+"  grestore\n" +
+"\n" +
+"  % Print X-axis label, bottom center\n" +
+"  gsave\n" +
+"    SetStringFont\n" +
+"\n" +
+"    logoWidth 2 div\n" +
+"    xaxisLabel\n" +
+"    stringwidth pop 2 div sub\n" +
+"    0\n" +
+"    titleFontsize 3 div\n" +
+"    add\n" +
+"    moveto\n" +
+"\n" +
+"    xaxisLabel\n" +
+"    show\n" +
+"  grestore\n" +
+"\n" +
+"  % Show Fine Print\n" +
+"  showFineprint {\n" +
+"    gsave\n" +
+"      SetSmallFont\n" +
+"      logoWidth\n" +
+"        fineprint stringwidth pop sub\n" +
+"        smallFontsize sub\n" +
+"          smallFontsize 3 div\n" +
+"      moveto\n" +
+"    \n" +
+"      fineprint show\n" +
+"    grestore\n" +
+"  } if\n" +
+"\n" +
+"  % Move to lower left corner of last line, first stack\n" +
+"  leftMargin bottomMargin translate\n" +
+"\n" +
+"  % Move above first line ready for StartLine \n" +
+"  0 totalHeight translate\n" +
+"\n" +
+"  SetLogoFont\n" +
+"} bind def\n" +
+"\n" +
+"\/EndLogo { \n" +
+"  grestore \n" +
+"  showpage \n" +
+"  restore \n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/StartLine { \n" +
+"  % move down to the bottom of the line:\n" +
+"  0 logoHeight neg translate\n" +
+"  \n" +
+"  gsave \n" +
+"    yaxis { MakeYaxis } if\n" +
+"    xaxis { showEnds (true) eq {ShowLeftEnd} if } if\n" +
+"} bind def\n" +
+"\n" +
+"\/EndLine{ \n" +
+"    xaxis { showEnds (true) eq {ShowRightEnd} if } if\n" +
+"  grestore \n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/MakeYaxis {\n" +
+"  gsave    \n" +
+"    stackMargin neg 0 translate\n" +
+"    ShowYaxisBar\n" +
+"    ShowYaxisLabel\n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/ShowYaxisBar { \n" +
+"  gsave  \n" +
+"    SetStringFont\n" +
+"\n" +
+"    \/str 10 string def % string to hold number  \n" +
+"    \/smallgap stackMargin 2 div def\n" +
+"\n" +
+"    % Draw first tic and bar\n" +
+"    gsave    \n" +
+"      ticWidth neg 0 moveto \n" +
+"      ticWidth 0 rlineto \n" +
+"      0 yaxisHeight rlineto\n" +
+"      stroke\n" +
+"    grestore\n" +
+"\n" +
+"   \n" +
+"    % Draw the tics\n" +
+"    % initial increment limit proc for\n" +
+"    0 yaxisTicBits yaxisBits abs %cvi\n" +
+"    {\/loopnumber exch def\n" +
+"\n" +
+"      % convert the number coming from the loop to a string\n" +
+"      % and find its width\n" +
+"      loopnumber 10 str cvrs\n" +
+"      \/stringnumber exch def % string representing the number\n" +
+"\n" +
+"      stringnumber stringwidth pop\n" +
+"      \/numberwidth exch def % width of number to show\n" +
+"\n" +
+"      \/halfnumberheight\n" +
+"         stringnumber CharBoxHeight 2 div\n" +
+"      def\n" +
+"\n" +
+"      numberwidth % move back width of number\n" +
+"      neg loopnumber pointsPerBit mul % shift on y axis\n" +
+"      halfnumberheight sub % down half the digit\n" +
+"\n" +
+"      moveto % move back the width of the string\n" +
+"\n" +
+"      ticWidth neg smallgap sub % Move back a bit more  \n" +
+"      0 rmoveto % move back the width of the tic  \n" +
+"\n" +
+"      stringnumber show\n" +
+"      smallgap 0 rmoveto % Make a small gap  \n" +
+"\n" +
+"      % now show the tic mark\n" +
+"      0 halfnumberheight rmoveto % shift up again\n" +
+"      ticWidth 0 rlineto\n" +
+"      stroke\n" +
+"    } for\n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+"\/ShowYaxisLabel {\n" +
+"  gsave\n" +
+"    SetStringFont\n" +
+"\n" +
+"    % How far we move left depends on the size of\n" +
+"    % the tic labels.\n" +
+"    \/str 10 string def % string to hold number  \n" +
+"    yaxisBits yaxisTicBits div cvi yaxisTicBits mul \n" +
+"    str cvs stringwidth pop\n" +
+"    ticWidth 1.5 mul  add neg  \n" +
+"\n" +
+"\n" +
+"    yaxisHeight\n" +
+"    yaxisLabel stringwidth pop\n" +
+"    sub 2 div\n" +
+"\n" +
+"    translate\n" +
+"    90 rotate\n" +
+"    0 0 moveto\n" +
+"    yaxisLabel show\n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/StartStack {  % <stackNumber> startstack\n" +
+"  xaxis {MakeNumber}{pop} ifelse\n" +
+"  gsave\n" +
+"} bind def\n" +
+"\n" +
+"\/EndStack {\n" +
+"  grestore\n" +
+"  stackWidth 0 translate\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"% Draw a character whose height is proportional to symbol bits\n" +
+"\/MakeSymbol{ % charbits character MakeSymbol\n" +
+"  gsave\n" +
+"    \/char exch def\n" +
+"    \/bits exch def\n" +
+"\n" +
+"    \/bitsHeight \n" +
+"       bits pointsPerBit mul \n" +
+"    def\n" +
+"\n" +
+"    \/charHeight \n" +
+"       bitsHeight charTopMargin sub\n" +
+"       dup \n" +
+"       0.0 gt {}{pop 0.0} ifelse % if neg replace with zero \n" +
+"    def \n" +
+" \n" +
+"    charHeight 0.0 gt {\n" +
+"      char SetColor\n" +
+"      charWidth charHeight char ShowChar\n" +
+"\n" +
+"      showingBox { % Unfilled box\n" +
+"        0 0 charWidth charHeight false ShowBox\n" +
+"      } if\n" +
+"\n" +
+"\n" +
+"    } if\n" +
+"\n" +
+"  grestore\n" +
+"\n" +
+"  0 bitsHeight translate \n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/ShowChar { % <width> <height> <char> ShowChar\n" +
+"  gsave\n" +
+"    \/tc exch def    % The character\n" +
+"    \/ysize exch def % the y size of the character\n" +
+"    \/xsize exch def % the x size of the character\n" +
+"\n" +
+"    \/xmulfactor 1 def \n" +
+"    \/ymulfactor 1 def\n" +
+"    \/limmulfactor 0.01 def\n" +
+"    \/drawable true def\n" +
+"\n" +
+"  \n" +
+"    % if ysize is negative, make everything upside down!\n" +
+"    ysize 0 lt {\n" +
+"      % put ysize normal in this orientation\n" +
+"      \/ysize ysize abs def\n" +
+"      xsize ysize translate\n" +
+"      180 rotate\n" +
+"    } if\n" +
+"\n" +
+"    shrinking {\n" +
+"      xsize 1 shrink sub 2 div mul\n" +
+"        ysize 1 shrink sub 2 div mul translate \n" +
+"\n" +
+"      shrink shrink scale\n" +
+"    } if\n" +
+"\n" +
+"    % Calculate the font scaling factors\n" +
+"    % Loop twice to catch small correction due to first scaling\n" +
+"    2 {\n" +
+"      gsave\n" +
+"        xmulfactor ymulfactor scale\n" +
+"      \n" +
+"        ysize % desired size of character in points\n" +
+"        tc CharBoxHeight \n" +
+"        dup 0.0 ne {\n" +
+"          div % factor by which to scale up the character\n" +
+"          \/ymulfactor exch def\n" +
+"        } % end if\n" +
+"        {pop pop}\n" +
+"        ifelse\n" +
+"\n" +
+"        xsize % desired size of character in points\n" +
+"        tc CharBoxWidth  \n" +
+"        dup 0.0 ne {\n" +
+"          div % factor by which to scale up the character\n" +
+"          \/xmulfactor exch def\n" +
+"        } % end if\n" +
+"        {pop pop}\n" +
+"        ifelse\n" +
+"      grestore\n" +
+"      % if the multiplication factors get too small we need to avoid a crash\n" +
+"      xmulfactor limmulfactor lt {\n" +
+"        \/xmulfactor 1 def\n" +
+"        \/drawable false def\n" +
+"      } if\n" +
+"      ymulfactor limmulfactor lt {\n" +
+"        \/ymulfactor 1 def\n" +
+"        \/drawable false def\n" +
+"      } if\n" +
+"    } repeat\n" +
+"\n" +
+"    % Adjust horizontal position if the symbol is an I\n" +
+"    tc (I) eq {\n" +
+"      charWidth 2 div % half of requested character width\n" +
+"      tc CharBoxWidth 2 div % half of the actual character\n" +
+"      sub 0 translate\n" +
+"      % Avoid x scaling for I \n" +
+"      \/xmulfactor 1 def \n" +
+"    } if\n" +
+"\n" +
+"\n" +
+"    % ---- Finally, draw the character\n" +
+"    drawable { \n" +
+"      newpath\n" +
+"      xmulfactor ymulfactor scale\n" +
+"\n" +
+"      % Move lower left corner of character to start point\n" +
+"      tc CharBox pop pop % llx lly : Lower left corner\n" +
+"      exch neg exch neg\n" +
+"      moveto\n" +
+"\n" +
+"      outline {  % outline characters:\n" +
+"        outlinewidth setlinewidth\n" +
+"        tc true charpath\n" +
+"        gsave 1 setgray fill grestore\n" +
+"        clip stroke\n" +
+"      } { % regular characters\n" +
+"        tc show\n" +
+"      } ifelse\n" +
+"    } if\n" +
+"\n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/ShowBox { % x1 y1 x2 y2 filled ShowBox\n" +
+"  gsave\n" +
+"    \/filled exch def \n" +
+"    \/y2 exch def\n" +
+"    \/x2 exch def\n" +
+"    \/y1 exch def\n" +
+"    \/x1 exch def\n" +
+"    newpath\n" +
+"    x1 y1 moveto\n" +
+"    x2 y1 lineto\n" +
+"    x2 y2 lineto\n" +
+"    x1 y2 lineto\n" +
+"    closepath\n" +
+"\n" +
+"    clip\n" +
+"    \n" +
+"    filled {\n" +
+"      fill\n" +
+"    }{ \n" +
+"      0 setgray stroke   \n" +
+"    } ifelse\n" +
+"\n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/MakeNumber { % number MakeNumber\n" +
+"  gsave\n" +
+"    SetNumberFont\n" +
+"    stackWidth 0 translate\n" +
+"    90 rotate % rotate so the number fits\n" +
+"    dup stringwidth pop % find the length of the number\n" +
+"    neg % prepare for move\n" +
+"    stackMargin sub % Move back a bit\n" +
+"    charWidth (0) CharBoxHeight % height of numbers\n" +
+"    sub 2 div %\n" +
+"    moveto % move back to provide space\n" +
+"    show\n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/Ibeam{ % heightInBits Ibeam\n" +
+"  gsave\n" +
+"    % Make an Ibeam of twice the given height in bits\n" +
+"    \/height exch  pointsPerBit mul def \n" +
+"    \/heightDRAW height IbeamFraction mul def\n" +
+"\n" +
+"    IbeamLineWidth setlinewidth\n" +
+"    IbeamGray setgray \n" +
+"\n" +
+"    charWidth2 height neg translate\n" +
+"    ShowIbar\n" +
+"    newpath\n" +
+"      0 0 moveto\n" +
+"      0 heightDRAW rlineto\n" +
+"    stroke\n" +
+"    newpath\n" +
+"      0 height moveto\n" +
+"      0 height rmoveto\n" +
+"      currentpoint translate\n" +
+"    ShowIbar\n" +
+"    newpath\n" +
+"    0 0 moveto\n" +
+"    0 heightDRAW neg rlineto\n" +
+"    currentpoint translate\n" +
+"    stroke\n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/ShowIbar { % make a horizontal bar\n" +
+"  gsave\n" +
+"    newpath\n" +
+"      charWidth4 neg 0 moveto\n" +
+"      charWidth4 0 lineto\n" +
+"    stroke\n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/ShowLeftEnd {\n" +
+"  gsave\n" +
+"    SetStringFont\n" +
+"    leftEndDeltaX leftEndDeltaY moveto\n" +
+"    logoType (NA) eq {(5) show ShowPrime} if\n" +
+"    logoType (AA) eq {(N) show} if\n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/ShowRightEnd { \n" +
+"  gsave\n" +
+"    SetStringFont\n" +
+"    rightEndDeltaX rightEndDeltaY moveto\n" +
+"    logoType (NA) eq {(3) show ShowPrime} if\n" +
+"    logoType (AA) eq {(C) show} if\n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"\/ShowPrime {\n" +
+"  gsave\n" +
+"    SetPrimeFont\n" +
+"    (\\242) show \n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+" \n" +
+"\/SetColor{ % <char> SetColor\n" +
+"  dup colorDict exch known {\n" +
+"    colorDict exch get aload pop setrgbcolor\n" +
+"  } {\n" +
+"    pop\n" +
+"    defaultColor aload pop setrgbcolor\n" +
+"  } ifelse \n" +
+"} bind def\n" +
+"\n" +
+"% define fonts\n" +
+"\/SetTitleFont {\/Times-Bold findfont titleFontsize scalefont setfont} bind def\n" +
+"\/SetLogoFont  {\/Helvetica-Bold findfont charWidth  scalefont setfont} bind def\n" +
+"\/SetStringFont{\/Helvetica-Bold findfont fontsize scalefont setfont} bind def\n" +
+"\/SetPrimeFont {\/Symbol findfont fontsize scalefont setfont} bind def\n" +
+"\/SetSmallFont {\/Helvetica findfont smallFontsize scalefont setfont} bind def\n" +
+"\n" +
+"\/SetNumberFont {\n" +
+"    \/Helvetica-Bold findfont \n" +
+"    numberFontsize\n" +
+"    scalefont\n" +
+"    setfont\n" +
+"} bind def\n" +
+"\n" +
+"%Take a single character and return the bounding box\n" +
+"\/CharBox { % <char> CharBox <lx> <ly> <ux> <uy>\n" +
+"  gsave\n" +
+"    newpath\n" +
+"    0 0 moveto\n" +
+"    % take the character off the stack and use it here:\n" +
+"    true charpath \n" +
+"    flattenpath \n" +
+"    pathbbox % compute bounding box of 1 pt. char => lx ly ux uy\n" +
+"    % the path is here, but toss it away ...\n" +
+"  grestore\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"% The height of a characters bounding box\n" +
+"\/CharBoxHeight { % <char> CharBoxHeight <num>\n" +
+"  CharBox\n" +
+"  exch pop sub neg exch pop\n" +
+"} bind def\n" +
+"\n" +
+"\n" +
+"% The width of a characters bounding box\n" +
+"\/CharBoxWidth { % <char> CharBoxHeight <num>\n" +
+"  CharBox\n" +
+"  pop exch pop sub neg \n" +
+"} bind def\n" +
+"\n" +
+"% Set the colour scheme to be faded to indicate trimming\n" +
+"\/MuteColour {\n" +
+"  \/colorDict mutedColourDict def\n" +
+"} def\n" +
+"\n" +
+"% Restore the colour scheme to the normal colours\n" +
+"\/RestoreColour {\n" +
+"  \/colorDict fullColourDict def\n" +
+"} def\n" +
+"\n" +
+"% Draw the background for a trimmed section\n" +
+"% takes the number of columns as a parameter\n" +
+"\/DrawTrimBg { % <num> DrawTrimBox\n" +
+"  \/col exch def\n" +
+"  \n" +
+"  \/boxwidth \n" +
+"    col stackWidth mul \n" +
+"  def\n" +
+" \n" +
+"  gsave\n" +
+"    0.97 setgray\n" +
+"\n" +
+"    newpath\n" +
+"    0 0 moveto\n" +
+"    boxwidth 0 rlineto\n" +
+"    0 yaxisHeight rlineto\n" +
+"    0 yaxisHeight lineto\n" +
+"    closepath\n" +
+"    \n" +
+"    fill\n" +
+"  grestore\n" +
+"} def\n" +
+"\n" +
+"\/DrawTrimEdge {\n" +
+"  gsave\n" +
+"    0.2 setgray\n" +
+"    [2] 0 setdash\n" +
+"\n" +
+"    newpath\n" +
+"    0 0 moveto\n" +
+"    0 yaxisHeight lineto\n" +
+"    \n" +
+"    stroke\n" +
+"\n" +
+"} def\n" +
+"\n" +
+"\n" +
+"% Deprecated names\n" +
+"\/startstack {StartStack} bind  def\n" +
+"\/endstack {EndStack}     bind def\n" +
+"\/makenumber {MakeNumber} bind def\n" +
+"\/numchar { MakeSymbol }  bind def\n" +
+"\n" +
+"%%EndProlog\n" +
+"\n" +
+"%%Page: 1 1\n" +
+"StartLogo\n" +
+"\n" +
+_input("DATA") + "\n" +
+"\n" +
+"EndLogo\n" +
+"\n" +
+"%%EOF\n"
+  );
+}</script>
+    <script>
+//======================================================================
+// start Alphabet object
+//======================================================================
+var Alphabet = function(alphabet, background) {
+  "use strict";
+  var i, j, sym, aliases, complement, comp_e_sym, ambigs, generate_background;
+  generate_background = (background == null);
+  if (generate_background) {
+    background = [];
+    for (i = 0; i < alphabet.ncore; i++) background[i] = 1.0 / alphabet.ncore;
+  } else if (alphabet.ncore != background.length) {
+    throw new Error("The background length does not match the alphabet length.");
+  }
+  this.name = alphabet.name;
+  this.like = (alphabet.like != null ? alphabet.like.toUpperCase() : null);
+  this.ncore = alphabet.ncore;
+  this.symbols = alphabet.symbols;
+  this.background = background;
+  this.genbg = generate_background;
+  this.encode = {};
+  this.encode2core = {};
+  this.complement = {};
+  // check if all symbols are same case
+  var seen_uc = false;
+  var seen_lc = false;
+  var check_case = function (syms) {
+    var s, sym;
+    if (typeof syms === "string") {
+      for (s = 0; s < syms.length; s++) {
+        sym = syms.charAt(s);
+        if (sym >= 'a' && sym <= 'z') seen_lc = true;
+        else if (sym >= 'A' && sym <= 'Z') seen_uc = true;
+      }
+    }
+  };
+  for (i = 0; i < this.symbols.length; i++) {
+    check_case(this.symbols[i].symbol);
+    check_case(this.symbols[i].aliases);
+  }
+  // now map symbols to indexes
+  var update_array = function(array, syms, index) {
+    var s, sym;
+    if (typeof syms === "string") {
+      for (s = 0; s < syms.length; s++) {
+        sym = syms.charAt(s);
+        array[sym] = index;
+        // when only a single case is used, then encode as case insensitive
+        if (seen_uc != seen_lc) {
+          if (sym >= 'a' && sym <= 'z') {
+            array[sym.toUpperCase()] = index;
+          } else if (sym >= 'A' && sym <= 'Z') {
+            array[sym.toLowerCase()] = index;
+          }
+        }
+      }
+    }
+  }
+  // map core symbols to index
+  for (i = 0; i < this.ncore; i++) {
+    update_array(this.encode2core, this.symbols[i].symbol, i);
+    update_array(this.encode, this.symbols[i].symbol, i);
+    update_array(this.encode2core, this.symbols[i].aliases, i);
+    update_array(this.encode, this.symbols[i].aliases, i);
+  }
+  // map ambigous symbols to index
+  ambigs = {};
+  for (i = this.ncore; i < this.symbols.length; i++) {
+    update_array(this.encode, this.symbols[i].symbol, i);
+    update_array(this.encode, this.symbols[i].aliases, i);
+    ambigs[this.symbols[i].equals] = i;
+  }
+  // determine complements
+  for (i = 0; i < this.ncore; i++) {
+    complement = this.symbols[i].complement;
+    if (typeof complement === "string") {
+      this.complement[i] = this.encode2core[complement];
+    }
+  }
+  next_symbol:
+  for (i = this.ncore; i < this.symbols.length; i++) {
+    complement = "";
+    for (j = 0; j < this.symbols[i].equals.length; j++) {
+      comp_e_sym = this.complement[this.encode2core[this.symbols[i].equals.charAt(j)]];
+      if (typeof comp_e_sym !== "number") continue next_symbol;
+      complement += this.symbols[comp_e_sym].symbol;
+    }
+    complement = complement.split("").sort().join("");
+    if (typeof ambigs[complement] === "number") {
+      this.complement[i] = ambigs[complement];
+    }
+  }
+  // determine case insensitivity
+  this.case_insensitive = true;
+  if (seen_uc == seen_lc) {
+    // when there is a mixture of cases it probably won't
+    // be case insensitive but we still need to check
+    loop:
+    for (i = 0; i < this.symbols.length; i++) {
+      sym = this.symbols[i].symbol;
+      if (sym >= 'A' && sym <= 'Z') {
+        if (this.encode[sym.toLowerCase()] != i) {
+          this.case_insensitive = false;
+          break loop;
+        }
+      } else if (sym >= 'a' && sym <= 'z') {
+        if (this.encode[sym.toUpperCase()] != i) {
+          this.case_insensitive = false;
+          break loop;
+        }
+      }
+      aliases = this.symbols[i].aliases;
+      if (aliases != null) {
+        for (j = 0; j < aliases.length; j++) {
+          sym = aliases.charAt(j);
+          if (sym >= 'A' && sym <= 'Z') {
+            if (this.encode[sym.toLowerCase()] != i) {
+              this.case_insensitive = false;
+              break loop;
+            }
+          } else if (sym >= 'a' && sym <= 'z') {
+            if (this.encode[sym.toUpperCase()] != i) {
+              this.case_insensitive = false;
+              break loop;
+            }
+          }
+        }
+      }
+    }
+  }
+  // normalise aliases to remove the prime symbol and eliminate
+  // the alternate cases when the alphabet is case insensitive
+  var seen, out;
+  for (i = 0; i < this.symbols.length; i++) {
+    sym = this.symbols[i].symbol;
+    aliases = this.symbols[i].aliases;
+    if (typeof aliases != "string") aliases = "";
+    seen = {};
+    out = [];
+    if (this.case_insensitive) {
+      sym = sym.toUpperCase();
+      aliases = aliases.toUpperCase();
+    }
+    seen[sym] = true;
+    for (j = 0; j < aliases.length; j++) {
+      if (!seen[aliases.charAt(j)]) {
+        seen[aliases.charAt(j)] = true;
+        out.push(aliases.charAt(j));
+      }
+    }
+    this.symbols[i].aliases = out.sort().join("");
+  }
+};
+// return the name of the alphabet
+Alphabet.prototype.get_alphabet_name = function() {
+  return this.name;
+};
+// return if the alphabet can be complemented
+Alphabet.prototype.has_complement = function() {
+  return (typeof this.symbols[0].complement === "string");
+};
+// return true if an uppercase letter has the same meaning as the lowercase form
+Alphabet.prototype.is_case_insensitive = function() {
+  return this.case_insensitive;
+};
+// return the information content of an alphabet letter
+Alphabet.prototype.get_ic = function() {
+  return Math.log(this.ncore) / Math.LN2;
+};
+// return the count of the core alphabet symbols
+Alphabet.prototype.get_size_core = function() {
+  return this.ncore;
+};
+// return the count of all alphabet symbols
+Alphabet.prototype.get_size_full = function() {
+  return this.symbols.length;
+};
+// return the symbol for the given alphabet index
+Alphabet.prototype.get_symbol = function(alph_index) {
+  "use strict";
+  if (alph_index < 0 || alph_index >= this.symbols.length) {
+    throw new Error("Alphabet index out of bounds");
+  }
+  return this.symbols[alph_index].symbol;
+};
+// return the aliases for the given alphabet index
+Alphabet.prototype.get_aliases = function(alph_index) {
+  "use strict";
+  if (alph_index < 0 || alph_index >= this.symbols.length) {
+    throw new Error("Alphabet index out of bounds");
+  }
+  var sym_obj = this.symbols[alph_index];
+  return (sym_obj.aliases != null ? sym_obj.aliases : "");
+};
+// return the name for the given alphabet index
+Alphabet.prototype.get_name = function(alph_index) {
+  "use strict";
+  var sym;
+  if (alph_index < 0 || alph_index >= this.symbols.length) {
+    throw new Error("Alphabet index out of bounds");
+  }
+  sym = this.symbols[alph_index];
+  return (typeof sym.name === "string" ? sym.name : sym.symbol);
+};
+// return the alphabet it is like or null
+Alphabet.prototype.get_like = function() {
+  "use strict";
+  return this.like;
+};
+// return the index of the complement for the given alphabet index
+Alphabet.prototype.get_complement = function(alph_index) {
+  var comp_e_sym = this.complement[alph_index];
+  if (typeof comp_e_sym === "number") {
+    return comp_e_sym;
+  } else {
+    return -1;
+  }
+};
+// return a string containing the core symbols
+Alphabet.prototype.get_symbols = function() {
+  "use strict";
+  var i, core_symbols;
+  core_symbols = "";
+  for (i = 0; i < this.ncore; i++) {
+    core_symbols += this.symbols[i].symbol;
+  }
+  return core_symbols;
+};
+// return if the background was not a uniform generated background
+Alphabet.prototype.has_bg = function() {
+  "use strict";
+  return !this.genbg;
+};
+// get the background frequency for the index
+Alphabet.prototype.get_bg_freq = function(alph_index) {
+  "use strict";
+  var freq, i, symbols;
+  if (alph_index >= 0) {
+    if (alph_index < this.ncore) {
+      return this.background[alph_index];
+    } else if (alph_index < this.symbols.length) {
+      freq = 0;
+      symbols = this.symbols[alph_index].equals;
+      for (i = 0; i < symbols.length; i++) {
+        freq += this.background[this.encode2core[symbols.charAt(i)]];
+      }
+      return freq;
+    } 
+  }
+  throw new Error("The alphabet index is out of range.");
+};
+// get the colour of the index
+Alphabet.prototype.get_colour = function(alph_index) {
+  "use strict";
+  if (alph_index < 0 || alph_index >= this.symbols.length) {
+    throw new Error("BAD_ALPHABET_INDEX");
+  }
+  if (typeof this.symbols[alph_index].colour != "string") {
+    return "black";
+  }
+  return "#" + this.symbols[alph_index].colour;
+};
+// get the rgb componets of the colour at the index
+Alphabet.prototype.get_rgb = function(alph_index) {
+  "use strict";
+  if (alph_index < 0 || alph_index >= this.symbols.length) {
+    throw new Error("BAD_ALPHABET_INDEX");
+  }
+  if (typeof this.symbols[alph_index].colour != "string") {
+    return {"red": 0, "green": 0, "blue": 0};
+  }
+  var colour = this.symbols[alph_index].colour;
+  var red = parseInt(colour.substr(0, 2), 16) / 255;
+  var green = parseInt(colour.substr(2, 2), 16) / 255;
+  var blue = parseInt(colour.substr(4, 2), 16) / 255;
+  return {"red": red, "green": green, "blue": blue};
+};
+// convert a symbol into the index
+Alphabet.prototype.get_index = function(letter) {
+  "use strict";
+  var alph_index;
+  alph_index = this.encode[letter];
+  if (typeof alph_index === "undefined") {
+    return -1;
+  }
+  return alph_index;
+};
+// convert a symbol into the list of core indexes that it equals
+Alphabet.prototype.get_indexes = function(letter) {
+  "use strict";
+  var alph_index, comprise_str, i, comprise_list;
+  alph_index = this.encode[letter];
+  if (typeof alph_index === "undefined") {
+    throw new Error("Unknown letter");
+  }
+  comprise_str = this.symbols[alph_index].equals;
+  comprise_list = [];
+  if (typeof comprise_str == "string") {
+    for (i = 0; i < comprise_str.length; i++) {
+      comprise_list.push(this.encode2core[comprise_str.charAt(i)]);
+    }
+  } else {
+    comprise_list.push(alph_index);
+  }
+  return comprise_list;
+};
+// check if a symbol is the primary way of representing the symbol in the alphabet
+Alphabet.prototype.is_prime_symbol = function(letter) {
+  var alph_index;
+  alph_index = this.encode[letter];
+  if (alph_index == null) return false;
+  if (this.is_case_insensitive()) {
+    return (this.symbols[alph_index].symbol.toUpperCase() == letter.toUpperCase());
+  } else {
+    return (this.symbols[alph_index].symbol == letter);
+  }
+};
+// compare 2 alphabets
+Alphabet.prototype.equals = function(other) {
+  "use strict";
+  var i, sym1, sym2;
+  // first check that it's actually an alphabet object
+  if (!(typeof other === "object" && other != null && other instanceof Alphabet)) {
+    return false;
+  }
+  // second shortcircuit if it's the same object
+  if (this === other) return true;
+  // compare
+  if (this.name !== other.name) return false;
+  if (this.ncore !== other.ncore) return false;
+  if (this.symbols.length !== other.symbols.length) return false;
+  for (i = 0; i < this.symbols.length; i++) {
+    sym1 = this.symbols[i];
+    sym2 = other.symbols[i];
+    if (sym1.symbol !== sym2.symbol) return false;
+    if (sym1.aliases !== sym2.aliases) return false;
+    if (sym1.name !== sym2.name) return false;
+    if (typeof sym1.colour !== typeof sym2.colour || 
+        (typeof sym1.colour === "string" && typeof sym2.colour === "string" &&
+         parseInt(sym1.colour, 16) != parseInt(sym2.colour, 16))) {
+      return false;
+    }
+    if (sym1.complement !== sym2.complement) return false;
+    if (sym1.equals !== sym2.equals) return false;
+  }
+  return true;
+};
+Alphabet.prototype.check_core_subset = function(super_alph) {
+  var complement_same = true;
+  var seen_set = {};
+  var sub_i, sub_symbol, super_i, super_symbol;
+  for (sub_i = 0; sub_i < this.ncore; sub_i++) {
+    sub_symbol = this.symbols[sub_i];
+    super_i = super_alph.encode[sub_symbol.symbol]; 
+    if (super_i == null) return 0;
+    super_symbol = super_alph.symbols[super_i];
+    if (seen_set[super_i]) return 0;
+    seen_set[super_i] = true;
+    // check complement
+    if (sub_symbol.complement != null && super_symbol.complement != null) {
+      if (super_alph.encode[sub_symbol.complement] != super_alph.encode[super_symbol.complement]) {
+        complement_same = false;
+      }
+    } else if (sub_symbol.complement != null || super_symbol.complement != null) {
+      complement_same = false;
+    }
+  }
+  return (complement_same ? 1 : -1);
+};
+// convert a sequence to its reverse complement
+Alphabet.prototype.invcomp_seq = function(seq) {
+  "use strict";
+  var syms, i, e_sym, comp_e_sym;
+  if (!this.has_complement()) throw new Error("Alphabet must be complementable");
+  syms = seq.split("");
+  for (i = 0; i < syms.length; i++) {
+    e_sym = this.encode[syms[i]];
+    if (typeof e_sym === "undefined") {
+      e_sym = this.ncore; // wildcard
+    }
+    comp_e_sym = this.complement[e_sym];
+    if (typeof comp_e_sym === "undefined") {
+      comp_e_sym = e_sym; // not complementable
+    }
+    syms[i] = this.symbols[comp_e_sym].symbol;
+  }
+  return syms.reverse().join("");
+};
+// convert the alphabet to the text version
+Alphabet.prototype.as_text = function() {
+  "use strict";
+  function name_as_text(name) {
+    var i, c, out;
+    out = "\"";
+    for (i = 0; i < name.length; i++) {
+      c = name.charAt(i);
+      if (c == "\"") {
+        out += "\\\"";
+      } else if (c == "/") {
+        out += "\\/";
+      } else if (c == "\\") {
+        out += "\\\\";
+      } else {
+        out += c;
+      }
+    }
+    out += "\"";
+    return out;
+  }
+  function symbol_as_text(sym) {
+    var out;
+    out = sym.symbol;
+    if (typeof sym.name === "string" && sym.name != sym.symbol) {
+      out += " " + name_as_text(sym.name);
+    }
+    if (typeof sym.colour === "string") {
+      out += " " + sym.colour;
+    }
+    return out;
+  }
+  var out, i, j, c, sym;
+  out = "";
+  // output core symbols with 2 way complements
+  for (i = 0; i < this.ncore; i++) {
+    c = this.complement[i];
+    if (typeof c === "number" && i < c && this.complement[c] === i) {
+      out += symbol_as_text(this.symbols[i]) + " ~ " + symbol_as_text(this.symbols[c]) + "\n";  
+    }
+  }
+  // output core symbols with no complement
+  for (i = 0; i < this.ncore; i++) {
+    if (typeof this.complement[i] === "undefined") {
+      out += symbol_as_text(this.symbols[i]) + "\n";
+    }
+  }
+  // output ambiguous symbols that have comprising characters
+  for (i = this.ncore; i < this.symbols.length; i++) {
+    if (this.symbols[i].equals.length == 0) break;
+    out += symbol_as_text(this.symbols[i]) + " = " + this.symbols[i].equals + "\n";
+    if (typeof this.symbols[i].aliases === "string") {
+      for (j = 0; j < this.symbols[i].aliases.length; j++) {
+        if (this.symbols[i].aliases.charAt(j) == this.symbols[i].symbol) continue;
+        out += this.symbols[i].aliases.charAt(j) + " = " + this.symbols[i].equals + "\n";
+      }
+    }
+  }
+  // output aliases of core symbols
+  for (i = 0; i < this.ncore; i++) {
+    if (typeof this.symbols[i].aliases === "string") {
+      for (j = 0; j < this.symbols[i].aliases.length; j++) {
+        if (this.symbols[i].aliases.charAt(j) == this.symbols[i].symbol) continue;
+        out += this.symbols[i].aliases.charAt(j) + " = " + this.symbols[i].symbol + "\n";
+      }
+    }
+  }
+  // output gap symbols
+  i = this.symbols.length - 1;
+  if (this.symbols[i].equals.length == 0) {
+    out += symbol_as_text(this.symbols[i]) + " =\n";
+    if (typeof this.symbols[i].aliases === "string") {
+      for (j = 0; j < this.symbols[i].aliases.length; j++) {
+        if (this.symbols[i].aliases.charAt(j) == this.symbols[i].symbol) continue;
+        out += this.symbols[i].aliases.charAt(j) + " =\n";
+      }
+    }
+  }
+  return out;
+};
+// output the alphabet as it appears in minimal MEME format
+Alphabet.prototype.as_meme = function() {
+  "use strict";
+  function name_as_text(name) {
+    var i, c, out;
+    out = "\"";
+    for (i = 0; i < name.length; i++) {
+      c = name.charAt(i);
+      if (c == "\"") {
+        out += "\\\"";
+      } else if (c == "/") {
+        out += "\\/";
+      } else if (c == "\\") {
+        out += "\\\\";
+      } else {
+        out += c;
+      }
+    }
+    out += "\"";
+    return out;
+  }
+  if (this.equals(AlphStd.DNA)) {
+    return "ALPHABET= ACGT\n";
+  } else if (this.equals(AlphStd.PROTEIN)) {
+    return "ALPHABET= ACDEFGHIKLMNPQRSTVWY\n";
+  } else {
+    return "ALPHABET" + 
+      (this.name != null ? " " + name_as_text(this.name) : "") + 
+      (this.like != null ? " " + this.like + "-LIKE" : "") + "\n" +
+      this.as_text() + "END ALPHABET\n";
+  }
+};
+
+// Returns a table showing all the letters in the alphabet
+Alphabet.prototype.as_table = function() {
+  "use strict";
+  var i, j, row, th, td, aliases, equals, sym;
+  var table = document.createElement("table");
+  // create the core symbol header
+  row = table.insertRow(table.rows.length);
+  th = document.createElement("th");
+  th.appendChild(document.createTextNode("Symbol(s)"));
+  row.appendChild(th);
+  th = document.createElement("th");
+  th.appendChild(document.createTextNode("Name"));
+  row.appendChild(th);
+  th = document.createElement("th");
+  if (this.has_complement()) {
+    th.appendChild(document.createTextNode("Complement"));
+  }
+  row.appendChild(th);
+  // list the core symbols
+  for (i = 0; i < this.ncore; i++) {
+    row = table.insertRow(table.rows.length);
+    td = document.createElement("td");
+    if (this.symbols[i].colour != null) {
+      td.style.color = '#' + this.symbols[i].colour;
+    }
+    td.appendChild(document.createTextNode(this.symbols[i].symbol));
+    aliases = this.get_aliases(i);
+    if (aliases.length > 0) {
+      td.appendChild(document.createTextNode(' ' + aliases.split('').join(' ')));
+    }
+    row.appendChild(td);
+    td = document.createElement("td");
+    if (this.symbols[i].name != null) {
+      td.appendChild(document.createTextNode(this.symbols[i].name));
+    }
+    row.appendChild(td);
+    td = document.createElement("td");
+    if (this.symbols[i].complement != null) {
+      td.style.color = this.get_colour(this.get_index(this.symbols[i].complement));
+      td.appendChild(document.createTextNode(this.symbols[i].complement));
+    }
+    row.appendChild(td);
+  }
+  // create the ambiguous symbol header
+  row = table.insertRow(table.rows.length);
+  th = document.createElement("th");
+  th.appendChild(document.createTextNode("Symbol(s)"));
+  row.appendChild(th);
+  th = document.createElement("th");
+  th.appendChild(document.createTextNode("Name"));
+  row.appendChild(th);
+  th = document.createElement("th");
+  th.appendChild(document.createTextNode("Matches"));
+  row.appendChild(th);
+  // list the ambiguous symbols
+  for (i = this.ncore; i < this.symbols.length; i++) {
+    row = table.insertRow(table.rows.length);
+    td = document.createElement("td");
+    if (this.symbols[i].colour != null) {
+      td.style.color = '#' + this.symbols[i].colour;
+    }
+    td.appendChild(document.createTextNode(this.symbols[i].symbol));
+    aliases = this.get_aliases(i);
+    if (aliases.length > 0) {
+      td.appendChild(document.createTextNode(' ' + aliases.split('').join(' ')));
+    }
+    row.appendChild(td);
+    td = document.createElement("td");
+    if (this.symbols[i].name != null) {
+      td.appendChild(document.createTextNode(this.symbols[i].name));
+    }
+    row.appendChild(td);
+    td = document.createElement("td");
+    equals = this.symbols[i].equals.split('');
+    for (j = 0; j < equals.length; j++) {
+      if (j != 0) td.appendChild(document.createTextNode(' '));
+      sym = document.createElement("span");
+      sym.style.color = this.get_colour(this.get_index(equals[j]));
+      sym.appendChild(document.createTextNode(equals[j]));
+      td.appendChild(sym);
+    }
+    row.appendChild(td);
+  }
+  return table;
+};
+
+// returns a dictionary of the colours for EPS
+Alphabet.prototype._as_eps_dict = function() {
+  "use strict";
+  var i, sym, rgb;
+  var out = "/fullColourDict <<\n";
+  for (i = 0; i < this.ncore; i++) {
+    sym = this.get_symbol(i);
+    sym = sym.replace(/\\/g, "\\\\");
+    sym = sym.replace(/\(/g, "\\(");
+    sym = sym.replace(/\)/g, "\\)");
+    rgb = this.get_rgb(i);
+    out += " (" + sym + ") [" + rgb.red.toFixed(4) + " " + rgb.green.toFixed(4) + " " + rgb.blue.toFixed(4) + "]\n";
+  }
+  out += ">> def\n";
+  out += "/mutedColourDict <<\n";
+  for (i = 0; i < this.ncore; i++) {
+    sym = this.get_symbol(i);
+    sym = sym.replace(/\\/g, "\\\\");
+    sym = sym.replace(/\(/g, "\\(");
+    sym = sym.replace(/\)/g, "\\)");
+    rgb = Alphabet.lighten_colour(this.get_rgb(i));
+    out += " (" + sym + ") [" + rgb.red.toFixed(4) + " " + rgb.green.toFixed(4) + " " + rgb.blue.toFixed(4) + "]\n";
+  }
+  out += ">> def\n";
+  return out;
+};
+
+// return the alphabet name or a list of primary symbols
+Alphabet.prototype.toString = function() {
+  "use strict";
+  if (this.name != null) {
+    return this.name;
+  } else {
+    return this.get_symbols();
+  }
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Helper functions
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+// Convert a colour specified in RGB colourspace values into LAB colourspace
+Alphabet.rgb2lab = function(rgb) {
+  "use strict";
+  var xyzHelper, labHelper;
+  // XYZ helper
+  xyzHelper = function(value) {
+    if (value > 0.0445) {
+      value = (value + 0.055) / 1.055;
+      value = Math.pow(value, 2.4);
+    } else {
+      value /= 12.92;
+    }
+    value *= 100;
+    return value;
+  };
+  // lab helper
+  labHelper = function(value) {
+    if (value > 0.008856) {
+      value = Math.pow(value, 1.0 / 3.0);
+    } else {
+      value = (7.787 * value) + (16.0 / 116.0);
+    }
+    return value;
+  };
+  // convert into XYZ colourspace
+  var c1, c2, c3;
+  if (typeof rgb == "number") {
+    c1 = xyzHelper(((rgb >> 16) & 0xFF) / 255.0);
+    c2 = xyzHelper(((rgb >> 8) & 0xFF) / 255.0);
+    c3 = xyzHelper((rgb & 0xFF) / 255.0);
+  } else {
+    c1 = xyzHelper(rgb.red);
+    c2 = xyzHelper(rgb.green);
+    c3 = xyzHelper(rgb.blue);
+  }
+  var x = (c1 * 0.4124) + (c2 * 0.3576) + (c3 * 0.1805);
+  var y = (c1 * 0.2126) + (c2 * 0.7152) + (c3 * 0.0722);
+  var z = (c1 * 0.0193) + (c2 * 0.1192) + (c3 * 0.9505);
+  // convert into Lab colourspace
+  c1 = labHelper(x / 95.047);
+  c2 = labHelper(y / 100.0);
+  c3 = labHelper(z / 108.883);
+  var l = (116.0 * c2) - 16;
+  var a = 500.0 * (c1 - c2);
+  var b = 200.0 * (c2 - c3);
+  return {"l": l, "a": a, "b": b};
+};
+
+// Convert a colour specified in HSV colourspace into RGB colourspace
+Alphabet.hsv2rgb = function(hue, sat, value, output_object) {
+  // achromatic (grey)
+  var r = value;
+  var g = value;
+  var b = value;
+  if (sat != 0) {
+    var h = hue / 60.0;
+    var i = Math.floor(h);
+    var f = h - i;
+    var p = value * (1.0 - sat);
+    var q = value * (1.0 - (sat * f));
+    var t = value * (1.0 - (sat * (1.0 - f)));
+    if (i == 0) {
+      r = value;
+      g = t;
+      b = p;
+    } else if (i == 1) {
+      r = q;
+      g = value;
+      b = p;
+    } else if (i == 2) {
+      r = p;
+      g = value;
+      b = t;
+    } else if (i == 3) {
+      r = p;
+      g = q;
+      b = value;
+    } else if (i == 4) {
+      r = t;
+      g = p;
+      b = value;
+    } else {
+      r = value;
+      g = p;
+      b = q;
+    }
+  }
+  if (output_object) {
+    return {"red": r, "green": g, "blue": b};
+  } else {
+    return (Math.floor(r * 255) << 15) | (Math.floor(g * 255) << 8) | (Math.floor(b * 255));
+  }
+};
+
+// Calculate a distance score between two colours in LAB colourspace
+Alphabet.lab_dist = function(lab1, lab2) {
+  var c1 = Math.sqrt((lab1.l * lab1.l) + (lab1.a * lab1.a));
+  var c2 = Math.sqrt((lab2.l * lab2.l) + (lab2.a * lab2.a));
+  var dc = c1 - c2;
+  var dl = lab1.l - lab2.l;
+  var da = lab1.a - lab2.a;
+  var db = lab1.b - lab2.b;
+  // we don't want NaN due to rounding errors so fudge things a bit...
+  var dh = 0;
+  var dh_squared = (da * da) + (db * db) - (dc * dc);
+  if (dh_squared > 0) {
+    dh = Math.sqrt(dh_squared);
+  }
+  var first = dl;
+  var second = dc / (1.0 + (0.045 * c1));
+  var third = dh / (1.0 + (0.015 * c1));
+  return Math.sqrt((first * first) + (second * second) + (third * third));
+};
+
+// convert an RGB value into a HSL value
+Alphabet.rgb2hsl = function(rgb) {
+  "use strict";
+  var min, max, delta, h, s, l, r, g, b;
+  if (typeof rgb == "number") {
+    r = ((rgb >> 16) & 0xFF) / 255.0;
+    g = ((rgb >> 8) & 0xFF) / 255.0;
+    b = (rgb & 0xFF) / 255.0;
+  } else {
+    r = rgb.red;
+    g = rgb.green;
+    b = rgb.blue;
+  }
+  min = Math.min(r, g, b);
+  max = Math.max(r, g, b);
+  delta = max - min;
+  l = min + (delta / 2);
+  if (max == min) {
+    h = 0; // achromatic (grayscale)
+    s = 0;
+  } else {
+    if (l > 0.5) {
+      s = delta / (2 - max - min);
+    } else {
+      s = delta / (max + min);
+    }
+    if (max == r) {
+      h = (g - b) / delta;
+      if (g < b) h += 6;
+    } else if (max == g) {
+      h = ((b - r) / delta) + 2;
+    } else {
+      h = ((r - g) / delta) + 4;
+    }
+    h /= 6;
+  }
+  return {"h": h, "s": s, "l": l};
+};
+
+// convert a HSL value into an RGB value
+Alphabet.hsl2rgb = function(hsl, output_object) {
+  "use strict";
+  function _hue(p, q, t) {
+    "use strict";
+    if (t < 0) t += 1;
+    else if (t > 1) t -= 1;
+    if (t < (1.0 / 6.0)) {
+      return p + ((q - p) * 6.0 * t);
+    } else if (t < 0.5) {
+      return q;
+    } else if (t < (2.0 / 3.0)) {
+      return p + ((q - p) * ((2.0 / 3.0) - t) * 6.0);
+    } else {
+      return p;
+    }
+  }
+  var r, g, b, p, q;
+  if (hsl.s == 0) {
+    // achromatic (grayscale)
+    r = hsl.l;
+    g = hsl.l;
+    b = hsl.l;
+  } else {
+    if (hsl.l < 0.5) {
+      q = hsl.l * (1 + hsl.s);
+    } else {
+      q = hsl.l + hsl.s - (hsl.l * hsl.s);
+    }
+    p = (2 * hsl.l) - q;
+    r = _hue(p, q, hsl.h + (1.0 / 3.0));
+    g = _hue(p, q, hsl.h);
+    b = _hue(p, q, hsl.h - (1.0 / 3.0));
+  }
+  if (output_object) {
+    return {"red": r, "green": g, "blue": b};
+  } else {
+    return (Math.floor(r * 255) << 15) | (Math.floor(g * 255) << 8) | (Math.floor(b * 255));
+  }
+};
+
+Alphabet.lighten_colour = function(rgb) {
+  "use strict";
+  var hsl = Alphabet.rgb2hsl(rgb);
+  hsl.l += (1.0 - hsl.l) * 2 / 3;
+  return Alphabet.hsl2rgb(hsl, typeof rgb != "number");
+};
+
+//======================================================================
+// end Alphabet object
+//======================================================================
+
+//======================================================================
+// start StandardAlphabet object
+//======================================================================
+
+// an extension of the alphabet object to support some additional fields 
+// only present in standard alphabets.
+var StandardAlphabet = function(enum_code, enum_name, alphabet_data) {
+  Alphabet.apply(this, [alphabet_data]);
+  this.enum_code = enum_code;
+  this.enum_name = enum_name;
+};
+StandardAlphabet.prototype = Alphabet.prototype;
+StandardAlphabet.prototype.constructor = StandardAlphabet;
+
+// A unique code for this standard alphabet.
+// This code will be a power of 2 to enable creation of bitsets for
+// a selection of standard alphabets.
+StandardAlphabet.prototype.get_code = function() {
+  return this.enum_code;
+};
+
+// A unique name for this standard alphabet.
+// this name will be all upper case and the same as the property that
+// refers to this alphabet in the AlphStd collection.
+StandardAlphabet.prototype.get_enum = function() {
+  return this.enum_name;
+};
+
+//======================================================================
+// end StandardAlphabet object
+//======================================================================
+
+// A collection of standard alphabets.
+var AlphStd = {
+  RNA: new StandardAlphabet(1, "RNA", {
+    "name": "RNA",
+    "like": "RNA",
+    "ncore": 4,
+    "symbols": [
+      {"symbol": "A", "name": "Adenine", "colour": "CC0000"},
+      {"symbol": "C", "name": "Cytosine", "colour": "0000CC"},
+      {"symbol": "G", "name": "Guanine", "colour": "FFB300"},
+      {"symbol": "U", "name": "Uracil", "colour": "008000",
+        "aliases": "T"},
+      {"symbol": "N", "name": "Any base", "equals": "ACGU", "aliases": "X."},
+      {"symbol": "V", "name": "Not U", "equals": "ACG"},
+      {"symbol": "H", "name": "Not G", "equals": "ACU"},
+      {"symbol": "D", "name": "Not C", "equals": "AGU"},
+      {"symbol": "B", "name": "Not A", "equals": "CGU"},
+      {"symbol": "M", "name": "Amino", "equals": "AC"},
+      {"symbol": "R", "name": "Purine", "equals": "AG"},
+      {"symbol": "W", "name": "Weak", "equals": "AU"}, 
+      {"symbol": "S", "name": "Strong", "equals": "CG"},
+      {"symbol": "Y", "name": "Pyrimidine", "equals": "CU"},
+      {"symbol": "K", "name": "Keto", "equals": "GU"}
+    ]
+  }), 
+  DNA: new StandardAlphabet(2, "DNA", {
+    "name": "DNA",
+    "like": "DNA",
+    "ncore": 4,
+    "symbols": [
+      {"symbol": "A", "name": "Adenine", "colour": "CC0000", "complement": "T"},
+      {"symbol": "C", "name": "Cytosine", "colour": "0000CC", "complement": "G"},
+      {"symbol": "G", "name": "Guanine", "colour": "FFB300", "complement": "C"},
+      {"symbol": "T", "name": "Thymine", "colour": "008000", "complement": "A",
+        "aliases": "U"},
+      {"symbol": "N", "name": "Any base", "equals": "ACGT", "aliases": "X."},
+      {"symbol": "V", "name": "Not T", "equals": "ACG"},
+      {"symbol": "H", "name": "Not G", "equals": "ACT"},
+      {"symbol": "D", "name": "Not C", "equals": "AGT"},
+      {"symbol": "B", "name": "Not A", "equals": "CGT"},
+      {"symbol": "M", "name": "Amino", "equals": "AC"},
+      {"symbol": "R", "name": "Purine", "equals": "AG"},
+      {"symbol": "W", "name": "Weak", "equals": "AT"}, 
+      {"symbol": "S", "name": "Strong", "equals": "CG"},
+      {"symbol": "Y", "name": "Pyrimidine", "equals": "CT"},
+      {"symbol": "K", "name": "Keto", "equals": "GT"}
+    ]
+  }), 
+  PROTEIN: new StandardAlphabet(4, "PROTEIN", {
+    "name": "Protein",
+    "like": "PROTEIN",
+    "ncore": 20,
+    "symbols": [
+      {"symbol": "A", "name": "Alanine", "colour": "0000CC"},
+      {"symbol": "C", "name": "Cysteine", "colour": "0000CC"},
+      {"symbol": "D", "name": "Aspartic acid", "colour": "FF00FF"},
+      {"symbol": "E", "name": "Glutamic acid", "colour": "FF00FF"},
+      {"symbol": "F", "name": "Phenylalanine", "colour": "0000CC"},
+      {"symbol": "G", "name": "Glycine", "colour": "FFB300"},
+      {"symbol": "H", "name": "Histidine", "colour": "FFCCCC"},
+      {"symbol": "I", "name": "Isoleucine", "colour": "0000CC"},
+      {"symbol": "K", "name": "Lysine", "colour": "CC0000"},
+      {"symbol": "L", "name": "Leucine", "colour": "0000CC"},
+      {"symbol": "M", "name": "Methionine", "colour": "0000CC"},
+      {"symbol": "N", "name": "Asparagine", "colour": "008000"},
+      {"symbol": "P", "name": "Proline", "colour": "FFFF00"},
+      {"symbol": "Q", "name": "Glutamine", "colour": "008000"},
+      {"symbol": "R", "name": "Arginine", "colour": "CC0000"},
+      {"symbol": "S", "name": "Serine", "colour": "008000"},
+      {"symbol": "T", "name": "Threonine", "colour": "008000"},
+      {"symbol": "V", "name": "Valine", "colour": "0000CC"},
+      {"symbol": "W", "name": "Tryptophan", "colour": "0000CC"},
+      {"symbol": "Y", "name": "Tyrosine", "colour": "33E6CC"},
+      {"symbol": "X", "name": "Any amino acid", "equals": "ACDEFGHIKLMNPQRSTVWY", "aliases": "*."},
+      {"symbol": "B", "name": "Asparagine or Aspartic acid", "equals": "DN"}, 
+      {"symbol": "Z", "name": "Glutamine or Glutamic acid", "equals": "EQ"}, 
+      {"symbol": "J", "name": "Leucine or Isoleucine", "equals": "IL"}
+    ]
+  })
+};
+
+//======================================================================
+// start Symbol object
+//======================================================================
+var Symbol = function(alph_index, scale, alphabet) {
+  "use strict";
+  //variable prototype
+  this.symbol = alphabet.get_symbol(alph_index);
+  this.scale = scale;
+  this.colour = alphabet.get_colour(alph_index);
+};
+
+Symbol.prototype.get_symbol = function() {
+  "use strict";
+  return this.symbol;
+};
+
+Symbol.prototype.get_scale = function() {
+  "use strict";
+  return this.scale;
+};
+
+Symbol.prototype.get_colour = function() {
+  "use strict";
+  return this.colour;
+};
+
+Symbol.prototype.toString = function() {
+  "use strict";
+  return this.symbol + " " + (Math.round(this.scale*1000)/10) + "%";
+};
+
+function compare_symbol(sym1, sym2) {
+  "use strict";
+  if (sym1.get_scale() < sym2.get_scale()) {
+    return -1;
+  } else if (sym1.get_scale() > sym2.get_scale()) {
+    return 1;
+  } else {
+    return 0;
+  }
+}
+//======================================================================
+// end Symbol object
+//======================================================================
+
+//======================================================================
+// start Pspm object
+//======================================================================
+var Pspm = function(matrix, name, ltrim, rtrim, nsites, evalue, pssm, alt) {
+  "use strict";
+  var row, col, data, row_sum, delta, evalue_re;
+  if (typeof name !== "string") {
+    name = "";
+  }
+  this.name = name;
+  //construct
+  if (matrix instanceof Pspm) {
+    // copy constructor
+    this.alph_length = matrix.alph_length;
+    this.motif_length = matrix.motif_length;
+    this.name = matrix.name;
+    this.alt = matrix.alt;
+    this.nsites = matrix.nsites;
+    this.evalue = matrix.evalue;
+    this.ltrim = matrix.ltrim;
+    this.rtrim = matrix.rtrim;
+    this.pspm = [];
+    for (row = 0; row < matrix.motif_length; row++) {
+      this.pspm[row] = [];
+      for (col = 0; col < matrix.alph_length; col++) {
+        this.pspm[row][col] = matrix.pspm[row][col];
+      }
+    }
+    if (matrix.pssm != null) {
+      this.pssm = [];
+      for (row = 0; row < matrix.motif_length; row++) {
+        this.pspm[row] = [];
+        for (col = 0; col < matrix.alph_length; col++) {
+          this.pssm[row][col] = matrix.pssm[row][col];
+        }
+      }
+    }
+  } else {
+    // check parameters
+    if (ltrim == null) {
+      ltrim = 0;
+    } else if (typeof ltrim !== "number" || ltrim % 1 !== 0 || ltrim < 0) {
+      throw new Error("ltrim must be a non-negative integer, got: " + ltrim);
+    }
+    if (rtrim == null) {
+      rtrim = 0;
+    } else if (typeof rtrim !== "number" || rtrim % 1 !== 0 || rtrim < 0) {
+      throw new Error("rtrim must be a non-negative integer, got: " + rtrim);
+    }
+    if (nsites != null) {
+      if (typeof nsites !== "number" || nsites < 0) {
+        throw new Error("nsites must be a positive number, got: " + nsites);
+      } else if (nsites == 0) {
+        nsites = null;
+      }
+    }
+    if (evalue != null) {
+      if (typeof evalue === "number") {
+        if (evalue < 0) {
+          throw new Error("evalue must be a non-negative number, got: " + evalue);
+        }
+      } else if (typeof evalue === "string") {
+        evalue_re = /^((?:[+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?)|inf)$/;
+        if (!evalue_re.test(evalue)) {
+          throw new Error("evalue must be a non-negative number, got: " + evalue);
+        }
+      } else {
+        throw new Error("evalue must be a non-negative number, got: " + evalue);
+      }
+    }
+    // set properties
+    this.name = name;
+    this.alt = alt;
+    this.nsites = nsites;
+    this.evalue = evalue;
+    this.ltrim = ltrim;
+    this.rtrim = rtrim;
+    if (typeof matrix === "string") {
+      // string constructor
+      data = parse_pspm_string(matrix);
+      this.alph_length = data["alph_length"];
+      this.motif_length = data["motif_length"];
+      this.pspm = data["pspm"];
+      if (this.evalue == null) {
+        if (data["evalue"] != null) {
+          this.evalue = data["evalue"];
+        } else {
+          this.evalue = 0;
+        }
+      }
+      if (this.nsites == null) {
+        if (typeof data["nsites"] === "number") {
+          this.nsites = data["nsites"];
+        } else {
+          this.nsites = 20;
+        }
+      }
+    } else {
+      // assume pspm is a nested array
+      this.motif_length = matrix.length;
+      this.alph_length = (matrix.length > 0 ? matrix[0].length : 0);
+      if (this.nsites == null) {
+        this.nsites = 20;
+      }
+      if (this.evalue == null) {
+        this.evalue = 0;
+      }
+      this.pspm = [];
+      // copy pspm and check
+      for (row = 0; row < this.motif_length; row++) {
+        if (this.alph_length != matrix[row].length) {
+          throw new Error("COLUMN_MISMATCH");
+        }
+        this.pspm[row] = [];
+        row_sum = 0;
+        for (col = 0; col < this.alph_length; col++) {
+          this.pspm[row][col] = matrix[row][col];
+          row_sum += this.pspm[row][col];
+        }
+        delta = 0.1;
+        if (isNaN(row_sum) || (row_sum > 1 && (row_sum - 1) > delta) || 
+            (row_sum < 1 && (1 - row_sum) > delta)) {
+          throw new Error("INVALID_SUM");
+        }
+      }
+      // copy pssm
+      if (pssm != null) {
+        this.pssm = [];
+        for (row = 0; row < this.motif_length; row++) {
+          this.pssm[row] = [];
+          for (col = 0; col < this.alph_length; col++) {
+            this.pssm[row][col] = pssm[row][col];
+          }
+        }
+      }
+    }
+  }
+};
+
+Pspm.prototype.copy = function() {
+  "use strict";
+  return new Pspm(this);
+};
+
+Pspm.prototype.reverse = function() {
+  "use strict";
+  var x, y, temp, temp_trim;
+  //reverse
+  x = 0;
+  y = this.motif_length-1;
+  while (x < y) {
+    temp = this.pspm[x];
+    this.pspm[x] = this.pspm[y];
+    this.pspm[y] = temp;
+    x++;
+    y--;
+  }
+  // reverse pssm (if defined)
+  if (typeof this.pssm !== "undefined") {
+    //reverse
+    x = 0;
+    y = this.motif_length-1;
+    while (x < y) {
+      temp = this.pssm[x];
+      this.pspm[x] = this.pssm[y];
+      this.pssm[y] = temp;
+      x++;
+      y--;
+    }
+  }
+  //swap triming
+  temp_trim = this.ltrim;
+  this.ltrim = this.rtrim;
+  this.rtrim = temp_trim;
+  return this; //allow function chaining...
+};
+
+Pspm.prototype.reverse_complement = function(alphabet) {
+  "use strict";
+  var x, y, temp, i, row, c, temp_trim;
+  if (this.alph_length != alphabet.get_size_core()) {
+    throw new Error("The alphabet size does not match the size of the pspm.");
+  }
+  if (!alphabet.has_complement()) {
+    throw new Error("The specified alphabet can not be complemented.");
+  }
+  // reverse motif
+  this.reverse();
+  //complement
+  for (x = 0; x < this.motif_length; x++) {
+    row = this.pspm[x];
+    for (i = 0; i < row.length; i++) {
+      c = alphabet.get_complement(i);
+      if (c < i) continue;
+      temp = row[i];
+      row[i] = row[c];
+      row[c] = temp;
+    }
+  }
+  // complement pssm (if defined)
+  if (typeof this.pssm !== "undefined") {
+    //complement
+    for (x = 0; x < this.motif_length; x++) {
+      row = this.pssm[x];
+      for (i = 0; i < row.length; i++) {
+        c = alphabet.get_complement(i);
+        if (c < i) continue;
+        temp = row[i];
+        row[i] = row[c];
+        row[c] = temp;
+      }
+    }
+  }
+  return this; //allow function chaining...
+};
+
+Pspm.prototype.get_stack = function(position, alphabet, ssc) {
+  "use strict";
+  var row, stack_ic, alphabet_ic, stack, i, sym;
+  if (this.alph_length != alphabet.get_size_core()) {
+    throw new Error("The alphabet size does not match the size of the pspm.");
+  }
+  row = this.pspm[position];
+  stack_ic = this.get_stack_ic(position, alphabet);
+  if (ssc) stack_ic -= this.get_error(alphabet);
+  alphabet_ic = alphabet.get_ic();
+  stack = [];
+  for (i = 0; i < this.alph_length; i++) {
+    sym = new Symbol(i, row[i]*stack_ic/alphabet_ic, alphabet);
+    if (sym.get_scale() <= 0) {
+      continue;
+    }
+    stack.push(sym);
+  }
+  stack.sort(compare_symbol);
+  return stack;
+};
+
+Pspm.prototype.get_stack_ic = function(position, alphabet) {
+  "use strict";
+  var row, H, i;
+  if (this.alph_length != alphabet.get_size_core()) {
+    throw new Error("The alphabet size does not match the size fo the pspm.");
+  }
+  row = this.pspm[position];
+  H = 0;
+  for (i = 0; i < this.alph_length; i++) {
+    if (row[i] === 0) {
+      continue;
+    }
+    H -= (row[i] * (Math.log(row[i]) / Math.LN2));
+  }
+  return alphabet.get_ic() - H;
+};
+
+Pspm.prototype.get_error = function(alphabet) {
+  "use strict";
+  if (this.nsites === 0) {
+    return 0;
+  }
+  return (alphabet.get_size_core()-1) / (2 * Math.LN2 * this.nsites);
+};
+
+Pspm.prototype.get_motif_length = function() {
+  "use strict";
+  return this.motif_length;
+};
+
+Pspm.prototype.get_alph_length = function() {
+  "use strict";
+  return this.alph_length;
+};
+
+Pspm.prototype.get_left_trim = function() {
+  "use strict";
+  return this.ltrim;
+};
+
+Pspm.prototype.get_right_trim = function() {
+  "use strict";
+  return this.rtrim;
+};
+
+Pspm.prototype.as_best_match = function(alphabet) {
+  "use strict";
+  var match, odds, best_odds, best_index;
+  var i, j;
+  match = "";
+  for (i = 0; i < this.motif_length; i++) {
+    best_index = 0;
+    best_odds = this.pspm[i][0] / alphabet.get_bg_freq(0);
+    for (j = 1; j < this.alph_length; j++) {
+      odds = this.pspm[i][j] / alphabet.get_bg_freq(j);
+      if (odds > best_odds) {
+        best_odds = odds;
+        best_index = j;
+      }
+    }
+    match += alphabet.get_symbol(best_index);
+  }
+  return match;
+};
+
+Pspm.prototype.as_count_matrix = function() {
+  "use strict";
+  var count, count_text, text;
+  var i, j;
+  text = "";
+  for (i = 0; i < this.motif_length; i++) {
+    if (i !== 0) {
+      text += "\n";
+    }
+    for (j = 0; j < this.alph_length; j++) {
+      if (j !== 0) {
+        text += " ";
+      }
+      count = Math.round(this.nsites * this.pspm[i][j]);
+      count_text = "" + count;
+      // pad up to length of 4
+      if (count_text.length < 4) {
+        text += (new Array(5 - count_text.length)).join(" ") + count_text;
+      } else {
+        text += count_text;
+      }
+    }
+  }
+  return text; 
+};
+
+Pspm.prototype.as_probability_matrix = function() {
+  "use strict";
+  var text;
+  var i, j;
+  text = "";
+  for (i = 0; i < this.motif_length; i++) {
+    if (i !== 0) {
+      text += "\n";
+    }
+    for (j = 0; j < this.alph_length; j++) {
+      if (j !== 0) {
+        text += " ";
+      }
+      text += this.pspm[i][j].toFixed(6);
+    }
+  }
+  return text; 
+};
+
+Pspm.prototype.as_score_matrix = function(alphabet, pseudo) {
+  "use strict";
+  var me, score, out, row, col, score_text;
+  me = this;
+  if (typeof this.pssm === "undefined") {
+    if (!(typeof alphabet === "object" && alphabet != null && alphabet instanceof Alphabet)) {
+      throw new Error("The alphabet is required to generate the pssm.");
+    }
+    if (typeof pseudo === "undefined") {
+      pseudo = 0.01;
+    } else if (typeof pseudo !== "number" || pseudo < 0) {
+      throw new Error("Expected positive number for pseudocount");
+    }
+    score = function(row, col) {
+      "use strict";
+      var p, bg, p2;
+      p = me.pspm[row][col];
+      bg = alphabet.get_bg_freq(col);
+      p2 = (p * me.nsites + bg * pseudo) / (me.nsites + pseudo);
+      return (p2 > 0 ? Math.round((Math.log(p2 / bg) / Math.LN2) * 100) : -10000);
+    };
+  } else {
+    score = function(row, col) {
+      "use strict";
+      return me.pssm[row][col];
+    };
+  }
+  out = "";
+  for (row = 0; row < this.motif_length; row++) {
+    for (col = 0; col < this.alph_length; col++) {
+      if (col !== 0) {
+        out += " ";
+      }
+      score_text = "" + score(row, col);
+      // pad out to 6 characters
+      if (score_text.length < 6) {
+        out += (new Array(7 - score_text.length)).join(" ") + score_text;
+      } else {
+        out += score_text;
+      }
+    }
+    out += "\n";
+  }
+  return out;
+}
+
+Pspm.prototype.as_pspm = function() {
+  "use strict";
+  return "letter-probability matrix: alength= " + this.alph_length + 
+      " w= " + this.motif_length + " nsites= " + this.nsites + 
+      " E= " + (typeof this.evalue === "number" ? 
+          this.evalue.toExponential() : this.evalue) + "\n" +
+      this.as_probability_matrix();
+};
+
+Pspm.prototype.as_pssm = function(alphabet, pseudo) {
+  "use strict";
+  return "log-odds matrix: alength= " + this.alph_length + 
+      " w= " + this.motif_length + 
+      " E= " + (typeof this.evalue == "number" ?
+          this.evalue.toExponential() : this.evalue) + "\n" +
+      this.as_score_matrix(alphabet, pseudo);
+};
+
+Pspm.prototype.as_meme = function(options) {
+  var with_header, with_pspm, with_pssm, version, alphabet, bg_source, pseudocount, strands;
+  var out, alen, i;
+  // get the options
+  if (typeof options !== "object" || options === null) {
+    options = {};
+  }
+  with_header = (typeof options["with_header"] === "boolean" ? options["with_header"] : false);
+  with_pspm = (typeof options["with_pspm"] === "boolean" ? options["with_pspm"] : false);
+  with_pssm = (typeof options["with_pssm"] === "boolean" ? options["with_pssm"] : false);
+  if (!with_pspm && !with_pssm) with_pspm = true;
+  if (with_header) {
+    if (typeof options["version"] === "string" && /^\d+(?:\.\d+){0,2}$/.test(options["version"])) {
+      version = options["version"];
+    } else if (typeof options["version"] === "number") {
+      version = options["version"].toFixed(0);
+    } else {
+      version = "4";
+    }
+    if (typeof options["strands"] === "number" && options["strands"] === 1) {
+      strands = 1;
+    } else {
+      strands = 2;
+    }
+    if (typeof options["bg_source"] === "string") {
+      bg_source = options["bg_source"];
+    } else {
+      bg_source = "unknown source";
+    }
+    if (typeof options["alphabet"] === "object" && options["alphabet"] != null
+        && options["alphabet"] instanceof Alphabet) {
+      alphabet = options["alphabet"];
+    } else {
+      throw new Error("The alphabet is required to generate the header.");
+    }
+  }
+  // now create the output
+  out = "";
+  if (with_header) {
+    out = "MEME version " + version + "\n\n";
+    out += alphabet.as_meme() + "\n";
+    if (alphabet.has_complement()) { // assume DNA has both strands unless otherwise specified
+      out += "strands: " + (strands === 1 ? "+" : "+ -") + "\n\n";
+    }
+    out += "Background letter frequencies (from " + bg_source + "):\n";
+    alen = alphabet.get_size_core();
+    for (i = 0; i < alen; i++) {
+      if (i !== 0) {
+        if (i % 9 === 0) { // maximum of nine entries per line
+          out += "\n";
+        } else {
+          out += " ";
+        }
+      }
+      out += alphabet.get_symbol(i) + " " + alphabet.get_bg_freq(i).toFixed(3);
+    }
+  }
+  out += "\n\n";
+  out += "MOTIF " + this.name + (this.alt == null ? "" : " " + this.alt);
+  if (with_pssm) {
+    out += "\n\n";
+    out += this.as_pssm(options["alphabet"], options["pseudocount"]);
+  }
+  if (with_pspm) {
+    out += "\n\n";
+    out += this.as_pspm();
+  }
+  return out;
+}
+
+Pspm.prototype.toString = function() {
+  "use strict";
+  var str, i, row;
+  str = "";
+  for (i = 0; i < this.pspm.length; i++) {
+    row = this.pspm[i];
+    str += row.join("\t") + "\n";
+  }
+  return str;
+};
+
+function parse_pspm_properties(str) {
+  "use strict";
+  var parts, i, eqpos, before, after, properties, prop, num, num_re;
+  num_re = /^((?:[+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?)|inf)$/;
+  parts = trim(str).split(/\s+/);
+  // split up words containing =
+  for (i = 0; i < parts.length;) {
+    eqpos = parts[i].indexOf("=");
+    if (eqpos != -1) {
+      before = parts[i].substr(0, eqpos);
+      after = parts[i].substr(eqpos+1);
+      if (before.length > 0 && after.length > 0) {
+        parts.splice(i, 1, before, "=", after);
+        i += 3;
+      } else if (before.length > 0) {
+        parts.splice(i, 1, before, "=");
+        i += 2;
+      } else if (after.length > 0) {
+        parts.splice(i, 1, "=", after);
+        i += 2;
+      } else {
+        parts.splice(i, 1, "=");
+        i++;
+      }
+    } else {
+      i++;
+    }
+  }
+  properties = {};
+  for (i = 0; i < parts.length; i += 3) {
+    if (parts.length - i < 3) {
+      throw new Error("Expected PSPM property was incomplete. "+
+          "Remaing parts are: " + parts.slice(i).join(" "));
+    }
+    if (parts[i+1] !== "=") {
+      throw new Error("Expected '=' in PSPM property between key and " +
+          "value but got " + parts[i+1]); 
+    }
+    prop = parts[i].toLowerCase();
+    num = parts[i+2];
+    if (!num_re.test(num)) {
+      throw new Error("Expected numeric value for PSPM property '" + 
+          prop + "' but got '" + num + "'");
+    }
+    properties[prop] = num;
+  }
+  return properties;
+}
+
+function parse_pspm_string(pspm_string) {
+  "use strict";
+  var header_re, lines, first_line, line_num, col_num, alph_length, 
+      motif_length, nsites, evalue, pspm, i, line, match, props, parts,
+      j, prob;
+  header_re = /^letter-probability\s+matrix:(.*)$/i;
+  lines = pspm_string.split(/\n/);
+  first_line = true;
+  line_num = 0;
+  col_num = 0;
+  alph_length;
+  motif_length;
+  nsites;
+  evalue;
+  pspm = [];
+  for (i = 0; i < lines.length; i++) {
+    line = trim(lines[i]);
+    if (line.length === 0) { 
+      continue;
+    }
+    // check the first line for a header though allow matrices without it
+    if (first_line) {
+      first_line = false;
+      match = header_re.exec(line);
+      if (match !== null) {
+        props = parse_pspm_properties(match[1]);
+        if (props.hasOwnProperty("alength")) {
+          alph_length = parseFloat(props["alength"]);
+          if (alph_length != 4 && alph_length != 20) {
+            throw new Error("PSPM property alength should be 4 or 20" +
+                " but got " + alph_length);
+          }
+        }
+        if (props.hasOwnProperty("w")) {
+          motif_length = parseFloat(props["w"]);
+          if (motif_length % 1 !== 0 || motif_length < 1) {
+            throw new Error("PSPM property w should be an integer larger " +
+                "than zero but got " + motif_length);
+          }
+        }
+        if (props.hasOwnProperty("nsites")) {
+          nsites = parseFloat(props["nsites"]);
+          if (nsites <= 0) {
+            throw new Error("PSPM property nsites should be larger than " +
+                "zero but got " + nsites);
+          }
+        }
+        if (props.hasOwnProperty("e")) {
+          evalue = props["e"];
+          if (evalue < 0) {
+            throw new Error("PSPM property evalue should be " +
+                "non-negative but got " + evalue);
+          }
+        }
+        continue;
+      }
+    }
+    pspm[line_num] = [];
+    col_num = 0;
+    parts = line.split(/\s+/);
+    for (j = 0; j < parts.length; j++) {
+      prob = parseFloat(parts[j]);
+      if (prob != parts[j] || prob < 0 || prob > 1) {
+        throw new Error("Expected probability but got '" + parts[j] + "'"); 
+      }
+      pspm[line_num][col_num] = prob;
+      col_num++;
+    }
+    line_num++;
+  }
+  if (typeof motif_length === "number") {
+    if (pspm.length != motif_length) {
+      throw new Error("Expected PSPM to have a motif length of " + 
+          motif_length + " but it was actually " + pspm.length);
+    }
+  } else {
+    motif_length = pspm.length;
+  }
+  if (typeof alph_length !== "number") {
+    alph_length = pspm[0].length;
+    if (alph_length != 4 && alph_length != 20) {
+      throw new Error("Expected length of first row in the PSPM to be " +
+          "either 4 or 20 but got " + alph_length);
+    }
+  }
+  for (i = 0; i < pspm.length; i++) {
+    if (pspm[i].length != alph_length) {
+      throw new Error("Expected PSPM row " + i + " to have a length of " + 
+          alph_length + " but the length was " + pspm[i].length);
+    }
+  }
+  return {"pspm": pspm, "motif_length": motif_length, 
+    "alph_length": alph_length, "nsites": nsites, "evalue": evalue};
+}
+//======================================================================
+// end Pspm object
+//======================================================================
+
+//======================================================================
+// start Logo object
+//======================================================================
+
+var Logo = function(alphabet, options) {
+  "use strict";
+  this.alphabet = alphabet;
+  this.fine_text = "";
+  this.x_axis = 1;
+  this.y_axis = true;
+  this.xlate_nsyms = 1;
+  this.xlate_start = null;
+  this.xlate_end = null;
+  this.pspm_list = [];
+  this.pspm_column = [];
+  this.rows = 0;
+  this.columns = 0;
+  if (typeof options === "string") {
+    // the old method signature had fine_text here so we support that
+    this.fine_text = options;
+  } else if (typeof options === "object" && options != null) {
+    this.fine_text = (typeof options.fine_text === "string" ? options.fine_text : "");
+    this.x_axis = (typeof options.x_axis === "boolean" ? (options.x_axis ? 1 : 0) : 1);
+    if (options.x_axis_hidden != null && options.x_axis_hidden) this.x_axis = -1;
+    this.y_axis = (typeof options.y_axis === "boolean" ? options.y_axis : true);
+    this.xlate_nsyms = (typeof options.xlate_nsyms === "number" ? options.xlate_nsyms : this.xlate_nsyms);
+    this.xlate_start = (typeof options.xlate_start === "number" ? options.xlate_start : this.xlate_start);
+    this.xlate_end = (typeof options.xlate_end === "number" ? options.xlate_end : this.xlate_end);
+  }
+};
+
+Logo.prototype.add_pspm = function(pspm, column) {
+  "use strict";
+  var col;
+  if (typeof column === "undefined") {
+    column = 0;
+  } else if (column < 0) {
+    throw new Error("Column index out of bounds.");
+  }
+  this.pspm_list[this.rows] = pspm;
+  this.pspm_column[this.rows] = column;
+  this.rows++;
+  col = column + pspm.get_motif_length();
+  if (col > this.columns) {
+    this.columns = col;
+  }
+};
+
+Logo.prototype.get_columns = function() {
+  "use strict";
+  return this.columns;
+};
+
+Logo.prototype.get_xlate_nsyms = function() {
+  "use strict";
+  return this.xlate_nsyms;
+};
+
+Logo.prototype.get_xlate_start = function() {
+  "use strict";
+  return (this.xlate_start != null ? this.xlate_start : 0);
+};
+
+Logo.prototype.get_xlate_end = function() {
+  "use strict";
+  return (this.xlate_end != null ? this.xlate_end : this.columns * this.xlate_nsyms);
+};
+
+Logo.prototype.get_xlate_columns = function() {
+  "use strict";
+  return this.get_xlate_end() - this.get_xlate_start();
+};
+
+Logo.prototype.get_rows = function() {
+  "use strict";
+  return this.rows;
+};
+
+Logo.prototype.get_pspm = function(row_index) {
+  "use strict";
+  if (row_index < 0 || row_index >= this.rows) {
+    throw new Error("INDEX_OUT_OF_BOUNDS");
+  }
+  return this.pspm_list[row_index];
+};
+
+Logo.prototype.get_offset = function(row_index) {
+  "use strict";
+  if (row_index < 0 || row_index >= this.rows) {
+    throw new Error("INDEX_OUT_OF_BOUNDS");
+  }
+  return this.pspm_column[row_index];
+};
+
+Logo.prototype._as_eps_data = function(ssc, errbars) {
+  var i, j, pos, stack_pos, pspm, stack, sym, out;
+  out = "";
+  for (i = 0; i < this.rows; i++) {
+    out += "\nStartLine\n";
+    // Indent
+    for (j = 0; j < this.pspm_column[i]; j++) {
+      out += "() startstack\nendstack\n\n";
+    }
+    pspm = this.pspm_list[i];
+    if (pspm.get_left_trim() > 0) {
+      out += "MuteColour\nDrawTrimEdge\n" + pspm.get_left_trim() + " DrawTrimBg\n";
+    }
+    for (pos = 0; pos < pspm.get_motif_length(); pos++) {
+      if (pos != 0 && pos == pspm.get_left_trim()) { // enable full colour
+        out += "DrawTrimEdge\nRestoreColour\n";
+      } else if (pos == (pspm.get_motif_length() - pspm.get_right_trim())) {
+        out += "MuteColour\n" + pspm.get_right_trim() + " DrawTrimBg\n";
+      }
+      out += "(" + (pos + 1) + ") startstack\n";
+      stack = pspm.get_stack(pos, this.alphabet, ssc);
+      for (stack_pos = 0; stack_pos < stack.length; stack_pos++) {
+        sym = stack[stack_pos];
+        out += " " + (sym.get_scale() * this.alphabet.get_ic()) + " (" + sym.get_symbol() + ") numchar\n";
+      }
+      if (errbars) {
+        out += " " + pspm.get_error(this.alphabet) + " Ibeam\n";
+      }
+      out += "endstack\n\n";
+    }
+    if (pspm.get_right_trim() > 0 || pspm.get_left_trim() == pspm.get_motif_length()) {
+      out += "RestoreColour\n";
+    }
+    out += "EndLine\n";
+  }
+  return out;
+};
+
+Logo.prototype.as_eps = function(options) {
+  "use strict";
+  if (this.xlate_nsyms != 1) throw new Error("Unsupported setting xlate_nsyms for EPS");
+  if (this.xlate_start != null) throw new Error("Unsupported setting xlate_start for EPS");
+  if (this.xlate_end != null) throw new Error("Unsupported setting xlate_end for EPS");
+
+  var LOGOHEIGHT = 7.5; // default height of line in cm
+  var cm2pts, height, width, now, ssc, errbars;
+  if (typeof options === "undefined") {
+    options = {};
+  }
+  cm2pts = 72 / 2.54;
+  if (typeof options.logo_height == "number") {
+    height = options.logo_height;
+  } else {
+    height = LOGOHEIGHT * this.rows;
+  }
+  if (typeof options.logo_width == "number") {
+    width = options.logo_width;
+  } else {
+    width = this.columns + 2;
+  }
+  now = new Date();
+  ssc = (typeof options.ssc == "boolean" ? options.ssc : false);
+  errbars = (typeof options.show_error_bar == "boolean" ? options.show_error_bar : ssc);
+  var values = {
+    "LOGOHEIGHT": height,
+    "LOGOWIDTH": width,
+    "BOUNDINGHEIGHT": Math.round(height * cm2pts),
+    "BOUNDINGWIDTH": Math.round(width * cm2pts),
+    "LOGOLINEHEIGHT": (height / this.rows),
+    "CHARSPERLINE": this.columns,
+    "BARBITS": this.alphabet.get_ic(),
+    "LOGOTYPE": (this.alphabet.has_complement() ? "NA" : "AA"),
+    "CREATIONDATE": now.getDate() + "." + (now.getMonth() + 1) + "." + now.getFullYear() + " " + now.getHours() + ":" + now.getMinutes() + ":" + now.getSeconds(),
+    "ERRORBARFRACTION": (typeof options.error_bar_fraction == "number" ? options.error_bar_fraction : 1.0),
+    "TICBITS": (typeof options.ticbits == "number" ? options.ticbits : 1.0),
+    "TITLE": (typeof options.title == "string" ? options.title : ""),
+    "FINEPRINT": (typeof options.fineprint == "string" ? options.fineprint : this.fine_text),
+    "XAXISLABEL": (typeof options.xaxislabel == "string" ? options.xaxislabel : ""),
+    "YAXISLABEL": (typeof options.yaxislabel == "string" ? options.yaxislabel : "bits"),
+    "SSC": ssc,
+    "YAXIS": (typeof options.show_y_axis == "boolean" ? options.show_y_axis : this.y_axis),
+    "SHOWENDS": (typeof options.show_ends == "boolean" ? options.show_ends : false),
+    "ERRBAR": errbars,
+    "OUTLINE": (typeof options.show_outline == "boolean" ? options.show_outline : false),
+    "NUMBERING": (typeof options.show_numbering == "boolean" ? options.show_numbering : this.x_axis != 0),
+    "SHOWINGBOX": (typeof options.show_box == "boolean" ? options.show_box : false),
+    "CREATOR": (typeof options.creator == "string" ? options.creator : "motif_logo.js"),
+    "FONTSIZE": (typeof options.label_font_size == "number" ? options.label_font_size : 12),
+    "TITLEFONTSIZE": (typeof options.title_font_size == "number" ? options.title_font_size : 12),
+    "SMALLFONTSIZE": (typeof options.small_font_size == "number" ? options.small_font_size : 6),
+    "TOPMARGIN" : (typeof options.top_margin == "number" ? options.top_margin : 0.9),
+    "BOTTOMMARGIN": (typeof options.bottom_margin == "number" ? options.bottom_margin : 0.9),
+    "COLORDICT": this.alphabet._as_eps_dict(),
+    "DATA": this._as_eps_data(ssc, errbars)
+  };
+  // now this requires that the script containing the template has been imported!
+  return motif_logo_template(values);
+};
+
+//======================================================================
+// end Logo object
+//======================================================================
+
+// calculate the exact size (in pixels) of an object drawn on the
+// canvas assuming that the background of the canvas is transparent.
+function canvas_bounds(ctx, cwidth, cheight) {
+  "use strict";
+  var data, r, c, top_line, bottom_line, left_line, right_line, 
+      txt_width, txt_height;
+
+  // extract the image data
+  data = ctx.getImageData(0, 0, cwidth, cheight).data;
+
+  // set initial values
+  top_line = -1; bottom_line = -1; left_line = -1; right_line = -1;
+  txt_width = 0; txt_height = 0;
+
+  // Find the top-most line with a non-transparent pixel
+  for (r = 0; r < cheight; r++) {
+    for (c = 0; c < cwidth; c++) {
+      if (data[r * cwidth * 4 + c * 4 + 3]) {
+        top_line = r;
+        break;
+      }
+    }
+    if (top_line != -1) {
+      break;
+    }
+  }
+  
+  // Only bother looking if we found at least one set pixel... 
+  if (top_line != -1) {
+
+    //find the last line with a non-transparent pixel
+    for (r = cheight-1; r >= top_line; r--) {
+      for(c = 0; c < cwidth; c++) {
+        if(data[r * cwidth * 4 + c * 4 + 3]) {
+          bottom_line = r;
+          break;
+        }
+      }
+      if (bottom_line != -1) {
+        break;
+      }
+    }
+    // calculate height
+    txt_height = bottom_line - top_line + 1;
+
+    // Find the left-most line with a non-transparent pixel
+    for (c = 0; c < cwidth; c++) {
+      for (r = top_line; r <= bottom_line; r++) {
+        if (data[r * cwidth * 4 + c * 4 + 3]) {
+          left_line = c;
+          break;
+        }
+      }
+      if (left_line != -1) {
+        break;
+      }
+    }
+
+    //find the right most line with a non-transparent pixel
+    for (c = cwidth-1; c >= left_line; c--) {
+      for(r = top_line; r <= bottom_line; r++) {
+        if(data[r * cwidth * 4 + c * 4 + 3]) {
+          right_line = c;
+          break;
+        }
+      }
+      if (right_line != -1) {
+        break;
+      }
+    }
+    txt_width = right_line - left_line + 1;
+  }
+
+  //return the bounds
+  return {bound_top: top_line, bound_bottom: bottom_line, 
+    bound_left: left_line, bound_right: right_line, width: txt_width, 
+    height: txt_height};
+}
+
+//======================================================================
+// start RasterizedAlphabet
+//======================================================================
+
+// Rasterize Alphabet
+// 1) Measure width of text at default font for all symbols in alphabet
+// 2) sort in width ascending
+// 3) Drop the top and bottom 10% (designed to ignore outliers like 'W' and 'I')
+// 4) Calculate the average as the maximum scaling factor (designed to stop I becoming a rectangular blob).
+// 5) Assume scale of zero would result in width of zero, interpolate scale required to make perfect width font
+// 6) Draw text onto temp canvas at calculated scale
+// 7) Find bounds of drawn text
+// 8) Paint on to another canvas at the desired height (but only scaling width to fit if larger).
+var RasterizedAlphabet = function(alphabet, logo_scale, font, width) {
+  "use strict";
+  var default_size, safety_pad, canvas, ctx, middle, baseline, widths, sizes,
+      i, sym, size, tenpercent, avg_width, scale, 
+      target_width, target_height;
+  //variable prototypes
+  this.alphabet = alphabet;
+  this.scale = logo_scale;
+  this.sym_cache = {};
+  this.stack_num_cache = [];
+  this.scale_num_cache = [];
+  // size of canvas
+  default_size = 60; // size of measuring canvas
+  safety_pad = 20; // pixels to pad around so we don't miss the edges
+  // create a canvas to do our measuring
+  canvas = document.createElement("canvas");
+  if (!canvas.getContext) throw new Error("No canvas support");
+  canvas.width = default_size + 2 * safety_pad;
+  canvas.height = default_size + 2 * safety_pad;
+  middle = Math.round(canvas.width / 2);
+  baseline = Math.round(canvas.height - safety_pad);
+  ctx = canvas.getContext('2d');
+  if (!supports_text(ctx)) throw new Error("Canvas does not support text");
+  ctx.font = font;
+  ctx.textAlign = "center";
+  ctx.translate(middle, baseline);
+  // list of widths
+  widths = [];
+  sizes = [];
+  //now measure each letter in the alphabet
+  for (i = 0; i < alphabet.get_size_core(); ++i) {
+    // reset the canvas
+    ctx.clearRect(0, 0, canvas.width, canvas.height);
+    ctx.fillStyle = alphabet.get_colour(i);
+    // draw the test text
+    ctx.fillText(alphabet.get_symbol(i), 0, 0);
+    //measure
+    size = canvas_bounds(ctx, canvas.width, canvas.height);
+    if (size.width === 0) throw new Error("Invisible symbol!");
+    widths.push(size.width);
+    sizes[i] = size;
+  }
+  //sort the widths
+  widths.sort(function(a,b) {return a - b;});
+  //drop 10% of the items off each end
+  tenpercent = Math.floor(widths.length / 10);
+  for (i = 0; i < tenpercent; ++i) {
+    widths.pop();
+    widths.shift();
+  }
+  //calculate average width
+  avg_width = 0;
+  for (i = 0; i < widths.length; ++i) {
+    avg_width += widths[i];
+  }
+  avg_width /= widths.length;
+  // calculate the target width
+  target_width = width * this.scale * 2;
+  // calculate scales
+  for (i = 0; i < alphabet.get_size_core(); ++i) {
+    sym = alphabet.get_symbol(i);
+    size = sizes[i];
+    // calculate scale
+    scale = target_width / Math.max(avg_width, size.width);
+    // estimate scaled height
+    target_height = size.height * scale;
+    // create an appropriately sized canvas
+    canvas = document.createElement("canvas");
+    canvas.width = target_width;
+    canvas.height = target_height + safety_pad * 2;
+    // calculate the middle
+    middle = Math.round(canvas.width / 2);
+    // calculate the baseline
+    baseline = Math.round(canvas.height - safety_pad);
+    // get the context and prepare to draw the rasterized text
+    ctx = canvas.getContext('2d');
+    ctx.font = font;
+    ctx.fillStyle = alphabet.get_colour(i);
+    ctx.textAlign = "center";
+    ctx.translate(middle, baseline);
+    ctx.save();
+    ctx.scale(scale, scale);
+    // draw the text
+    ctx.fillText(sym, 0, 0);
+    ctx.restore();
+    this.sym_cache[sym] = {"image": canvas, "size": canvas_bounds(ctx, canvas.width, canvas.height)};
+  }
+};
+
+RasterizedAlphabet.prototype.get_alphabet = function() {
+  return this.alphabet;
+};
+
+RasterizedAlphabet.prototype.get_scale = function() {
+  return this.scale;
+};
+
+RasterizedAlphabet.prototype.draw_stack_sym = function(ctx, letter, dx, dy, dWidth, dHeight) {
+  "use strict";
+  var entry, image, size;
+  entry = this.sym_cache[letter];
+  image = entry.image;
+  size = entry.size;
+  ctx.drawImage(image, 0, size.bound_top -1, image.width, size.height+1, dx, dy, dWidth, dHeight);
+};
+
+RasterizedAlphabet.prototype.draw_stack_num = function(ctx, font, stack_width, index) {
+  var image, image_ctx, text_length;
+  if (index >= this.stack_num_cache.length) {
+    image = document.createElement("canvas");
+    // measure the text
+    image_ctx = image.getContext('2d');
+    image_ctx.save();
+    image_ctx.font = font;
+    text_length = image_ctx.measureText("" + (index + 1)).width;
+    image_ctx.restore();
+    // resize the canvas to fit
+    image.width = Math.ceil(stack_width);
+    image.height = Math.ceil(text_length);
+    // draw the text
+    image_ctx = image.getContext('2d');
+    image_ctx.translate(Math.round(stack_width / 2), 0);
+    image_ctx.font = font;
+    image_ctx.textBaseline = "middle";
+    image_ctx.textAlign = "right";
+    image_ctx.rotate(-(Math.PI / 2));
+    image_ctx.fillText("" + (index + 1), 0, 0);
+    this.stack_num_cache[index] = image;
+  } else {
+    image = this.stack_num_cache[index];
+  }
+  ctx.drawImage(image, 0, 0);
+}
+
+RasterizedAlphabet.prototype.draw_scale_num = function(ctx, font, num) {
+  var image, image_ctx, text_size, m_length;
+  if (num >= this.scale_num_cache.length) {
+    image = document.createElement("canvas");
+    // measure the text
+    image_ctx = image.getContext('2d');
+    image_ctx.font = font;
+    text_size = image_ctx.measureText("" + num);
+    if (text_size.actualBoundingBoxAscent && text_size.actualBoundingBoxDesent) {
+      // resize the canvas to fit
+      image.width = Math.ceil(text_size.width);
+      image.height = Math.ceil(text_size.actualBoundingBoxAscent + text_size.actualBoundingBoxDesent);
+      // draw the text
+      image_ctx = image.getContext('2d');
+      image_ctx.font = font;
+      image_ctx.textAlign = "right";
+      image_ctx.fillText("" + num, image.width, text_size.actualBoundingBoxAscent);
+    } else {
+      // measure width of 'm' to approximate height, we double it later anyway
+      m_length = image_ctx.measureText("m").width;
+      // resize the canvas to fit
+      image.width = Math.ceil(text_size.width);
+      image.height = Math.ceil(2 * m_length);
+      // draw the text
+      image_ctx = image.getContext('2d');
+      image_ctx.font = font;
+      image_ctx.textAlign = "right";
+      image_ctx.textBaseline = "middle";
+      image_ctx.fillText("" + num, image.width, m_length);
+    }
+    this.scale_num_cache[num] = image;
+  } else {
+    image = this.scale_num_cache[num];
+  }
+  ctx.drawImage(image, -image.width, -Math.round(image.height / 2))
+}
+
+//======================================================================
+// end RasterizedAlphabet
+//======================================================================
+
+//======================================================================
+// start LogoMetrics object
+//======================================================================
+
+var LogoMetrics = function(ctx, logo_columns, logo_rows, has_names, has_finetext, x_axis, y_axis) {
+  "use strict";
+  var i, row_height;
+  //variable prototypes
+  this.pad_top = (has_names ? 5 : 0);
+  this.pad_left = (y_axis ? 10 : 0);
+  this.pad_right = (has_finetext ? 15 : 0);
+  this.pad_bottom = 0;
+  this.pad_middle = 20;
+  this.name_height = 14;
+  this.name_font = "bold " + this.name_height + "px Times, sans-serif";
+  this.name_spacer = 0;
+  this.y_axis = y_axis;
+  this.y_label = "bits";
+  this.y_label_height = 12;
+  this.y_label_font = "bold " + this.y_label_height + "px Helvetica, sans-serif";
+  this.y_label_spacer = 3;
+  this.y_num_height = 12;
+  this.y_num_width = 0;
+  this.y_num_font = "bold " + this.y_num_height + "px Helvetica, sans-serif";
+  this.y_tic_width = 5;
+  this.stack_pad_left = 0;
+  this.stack_font = "bold 25px Helvetica, sans-serif";
+  this.stack_height = 90;
+  this.stack_width = 26;
+  this.stacks_pad_right = 5;
+  this.x_axis = x_axis;
+  this.x_num_above = 2;
+  this.x_num_height = 12;
+  this.x_num_width = 0;
+  this.x_num_font = "bold " + this.x_num_height + "px Helvetica, sans-serif";
+  this.fine_txt_height = 6;
+  this.fine_txt_above = 2;
+  this.fine_txt_font = "normal " + this.fine_txt_height + "px Helvetica, sans-serif";
+  this.letter_metrics = new Array();
+  this.summed_width = 0;
+  this.summed_height = 0;
+  //calculate the width of the y axis numbers
+  ctx.font = this.y_num_font;
+  for (i = 0; i <= 2; i++) {
+    this.y_num_width = Math.max(this.y_num_width, ctx.measureText("" + i).width);
+  }
+  //calculate the width of the x axis numbers (but they are rotated so it becomes height)
+  if (x_axis == 1) {
+    ctx.font = this.x_num_font;
+    for (i = 1; i <= logo_columns; i++) {
+      this.x_num_width = Math.max(this.x_num_width, ctx.measureText("" + i).width);
+    }
+  } else if (x_axis == 0) {
+    this.x_num_height = 4;
+    this.x_num_width = 4;
+  } else {
+    this.x_num_height = 0;
+    this.x_num_width = 0;
+  }
+  
+  //calculate how much vertical space we want to draw this
+  //first we add the padding at the top and bottom since that's always there
+  this.summed_height += this.pad_top + this.pad_bottom;
+  //all except the last row have the same amount of space allocated to them
+  if (logo_rows > 1) {
+    row_height = this.stack_height + this.pad_middle;
+    if (has_names) {
+      row_height += this.name_height;
+      //the label is allowed to overlap into the spacer
+      row_height += Math.max(this.y_num_height/2, this.name_spacer); 
+      //the label is allowed to overlap the space used by the other label
+      row_height += Math.max(this.y_num_height/2, this.x_num_height + this.x_num_above); 
+    } else {
+      row_height += this.y_num_height/2; 
+      //the label is allowed to overlap the space used by the other label
+      row_height += Math.max(this.y_num_height/2, this.x_num_height + this.x_num_above); 
+    }
+    this.summed_height += row_height * (logo_rows - 1);
+  }
+  //the last row has the name and fine text below it but no padding
+  this.summed_height += this.stack_height + (this.y_axis ? this.y_num_height/2 : 0);
+
+  var fine_txt_total = (has_finetext ? this.fine_txt_height + this.fine_txt_above : 0);
+  if (has_names) {
+    this.summed_height += fine_txt_total + this.name_height;
+    this.summed_height += Math.max((this.y_axis ? this.y_num_height/2 : 0), 
+        this.x_num_height + this.x_num_above + this.name_spacer);
+  } else {
+    this.summed_height += Math.max((this.y_axis ? this.y_num_height/2 : 0), 
+        this.x_num_height + this.x_num_above + fine_txt_total);
+  }
+
+  //calculate how much horizontal space we want to draw this
+  //first add the padding at the left and right since that's always there
+  this.summed_width += this.pad_left + this.pad_right;
+  if (this.y_axis) {
+    //add on the space for the y-axis label
+    this.summed_width += this.y_label_height + this.y_label_spacer;
+    //add on the space for the y-axis
+    this.summed_width += this.y_num_width + this.y_tic_width;
+  }
+  //add on the space for the stacks
+  this.summed_width += (this.stack_pad_left + this.stack_width) * logo_columns;
+  //add on the padding after the stacks (an offset from the fine text)
+  this.summed_width += this.stacks_pad_right;
+
+};
+
+//======================================================================
+// end LogoMetrics object
+//======================================================================
+
+//found this trick at http://talideon.com/weblog/2005/02/detecting-broken-images-js.cfm
+function image_ok(img) {
+  "use strict";
+  // During the onload event, IE correctly identifies any images that
+  // weren't downloaded as not complete. Others should too. Gecko-based
+  // browsers act like NS4 in that they report this incorrectly.
+  if (!img.complete) {
+    return false;
+  }
+  // However, they do have two very useful properties: naturalWidth and
+  // naturalHeight. These give the true size of the image. If it failed
+  // to load, either of these should be zero.
+  if (typeof img.naturalWidth !== "undefined" && img.naturalWidth === 0) {
+    return false;
+  }
+  // No other way of checking: assume it's ok.
+  return true;
+}
+  
+function supports_text(ctx) {
+  "use strict";
+  if (!ctx.fillText) {
+    return false;
+  }
+  if (!ctx.measureText) {
+    return false;
+  }
+  return true;
+}
+
+//draws the scale, returns the width
+function draw_scale(ctx, metrics, alphabet_ic, raster) {
+  "use strict";
+  var tic_height, i;
+  tic_height = metrics.stack_height / alphabet_ic;
+  ctx.save();
+  ctx.translate(metrics.y_label_height, metrics.y_num_height/2);
+  //draw the axis label
+  ctx.save();
+  ctx.font = metrics.y_label_font;
+  ctx.translate(0, metrics.stack_height/2);
+  ctx.rotate(-(Math.PI / 2));
+  ctx.textAlign = "center";
+  ctx.fillText("bits", 0, 0);
+  ctx.restore();
+
+  ctx.translate(metrics.y_label_spacer + metrics.y_num_width, 0);
+
+  //draw the axis tics
+  ctx.save();
+  ctx.translate(0, metrics.stack_height);
+  for (i = 0; i <= alphabet_ic; i++) {
+    //draw the number
+    ctx.save();
+    ctx.translate(-1, 0);
+    raster.draw_scale_num(ctx, metrics.y_num_font, i);
+    ctx.restore();
+    //draw the tic
+    ctx.fillRect(0, -1, metrics.y_tic_width, 2);
+    //prepare for next tic
+    ctx.translate(0, -tic_height);
+  }
+  ctx.restore();
+
+  ctx.fillRect(metrics.y_tic_width - 2, 0, 2, metrics.stack_height)
+
+  ctx.restore();
+}
+
+function draw_stack_num(ctx, metrics, row_index, raster) {
+  "use strict";
+  ctx.save();
+  ctx.translate(0, Math.round(metrics.stack_height + metrics.x_num_above));
+  if (metrics.x_axis == 1) {
+    raster.draw_stack_num(ctx, metrics.x_num_font, metrics.stack_width, row_index);
+  } else if (metrics.x_axis == 0) {
+    // draw dots instead of the numbers (good for small logos)
+    ctx.beginPath();
+    var radius = Math.round(metrics.x_num_height / 2);
+    ctx.arc(Math.round(metrics.stack_width / 2), radius, radius, 0, 2 * Math.PI, false);
+    ctx.fill();
+  }
+  ctx.restore();
+}
+
+function draw_stack(ctx, metrics, symbols, raster) {
+  "use strict";
+  var preferred_pad, sym_min, i, sym, sym_height, pad;
+  preferred_pad = 0;
+  sym_min = 5;
+
+  ctx.save();//1
+  ctx.translate(0, metrics.stack_height);
+  for (i = 0; i < symbols.length; i++) {
+    sym = symbols[i];
+    sym_height = metrics.stack_height * sym.get_scale();
+    
+    pad = preferred_pad;
+    if (sym_height - pad < sym_min) {
+      pad = Math.min(pad, Math.max(0, sym_height - sym_min));
+    }
+    sym_height -= pad;
+
+    //translate to the correct position
+    ctx.translate(0, -(pad/2 + sym_height));
+
+    //draw
+    raster.draw_stack_sym(ctx, sym.get_symbol(), 0, 0, metrics.stack_width, sym_height);
+    //translate past the padding
+    ctx.translate(0, -(pad/2));
+  }
+  ctx.restore();//1
+}
+
+function draw_dashed_line(ctx, pattern, start, x1, y1, x2, y2) {
+  "use strict";
+  var x, y, len, i, dx, dy, tlen, theta, mulx, muly, lx, ly;
+  dx = x2 - x1;
+  dy = y2 - y1;
+  tlen = Math.pow(dx*dx + dy*dy, 0.5);
+  theta = Math.atan2(dy,dx);
+  mulx = Math.cos(theta);
+  muly = Math.sin(theta);
+  lx = [];
+  ly = [];
+  for (i = 0; i < pattern; ++i) {
+    lx.push(pattern[i] * mulx);
+    ly.push(pattern[i] * muly);
+  }
+  i = start;
+  x = x1;
+  y = y1;
+  len = 0;
+  ctx.beginPath();
+  while (len + pattern[i] < tlen) {
+    ctx.moveTo(x, y);
+    x += lx[i];
+    y += ly[i];
+    ctx.lineTo(x, y);
+    len += pattern[i];
+    i = (i + 1) % pattern.length;
+    x += lx[i];
+    y += ly[i];
+    len += pattern[i];
+    i = (i + 1) % pattern.length;
+  }
+  if (len < tlen) {
+    ctx.moveTo(x, y);
+    x += mulx * (tlen - len);
+    y += muly * (tlen - len);
+    ctx.lineTo(x, y);
+  }
+  ctx.stroke();
+}
+
+function draw_trim_background(ctx, metrics, left_start, left_end, left_divider, right_start, right_end, right_divider) {
+  "use strict";
+  var left_size = left_end - left_start;
+  var right_size = right_end - right_start;
+  var line_x;
+
+  ctx.save();//s8
+  ctx.fillStyle = "rgb(240, 240, 240)";
+  if (left_size > 0) {
+    ctx.fillRect(left_start * metrics.stack_width, 0, left_size * metrics.stack_width, metrics.stack_height);
+  }
+  if (right_size > 0) {
+    ctx.fillRect(right_start * metrics.stack_width, 0, right_size * metrics.stack_width, metrics.stack_height);
+  }
+  ctx.fillStyle = "rgb(51, 51, 51)";
+  if (left_size > 0 && left_divider) {
+    line_x = (left_end * metrics.stack_width) - 0.5;
+    draw_dashed_line(ctx, [3], 0, line_x, 0, line_x, metrics.stack_height);
+  }
+  if (right_size > 0 && right_divider) {
+    line_x = (right_start * metrics.stack_width) + 0.5;
+    draw_dashed_line(ctx, [3], 0, line_x, 0, line_x, metrics.stack_height);
+  }
+  ctx.restore();//s8
+}
+
+function size_logo_on_canvas(logo, canvas, show_names, scale) {
+  "use strict";
+  var draw_name, draw_finetext, metrics;
+  draw_name = (typeof show_names === "boolean" ? show_names : (logo.get_rows() > 1));
+  draw_finetext = (logo.fine_text.length > 0);
+  if (canvas.width !== 0 && canvas.height !== 0) {
+    return;
+  }
+  metrics = new LogoMetrics(canvas.getContext('2d'), 
+      logo.get_xlate_columns(), logo.get_rows(), draw_name, draw_finetext, logo.x_axis, logo.y_axis);
+  if (typeof scale == "number") {
+    //resize the canvas to fit the scaled logo
+    canvas.width = metrics.summed_width * scale;
+    canvas.height = metrics.summed_height * scale;
+  } else {
+    if (canvas.width === 0 && canvas.height === 0) {
+      canvas.width = metrics.summed_width;
+      canvas.height = metrics.summed_height;
+    } else if (canvas.width === 0) {
+      canvas.width = metrics.summed_width * (canvas.height / metrics.summed_height);
+    } else if (canvas.height === 0) {
+      canvas.height = metrics.summed_height * (canvas.width / metrics.summed_width);
+    }
+  }
+}
+
+function draw_logo_on_canvas(logo, canvas, show_names, scale) {
+  "use strict";
+  var i, draw_name, draw_finetext, ctx, metrics, raster, pspm_i, pspm, 
+      offset, col_index, motif_position, ssc;
+  ssc = false;
+  draw_name = (typeof show_names === "boolean" ? show_names : (logo.get_rows() > 1));
+  draw_finetext = (logo.fine_text.length > 0);
+  ctx = canvas.getContext('2d');
+  //assume that the user wants the canvas scaled equally so calculate what the best width for this image should be
+  metrics = new LogoMetrics(ctx, logo.get_xlate_columns(), logo.get_rows(), draw_name, draw_finetext, logo.x_axis, logo.y_axis);
+  if (typeof scale == "number") {
+    //resize the canvas to fit the scaled logo
+    canvas.width = metrics.summed_width * scale;
+    canvas.height = metrics.summed_height * scale;
+  } else {
+    if (canvas.width === 0 && canvas.height === 0) {
+      scale = 1;
+      canvas.width = metrics.summed_width;
+      canvas.height = metrics.summed_height;
+    } else if (canvas.width === 0) {
+      scale = canvas.height / metrics.summed_height;
+      canvas.width = metrics.summed_width * scale;
+    } else if (canvas.height === 0) {
+      scale = canvas.width / metrics.summed_width;
+      canvas.height = metrics.summed_height * scale;
+    } else {
+      scale = Math.min(canvas.width / metrics.summed_width, canvas.height / metrics.summed_height);
+    }
+  }
+  // cache the raster based on the assumption that we will be drawing a lot
+  // of logos the same size and alphabet
+  if (typeof draw_logo_on_canvas.raster_cache === "undefined") {
+    draw_logo_on_canvas.raster_cache = [];
+  }
+  for (i = 0; i < draw_logo_on_canvas.raster_cache.length; i++) {
+    raster = draw_logo_on_canvas.raster_cache[i];
+    if (raster.get_alphabet().equals(logo.alphabet) &&
+        Math.abs(raster.get_scale() - scale) < 0.1) break;
+    raster = null;
+  }
+  if (raster == null) {
+    raster = new RasterizedAlphabet(logo.alphabet, scale, metrics.stack_font, metrics.stack_width);
+    draw_logo_on_canvas.raster_cache.push(raster);
+  }
+  ctx = canvas.getContext('2d');
+  ctx.save();//s1
+  ctx.scale(scale, scale);
+  ctx.save();//s2
+  ctx.save();//s7
+  //create margin
+  ctx.translate(Math.round(metrics.pad_left), Math.round(metrics.pad_top));
+  for (pspm_i = 0; pspm_i < logo.get_rows(); ++pspm_i) {
+    pspm = logo.get_pspm(pspm_i);
+    offset = logo.get_offset(pspm_i);
+    //optionally draw name if this isn't the last row or is the only row 
+    if (draw_name && (logo.get_rows() == 1 || pspm_i != (logo.get_rows()-1))) {
+      ctx.save();//s4
+      ctx.translate(Math.round(metrics.summed_width/2), Math.round(metrics.name_height));
+      ctx.font = metrics.name_font;
+      ctx.textAlign = "center";
+      ctx.fillText(pspm.name, 0, 0);
+      ctx.restore();//s4
+      ctx.translate(0, Math.round(metrics.name_height + 
+          Math.min(0, metrics.name_spacer - metrics.y_num_height/2)));
+    }
+    //draw scale
+    if (logo.y_axis) draw_scale(ctx, metrics, logo.alphabet.get_ic(), raster);
+    ctx.save();//s5
+    //translate across past the scale
+    if (logo.y_axis) {
+      ctx.translate(Math.round(metrics.y_label_height + metrics.y_label_spacer + 
+        metrics.y_num_width + metrics.y_tic_width), Math.round(metrics.y_num_height / 2));
+    }
+    //draw the trimming background
+    if (pspm.get_left_trim() > 0 || pspm.get_right_trim() > 0) {
+      var left_start = offset * logo.get_xlate_nsyms();
+      var left_end = (offset + pspm.get_left_trim()) * logo.get_xlate_nsyms();
+      var left_divider = true;
+      if (left_end < logo.get_xlate_start() || left_start > logo.get_xlate_end()) {
+        // no overlap
+        left_start = 0;
+        left_end = 0;
+        left_divider = false;
+      } else {
+        if (left_start < logo.get_xlate_start()) {
+          left_start = logo.get_xlate_start();
+        }
+        if (left_end > logo.get_xlate_end()) {
+          left_end = logo.get_xlate_end();
+          left_divider = false;
+        }
+        left_start -= logo.get_xlate_start();
+        left_end -= logo.get_xlate_start();
+        if (left_end < left_start) {
+          left_start = 0;
+          left_end = 0;
+          left_divider = false;
+        }
+      }
+      var right_end = (offset + pspm.get_motif_length()) * logo.get_xlate_nsyms();
+      //var right_start = right_end - (pspm.get_left_trim() * logo.get_xlate_nsyms());
+      var right_start = right_end - (pspm.get_right_trim() * logo.get_xlate_nsyms());
+      var right_divider = true;
+      if (right_end < logo.get_xlate_start() || right_start > logo.get_xlate_end()) {
+        // no overlap
+        right_start = 0;
+        right_end = 0;
+        right_divider = false;
+      } else {
+        if (right_start < logo.get_xlate_start()) {
+          right_start = logo.get_xlate_start();
+          right_divider = false;
+        }
+        if (right_end > logo.get_xlate_end()) {
+          right_end = logo.get_xlate_end();
+        }
+        right_start -= logo.get_xlate_start();
+        right_end -= logo.get_xlate_start();
+        if (right_end < right_start) {
+          right_start = 0;
+          right_end = 0;
+          right_divider = false;
+        }
+      }
+      draw_trim_background(ctx, metrics, left_start, left_end, left_divider, right_start, right_end, right_divider);
+    }
+    //draw letters
+    var xlate_col;
+    for (xlate_col = logo.get_xlate_start(); xlate_col < logo.get_xlate_end(); xlate_col++) {
+      ctx.translate(metrics.stack_pad_left,0);
+      col_index = Math.floor(xlate_col / logo.get_xlate_nsyms());
+      if (xlate_col % logo.get_xlate_nsyms() == 0) {
+        if (col_index >= offset && col_index < (offset + pspm.get_motif_length())) {
+          motif_position = col_index - offset;
+          draw_stack_num(ctx, metrics, motif_position, raster);
+          draw_stack(ctx, metrics, pspm.get_stack(motif_position, logo.alphabet, ssc), raster);
+        }
+      } else {
+        if (col_index >= offset && col_index < (offset + pspm.get_motif_length())) {
+          ctx.save();// s5.1
+          ctx.translate(0, Math.round(metrics.stack_height));
+          // TODO draw a dot or dash or something to indicate continuity of the motif
+          ctx.restore(); //s5.1
+        }
+      }
+      ctx.translate(Math.round(metrics.stack_width), 0);
+    }
+    ctx.restore();//s5
+    ////optionally draw name if this is the last row but isn't the only row 
+    if (draw_name && (logo.get_rows() != 1 && pspm_i == (logo.get_rows()-1))) {
+      //translate vertically past the stack and axis's        
+      ctx.translate(0, metrics.y_num_height/2 + metrics.stack_height + 
+          Math.max(metrics.y_num_height/2, metrics.x_num_above + metrics.x_num_width + metrics.name_spacer));
+
+      ctx.save();//s6
+      ctx.translate(metrics.summed_width/2, metrics.name_height);
+      ctx.font = metrics.name_font;
+      ctx.textAlign = "center";
+      ctx.fillText(pspm.name, 0, 0);
+      ctx.restore();//s6
+      ctx.translate(0, metrics.name_height);
+    } else {
+      //translate vertically past the stack and axis's        
+      ctx.translate(0, metrics.y_num_height/2 + metrics.stack_height + 
+          Math.max(metrics.y_num_height/2, metrics.x_num_above + metrics.x_num_width));
+    }
+    //if not the last row then add middle padding
+    if (pspm_i != (logo.get_rows() -1)) {
+      ctx.translate(0, metrics.pad_middle);
+    }
+  }
+  ctx.restore();//s7
+  if (logo.fine_text.length > 0) {
+    ctx.translate(metrics.summed_width - metrics.pad_right, metrics.summed_height - metrics.pad_bottom);
+    ctx.font = metrics.fine_txt_font;
+    ctx.textAlign = "right";
+    ctx.fillText(logo.fine_text, 0,0);
+  }
+  ctx.restore();//s2
+  ctx.restore();//s1
+}
+
+function create_canvas(c_width, c_height, c_id, c_title, c_display) {
+  "use strict";
+  var canvas = document.createElement("canvas");
+  //check for canvas support before attempting anything
+  if (!canvas.getContext) {
+    return null;
+  }
+  var ctx = canvas.getContext('2d');
+  //check for html5 text drawing support
+  if (!supports_text(ctx)) {
+    return null;
+  }
+  //size the canvas
+  canvas.width = c_width;
+  canvas.height = c_height;
+  canvas.id = c_id;
+  canvas.title = c_title;
+  canvas.style.display = c_display;
+  return canvas;
+}
+
+function logo_1(alphabet, fine_text, pspm) {
+  "use strict";
+  var logo = new Logo(alphabet, fine_text);
+  logo.add_pspm(pspm);
+  return logo;
+}
+
+function logo_2(alphabet, fine_text, target, query, query_offset) {
+  "use strict";
+  var logo = new Logo(alphabet, fine_text);
+  if (query_offset < 0) {
+    logo.add_pspm(target, -query_offset);
+    logo.add_pspm(query);
+  } else {
+    logo.add_pspm(target);
+    logo.add_pspm(query, query_offset);
+  }      
+  return logo;
+}
+
+/*
+ * Specifies an alternate source for an image.
+ * If the image with the image_id specified has
+ * not loaded then a generated logo will be used 
+ * to replace it.
+ *
+ * Note that the image must either have dimensions
+ * or a scale must be set.
+ */
+function alternate_logo(logo, image_id, scale) {
+  "use strict";
+  var image = document.getElementById(image_id);
+  if (!image) {
+    alert("Can't find specified image id (" +  image_id + ")");
+    return;
+  }
+  //if the image has loaded then there is no reason to use the canvas
+  if (image_ok(image)) {
+    return;
+  }
+  //the image has failed to load so replace it with a canvas if we can.
+  var canvas = create_canvas(image.width, image.height, image_id, image.title, image.style.display);
+  if (canvas === null) {
+    return;
+  }
+  //draw the logo on the canvas
+  draw_logo_on_canvas(logo, canvas, null, scale);
+  //replace the image with the canvas
+  image.parentNode.replaceChild(canvas, image);
+}
+
+/*
+ * Specifes that the element with the specified id
+ * should be replaced with a generated logo.
+ */
+function replace_logo(logo, replace_id, scale, title_txt, display_style) {
+  "use strict";
+  var element = document.getElementById(replace_id);
+  if (!replace_id) {
+    alert("Can't find specified id (" + replace_id + ")");
+    return;
+  }
+  //found the element!
+  var canvas = create_canvas(50, 120, replace_id, title_txt, display_style);
+  if (canvas === null) {
+    return;
+  }
+  //draw the logo on the canvas
+  draw_logo_on_canvas(logo, canvas, null, scale);
+  //replace the element with the canvas
+  element.parentNode.replaceChild(canvas, element);
+}
+
+/*
+ * Fast string trimming implementation found at
+ * http://blog.stevenlevithan.com/archives/faster-trim-javascript
+ *
+ * Note that regex is good at removing leading space but
+ * bad at removing trailing space as it has to first go through
+ * the whole string.
+ */
+function trim (str) {
+  "use strict";
+  var ws, i;
+  str = str.replace(/^\s\s*/, '');
+  ws = /\s/; i = str.length;
+  while (ws.test(str.charAt(--i)));
+  return str.slice(0, i + 1);
+}
+</script>
+    <script>
+var current_motif = 0;
+var dreme_alphabet = new Alphabet(data.alphabet, data.control_db.freqs);
+
+/*
+ * Create a pspm for the given motif data
+ */
+function motif_pspm(m) {
+  return new Pspm(m.pwm, m.id, 0, 0, m.nsites, m.evalue);
+}
+
+/*
+ * Create a count matrix from the given motif data
+ */
+function motif_count_matrix(motif) {
+  return motif_pspm(motif).as_count_matrix();
+}
+
+/*
+ * Create a probablity matrix from the given motif data
+ */
+function motif_prob_matrix(motif) {
+  return motif_pspm(motif).as_probability_matrix();
+}
+
+/*
+ * Create a minimal meme format motif from the given motif data
+ */
+function motif_minimal_meme(motif) {
+  return motif_pspm(motif).as_meme({
+    "with_header": true, 
+    "with_pspm": true,
+    "with_pssm": false,
+    "version": data["version"],
+    "alphabet": dreme_alphabet,
+    "strands": (data.options.revcomp ? 2 : 1)
+  });
+}
+
+/*
+ * Fill in a template variable
+ */
+function set_tvar(template, tvar, value) {
+  var node;
+  node = find_child(template, tvar);
+  if (node === null) {
+    throw new Error("Template does not contain variable " + tvar);
+  }
+  node.innerHTML = "";
+  if (typeof value !== "object") {
+    node.appendChild(document.createTextNode(value));
+  } else {
+    node.appendChild(value);
+  }
+}
+
+/*
+ * Make a canvas with the motif logo drawn on it. 
+ */
+function make_logo(motif, height, rc) {
+  var pspm = new Pspm(motif["pwm"]);
+  if (rc) pspm = pspm.copy().reverse_complement(dreme_alphabet);
+  var logo = new Logo(dreme_alphabet);
+  logo.add_pspm(pspm, 0);
+  var canvas = document.createElement('canvas');
+  canvas.height = height;
+  canvas.width = 0;
+  draw_logo_on_canvas(logo, canvas, false);
+  return canvas;
+}
+
+/*
+ * Create a button designed to contain a single symbol
+ */
+function make_sym_btn(symbol, title, action) {
+  var box, sbox;
+  box = document.createElement("div");
+  box.tabIndex = 0;
+  box.className = "sym_btn";
+  sbox = document.createElement("span");
+  if (typeof symbol == "string") {
+    sbox.appendChild(document.createTextNode(symbol));
+  } else {
+    sbox.appendChild(symbol);
+  }
+  box.appendChild(sbox);
+  box.title = title;
+  box.addEventListener('click', action, false);
+  box.addEventListener('keydown', action, false);
+  return box;
+}
+
+/*
+ * Create a pair of text spans with different classes.
+ * This is useful when using CSS to only display one of them.
+ */
+function text_pair(txt1, cls1, txt2, cls2) {
+  var container, part1, part2;
+  container = document.createElement("span");
+  part1 = document.createElement("span");
+  part1.appendChild(document.createTextNode(txt1));
+  part1.className = cls1;
+  container.appendChild(part1);
+  part2 = document.createElement("span");
+  part2.appendChild(document.createTextNode(txt2));
+  part2.className = cls2;
+  container.appendChild(part2);
+  return container;
+}
+
+/*
+ * Make a colourised sequence.
+ */
+function make_seq(seq) {
+  var i, j, letter, lbox, sbox;
+  sbox = document.createElement("span");
+  for (i = 0; i < seq.length; i = j) {
+    letter = seq.charAt(i);
+    for (j = i+1; j < seq.length; j++) {
+      if (seq.charAt(j) !== letter) {
+        break;
+      }
+    }
+    lbox = document.createElement("span");
+    lbox.style.color = dreme_alphabet.get_colour(dreme_alphabet.get_index(letter));
+    lbox.appendChild(document.createTextNode(seq.substring(i, j)));
+    sbox.appendChild(lbox);
+  }
+  return sbox;
+}
+
+/*
+ * Create a description element taking into account the newlines in the source text.
+ */
+function make_description(text) {
+  var i, j, lines, p;
+  var container = document.createElement("div");
+  var paragraphs = text.split(/\n\n+/);
+  for (i = 0; i < paragraphs.length; i++) {
+    lines = paragraphs[i].split(/\n/);
+    p = document.createElement("p");
+    p.appendChild(document.createTextNode(lines[0]));
+    for (j = 1; j < lines.length; j++) {
+      p.appendChild(document.createElement("br"));
+      p.appendChild(document.createTextNode(lines[j]));
+    }
+    container.appendChild(p);
+  }
+  return container;
+}
+
+/*
+ * Make the table header for the discovered motifs.
+ */
+function make_motif_header() {
+  var row = document.createElement("tr");
+  add_text_header_cell(row, "", "", "motif_ordinal");
+  add_text_header_cell(row, "Motif", "pop_motifs_word", "motif_word");
+  add_text_header_cell(row, "Logo", "pop_motifs_logo", "motif_logo");
+  if (data.options.revcomp) {
+    add_text_header_cell(row, "RC Logo", "pop_motifs_rc_logo", "motif_logo");
+  }
+  add_text_header_cell(row, "E-value", "pop_motifs_evalue", "motif_evalue");
+  add_text_header_cell(row, "Unerased E-value", "pop_motifs_uevalue", "motif_evalue");
+  add_text_header_cell(row, "More", "pop_more", "motif_more");
+  add_text_header_cell(row, "Submit/Download", "pop_submit_dl", "motif_submit");
+  row.className = "more";
+  return row;
+}
+
+/*
+ * Make a compact motif summary row for the discovered motifs.
+ */
+function make_motif_row(tbody, ordinal, motif) {
+  var row = document.createElement("tr");
+  add_text_cell(row, "" + ordinal + ".", "motif_ordinal");
+  add_text_cell(row, motif["id"], "motif_word");
+  add_cell(row, make_logo(motif, 50, false), "motif_logo");
+  if (data.options.revcomp) {
+    add_cell(row, make_logo(motif, 50, true), "motif_logo");
+  }
+  add_text_cell(row, motif["evalue"], "motif_evalue");
+  add_text_cell(row, motif["unerased_evalue"], "motif_evalue");
+  add_cell(row, make_sym_btn(text_pair("\u21A7", "less", "\u21A5", "more"), "Show more information.", function(e) { toggle_class(tbody, "collapsed"); }, "\u21A5", ""), "motif_more");
+  add_cell(row, make_sym_btn("\u21E2", "Submit the motif to another MEME Suite program or download it.", function(e) { action_show_outpop(e, ordinal); }), "motif_submit");
+  return row;
+}
+
+/*
+ * Make a sortable table of enriched matching rows.
+ */
+function make_motif_words(motif) {
+  var row, i, match;
+  var table = document.createElement("table");
+  var thead = document.createElement("thead");
+  row = document.createElement("tr");
+  add_text_header_cell(row, "Word", "pop_match_word", "match_word", function(e) {sort_table(this, compare_words);});
+  add_text_header_cell(row, "Positives", "pop_match_pos", "match_count", function(e) {sort_table(this, compare_counts);});
+  add_text_header_cell(row, "Negatives", "pop_match_neg", "match_count", function(e) {sort_table(this, compare_counts);});
+  add_text_header_cell(row, "P-value", "pop_match_pval", "match_evalue", function(e) {sort_table(this, compare_evalues);});
+  add_text_header_cell(row, "E-value", "pop_match_eval", "match_evalue", function(e) {sort_table(this, compare_evalues);});
+  thead.appendChild(row);
+  table.appendChild(thead);
+  var tbody = document.createElement("tbody");
+  for (i = 0; i < motif.matches.length; i++) {
+    match = motif.matches[i];
+    row = document.createElement("tr");
+    add_cell(row, make_seq(match.seq), "match_word");
+    add_text_cell(row, match.p + " / " + data.sequence_db.count, "match_count");
+    add_text_cell(row, match.n + " / " + data.control_db.count, "match_count");
+    add_text_cell(row, match.pvalue, "match_evalue");
+    add_text_cell(row, match.evalue, "match_evalue");
+    tbody.appendChild(row);
+  }
+  table.appendChild(tbody);
+  return table;
+}
+
+/*
+ * Make an expanded view of a discovered motif.
+ */
+function make_motif_exp(tbody, ordinal, motif) {
+  "use strict";
+  var box, pspm, logo_box;
+  box = $("tmpl_motif_expanded").cloneNode(true);
+  toggle_class(box, "template", false);
+  box.id = "";
+  find_child(box, "tvar_logo").appendChild(make_logo(motif, 150, false));
+  if (data.options.revcomp) {
+    find_child(box, "tvar_rclogo").appendChild(make_logo(motif, 150, true));
+  }
+  set_tvar(box, "tvar_p", motif["p"]);
+  set_tvar(box, "tvar_p_total", data.sequence_db.count);
+  set_tvar(box, "tvar_n", motif["n"]);
+  set_tvar(box, "tvar_n_total", data.control_db.count);
+  set_tvar(box, "tvar_pvalue", motif["pvalue"]);
+  set_tvar(box, "tvar_evalue", motif["evalue"]);
+  set_tvar(box, "tvar_uevalue", motif["unerased_evalue"]);
+  set_tvar(box, "tvar_words", make_motif_words(motif));
+  var cell = document.createElement("td");
+  cell.colSpan = 8;
+  cell.appendChild(box);
+  var row = document.createElement("tr");
+  row.className = "more";
+  row.appendChild(cell);
+  return row;
+}
+
+/*
+ * Convert a string containing a scientific number into the log of that number
+ * without having an intermediate representation of the number.
+ * This is intended to avoid underflow problems with the tiny evalues that
+ * MEME and DREME can create.
+ */
+function sci2log(scinum) {
+  "use strict";
+  var ev_re, match, sig, exp;
+  ev_re = /^(.*)e(.*)$/;
+  if (match = ev_re.exec(scinum)) {
+    sig = parseFloat(match[1]);
+    exp = parseInt(match[2]);
+    return Math.log(sig) + (exp * Math.log(10));
+  }
+  return 0;
+}
+
+/*
+ * Create a table of discovered motifs. A fresh table body is used for each
+ * motif to make hiding/showing rows with css easier.
+ */
+function make_motifs() {
+  "use strict";
+  var i, row, tbody, motif, ordinal;
+  // make the motifs table
+  var container = $("motifs");
+  container.innerHTML = ""; // clear content
+  var table = document.createElement("table");
+  // add a header that is always shown
+  var thead = document.createElement("thead");
+  thead.appendChild(make_motif_header());
+  table.appendChild(thead);
+  for (i = 0; i < data.motifs.length; i++) {
+    ordinal = i + 1;
+    motif = data.motifs[i];
+    tbody = document.createElement("tbody");
+    tbody.className = "collapsed";
+    tbody.appendChild(make_motif_row(tbody, ordinal, motif));
+    tbody.appendChild(make_motif_exp(tbody, ordinal, motif));
+    // create a following header for every row except the last one
+    if ((i + 1) < data.motifs.length) tbody.appendChild(make_motif_header());
+    table.appendChild(tbody);
+  }
+  container.appendChild(table);
+}
+
+/*
+ * Create a table showing all the alphabet symbols, their names and frequencies.
+ */
+function make_alpha_bg(alph, freqs) {
+  function colour_symbol(index) {
+    var span = document.createElement("span");
+    span.appendChild(document.createTextNode(alph.get_symbol(index)));
+    span.style.color = alph.get_colour(index);
+    span.className = "alpha_symbol";
+    return span;
+  }
+  var table, thead, tbody, row, th, span, i;
+  // create table
+  table = document.createElement("table");
+  table.className = "inputs";
+  // create header
+  thead = document.createElement("thead");
+  table.appendChild(thead);
+  row = thead.insertRow(thead.rows.length);
+  if (alph.has_complement()) {
+    add_text_header_cell(row, "Name", "pop_alph_name");
+    add_text_header_cell(row, "Bg.", "pop_alph_control");
+    add_text_header_cell(row, "");
+    add_text_header_cell(row, "");
+    add_text_header_cell(row, "");
+    add_text_header_cell(row, "Bg.", "pop_alph_control");
+    add_text_header_cell(row, "Name", "pop_alph_name");
+  } else {
+    add_text_header_cell(row, "");
+    add_text_header_cell(row, "Name", "pop_alph_name");
+    add_text_header_cell(row, "Bg.", "pop_alph_control");
+  }
+  // add alphabet entries
+  tbody = document.createElement("tbody");
+  table.appendChild(tbody);
+  if (alph.has_complement()) {
+    for (i = 0; i < alph.get_size_core(); i++) {
+      var c = alph.get_complement(i);
+      if (i > c) continue;
+      row = tbody.insertRow(tbody.rows.length);
+      add_text_cell(row, alph.get_name(i));
+      add_text_cell(row, "" + freqs[i].toFixed(3));
+      add_cell(row, colour_symbol(i)); 
+      add_text_cell(row, "~");
+      add_cell(row, colour_symbol(c)); 
+      add_text_cell(row, "" + freqs[c].toFixed(3));
+      add_text_cell(row, alph.get_name(c));
+    }
+  } else {
+    for (i = 0; i < alph.get_size_core(); i++) {
+      row = tbody.insertRow(tbody.rows.length);
+      add_cell(row, colour_symbol(i)); 
+      add_text_cell(row, alph.get_name(i));
+      add_text_cell(row, "" + freqs[i].toFixed(3));
+    }
+  }
+  return table;
+}
+
+/*
+ * Updates the format download text in the popup.
+ * This is called when either the format or current motif changes.
+ */
+function update_outpop_format(index) {
+  var motif = data.motifs[index];
+  var fn = [motif_count_matrix, motif_prob_matrix, motif_minimal_meme];
+  var suffix = ["_counts.txt", "_freqs.txt", ".meme"];
+  var format = parseInt($("text_format").value);
+  var text = fn[format](motif);
+  prepare_download(text, "text/plain", motif.id + suffix[format], $("outpop_text_dl"));
+  $("outpop_text").value = text;
+}
+
+/*
+ * Updates the motif logos and format download text in the popup.
+ * This is called whenever the current motif changes.
+ */
+function update_outpop_motif(index) {
+  "use strict";
+  var motifs, motif, pspm, logo, canvas, num;
+  motifs = data["motifs"];
+  if (index < 0 || index >= motifs.length) {return;}
+  current_motif = index;
+  motif = motifs[index];
+  pspm = new Pspm(motif["pwm"]);
+  logo = new Logo(dreme_alphabet, "");
+  logo.add_pspm(pspm, 0);
+  canvas = $("outpop_logo");
+  canvas.width = canvas.width; // clear canvas
+  draw_logo_on_canvas(logo, canvas, false);
+  canvas = $("outpop_logo_rc");
+  canvas.width = canvas.width; // clear rc canvas
+  if (data.options.revcomp) {
+    pspm.reverse_complement(dreme_alphabet);
+    logo = new Logo(dreme_alphabet, "");
+    logo.add_pspm(pspm, 0);
+    draw_logo_on_canvas(logo, canvas, false);
+  }
+  num = $("outpop_num");
+  num.innerHTML = "";
+  num.appendChild(document.createTextNode("" + (index + 1)));
+  update_outpop_format(index);
+}
+
+
+/*
+ * Initialise and display the download popup.
+ */
+function action_show_outpop(e, ordinal) {
+  "use strict";
+  function init() {
+    "use strict";
+    var close_btn, next_btn, prev_btn, cancel_btn, do_btn;
+    var tab1, tab2, tab3;
+    var pnl1, pnl2, pnl3;
+    var format_list;
+    var tbl_submit, inputs, i, default_prog;
+    close_btn = $("outpop_close");
+    close_btn.addEventListener("click", action_hide_outpop, false);
+    close_btn.addEventListener("keydown", action_hide_outpop, false);
+    next_btn = $("outpop_next");
+    next_btn.addEventListener("click", action_outpop_next, false);
+    next_btn.addEventListener("keydown", action_outpop_next, false);
+    prev_btn = $("outpop_prev");
+    prev_btn.addEventListener("click", action_outpop_prev, false);
+    prev_btn.addEventListener("keydown", action_outpop_prev, false);
+    cancel_btn = $("outpop_cancel");
+    cancel_btn.addEventListener("click", action_hide_outpop, false);
+    do_btn = $("outpop_do");
+    do_btn.addEventListener("click", action_outpop_submit, false);
+    tab1 = $("outpop_tab_1");
+    tab1.tabIndex = 0;
+    tab1.addEventListener("click", action_outpop_tab, false);
+    tab1.addEventListener("keydown", action_outpop_tab, false);
+    tab2 = $("outpop_tab_2");
+    tab2.tabIndex = 0;
+    tab2.addEventListener("click", action_outpop_tab, false);
+    tab2.addEventListener("keydown", action_outpop_tab, false);
+    tab3 = $("outpop_tab_3");
+    tab3.tabIndex = 0;
+    tab3.addEventListener("click", action_outpop_tab, false);
+    tab3.addEventListener("keydown", action_outpop_tab, false);
+    pnl1 = $("outpop_pnl_1");
+    pnl2 = $("outpop_pnl_2");
+    pnl3 = $("outpop_pnl_3");
+    toggle_class(tab1, "activeTab", true);
+    toggle_class(tab2, "activeTab", false);
+    toggle_class(tab3, "activeTab", false);
+    pnl1.style.display = "block";
+    pnl2.style.display = "none";
+    pnl3.style.display = "none";
+    format_list = $("text_format");
+    format_list.addEventListener("change", action_outpop_format, false);
+    // setup program selection
+    tbl_submit = $("programs");
+    // when not dna, hide the inputs for programs that require dna motifs
+    toggle_class(tbl_submit, "alphabet_dna", dreme_alphabet.has_complement());//TODO FIXME alphabet_dna is a bad name for a field when allowing custom alphabets
+    // add a click listener for the radio buttons
+    inputs = tbl_submit.querySelectorAll("input[type='radio']");
+    for (i = 0; i < inputs.length; i++) {
+      inputs[i].addEventListener("click", action_outpop_program, false);
+    }
+    // ensure that a default program option is selected for DNA and Protein
+    default_prog = document.getElementById(dreme_alphabet.has_complement() ? "submit_tomtom" : "submit_fimo");
+    default_prog.checked = true;
+    action_outpop_program.call(default_prog);
+    // disable reverse-complement when not DNA
+    $("logo_rc_option").disabled = !dreme_alphabet.has_complement(); 
+    // set errorbars on when ssc is on
+    $("logo_ssc").addEventListener("change", action_outpop_ssc, false);
+  }
+  // store the focused element
+  action_hide_outpop.last_active = document.activeElement;
+  if (!e) e = window.event;
+  if (e.type === "keydown") {
+    if (e.keyCode !== 13 && e.keyCode !== 32) {
+      return;
+    }
+    // stop a submit or something like that
+    e.preventDefault();
+  }
+  // hide the help popup
+  help_popup();
+  // on first load initilize the popup
+  if (!action_show_outpop.ready) {
+    init();
+    action_show_outpop.ready = true;
+  }
+  update_outpop_motif(ordinal - 1);
+  // display the download popup
+  $("grey_out_page").style.display = "block";
+  $("download").style.display = "block";
+  $("outpop_close").focus();
+}
+
+/*
+ * Hide the download popup.
+ */
+function action_hide_outpop(e) {
+  if (!e) e = window.event;
+  if (e.type === "keydown") {
+    if (e.keyCode !== 13 && e.keyCode !== 32) {
+      return;
+    }
+    // stop a submit or something like that
+    e.preventDefault();
+  }
+  $("download").style.display = "none";
+  $("grey_out_page").style.display = "none";
+  if (typeof action_hide_outpop.last_active !== "undefined") {
+    action_hide_outpop.last_active.focus();
+  }
+}
+
+/*
+ * Show the next motif in the download popup.
+ */
+function action_outpop_next(e) {
+  if (!e) e = window.event;
+  if (e.type === "keydown") {
+    if (e.keyCode !== 13 && e.keyCode !== 32) {
+      return;
+    }
+    // stop a submit or something like that
+    e.preventDefault();
+  }
+  update_outpop_motif(current_motif + 1);
+}
+
+/*
+ * Show the previous motif in the download popup.
+ */
+function action_outpop_prev(e) {
+  if (!e) e = window.event;
+  if (e.type === "keydown") {
+    if (e.keyCode !== 13 && e.keyCode !== 32) {
+      return;
+    }
+    // stop a submit or something like that
+    e.preventDefault();
+  }
+  update_outpop_motif(current_motif - 1);
+}
+
+/*
+ * Highlight the selected row in the program list.
+ */
+function action_outpop_program() {
+  "use strict";
+  var table, tr, rows, i;
+  tr = find_parent_tag(this, "TR");
+  table = find_parent_tag(tr, "TABLE");
+  rows = table.querySelectorAll("tr");
+  for (i = 0; i < rows.length; i++) {
+    toggle_class(rows[i], "selected", rows[i] === tr);
+  }
+}
+
+/*
+ * Enable error bars when small sample correction is enabled.
+ */
+function action_outpop_ssc() {
+  "use strict";
+  $("logo_err").value = $("logo_ssc").value;
+}
+
+/*
+ * Submit the motif to the selected program.
+ */
+function action_outpop_submit(e) {
+  "use strict";
+  var form, input, program, motifs;
+  // find out which program is selected
+  var radios, i;
+  radios = document.getElementsByName("program");
+  program = "fimo"; // default to fimo, since it works with all alphabet types
+  for (i = 0; i < radios.length; i++) {
+    if (radios[i].checked) program = radios[i].value;
+  }
+
+  motifs = motif_minimal_meme(data.motifs[current_motif]);
+  form = document.createElement("form");
+  form.setAttribute("method", "post");
+  form.setAttribute("action", site_url + "/tools/" + program);
+  
+  input = document.createElement("input");
+  input.setAttribute("type", "hidden");
+  input.setAttribute("name", "motifs_embed");
+  input.setAttribute("value", motifs);
+  form.appendChild(input);
+
+  document.body.appendChild(form);
+  form.submit();
+  document.body.removeChild(form);
+}
+
+/*
+ * Download the format text.
+ * Wire the link containing the data URI text to a download button so it looks
+ * the same as the server submit stuff.
+ */
+function action_outpop_download_motif(e) {
+  $("outpop_text_dl").click();
+}
+
+/*
+ * Download the motif logo.
+ * The EPS format can be calculated locally in Javascript
+ */
+function action_outpop_download_logo(e) {
+  "use strict";
+  var pspm, logo, eps;
+  var logo_rc, logo_ssc, logo_width, logo_height;
+  var motif = data.motifs[current_motif];
+  if ($("logo_format").value == "0") { // EPS
+    logo_rc = ($("logo_rc").value == "1");
+    logo_ssc = ($("logo_ssc").value == "1");
+    logo_width = parseFloat($("logo_width").value);
+    if (isNaN(logo_width) || !isFinite(logo_width) || logo_width <= 0) logo_width = null;
+    logo_height = parseFloat($("logo_height").value);
+    if (isNaN(logo_height) || !isFinite(logo_height) || logo_height <= 0) logo_height = null;
+    // create a PSPM from the motif
+    pspm = motif_pspm(motif);
+    if (logo_rc) pspm.reverse_complement(dreme_alphabet);
+    logo = new Logo(dreme_alphabet);
+    logo.add_pspm(pspm, 0);
+    eps = logo.as_eps({"ssc": logo_ssc, "logo_width": logo_width, "logo_height": logo_height});
+    prepare_download(eps, "application/postscript", motif.id + ".eps");
+  } else {
+    $("logo_motifs").value = motif_minimal_meme(motif);
+    $("logo_form").submit();
+  }
+}
+
+/*
+ * Change the selected tab in the download popup.
+ */
+function action_outpop_tab(e) {
+  "use strict";
+  var tab1, tab2, tab3, pnl1, pnl2, pnl3, do_btn;
+  if (!e) e = window.event;
+  if (e.type === "keydown") {
+    if (e.keyCode !== 13 && e.keyCode !== 32) {
+      return;
+    }
+    // stop a submit or something like that
+    e.preventDefault();
+  }
+  tab1 = $("outpop_tab_1");
+  tab2 = $("outpop_tab_2");
+  tab3 = $("outpop_tab_3");
+  pnl1 = $("outpop_pnl_1");
+  pnl2 = $("outpop_pnl_2");
+  pnl3 = $("outpop_pnl_3");
+  do_btn = $("outpop_do");
+
+  toggle_class(tab1, "activeTab", (this === tab1));
+  toggle_class(tab2, "activeTab", (this === tab2));
+  toggle_class(tab3, "activeTab", (this === tab3));
+  pnl1.style.display = ((this === tab1) ? "block" : "none");
+  pnl2.style.display = ((this === tab2) ? "block" : "none");
+  pnl3.style.display = ((this === tab3) ? "block" : "none");
+  do_btn.value = ((this === tab1) ? "Submit" : "Download");
+  do_btn.removeEventListener("click", action_outpop_submit, false);
+  do_btn.removeEventListener("click", action_outpop_download_logo, false);
+  do_btn.removeEventListener("click", action_outpop_download_motif, false);
+  if (this === tab1) {
+    do_btn.addEventListener("click", action_outpop_submit, false);
+  } else if (this === tab2) {
+    do_btn.addEventListener("click", action_outpop_download_motif, false);
+  } else {
+    do_btn.addEventListener("click", action_outpop_download_logo, false);
+  }
+}
+
+/*
+ * Update the text in the download format popup.
+ */
+function action_outpop_format() {
+  update_outpop_format(current_motif);
+}
+
+/*
+ * Find all text nodes in the given container.
+ */
+function text_nodes(container) {
+  var textNodes = [];
+  var stack = [container];
+  // depth first search to maintain ordering when flattened 
+  while (stack.length > 0) {
+    var node = stack.pop();
+    if (node.nodeType == Node.TEXT_NODE) {
+      textNodes.push(node);
+    } else {
+      for (var i = node.childNodes.length-1; i >= 0; i--) {
+        stack.push(node.childNodes[i]);
+      }
+    }
+  }
+  return textNodes;
+}
+
+/*
+ * Get the text out of a specific text node.
+ */
+function node_text(node) {
+  if (node === undefined) {
+    return '';
+  } else if (node.textContent) {
+    return node.textContent;
+  } else if (node.innerText) {
+    return node.innerText;
+  } else {
+    return '';
+  }
+}
+
+/*
+ * Get the text contained within the element.
+ */
+function elem_text(elem, separator) {
+  if (separator === undefined) separator = '';
+  return text_nodes(elem).map(node_text).join(separator);
+}
+
+/*
+ * Sort all rows in the first table body based on the column of the given element and the comparison function.
+ * The sort is not very fast and is intended for small tables only.
+ */
+function sort_table(colEle, compare_function) {
+  //find the parent of colEle that is either a td or th
+  var i, j;
+  var cell = colEle;
+  while (true) {
+    if (cell == null) return;
+    if (cell.nodeType == Node.ELEMENT_NODE && 
+        (cell.tagName.toLowerCase() == "td" || cell.tagName.toLowerCase() == "th")) {
+      break;
+    }
+    cell = cell.parentNode;
+  }
+  //find the parent of cell that is a tr
+  var row = cell;
+  while (true) {
+    if (row == null) return;
+    if (row.nodeType == Node.ELEMENT_NODE && row.tagName.toLowerCase() == "tr") {
+      break;
+    }
+    row = row.parentNode;
+  }
+  //find the parent of row that is a table
+  var table = row;
+  while (true) {
+    if (table == null) return;
+    if (table.nodeType == Node.ELEMENT_NODE && table.tagName.toLowerCase() == "table") {
+      break;
+    }
+    table = table.parentNode;
+  }
+  var column_index = cell.cellIndex;
+  // do a bubble sort, because the tables are so small it doesn't matter
+  var change;
+  var trs = table.tBodies[0].getElementsByTagName('tr');
+  var already_sorted = true;
+  var reverse = false;
+  while (true) {
+    do {
+      change = false;
+      for (i = 0; i < trs.length -1; i++) {
+        var v1 = elem_text(trs[i].cells[column_index]);
+        var v2 = elem_text(trs[i+1].cells[column_index]);
+        if (reverse) {
+          var tmp = v1;
+          v1 = v2;
+          v2 = tmp;
+        }
+        if (compare_function(v1, v2) > 0) {
+          exchange(trs[i], trs[i+1], table);
+          change = true;
+          already_sorted = false;
+          trs = table.tBodies[0].getElementsByTagName('tr');
+        }
+      }
+    } while (change);
+    if (reverse) break;// we've sorted twice so exit
+    if (!already_sorted) break;// sort did something so exit
+    // when it's sorted one way already then sort the opposite way
+    reverse = true;
+  }
+  // put arrows on the headers
+  var headers = table.tHead.getElementsByTagName('tr');
+  for (i = 0; i < headers.length; i++) {
+    for (j = 0; j < headers[i].cells.length; j++) {
+      var cell = headers[i].cells[j];
+      var arrows = cell.getElementsByClassName("sort_arrow");
+      var arrow;
+      if (arrows.length == 0) {
+        arrow = document.createElement("span");
+        arrow.className = "sort_arrow";
+        cell.insertBefore(arrow, cell.firstChild);
+      } else {
+        arrow = arrows[0];
+      }
+      arrow.innerHTML = "";
+      if (j == column_index) {
+        arrow.appendChild(document.createTextNode(reverse ? "\u25B2" : "\u25BC"));
+      }
+    }
+  }
+}
+
+/*
+ * Swap two rows in a table.
+ */
+function exchange(oRowI, oRowJ, oTable) {
+  var i = oRowI.rowIndex;
+  var j = oRowJ.rowIndex;
+   if (i == j+1) {
+    oTable.tBodies[0].insertBefore(oRowI, oRowJ);
+  } if (j == i+1) {
+    oTable.tBodies[0].insertBefore(oRowJ, oRowI);
+  } else {
+    var tmpNode = oTable.tBodies[0].replaceChild(oRowI, oRowJ);
+    if(typeof(oRowI) != "undefined") {
+      oTable.tBodies[0].insertBefore(tmpNode, oRowI);
+    } else {
+      oTable.appendChild(tmpNode);
+    }
+  }
+}
+
+/*
+ * Compare two E-values which may be very small.
+ */
+function compare_evalues(v1, v2) {
+  var e1 = sci2log(v1);
+  var e2 = sci2log(v2);
+  if (e1 < e2) return -1;
+  else if (e1 > e2) return 1;
+  return 0;
+}
+
+/*
+ * Compare two counts.
+ */
+function compare_counts(v1, v2) {
+  var re = /(\d+)\s*\/\s*\d+/;
+  var m1 = re.exec(v1);
+  var m2 = re.exec(v2);
+  if (m1 == null && m2 == null) return 0;
+  if (m1 == null) return -1;
+  if (m2 == null) return 1;
+  return parseInt(m2[1]) - parseInt(m1[1]);
+}
+
+/*
+ * Compare two sequence words.
+ */
+function compare_words(v1, v2) {
+  return v1.localeCompare(v2);
+}
+
+
+</script>
+    <style>
+/* The following is the content of meme.css */
+body { background-color:white; font-size: 12px; font-family: Verdana, Arial, Helvetica, sans-serif;}
+
+div.help {
+  display: inline-block;
+  margin: 0px;
+  padding: 0px;
+  width: 12px;
+  height: 13px;
+  cursor: pointer;
+  background-image: url(data:image/gif;base64,R0lGODlhDAANAIABANR0AP///yH5BAEAAAEALAAAAAAMAA0AAAIdhI8Xy22MIFgv1DttrrJ7mlGNNo4c+aFg6SQuUAAAOw==);
+}
+
+div.help:hover {
+  background-image: url(data:image/gif;base64,R0lGODlhDAANAKEAANR0AP///9R0ANR0ACH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEAAAIALAAAAAAMAA0AAAIdDGynCe3PgoxONntvwqz2/z2K2ImjR0KhmSIZUgAAOw==);
+}
+
+p.spaced { line-height: 1.8em;}
+
+span.citation { font-family: "Book Antiqua", "Palatino Linotype", serif; color: #004a4d;}
+
+p.pad { padding-left: 30px; padding-top: 5px; padding-bottom: 10px;}
+
+td.jump { font-size: 13px; color: #ffffff; background-color: #00666a;
+  font-family: Georgia, "Times New Roman", Times, serif;}
+
+a.jump { margin: 15px 0 0; font-style: normal; font-variant: small-caps;
+  font-weight: bolder; font-family: Georgia, "Times New Roman", Times, serif;}
+
+h2.mainh {font-size: 1.5em; font-style: normal; margin: 15px 0 0;
+  font-variant: small-caps; font-family: Georgia, "Times New Roman", Times, serif;}
+
+h2.line {border-bottom: 1px solid #CCCCCC; font-size: 1.5em; font-style: normal;
+  margin: 15px 0 0; padding-bottom: 3px; font-variant: small-caps;
+  font-family: Georgia, "Times New Roman", Times, serif;}
+
+h4 {border-bottom: 1px solid #CCCCCC; font-size: 1.2em; font-style: normal;
+  margin: 10px 0 0; padding-bottom: 3px; font-family: Georgia, "Times New Roman", Times, serif;}
+
+h5 {margin: 0px}
+
+a.help { font-size: 9px; font-style: normal; text-transform: uppercase;
+  font-family: Georgia, "Times New Roman", Times, serif;}
+
+div.pad { padding-left: 30px; padding-top: 5px; padding-bottom: 10px;}
+
+div.pad1 { margin: 10px 5px;}
+
+div.pad2 { margin: 25px 5px 5px;}
+h2.pad2 { padding: 25px 5px 5px;}
+
+div.pad3 { padding: 5px 0px 10px 30px;}
+
+div.box { border: 2px solid #CCCCCC; padding:10px; overflow: hidden;}
+
+div.bar { border-left: 7px solid #00666a; padding:5px; margin-top:25px; }
+
+div.subsection {margin:25px 0px;}
+
+img {border:0px none;}
+
+th.majorth {text-align:left;}
+th.minorth {font-weight:normal; text-align:left; width:8em; padding: 3px 0px;}
+th.actionth {font-weight:normal; text-align:left;}
+
+.explain h5 {font-size:1em; margin-left: 1em;}
+
+div.doc {margin-left: 2em; margin-bottom: 3em;}
+
+th.trainingset {
+  border-bottom: thin dashed black; 
+  font-weight:normal; 
+  padding:0px 10px;
+}
+div.pop_content {
+  position:absolute;
+  z-index:50;
+  width:300px;
+  padding: 5px;
+  background: #E4ECEC;
+  font-size: 12px;
+  font-family: Arial;
+  border-style: double;
+  border-width: 3px;
+  border-color: #AA2244;
+  display:none;
+}
+
+div.pop_content > *:first-child {
+  margin-top: 0px;
+}
+
+div.pop_content h1, div.pop_content h2, div.pop_content h3, div.pop_content h4, 
+div.pop_content h5, div.pop_content h6, div.pop_content p {
+  margin: 0px;
+}
+
+div.pop_content p + h1, div.pop_content p + h2, div.pop_content p + h3, 
+div.pop_content p + h4, div.pop_content p + h5, div.pop_content p + h6 {
+  margin-top: 5px;
+}
+
+div.pop_content p + p {
+  margin-top: 5px;
+}
+
+div.pop_content > *:last-child {
+  margin-bottom: 0px;
+}
+
+div.pop_content div.pop_close {
+  /* old definition */
+  float:right;
+  bottom: 0;
+}
+
+div.pop_content span.pop_close, div.pop_content span.pop_back {
+  display: inline-block;
+  border: 2px outset #661429;
+  background-color: #CCC;
+  padding-left: 1px;
+  padding-right: 1px;
+  padding-top: 0px;
+  padding-bottom: 0px;
+  cursor: pointer;
+  color: #AA2244; /*#661429;*/
+  font-weight: bold;
+}
+
+div.pop_content span.pop_close:active, div.pop_content span.pop_back:active {
+  border-style: inset;
+}
+
+div.pop_content span.pop_close {
+  float:right;
+  /*border: 2px outset #AA002B;*/
+  /*color: #AA2244;*/
+}
+
+div.pop_content:not(.nested) .nested_only {
+  display: none;
+}
+
+div.pop_back_sec {
+  margin-bottom: 5px;
+}
+
+div.pop_close_sec {
+  margin-top: 5px;
+}
+
+table.hide_advanced tr.advanced {
+  display: none;
+}
+span.show_more {
+  display: none;
+}
+table.hide_advanced span.show_more {
+  display: inline;
+}
+table.hide_advanced span.show_less {
+  display: none;
+}
+
+
+/*****************************************************************************
+ * Program logo styling
+ ****************************************************************************/
+div.prog_logo {
+  border-bottom: 0.25em solid #0f5f60;
+  height: 4.5em;
+  width: 24em;
+  display:inline-block;
+}
+div.prog_logo img {
+  float:left;
+  width: 4em;
+  border-style: none;
+  margin-right: 0.2em;
+}
+div.prog_logo h1, div.prog_logo h1:hover, div.prog_logo h1:active, div.prog_logo h1:visited {
+  margin:0;
+  padding:0;
+  font-family: Arial, Helvetica,  sans-serif;
+  font-size: 3.2em;
+  line-height: 1em;
+  vertical-align: top;
+  display: block;
+  color: #026666;
+  letter-spacing: -0.06em;
+  text-shadow: 0.04em 0.06em 0.05em #666;
+}
+div.prog_logo h2, div.prog_logo h2:hover, div.prog_logo h2:active, div.prog_logo h2:visited {
+  display: block;
+  margin:0;
+  padding:0;
+  font-family: Helvetica, sans-serif;
+  font-size: 0.9em;
+  line-height: 1em;
+  letter-spacing: -0.06em;
+  color: black;
+}
+
+div.big.prog_logo {
+  font-size: 18px;
+}
+
+</style>
+    <style>
+/* dreme output specific css */
+div.header {
+  position: relative;
+  overflow: hidden;
+  margin-top: 15px;
+  margin-bottom: 5px;
+  margin-right: 3px;
+  margin-left: 3px;
+}
+div.header > h2 {
+  font-size: 1.5em;
+  font-style: normal;
+  margin: 0;
+  font-variant: small-caps; 
+  font-family: Georgia, "Times New Roman", Times, serif;
+}
+div.header > span {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+}
+
+div.template {
+  position: absolute;
+  z-index: 1;
+  left: 0;
+  top: 0;
+  visibility: hidden;
+}
+
+div.sym_btn {
+  display:inline-block;
+  text-decoration: underline;
+  cursor: pointer;
+  font-size: 20px;
+  line-height:20px; 
+  text-align: center;
+  width: 20px;
+  height: 20px;
+  color: blue;
+}
+div.sym_btn:hover {
+  color: white;
+  background-color: blue;
+}
+
+div.sym_btn.positioned {
+  position: absolute;
+  top: 0px;
+}
+
+div.box + div.box {
+  margin-top: 5px;
+}
+
+th.motif_ordinal {
+
+}
+td.motif_ordinal {
+  text-align: right;
+  padding-right: 10px;
+  font-weight: bold;
+  font-size: large;
+}
+th.motif_word {
+  padding-right: 10px;
+}
+td.motif_word {
+  font-size:15px; 
+  font-family: 'Courier New', Courier, monospace;
+  padding-right: 10px;
+}
+th.motif_logo {
+  padding-right: 10px;
+}
+td.motif_logo {
+  padding-right: 10px;
+}
+th.motif_evalue {
+  text-align:right;
+  padding-right: 10px;
+}
+td.motif_evalue {
+  text-align: right;
+  white-space: nowrap;
+  padding-right: 20px;
+}
+th.motif_more {
+  padding: 0 5px;
+}
+td.motif_more {
+  text-align: center;
+  padding: 0 5px;
+}
+th.motif_submit {
+  padding: 0 5px;
+}
+td.motif_submit {
+  text-align: center;
+  padding: 0 5px;
+}
+th.match_word {
+  padding-right: 10px;
+}
+td.match_word {
+  padding-right: 10px;
+  font-weight: bold;
+  font-size: large; 
+  font-family: 'Courier New', Courier, monospace;
+}
+th.match_evalue, th.match_count {
+  text-align: right;
+  padding-right: 10px;
+}
+td.match_evalue, td.match_count {
+  text-align: right;
+  white-space: nowrap;
+  padding-right: 20px;
+}
+
+div.tabArea {
+  font-size: 80%;
+  font-weight: bold;
+}
+
+.norc div.tabArea {
+  display: none;
+}
+
+span.tab, span.tab:visited {
+  cursor: pointer;
+  color: #888;
+  background-color: #ddd;
+  border: 2px solid #ccc;
+  padding: 2px 1em;
+  text-decoration: none;
+}
+span.tab.middle {
+  border-left-width: 0px;
+}
+div.tabArea.base span.tab {
+  border-top-width: 0px;
+}
+div.tabArea.top span.tab {
+  border-bottom-width: 0px;
+}
+
+span.tab:hover {
+  background-color: #bbb;
+  border-color: #bbb;
+  color: #666;
+}
+span.tab.activeTab, span.tab.activeTab:hover, span.tab.activeTab:visited {
+  background-color: white;
+  color: black;
+  cursor: default;
+}
+div.tabMain {
+  border: 2px solid #ccc;
+  background-color: white;
+  padding: 10px;
+}
+div.tabMain.base {
+  margin-top: 5px;
+  display: inline-block;
+  max-width: 98%;
+}
+
+div.tabMain.top {
+  margin-bottom: 5px;
+}
+
+div.grey_background {
+  position:fixed; 
+  z-index: 8;
+  background-color: #000;
+  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
+  opacity: 0.5;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+}
+
+div.popup_wrapper {
+  position:fixed; 
+  z-index:9;
+  width:100%; 
+  height:0; 
+  top:50%; 
+  left:0;
+}
+
+div.popup {
+  width: 600px; 
+  z-index:9;
+  margin-left: auto;
+  margin-right: auto;
+  padding: 5px;
+  background-color: #FFF;
+  border-style: double;
+  border-width: 5px;
+  border-color: #00666a;
+  position:relative; 
+}
+div.close {
+  cursor: pointer;
+  border: 1px solid black; 
+  width:15px; 
+  height:15px; 
+  line-height:15px; /* this causes vertical centering */
+  text-align:center; 
+  background-color:#FFF; 
+  color:#000; 
+  font-size:15px;
+  font-family:monospace;
+}
+
+div.close:hover {
+  color:#FFF;
+  background-color:#000; 
+}
+
+div.navnum {
+  width:100%; 
+  height:20px; 
+  line-height:20px; 
+  text-align:center; 
+  font-size:medium;
+}
+
+div.navarrow {
+  font-size: 30px;
+  text-decoration:none;
+  cursor: pointer;
+  -moz-user-select: none;  
+  -webkit-user-select: none;  
+  -ms-user-select: none;
+}
+
+div.navarrow > span.inactive {
+  display: inline;
+}
+div.navarrow > span.active {
+  display: none;
+}
+
+div.navarrow:hover > span.active {
+  display: inline;
+}
+div.navarrow:hover > span.inactive {
+  display: none;
+}
+
+table.programs {
+  width: 100%;
+}
+
+table.programs tr {
+  background-color: #EFE;
+}
+
+table.programs tr.selected {
+  background-color: #262;
+  color: #FFF;
+}
+
+table.programs tr.dna_only {
+  display: none;
+}
+
+table.programs.alphabet_dna tr.dna_only {
+  display: table-row;
+}
+
+table.inputs {
+  margin-top: 20px;
+  border-collapse:collapse;
+}
+table.inputs * td, table.inputs * th {
+  padding-left: 15px;
+  padding-right: 15px;
+  padding-top: 1px;
+  padding-bottom: 1px;
+}
+
+/* program settings */
+span.strand_none, span.strand_given, span.strand_both {
+  display: none;
+}
+td.none span.strand_none, td.given span.strand_given, td.both span.strand_both {
+  display: inline;
+}
+
+/* show the expanded motif only when the collapsed one is hidden */
+tbody *.less, tbody.collapsed *.more {
+  display: none;
+}
+
+tbody.collapsed *.less {
+  display: inline;
+}
+
+</style>
+  </head>
+  <body data-scrollpad="true">
+    <!--  -->
+    <div id="grey_out_page" class="grey_background" style="display:none;">
+    </div>
+
+    <!-- Help popups -->
+    <div class="pop_content" id="pop_">
+      <p>Help poup.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+
+    <div class="pop_content" id="pop_motifs_word">
+      <p>
+        The name of the motif uses the IUPAC codes for nucleotides which has 
+        a different letter to represent each of the 15 possible combinations.
+      </p>
+      <p>
+        The name is itself a representation of the motif though the position
+        weight matrix is not directly equalivant as it is generated from the
+        sites found that matched the letters given in the name.
+      </p>
+      <p>
+        <a id="doc_alphabets_url" href="#">
+        Read more about the MEME suite's use of the IUPAC alphabets.
+        </a>
+        <script>$("doc_alphabets_url").href = site_url + "/doc/alphabets.html";</script>
+      </p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_motifs_logo">
+      <p>The logo of the motif.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_motifs_rc_logo">
+      <p>The logo of the reverse complement motif.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_motifs_evalue">
+      <p>The E-value is the enrichment p-value times the number of candidate 
+        motifs tested.</p>
+      <p>The enrichment p-value is calculated using Fisher's Exact Test for 
+        enrichment of the motif in the positive sequences.</p>
+      <p>Note that the counts used in Fisher's Exact Test are made after 
+        erasing sites that match previously found motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_motifs_uevalue">
+      <p>The E-value of the motif calculated without erasing the sites of 
+        previously found motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_more">
+      <p>Show more information on the motif.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_submit_dl">
+      <p>Submit your motif to another MEME Suite program or download your motif.</p>
+      <h5>Supported Programs</h5>
+      <dl>
+        <dt>Tomtom</dt>
+        <dd>Tomtom is a tool for searching for similar known motifs. 
+          </dd>
+        <dt>MAST</dt>
+        <dd>MAST is a tool for searching biological sequence databases for 
+          sequences that contain one or more of a group of known motifs.
+          </dd>
+        <dt>FIMO</dt>
+        <dd>FIMO is a tool for searching biological sequence databases for 
+          sequences that contain one or more known motifs.
+          </dd>
+        <dt>GOMO</dt>
+        <dd>GOMO is a tool for identifying possible roles (Gene Ontology 
+          terms) for DNA binding motifs.
+          </dd>
+        <dt>SpaMo</dt>
+        <dd>SpaMo is a tool for inferring possible transcription factor
+          complexes by finding motifs with enriched spacings.
+          </dd>
+      </dl>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_motif_positives">
+      <p># positive sequences matching the motif / # positive sequences.</p>
+      <p>Note these counts are made after erasing sites that match previously
+        found motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_motif_negatives">
+      <p># negative sequences matching the motif / # negative sequences.</p>
+      <p>Note these counts are made after erasing sites that match previously
+        found motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_motif_pvalue">
+      <p>The p-value of Fisher's Exact Test for enrichment of the motif in 
+        the positive sequences.</p>
+      <p>Note that the counts used in Fisher's Exact Test are made after 
+        erasing sites that match previously found motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_motif_evalue">
+      <p>The E-value is the motif p-value times the number of candidate motifs 
+        tested.</p>
+      <p>Note that the p-value was calculated with counts made after 
+        erasing sites that match previously found motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_motif_uevalue">
+      <p>The E-value of the motif calculated without erasing the sites of 
+        previously found motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_match_word">
+      <p>All words matching the motif whose uncorrected p-value is less than
+      <span id="help_add_pv_thresh"></span>.</p>
+      <script>$("help_add_pv_thresh").innerHTML = data.options.add_pv_thresh;</script>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_match_pos">
+      <p># positive sequences with matches to the word / # positive sequences.</p>
+      <p>Note these counts are made after erasing sites that match previously
+        found motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_match_neg">
+      <p># negative sequences with matches to the word / # negative sequences.</p>
+      <p>Note these counts are made after erasing sites that match previously
+        found motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_match_pval">
+      <p>The p-value of Fisher's Exact Test for enrichment of the word in 
+        the positive sequences.</p>
+      <p>Note that the counts used in Fisher's Exact Test are made after 
+        erasing sites that match previously found motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_match_eval">
+      <p>The word p-value times the number of candidates tested.</p>
+      <p>Note that the p-value was calculated with counts made after 
+        erasing sites that match previously found motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+
+    <div class="pop_content" id="pop_seq_source">
+      <p>The sequence file used by DREME to find the motifs.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_seq_alph">
+      <p>The alphabet of the sequences.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+    <div class="pop_content" id="pop_seq_count">
+      <p>The count of the sequences.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+
+    <div class="pop_content" id="pop_alph_name">
+      <p>The name of the alphabet symbol.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+
+    <div class="pop_content" id="pop_alph_control">
+      <p>The frequency of the alphabet symbol in the control dataset.</p>
+      <div class="pop_close">[<a href="javascript:help_popup()">close</a> ]</div>
+    </div>
+
+    <!-- templates -->
+
+    <div class="template box expanded_motif" id="tmpl_motif_expanded">
+      <div>
+        <span class="tvar_logo"></span>
+        <span class="tvar_rclogo"></span>
+      </div>
+      <h4>Details</h4>
+      <table class="details">
+        <thead>
+          <tr>
+            <th class="match_count">Positives <div class="help" data-topic="pop_motif_positives"></div></th>
+            <th class="match_count">Negatives <div class="help" data-topic="pop_motif_negatives"></div></th>
+            <th class="match_evalue">P-value <div class="help" data-topic="pop_motif_pvalue"></div></th>
+            <th class="match_evalue">E-value <div class="help" data-topic="pop_motif_evalue"></div></th>
+            <th class="match_evalue">Unerased E-value <div class="help" data-topic="pop_motif_uevalue"></div></th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td class="match_count">
+              <span class="tvar_p"></span> / <span class="tvar_p_total"></span>
+            </td>
+            <td class="match_count">
+              <span class="tvar_n"></span> / <span class="tvar_n_total"></span>
+            </td>
+            <td class="tvar_pvalue match_evalue"></td>
+            <td class="tvar_evalue match_evalue"></td>
+            <td class="tvar_uevalue match_evalue"></td>
+          </tr>
+        </tbody>
+      </table>
+      <h4>Enriched Matching Words</h4>
+      <div class="tvar_words"></div>
+    </div>
+
+
+    <div class="popup_wrapper">
+      <div class="popup" style="display:none; top: -150px;" id="download">
+        <div>
+          <div style="float:right; ">
+            <div id="outpop_close" class="close" tabindex="0">x</div>
+          </div>
+          <h2 class="mainh" style="margin:0; padding:0;">Submit or Download</h2>
+          <div style="clear:both"></div>
+        </div>
+          <div style="height:100px">
+            <div style="float:right; width: 30px;">
+              <div id="outpop_prev" class="navarrow" tabindex="0">
+                <span class="inactive">&#8679;</span><span class="active">&#11014;</span>
+              </div>
+              <div id="outpop_num" class="navnum"></div>
+              <div id="outpop_next" class="navarrow" tabindex="0">
+                <span class="inactive">&#8681;</span><span class="active">&#11015;</span>
+              </div>
+            </div>
+            <div id="logo_box" style="height: 100px; margin-right: 40px;">
+              <canvas id="outpop_logo" height="100" width="250"></canvas>
+              <canvas id="outpop_logo_rc" height="100" width="250"></canvas>
+            </div>
+          </div>
+          <div>
+            <!-- tabs start -->
+            <div class="tabArea top">
+              <span id="outpop_tab_1" class="tab">Submit Motif</span><span
+                id="outpop_tab_2" class="tab middle">Download Motif</span><span 
+                id="outpop_tab_3" class="tab middle">Download Logo</span>
+            </div>
+            <div class="tabMain top">
+              <!-- Submit to another program -->
+              <div id="outpop_pnl_1">
+                <h4 class="compact">Submit to program</h4>
+                <table id="programs" class="programs">
+                  <tr class="dna_only">
+                    <td><input type="radio" name="program" value="tomtom" id="submit_tomtom"></td>
+                    <td><label for="submit_tomtom">Tomtom</label></td>
+                    <td><label for="submit_tomtom">Find similar motifs in
+                        published libraries or a library you supply.</label></td>
+                  </tr>
+                  <tr>
+                    <td><input type="radio" name="program" value="fimo" id="submit_fimo"></td>
+                    <td><label for="submit_fimo">FIMO</label></td>
+                    <td><label for="submit_fimo">Find motif occurrences in
+                        sequence data.</label></td>
+                  </tr>
+                  <tr>
+                    <td><input type="radio" name="program" value="mast" id="submit_mast"></td>
+                    <td><label for="submit_mast">MAST</label></td>
+                    <td><label for="submit_mast">Rank sequences by affinity to
+                        groups of motifs.</label></td>
+                  </tr>
+                  <tr class="dna_only">
+                    <td><input type="radio" name="program" value="gomo" id="submit_gomo"></td>
+                    <td><label for="submit_gomo">GOMo</label></td>
+                    <td><label for="submit_gomo">Identify possible roles (Gene
+                        Ontology terms) for motifs.</label></td>
+                  </tr>
+                  <tr class="dna_only">
+                    <td><input type="radio" name="program" value="spamo" id="submit_spamo"></td>
+                    <td><label for="submit_spamo">SpaMo</label></td>
+                    <td><label for="submit_spamo">Find other motifs that are
+                        enriched at specific close spacings which might imply the existance of a complex.</label></td>
+                  </tr>
+                </table>
+              </div>
+              <!-- download text format  -->
+              <div id="outpop_pnl_2">
+                <div>
+                  <label for="text_format">Format:</label>
+                  <select id="text_format">
+                    <option value="0">Count Matrix</option>
+                    <option value="1">Probability Matrix</option>
+                    <option value="2">Minimal MEME</option>
+                  </select>
+                </div>
+                <textarea id="outpop_text" name="content"
+                  style="width:99%; white-space: pre; word-wrap: normal; overflow-x: scroll;" 
+                  rows="8" readonly="readonly" wrap="off"></textarea>
+                <a id="outpop_text_dl" download="meme.txt" href=""></a>
+              </div>
+              <!-- download logo format -->
+              <div id="outpop_pnl_3">
+                <form id="logo_form" method="post" action="">
+                  <script>$("logo_form").action = site_url + "/utilities/generate_logo";</script>
+                  <input type="hidden" name="program" value="DREME"/>
+                  <input type="hidden" id="logo_motifs" name="motifs" value=""/>
+                  <table>
+                    <tr>
+                      <td><label for="logo_format">Format:</label></td>
+                      <td>
+                        <select id="logo_format" name="png">
+                          <option value="1">PNG (for web)</option>
+                          <option value="0">EPS (for publication)</option>
+                        </select>
+                      </td>
+                    </tr>
+                    <tr>
+                      <td><label for="logo_rc">Orientation:</label></td>
+                      <td>
+                        <select id="logo_rc" name="rc1">
+                          <option value="0">Normal</option>
+                          <option value="1" id="logo_rc_option">Reverse Complement</option>
+                        </select>
+                      </td>
+                    </tr>
+                    <tr>
+                      <td><label for="logo_ssc">Small Sample Correction:</label></td>
+                      <td>
+                        <input type="hidden" id="logo_err" name="errbars" value="0"/>
+                        <select id="logo_ssc" name="ssc">
+                          <option value="0">Off</option>
+                          <option value="1">On</option>
+                        </select>
+                      </td>
+                    </tr>
+                    <tr>
+                      <td><label for="logo_width">Width:</label></td>
+                      <td>
+                        <input type="text" id="logo_width" size="4" placeholder="default" name="width"/>&nbsp;cm
+                      </td>
+                    </tr>
+                    <tr>
+                      <td><label for="logo_height">Height:</label></td>
+                      <td>
+                        <input type="text" id="logo_height" size="4" placeholder="default" name="height"/>&nbsp;cm
+                      </td>
+                    </tr>
+                  </table>
+                </form>
+              </div>
+              <!-- Buttons -->
+              <div>
+                <div style="float:left;">
+                  <input type="button" id="outpop_do" value="Submit" />
+                </div>
+                <div style="float:right;">
+                  <input id="outpop_cancel" type="button" value="Cancel" />
+                </div>
+                <div style="clear:both;"></div>
+              </div>
+            </div>
+        </div>
+      </div>
+    </div>
+
+
+
+    <!-- Page starts here -->
+    <div id="top" class="pad1">
+      <div class="prog_logo big">
+        <img src="data:image/png;base64,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" alt="DREME Logo"/>
+        <h1>DREME</h1>
+        <h2>Discriminative Regular Expression Motif Elicitation</h2>
+      </div>
+      <p class="spaced">
+        For further information on how to interpret these results or to get a 
+        copy of the MEME software please access 
+        <a href="http://meme.nbcr.net/">http://meme.nbcr.net</a>. 
+      </p>
+      <p>
+        If you use DREME in your research please cite the following paper:<br />
+        <span class="citation">
+          Timothy L. Bailey, "DREME: Motif discovery in transcription factor ChIP-seq data", <i>Bioinformatics</i>, <b>27</b>(12):1653-1659, 2011.
+          <a href="http://bioinformatics.oxfordjournals.org/content/27/12/1653">[full text]</a>
+        </span>
+      </p>
+    </div>
+    <!-- navigation -->
+    <div class="pad2">
+      <a class="jump" href="#motifs_sec">Discovered Motifs</a>
+      &nbsp;&nbsp;|&nbsp;&nbsp;
+      <a class="jump" href="#inputs_sec">Inputs &amp; Settings</a>
+      &nbsp;&nbsp;|&nbsp;&nbsp;
+      <a class="jump" href="#info_sec">Program information</a>
+    </div>
+    <!-- alert the user when their browser is not up to the task -->
+    <noscript><h1 style="color:red">Javascript is required to view these results!</h1></noscript>
+    <h1 id="html5_warning" style="color:red; display:none;">Your browser does not support canvas!</h1>
+    <script>
+      if (!window.HTMLCanvasElement) $("html5_warning").style.display = "block";
+    </script>
+    <!-- description -->
+    <div id="description_section" style="display:none">
+      <div id="description" class="header">
+        <h2>Description</h2>
+      </div>
+      <div id="description_text" class="box">
+      </div>
+    </div>
+    <script>
+      if (data.description) {
+        $("description_text").innerHTML = "";
+        $("description_text").appendChild(make_description(data.description));
+        $("description_section").style.display = "block";
+      }
+    </script>
+    <!-- motifs -->
+    <div id="motifs_sec" class="header">
+      <h2>Discovered Motifs</h2>
+      <span><a href="#inputs_sec">Next</a>&nbsp;<a href="#">Top</a></span>
+    </div>
+    <div id="motifs" class="box">
+      <p>No motifs were discovered!</p>
+    </div>
+    <script>make_motifs();</script>
+    <!-- inputs and settings -->
+    <div id="inputs_sec" class="header">
+      <h2>Inputs &amp; Settings</h2>
+      <span><a href="#motifs_sec">Previous</a>&nbsp;<a href="#info_sec">Next</a>&nbsp;<a href="#">Top</a></span>
+    </div>
+    <div class="box">
+      <h4>Sequences</h4>
+      <table id="seq_info" class="inputs">
+        <tr><th>Source <div class="help" data-topic="pop_seq_source"></div></th>
+          <th>Alphabet <div class="help" data-topic="pop_seq_alph"></div></th>
+          <th>Sequence Count <div class="help" data-topic="pop_seq_count"></div></th>
+        </tr>
+        <tr>
+          <td id="ins_seq_source"></td>
+          <td id="ins_seq_alphabet"></td>
+          <td id="ins_seq_count"></td>
+        </tr>
+      </table>
+      <script>
+      {
+        var db = data.sequence_db;
+        $("ins_seq_source").innerHTML = db.file;
+        $("ins_seq_alphabet").innerHTML = dreme_alphabet.get_alphabet_name();
+        $("ins_seq_count").innerHTML = db.count;
+      }
+      </script>
+      <h4>Control Sequences</h4>
+      <table id="seq_info" class="inputs">
+        <tr><th>Source <div class="help" data-topic="pop_seq_source"></div></th>
+          <th>Sequence Count <div class="help" data-topic="pop_seq_count"></div></th>
+        </tr>
+        <tr>
+          <td id="ins_cseq_source"></td>
+          <td id="ins_cseq_count"></td>
+        </tr>
+      </table>
+      <script>
+      {
+        var db = data.control_db;
+        if (db.from == "shuffled") {
+          $("ins_cseq_source").innerHTML = "Shuffled Sequences";
+        } else {
+          $("ins_cseq_source").innerHTML = db.file;
+        }
+        $("ins_cseq_count").innerHTML = db.count;
+      }
+      </script>
+      <h4>Background</h4>
+      <span id="alpha_bg"></span>
+      <script>
+      {
+        $("alpha_bg").appendChild(make_alpha_bg(dreme_alphabet, data.control_db.freqs));
+      }
+      </script>
+      <h4>Other Settings</h4>
+      <table id="tbl_settings" class="inputs hide_advanced">
+        <tr>
+          <th>Strand Handling</th>
+          <td id="opt_strand">
+            <span class="strand_none">This alphabet only has one strand</span>
+            <span class="strand_given">Only the given strand is processed</span>
+            <span class="strand_both">Both the given and reverse complement strands are processed</span>
+          </td>
+        </tr>
+        <tr><th># REs to Generalize</th><td id="opt_ngen"></td></tr>
+        <tr><th>Shuffle Seed</th><td id="opt_seed"></td></tr>
+        <tr><th>E-value Threshold</th><td id="opt_stop_evalue"></td></tr>
+        <tr><th>Max Motif Count</th><td id="opt_stop_count"></td></tr>
+        <tr><th>Max Run Time</th><td id="opt_stop_time"></td></tr>
+      </table>
+      <script>
+      {
+        $("opt_strand").className = (dreme_alphabet.has_complement() ? (data.options.revcomp ? "both" : "given") : "none");
+        $("opt_ngen").innerHTML = data.options.ngen;
+        $("opt_seed").innerHTML = data.options.seed;
+        $("opt_stop_evalue").innerHTML = data.options.stop.evalue;
+        $("opt_stop_count").innerHTML = (typeof data.options.stop.count == "number" ? data.options.stop.count : "No maximum motif count.");
+        $("opt_stop_time").innerHTML = (typeof data.options.stop.time == "number" ? data.options.stop.time + " seconds." : "No maximum running time.");
+      }
+      </script>
+    </div>
+    <!-- list information on this program -->
+    <div id="info_sec" class="bar" style="position:relative">
+      <div style="position: absolute; right: 0;"><a href="#inputs_sec">Previous</a> <a href="#">Top</a></div>
+      <div class="subsection">
+        <h5 id="version">DREME version</h5>
+        <span id="ins_version"></span> 
+        (Release date: <span id="ins_release"></span>)<br>
+      </div>
+      <script>
+        $("ins_version").innerHTML = data["version"];
+        $("ins_release").innerHTML = data["release"];
+      </script>
+      <div class="subsection">
+        <h5 id="reference">Reference</h5>
+        <span class="citation">
+          Timothy L. Bailey, "DREME: Motif discovery in transcription factor ChIP-seq data", <i>Bioinformatics</i>, <b>27</b>(12):1653-1659, 2011.
+          <a href="http://bioinformatics.oxfordjournals.org/content/27/12/1653">[full text]</a>
+        </span>
+      </div>
+      <div class="subsection">
+        <h5 id="command">Command line</h5>
+        <textarea id="cmd" rows="3" style="width:100%;" readonly="readonly">
+        </textarea>
+        <script>$("cmd").value = data["cmd"].join(" ");</script>
+      </div>
+    </div>
+    
+  </body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/dreme2.txt	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,68 @@
+# DREME 4.12.0
+#     command: dreme -oc dreme_out_adv -rna -norc -p dreme_test_sites.fa -e 0.00001 -mink 4 -maxk 10
+#   positives: 1000 from dreme_test_sites.fa (Thu Apr 19 19:09:45 CEST 2018)
+#   negatives: 1000 from shuffled positives
+#        host: ThinkPad-T450s
+#        when: Tue Apr 24 18:44:36 CEST 2018
+
+MEME version 4.12.0
+
+ALPHABET "RNA" RNA-LIKE
+A "Adenine" CC0000
+C "Cytosine" 0000CC
+G "Guanine" FFB300
+U "Uracil" 008000
+N "Any base" = ACGU
+X = ACGU
+. = ACGU
+V "Not U" = ACG
+H "Not G" = ACU
+D "Not C" = AGU
+B "Not A" = CGU
+M "Amino" = AC
+R "Purine" = AG
+W "Weak" = AU
+S "Strong" = CG
+Y "Pyrimidine" = CU
+K "Keto" = GU
+T = U
+END ALPHABET
+
+Background letter frequencies (from dataset):
+A 0.221 C 0.245 G 0.221 U 0.312
+
+
+MOTIF UUYUCY DREME-1
+
+#             Word        Pos        Neg    P-value    E-value
+# BEST      UUYUCY        387        210   2.6e-018   3.3e-013
+#           UUUUCC        147         75   1.8e-007   2.2e-002
+#           UUUUCU        155         94   2.2e-005   2.8e+000
+#           UUCUCU         94         51   1.3e-004   1.7e+001
+#           UUCUCC         75         42   1.1e-003   1.4e+002
+
+letter-probability matrix: alength= 4 w= 6 nsites= 459 E= 3.3e-013
+0.000000 0.000000 0.000000 1.000000
+0.000000 0.000000 0.000000 1.000000
+0.000000 0.294118 0.000000 0.705882
+0.000000 0.000000 0.000000 1.000000
+0.000000 1.000000 0.000000 0.000000
+0.000000 0.474946 0.000000 0.525054
+
+
+MOTIF YAGG DREME-2
+
+#             Word        Pos        Neg    P-value    E-value
+# BEST        YAGG        600        416   1.1e-016   1.4e-011
+#             CAGG        441        304   1.5e-010   1.8e-005
+#             UAGG        232        165   1.1e-004   1.3e+001
+
+letter-probability matrix: alength= 4 w= 4 nsites= 793 E= 1.4e-011
+0.000000 0.692308 0.000000 0.307692
+1.000000 0.000000 0.000000 0.000000
+0.000000 0.000000 1.000000 0.000000
+0.000000 0.000000 1.000000 0.000000
+
+
+# Stopping reason: E-value threshold exceeded
+#    Running time: 18.17 seconds
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/dreme_test_sites.fa	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,2000 @@
+>U2AF2_K562_rep02_1
+UCUACACAUAGGGUGUUCCUGAAAAGCCCCAUAGUGAUUGAGUCUUCAAAACCACCGAUUC
+>U2AF2_K562_rep02_2
+UUGGAUAGCGGAAGCCCUGACCAGGCAUGGAGUAUCUCACAAAGUAGACGAUUCCUCUGGG
+>U2AF2_K562_rep02_3
+GGUUUCGGUCUAAGUACCACCCAGAUGAGGUGGGGAAGCGUCGGCAGGAGGCCCGGGGGGC
+>U2AF2_K562_rep02_4
+AAACAGGGUUUGUGGAUGCACUUAGAUGUUUGCAAUGAGCACUGUGGCUGGCAUGCCCCAG
+>U2AF2_K562_rep02_5
+UCCCAUUGUUUCUGCAGAGGCAGUUGGUGUCACCAGCCAGCGACCAGUGUUUUGUCCUUUU
+>U2AF2_K562_rep02_6
+UUCUACCCUCUCUAACUCCUCCCAGCAGCAAAAGGGAGACACUUCAGCUGGAACAAAAUAG
+>U2AF2_K562_rep02_7
+UUCUACCCUCUCUAACUCCUCCCAGCAGCAAAAGGGAGACACUUCAGCUGGAACAAAAUAG
+>U2AF2_K562_rep02_8
+UUUUCUCCCUUCCACCCACACCCUGCAGCGUCGAGGUCCUCAGCGAUCAGUUGAUGUAAUA
+>U2AF2_K562_rep02_9
+GGCAGGGGAAGUGGGGAUGGCAGGACAUGGAUGGCCCUUGAGGCAUUGGCUCUGGGUGUCA
+>U2AF2_K562_rep02_10
+GCAGGGGAAGUGGGGAUGGCAGGACAUGGAUGGCCCUUGAGGCAUUGGCUCUGGGUGUCAU
+>U2AF2_K562_rep02_11
+UUAGUCUUUCCAUCUACAGCCCACUGGCACUCCAGGCACCUACCUACUUCAAACAAGCUCA
+>U2AF2_K562_rep02_12
+UUUCUCUUUUCCUUCCACAGGGGACCGUGAUUAGGGUAUUUUCCAUUCCAGAAGGACAAAA
+>U2AF2_K562_rep02_13
+AUAACUGUUUUGUCUUUCCCUCCCCCGCUUCGUUCCCAGGUUUCGGUCUAAGUACCACCCA
+>U2AF2_K562_rep02_14
+UUUCAGAGAACGUUUGUCUGCCUGAUGAGAGCCACUUGGGUUAAGAAACUACCUGUGAAUA
+>U2AF2_K562_rep02_15
+AUGCUUUGCAAUUGCAGCUCCUUUAUGUCUCCAAAUGAUACAAGAAGACCCGAGAAAGUGG
+>U2AF2_K562_rep02_16
+UUUGCAAUUUUGCCUAGGGCCCUGGUGGUGGCAACCGCCUGUGUGCCACUGAAAAUCGUGC
+>U2AF2_K562_rep02_17
+UUGCAAUUUUGCCUAGGGCCCUGGUGGUGGCAACCGCCUGUGUGCCACUGAAAAUCGUGCC
+>U2AF2_K562_rep02_18
+CUAAUUUUUAAAAAGCAGCCUCUGGAGCCAGCCAUGUUUGGCACUGAAUCUUCAUGUAAGU
+>U2AF2_K562_rep02_19
+UCUAAUUUUUAAAAAGCAGCCUCUGGAGCCAGCCAUGUUUGGCACUGAAUCUUCAUGUAAG
+>U2AF2_K562_rep02_20
+UUUCUGUCUUCUCCUCUCUUCCUUUACACAAACUUAAACAGAAUGGAAAUGAAAACCAAGG
+>U2AF2_K562_rep02_21
+AAACAGUUUCAGCUCCUGGCAUCAGCUCUAUUCAAAUCUGGUUCAGAUUUUACAGCUCUGG
+>U2AF2_K562_rep02_22
+UUCUCUCUCUUCCCCUGGCUCCCUCAAGGUGAACAGCCAUAUACCAGGAAUAGGAUACCAG
+>U2AF2_K562_rep02_23
+UAUAUCCUUAGUGCAGGCUGUGGAAGAACAGGUGCCAUUUGUGCCAUAGAUUAUACGUGGA
+>U2AF2_K562_rep02_24
+UCCCUAAUUCUUCACCUCCCCCUCCUCUGCUGCCUCCUUGCUCUCCUCGCAGGUCAAGUUU
+>U2AF2_K562_rep02_25
+AUUGUUACUCCCAGGUGCCUUCGAAACAUCUGCAAGUUUUUAGUCUUGCUCAUCCCACUCU
+>U2AF2_K562_rep02_26
+CACAUUUUUUAAAAGGGCAAGUACAGGAGCAACUGCUGCUACCCAGAAAAAUGUGUGUAUU
+>U2AF2_K562_rep02_27
+CACAUUUUUUAAAAGGGCAAGUACAGGAGCAACUGCUGCUACCCAGAAAAAUGUGUGUAUU
+>U2AF2_K562_rep02_28
+AUUCCGUAGGUUCUAAUCUGUUCUCCCUCCUCCUCAACGUAAGUACACAGUGGAUACCCUC
+>U2AF2_K562_rep02_29
+UAUUCCGUAGGUUCUAAUCUGUUCUCCCUCCUCCUCAACGUAAGUACACAGUGGAUACCCU
+>U2AF2_K562_rep02_30
+ACUAAAGUUUUUUUUCCUAGUGGUUAUCAUGAGACUUAUAUAAAACAUGUUGUAUCUUAAC
+>U2AF2_K562_rep02_31
+CCUCCUCUUUCUCCCUCCCUCCUUCAUUCCCUCCAUCCCUCUCUUAACAGCUUGAAGAUAA
+>U2AF2_K562_rep02_32
+CCUCCUCUUUCUCCCUCCCUCCUUCAUUCCCUCCAUCCCUCUCUUAACAGCUUGAAGAUAA
+>U2AF2_K562_rep02_35
+AUUUAUCCUCUUGCUUUUGCAUCUCAAAAUUUUAUCGCCUUGAAGACACGUUUCUAUGAAU
+>U2AF2_K562_rep02_36
+GUCAGAAGGUAGCAGGGGCUGGGGGUUGCAGGGGGAUGUUGAGAAGAAGUGGUCCUUUGGU
+>U2AF2_K562_rep02_37
+AGUCAGAAGGUAGCAGGGGCUGGGGGUUGCAGGGGGAUGUUGAGAAGAAGUGGUCCUUUGG
+>U2AF2_K562_rep02_38
+UUGCUUCUCCUUUCUUCCUUCCUUCCUGCCCAGGGCCUCAUCUUUGUGGUGGACAGUAAUG
+>U2AF2_K562_rep02_39
+UAGAGACUGUUUAUUUGUUUGGUGGCUGGGAUGGAACACAAGAUCUUGCUGACUUCUGGGC
+>U2AF2_K562_rep02_40
+CUUAGGUAUGCCGAGCAGACAGCUGGAGGAUCCCGGGGCAGGGACACCUAGCCCGGUGCGU
+>U2AF2_K562_rep02_41
+AUUCUCCUGGGUUUUUGGCAGAUGGUUGCAGUGGCAGGACCAAGGCCUAGUGAGCUAUAGC
+>U2AF2_K562_rep02_42
+GCAGAUGGUUGCAGUGGCAGGACCAAGGCCUAGUGAGCUAUAGCUAAAUCUACAGUGGGAU
+>U2AF2_K562_rep02_43
+CCCCGUGCCUUGCCUCCCCAGGCGUGUGACCCCCUGCCGCACGAGGAGGAGCCCUCUGAAG
+>U2AF2_K562_rep02_44
+UUUACCCCACUACUAGGUAAGGGGCCUGGAUACCAAGAAGUGACUGCUCAUCUAAUCCAUA
+>U2AF2_K562_rep02_45
+GAUGGUCAUUGUCCUCCAGAGCAGUGAUGGAGGAAAUACCAGCCCAGGAAGCAGCAGGGUC
+>U2AF2_K562_rep02_46
+AUGGUCAUUGUCCUCCAGAGCAGUGAUGGAGGAAAUACCAGCCCAGGAAGCAGCAGGGUCA
+>U2AF2_K562_rep02_47
+UAGGCCUGUGAGGCUGCCACACCCUGUGCCCCCGUGCCUUGCCUCCCCAGGCGUGUGACCC
+>U2AF2_K562_rep02_48
+CAGGUCUCUCCUUACGGGGCCAGGGCAAUUUCUUUUCGUUCUUGCCCGUGUUGAACUGGGC
+>U2AF2_K562_rep02_49
+UACUUCUCUUUCCCUGUCCCCAAAGCAGAUCGCCAAACUGAGGCAGCAACUACAACGCAGU
+>U2AF2_K562_rep02_50
+GGCGUGUGACCCCCUGCCGCACGAGGAGGAGCCCUCUGAAGUGCCACAGCUGCGCCAGCCC
+>U2AF2_K562_rep02_51
+GUGGGCAGUGGGCGAGCCAGGCUGGGGGUUGUGGGGGAGGCCUGGGUUGCAGGUUUAAGCG
+>U2AF2_K562_rep02_52
+AAGUUCCACUCUUGUCCUGGGGACCCAGCUUUAACUUUAGCAUCUGGUAUGUUGAACUUAG
+>U2AF2_K562_rep02_53
+UCACUCCUUCUCUUUCCUAAGACUGACUUUAUGGCCUUUCACCAAGAACAUGAAGUGCGUA
+>U2AF2_K562_rep02_54
+GAGCGCAGCAAGACAGAUUAGGGGAAGGGGAGAGGAGAGACUUGGCUAGCAAAGGUCUUGU
+>U2AF2_K562_rep02_55
+GGAGCGCAGCAAGACAGAUUAGGGGAAGGGGAGAGGAGAGACUUGGCUAGCAAAGGUCUUG
+>U2AF2_K562_rep02_56
+CUUUCUCUUUCUCUCUUUCUCUCUCUUUCUGUCUGUCUGUCUGUCUUUCUGUCUUUCUUUC
+>U2AF2_K562_rep02_57
+UGUUCUGCUUUCCUCCUUAGGCCAGGUGCUGUGUGUGCUGCCGUCUGUCUGUAUUUUCUUC
+>U2AF2_K562_rep02_58
+GUGACCAGUUCUUUUGCAGGAAAUUGUUUCUGAGAAGACUGGAAGACAAGAAAUAUCCCAC
+>U2AF2_K562_rep02_59
+UCUAUAUUACAGGAGAUACAACUCGUCAACGAAUCAAAUUCAGUGAUGACAGAGUAUGCAA
+>U2AF2_K562_rep02_60
+UCUAUAUUACAGGAGAUACAACUCGUCAACGAAUCAAAUUCAGUGAUGACAGAGUAUGCAA
+>U2AF2_K562_rep02_62
+GUAACAGAGUAAGCAGGAAAUUCACAGGAGGUCUGCUCGGCUCAGAAACACUAAAUACAAA
+>U2AF2_K562_rep02_63
+GUCCUUUUCUCUGAGGAUGUGCUGCCUAGUGUCGUGGAAUCUGCCUGACCAUUGCAAGCAU
+>U2AF2_K562_rep02_64
+UUCCCCAUUCCAGAUCCUGGGUGUUUGGCUGACCUACAGAUACAGGAACCAGAAAGACCCC
+>U2AF2_K562_rep02_65
+AUUAACAUAAUGAACCAUAUUCAUUUCUUGGUCAGUUGUGAGCCAUUCUUUUAUUCCACUU
+>U2AF2_K562_rep02_66
+AUUAACAUAAUGAACCAUAUUCAUUUCUUGGUCAGUUGUGAGCCAUUCUUUUAUUCCACUU
+>U2AF2_K562_rep02_67
+CUUUUUCUUUCCUGUAUCCUUUUUAGGUUUCUAGCCAUCCAUGAGAAGGAAGUUAAUGAAA
+>U2AF2_K562_rep02_68
+UUCUUUACAGGGAACACUGAAAGGUUUUGACCAGACCAUUAAUUUGAUUUUGGAUGAAAGC
+>U2AF2_K562_rep02_69
+CCUCUUUUACCUAAUAGGUGGCCAGCAUCGAAAUGUUCAGCCUUUUAGUGAUGAAGAUGCA
+>U2AF2_K562_rep02_70
+UUGCUUUUCACAGGCGUGGGAUCCAGGAUGGUGUCCUCUGUGAGGACUUGAACUCUGGGGC
+>U2AF2_K562_rep02_71
+UUAUUCUCUCUUUCUGCAGAUGGGCUUUCUCCACAUGAUGGAGAAGAUGGCUGCCAGGUAC
+>U2AF2_K562_rep02_73
+CAUUCCAUCAUCAAAGGUAUUGAUAACAGAACAUGGCGACUUGGGAAAUGGAAAGUUUUUG
+>U2AF2_K562_rep02_74
+UCUCUAAAUUUUUCCCCCUACUUUCUUGCUUCUGUUUCACAUUUUUUAAAAGGGCAAGUAC
+>U2AF2_K562_rep02_75
+UCUCUAAAUUUUUCCCCCUACUUUCUUGCUUCUGUUUCACAUUUUUUAAAAGGGCAAGUAC
+>U2AF2_K562_rep02_76
+UUUUCAGAUUACUGAGAGUCUUCAGUUACUAGGUAAGUCGCCCCAUCCUUAUUACUCCAGG
+>U2AF2_K562_rep02_77
+UUUCAGAUUACUGAGAGUCUUCAGUUACUAGGUAAGUCGCCCCAUCCUUAUUACUCCAGGU
+>U2AF2_K562_rep02_80
+GCACGUGCUUUGCCCUGGGUACAGCCAGAGCCCUUCAACCCCACCUUGGACUUGAGGACCU
+>U2AF2_K562_rep02_81
+AGAGGACGAAAACGAAGCUUCGUUCCUGAGGAAGAAAAACAUGAGGUUGGAAUAAGUUAAG
+>U2AF2_K562_rep02_82
+UUUUUUUCCAGAGAACCAGAGGACGAAAACGAAGCUUCGUUCCUGAGGAAGAAAAACAUGA
+>U2AF2_K562_rep02_86
+GGUCUAUGGUACCGUUGCUUCAGGUGAUAUCCAGGGGUUCUCCUAUGUCUUUUGAAGAUUC
+>U2AF2_K562_rep02_87
+UUCUUCUCCCCUUUUUGCCCAGUUAAUCCAUAUUCAUCUGCAGAUAUGUUACCCAUGUUAC
+>U2AF2_K562_rep02_88
+UUUUUGUUUUUUCCACAGAUUCCUAGAUAGGGUUGUUCAUCUGUCAUCUUAAAAGGGUUUU
+>U2AF2_K562_rep02_89
+UUCUCUCUCUCUCUACAGAAUGGUCCUAGUGCCAGAUCGUGUCAUAAAAUGUGCAUUGAUA
+>U2AF2_K562_rep02_90
+UUUUUGUUUUUUUUUUUGUUUUUUUCCAGAGAACCAGAGGACGAAAACGAAGCUUCGUUCC
+>U2AF2_K562_rep02_92
+UUUUUUUUCUUCUGUCCUUUUGUGUGUGUCCUUCCCUCUCAUCGUUGGCCACUCAUAGAUA
+>U2AF2_K562_rep02_93
+UCUUGUGUAGGUUUUUCCGUCGUGGCUGGGUGACCUUCGACCGCAGUGUUAACAUUAAAGA
+>U2AF2_K562_rep02_94
+CAGUUUCUACAGACUGCCAUUGCUAUGCACGGCUGAGAUGGACAGAGUUUGCUUGUGAAUC
+>U2AF2_K562_rep02_95
+AAUUUAUUUCAAAGGAUGCGAAGUACAAAACUGCUUCGGCUCAUUGACUUAGAUUUUUCAU
+>U2AF2_K562_rep02_100
+UUUUCAUUUCCUUCAGAGGGCAGAGGUGGCUCAGAGAGAGGCGGAGACCUUAAGGGAACAG
+>U2AF2_K562_rep02_103
+CUACAGUGUUCUCAUUCCUCAGAGCAGCCAGGAUGUGUUAUUUCAGGAGUUUGUGACAUUC
+>U2AF2_K562_rep02_104
+CUACAGUGUUCUCAUUCCUCAGAGCAGCCAGGAUGUGUUAUUUCAGGAGUUUGUGACAUUC
+>U2AF2_K562_rep02_105
+UAGCGAUAGGGUCUCACCAUGUUGCCCAGGCUGGUCUUGAACUCCUGGACUCAUCCUAAAG
+>U2AF2_K562_rep02_106
+AGCGAUAGGGUCUCACCAUGUUGCCCAGGCUGGUCUUGAACUCCUGGACUCAUCCUAAAGU
+>U2AF2_K562_rep02_109
+CUUGUUUCUUCCUAAGUAUAAGGUCUCUGAGAAGGUCUGUAGAGUGUGGCUUAGAUUCCAG
+>U2AF2_K562_rep02_110
+UUGUUUCUUCCUAAGUAUAAGGUCUCUGAGAAGGUCUGUAGAGUGUGGCUUAGAUUCCAGG
+>U2AF2_K562_rep02_111
+AAGUGGUCCUUUGGUCAGGGUGGGAAGCCAACAGGAUUUCCUGGUGCAUUGGAGGUGAAAG
+>U2AF2_K562_rep02_112
+GAAGUGGUCCUUUGGUCAGGGUGGGAAGCCAACAGGAUUUCCUGGUGCAUUGGAGGUGAAA
+>U2AF2_K562_rep02_116
+GACAGCCAGGUACCAGGUGAGCUGAGGAACCCUCUGCUUUUCCUCAGGGACUAUUGCUACU
+>U2AF2_K562_rep02_117
+ACAGCCAGGUACCAGGUGAGCUGAGGAACCCUCUGCUUUUCCUCAGGGACUAUUGCUACUG
+>U2AF2_K562_rep02_118
+UCAUUCCCUGCUCUAUCCCCAGGCCCAGGGCACUGCCUGAUGCAUGGUAGCACUUAUAAAU
+>U2AF2_K562_rep02_119
+CUUUUUAGCUCCUUGUUUAGUCAUUCACUAAUUUCCAUACAUGAUAACGAAUUCUUCGGUG
+>U2AF2_K562_rep02_121
+UUUUCUCUAUUCCAGUGGCCCUUUCUCUGCAGCUGGGCCCCACACCUACAUCCAUCCGUUU
+>U2AF2_K562_rep02_122
+GCUAUGACUUCACACCUAUGGAUUCUUCUGCAGUUUAUGUGUUAAGUAGUAUGGCUCGCCA
+>U2AF2_K562_rep02_123
+UUUUUGUUUUGGUGGCAGGGGAUAGGGUCUCCCUCUGUCUCCCAGGCUGGAGUGCAAUGGU
+>U2AF2_K562_rep02_126
+AGGGGCAGGACAGAGCCCUUUCCUAGGGAAGCCCGGCACCCCCUGCUGUCCAGGGAAGGGG
+>U2AF2_K562_rep02_127
+GAAGACCGAGGCGGUUUCAGGGGAUUGUCCCCUCCAGGGUCUGCUACACUGUCUGAAGGAG
+>U2AF2_K562_rep02_128
+GGAUACCCUCUCUAUGAUCUUCAUUCUCUGGCCAUGGUGCUACAGUGUUCUCAUUCCUCAG
+>U2AF2_K562_rep02_129
+GGAUACCCUCUCUAUGAUCUUCAUUCUCUGGCCAUGGUGCUACAGUGUUCUCAUUCCUCAG
+>U2AF2_K562_rep02_130
+AGUGGGAGUGCGGAGGGGCUCCCGAGGGGGCUCCUGGGCCUGGUUUGAGAGAGGCCAAGAA
+>U2AF2_K562_rep02_131
+AGUGGGAGUGCGGAGGGGCUCCCGAGGGGGCUCCUGGGCCUGGUUUGAGAGAGGCCAAGAA
+>U2AF2_K562_rep02_132
+UUGUGUUAUUGCUUCCAGGUCAGGGGUCACCACAUUGCAAAACUUGAUCCUCUCGGAAUUA
+>U2AF2_K562_rep02_133
+GUUUUCUGGUAUUUUCUAGCAUCCUUCUCACCACAGCCAUAACCCUUUUUUACUUCCAUUA
+>U2AF2_K562_rep02_134
+UCUCUUUUUGCUCACCUGGGGAGUUCCUUCCCCUUUCCAUAAACUGUGGUCCCUGCAUGGC
+>U2AF2_K562_rep02_138
+CACCAAUCACACUUUCGCAGUGGAGAAAGUGCUGUGACUUUCCUCGCCAGGCGCCUCCCUC
+>U2AF2_K562_rep02_139
+GUUUAUCAGCCAUAGGUUGGAGGCAACAGCUGGAAAUGGCUCUUCCCCUUCAAGGUUGUAG
+>U2AF2_K562_rep02_140
+UCCACUUGCAUUCAUUCUCCACUGGCCCUCCGUAUCCACAGAUUCCCGCAACCAACUGUAU
+>U2AF2_K562_rep02_147
+UGUCAUUUUUUCCUUUUCCAGGCAUCCUUGUUCAUCUAGCAAUAUCUGAACUGCAGUGCAU
+>U2AF2_K562_rep02_149
+CUGUUAUAGUGUGACUGUUGCUUUUUUGUCUCCUUUUCUUUUAAACAGGGUUUGUGGAUGC
+>U2AF2_K562_rep02_150
+UUUUUUCUAGAGAUGGUUUCUACCCCGACUGUUUCCCAGGCUGGUCUGAACUCCUGGUCUC
+>U2AF2_K562_rep02_151
+UUUUUCUAGAGAUGGUUUCUACCCCGACUGUUUCCCAGGCUGGUCUGAACUCCUGGUCUCA
+>U2AF2_K562_rep02_158
+UUGAUUUUGGUUCAUCUCUUUUUAGGUCUGAUGCCUGGAGGGAGGGUCAAGCUGGUACAUA
+>U2AF2_K562_rep02_159
+UUCUUUUUGUCUACCCAUCUCCCUUCAGUCUUAAUAAAAGGUCUUAAACAGUUACAUGAGA
+>U2AF2_K562_rep02_165
+ACCAUUUUUUUCAGGUGAUUGAAGCAGAGCAUAUAUGAUCUCCACAUAUCAAGACUAACGG
+>U2AF2_K562_rep02_166
+CAAUUUCUGUGACUGUCAACCCUCUUGUGUCCUCCUAACCUCCUUCCUCAGCUUGCAUGGA
+>U2AF2_K562_rep02_169
+CCAUCACCUCUCAACCUUUGCUUCGACAGGUCUUCACUCACGAUUUAUUCCUCCAGGUCUU
+>U2AF2_K562_rep02_170
+AGGCUGGGAGGCAGGGCUGAGAGGUGGCCGAGAGAGAGGAGUCGCAGAGCCGCCAGAGUGA
+>U2AF2_K562_rep02_171
+ACCUUUUUUUCUUCCCAGCCUCAGGUAUGAAUCAGCAGCAUGAAAAUGGAUUUGAAUACAG
+>U2AF2_K562_rep02_179
+CAUGUUCCAGCCUUGCCUUUAGGAAGGGAGGACGUUCCGACCAGCCCGUUGUUCAGGGUGG
+>U2AF2_K562_rep02_180
+UGCUCAUCCCACUCUUCCUUUUACUAGGUAAGUCAAAUCUGGCUGAGUUGCCUCCGAUGGC
+>U2AF2_K562_rep02_181
+CUGUUGGCCAGUUUGCUGGGGGAAGCGGGCCAGGAACCAGCCCUGGCAGAAGUGUUCCACC
+>U2AF2_K562_rep02_182
+CUGUUGGCCAGUUUGCUGGGGGAAGCGGGCCAGGAACCAGCCCUGGCAGAAGUGUUCCACC
+>U2AF2_K562_rep02_183
+CUUUUUCUUUUAUAUGGGGGGCCGCAAAGGCGUCGACAUUCCAGAUGGCUAUCCUGCUUCA
+>U2AF2_K562_rep02_184
+UCCCUCUUUCCCGACAGCAGCUGCGGCAAGAGAGCCCUGCCCUCUCCGAGGCCUGCUCAGC
+>U2AF2_K562_rep02_185
+CUUCCUGUUUCUCUCCCAUAGGAGAGGGCUGAACCCCCCUCAUCGUGUCAAGUCAAUCUCC
+>U2AF2_K562_rep02_186
+GACUAUUGCUACUGAUGGAGUGUGGCCUCUCUCUCAUCCCAUCUGUAGACCUUGCCUGGAA
+>U2AF2_K562_rep02_187
+GACUAUUGCUACUGAUGGAGUGUGGCCUCUCUCUCAUCCCAUCUGUAGACCUUGCCUGGAA
+>U2AF2_K562_rep02_190
+CUUUUUCCCCCAUCCAACAGGCUGUGUGGUUCCGGUGCUGGUGCCGUGGAAGUGGCAAUGG
+>U2AF2_K562_rep02_191
+AUCUUCUUCACCAGGCUUUUCUGAUGUGGAUCACACCUAUGCUCAAAGAACUCAGCUCUUU
+>U2AF2_K562_rep02_193
+GUUCACUUGGUUUCUAGGUCUAUUCUGGAUAAGCAGGUUUUGUGAAGACAUUUAUUCUUUC
+>U2AF2_K562_rep02_194
+GAUAAUAUUAUAUUUCUGAGUGACCAGACGAAAGAGAAGGAGUAGAAAGGAUGAUUCUUCU
+>U2AF2_K562_rep02_196
+AUUAUUUCAUUAUCGUUUCUCUGCAACCUUUCUUCAAUGGUACUAAGCAAGACACAUCUGG
+>U2AF2_K562_rep02_197
+AAGGCAUGACCUUCCUUUCUCCUUGGCAUAGGCCUUACAACACUGAGGAAAGGCCAUGGUU
+>U2AF2_K562_rep02_198
+ACUUCACCAUUCCUUUCAGAAAAAAGGAGAAGAAAAGAACCUACUGAAAACAUUUCUGGUU
+>U2AF2_K562_rep02_199
+UUCUCCAGCUGGUUCUUUUCAUUUUACUGCAGAGAUAUUGCCGGAUCAUGACAUAAAAGAU
+>U2AF2_K562_rep02_200
+UUUUUUUUUUUUUCCCCUCGUAGGCUAUUAUUCGUGAAUUGGGUGGUAUUCCAAUUGUUGC
+>U2AF2_K562_rep02_202
+CCCCCUACAGGCUUUUGUCUUAUUAAGUGAUCUACUUCUCAUCUUUAGCCCUCAGAUGAUU
+>U2AF2_K562_rep02_203
+CUUUCCUUCCUUCUUUCCUCUUUUUUUCUUUCCUCCCUCCCUCCCUUUCUUUCUUCCUUCC
+>U2AF2_K562_rep02_204
+CUUCUUCCUAGCUGAUAUUCAGCAAUGAGUAUACCCAGGCAGAAAACCAGAAUUGGCACCU
+>U2AF2_K562_rep02_205
+CCUUCUUGUCUUCCACAGGUCUAUAGUGAGCGAGAGCUGCUACUUUUUACUUGGGCAUUCA
+>U2AF2_K562_rep02_206
+UCUUUCAGCUCUGUGUUCUCGUUUUGCCCAAGACCUUUGGCUAGAGCAGAACAUAAAAGAU
+>U2AF2_K562_rep02_207
+UCUCUUGUAACUCCUCAGGCAUUUCUCACAAGAGUGGCAAAGAUACAGCAGGGUGCAUUAG
+>U2AF2_K562_rep02_208
+UUCUUUCAUGACCUUUUUUCUUAUUUAGAGAUCCUCCAUAGAUAAUGAAAACCUGGUUUCA
+>U2AF2_K562_rep02_210
+UGUGCACACCUCACGGCAAGGGCCAGCCUGUUUCCUCCCGGUCACCUCCAAAUCUUGCUGC
+>U2AF2_K562_rep02_211
+UGUGCACACCUCACGGCAAGGGCCAGCCUGUUUCCUCCCGGUCACCUCCAAAUCUUGCUGC
+>U2AF2_K562_rep02_212
+UUUUUUUAAGCGUUUGGCAACAUAUUGACUGCAUGGGGAUUGAUAGGCAGCAUAUUCCUGA
+>U2AF2_K562_rep02_213
+UUCCUAGGACUAGUAGAUGCUGCAGUCGAUGCAGCACCAGGAGCAGGUGUGUGUAUACCAU
+>U2AF2_K562_rep02_214
+UUAUGUAUUGUUUCCCUCUUUGUUUAGCUUGAACAUGCGAAAGUGACACAGACAGAGUUGA
+>U2AF2_K562_rep02_220
+UUUAUUUAUUUUCAGAGGGCGCCUCACUCUGUUGCCCAGGCUGGAGUGCAGUGGUGCAAUC
+>U2AF2_K562_rep02_221
+AACCUUUGCUUCCACAGACUUUUUCAUCCCUAAGAUACUAGAAGAAGAGCAUACAUAAACG
+>U2AF2_K562_rep02_222
+CUUCUUUUCUAGCUACUCUCGGAACCGCACGUUUGACACGUACAUUGGGCAGGGCUACGUG
+>U2AF2_K562_rep02_223
+CUUGGGCUUCUUCUUCACAGGGUCUCAUAAGCCAUGGCACAAGACAAGAUUUGAGAGUGGC
+>U2AF2_K562_rep02_231
+CUGCUACUCUUAAUCUUCUCUAAAUUUUUCCCCCUACUUUCUUGCUUCUGUUUCACAUUUU
+>U2AF2_K562_rep02_232
+GCUGCUACUCUUAAUCUUCUCUAAAUUUUUCCCCCUACUUUCUUGCUUCUGUUUCACAUUU
+>U2AF2_K562_rep02_233
+UAUUAUUUCUUAGGACCAGAAGUCCUUGAUGAGGAAGGAACUCAAGAAGACCUAGAGUACA
+>U2AF2_K562_rep02_234
+UCCUGCUGACACCCCUUGGGCUGGAGAGGCCUCCUCUGAAAGGGAGCCCUGGGAAAGGGCU
+>U2AF2_K562_rep02_235
+GUCCUGCUGACACCCCUUGGGCUGGAGAGGCCUCCUCUGAAAGGGAGCCCUGGGAAAGGGC
+>U2AF2_K562_rep02_240
+UUUACUUCCAUUAGGCCGUAUAACUGGAGAGACCUGCUGCUCGUUAUAUAAUUAUCUGAUA
+>U2AF2_K562_rep02_241
+UCCUCCCAAGCAGAAAAUAUCCUAGGGGCAAGCCUGUGUAUGAUGUGCCUGUUUCUGUUAU
+>U2AF2_K562_rep02_246
+AACUUUUUUGUUUCUUCCUUCUCUAUCCCUUUACUUUAGCUUUUAAGUGAAUUUUGAUUUU
+>U2AF2_K562_rep02_247
+UGCUUUAUUUUGGUAGUUGGCGCAGAUCAAGACUCCAUCUGAAAAAAACAAGUGUAUAUAU
+>U2AF2_K562_rep02_251
+CUUUUCCCCCAUCCAACAGGCUGUGUGGUUCCAGGUGCUGGUGCCGUGGAAGUGGCAAUGG
+>U2AF2_K562_rep02_256
+UAAGUUUCCCUGCCGCAGAGUGAAGCAGAUACGUGUGUGUUGGGGCAUUCGGGGCAUGGAG
+>U2AF2_K562_rep02_257
+GAAUUUGGCUUUUUUGCAGGUCCCUAGCUGUUGGUAGUAAGUCCGGUUAUAAAUUUUUCUC
+>U2AF2_K562_rep02_258
+CUUUUUCGUUCCAGAGCGCCGCCCUGUGCUGGGCUGCCGGGAGCUCGUCUUCAGGAACCUC
+>U2AF2_K562_rep02_269
+AACCCUACAGCCUACCCGUUCCAUCCCGGGCUAUCCCAGUUCCCCACUGCCAGGGAACCCC
+>U2AF2_K562_rep02_270
+CUUCCAGAUGAGAUAUCACAGAGGCUUGGGCCUAGAUUGUCAUCAGCAUACUGCUAUACUA
+>U2AF2_K562_rep02_271
+UUCACUCCUUGUCACAGUGAGCACAGUAGUGCCACAGGGUCCUGGCGAGGACCUAUGAAGC
+>U2AF2_K562_rep02_272
+CUAUUAUUUUACCUAUCCCUUUGUUCCUUUCCUAUUCUCUGUACUUGUAGUCUGACGUGUG
+>U2AF2_K562_rep02_282
+UUGUCCCCUUCUCCACCACGUAGGAUCUGAAGAAGCUGAAGAAAAACAGGACAGUGAGAAA
+>U2AF2_K562_rep02_285
+CCGUUUAUCUGUAGGAUAUUGGGAGUGUGUGGCAUGCAUCCUCAUCAUCAGGAAACUCUAA
+>U2AF2_K562_rep02_286
+ACCCUUUGUCCCCACUUGCUGCCGGGAUGAGAGGUAAGCACGGACCCGCCCACCCUCUGAC
+>U2AF2_K562_rep02_293
+GUUUCUCUUCCCUUCCCCCCUUCCCCUGCGGUUGUAGAGCCCGUUCUGUCCGGUCGUGGUU
+>U2AF2_K562_rep02_294
+CCUGUUUUUUCUAUUCCUCUUCCUUUUCAAUGGCUUAGGUAUUGCAGUUUCUUAUUUCACA
+>U2AF2_K562_rep02_295
+UUAUAAAUUUUUCUCCCUUUCUUCUGUGGAUAAGCUGGAACAGAUCUAUGAAUGCAGUAAG
+>U2AF2_K562_rep02_296
+UCUUCUUCCAUUUUUAUUUCCUUCCCCAUUCAGCACCACAUGAAUCAGAAUUUUUUUGAAA
+>U2AF2_K562_rep02_297
+CUGUUUCCCUAUUAUUUCCUUACUCUGCUGAACAUGUCCGCUGUUUUACCUCACUGCUCCU
+>U2AF2_K562_rep02_298
+CUGUUUCCCUAUUAUUUCCUUACUCUGCUGAACAUGUCCGCUGUUUUACCUCACUGCUCCU
+>U2AF2_K562_rep02_299
+UCUUCUUAUUCAGGCAACAUAAGCUUUACAACAAGGAGUUGUAUGCUGACUUCAUUGCUGC
+>U2AF2_K562_rep02_300
+UCCAGACCGCUCCUGAGUGGGAGGAGGGGUUCCUGUAGCCGUUGCGUCUUCUCAAACACGG
+>U2AF2_K562_rep02_301
+UACAGAGCCAUAAGUGUGAUCCUUGGUGACAGGUGGAAGAAAAUGAAGAAUGAAGAGAGAA
+>U2AF2_K562_rep02_302
+UUCUUUUUCUCCUCCCCUGGCAGCAACAGCCAGGCCUGUAGCAGUGCCCUUCGGAAACCAG
+>U2AF2_K562_rep02_303
+UUUUCUCACUUUUCCAGUGGUCGUAGCAGGAACAGCGUCUUGACCUCACAUCAGUGACGUG
+>U2AF2_K562_rep02_304
+UGGGGAUGUCUGGAAAGGUUGUUGCCGAGGGGGCUGGGCGCAGCCACCCUGUCCCGAGCAG
+>U2AF2_K562_rep02_319
+UCACUCUUUUCCCUGACCCUUGGGGCCCAGGGCCAUGGAGGGACCCUUAGGAGUUCAAUGA
+>U2AF2_K562_rep02_320
+UCACUCUUUUCCCUGACCCUUGGGGCCCAGGGCCAUGGAGGGACCCUUAGGAGUUCA
+>U2AF2_K562_rep02_321
+UCACUCUUUUCCCUGACCCUUGGGGCCCAGGGCCAUGGAGGGACCCUUAGGAGUUCAAUGA
+>U2AF2_K562_rep02_322
+AAUGCUCAAAUUGGUUUGGGGGAGCUAUAGGAAACAGUCUCUGAAGAUGCAUAAGGGGCAG
+>U2AF2_K562_rep02_323
+UCAUUGUUGAACUCCCACUUUAGCAGAUCACAGAAGAGGAGGUCAGAAAUCUGAAGCACAA
+>U2AF2_K562_rep02_324
+ACUCUAAGUUUACUUCUGUUCUCCCUACACUUCCCCACGUAUAUUAUUCGAGUUAAUUUUU
+>U2AF2_K562_rep02_325
+UCCUUUACUCUCAUUUCAACUUCCUCCAUAGUAUUGCUGUAAUUAAUCAAAGUAGGCAAAG
+>U2AF2_K562_rep02_326
+UUUUCAGUCUUUCCCAUAAAGGUAAUGAAUUUUGGGGCACUACACAAACACUGAAUGUUAA
+>U2AF2_K562_rep02_327
+CAAUAGCAGACUCCAGUUUGGGAAUUGAUCCUCUUCGGAGACCUGGACUUCACAUAAACCA
+>U2AF2_K562_rep02_328
+UCAAUAGCAGACUCCAGUUUGGGAAUUGAUCCUCUUCGGAGACCUGGACUUCACAUAAACC
+>U2AF2_K562_rep02_329
+UUCCUUCUAUCUUUCCCCGUCUUUUCUUCCUUCCUGUAUUGACUUGUUUUGACACAUUUGU
+>U2AF2_K562_rep02_345
+CUGCUUCCUUCCCUGACAGGCGGCUGUGGUGCUUCAGGCAGCUUUCAGGGGACAUCUCACG
+>U2AF2_K562_rep02_346
+AUAUAUUUUCCCUCCCUUUCUUCCUCCCCUCCCCUCCCUCGCUUCCUUCCUUCCUUCCUUU
+>U2AF2_K562_rep02_347
+AUAUAUUUUCCCUCCCUUUCUUCCUCCCCUCCCCUCCCUCGCUUCCUUCCUUCCUUCCUUU
+>U2AF2_K562_rep02_348
+CCUUUCUCUUUUUAGCCCCUGGAGGAACGCGCAUAGAUGAUGGUGACAAGACCAAGAUGAC
+>U2AF2_K562_rep02_349
+UUAAUUUGUAGUUCCAAUGACAGGAUUUACACAGAGAGCAACUAUUGAUCCAGAACUGAAU
+>U2AF2_K562_rep02_350
+UCCUUUCCUCCUCCUUUCUCCCCAUCUCCCUCCACCGCCUUUUUUUGAUUGACCAAGGAUC
+>U2AF2_K562_rep02_351
+CUGUUUUAGGAUAUUAGAAAUGGCUACUCCCCAGUCAAUUUUCAUCUUUGCAAUCUGCAUU
+>U2AF2_K562_rep02_352
+AAUUUGCUUCUUUCUCCCAUCAGCAUUACCUUGUGGUUUUCUUCUGCAUUUGAGACACAGU
+>U2AF2_K562_rep02_365
+CUCAGAAGAGGGUUGGUAGGCCUGGGGGAUGGAUGGGGUUGCUGAAGGCCAUGGCUGAAGC
+>U2AF2_K562_rep02_366
+UUUUUUUUCCUUGUCACUAGGUUCCACUAGCACAGUCAGUUUACUUUAGGUUUAUGUCUAA
+>U2AF2_K562_rep02_367
+GUGUGGCGGGCAGGGCGGCUCCUGGAGGUGGGAUCUGGGUCAGAGUUACUUCAUGCAUGUC
+>U2AF2_K562_rep02_368
+UUCCCAAAUGCUGGAAAAUCCUCUUUGCUAAGUUGUGUUUCUCAUGCAAAACCUGCAAUUG
+>U2AF2_K562_rep02_369
+UAGUUAAUAUCUUUGUCCAUACAUCUUUCCAUGCAUCUAUGAUUGUUUCUUUAGGAAUAGA
+>U2AF2_K562_rep02_370
+GGGUAACUUUUUUGCCUGUCUCCCAUCCUCCUUUACUCUCAUUUCAACUUCCUCCAUAGUA
+>U2AF2_K562_rep02_371
+UUUUCUUGAUAGGACCUUGCUAAGCAGUACUCUGACAGACUAGAAUGCUGUGAAAAUGAAG
+>U2AF2_K562_rep02_372
+UUUUAGCUGGAAAGUGAAAUUUCAACCACAGCAGAUGACUGCAGUUCAGAGGUAAGACUAA
+>U2AF2_K562_rep02_373
+CUUCAUGUUUUGAGUUGGUUUCUAUUUUCCCUUCAUUUCAGUUAAAUCCUUAAAUAUAAUU
+>U2AF2_K562_rep02_374
+UUCAUGUUUUGAGUUGGUUUCUAUUUUCCCUUCAUUUCAGUUAAAUCCUUAAAUAUAAUUU
+>U2AF2_K562_rep02_375
+CUCUCCCGCUUGCCUCUGGCAGGAGCUGGGCUGGUGAUGAAGGUCAAGCAGGAGAAGCCGG
+>U2AF2_K562_rep02_376
+UUUGUCUGACUUCUUUCACUUUCAGCUUACGAGGAAAUAUUUCAGUAAAAGCAGUUAAAAA
+>U2AF2_K562_rep02_377
+CAACACUCUUAUAUACCAAAGUGACCUGAAGGACGGAUGCUGUGUCUUGUUUAUCUGCAUA
+>U2AF2_K562_rep02_378
+GUGUCCUUUGCCUGCAGAGACCUGUCUGGGCCGCAGAGAGGAGUCUGGAGGUAGGGUCCAA
+>U2AF2_K562_rep02_379
+GUGUCCUUUGCCUGCAGAGACCUGUCUGGGCCGCAGAGAGGAGUCUGGAGGUAGGGUCCAA
+>U2AF2_K562_rep02_380
+CUCGUUUUCUUUUUUAGGCCUGAUCAACCCCGUAUAACCAAAGAUGUAAUUUGUUUUCAUG
+>U2AF2_K562_rep02_399
+CUUCAUUGAUAGCUAACUUCUCCUUUGCCACUUACUGAACGGUCUGAUCUCUGGAGAAUUC
+>U2AF2_K562_rep02_400
+UACAGUACGGGGUGGACGUGAGGAGCCGGGACGCCCGGGGCCUGACUCCACUGGCAUAUGC
+>U2AF2_K562_rep02_401
+AUUUCUCUGAAUUUCUAGAUAUACACCUGAAGAAAUUGAGAAGCUCAAGGAGUAAGUUUUA
+>U2AF2_K562_rep02_402
+UUCUCUCUCCUCUCUCUCGUCCUCUACCCCUGCCCCCUGGGUGUUUUUGCAGUUGGUUAGU
+>U2AF2_K562_rep02_403
+UUAUUAUCCCUUGUAUGGCAGGAAAGAGUUCCUAGAGAGAGAAGACAAAGACAGUCUGUGU
+>U2AF2_K562_rep02_404
+UUAGGUAAUUUCAUCUGUGCCAAAGCCUCCAGAGGACAAGCCAGAAGAUGUACAUACAAGU
+>U2AF2_K562_rep02_429
+AUAUCCUUCAUUCUUUAGGCACUGUGAGCCCUGAGAUGUUCAAGAAGAUGUCCAACUCAGA
+>U2AF2_K562_rep02_430
+UGUGCAUGUGUGGGUGUGUGUGGGCACAGGUGUGAGUGUGUGAGCAACAGUACCCCAUUCC
+>U2AF2_K562_rep02_431
+UGUGCAUGUGUGGGUGUGUGUGGGCACAGGUGUGAGUGUGUGAGCAACAGUACCCCAUUCC
+>U2AF2_K562_rep02_432
+CUUUCCCCAGCCUGACAUUUACCCCGGUAACUGCUGGGCAUUUAAAGGCUCCCAGGGGUAC
+>U2AF2_K562_rep02_433
+CGUGGGAAGGGAGGCUGGGAGACAGAGGGGACAGUGGCUUCCUGGGUCUGUGAAGACUGAU
+>U2AF2_K562_rep02_434
+UUCUGUCUUCCGUUUUCAGCUAAAUUCUGUCCAACGUUUAAUAAAUCAAUGGAGGAACAGG
+>U2AF2_K562_rep02_435
+UUAGCUUUGCUCUACAGGUGUUGGAUGACAAGGGCUCGAGCCUCAGCGCCUGUCCUGAUUC
+>U2AF2_K562_rep02_436
+ACCUUCCUUCUACCUUUGGGCUUCUGCAUUAGGCUGCUCUUGAAGUGUUUGCCGGGGCCUU
+>U2AF2_K562_rep02_437
+UCUCUCCCGCAGCCCACAGAGCAGUUCAACGGGCAGGGCGCCAGCUUCAACGGGGGCAGCG
+>U2AF2_K562_rep02_438
+AUUCCUUUUGCUUGUUUCACAGGGGGUUUGAAGAGGACAAAUAAGUUUUUGUUGGUUAAUU
+>U2AF2_K562_rep02_439
+UAUUUUUUCCCAGUGCCGACCUCACUUUCCCCACUUGUCCGACCUGCUGCCCAGGCGUCGA
+>U2AF2_K562_rep02_440
+CUUCCUGCCCUGGCUCCAUCCUCAGGGGCUCCCUGCAGACAGGGGGGGCCUUCGCCCUGGA
+>U2AF2_K562_rep02_441
+UGCCACCCUUUUUUCCUUAGGGUCAAGAAGACUGACUGACAGACCAGGACCCCACCAGGGG
+>U2AF2_K562_rep02_442
+UUUCUUUCUAAUCAUUUUUCACCCUUUCUUUAUUUCUUUAAUUGAGUAAUUCCAAGUAAGA
+>U2AF2_K562_rep02_443
+CCCUUUUUAUCUCUAGUAACACUUGUCUCUCGCCUCAAAGUCUUCUUAGCUACACCUGCUU
+>U2AF2_K562_rep02_444
+CUCCUUUUCUUUUUUAAAAGCUUGGCUACACUGUAACUAACUAGGGUUAAGAGUACCAGUA
+>U2AF2_K562_rep02_445
+CUUUGCCCUGUCCGGUUCUGGCAGGUGUGUGGACCCAGGCACUGGGAAGACUCAGCGAGCC
+>U2AF2_K562_rep02_2538
+UUUUUCCUUCUUUUCCCACCCCCUCCCCCUCCAUGUGAAGAUUUGGGUGCUUAACAUAUCA
+>U2AF2_K562_rep02_2539
+GAUCUGGUUUUCUUCUGGGGCAUUUAUCCGUGCUGAUCUUGGUGAAUGGGGCAUGAGUCUA
+>U2AF2_K562_rep02_2540
+ACUAUUUUAGGAAUCUGGAAAACCAGGGGCUCAUGUAACUGUGAAGAAGCUGUUUGUUGGC
+>U2AF2_K562_rep02_2542
+AUUUUUCAUUUCGUAGGAGGGAGCAAAGGAGUUUGCUGCUGCUCUCACCGCUGAGCGGAUA
+>U2AF2_K562_rep02_2543
+UUUCCCCCCAGAAAACUUUAGAAACUGUUCCUUUGGAGAGGAAAAAGGUACUCUGCCAGCA
+>U2AF2_K562_rep02_2544
+GUAUUUUCCUUUGCAGAGAGAAAAGGAACAGUUCCGUAAGCUCUUUAUUGGUGGCUUAAGC
+>U2AF2_K562_rep02_2546
+CCCAACCUUUUCUUCUUUCCCAACUUCCCCUUCCUUUCAUAACGUUUUAAGAAAAGUAUAU
+>U2AF2_K562_rep02_2547
+GUCUUAUCCACCUUUAGGAUUGGAGAGGGAGAAAGAAAAACUGCUUUGUGUGCCAAAAGCA
+>U2AF2_K562_rep02_2548
+UUGCAGCUUUUCAUGCAACACCCAACACUUAUAAGCGGAAGAACACAGAAACAGCUCUAGA
+>U2AF2_K562_rep02_2549
+UACAACUGAACUUUUUUUCUUUUUAGUUACUCCACAGGAUCCGCUGAACAUAGGAUGUUGC
+>U2AF2_K562_rep02_2550
+UUUUUUUCCUUUGGCAGGAAGGUGUCUUGCUGCAGGUAACUAAUGAAGAAGUGGUCAACCA
+>U2AF2_K562_rep02_2551
+UUUGUGUUUUUGCAGGUUGUGGGCUGCACACUGCAGAAAGAUACAGCUGAAAAAGGGUUAG
+>U2AF2_K562_rep02_2552
+GUGUUUUUUUCUGUUUGGAUGACUUUUACCCCACCACUAUUUUAGGAAUCUGGAAAACCAG
+>U2AF2_K562_rep02_2553
+AUUAUGCAUUUUCUCCCCAGGUCAGCUGGCUGCCUCAUUGCCACCUCCACCUGCAGGAAGG
+>U2AF2_K562_rep02_2554
+UCCUGCAGGCAUCUCUAGGUACAACAAAAUACUGCAGUUACUUCUUAAAGAAUAUGCAGUG
+>U2AF2_K562_rep02_2555
+UCCCCCUCAGCUUUGUGUCCCUCCUCUAAGGAAAUGGCCCCCGCCAUCGACUGGUUGUCCU
+>U2AF2_K562_rep02_2556
+AACAGUUUAUAGUAAACGUAAUCUUUUUUUGGCCCCUAACAGAUGGAUAUGGCAGUGGACG
+>U2AF2_K562_rep02_2557
+UUUCCCCUCUUUGAACCAAGCCACUCCUACCUAGGAACUAAAUGGGUAUAUAUUGCCUGUU
+>U2AF2_K562_rep02_2558
+UUUGUCUUUCCUCCCUGGGGACCGCUGCCACCCGUGCGGGCCGAAGCCUCGCGAAGCCGUC
+>U2AF2_K562_rep02_2559
+UCCUAAUUGCCUCCUUUAUAGCAAAAGAACAUCUUCAUCCUAAAUCUUCUCUCCCAGCAUG
+>U2AF2_K562_rep02_2560
+CUUUUUCCUUUACUCCUGGCAGGCUAAUAUUUUUUUAAAGAUUAUACUUCAUAUCUGUGAG
+>U2AF2_K562_rep02_2561
+UUUCCAUAUUUCUAGUUCCACAGGAAAGCGAGUGACCUCGCACCUAUAUCCAUAGCAACCA
+>U2AF2_K562_rep02_2562
+UACUCCACAGGAUCCGCUGAACAUAGGAUGUUGCCACAAAAUCUACCUCGUGUAUUUUUCU
+>U2AF2_K562_rep02_2563
+UUUUUUUUUUUUUUUUUGUUCUUCUCCUUUAGGUGGUAAAUAAAGAUGUCCUGGACGUUUA
+>U2AF2_K562_rep02_2564
+CUUCUUUUCCUUUACCCCUCUUCCUCCUGCAGGCAUCUCUAGGUACAACAAAAUACUGCAG
+>U2AF2_K562_rep02_2565
+CUCCCUGCUUCUCUCCAGUCUCUCUUGUGCCCAGAUAGACCAGCCAGAGUUUGAUGUUCCC
+>U2AF2_K562_rep02_2566
+UUUUUGAGAUAGGGUCUCCCUCUGUCGAACAGGCUGGAAAGUGUAGUGUGUGAUCAUCUUG
+>U2AF2_K562_rep02_2568
+AAUCUAGCAUCAUAGCUCCAGCUCCCGCUGAGGAUGUGGAUACUCCUCCAAGGAAAAAGAA
+>U2AF2_K562_rep02_2569
+AAGCUUAUAGCUUCAUUGCACCAUGUGUGGCAUUUGGGCGCUGUUUGGCAGUGAUGAUUGC
+>U2AF2_K562_rep02_2570
+UUGGAGAGGAAAAAGGUACUCUGCCAGCAGGUCACCUCAUAUUUAAGAAUUUAAUUUCCUG
+>U2AF2_K562_rep02_2571
+AUUCACUCUUGAUUCCGCAGGCUGGACAGGAAGCACGGCAGCAUCUACUCGGCUUCUGAGG
+>U2AF2_K562_rep02_2572
+UCUUUGUGCCAUUUUCUUUUUUCGAUCUUUCUCAGGUAGGGAAUAAUGAAAUUUGGAUCAU
+>U2AF2_K562_rep02_2573
+CAUGCCCACUCUAGGGUUCUGAUCCCACUGCAUUCUCCGUCCUUACCCAAGCCAUCACUGG
+>U2AF2_K562_rep02_2575
+UCUCUCAGUUCUUCCAUUACCUUCCCCAGAGGCAAGAAGUUACCAAUUUCUUGGACUUUCA
+>U2AF2_K562_rep02_2576
+CCAGCUCGCAGCUUUGCGUGGGCACCCCUUUCCCUGCAGGUGCACCUGGGAACUGGAGACC
+>U2AF2_K562_rep02_2577
+UUUCCCUUCCCCAGGCUUUUUCUCCUCCGUGACAGCCAGAGUAAUCCAAAGGCAUUUGUAC
+>U2AF2_K562_rep02_2578
+ACCUAAAUUAAAGCUGCCACUGCAGAGCCCCGCCAUGGAAGACACGCCGUUGGUGAUAUCG
+>U2AF2_K562_rep02_2580
+UUCUCUUCUUUUUCUCACACCCAAGGGGAAGCCCUUUCCCCUUCCUUCUCUUUUCCUUUUC
+>U2AF2_K562_rep02_2584
+AUUUCUUUUCUAGGUCCUACGGGAAGUGAAGGUGCUGGCAGGUCUUCAGCACCCCAAUAUU
+>U2AF2_K562_rep02_2585
+UUUUUUUCCCUGCCGGAAUUUUAGCAUUGAUAUGAACCAUGGACAAGUAUAUUCUGCUGCC
+>U2AF2_K562_rep02_2586
+GUUCAUCUGUCCCUUUCCAGGGGGAAGACUGUUGCUCUCAAAGAAGUAGGUUUUUGGCUGG
+>U2AF2_K562_rep02_2587
+UUCUAGUUGGAGCUCAGCUGCAUGGAAGGCAGCUGCACGUGUUCGUUCCCAACCAGUGAGC
+>U2AF2_K562_rep02_2589
+GUCAUUUACUUAAAUUAUUUUGGUUGUUUUUCCCUUUUUUUCCUUCUUUUCCCACCCCCUC
+>U2AF2_K562_rep02_2590
+UUUUCUAGCUACUCUCAGAACCGCACGUUUGACACGUACAUUGGGCAGGGCUACGUGAUUC
+>U2AF2_K562_rep02_2591
+UCUUUCCUUCCUUCCUCUUCUUUCCUCCCUUAUUUCCAGGGUCUCACCCUGUUGUCCAGGC
+>U2AF2_K562_rep02_2592
+UCCUUUUAAUGCCUUCACAGGGUCAGCGCCAAACUGGAGGGGAAUGAAACACUAAAAGUUG
+>U2AF2_K562_rep02_2593
+GAUUUUGUCCUUAGUUAUACUUCGAUUAAAACAUGGCUUCAGAGGCUCCUUCCUGUAAUGC
+>U2AF2_K562_rep02_2594
+CUUUGAAUUAUGCUUGUGUUUUUUUCUGUUUGGAUGACUUUUACCCCACCACUAUUUUAGG
+>U2AF2_K562_rep02_2595
+AGGGGUGAAUGGUGCUGAGGUGCGAGGAGAGGGAAGGACAGUAAAGAGCAGGUGGGCAGGA
+>U2AF2_K562_rep02_2596
+UUAUUUCUAUUUCAGACACCAACCAUCUGCCCAGUUGAAGAUUUGCAAAAUAAUUGUUUUU
+>U2AF2_K562_rep02_2597
+UCCCCUUUUAUCCAGGGUAGGUCCAGGUAAAGCCAAAGGCCUUAUCCUUAUCUACACUGCU
+>U2AF2_K562_rep02_2598
+UGGCUGCCUCAUUGCCACCUCCACCUGCAGGAAGGCCAGAGGUUCUGGUGGAGUUGAUUGA
+>U2AF2_K562_rep02_2599
+AGGUGGUAAAUAAAGAUGUCCUGGACGUUUACAUUGAGCAUCGGCUAAUGAUGGAGCAGCG
+>U2AF2_K562_rep02_2600
+CCAAUUACAUUAGCAAACUUUGGGGGCUCAAAUGCAAGGUGGUUUUGGAUGUGGCAACCAG
+>U2AF2_K562_rep02_2601
+UCUUUUUUCGCUUUUAGGAUGAUCGCUGCAAGAUCCCUUUAUUCAUGCUAAUGUCCUUUAU
+>U2AF2_K562_rep02_2602
+AUUUCUCCUCAGAUAACUUCAAGUGAUGUACGAAAAGGUUUGGAGUUCAUUUUUGUGGAAA
+>U2AF2_K562_rep02_2603
+UCCCUUUGCCCCUCCCAUUCCCAUAUCCUUUUUUUCUCUCCUCCAUAGACCACAUAGCCCA
+>U2AF2_K562_rep02_2604
+UGUCCCAAAUCUUCUAGGUACCAGGACAUUAUUCACUCUAUUCAUCUAGCACGGAAGCCAA
+>U2AF2_K562_rep02_2605
+GUGUGGCUCUGAGCUGAUUCAUUUGCUGCUCAUCGUAUAGGUGCUGCCCAGAGUAUCCUUA
+>U2AF2_K562_rep02_2606
+GUAAAUAUCCAUGUGGAAAAAGUAGGGAGUGUGUUGCCCCAAACAUCUGCAAAUGUAAACC
+>U2AF2_K562_rep02_2608
+UCUGCUCUUUUCCCACAGCGGGACGACCCUGGGACAGUCUCCACUGGGGCAGAUCCAGCUG
+>U2AF2_K562_rep02_2609
+AAACUCAAAAGUGUUCAUUUAUUCCCAUUUCUCCUCAGAUAACUUCAAGUGAUGUACGAAA
+>U2AF2_K562_rep02_2610
+UAUUGAAUAUUUUUGAUUUGUCUGCUUUUCUCUCCAUAGAAAGCUUAUAGCUUCAUUGCAC
+>U2AF2_K562_rep02_2616
+UUUCUCCACCUUUUAAGGUUUUUGGCUUUCAUCGCUUUUUCUACAUGUUUUUAGCCUCACC
+>U2AF2_K562_rep02_2618
+UUUCCUCUCUUUCCAGCUAAUAUGCAAGUGAACCAGUGACCUGCAGUUCUGCCCACACAGG
+>U2AF2_K562_rep02_2619
+UUUUUCUCUUCCAUCAAAAUGAGUUUUAGAACUUUGCCCUGAUGUUGACAUUUUUCAUUUC
+>U2AF2_K562_rep02_2621
+UCUUUGCCAAUUUUUCCUUCUUCUUUUUUUCCCCAACCUUUUCUUCUUUCCCAACUUCCCC
+>U2AF2_K562_rep02_2622
+UAAGGUUGCCUUUUCCACCUUCCAUCCUGUUUCCUUAAAAACAGCAAAUAACAAUCUACAA
+>U2AF2_K562_rep02_2623
+AAGGUUGCCUUUUCCACCUUCCAUCCUGUUUCCUUAAAAACAGCAAAUAACAAUCUACAAG
+>U2AF2_K562_rep02_2625
+GUUUUCAUUUUGGUUUUCAGGGGAGCCCUGGAAGCUUAUGUUCAAUCAGUGAGAAGUAGAG
+>U2AF2_K562_rep02_2626
+UUUGAGACGGAGUCCCGCUCUGUCACGCAGGCUGCCAGGCUGGCGUACAGUGGCGCAAUCU
+>U2AF2_K562_rep02_2627
+GACAGGGUCUUGCUCUGUUGUCCAGGCUGGAGUGCGGUAGUGCUAUCACAGCUGACUGCAU
+>U2AF2_K562_rep02_2628
+UUUUUUUUGCAUUUAGGCUGGAGGCAAAGCUGGAAAGGACAGUGGGAAGGCCAAGGCUAAG
+>U2AF2_K562_rep02_2629
+AUUUUAUGUUUUUCCUGUCUUUUUUUUCCUUUGAGUAACGGUUUUAUCUGGGUCUGCAGUC
+>U2AF2_K562_rep02_2630
+AGGUAUGCCGAGCAGACAGCUGGAGGAGCCCGGGGCAGGGACACCUAGCCCGGUGCGUCUG
+>U2AF2_K562_rep02_2631
+UGUAUUCUAGAUACAAAUCCCUUCUGUUCAUCAGGGUUGCAGGAUACAAGAUGAAUAUACA
+>U2AF2_K562_rep02_2633
+GGUUUAAAUUUGAUGUAAGUUUUUUUUUUCCCCCCAGAAAACUUUAGAAACUGUUCCUUUG
+>U2AF2_K562_rep02_2634
+AUUUGUGUUUUCUCUCCCUCUUUUUCUUGAUCAGCAUUAAUAAGGACUUAUAAAUUGUAUU
+>U2AF2_K562_rep02_2635
+AUUUGUGUUUUCUCUCCCUCUUUUUCUUGAUCAGCAUUAAUAAGGACUUAUAAAUUGUAUU
+>U2AF2_K562_rep02_2636
+CUAUUUCUUUUUUCCAGGAAACCAGGGCUUGCAGAUAUUGGUAAGUUGCCCAAGGUCACAC
+>U2AF2_K562_rep02_2637
+UUUUUUUUUUAGGUACUGUCCAAGAAGCUGGAACAUUAUUAUCCAGCAAGAAUGUUCGUGU
+>U2AF2_K562_rep02_2638
+AAAAUGUCACUUUUCAUCCCCAGUUUGCCUUUUGUCUGAAAUGCACCAGUGAAGCAAUCAA
+>U2AF2_K562_rep02_2639
+CUUUGUUUUCUUCAUCUCCCCUGUAGGGCCAUGUUUAUGAGUGGACUAAGUGAAAGCAAAC
+>U2AF2_K562_rep02_2642
+CUUGCCUCCCACCCAGACAUGAGCACCAGCCUCCAGGAAGGCCAGGAGGACGGGCCGGCAG
+>U2AF2_K562_rep02_2643
+UUCAUUACUGCACAGGGGUGGCGUACACAUCAGAAUGUUUUCCUUGCAAGCCAGGCACAUU
+>U2AF2_K562_rep02_2644
+GUCCCCCUCCCAUGCUCUGUUUUUCAUUACUGCACAGGGGUGGCGUACACAUCAGAAUGUU
+>U2AF2_K562_rep02_2645
+GCGGCCUGUCUCCUCCCCGCCAAGACGCCGUGUGCGCCGCCUCGCGCAGCUCCGCCUGGCC
+>U2AF2_K562_rep02_2646
+UGUUUUUCUUUCUGUAGCAUGGCAAGGUCACAAGACAUGUUUAAGUAAGGUAGGCUCAUGU
+>U2AF2_K562_rep02_2647
+UUUCCAUUAAGGUUAAUGUUCGUGAAGAAAUUGAAGAGUUUUUUCCAAGAAUGUGGAAGAU
+>U2AF2_K562_rep02_2648
+UAUAAAUGUGUUACUCACAGCGGUUCAAGUCCACACUGAAGAGCAACAGAAGAGUCAUCCC
+>U2AF2_K562_rep02_2649
+UUCUGUAGACCUCGAAGUAGGGGGAAAACUGCAGUGGAAGAUGAGGACAGCAUGGAUGGGC
+>U2AF2_K562_rep02_2650
+UUGUUGUUUUCUGAGAUGGAGUCUUGCUGUGUCACCAGGAUGGAGUGCAGUGGCAUGAUCU
+>U2AF2_K562_rep02_2651
+AGAUCUUGGGGGCAAAGGAAACCUUGGGGAAGGCAGGCUGGUAAGGGCCUCCCAGGAGGAU
+>U2AF2_K562_rep02_2652
+GCCUGGUCAUGAGGCAGGGAGGGGACGGGUGGUGCUGCGUGCAGGGCAAGGGCUGUGGACG
+>U2AF2_K562_rep02_2653
+CACUUGAUCUUUUGUUUCCAUGUUUGUCACUAGAUGCCCAUAAAAUUUGUGGAUAAGUGUU
+>U2AF2_K562_rep02_2656
+ACCCACAGUUGAAGAUUCCUGUCUCUGGAUCCAAAUCAGAGGGCCUUCUCUACGUCCACUC
+>U2AF2_K562_rep02_2658
+UUUUCUUUUUUCUUUUUCAGUUGCAGGAAUUUAGCCAAUUCAGAGGUCUUGUUCUCCAUAA
+>U2AF2_K562_rep02_2659
+UUUCACCUCUUGGUUCCUCCCACAGAGCACUCCAGAAGAGAGGCUGCCCGUGGAAGGGAGC
+>U2AF2_K562_rep02_2660
+UUCCUGAUAUUGAUAAUUUGUGUUUUCUCUCCCUCUUUUUCUUGAUCAGCAUUAAUAAGGA
+>U2AF2_K562_rep02_2661
+AUUCCUGAUAUUGAUAAUUUGUGUUUUCUCUCCCUCUUUUUCUUGAUCAGCAUUAAUAAGG
+>U2AF2_K562_rep02_2662
+AUUCUCCUGUUUAGAUAAAGAAAGCCGCCCACCUCGGAAAUUUCCUUCUGAUAAAAUUUUU
+>U2AF2_K562_rep02_2663
+UUUCCAUUCCUACAGAACUGAGAGAAGAUGGUUUCCAGCCUCAAACUUACCUAGUACAGGG
+>U2AF2_K562_rep02_2664
+GUCCGUUUGCUCUUUUUGUCUCCCAACUAACAGUGGUUUAUCAGAUACUAUCAUUUUGGAU
+>U2AF2_K562_rep02_2665
+GUAAACUAUUUGUAUUUUCAGGUCAUAGCCACCUUCCAUUCAUCUUUCAAACAAGUAAUUC
+>U2AF2_K562_rep02_2666
+UUGUAGGAAAUACAACUGGAGCACGCAAAGCAAGCCUUUGUGCAACGGGACAAUGCUAGGA
+>U2AF2_K562_rep02_2667
+GGCAGAGAAGCGUGGGGUGGGUGGCACAGAGAGGAUGGAGGGAUCAAGAAGGAUGUGUCUU
+>U2AF2_K562_rep02_2668
+GUCAGUUCACAUUGAGUCUUCUUUUCCUUUACCCCUCUUCCUCCUGCAGGCAUCUCUAGGU
+>U2AF2_K562_rep02_2669
+CUCUGUUCUUUCCUCCUGGCAGGUGACAGAGCUGAAUGAGCCACUGUCGAAUGAGGAACGA
+>U2AF2_K562_rep02_2673
+AUGAUGCACUUUAUUCUCAUUCUUUGUGCCAUUUUCUUUUUUCGAUCUUUCUCAGGUAGGG
+>U2AF2_K562_rep02_2674
+ACUUUUCUGCUUGACAGGCCGGACAGUGGCUGUGGAUUGGGCCGUGGCAAAGGAUAAAUAU
+>U2AF2_K562_rep02_2677
+UUUCUUUUAUGUGUAGGACCUGGAGCCAUGGAAAGAAAACUUGAAGAUCUAUUUUAGCCCU
+>U2AF2_K562_rep02_2678
+UAUUUUUCCUUUUUCUCCUUUCAGAUAAACAUCUCUAUUAAAUUAGGAGCUAUCAUUUUUC
+>U2AF2_K562_rep02_2679
+UUUUCCCACAGUACUCUUUCCAUUCCUUACCCCAGUUUUUGAAGCAUUAAAUGUCUCUCUG
+>U2AF2_K562_rep02_2680
+UCCCUUUCAGUAUUUAGUGUCUCUGAUCCGGGACAAGCUAGGAUGGAUGUGGGUUUUCUAC
+>U2AF2_K562_rep02_2682
+CUGUUUUUCUUUCUGUAGCACGGCAAGGUCACAAGACAUGCUUAAGUAAGAUAGGGUCAUG
+>U2AF2_K562_rep02_2683
+CUGUUUUUCUUUCUGUAGCACGGCAAGGUCACAAGACAUGCUUAAGUAAGAUAGGGUCAUG
+>U2AF2_K562_rep02_2684
+UGUGUGUAUUUUCCUCCUAGGUUCAUUUUCCAGACACUGAAAGAGCAGAAUGGCUAAAUAA
+>U2AF2_K562_rep02_2685
+UGGGAUUGGGGAGAUCAUGGAAAUGGAGGAGAGCCUGAGCACCGUAGAUCUUGGGGGCAAA
+>U2AF2_K562_rep02_2686
+ACCUCUCUUUUUGUGUCCUUUAAUUAUCUCCCAAGUUUUCUUUAUGUGACUCUUGUACAUU
+>U2AF2_K562_rep02_2689
+CUUUCCCUUCCAUUUUUCCUGGGGUGCCUCUCACCCUGCAUCUGCGCGUUCAGCAAGCUGG
+>U2AF2_K562_rep02_2691
+CUUCCAUCUUUCAUUACUACAAUUUACCAUGCAGAGCUCACAAUGUCUCUCUGCACCAAGC
+>U2AF2_K562_rep02_2692
+CCUGAGCUUUUGGGGCGCGGGUGGGAGCGCGGGGGAACCCUCAAGACGGCUUUCUUUUGGC
+>U2AF2_K562_rep02_2693
+UUUUUUUUUCCUUCUCAUUCUAGGUAGAAGAUGUGUUACAACGUUGUCGAGAAUAUUUAAU
+>U2AF2_K562_rep02_2695
+ACUAAUUUAGGAUCAACCACAGGUUUGUCUGCUACCCCCCCUGCCUCAUUACCUGGCUCAC
+>U2AF2_K562_rep02_2696
+CCUCCUGCUGUUUAUUAGCUUUGUGCGACCCUGUCUGCCUCAAUGGUGGUUCGUGUAAUAA
+>U2AF2_K562_rep02_2698
+CAGAACAUCUUCCUCUUUGGCAGGUCUUCAAACUUUGGUGCUGAAGCUUUCGUUAAAAGGA
+>U2AF2_K562_rep02_2699
+UCCCCCAGGUUACCCUUAAGUUACAGGAGUCCCAGCUGCCUGGGCCAGACCAGUUACAGCA
+>U2AF2_K562_rep02_2700
+AGGAUCUCCUUCUGUCCCCUAGGCCGGAGAGCAGUGGGGCAAUCAUGGCUGACUGUAGCCU
+>U2AF2_K562_rep02_2701
+UGACUUUAUUUUCCUAGGGGAAGAAGAUGGCUCUCUGUACCAACAAUAUAACAGACUUUAC
+>U2AF2_K562_rep02_2702
+UUUGUUUGUUCUUCACAGGAUGGACAACCGGAAAUUUUCUACACAUUUUGGAAUUCAGUUA
+>U2AF2_K562_rep02_2703
+UGUUACAGGCUUCUCCCACCUGCCCAGUGGGCUGUACCCAUCCUACCUCCACCUGAACCAC
+>U2AF2_K562_rep02_2707
+UUUAACUUUUCUUCCAUACAGAGGAGUUUGUUCUGGCAGCUCAGAAAUUUGGUCAGGUUAC
+>U2AF2_K562_rep02_2708
+UCUUCUUUUCAGGGUGUUCUAAGGAUACAUUUUAUUGAAGCUCAGGAUCUUCAGGGGAAAG
+>U2AF2_K562_rep02_2709
+UUUGGGCCUUGCUUCUCCAUGCCCAGAGGCAAGCCCCCCGCCCCAUCCCCUAGGGGACAGA
+>U2AF2_K562_rep02_2710
+UUCCCACUUUUUUGUUUCUAGACUGAGUGUACUUGGUCUGGUAUUUGUGGCAUAACUUACG
+>U2AF2_K562_rep02_2711
+UCCUUUCUUCCAGGUUGUUUUUGAGCACGUUCACUCUCGCAGUGUCAGCUGGGGCUGUUUU
+>U2AF2_K562_rep02_2712
+GAUUAGGGAACGACAGUGGGUAGAUGAUUUUCCUCUCCACCGAAGCGCCUGUGAAGGAGAU
+>U2AF2_K562_rep02_2713
+UAUCUUUUAAUUACAGACGCAGGGACAGAGCUCAUCGGGAAAUCAAGGAUAUUUUCUAUAA
+>U2AF2_K562_rep02_2714
+UAUCUUUUAAUUACAGACGCAGGGACAGAGCUCAUCGGGAAAUCAAGGAUAUUUUCUAUAA
+>U2AF2_K562_rep02_2715
+UUUUGCUUUUUCUCUUUUAGGACGCUAUUGAUAACGGAAUGGUUGCAAUUAAGGACAUUUU
+>U2AF2_K562_rep02_2716
+GGGAUUGGGGUGGGUGUUUGUCUUCCAUGUAGUUUAUAUCCUGGAACCUGGAGAUCCUCCU
+>U2AF2_K562_rep02_2719
+AUUUCUAGGUAUUAAACUUGCUGCUGCUGUUGGGCUUUUUCCACAUUUUGUCUUCUGUUUU
+>U2AF2_K562_rep02_2720
+CCCCCUUUUCCUUCCAGCCUUUCAUUCUACAGACCUGGACUUCUACUCUUUGCUGCUUUUG
+>U2AF2_K562_rep02_2721
+AUUAAACAUUUAUGAAGAAUCACCUGUGCACAGCGCUACGCAAGAAGAUACAGAGACAUAA
+>U2AF2_K562_rep02_2722
+CCUUUCUUCCUUCCCUUCCUUCCUUUCCCCUUCUCCUUCCUUUCUCCCUCCUUCCUUCCUU
+>U2AF2_K562_rep02_2723
+CUUUUUUGUUCUUUUUAGGCUGGAGGCUCCCAGGUGAUUUUCACAAAUCCUUUAGAAAUCG
+>U2AF2_K562_rep02_2724
+UCUUUUUAGAUUUUGUGGUGGAUGCAACCCGCAAGGGUAACAAAAUUCGUUUUGCAAAUCA
+>U2AF2_K562_rep02_2725
+UACCUGAUUGCCUCCUGCUUAUUUCUUCUGCCUGUCUACUUUCCAUUCUGCUUUUACAAUG
+>U2AF2_K562_rep02_2732
+UCUUUUUUCCCAGUGCCCUUCUUCAUUCCAGACAUGGUGCUUUGAACAAUUUGACUUGGAG
+>U2AF2_K562_rep02_2733
+UAGCUUACAGUGCUUGAAUGAAACACUCACAUCAUGCACAAAAGAAGUAGGAAAGGCUGCU
+>U2AF2_K562_rep02_2734
+UUCCUAAUUUGGCAGCAGAAGGGGGAAAAACCAGGGCCUUUCACAGACAAGGCUUGUUUUA
+>U2AF2_K562_rep02_2736
+CCUUUUCCUUUUUUUGGUCCUUAGGUUCUGAGUUACUUUCACCAUCAAAAGAAAGUUCGGC
+>U2AF2_K562_rep02_2737
+UUUGAAUCCUUUGCAGCCCACACCCCACCUCCAGUUCCAACUCCUCCACUUCCUUCCAUUU
+>U2AF2_K562_rep02_2741
+ACUCUGAUUCUGCCCCGGCUGCAGCAGGAAGGGGAGCGGAUCCGCAGUGUGCUGGACGGCC
+>U2AF2_K562_rep02_2742
+CUCAAGUGUUUUUUAAGGUACACCCAAGCCCCUUCAAGAUGUAACUUGACAAAUUUUUUAA
+>U2AF2_K562_rep02_2747
+ACACACUUUUUUUUAGGGGCUGGGCCUGUAUGCUGCUCGAGACAUUGAGAAACACACCAUG
+>U2AF2_K562_rep02_2749
+UAAGUAUACUUAUCACUGCAGGUGGGUUCACCUAGAGUGUGACAAACCAACAGAUCAUGAA
+>U2AF2_K562_rep02_2750
+UCUUUCCCAAAACUAUUCAGGAUUUUUUUCCUCAAGUGGCAAGUUGCCCCAUUUUAUAACA
+>U2AF2_K562_rep02_2751
+UGUAGCCAUCAGCCAGCAAAGACCUCGUCAGUGUCUUUAACUGCGACCUUUCGUCCUCAGG
+>U2AF2_K562_rep02_2757
+CUCCCAUCUUCACCCCACCAAGGCCGAAUGGGUAAUAGCCGAAGUGCCCUGAAGAUGAUUA
+>U2AF2_K562_rep02_2761
+UGGGACUUUAUCUCUACUUUUUCCUUUCCUUUCCCAGCCAUUAAAAUAGGGUGAGAUGGUU
+>U2AF2_K562_rep02_2762
+AUUUUCUAGAUCCCAAGCAGGUCUGUUCCAGCCUCUGAUUGUGUAUCGGGGCAAGAUUUGC
+>U2AF2_K562_rep02_2763
+UUCCUCUUCUAGCCUUUCAGUGCUACCUUCAUCUCUUUCAGUUUUUCAAAAUCCCACAGAU
+>U2AF2_K562_rep02_2765
+UACUUUUCUCAUUUUGUUUGCAAUCUUGGUUGAACAUUACAUUGAUAAGCAUAAGGUCUCA
+>U2AF2_K562_rep02_2766
+UCUGCCACAGGAAGCUGGGCCGGGCUGCUGUGCCUGGGAGGAGGGAAGGAGGAAUGAGAAA
+>U2AF2_K562_rep02_2767
+UUUUUCUCUCAUCAGUUUAGGUCUUAGGAUCUACCAUCUGUUACUUUUCAGUUUCUCAUCU
+>U2AF2_K562_rep02_2775
+CUUUUCUCCCUUUUGCUUCACUUUCCCUAGGUCUGUUUCAUUCACCUUUUUAAAUAAAAAU
+>U2AF2_K562_rep02_2776
+UUUGUUUUUUUAUACAGGUAUGGAAAAGUUGAGGCCACUCGCAUAUUGUUAGAGAAAGGAA
+>U2AF2_K562_rep02_2777
+CCAGGCUUUUUCUCCCUUUCUCUCACACUCAAGGAAACAGGUGAAUAAAAGUGACAUGAAG
+>U2AF2_K562_rep02_2778
+UCUUGUCCACUCCCCCAAGGCGUGCCCCACUUCCGCAGUGCUGAGUCCCAGCGGGGAGCCC
+>U2AF2_K562_rep02_2784
+UUCUUUGUUCAGGUGGAGUACAUCCUGCUGCUUCAAGGGUAGAAGACUCCUCACUGCUUUC
+>U2AF2_K562_rep02_2791
+UUACCUCCCUCCAUAGGUGAGGAAAAGAGCCAUGAAUCUAAACAUCAGGAAUCAGUUAAAA
+>U2AF2_K562_rep02_2792
+AAUAUUCUUCCUUCCUGACAGGGGGAGUCGGUGAAGUACUUCCUGGACAACUUGGACCGGA
+>U2AF2_K562_rep02_2797
+UGCCUUAUCUUUUCAUUUGAUCUCACCCUUAAAAGGAAAAAAAUGUUAUGAAAUAAGAGAA
+>U2AF2_K562_rep02_2798
+CUGUCCUCUUUUCCCCCACAGACCUGGCGCACUGUCAUGCCUACCUGGUAGAAAUGAGCCA
+>U2AF2_K562_rep02_2799
+CGUCCCCUUUUGUACAUUAGCAUAUCCCAGCAGCUCGUGGAAGCAUUUGUGAACGAAGAAA
+>U2AF2_K562_rep02_2806
+GUUACCCUUUUUAUAGGUUUGUGGAAUCUUGCUUCCCUUUUUUCCAACCUUUGUUUAUUUG
+>U2AF2_K562_rep02_2807
+UUUGUCACUCAGCACUUUUUCUCCAUAUUCUUCAAGACGAUUGUGAGUAUGGUACGUAACA
+>U2AF2_K562_rep02_2808
+UGUUGUCUUUCUCCCACCCCGUGCAGAGUACAUCCAGAAAUACGCCACGGAGGAGGCGCUG
+>U2AF2_K562_rep02_2809
+UUUUAUUUUUUUUGCAGGAAAUGGGGCAGCCUUGAGGUCAGACUUGGAAUUAUGUCCUAGC
+>U2AF2_K562_rep02_2810
+CUUUCUGCCUUCCUCCUCUCCAGGAAGCUCAAAGGCCCUGUGGCCCCCCAAGAAUGGCAGG
+>U2AF2_K562_rep02_2813
+ACACUGCGGAUGCUGGGGGGAGGGGGGAUUCCACUCCUGUUUUGUGAGUAGGCGACCCAUG
+>U2AF2_K562_rep02_2814
+UUCUCUUUGCUUUUCAGGAUUCCCGAGAAAGCACCAAGAGGGUAGAGAAGGACAUUGUCUU
+>U2AF2_K562_rep02_2823
+AUAAUUUUCUUCCUCCCUUCAUUCAGGUUUCCACUAAAAUGUCAACUCAGUUCUGAUCACA
+>U2AF2_K562_rep02_2824
+UAUAUUCCUCCUCCUAGAAGUCUCAGGGGAUCCAGAACUGCAGCCAGUCCUUGCUGGGCUG
+>U2AF2_K562_rep02_2825
+UAUCUUCUUGUUUUUGGACAGUUCUGCUCAGAAGGAAAGGUGUAUUUGUCCAUGUUGGAAG
+>U2AF2_K562_rep02_2826
+GACCCUCCGGCUUUUGCUUGUCCUUUUCCCUUCUAACAGGUUAUCAAGACUCUGAUUCUGC
+>U2AF2_K562_rep02_2827
+GCUUUUUUCCUAUCUUCUCCAGGUCUGUGAAACGUAAGUAUAGCUACCCCAGGCUUAAACU
+>U2AF2_K562_rep02_2830
+UUUAUGCUUUUUGUCCCUAGCUGCUACUGUUUGAACGGUCUUGGAUGAACAGAUGGAAGUC
+>U2AF2_K562_rep02_2831
+AUUUUAUUUUAUUUUCAGAGAACGAUCUCCUCAGCAGAAUAUAGUAUCUUGUGUAAGUGUA
+>U2AF2_K562_rep02_2832
+CCUUUUUUUCUCCUACUGGGGUGUUUACAGGGCAUGGUAAAAGGAAUAAAGGUGAAAAGAA
+>U2AF2_K562_rep02_2833
+UUUCCUCUCUCCCUCCUCCUCCCACAGGAGGAAAUCCUGAGCAGCCUGUUCAACUAGAAAA
+>U2AF2_K562_rep02_2844
+CCUUACUCUUGUAGAUAUUGGUCCUGUCACUGAUGAUCCUUCCUCUUUGCCUCAGCCAAAU
+>U2AF2_K562_rep02_2845
+AUUUCCUUAGGCUCACGCAGCCCUAGCAGGAGCCAACACAGGUAGGUGCACUGAAGAUCAA
+>U2AF2_K562_rep02_2846
+CUGUCCACUAUUAUCCCAUAAUCUCUUUUCACCUUAGUUUCAUUAAACAUUUAUGAAGAAU
+>U2AF2_K562_rep02_2847
+GACUGACUUUUCCACAGGGGAAGAAGAGGUGAAGGUUUCGACCAUGCCACUGUCAACCUCU
+>U2AF2_K562_rep02_2848
+UAUUUUCUCAACUGCCAUAUCCUAGGGGGCUUGGAGUACCCAUAAUACAGUGAGCCCACCU
+>U2AF2_K562_rep02_2849
+AUUGUUUUUGUUUCCCCUGAUAGCCUCUGAGUUCCUUCCGGAUAACACUGCAUCAACAAUG
+>U2AF2_K562_rep02_2850
+CUGAAAAGUGUCUUUCUCCCACCCCAGGGGCCUGGAAUAGGAAAUGCCUCUCUUUCUACGU
+>U2AF2_K562_rep02_2851
+AACAUUUUUUCUGCCUUCAGGAAGCCCUCAAUCUAGAAGAGUAGAGGUCCAAAGGUGCCAU
+>U2AF2_K562_rep02_2857
+CAGUGCUUCCUCAUUCUCUUUUAAAACCCGCUUCCCGCUGAGUCUGCACCCAGGAGACCAG
+>U2AF2_K562_rep02_2858
+CUCCUAUUUUUUUCUCAUUCUCCUGUUUAUUCCUCUGUUUGCUUAGUUUACAGAAAACGAG
+>U2AF2_K562_rep02_2859
+AGGUACGUAUUUGGGUUUGCCUGUGGGUGCCUGCCCUCCUACAUAGAGCCUUGAUCUUCCA
+>U2AF2_K562_rep02_2860
+GUUUUUGCCCCCUCUCUCUUUCUGACAGCACACACAUGCCCUCUUGGUUCUGUUUCUUUGA
+>U2AF2_K562_rep02_2861
+UUUGUUUUUUUGCUGUGCCCUAGACCGUUACAUAACUGAAGACUCCCACCUUCAGGCAGGA
+>U2AF2_K562_rep02_2862
+UUUCAUGCUUCCUUCCAUUUUCGUUUUCGUCAUUUAAGGUGUAAAUGUACAUAAUUUAUCC
+>U2AF2_K562_rep02_2882
+AUUGGGGAGAGGUGGGGGUGGGGGGUUCCCACUCCACACUGGUCACCCACCCACAGGGCUA
+>U2AF2_K562_rep02_2883
+GUUUUCUUUUUAUAGCCCCAUUGACAAACCUUCAGAUUCUCUCAGUAUAGGGAACGGUGAU
+>U2AF2_K562_rep02_2884
+CAAAUGUCUUUUCUCUAGCCUUCCAGCAUUGGGUCCAUGGCUCUGACUGAGAGUGCACUAU
+>U2AF2_K562_rep02_2885
+AUAUUUAUUUAUUUAUUUUAGGCUGAGCCAUUGAAAGUAAGUGCAAAAGCCCCUCUUUGGU
+>U2AF2_K562_rep02_2886
+UUACCAUAUUAAUGUUGAAUAGCAUCUCAGGUUUCAUUUCACAAUGCACGCAUGGAGUUGG
+>U2AF2_K562_rep02_2887
+CCUUCAUCCCACGUUACCCUCUUCCCCUCCCCUUAUGUCUCAAUAUGCCUCUGCCUUUUGC
+>U2AF2_K562_rep02_2888
+GGAGUGAACUUUGCGCACUUUCUUCCUUAUGGCAGUGGCCAAUUUAAUAGUGGGAAUCGAC
+>U2AF2_K562_rep02_2889
+UCAGAGUUAUCAGGUCUCUUUUGCCCCUACAGGUUUUUAUGUGAUAGUCAAAAGGAGCUGG
+>U2AF2_K562_rep02_2905
+UUUCCCUUUUCCUUACCUAGGCUAUUAGUCCUUAUUUGCCAAGAGGUGAUCCAGUUCUGAA
+>U2AF2_K562_rep02_2906
+GGAUAAAUAUAAAGAUACACAGUCUGUUUCUGCUAUAGGUAAGAUGUGGUAGUGUUGGGUG
+>U2AF2_K562_rep02_2907
+AUUUGGUUUUAUUUGCAGGUCCUAAUCUACCCAUGGCUACAGUUGAUAUAAAAAAUCCAGA
+>U2AF2_K562_rep02_2908
+UCUUUUUCAUUCUGCAGAUUGCAGGAAUUGACGCUGUAUAAUCCAGAACGCACUAUUACAG
+>U2AF2_K562_rep02_2909
+UCCUUUUCUUUUCCUCUUUCUCCUCCUCUUUUUUCCCCUUCUUCGUCCUCUUCAUUGUUGU
+>U2AF2_K562_rep02_2910
+CUACUUUUAGGAUUCCUAAGGGAUUUGUGUGAGGUCUUACUAUAUUUAUUGCUACCUCCUG
+>U2AF2_K562_rep02_2912
+UUUAGAACAUUAGCAGUGUUGUGGCUGCAUUUUCCGACCUUCUUCACGUCCGAAUCCCUAA
+>U2AF2_K562_rep02_2928
+UUCCCCUUAAUCACACAGCAUUGGCAUCAACAAAAGUCAGAAUUCCCGGGAACUUGAACAG
+>U2AF2_K562_rep02_2929
+UUUCUUUCUAGGGGUUUAGUGGUUACUCUCCUGUUUGGAAAAACAAACUCAGAGAAGUACC
+>U2AF2_K562_rep02_2930
+UCAGCUCAGGUACCUGACAAUGAUGAGCAGUUUGUACCAGACUAUCAGGCUGAAAGUUGUA
+>U2AF2_K562_rep02_2931
+UGUUUUUGUCUUUGUUCCCUCAUUCCCAGGUGCUAGUGUAUGAGUUGUUGUUGGGAAAGGG
+>U2AF2_K562_rep02_2932
+AGUGGGGUGCCAUUUUCUUCCUGCAGGUGCUGGGUGAAGUUCAGAAGGCUCUGAGAGGCUG
+>U2AF2_K562_rep02_2933
+UUGAAUUUUCUCUUGUUCACAGGUGGAGAUACACUACGCCUUGACACACUUAUAGAAUGGU
+>U2AF2_K562_rep02_2934
+UUAUUUGUACGUUGUGUUCUGGUAGUAGGGGUUUAGGAAUAUGGUUUUGAGUAAGAGACUC
+>U2AF2_K562_rep02_2935
+AUGUUUAAUUUCCUUUUUCCCUGUAGCUUUUACAAAGUUGAUCACAGUAAAUGGACAAGAA
+>U2AF2_K562_rep02_2936
+AUUACUUCUAGGUUGGGAGGUGGCUGGAGAUCAUAUCCAGAGUGGGGCUGGAGGUUCUGAC
+>U2AF2_K562_rep02_2937
+CUUUUCCCACCCCUGCCCCUUUUCAACUUUCAGAGCACUAGACAAACUGAAUGGAUUUCAG
+>U2AF2_K562_rep02_2938
+UUCUUUUCUUUUUUCUCUCAGGAACUAAACAACUUAAGCAUAUUUUAUUAAAAGAUGUGGA
+>U2AF2_K562_rep02_2939
+ACCUCUUUUCCCACAGUCGGAGUCUCAGGACCAGGUCUUCCUACGCUGGAGCAGCGGGGAG
+>U2AF2_K562_rep02_2940
+UUUGUUGCUUGUGUUUGUUUUUCCCCUACAGACGUAUGACCUUAGCAGACAUUGAACGGAU
+>U2AF2_K562_rep02_2941
+AAUGACUUCAUUUUUCCAGGCCCCAAAUUCUCACCAGUCCGUCUCCUUCAAAAUCCAUUCC
+>U2AF2_K562_rep02_2957
+UUUGUCCUAGUUUUCCUAAAAUUCCCUUUUCCACUGGUGUGUGGUGCAAGAUGAGGCACAU
+>U2AF2_K562_rep02_2958
+UCCUUGUAUUUUGUGCAGGUCUGCAGACUCGUGAAUGAGGUCUACCACAUGUAUAAUCGAC
+>U2AF2_K562_rep02_2959
+UUAAUUAAUGUAUUACUUUCUCCCUUAUUUUUUCCUUGGAUUCAUUUUACUAUUAUUCAUG
+>U2AF2_K562_rep02_2960
+AAUCUUUAUUUCCUUUAACUCCUCAGCACUUGUUUUAACUUGCUUAUUUUCUUUAGUUUUU
+>U2AF2_K562_rep02_2961
+CCUCCCCUGUGCCUUCCACAUUCUACACCCUUUACCACAGGAGAGGUCUCUGUUAGCUUGC
+>U2AF2_K562_rep02_2962
+GCUGUCUUAUUUCUCCCUUCCUUUAGAAUCCCUUCUUUUUCAAAACACUAGAAACCUCCCA
+>U2AF2_K562_rep02_2963
+UAGGUAGAUAAAGUGGUAAUAAAUCCAUACUUUGGUCUAGGAGCUCCAGACUACUCAAAAA
+>U2AF2_K562_rep02_2964
+AACUCUCUUUUUCCACCCCCUAAGUCUCUGGCAACCACUGUUCUGUCUCUGAAUUUGAUAC
+>U2AF2_K562_rep02_2965
+GUCUUUCAAUAUCUCUUCCCUGUUUGGACCACAUUACCCUUCAUCAUAUGAAGCCUUGGGU
+>U2AF2_K562_rep02_2966
+UUCUCUUCGUUUUUCUCUUCCUCUAGUGAACACUGACUCGGAAACUGCAGUUGUAAAUGUA
+>U2AF2_K562_rep02_2967
+UUUUUUUUCUUUACUUACAGGCAGUACUUAAUUUUCCUAAAUAUUGUGAACCCGUGGUUAA
+>U2AF2_K562_rep02_2968
+UUUUGAUCCUUUGUUUCAGACUCUGCCACAACUGAAAGCUCACCAACAGCCUGCCAAUAAA
+>U2AF2_K562_rep02_2969
+UCUCUCCUUUCUCUGCAGGGCACCCUCCCCCAGGAGACUUCAUUGCUCUGGGCUCAAAGGG
+>U2AF2_K562_rep02_2970
+UCUAACAUUUACCAGUUUUGCUUCCCUGCUUUCUUCCUAACACUGAUGAUGAUUUUUAUUU
+>U2AF2_K562_rep02_2971
+CUCUCUCCCUUCCUCCCAUAGAGACCAGUCUUGGGGAACCACCUUUGAGGUUUGUGUGGAG
+>U2AF2_K562_rep02_2972
+UUAUUUCUACCCUCUUCUCUCCUCACUCCCCAGCCCCCCAACUUUACCAUCUCCUCAAGAA
+>U2AF2_K562_rep02_4839
+UUCCUUCCUCUGACGCCUGCUCUUACAAUAGGCGUCCCUGCGAGAAGAGUCACCCAGUGGC
+>U2AF2_K562_rep02_4840
+CCUUCCUUUCAAAUAGAUGUCUGUGGACUUUAUCCCCAGGAAUGGUCUCUUGGUUAAAGUG
+>U2AF2_K562_rep02_4841
+CACUGCUUAGCUUUGCUGGUCCAUUUGUCCCUGUGUUUUCCAUUUGCAUUCAGGCCUUUGA
+>U2AF2_K562_rep02_4842
+AUGGUUCACCAUCUGCCACUUCUGAAAGUGAUGGGUCUAGUACAGGCUCUCUGCCGCCGAC
+>U2AF2_K562_rep02_4843
+AUGGUUCACCAUCUGCCACUUCUGAAAGUGAUGGGUCUAGUACAGGCUCUCUGCCGCCGAC
+>U2AF2_K562_rep02_4844
+CCCUCCAGGUGCCUCAAUGGUCCGGCCACCAGUUGUGCCUCGGCGCCCCCCGGCCCACAUC
+>U2AF2_K562_rep02_4845
+AGAUGCGAGCCACCCCUCUGGCUGCUCCUGCGGGUUCCCUGUCCAGGAAGAAGCGGUUGGA
+>U2AF2_K562_rep02_4846
+UUCCUUUUCCCCUCUUCUUACCCAGAGUGAGCACAAAUGGAUCAGAUGACCCUGAAGAUGC
+>U2AF2_K562_rep02_4847
+UUCCUUUUCCCCUCUUCUUACCCAGAGUGAGCACAAAUGGAUCAGAUGACCCUGAAGAUGC
+>U2AF2_K562_rep02_4848
+UUUCUUCUCCUGUGACAUUAUCUAGCAUGCUUUGCAGUGGGUCCAGAGUUGUCUGGGGAUC
+>U2AF2_K562_rep02_4850
+CUUUCUUUUUGCCUAGGAGCCAUAUGGGGGUGCCGUUGGUCUCUGGUCACCGACAUCCUUU
+>U2AF2_K562_rep02_4851
+UUUGCAUUUCUUCCCAGGCUGCCAGCGGGACCAGGAUGGCUAUUACUGGAUCACUGGCAGG
+>U2AF2_K562_rep02_4852
+UAACAUGGCAGACCAGAGACAGCGCUCACUGUCUACCUCUGGGGAGUCAUUGUACCACGUC
+>U2AF2_K562_rep02_4853
+CAACUCAUUGUUUGUCCACAGGUGCUGGCUUAUUCUCAGACUCUGUAUAUUGGGAGAGAAA
+>U2AF2_K562_rep02_4854
+UUGGAUUUCUUGCUUAAUCAACUCAUUGUUUGUCCACAGGUGCUGGCUUAUUCUCAGACUC
+>U2AF2_K562_rep02_4855
+UUUUUCUUUCCUUCCCCACACCCCAGGGCUACCAAGAAAAGAACAAAUUCAUUGCUGCACA
+>U2AF2_K562_rep02_4856
+UUCUCCUUUGCAGCAUCAUGGCCAGCCCAAGAACCAGGAAGGUUCUUAAAGAAGUCAGGGU
+>U2AF2_K562_rep02_4857
+CCUGUUUUGUCUUUAGGGUGUACAACUAUGAGCCUUUGACACAGCUCAAGAAUGUCAGAGC
+>U2AF2_K562_rep02_4858
+AAGAUUCUUUUCCUAUUUUCCCCAAAUCUUUUAUAGCAUCUGUCAAUGGUUCACCAUCUGC
+>U2AF2_K562_rep02_4859
+AAGAUUCUUUUCCUAUUUUCCCCAAAUCUUUUAUAGCAUCUGUCAAUGGUUCACCAUCUGC
+>U2AF2_K562_rep02_4860
+GAUGCUUUUUCCUCAGGUCCUGGGGACCUGGCCUCCCUCUGUCAGCAGUUUCUGACCUAAU
+>U2AF2_K562_rep02_4861
+GGUCUUUCCUUGUCCAGUUCCAGGUCGCGGAGCAAAGGUCGAUCACGUUCUCGAUCAAAAG
+>U2AF2_K562_rep02_4862
+UGUAGCUUGCUGAUGACCGUAUGGCACUGGUGUCAGGCAUCAGCUUAGAUCCAGAAGCAGC
+>U2AF2_K562_rep02_4863
+CUGUAGCUUGCUGAUGACCGUAUGGCACUGGUGUCAGGCAUCAGCUUAGAUCCAGAAGCAG
+>U2AF2_K562_rep02_4864
+GAAAACUUCCUGUUGCCUGCAGCCGCCCACGCAGAACAUGAACCUGGGCCCUGGAGCCCUG
+>U2AF2_K562_rep02_4865
+UUGUCUUUCAGGAUUUUAUGCGACAAGCAGGUGAAGUAACCUAUGCGGAUGCCCACAAGGA
+>U2AF2_K562_rep02_4868
+CCAGCAUCUUCGGCCUCUUGUCCGCUUUGUUUUCAGGGCCCAGGGGAAUCGCUACGUGGGG
+>U2AF2_K562_rep02_4870
+CCUUUCCUUUUUCUUUUCUCCUCCCCCUUCUGUUUUGAAAAUCAGGUUGCUUUUCUGUUAC
+>U2AF2_K562_rep02_4871
+UUCAAAUUCAGGUGUGCACUCUCCCAUGGCAUCUUCUGGCAAUACUGGGAACCACAGCUUU
+>U2AF2_K562_rep02_4872
+CUUAAUUUUACAGGUGUGAGCCACUGCACCAGGCCCCUUCAUCUUAAUUUUAAUAUAUCUU
+>U2AF2_K562_rep02_4873
+UGUGUCCUUCUGUCCACAGUCCCUGAGACGGCGGGCAACAGCAUCGGCAGGAACGCCAUGG
+>U2AF2_K562_rep02_4874
+UCCCUGAUUUUCUUUUCAGACGUCUUUUUACAAGGGAAACGGUUCCACGAAGCCUUGGAAA
+>U2AF2_K562_rep02_4879
+UAAGUUUUUGUUCAAGGUGACGUUACUGAGGCAGUGCUCUACUGAGAAUGAAAAUGACAUG
+>U2AF2_K562_rep02_4880
+UAAGUUUUUGUUCAAGGUGACGUUACUGAGGCAGUGCUCUACUGAGAAUGAAAAUGACAUG
+>U2AF2_K562_rep02_4881
+AAUUUGUGCUUUCUUUUUGCUCCCCCAGGGCCUGGUGAAAUCCCCAUGGGAAUGGGGGCUA
+>U2AF2_K562_rep02_4882
+CCAGGACCUACUUGCUCAGAUCUCCAAGCAAGCAUUUCUUUUCUUUUAGGGAUGUCUGAAA
+>U2AF2_K562_rep02_4883
+UCUCCUUUCCCCCCUUUCUACGCCUUUUCCCUUAGUCUUACCUGCAGUGGUGAAAAACGGA
+>U2AF2_K562_rep02_4884
+UUUCUUUGCCAGAUCCCAUGAGCUGCGUUCCAAGGUGGUUUCCCUGCAGCUGCUCCUCUCU
+>U2AF2_K562_rep02_4888
+UCUUGCUUUUCUCCUAGGCUUGGCACUGCUGCACCACCAAAGGCAAACUUCAUUGAAGCUG
+>U2AF2_K562_rep02_4891
+UACUUUGGCCCCCUUCCCUGCUGUGGUUCUGGCCACCCCAGAGAGGUGAUCGAGAAGAAAC
+>U2AF2_K562_rep02_4894
+UUUCUUUGACAAUUUUAAGCCUUGUCCUAGGUUAAGACUGAUGAACAGGAGCCAAAGAAGA
+>U2AF2_K562_rep02_4895
+UGCAGCCAACAUUGGUACUCAGACCACAGGACCCAGUGGGGUAGGAUGCUGUACACCAGGC
+>U2AF2_K562_rep02_4896
+CUCUUGCUUUCUUCCAAUCCAGGACUCCAUUAUUACAGUCUUUGAUUGGUCUUUUUGAGUU
+>U2AF2_K562_rep02_4897
+UAGAGACUGCCUGCCUUUUCUCUCCUGGUCCCACCUCAGCUGACCCUCUGUCAGCUCGAAU
+>U2AF2_K562_rep02_4904
+UUUUUAGAUAAUGAGCUUCAGUCCCCAAGAUCUGCGAAGACGUUUGUGGGUGAUUUUUCCA
+>U2AF2_K562_rep02_4905
+UUUUUAGAUAAUGAGCUUCAGUCCCCAAGAUCUGCGAAGACGUUUGUGGGUGAUUUUUCCA
+>U2AF2_K562_rep02_4911
+CAUCUUUUCUCUCCUGUAGUCUAAGGUUGUGGGUGACAGAGAGAACGGCAGUGACAACCUC
+>U2AF2_K562_rep02_4913
+CCUUUUAGGUCCUUUUGGUGUGAACCAUGGGGUGGAACUUCACUCAGAUGUGAUAGAGUAU
+>U2AF2_K562_rep02_4914
+UUUUUCAGAUAUGAGGCCCCAGGAUUCCUGGCGAGGUCCUCCUCCCCUUUUCCAGCAGCAA
+>U2AF2_K562_rep02_4916
+UUAUCUCCUUAGGAAUACAAACAGAAGCUUGCACGAGUAACCCAGGUCCGCAAGGAACUGA
+>U2AF2_K562_rep02_4922
+AUUUUUUCUUCCUAUAACUUUUCUUCUCUCAGGUAAACUAUCCUUUAAACUUUUGUGGAAC
+>U2AF2_K562_rep02_4923
+AGUUUUGUUUCGUUUCUCCUUUUAUUCUCUGUAUUGAGCAAGUCUUAGACAUCAUACGUUU
+>U2AF2_K562_rep02_4928
+GUGUGUUUUUCCUCCCCAGAAGAGGCGACAAAGGCCGUGACAGAGAUGAACGGGCGCAUCG
+>U2AF2_K562_rep02_4929
+AGCUUAUUCUCUUGGGGGCCAAGAGAAUCUUGGUCUGAUCUCAGCUUCUCCACAAUCAGAU
+>U2AF2_K562_rep02_4935
+UUUCAGGGUUAUUUUGGAGCUGUUGGAGCACUCCUUGAGCUGUUGAAGAUCCCGUGAUCAU
+>U2AF2_K562_rep02_4936
+CCUUGUGCUUGUCCCCAGCGGCAAGCCUGCACGAGCUGUGUGCUGCCAGAGUGUCAGAGGU
+>U2AF2_K562_rep02_4937
+UCUCAUAUUUCUAAUCCUCAGGGGUGGCACACACUCUGCAAGCAUGGUGCUAGGCACACGG
+>U2AF2_K562_rep02_4941
+UAAAAUGUUUAAUUCCCUUGCUAGCUUGUGAGAAGAAUGAGUUGAUGACAUGCUCCAUACC
+>U2AF2_K562_rep02_4942
+UUUUUAACAUAGGCAUACUGCAACCCAUGGGUUGUGUUCCCCAAGUGAAGAUUCUGUGUCU
+>U2AF2_K562_rep02_4951
+UUUAUCUUUUUUGGUCCUCUGCCAGCGAACACUUGCCAAGUAUUUCAAUCCUUGCUAUGCC
+>U2AF2_K562_rep02_4952
+UCCAAGGGGCAGUUGAAAGCACUUUUUUCGGAACACGAGGUAAGCUGACUUGUUCGUUGUG
+>U2AF2_K562_rep02_4953
+AUUCCCUUUUUUCACAUGGCUGCCAAGAAGCUCAGGUUUACAUUUUUUCUCUGUGACUAAG
+>U2AF2_K562_rep02_4954
+UUUUGUCCUCAGAAAAGGAAAUCCUCGCUUCCAUGGCUGCCAAAAGGACAGUGUUUCUGGC
+>U2AF2_K562_rep02_4965
+GUCUUCAUUUACUAUAUUAUGUAGGGUUUCUGUCCAACAAGAGUACUUGUAUAUCUUUGCU
+>U2AF2_K562_rep02_4966
+GCCCCUUUCUUCUGUCCCCAGGGCCUCGGCUUCACAGGAUGGGGCUGCCAGUGUCCUGGGC
+>U2AF2_K562_rep02_4967
+GCCCCUUUCUUCUGUCCCCAGGGCCUCGGCUUCACAGGAUGGGGCUGCCAGUGUCCUGGGC
+>U2AF2_K562_rep02_4973
+CCUAAUGUGUUUUUUCUUCCUUCCUUACCAGAUGAAAUUAAAGCAGAAAUAGAAAAGCAGA
+>U2AF2_K562_rep02_4974
+GCUUCGCUAUUCUUGCAGGUGGAUGGGCAGGUGGUAGCACUGCUGGUACAGAAUCUGGAGC
+>U2AF2_K562_rep02_4975
+UGUGUGACUUCGUCCCUUAGGAGCUCAGCCUGAGGAAGAAAGGCCUGGAGUGCCUCGUGUC
+>U2AF2_K562_rep02_4976
+GUCCCCCCUUUCCUGUGGCAGGGCCGGAUCGUGGCACCCAGAGGCUGCCAGGACUUUGGCU
+>U2AF2_K562_rep02_6000
+UUCCAUUGUUUUUUUUAGAUUCUCUCGGGCCUAGCCGUCCUUGGAACCCGAUAUUCGGGCU
+>U2AF2_K562_rep02_6001
+CUCGGGCCUAGCCGUCCUUGGAACCCGAUAUUCGGGCUGGGCGGUUCCGCGGCCUGGGCCU
+>U2AF2_K562_rep02_6002
+CCGCGGCCUGGGCCUAGGGGCUUAACAGUAGCAACAGAAGCGGCGGCGGCGGCAGCAGCAG
+>U2AF2_K562_rep02_6003
+CCGUCCUUGGAACCCGAUAUUCGGGCUGGGCGGUUCCGCGGCCUGGGCCUAGGGGCUUAAC
+>U2AF2_K562_rep02_6004
+UAUUCCUGUUCCCUUUACCCUUUGACAACUUGAAAUGUUACCACUUCGUCCUCAUGAUGUU
+>U2AF2_K562_rep02_6005
+UUCAGCUUUAGCUGCAGCUGCCUCUGUUCAGCCACUUGCAACACAAUGUUUCCAACUCUCU
+>U2AF2_K562_rep02_6006
+UAGCACCCCAGAUACUCGCCCAGCUGGUCUGGAAGAGGCUGAUCAGCCACCGUUGCCUGGA
+>U2AF2_K562_rep02_6007
+GUUCCUCCCUCUUUUUUCCUAUGAAAGUUGACUAUAUAAUUAUUAAGCCAUUACCAGGAUA
+>U2AF2_K562_rep02_6008
+CCCCCUUCUUGAGUGUUCCCCAUCGGUUUGUCCCCAGGGCUGCGCUGGCCUCGGCACACCA
+>U2AF2_K562_rep02_6009
+CAUCGGUUUGUCCCCAGGGCUGCGCUGGCCUCGGCACACCAGUGCCACCCGCUGCCCCGGA
+>U2AF2_K562_rep02_6010
+CCUUUUCUUGGCAGGCCCCUCGGGAGGCAUUGGCACAGACCGUGCUCGCAGAAGUGCCCAC
+>U2AF2_K562_rep02_6011
+UUUUCUUCCCCCACAGUUCAUCCAUGAGCUCGGAUUUCCCACAUUACAACUUCAGGAUGCC
+>U2AF2_K562_rep02_6012
+UCUCUUCUUCCCUUCUUUCUGGUUGGUGCUGCUGGGCCAGGUGGGAAUUUCUGAUUAAAUC
+>U2AF2_K562_rep02_6013
+UCUAAUGCACUGUUUUAUCCUUAGCUUUGUUUGUUAUUAUGUUUUGGAAUGAAAUUUGGUC
+>U2AF2_K562_rep02_6014
+UCUAGAAAGCGAAAUUAUUAUUGACGAUGGACAAUUUGGAAUCCACAGUAAGUGAGACUGA
+>U2AF2_K562_rep02_6015
+UUUCUUUUAGGAGCUUACUCCACGGGAACAGCCUCUAGAUAAUCUGAGUUGUUGAAAAUAC
+>U2AF2_K562_rep02_6016
+UGCGCUGGCCUCGGCACACCAGUGCCACCCGCUGCCCCGGACGCUGAGCGUCCUGAAGAGC
+>U2AF2_K562_rep02_6017
+CCAUCACCCGCCUCUGUUUUCUCCCCAAGCUGAGGCAACUUCUCCUAGAAUCUCAAUCUCA
+>U2AF2_K562_rep02_6018
+AGGCUAACUCCUUUCUGACCCGUUCAUCCCACAGGCCCUGGAUUAUUGUCACAGCAUGGGA
+>U2AF2_K562_rep02_6019
+UCAUCCCACAGGCCCUGGAUUAUUGUCACAGCAUGGGAAUUAUGCACAGAGAUGUCAAGCC
+>U2AF2_K562_rep02_6021
+UUUGUUUGCCUUGUUGUAGGUGGACCCAAGAGCCAUAUCAGUGCUAGCAAAAUGGCAGAAU
+>U2AF2_K562_rep02_6022
+UUUGUUUGCCUUGUUGUAGGUGGACCCAAGAGCCAUAUCAGUGCUAGCAAAAUGGCAGAAU
+>U2AF2_K562_rep02_6024
+CUCUGUUUUCACUCUCAGGCUCUGGUAAGUAUUCGUAUUCUCUUCAUCCCAGUCUGAUUGC
+>U2AF2_K562_rep02_6025
+CAAAUCAUCCUACUCCCAAAUAGGCACCCACUCACUACCUUGGCGUCGUUUUUUGGGUCUG
+>U2AF2_K562_rep02_6026
+UUUUUCUUCUCAGGAGGAAAAAAAGCAAGAGCAGAAGUCGUAGUCAUGAACGAAAGAGAAG
+>U2AF2_K562_rep02_6027
+CUUCCCUGUUACCCCCAGAGCAGAUGCCCUCAUGUGUUCUGCGUAGAUCCCCAGCUGAGAA
+>U2AF2_K562_rep02_6028
+AGCUUUCCUUCCAGGUGGGAGCAGCCUGCAUCCUGGAACUGCCAUCCCAGGGUAGGUCUGC
+>U2AF2_K562_rep02_6033
+GUAUUUUAUUUUGCUAGGUGAGGCCCUGGUGACCACGUGAGAAAUGAUACCUGUCUAACCA
+>U2AF2_K562_rep02_6035
+UUCUAUUUUUUUUUUCCCCCAAGCAGAGACCUAGAUGAAAUCGAAUUACCAAGCAUUCUUU
+>U2AF2_K562_rep02_6037
+ACUAAAUUUUCUAUUUUCCUUAAAUUCUAGAAAGCGAAAUUAUUAUUGACGAUGGACAAUU
+>U2AF2_K562_rep02_6039
+UCUCUAGCCCUAACCGGCAGCCAUUUGUUCUCUUUGGUAAUCACUCCACACGAGAAAACCU
+>U2AF2_K562_rep02_6040
+ACUUCCUGGGACCUGGAGUGGGCCUCCUGACCUGGGGCUCGCUGGGAAGGGAGGGUUCCCC
+>U2AF2_K562_rep02_6046
+AGUCAUCCCACAGGCCUCGCGGACGAAGGGGUGCCUGAAGCUGUGGAGAGGGUGCACAGGG
+>U2AF2_K562_rep02_6047
+CUGAUUGCAUAGCCACACUGCCCGGCACGCCACAUCCACCCCUGUCUGCACAUGAGUUGUU
+>U2AF2_K562_rep02_6049
+UUGUUUUCUUAAUUCCAGACUUUCUGUUCCAGAUCUCACUCCAAACAUUGGUCUUUUCUGG
+>U2AF2_K562_rep02_6052
+ACUUCAGCAUUCCUUGAAGAAAAGAGGAACCCGCUCCCUGGGGAAGGCCGAUAAGAAGACU
+>U2AF2_K562_rep02_6053
+UGUUUUUGUUCUUUUCCCCUAGUCACGAACCCCCGCCUUGGUUUUUGAACACGUAAACAAC
+>U2AF2_K562_rep02_6054
+CAGGCUUAUCCCGUCCUGGGGCCCCAGUCCUCGGCCCUGUGAGCCUCACUUCCUCUAGGUC
+>U2AF2_K562_rep02_6057
+GUCAUUUUGUUCAUAGGUUUCUAGACCAACUGGGGAGAUUCCCGUUAAAAAGUAUGUAUAC
+>U2AF2_K562_rep02_6058
+CUCACAGCUGUCAGCUUCCCCUGGGUCAGGCCAGGGCCUCCUCAUGGCUCUGGGGUGGUUG
+>U2AF2_K562_rep02_6059
+UCCCUCCUUCCUUCAUCAGUGUCCCCCAGAGCUCUGGACCUAACAGGUACUCAAUAUGUGC
+>U2AF2_K562_rep02_6060
+UUUUCUUUUUACAGGAACGGCAGAGUCGAAACAAACAAUGAGGGCGAACCAGUUUCUUACA
+>U2AF2_K562_rep02_6063
+UUUAACUCGUUCAGCAAAGCCUGUGCGGAGCGAGCCAGAGCUACCUGUGGAAGGGACCUCA
+>U2AF2_K562_rep02_6064
+CCUCUGCCCUUCCUACACUGUCAAACUAGGUUUACCAUCUGAUUUUCAUACUGCUGACUUU
+>U2AF2_K562_rep02_6067
+CCUUCUGUGCUGCCUCCCACCAGGUGCACCCCAGACAUGGAUGUCAUCCUCAACAUUCCUG
+>U2AF2_K562_rep02_6074
+CUGUCAGUUUUCUCCCAUGAUCAGGGCUGAGCAGUACCAGUUCCGAAGGAAACAUCAUAGG
+>U2AF2_K562_rep02_6075
+UAAUACUUUCUUACAGAGAAGAAGAAGUUGGAUGGGAUACCGAGAUUAAGGAUGAUGUGAU
+>U2AF2_K562_rep02_6076
+GGAGAACAUGCCUGUAUUAAGGGCCGAGGUGGAAGAGCUCCAAGCCCAGACCCGGGAACCC
+>U2AF2_K562_rep02_6080
+CUGCUUUCUCCCCUAUCCCCUGUCUCUACCCCCAGGCACAUGGCCACCCACUCAGCCCAGA
+>U2AF2_K562_rep02_6081
+GGGUGUCUUCCAACCUUUUCUUUGUAGAACACAACUUUCCUGAACAGGAAAUCCAAGAGGG
+>U2AF2_K562_rep02_6082
+UUUAUUUUGUGACUACGCCACAUGCUGGGUUUUCUUUUUGAAUUUAGGCAUAAAUGAAAUC
+>U2AF2_K562_rep02_6085
+UUUUUCUGACAUCCAGGUAGCCCAGUGUGUCUCACCAAAGGGACCUCUUGCUUGUUCGAGA
+>U2AF2_K562_rep02_6087
+UUAUACAAGCAAGAGCAACAGCUCUAUAUCUGGAUCACUGCAGUGCCUAGAAGAUACAACA
+>U2AF2_K562_rep02_6090
+GACUCUUCUUCUUCCCAGGCUCAGGCCCGAUGUCACCGCAUAGGCCAGAGCAAAGCUGUGA
+>U2AF2_K562_rep02_6098
+CUCCUCCCUUCACUUCACCAGGGGCGACCUGACGGAAGAUAACAUGGAGACAGAAAAUGCA
+>U2AF2_K562_rep02_6099
+AUUUUGCUUUCUCUUUCACUAGGAUGGAAUGUGGGAUGGUAACUUAUCAACAUAUUUUGAC
+>U2AF2_K562_rep02_6105
+UGCAGGUUAUUGAGGUGGUGAUCCGCUCAGAAGAGGGGCUCUCAAGGGACAUGGUGAAACA
+>U2AF2_K562_rep02_6106
+UCUUGUUUUUUUUUCCGUUUGACAGAAACUGAUAAAGCUGACUUGAGUGGUAUUUAAAUAU
+>U2AF2_K562_rep02_6107
+UUUUUUUUCCUUGCCUUAGCCCCGUCGCAGAAUUUAGUCUCAAAGGAAACUUCAACCACAG
+>U2AF2_K562_rep02_6108
+CGCUCAACUGUUGGCCCCACAGGGACAAGGAGACCAGUCGCGACGAGUUCAUCUUCUACUC
+>U2AF2_K562_rep02_6109
+AGCCCCAGGAAGCCUUGGUCGGGGGCAGGAGGGAGGGUCAGGCAGGGCUGGGGGCCUGAC
+>U2AF2_K562_rep02_6110
+CAGCCCCAGGAAGCCUUGGUCGGGGGCAGGAGGGAGGGUCAGGCAGGGCUGGGGGCCUGAC
+>U2AF2_K562_rep02_6117
+CCCUGAUUUUUCUGUACCUUGGCUACCACAGGUUCUGCUGAAUGUCCUGACCUUGAACCGG
+>U2AF2_K562_rep02_6118
+AUGUUUUUGCCCUCUGUUGCAGUUGCAGGAUGUGAGUUUGAAUCUAUGGAAUGUCUACAGC
+>U2AF2_K562_rep02_6119
+CUUUUAGGACUUGGCAGCAUUAGGCUGGUGCUCAGACGAAGAGGAGAAGAUCUUCAGGAAG
+>U2AF2_K562_rep02_6120
+UUUAAACUCUCCUUAUCUUCCCCCCCACUUUCUUCCUCACAAAAAGAAUCUUACAGCUGCU
+>U2AF2_K562_rep02_6879
+UCUCCUUCUUUCUUCCAGGGGCCGGGCUAGAGCGACAUCAUGGUAUUCCCCUUACUAAAAA
+>U2AF2_K562_rep02_6880
+UCUCCUUCUUUCUUCCAGGGGCCGGGCUAGAGCGACAUCAUGGUAUUCCCCUUACUAAAAA
+>U2AF2_K562_rep02_6881
+GGCCCAGGGAGUGGGGCAGGGGGCUGCUUAUUCACUCUGGGGAUUCGCCAUGGACACGUCU
+>U2AF2_K562_rep02_6882
+AACUGCUGAGGAGGGACCUGCUUUGGGGAGUAGGGGAAGGCCCAGGGAGUGGGGCAGGGGG
+>U2AF2_K562_rep02_6883
+CUUUGCAGGUUUCUGUAGCCGGAAGAUCUCCGUUCCGCUCCCAGCGGCUCCAGUGUAAAUU
+>U2AF2_K562_rep02_6886
+GGAAGGGGGGAGAAUCCCAUAACUAACUGCUGAGGAGGGACCUGCUUUGGGGAGUAGGGGA
+>U2AF2_K562_rep02_6887
+CAACAGGCCACAACAUCUAUUCCAAUAUAUUAGGUUUCCUCGGUGGUGUUUCCUGGGCUAU
+>U2AF2_K562_rep02_6888
+UCUUGGCCUCAGGCUCCUGUUCUGGAUGUCAGAUAUGCAUCUGCCUCCUGAGAAACUGGUG
+>U2AF2_K562_rep02_6889
+UUUUCUUUCAGAGCUGUUGCGCAGCCAUUGGUACCUGUAUUGGGGAAACAUAGCAUACAAG
+>U2AF2_K562_rep02_6890
+CUGCAUAUUUUCCCCUUUUGUGAACAGGUACUGGUGGAGAAUGGAACAAAAGCUGGGCACA
+>U2AF2_K562_rep02_6891
+UUUUUUUUUCCCCUCAGGUGGCGACAUGUCUAAGAAUGUGAGCCAGUCACAGAUGGCAAAA
+>U2AF2_K562_rep02_6892
+GUCAAGAAGCAGGUCUCGAUCCCGGACCAGAAGUUCCUCUAGGUCUCGUAGCCGAUCCCGU
+>U2AF2_K562_rep02_6893
+UUUUUUCCUCUCUUUUGACCUCCCCAGACCGAGUGACGGUUCUCUACAGGAGCAAAGCCAU
+>U2AF2_K562_rep02_6894
+CAGCGGCUCCAGUGUAAAUUCCCCUUCCCCCUGGGGAAAUGCACUACCUUGUUUUGGGGGG
+>U2AF2_K562_rep02_6895
+CAGCUACCAUUCAUUUCCUGAUUUCAUUUAUAGGUCUUACCAGGCAAGAAGGCCAAGCAGA
+>U2AF2_K562_rep02_6896
+UGAUGUUAAACCUGGGGGGAUUUUUGUGUGUUCUUUCCCUUUUUCUUUCAGAGCUGUUGCG
+>U2AF2_K562_rep02_6897
+GCCUUUUUUCCCUUUUAUUUGGAGGGAAUGGGAGGAAGUGGGAACAGGGAGGUGGGAGGUG
+>U2AF2_K562_rep02_6898
+CCUUCACAGUAACUGGGGCAGGGGCCUACGGGGAGGGGCUUGUACUGAACUAUCUAGUGAU
+>U2AF2_K562_rep02_6899
+CCUUCACAGUAACUGGGGCAGGGGCCUACGGGGAGGGGCUUGUACUGAACUAUCUAGUGAU
+>U2AF2_K562_rep02_6900
+UUCUCCCAAGCCAAACUGGCAAGACGCAGUCAAGAACGGGACAAUCUUGGCAUGUUGGUCU
+>U2AF2_K562_rep02_6901
+UUUUAAAAAAAAGAUAUACUGUGGAAGGGGGGAGAAUCCCAUAACUAACUGCUGAGGAGGG
+>U2AF2_K562_rep02_6902
+AUUUGGAGGGAAUGGGAGGAAGUGGGAACAGGGAGGUGGGAGGUGGAUUUUGUUUAUUUUU
+>U2AF2_K562_rep02_6903
+UUCUCUUAGCUGGAUGCUAGUGAUUCCAGUUCUAGCAGCAAUCUUUCACUUGCUAAGGUUA
+>U2AF2_K562_rep02_6904
+CUCCUCCUUCAUCCUUAGUUCCAAACUGCUUAUCACUUCCCUGUUCCAUAGGCCACUUAGG
+>U2AF2_K562_rep02_6905
+ACAAAAGCUGGGCACAGCCUUCUCAUGGAUGCCAGGGAUCUGGUCCUUAAGGUAAGGCUUC
+>U2AF2_K562_rep02_6906
+UUCUUUAAUUAGGCUCACGAGGCCCAGGGAAUCCUCUGGACCAUCAGAUUACCAAUGAAAG
+>U2AF2_K562_rep02_6907
+UUCUUUAAUUAGGCUCACGAGGCCCAGGGAAUCCUCUGGACCAUCAGAUUACCAAUGAAAG
+>U2AF2_K562_rep02_6908
+ACCUCUUUUCCCCUAUGCAGCAGGAACUCCAGAAGAUAAAAUGAGGUUGUUUCUUAUCUAU
+>U2AF2_K562_rep02_6909
+UUUUUUUUUUUAACCAGCAGGAGAGCAAAGGGAGAAAGCUCUAGGCUAAAGGCCAGAAGAC
+>U2AF2_K562_rep02_6910
+UCUUCUUAGGUUUAUCGGCGGGGGCUUCAGGCAAUACCUCUUAGUGUUGACCUUUGGAUAC
+>U2AF2_K562_rep02_6911
+UCCUUCUCCAUGGACGGUGCGGAGGCCUGGGCCAGGGCUGACUCCCUUCAGGAGUGGAGGC
+>U2AF2_K562_rep02_6912
+UUCCACCCCACUUCUUUUGGCAGCUAGGUGCUGAGACAGGUGUGCAAAGUUCUGACCUUCA
+>U2AF2_K562_rep02_6913
+CAGACCGAGUGACGGUUCUCUACAGGAGCAAAGCCAUUCGCUAUACCUGGCCUUGUCCAUU
+>U2AF2_K562_rep02_6914
+GAGACUGAUGUUGACACACUUUUUUUCCAUUUGGCAGGAAUGGGAGUACAGUGCCAUUAGG
+>U2AF2_K562_rep02_6915
+CAUUUGGCAGGAAUGGGAGUACAGUGCCAUUAGGACCAGCAAGUGACACAGGAAUUCUGAA
+>U2AF2_K562_rep02_6916
+UCUUUUUUUAGGAAAAUGUCUGAUGAAUUUUCGGUAAGUUGAUCAGUUUAUCUGUGAUAAG
+>U2AF2_K562_rep02_6917
+AAACUUCCUUUUGGCAGAUGUGGCCUCAUGGAUGAGCUGGUACACGACUUAGCCUCAGCCU
+>U2AF2_K562_rep02_6918
+CCCUUUUCUUCCUUCAGCAGAGGCCAGGCUAUGGAGCAGGGCCACUGAAUUUGCUGUAAUC
+>U2AF2_K562_rep02_6920
+AGUUAUGUUUCACUCUAGGGAACAAGUCCUGAAGAACCCUCAAGCCCUAAAGUACCACCUC
+>U2AF2_K562_rep02_6921
+GUAAAAAAUUAUUUUUUCCUGAUAGCUGGCCCGGUGAUCAUGUCCAUUGAGGAGAAGAUGG
+>U2AF2_K562_rep02_6922
+GUAAAAAAUUAUUUUUUCCUGAUAGCUGGCCCGGUGAUCAUGUCCAUUGAGGAGAAGAUGG
+>U2AF2_K562_rep02_6923
+AUUCUCUCUUUCCCCUUAUUUCAGGUCAGAAGAGGCCAAGUGAUGGAAAUAGUGGAUUAAU
+>U2AF2_K562_rep02_6924
+UUUGCCUUCUAGGAUUCUUACAGAAGCAGAGAUUGAUGCUCACCUUGUUGCUCUAGCAGAG
+>U2AF2_K562_rep02_6925
+UUUGCCUUCUAGGAUUCUUACAGAAGCAGAGAUUGAUGCUCACCUUGUUGCUCUAGCAGAG
+>U2AF2_K562_rep02_6926
+UUUUUCUUCCGUGUCCUCUCCUCUCCCGCAGUGAAGUUAUUCGAAGUCAUUGAAACUGAAA
+>U2AF2_K562_rep02_6927
+ACGUUUUUUUCAGGAUGGCACUGGAUCUUUAAAACGCAGUGGUUCCUUUAGCAAACUCCGG
+>U2AF2_K562_rep02_6929
+ACUCCCCCUUUCUUCCAUCCCUCAUCCAUUCCUUUAGGUAACUACUAUCCUGAAGUUGAGA
+>U2AF2_K562_rep02_6930
+UUUUCACCCUUCCUGUGUUCUUGGUGGGGUUUCCCCGACCUAUUCAGAGUUGGCCAGGAGC
+>U2AF2_K562_rep02_6933
+CUCUUUGUUGGCAGGUGCGUUAAACCUCUACAGUUUGUCAAGCUUUGCAGUGCAAGCCUCU
+>U2AF2_K562_rep02_6934
+UUUUGUCUUGAUGUUUUCCCUCUAGGCUGAAAAUCUAUUGUUAGAUGCCGAUAUGAACAUU
+>U2AF2_K562_rep02_6936
+UCCUUCUAUUUCUGCCCUAUUUUUUUCCAGGAAGAAAAAAUGCUGGGCAUCUUGGUGCAGC
+>U2AF2_K562_rep02_6939
+CACAGUGUCCCCAUGAACUCCCUUGUCCCCAGUUGACCAACCUGGCCUGUAGCUUCUCACA
+>U2AF2_K562_rep02_6940
+CUUAGAAUGGUCCUUCUCUUUUGCCCCUACCUAGUCUUUUAUCACGAGUCAUGAAUACAGG
+>U2AF2_K562_rep02_6942
+UGCCCCUACCUAGUCUUUUAUCACGAGUCAUGAAUACAGGAUCACAGUUUGUGAUGGAAGG
+>U2AF2_K562_rep02_6945
+GCACUUUGUACUUAGAAUGGUCCUUCUCUUUUGCCCCUACCUAGUCUUUUAUCACGAGUCA
+>U2AF2_K562_rep02_6955
+GUCAUGUUCCUUGUCUUGGUCCUCAGGUGCAGUUUGAUGUAGUAGUGUCAGCUUUUUCCUU
+>U2AF2_K562_rep02_6960
+UAUUUUCUAUGACAGGCUGGGCGGGGAGCGUCGGACCAGAAGAGAAUCACGCCAGGAAAGC
+>U2AF2_K562_rep02_6961
+UUUGCCAUCUUAGGGCUGCUCACAGUAUUUGGGGCCAGAGCCUACGUGAAUAUAUGUGUGU
+>U2AF2_K562_rep02_6962
+AUUUAUUUCUAUUUUUAGUGGGAAGAUCCUGGCUGUAAGGAUGAAUAAUGUUAAGUUUAAA
+>U2AF2_K562_rep02_6963
+UAUUUUAAUUUUAGGUUCUAUUUUGUGGGUGAUGAAGAUUUGCUUGAAAUCAUUGGAAACA
+>U2AF2_K562_rep02_6964
+UUCUUUUUAGGACUCCUUCUCCCUCUAUGAUUGCUCUUACACAGCUACUGACAUUUAUACU
+>U2AF2_K562_rep02_6966
+UCUUUUCCCCCUUCCCCAUCCUCUUUGUCUCACAGGAACAACUUGAUACAGAGACAAGUAC
+>U2AF2_K562_rep02_6967
+UCUUAAGUUUUAAGCAGGGUCUGAAAACCCUUGGUGUUUUGGAGAAAAUUCAGGCUUAUCC
+>U2AF2_K562_rep02_6968
+UACGGCUCUGUGUUUGUCCCUCAGACAAGUUGGAUGGCUUGAGGACUGGUACUAAAAGGAA
+>U2AF2_K562_rep02_6969
+UUUUCUUCAGCUCCCAUUGCUAUCACAUGUUUUACCAGAGGCUUGGACAUCAGGAAAGAGA
+>U2AF2_K562_rep02_6970
+UUCCAUUUAAACAGGGUUAAUUUGGAAGAAUCUUCAGGAGUGGAAAACUCUCCAGCUGGUG
+>U2AF2_K562_rep02_6971
+UCCUGUUAUUCUCUCCCUCUCUUUAGUUUCUGGUUACCAUCAGCUGGGAAAAGAGAACGAA
+>U2AF2_K562_rep02_6978
+UCUCUCCUUCCCUCCUGUGAACGUCUGUGUCAGGCAGUGUGUUAGUCACUGAGGUUUUGCU
+>U2AF2_K562_rep02_6986
+UUUUAAGGUAUGAUGAGUGGGUGAAGGCUGACAGGAUAAUCUGGCCUUUGGACAAAGGUGG
+>U2AF2_K562_rep02_6987
+UAACUGACCUUGUCUACAGAACUAGACAGUACGGAUGGUGCCAAAGUUUUUAGUAAACAAC
+>U2AF2_K562_rep02_6988
+UCUUAUUUCCACAGGCAUUCGUUUUGCUCAUCUUUGGAAUUUUGGUUGGGAAUUUUAGUUU
+>U2AF2_K562_rep02_6989
+AAUCUCUUUGUACCUGCAGGCCGCAUUGACAGGAAGAUUGAGUUCCCCCUGCCUGAUGAAA
+>U2AF2_K562_rep02_7000
+UUCAUAUUUGUCUUCAGUUACAGGUUUAUGAUAAUGGAUCGCUUUGGGAGUGACCUUCAGA
+>U2AF2_K562_rep02_7001
+CUGUUUGUCUUUCCAGGCUUGUUUUGCAGAGGGAGAAGCACUUCCAUUAUCUGAAAAGAGG
+>U2AF2_K562_rep02_7002
+CUGUUUGUCUUUCCAGGCUUGUUUUGCAGAGGGAGAAGCACUUCCAUUAUCUGAAAAGAGG
+>U2AF2_K562_rep02_7003
+UUUCCAGGUGGUUCGCUUUGAGGUGGUCUGAAGCCAAGGCCUCGCGGAGCUUCUUUGUGUG
+>U2AF2_K562_rep02_7004
+UGAUUUCUUGCCCGUCCCCUCCCUCCUUCCUGCUGCGACUGUGGGACUGUGGCCCAGGUGU
+>U2AF2_K562_rep02_7005
+ACUGUUAUUUUACAGGCUUUCUUGGCUACACAAGUAGUUUAUCAUUUUUCUUUAUGAUGUU
+>U2AF2_K562_rep02_7008
+CCACUCCCAUCUUGCAGGUGCAGGAGCUCCAGUCUCUAGGCUUUGGGCCUGAGGAGGGGUC
+>U2AF2_K562_rep02_7009
+CACUCCCAUCUUGCAGGUGCAGGAGCUCCAGUCUCUAGGCUUUGGGCCUGAGGAGGGGUCU
+>U2AF2_K562_rep02_7010
+UUAGGUCUUGCUAUCACAGAUGAAAUUUUGCUGAGUAAGGCAGAGUGGUCCAAACUUUUUG
+>U2AF2_K562_rep02_7011
+CUUUCUCCCCAGGAACGACUGAAGCUGGUGACUGUUUUGGGUGCUGGCCUUCUCUGUGGAA
+>U2AF2_K562_rep02_7012
+UUUUUUUUUUUUAGAUUACAGGUCCACCAGGUUGUGGAAAAACUCAGUUUUGUAUAAUGAU
+>U2AF2_K562_rep02_7013
+CUUUUCUUUGCAGAAAAAGAAAGAAGAGGGUGUUAUUGAUUCAUCUGACAAAGAAAUCGUU
+>U2AF2_K562_rep02_7014
+GUAGCUCUGUUUUCAUAAACAGGAAGAAGAGGAGGAUGAUGACUGGGGAGAAGAUACAACU
+>U2AF2_K562_rep02_7015
+UCCAUAACAUUCCCUUUUUAGCCUCAAGAACUUGCUGCUUUUUCUGGAAGAAAUAAUUCAU
+>U2AF2_K562_rep02_7016
+UCUUAUGUUUUCCUUCCCAGGAGUGGACCUACCCUAUGAGACGAGAGAUGCAGGUAUGGCA
+>U2AF2_K562_rep02_7017
+UACUUUUUCACUGUUAGCUUGUGUUUUCUGUCGAAAACAUGAUGACUGUCCUAAUAAAUAC
+>U2AF2_K562_rep02_7018
+GCCAAUUUGCUUUAUCCUUCUCUUCAUAGGUUUCUUCUGAAAUGUUUUGCUAGUAAGUUGC
+>U2AF2_K562_rep02_7019
+AUUCUCCCACCCCCCAAACGUUUUCUGCUUUUUUUAGCUCAGCCUCUUUAACCUUGAUGGA
+>U2AF2_K562_rep02_7020
+UUUUUGUUUUUUUUUAUGAUGUGGGUUAGGGAUAGAACUUCAUUUUCUUUUAAAUUUAUUU
+>U2AF2_K562_rep02_8478
+CCCCUUUUUCUUCUUCAUACAGAGCUCGCUGCCCAAAUCAUUCAAGAGGAAGAUCUCCGUU
+>U2AF2_K562_rep02_8479
+CGCUGCCCAAAUCAUUCAAGAGGAAGAUCUCCGUUGUCUGUAAGUCCAGCCCCAAAUCCCU
+>U2AF2_K562_rep02_8481
+UUUUUUAGGUACCAGCAUCAAGAUGAUUUAUGGUAAUAAGGUACUCAGUCUUUGCUUAAAA
+>U2AF2_K562_rep02_8482
+UUUUUUUAGGUACCAGCAUCAAGAUGAUUUAUGGUAAUAAGGUACUCAGUCUUUGCUUAAA
+>U2AF2_K562_rep02_8483
+CCUUUCAUUUUCUACGACCGCGAGGACUACGGGAUCAUGAAAAUGAAGAUCGUGAUGCUCA
+>U2AF2_K562_rep02_8484
+UGCUAGAUUUCUAACGACCCAAGUCCAGGAUACAACAUUGAACAGAUGGCAAAGCGGUAAG
+>U2AF2_K562_rep02_8486
+UUCAAGAGGAAGAUCUCCGUUGUCUGUAAGUCCAGCCCCAAAUCCCUGAUAAAAGUCAGGA
+>U2AF2_K562_rep02_8487
+UGUGGGGUGUCUCUCUUUCUCUUUUUUUUCCCCUUUUUCUUCUUCAUACAGAGCUCGCUGC
+>U2AF2_K562_rep02_8488
+UCUAGCAUUUGCUUUCCCUUCUAGGUCUCCUUAACAGCAGCAGCAGUGUUUUAAGGUAGAU
+>U2AF2_K562_rep02_8489
+AUCUUUAUUCCCUUCUUUCCUCUUCCAGCUGAGCAGAGUUGGAUAAUUGAAUUAGUCAUUC
+>U2AF2_K562_rep02_8490
+GCCUUUUUCUGGUGUGUGUUGCGGGGGUGGGGGCCGGUGAAAGUGAUUUGAUGUGCAGAAU
+>U2AF2_K562_rep02_8491
+UAUAAUCCCUUUAGUCCUCUUUUUUUCAGUUUUUAUGAAGAACAGUUUGUCAGCAUCUUCA
+>U2AF2_K562_rep02_8492
+UCUUCCCAUUCUCUUUCUAGGAUCUUCUGAGGUCGGAGCUUCCAGAUUCAAUUGAAAGUGC
+>U2AF2_K562_rep02_8493
+UUUUUUCCUUCGCACAGGUCCUCUGGUGAUGUUCUUGAGACGUUCAAUUUCUUAGAAAAUG
+>U2AF2_K562_rep02_8494
+UCCUUCUUCCCCGUAAAACUUUGUCCAAGUACCUCAUGUACGGUAAUCCGCCCGUAAAAUA
+>U2AF2_K562_rep02_8495
+CUUCCAUUCCCUCCUUCCUUAUUUUUUUCUUCUGCUAGAUUUCUAACGACCCAAGUCCAGG
+>U2AF2_K562_rep02_8496
+UUCUGCUUUUCUUAUCAGCACUGUUCUGCAGGCAAAGUCAUGGCAAUUUCCUUAAAGUUAU
+>U2AF2_K562_rep02_8497
+AGACCAUGGUUGGUCUGCUUCCCUCACUCGGGCUCCUUGACAGUCUUCUAGAAGAGAGAAG
+>U2AF2_K562_rep02_8499
+AACCCAACCUCAGGUCCAGAUACUUCGUCUGCUUCGGAUCCUGGGCCGGAACCACGAGGAG
+>U2AF2_K562_rep02_8501
+CUAUUGGGGCGGGUGGGCAGGAAUGGACCUAGGGGAAAGAGUAGAGCACUCUAGUGAUCCC
+>U2AF2_K562_rep02_8503
+UUUUCCCCCACCAUUAGAUAUUGAAAAAGUACUUGUUUCUCUGCAGAAAGCAGAAGACUAU
+>U2AF2_K562_rep02_8504
+UUUUUCCUCUCUUCCUACAAUAGCGGCCCUGUUCUGUCAUUAGCUAUUAGUUCUAAUGGAG
+>U2AF2_K562_rep02_8505
+GUUUUCUUCUUUUUCCUCUUCCUCUCCCUCCCUUUUUUCUAAAAAAUUAUAGCUAAAGCCU
+>U2AF2_K562_rep02_8507
+UUAUCUUCUAUUCCCUCCUCCUAGGGUCAUCACACUGAAACGGUGUUCAACCGGGUUUUGC
+>U2AF2_K562_rep02_8510
+CUUUCUUUUCCUCCAUCCUGCCCCUUUUCUUCAGUAUUUCAUAGCCUUAAUUGAACAAGUU
+>U2AF2_K562_rep02_8511
+CUUUCUUUUCCUCCAUCCUGCCCCUUUUCUUCAGUAUUUCAUAGCCUUAAUUGAACAAGUU
+>U2AF2_K562_rep02_8512
+CCAUAGUGGACAGAGUUCACAGACCGCACUUUGGCACGUUGUCCUCACUGCAGGAAAGUGU
+>U2AF2_K562_rep02_8513
+CUCUCUUAUUCCAGGAAGAGCAACCGAGGUUUCAAUCUGCGGUACGUCUCCUACUCUCCAU
+>U2AF2_K562_rep02_8514
+UUUAUUUUUCCUCCCAACUUUUACUUUAGGUUCAGAAGGUAUGUGUGCAGAUUUGUUUCAU
+>U2AF2_K562_rep02_8515
+UGUUUUCAGCUGCCCUAUGAUGACUGUGUGUUUGGAGGCCAGCGUCUGACGUUAUGAGCGC
+>U2AF2_K562_rep02_8516
+UAUUUGAUUCUUUGACAGGCCAGCCACAUCCUGAAGAUGUACUACUGUUUGCCAUUCCAAU
+>U2AF2_K562_rep02_8517
+AAAAAAUUAUAGCUAAAGCCUGGAGAAAAGCCUGUUCCAGGUAUGGUUCAUGUAAUAUUCU
+>U2AF2_K562_rep02_8518
+UGGCCUCACACACCUCUGUUCCCCUCCUAGGACCAAGGGACCUGUGGAGGUGAGGAGGUGG
+>U2AF2_K562_rep02_8519
+UGCCUUGCUUAAUCCCAGGAACCUGGCCACUGCUCCUUGGUCCUUGGCAUUAUGACGGGAU
+>U2AF2_K562_rep02_8520
+AUUUUUCUUUUGAUUUCAGAGAACACUUUUUACAGUUGGCUAGAAGGUAAUUAGAAACUUU
+>U2AF2_K562_rep02_8525
+CUUCUUCAUUCAUGUUCAUCUCUGCUAUUCCUUCUCCCUCCAGAAGGGAUGGAAACCCUAU
+>U2AF2_K562_rep02_8533
+UUUAGCUUCUCCUCUUAUGGGUGCUCAGAGUUUCCCUAAUUUGACCACACCUGGUACUACA
+>U2AF2_K562_rep02_8534
+AUUUUUUCCCUUCCCCUCCUAAAACAUCUCUAAAGCAGAAAAACUCAAUAUUGAUCAGGUG
+>U2AF2_K562_rep02_8537
+GUUUGUUUUUUCCCCAGAGCCAAAUGUUCUAGCUGGCACUUUAGUUGGUCAUACAGAUGCA
+>U2AF2_K562_rep02_8538
+UUUCUGUUACUUCCCCCCAGGAGCGAAUCCGUUUAGCUCGACAGAUUGAGAAAUCUGAGUA
+>U2AF2_K562_rep02_8539
+UCUUUUAUAGCUUCAGCCCACUUGGGGAGAGUUCCUUGAUCAUCAUAAAGAACAGCCAGUA
+>U2AF2_K562_rep02_8541
+UUUGUCGUUAAGGGUGAUCUGCCAGAUUGCGAAGCUGACCAACUCCUGCAGAUGAUUAGGG
+>U2AF2_K562_rep02_8545
+UGUUCUUUUAUUUUGCACUAGGGAGAGGAAAUUCGAUGUCAGUAUGUUGUGACAUGUGCAG
+>U2AF2_K562_rep02_8550
+GUCUUUAUAGGAUCUUUAAUGACUUGCUACUGUGGGAACCAACAGCUCCUUCACCAGUGGA
+>U2AF2_K562_rep02_8552
+UUUUUUUUUCUUAGACGUUCCAUCCUCAGAGCAGCCUGAACUGUUCCUAAAGAAACUUCAG
+>U2AF2_K562_rep02_8558
+UUUCUUUUUUAUAGAGGACCCACAGGCAUGAAUUAUUUACUCCUCCGGUGAUAGGUUCUCA
+>U2AF2_K562_rep02_8559
+AACUGUGACUUUGCCUUCAGUGAAGGCCGCCCUCCGUUUGGGAUUUCAUUCUCGUUGUCUU
+>U2AF2_K562_rep02_8560
+UUAUGUUUUAGAUGGUGAUGCCAGGAGACCCUGUAGAAAUGACAGAAUUUCAGGAUAAAGC
+>U2AF2_K562_rep02_8561
+AACUACUUUGCCUCCCUUCUCUGGUCUGGUGUCGUCCUCACAUAACAUGAGGGCCUGGAGA
+>U2AF2_K562_rep02_8562
+CUGCAUGGAAACCUCUUUCUCCUGCCAGGAGAGCCCUGGAACUAAGCCUGGCUCUGGUAAA
+>U2AF2_K562_rep02_8563
+UUUUUUUUUCUUGGCAGGGACUCACUCUGUUGCCCAGACUGGAGUGCAGUGGCACAAAGGA
+>U2AF2_K562_rep02_8564
+UUGUUUCUUCCCAGUUUUGGAAUUCAAGAACACCUAAGGAUUCCACUGAUUUGCUGAUCUG
+>U2AF2_K562_rep02_8565
+CCUACUUUAUAUAAGGGCAACUUCCUGGGAGCUAAGGCUACUAAAAGGUAGAAGCCACAGU
+>U2AF2_K562_rep02_8566
+CCUACUUUAUAUAAGGGCAACUUCCUGGGAGCUAAGGCUACUAAAAGGUAGAAGCCACAGU
+>U2AF2_K562_rep02_8572
+UCAGCCUUUGAAGUAAAUUUUAUGGAUGAUGUAGGUCAGACUCUAUUAAACUGGGCCUCUG
+>U2AF2_K562_rep02_8573
+AGUCACUGCUUUUUCUUAGGUCUCUGUGUAGAAAAAAGAGCAUUCUACAGACUUAUAUCUG
+>U2AF2_K562_rep02_8574
+AAUGUCCUUUUUUCGCUCUUCCUGUGUUAACGGCUGCUUUCCUUUCAUUUUCUACGACCGC
+>U2AF2_K562_rep02_8575
+UAUUUCCUAGGUUCGUUCCACCAGUCAUAAACCAGAUGAAAUCUAUGGCAUGAUUGAAAGA
+>U2AF2_K562_rep02_8579
+CCCCUUCCUCCCAACUUUUUCCGCAUUUCCCCUCCAGUUUCUAUCCUUUUCCCAAGGAAGA
+>U2AF2_K562_rep02_8580
+UUCUCAGCCUUUUUUAGCAAAACUUCAGUCUCCGAUUAAAGAGGAGAAUACAACUGCUGUU
+>U2AF2_K562_rep02_8581
+UUCCCCUCCCUUGCAAUGUAACCCACAGGCUGAGGAAUUCCUCUACAGAUUCUUGCCACAG
+>U2AF2_K562_rep02_8582
+CUAUUUCAGUUGCUAGUGAUAUCUCGCUAACAGGAGGCUCAGUAGUACAGAGAAUACGGCU
+>U2AF2_K562_rep02_10076
+CAUUUCUUCGUUUAUCCCCCCAGCAGCGCUGGAGAGCGAGGUGGCUUCAAUAAGCCUGGUG
+>U2AF2_K562_rep02_10077
+CUUUAAGGCAGUAUUUUGAUCCCAUAGUAGGUGGAGCAGCCCUGCACACCCCCUCCUGUAU
+>U2AF2_K562_rep02_10078
+UGAAUGGGCAAGAGGGCACAUGAAGUACGGCGUCCUCCACAUUCACGGCCUCUACACGGAC
+>U2AF2_K562_rep02_10079
+UUAGGUGGAUUCUUGCUCUGUCACCCAGGCUGGAGCGUAAUGGCACAAUCUUCGCUCACUU
+>U2AF2_K562_rep02_10080
+UUUGCAGGUAGAAGAAGAAAGGUGCCACUCCGGCAUGAAGACAGACUCGCUUAGUCGCCAG
+>U2AF2_K562_rep02_10081
+UGUGUUUCUUUUUCUUGGCUUGAUGUUUGGUAGGUCCUUGAAUGGGCAAGAGGGCACAUGA
+>U2AF2_K562_rep02_10082
+CCUUUCAUUUCGUUCCCCAGGGCACCGAAGCCAAAGCACUGUCCAUGCCGGAGAAGUGGAA
+>U2AF2_K562_rep02_10083
+UUAUUUCUCCUCUUAGACCGCAGGAUGGAAACAAGCCCACUGAGACUAGUCAACCUCAAUC
+>U2AF2_K562_rep02_10084
+AUGAUCUUUCCUGGUUGGCAGGACCCAUGGAUGAAGGACCAGAUCUUGAUCUAGGUAAUUU
+>U2AF2_K562_rep02_10085
+UCCCUUGAUGACAUGGGGCUGGCUCUGGUUUUCCAGGUGUCCCCUCGUCCCAGCCACCUCC
+>U2AF2_K562_rep02_10086
+UCUCUCUCUUUCAGCUAUUCCUCUACACAGCCGACUAGUUAUGAUCAGAGCAGUUACUCUC
+>U2AF2_K562_rep02_10087
+UUCCUCCUUCUCCCCUCAGACCGAAGCCAGGACAGCACAGCCGUAGCACUCUCAGACUCUA
+>U2AF2_K562_rep02_10088
+UGUCUUCCUGUGCAGGUCGUGGCCGCCCACCUACAGAGCCGCUGCCCGACGGGUGGAUCAU
+>U2AF2_K562_rep02_10091
+CAUCCUGUUUGUUUUUCAGAUGAUCAUGCACCCUAAGGGCACAUCUAGGCCCCCUGAGAGC
+>U2AF2_K562_rep02_10092
+GUUCACAGAGAUGCUGCAAUUUGUCAGUAAUCAAGUGGGAGAGUUCCCUGACUUGUUUUCA
+>U2AF2_K562_rep02_10093
+GGGCACAUCUAGGCCCCCUGAGAGCACCUCCUUUCUGUGUCUGUUCUCAGGAAUGCUGUUG
+>U2AF2_K562_rep02_10094
+AGGCCCGAGCAGGUACUGACCCCUUGUCCUUCCCCACAGCCGAGCCCAGGAAGUGCGUCCC
+>U2AF2_K562_rep02_10095
+CCUAGCAUCUGUCCUGCCCGAGGUGCUGCCGGUUAGCCAGCGCCCUGUUGUGCCACAGAUU
+>U2AF2_K562_rep02_10096
+GUUUGGCCCAUGGGUAGGCCCUGCAUCCCUGAUCUAGCGCGUGGGGCAGCAGGUGCUGCUG
+>U2AF2_K562_rep02_10097
+CAGAUGUAUUUGGGUUGGUCGUCCUCCCAUUGGAACUGAAACUACGGAUCUUCCGACUUCU
+>U2AF2_K562_rep02_10099
+UUUUUAAAGUUUCCUAAUGAAAAGUUUGGCCCAUGGGUAGGCCCUGCAUCCCUGAUCUAGC
+>U2AF2_K562_rep02_10103
+GUCCAUGUUUGCCACACAGGGUCGGGUGUGCUGACAGCCGGCUGUUAAGCCCUGCCUGCCC
+>U2AF2_K562_rep02_10105
+UUUUUAAACAGAUCUCCCACAAACAAAUUUUCGUCGUUUACCUUUUGACCACUGCAGGUAA
+>U2AF2_K562_rep02_10107
+GUGUUUAGGAAUGUUCAACGCUCCAAGCCCCAUAGGCUGAUUCAAGAAGAUAAAGUGAGAC
+>U2AF2_K562_rep02_10108
+GUGUUUAGGAAUGUUCAACGCUCCAAGCCCCAUAGGCUGAUUCAAGAAGAUAAAGUGAGAC
+>U2AF2_K562_rep02_10110
+CUUCUCCACCUCUUGCCUGGUCCAGCUGGAGCAGAGUGAAGCCAAGUGUGAGGAGGCCUUG
+>U2AF2_K562_rep02_10114
+UUUUCCUUUAGGUAGAUGCCCAGACUGCUGGAUUGAAUGCAGAUCUACUUCGAAAAAGUCU
+>U2AF2_K562_rep02_10115
+CCACCACUUCUCUCCAUCCUGCAGGCAGCUGCCAGACCCGGCCAUCGAGGACCAGGGUGGG
+>U2AF2_K562_rep02_10118
+UUCCUGUUUAACUCGUGCAGGUGCAGUGGUCUGGUGUCUUUCAGUCCGCUGACGUCUUCUG
+>U2AF2_K562_rep02_10119
+CUCUAAUUUUUUCCCCAGGCCGUGGAGGAGCUCCUGGAGACCCUGGAUCUGGAAAAGAAGG
+>U2AF2_K562_rep02_10120
+CCUGGGGACAGCUGGAGUUCCGGGGUCCCCUGGGCAGCCUUGGGGGCUAAUGACCUGCCCU
+>U2AF2_K562_rep02_10121
+UCGUUUUUUUUUGGAGCAGGCAUAUGGGCAACAAAGCUAUGGAACCUAUGGACAGCCCACU
+>U2AF2_K562_rep02_10125
+CCUUUGUUGUUCUUUCAGGAGGAGACUCGAAAGAAGCCCAAGAUGUCCAUUGUGGCGUCCG
+>U2AF2_K562_rep02_10126
+AUCUUCCUACCCAGAUGCACAAGUCUGGCGUUCUGAGGAAGGCCAUUGAUUACAUCAAAUA
+>U2AF2_K562_rep02_10128
+GCGAUUGUUAAAUCUAUUCGUGCCCUGAGAUGUAUGGCUUUAUGCUGAAGAUUGGCUGGAU
+>U2AF2_K562_rep02_10129
+CCUUUUUCCCACAGAUCAUCACAGGUGCUAAAGUUUGGCAUUUGGGAACCACAUCCUAAUU
+>U2AF2_K562_rep02_10130
+UCUUUCCAGUCUUCCCCUGAAGCAGGUGAAGCAGAAGUUCCAGGCCAUGGACAUCUCCUUG
+>U2AF2_K562_rep02_10131
+UAACUGUGCUUCUUCCAGAAGCUGGACGGGAGGUCCCUGAUCAAGCUGAACUUUUCCAAGA
+>U2AF2_K562_rep02_10133
+GAAACAUUUCCCCUUGAUCUCCCUAGGGGCAUCUGGUCUCCAAUAAGGCUGCUAUGGAUGA
+>U2AF2_K562_rep02_10137
+GCAUUUUGUGACCGACUUAUUCUUAGAUCAUUGGUUUUCCAAAGGCUUUGUGGCCAUGAAG
+>U2AF2_K562_rep02_10138
+CCAUCAUUGUGUCCUUUGAUCUUCACACAGCAGGUAUCAUCUGCAUUUUAUGGAUGAGGAA
+>U2AF2_K562_rep02_10139
+AUUUUCUCUUUUGAAGAUGCCUUGCCCAGUGGCAUGGAAAGAAGCCCACUUGAUGAUAGGA
+>U2AF2_K562_rep02_10142
+UCACAAGGGGCUGGGGUCAGGUUUGGGCUGUUGACGCCUCGGGUCUUCCCUCCAGGUUUGG
+>U2AF2_K562_rep02_10143
+GUUUUUAUCUUGCUGUACCUGUAGGGAAUGUUUAAUUCAGCCUUGGAAGUGGCCAAAUUUG
+>U2AF2_K562_rep02_10144
+GUUUUUAUCUUGCUGUACCUGUAGGGAAUGUUUAAUUCAGCCUUGGAAGUGGCCAAAUUUG
+>U2AF2_K562_rep02_10145
+CUCCACUGCCUUCUCUUCUUCCAGGUGGGCCAUCGUUGGACUAACAGACCAGUGGGUGCAA
+>U2AF2_K562_rep02_10152
+UCUCUCCCCCAUAGAGGAGGAGCUCCGGAAGCUGCGAGAAGAAACCAACGCGGAGAUGCUG
+>U2AF2_K562_rep02_10160
+UCCAGCUGCACUGGGCACAUUCCUCCCCUCACCCUGACUCACAAGGUGUUAGCAAUAAUGG
+>U2AF2_K562_rep02_10161
+UCUUUCCUGUUUUUCUUAGGGUCAUAGUGUGCUGAAUUAUAUUGUUAUGAGAUAACACUAG
+>U2AF2_K562_rep02_10163
+UGGGCAUUCUCUUUUUGCCACAGGACCCCACCAAUUUGGACAAGUUCAAUGUCUCUAACUU
+>U2AF2_K562_rep02_10164
+CCUUGGUAUUUGUUGUAAAUUCUCCUUUCACAGCGAUUGUUAAAUCUAUUCGUGCCCUGAG
+>U2AF2_K562_rep02_10165
+UGGAAAUUGCCUUAUUGGAAAAACAUUUCUUACGUGAGUACCAGAAAGCGCUUGGAGGGGA
+>U2AF2_K562_rep02_10173
+ACCACAUCAGCAUCGAGGACUCGCGGGUCUACGAGCUGACCAGCAAGGCUGGGCUGUUGUC
+>U2AF2_K562_rep02_10174
+UGGCUGUAGAGGGUGGGCAGCUCCUGGUGUGCUCUUAGGCAGGCCAGGUGCAGAAGGUGCC
+>U2AF2_K562_rep02_10182
+CAUUCACGGCCUCUACACGGACCCCUGCGGGGUGGUGCUGGACCCAUCGGGGUAUAAAGAC
+>U2AF2_K562_rep02_10183
+GCACUUCCCUUGCAGGGCUCCCUGCGGACUGCCGUGGCCGCUGGGAGAGCUUCGUGGAGGA
+>U2AF2_K562_rep02_10194
+UCUCAUGAUCUUCUUACAGAUGGAGGGCCGGCGCGACAGCAUGCUAGAGACAGCCAAGCAC
+>U2AF2_K562_rep02_10195
+GGUAGAAAAACUACAUAGUGGUGGCUACUGUGCAUCUCUUCCUAACUCCACAUUUGACAAC
+>U2AF2_K562_rep02_10196
+GGGCCUGAGGUCGACCAGGAAAGGCCUGUGCCCCCUCCAAGGGCCCCUCUCUUCUACCCAG
+>U2AF2_K562_rep02_10197
+AGGGUGACAGCUGUGUUUGCUCCCAUGACAGGAUGAAGGACAUGCGCGUGCAGACUUUCAG
+>U2AF2_K562_rep02_10198
+UUCCUUCUUUUUUCCAUUGGUUUAGAUUUUUGUUCUUGGUCUUCAGUUUUAGUAUUAAAAU
+>U2AF2_K562_rep02_10208
+CCUUCUUCCCUCCGGCAGAACCAGAGCUGGGGUCUGGGGCGGGCCCUGCCGGCACAGGCAC
+>U2AF2_K562_rep02_10209
+CCUGUCUUUUCCCUUUCCCCCGCUGUCACCCCUGUCUCCGUCCAGCCCUUGUCCCUGUGGC
+>U2AF2_K562_rep02_10210
+UUUUUAUUUUGUCUCCUCUGUUUUUGUUGCUUAUCUCCUUGUAUUUUUAUUAUUAGUUUUG
+>U2AF2_K562_rep02_10211
+UUUGUUUCUCAUUUCCUCCCUUAAUGACUUCUUUUGAGGUAAACACAUACUGUUCUAAUAU
+>U2AF2_K562_rep02_10212
+AGCUACACUAAAAAUCAACAAUGAGAUUAGAAGUGUGAAAAGAUUGCAGCUGCUACCAGAA
+>U2AF2_K562_rep02_10213
+UCUCUCUUUUCCCUCCUCCCCACCAGAGAGGAGCUGCGGAGUCUAUUCCAGGCCCGGGCCA
+>U2AF2_K562_rep02_10214
+UUCCCCCAUUCUUAAUCUUGCAGCUCCUGGAUCUCCCAGGUAUCAUUGAAGGUGCCAAGGA
+>U2AF2_K562_rep02_10215
+GGGAGGGAGGCGUCGCGGAGUUUCUCUCGGCCUUUUGUGCCAUCCGCCGAGGCGCCUUGAG
+>U2AF2_K562_rep02_10216
+GGGAGGGAGGCGUCGCGGAGUUUCUCUCGGCCUUUUGUGCCAUCCGCCGAGGCGCCUUGAG
+>U2AF2_K562_rep02_10217
+CUUCUUUCCUUCCUUCCUUCCCUGUUUCCUUCCCUCUUUCCUUCCUUCCUCCUGGUCUGUU
+>U2AF2_K562_rep02_10218
+CUGAAUACACUCACUUUUAUGGUGGCAAGAAGCCAGGUAAGGCAUGCAGUCUUUCUGUUCC
+>U2AF2_K562_rep02_10219
+CUGAAUACACUCACUUUUAUGGUGGCAAGAAGCCAGGUAAGGCAUGCAGUCUUUCUGUUCC
+>U2AF2_K562_rep02_11141
+CAGUCUUUUCUCUCUUUCUCCUGCAGGGCUACACCAAGUCCAUUGAUAUUUGGUCUGUAGG
+>U2AF2_K562_rep02_11142
+UUUGAUUAUUACUCUCAGACGUGCGUGGCAACAAGUGACUGAGACCUAGAAAUCCAAGCGU
+>U2AF2_K562_rep02_11143
+CCAGGCAAGCCGAUUUUUUCAGUUGAUAUUCACCCUGACGGGACCAAGUUCGCAACUGGAG
+>U2AF2_K562_rep02_11144
+CCAGGCAAGCCGAUUUUUUCAGUUGAUAUUCACCCUGACGGGACCAAGUUCGCAACUGGAG
+>U2AF2_K562_rep02_11145
+UCACCUUCUUUCCUCUUGCUGUCAUCUGCAUUCGUGCUUCCCACCUGUUGUUGGCAUGUCC
+>U2AF2_K562_rep02_11147
+GUUUCCCUCUUCCUUCCGUCUUGUUUCCUAACUUCUUACCAAAGUUUAGAGUCUGAGUUUU
+>U2AF2_K562_rep02_11148
+CAAACCUAGGAUGAAGCUGGAGGCAGAUUCGUCGCUUUCUCUGGAGAAGGACAGUCAUUGC
+>U2AF2_K562_rep02_11150
+CUUUUUUGAGACAGACACUGGGCAGCAUCGUGUUCUUCCAGCGGACGUGUCUAGAACAUCU
+>U2AF2_K562_rep02_11151
+CAAGUCCAUUGAUAUUUGGUCUGUAGGCUGCAUUCUGGCAGAAAUGCUUUCUAACAGGCCC
+>U2AF2_K562_rep02_11152
+GAUAUCAGCUGCAGAUCACUCAAUACAUGGCCGAGACAAAUCUACAUUGGCCGGAAGCAGC
+>U2AF2_K562_rep02_11154
+CGCUGUCUCUGCUCCCUCUAGGAAAGGCCACCUGCCUGAGCUUUGAAAUGGCCCACACCGU
+>U2AF2_K562_rep02_11156
+UAAUAGCAUUGCUGAUGACAUUUUCCCUGUUAUCAGUUACUUAUGGGGCCAUUCGCUGCAA
+>U2AF2_K562_rep02_11158
+UUUAUGUUUCCUAGGGAAGUGCCCGACAGGGUGGCACCACUACGAAGGCACGGCCAGCUGC
+>U2AF2_K562_rep02_11159
+UUCCCCACCCCCUGUCUUACAUCCACCCUGGCCCUGUAAAUUCUUUUUUCCUUUGUUGCGU
+>U2AF2_K562_rep02_11160
+CUCCUUUUUUUUUCUCCUGAGACAGGGUCUUGCCCUGUUGCCUAAGCAGGCAUGGAGUGGC
+>U2AF2_K562_rep02_11164
+CUUUUUUCUCUAAUUGGACUGCAGCGUCAACUAUUCUGCCUCGCUAGAAAGUUCUUGGUAU
+>U2AF2_K562_rep02_11165
+UGGAGCCUGGUGGGGAGCUGCUGGAGGGCUUGGGGCCAGGGAGGGAUGUGGCCUGACUUGG
+>U2AF2_K562_rep02_11167
+CACCUUCUUAUCUGUGGUGAGGGCCACCCGCUGCCCCUCCCUCCUUCCUAUCCCUGUAUCU
+>U2AF2_K562_rep02_11169
+UUCACUUUUAGCUUGUUCCAGCUGCCAGGCUGAGGGGACACCUUACGUCCCUCCCUCCUGA
+>U2AF2_K562_rep02_11172
+GACCACUGCCUCUCUCCCCACAGGGACCACUGAAGAAAGACCGAAUUGCAAAGGAAGAAGG
+>U2AF2_K562_rep02_11176
+CCACUUGUGUCCACACAGGCCCUGGGAGGAGCGGGGACACUGAGGACCUCUCUCCAAAUUG
+>U2AF2_K562_rep02_11177
+UGUAUUUCUGAAUUGUAGAGUCAAAGGAGAAGUUCAGAGUCCCAUCAGCAAUGCACCUGUC
+>U2AF2_K562_rep02_11183
+CUCCCGCUGCAUGCAGGGAUUCGGGUUCGUAACUUUCGAGAAUAGUGCUGAUGCAGACAGG
+>U2AF2_K562_rep02_11184
+GCUCCCUGGUCUUGAGCAUCUGGGGCCCGAGCUGCCUGGGCAUUGGUUGGAAGUAGCCCUG
+>U2AF2_K562_rep02_11187
+UGUUUUCAGAGACUCCCUACGGGAGAGGAUGCCCCGCAGGAACAUGGUAAGUAGUGAGGCG
+>U2AF2_K562_rep02_11192
+UAACGAUGUGCAUGUUUUCCCCCCUUCUCCCGCUGCAUGCAGGGAUUCGGGUUCGUAACUU
+>U2AF2_K562_rep02_11195
+CUUUGGUUUUUCAGGGCAGCCGAUGAAGUGCAACCUUCACAUGAAUGGGAAUGUUAUCACC
+>U2AF2_K562_rep02_11196
+UUCUUCUCAUACCCCUACAGGACAAGAGGACCCUGCCUUGGUGUGAGAGUGAGGGAAGAGG
+>U2AF2_K562_rep02_11199
+UCCAAAGCUGGGAGUCAUGUUGCCUGCAGGGACUCUUUCCUUACUGGGCCCAGGAGUUCGA
+>U2AF2_K562_rep02_11201
+UUUGCUAUUUUCCCUCACCUCCCAGGGUAAGAUAAUCAGGAGCAGAAUGUGAAGAACUUUC
+>U2AF2_K562_rep02_11205
+ACUCUAGCUAGAAGACAGAAGGCCAGCUCCCAAGCAGAUCAGAGGGUGGAAUUUUCAUUCU
+>U2AF2_K562_rep02_11206
+UGAUGUGUCUUUUGCAGGUGAAGGUGGGAGACAAGGUCUCUGCUGACGAUGAGGCAGAGCC
+>U2AF2_K562_rep02_11207
+AUCAUUUAUUGGAUUUCAGUUCAACAGACACUCCUAUGAGAAGCCCUUUGAGAUACGCCAG
+>U2AF2_K562_rep02_11208
+ACGUGGUUUUUGGAUCCGUAGCACCCCGAGCAGAAGGCAGACCGGUAUUUUGUGUUAUACA
+>U2AF2_K562_rep02_11211
+UCUCCACAUCUCCCCACAGCGCUGCGCACAUUGUCAGUGACUCUUUGUUGCAUGGUGAGUG
+>U2AF2_K562_rep02_11215
+UGGCCCCUUUGCUGUCCAUCCUUUUUCAGGGCGUGGACUCCCUGGUGCUAGAAAGCGUGAU
+>U2AF2_K562_rep02_11216
+UGGCCCCUUUGCUGUCCAUCCUUUUUCAGGGCGUGGACUCCCUGGUGCUAGAAAGCGUGAU
+>U2AF2_K562_rep02_11226
+GCUUUUUACUUUCUCACGCAGGUCUGGCCUAAGAAGGAAAUGGAAAAUGAAAAGGCUUGAA
+>U2AF2_K562_rep02_11227
+UGGUUUCUCUCCCUCGGCACCUGUUGCCUAGGAGUGGUCCGCAGACCUGAAUCGAACCCUC
+>U2AF2_K562_rep02_11228
+ACUAAAUGUUAUUUCCUGAGUCACUUUUUUAAAGAGCUGCAUAAGCAACAAAGCUGCAUCA
+>U2AF2_K562_rep02_11229
+CGUCUGCUCCUACUCCACAGCCGCGUCGUGUGACUCCUUCAAGAACCAGCUGGUCACCCGG
+>U2AF2_K562_rep02_11234
+UUCUCUCUUUACAGGUGCUGGGCUGUGCUGUGGAGCUCCCUGAUGUCAGCUGCAAGCGGUU
+>U2AF2_K562_rep02_11240
+UUUUCUCCUUUCAUUACCUACCUCUCCAUUAUGCCUCAGUUGUAACGGUGAGUAAAACUAU
+>U2AF2_K562_rep02_11241
+CACUUCCUGUCACCUCCCAGGGCUCCCCCAUCCUGCUGGCUGCCAGGCGGGUUGGCCGCUC
+>U2AF2_K562_rep02_11253
+CUUCCUUAGUUUUUGUCUUUUUUGAUCUGACUGUAGAUGAUCAGUCAGUUUAUCCUAAGGC
+>U2AF2_K562_rep02_11254
+UUUAUUUCCUUCGGGACCUGGGGACAGGGUUUGGUCAGCACCUGCAAGGUCUGUAGUUGCC
+>U2AF2_K562_rep02_11255
+AUUGCUUUGCAAUUCCAGGAGCGGCAUUGCCCCCGAAUGUCCAGAUUAUCCCUGUUUUUGU
+>U2AF2_K562_rep02_12216
+UUCCCUUUUGUUCCCAGUGCCCCUCGCUGCCUUGUGUUCUUUGACAUUGGAAAGAAGGUCU
+>U2AF2_K562_rep02_12217
+CUCCUUUCUUCCUUCCCUUCCCUUCCCCUCCCCUCCCCCAGGCUGGAGUGCAGAGGCACGA
+>U2AF2_K562_rep02_12218
+CUCCUUUCUUCCUUCCCUUCCCUUCCCCUCCCCUCCCCCAGGCUGGAGUGCAGAGGCACGA
+>U2AF2_K562_rep02_12219
+AGAUUUUCCACAGGUGUGGGCCCCAUUAGCUCUGGCCACCUGAGAAAGCCCUCAGGCAAAG
+>U2AF2_K562_rep02_12220
+GGAUGUUAAUUCUUCUCUAUUUUAGAUUUUCCACAGGUGUGGGCCCCAUUAGCUCUGGCCA
+>U2AF2_K562_rep02_12221
+UUACAGGUAUCACGCUCAUUGCUGUGGAUGAGGCUCACUGUAUUUCUGAGUGGGGGCAUGA
+>U2AF2_K562_rep02_12222
+CUUUUCACAGUCCUCUUACUCCCAGUUACUGGCAGCUACAUGCCUUACCAAGCUUGUAUCA
+>U2AF2_K562_rep02_12223
+CCUGUUUUUUUUUCCCCCUGGCAGAGUUAGCCACUUCUUCCUAUGUGUAAGCAUAUCAUCA
+>U2AF2_K562_rep02_12224
+UUUAUGUUUUUUUUUCAGGGGAGCGGAAUAUUGGUUUCUUUUACUUGUUGUUUUCAGUUUU
+>U2AF2_K562_rep02_12225
+CCCUCUUUCUCUCUCAGCUCCCACAGGCCCAUUCUGGUGACUCAUGACUUGUAUACACAGA
+>U2AF2_K562_rep02_12226
+UUUUUUUUUUUUUUUUUAAUAGGGUCUCACUCUGUUGCUCGUGCUGGAGUGACAGUGGUGU
+>U2AF2_K562_rep02_12227
+CCUUCCUUUCUUUUUCCCGCUUCCUUAAUGUAAUUUAAACCCUGGCAAACAUUCUUUAGAA
+>U2AF2_K562_rep02_12228
+UUUUUCCAGGAGCUGGAGGAGGGAAUGAUAUUCAGUGGUGUUUUUCUCAGGUGAAAGGAGC
+>U2AF2_K562_rep02_12229
+AUCCUUUCCUCCGUUUAGGAGCUGCAGUGAACACUUUUCAUUGAACAUGUAGCAUGAAGAG
+>U2AF2_K562_rep02_12230
+CAUUAUUUGUUUACUCAUUUGGAGUGUUCCUUGACUUUUAUCCCCUCUUACCUAGUGACAU
+>U2AF2_K562_rep02_12231
+AGAUAGAUCCAUUUAUCCUGCCUCCUAGGGAGAAGUUUCUGCCUGGAUUGAAACAAAAAAA
+>U2AF2_K562_rep02_12232
+AACAGUGUAAAUUUGAUGGCCAGGAGACAAAAGGAUCCAAGUUCAUUACCUCCAGUGCGAG
+>U2AF2_K562_rep02_12233
+CCUUUUUCUCCUCUUUACCGCAUCUUUCGUCUUGCAACACAGAGACCUAAAGGGCAAGGAA
+>U2AF2_K562_rep02_12234
+UAUUUUCCAGGCCAGAGAUCCUCAGCAGGAGCCUAUGGAAGAGAUAGAAAAUUUGAAGAAA
+>U2AF2_K562_rep02_12235
+CUGUUGCUCGUGCUGGAGUGACAGUGGUGUGAUCUUGGUUCGCUGCAACCUCCGCCUCUUG
+>U2AF2_K562_rep02_12236
+UCAGAUACAAGUAUUGUUGGUCUUAUUUUCCAGGCCAGAGAUCCUCAGCAGGAGCCUAUGG
+>U2AF2_K562_rep02_12237
+UUGUUCCCCUUUCCCAUUCCAGGGAGCUCUGGGCUCUGUUCUACUUAUUCGUAUUGGCAGG
+>U2AF2_K562_rep02_12238
+CCUUCCUUUCUUUUUUUUAGAAGGCAUCUCACACUGUCACCCAGGCUGGAGUGCUGGAGUG
+>U2AF2_K562_rep02_12239
+CCUUCCUUCCUUCCUUUUCUUCCUUUCUUUUCCUACCUUCCUUUUCCUUCCUUCCUUUCUU
+>U2AF2_K562_rep02_12243
+UGUUCUCUUCUUGUUUCUUCUUCCCCACCAGCCAAAAAUCUAUGAUGUUAUAGCAAGGAUC
+>U2AF2_K562_rep02_12244
+CUUCUUUUUCUGCACAGGCAGACACCACCCAUCCUUUAACCAAGCACAGAAAAAUAGCCUC
+>U2AF2_K562_rep02_12245
+UCAGAGAUCUGCAGCGAAUAACCCUGCCCAGCAUUAACCGCCUCAGGCACUUCACCAAUGA
+>U2AF2_K562_rep02_12249
+UUUUAGGCGUAAUUUUCAUUUUUUCAGAUGUUUUUCUACUUAAAUAGCACAUAUGCAGAAG
+>U2AF2_K562_rep02_12250
+UUGAUUUUUUUUCCCCCUAGAGGAAGAAAUCCUACUUAGCGACAUGAACAAACAGUUGACU
+>U2AF2_K562_rep02_12251
+CAGUGGUGCGAGGCAUAAUUUCUUCCUUAGGUUCCAGCAGAAAUGGAAGGGUUAGGACGAU
+>U2AF2_K562_rep02_12252
+UUUUCCAGUAUGACAUGAUGGGAAGAAAUCAGACUGCUGUGAGAGAAGAGAUGAUUCUCCU
+>U2AF2_K562_rep02_12253
+AUUCUUCAGUUAGCUUCAUCUUCAGAGCAAGCUGAUGAUGGCUUGUGUGUGCUAGCAGGAU
+>U2AF2_K562_rep02_12254
+CCUUUCUUCCUUCCUUUCCUCCUUCCUCUUCUCCUCCUCCCCUUCCUUCCUUCCUUCCUUC
+>U2AF2_K562_rep02_12255
+AUUCUUUCUCUUUUAGGUCCAGGUCCUAACAUUUGAUAGUCAUUUAAAGGCAUGAAGAUUC
+>U2AF2_K562_rep02_12256
+UUUUUUUUUUCCACCUACAGCAGCUGUUUUUACCCUGUGGUCAGUCAGGUACUAUAUUUAG
+>U2AF2_K562_rep02_12257
+CAGCUGUCUCCUUCUCUUACAGGGUGGGGAGAAACAGCGGGUCUUCACUGGUAUUGUUACC
+>U2AF2_K562_rep02_12258
+AGGACAGGACCUUGCUGGGAACCUUCAGUAAGUUGUCCUUUUCUUUCUCAAACUUCCCAUG
+>U2AF2_K562_rep02_12259
+UUCUUCUUCAUCUAGGGGCUCUUGGCCAGCUGGGAGUGGGGCUUGCUAAUCUUUUGAGGUA
+>U2AF2_K562_rep02_12260
+ACCAACUAGGAUUUUUCUCAGGAGCACAUGGAUGAAGUAUGCUCCUCGCAGCUUCUAACUU
+>U2AF2_K562_rep02_12261
+UUUUUUAAGGGACAGGGUCUUGAUCUGUCACCCAAGCUGGAGUGCUGAGGUGUGAUUGUAA
+>U2AF2_K562_rep02_12262
+GUCUUCUGUUUUCCCCAGGCAGGGUGCCUGAGCUGUAUUCCCCAGCACACCCACUCCCGCA
+>U2AF2_K562_rep02_12263
+AUUUCUGCACAUCUAGGAUGACAGUACGAGCCAUAGUGACCACCAAGACCCCAUCUCAUUA
+>U2AF2_K562_rep02_12265
+UGGAUUUGUACAUUAUAGGUUCAUUGCCCUCAAGUGGCAGAAGGAAAAGCACAUGGAAUAU
+>U2AF2_K562_rep02_12266
+UUUACUUUUUUUCUUUAAGGAUGGAUGUUGUGUUCUCUUUAUUUUUUUCCUACUACUUUAA
+>U2AF2_K562_rep02_12267
+CCUUCCUUCCUCCCUUCCUUCCUUUCUGUUAUUCAGCCAGAAGUAUCAGCAUCACUGUUCU
+>U2AF2_K562_rep02_12268
+UUUUGUUGGUUCUUUGAGCCUCUCACAGGUUGCAUCAUAGUCUAUGUGGAUAGAUGAAGAA
+>U2AF2_K562_rep02_12269
+UUUUUUUUUUUUUUUUUUUUUUUUUUUGGUAGGAAACUCAACAGUGUAAAUUUGAUGGCCA
+>U2AF2_K562_rep02_12274
+UGAUUUUGUCCCCUAGAGCAAGGUCCGUGGUCCUGUCAGUGGAAGCCCGGAUAGCAUGAAU
+>U2AF2_K562_rep02_12275
+GGUGGGGUGGGGGCGGGGAGGGCUCCCGGGAGGCAAGUGGUCACGGUGAGAGUCACUGGGC
+>U2AF2_K562_rep02_12276
+UACCCAUUGCUUUUACUGAUUAGGUAUGAAUUUCAGCCCUUUAUUUCCUUCUAAUUUUGGA
+>U2AF2_K562_rep02_12279
+CCUCAUUUCACCCAGGAGGAAGGUGCAGCUCAGAGCUGUUACGACUAGUCAGAGAGAGCGA
+>U2AF2_K562_rep02_12281
+AUAAUUCUUACCUGCCUCCUUUCUCUUCCCGGACCUUCCUAAUUUGAAGAGGUGAUUUGGA
+>U2AF2_K562_rep02_12286
+UUUCUCUCCCUAAUCUUUUCUCCAAUCAGGCUUCAAUGUUAGCUGCAGAAAAUGACCCUUA
+>U2AF2_K562_rep02_12287
+UUUUUGUUUUUCAGCCCUGGUACCUGACAGUGUAAAGAAGGAGCUCCUACAAAGAAUAAGA
+>U2AF2_K562_rep02_12292
+UUUACCUGGGUAACAAUUUUACUUUUUACCACAGUCACCAAGGAGCUAGUUAGCUGGAUGA
+>U2AF2_K562_rep02_12293
+UAGUUUGCAGGUCGAAGUAAGAAGGAAACCAAAUAUUCUCUUAAGGCUGUCGAAGACAUGU
+>U2AF2_K562_rep02_12299
+UUUGUUUUUCUUUUCAGGUAUGGAACCCUUCAGAUCAAAGCUUACCAAUAAAUUCAGUAUG
+>U2AF2_K562_rep02_12300
+UUUGUUUUUCUUUUCAGGUAUGGAACCCUUCAGAUCAAAGCUUACCAAUAAAUUCAGUAUG
+>U2AF2_K562_rep02_12302
+CUCAUUUUUCUCUUGCCGCCGCCAUGUAAGAGGUAACUUUCACCUCCCGUCAUGAUUCUGA
+>U2AF2_K562_rep02_12303
+UUAUUUUUCUUAUUUAGGGAAGGUUACCGCCACCUCUCUGUAGGAAAUCAAGUGUACAUGA
+>U2AF2_K562_rep02_12305
+ACUUGCUAUCCUUCCCUUGCAGGAAGACACGUUUCAGCAGUAUGUAAGACCAGAGAUUAAC
+>U2AF2_K562_rep02_12306
+CUUGUGCAAUUUCCAGGUGAUGAACAGCCUCCUUCUAAAUCAUUGACCACAUUUCUUAUUC
+>U2AF2_K562_rep02_12307
+UUCUCUUUUUGUGCCAGGUCAUACUUUAAGGAGCCCAAGAGCUUUAUAACAUAACAAAAGA
+>U2AF2_K562_rep02_12308
+UUCUCUUUUUGUGCCAGGUCAUACUUUAAGGAGCCCAAGAGCUUUAUAACAUAACAAAAGA
+>U2AF2_K562_rep02_12311
+UCCCUUAAACUUUAUACCACCAGAAUACCAACAGAAGCUAAAUGUAGCAAAUGUGACUGCC
+>U2AF2_K562_rep02_12312
+AAAAUUAAGUUCUUUUAUUAGCUGGCCGUUCUCUCAUUAUCUCAAAUUUAUUUAAGUAUUU
+>U2AF2_K562_rep02_12316
+UUUUCUUCUUUGUAGCAUGGAGCAGAUCCAACUAAAAAGAACAGAGAUGGAAAUACACCUU
+>U2AF2_K562_rep02_12317
+CUUUUCUCUAGGUUAGUAACACUGAAGAAAUCACUUUUGAAGCAUUGAAGAAAGCAAUUGG
+>U2AF2_K562_rep02_12318
+UCAUAGCUCCUUCUCCCCCUGCUUCUUUCCCAAAUGAAUGAGUAUUUCUUUUAGAUAAAUU
+>U2AF2_K562_rep02_12321
+AUUAUUUUUUUGUGUUGGCCAGGAAGUGAACCCAGGUCAACUGCUUGGAAGGUGGCUAUGC
+>U2AF2_K562_rep02_12322
+ACAGGCCCAGACCUUCUCUUUCCCUUUCCAGCAGCCGGAGAAGUGCGACAACAACCAGUAC
+>U2AF2_K562_rep02_12323
+CCCACCGCCUUGACACCCCCACCCCCGCAGGGAAGCAGCUGGUGCACUACACAGCGCAGCC
+>U2AF2_K562_rep02_12324
+UUUUUUCAUUACAUUACAGGAAGCAGAAUCUGGUAAUAUAAGUCAAAAGUCUGAUGAAGAA
+>U2AF2_K562_rep02_12325
+GUUUUCUUUUUUCCCUUUCCCAGUUUGACUUUUGCCAUCUAGAGUUUGUAAAUUAAGUGGU
+>U2AF2_K562_rep02_12326
+CUUUCCCUUCCACAGCCCAGGGUCCGUCUGCAUUUUGUGGAGCUGGGCUCCGGCCCUGCUG
+>U2AF2_K562_rep02_12334
+UUUGACUUUGCUUUGCUUUUCCCCUUUUGUGUUUGCAGUUGAAUGGAGAGGUUUUCAUAUU
+>U2AF2_K562_rep02_12335
+AUAUUAAACUCUUCAGAAGGAAGUCACUGUGCAUAGCCAUCCCCUAAGAAGAGGGCAUUCC
+>U2AF2_K562_rep02_12336
+ACACUUCUGUUCCUUUGUCUGCAGGAGAGCUGGAGGUGUUUCAGAAAGAUGGGGAACGAAA
+>U2AF2_K562_rep02_12337
+UAAAACUGUGGUUUGCAAGCAGAAGGCGCUGGAACUGUUGCCCAAGGUGGAAGAGGUGGUG
+>U2AF2_K562_rep02_12338
+CUAUCCUUCUACCUCCACGCACGUUUUUUAAGGCAGCGGCAAAAGUAGUAGAAAGCAAAAG
+>U2AF2_K562_rep02_12339
+UCAGCUUUUUAAUUAAAUGAAGCCAAGUGGGAUUUGCAUAAAGUGAAUGUUUACCAUGAAG
+>U2AF2_K562_rep02_12340
+UUUUCCUCCUCAAUCUUCCUUUGCCCUACCUAUGUGUUACUAGAGAACAUUUCUACAAAUU
+>U2AF2_K562_rep02_12341
+UCUUUUUCCUUCCUCCCUCCCUGUCUCCCUCCCUCUCUGCCUCCCUCCCUCCCUCCCUCUU
+>U2AF2_K562_rep02_12342
+UGUCUUUUUUUCUUUAGUGCUCCAGACAAUGAAACAUCCAAAUCUGCUAAUCAAGAUACCU
+>U2AF2_K562_rep02_12343
+CUUUGUACCAAUAGGUAAUUUGUCGUCCAGAUGCUCUGCUAUAUGUGAAGUAUCAUUUUUC
+>U2AF2_K562_rep02_12344
+CUUUGUACCAAUAGGUAAUUUGUCGUCCAGAUGCUCUGCUAUAUGUGAAGUAUCAUUUUUC
+>U2AF2_K562_rep02_12352
+UUUUUCCUCUGAAUUUACAUGGAAGGAGCGGUAGAUGAUGAGACAUAUAAGAUCCUCACAU
+>U2AF2_K562_rep02_12353
+AGAUGCCACUGCCUCCUUUCCAUUGUCAGCUGGCGGGUGACGCGACUGUUGUUGCACUGGG
+>U2AF2_K562_rep02_12354
+AGAUGCCACUGCCUCCUUUCCAUUGUCAGCUGGCGGGUGACGCGACUGUUGUUGCACUGGG
+>U2AF2_K562_rep02_12355
+CUAACUUCUCUAGCCAAAUACAGAUAGUCUUUCCCACUGAGUGUCUGUCAACAACUAGAUU
+>U2AF2_K562_rep02_12356
+UCCCUGAUUCUUUUUCAAGGGCCGCUUGAAGAUGCCAUUGAAGAUGAGGAAGAAGAAUGUC
+>U2AF2_K562_rep02_12357
+AUUUUAAUUCUAGUCUAGGUGAUGGCUGCUCCUUUCCAACUUGCCUUGUUAACCAGGAUCC
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/fimo_output_almost-gff_1.txt	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,100 @@
+##gff-version 3
+phiX174	fimo	polypeptide_motif	1388	1398	102	+	.	Name=1;ID=1-1-phiX174;pvalue=6.36e-11;qvalue= 1.25e-09;sequence=AATATCTATAA;
+phiX174	fimo	polypeptide_motif	847	857	102	+	.	Name=1;ID=1-2-phiX174;pvalue=7.02e-11;qvalue= 1.25e-09;sequence=AATGTCTAAAG;
+phiX174	fimo	polypeptide_motif	2301	2311	99.6	+	.	Name=1;ID=1-3-phiX174;pvalue=1.08e-10;qvalue= 1.29e-09;sequence=AGGTTATAACG;
+phiX174	fimo	polypeptide_motif	5063	5073	95.6	+	.	Name=1;ID=1-4-phiX174;pvalue=2.73e-10;qvalue= 2.25e-09;sequence=AGGAGCTAAAG;
+phiX174	fimo	polypeptide_motif	989	999	 95	+	.	Name=1;ID=1-5-phiX174;pvalue=3.15e-10;qvalue= 2.25e-09;sequence=TGAGGATAAAT;
+phiX174	fimo	polypeptide_motif	4713	4723	91.1	+	.	Name=1;ID=1-6-phiX174;pvalue=7.74e-10;qvalue= 3.48e-09;sequence=GACTGCTATCA;
+phiX174	fimo	polypeptide_motif	5048	5058	90.7	+	.	Name=1;ID=1-7-phiX174;pvalue=8.51e-10;qvalue= 3.48e-09;sequence=TGCTGCTAAAG;
+phiX174	fimo	polypeptide_motif	855	865	90.6	+	.	Name=1;ID=1-8-phiX174;pvalue=8.64e-10;qvalue= 3.48e-09;sequence=AAGGTAAAAAA;
+phiX174	fimo	polypeptide_motif	3155	3165	90.1	+	.	Name=1;ID=1-9-phiX174;pvalue=9.76e-10;qvalue= 3.48e-09;sequence=TATGGCTAAAG;
+phiX174	fimo	polypeptide_motif	5009	5019	90.1	+	.	Name=1;ID=1-10-phiX174;pvalue=9.76e-10;qvalue= 3.48e-09;sequence=TGTGGCTAAAT;
+phiX174	fimo	polypeptide_motif	814	824	88.9	+	.	Name=1;ID=1-11-phiX174;pvalue=1.28e-09;qvalue= 4.14e-09;sequence=TGCGTCAAAAA;
+phiX174	fimo	polypeptide_motif	2832	2842	88.5	+	.	Name=1;ID=1-12-phiX174;pvalue=1.42e-09;qvalue= 4.23e-09;sequence=TTGGTCTAACT;
+phiX174	fimo	polypeptide_motif	3830	3840	87.7	+	.	Name=1;ID=1-13-phiX174;pvalue=1.7e-09;qvalue= 4.68e-09;sequence=TATTGATAAAG;
+phiX174	fimo	polypeptide_motif	3560	3570	87.2	+	.	Name=1;ID=1-14-phiX174;pvalue=1.89e-09;qvalue= 4.82e-09;sequence=TGCGTCTATTA;
+phiX174	fimo	polypeptide_motif	2882	2892	86.4	+	.	Name=1;ID=1-15-phiX174;pvalue=2.29e-09;qvalue= 5.46e-09;sequence=AGGTTATTAAA;
+phiX174	fimo	polypeptide_motif	4453	4463	85.9	+	.	Name=1;ID=1-16-phiX174;pvalue=2.58e-09;qvalue= 5.75e-09;sequence=AAGGTATTAAG;
+phiX174	fimo	polypeptide_motif	2493	2503	85.1	+	.	Name=1;ID=1-17-phiX174;pvalue=3.06e-09;qvalue= 5.79e-09;sequence=GACACCTAAAG;
+phiX174	fimo	polypeptide_motif	4104	4114	85.1	+	.	Name=1;ID=1-18-phiX174;pvalue=3.08e-09;qvalue= 5.79e-09;sequence=GGCTTCCATAA;
+phiX174	fimo	polypeptide_motif	4955	4965	85.1	+	.	Name=1;ID=1-19-phiX174;pvalue=3.08e-09;qvalue= 5.79e-09;sequence=TGATGCTAAAG;
+phiX174	fimo	polypeptide_motif	1885	1895	84.4	+	.	Name=1;ID=1-20-phiX174;pvalue=3.61e-09;qvalue= 6.45e-09;sequence=TGCGACTAAAG;
+phiX174	fimo	polypeptide_motif	3376	3386	84.2	+	.	Name=1;ID=1-21-phiX174;pvalue=3.81e-09;qvalue= 6.48e-09;sequence=AGAATCAAAAA;
+phiX174	fimo	polypeptide_motif	52	62	83.9	+	.	Name=1;ID=1-22-phiX174;pvalue=4.06e-09;qvalue= 6.58e-09;sequence=TGAGTCGAAAA;
+phiX174	fimo	polypeptide_motif	1390	1400	83.7	+	.	Name=1;ID=1-23-phiX174;pvalue=4.26e-09;qvalue= 6.61e-09;sequence=TATCTATAACA;
+phiX174	fimo	polypeptide_motif	2017	2027	83.4	+	.	Name=1;ID=1-24-phiX174;pvalue=4.6e-09;qvalue= 6.85e-09;sequence=TTCGTCTAAGA;
+phiX174	fimo	polypeptide_motif	1000	1010	83.1	+	.	Name=1;ID=1-25-phiX174;pvalue=4.88e-09;qvalue= 6.97e-09;sequence=TATGTCTAATA;
+phiX174	fimo	polypeptide_motif	1555	1565	82.5	+	.	Name=1;ID=1-26-phiX174;pvalue=5.58e-09;qvalue= 7.37e-09;sequence=GACTTCTACCA;
+phiX174	fimo	polypeptide_motif	4430	4440	82.5	+	.	Name=1;ID=1-27-phiX174;pvalue=5.62e-09;qvalue= 7.37e-09;sequence=TGAGTATAATT;
+phiX174	fimo	polypeptide_motif	1927	1937	82.3	+	.	Name=1;ID=1-28-phiX174;pvalue=5.82e-09;qvalue= 7.37e-09;sequence=GACTTATACCG;
+phiX174	fimo	polypeptide_motif	2981	2991	82.1	+	.	Name=1;ID=1-29-phiX174;pvalue=6.13e-09;qvalue= 7.37e-09;sequence=CATGTCTAAAT;
+phiX174	fimo	polypeptide_motif	4203	4213	 82	+	.	Name=1;ID=1-30-phiX174;pvalue=6.34e-09;qvalue= 7.37e-09;sequence=GACGGCCATAA;
+phiX174	fimo	polypeptide_motif	1669	1679	81.9	+	.	Name=1;ID=1-31-phiX174;pvalue=6.4e-09;qvalue= 7.37e-09;sequence=TGGAGGTAAAA;
+phiX174	fimo	polypeptide_motif	3260	3270	81.5	+	.	Name=1;ID=1-32-phiX174;pvalue=7.01e-09;qvalue= 7.82e-09;sequence=CGCTGATAAAG;
+phiX174	fimo	polypeptide_motif	3047	3057	81.3	+	.	Name=1;ID=1-33-phiX174;pvalue=7.4e-09;qvalue= 7.85e-09;sequence=TACCGATAACA;
+phiX174	fimo	polypeptide_motif	4176	4186	81.2	+	.	Name=1;ID=1-34-phiX174;pvalue=7.6e-09;qvalue= 7.85e-09;sequence=GAGTTCGATAA;
+phiX174	fimo	polypeptide_motif	4118	4128	81.1	+	.	Name=1;ID=1-35-phiX174;pvalue=7.7e-09;qvalue= 7.85e-09;sequence=GATGGATAACC;
+phiX174	fimo	polypeptide_motif	5370	5380	80.9	+	.	Name=1;ID=1-36-phiX174;pvalue=8.03e-09;qvalue= 7.87e-09;sequence=GGCGTATCCAA;
+phiX174	fimo	polypeptide_motif	1242	1252	80.5	+	.	Name=1;ID=1-37-phiX174;pvalue=8.94e-09;qvalue= 7.87e-09;sequence=AGTGGATTAAG;
+phiX174	fimo	polypeptide_motif	2583	2593	80.5	+	.	Name=1;ID=1-38-phiX174;pvalue=8.94e-09;qvalue= 7.87e-09;sequence=TACATCTGTCA;
+phiX174	fimo	polypeptide_motif	698	708	80.4	+	.	Name=1;ID=1-39-phiX174;pvalue=9.13e-09;qvalue= 7.87e-09;sequence=TACGGAAAACA;
+phiX174	fimo	polypeptide_motif	2299	2309	80.3	+	.	Name=1;ID=1-40-phiX174;pvalue=9.26e-09;qvalue= 7.87e-09;sequence=TGAGGTTATAA;
+phiX174	fimo	polypeptide_motif	4189	4199	80.1	+	.	Name=1;ID=1-41-phiX174;pvalue=9.69e-09;qvalue= 7.87e-09;sequence=GTGATATGTAT;
+phiX174	fimo	polypeptide_motif	275	285	80.1	+	.	Name=1;ID=1-42-phiX174;pvalue=9.85e-09;qvalue= 7.87e-09;sequence=GGTTTAGATAT;
+phiX174	fimo	polypeptide_motif	1801	1811	 80	+	.	Name=1;ID=1-43-phiX174;pvalue=1e-08;qvalue= 7.87e-09;sequence=GACCTATAAAC;
+phiX174	fimo	polypeptide_motif	1386	1396	79.9	+	.	Name=1;ID=1-44-phiX174;pvalue=1.03e-08;qvalue= 7.87e-09;sequence=TGAATATCTAT;
+phiX174	fimo	polypeptide_motif	1303	1313	79.8	+	.	Name=1;ID=1-45-phiX174;pvalue=1.03e-08;qvalue= 7.87e-09;sequence=TGGTTATATTG;
+phiX174	fimo	polypeptide_motif	3772	3782	79.8	+	.	Name=1;ID=1-46-phiX174;pvalue=1.04e-08;qvalue= 7.87e-09;sequence=AGGATATTTCT;
+phiX174	fimo	polypeptide_motif	1288	1298	79.8	+	.	Name=1;ID=1-47-phiX174;pvalue=1.04e-08;qvalue= 7.87e-09;sequence=GACTGTTAACA;
+phiX174	fimo	polypeptide_motif	2577	2587	79.7	+	.	Name=1;ID=1-48-phiX174;pvalue=1.08e-08;qvalue= 7.87e-09;sequence=GATGGATACAT;
+phiX174	fimo	polypeptide_motif	937	947	79.6	+	.	Name=1;ID=1-49-phiX174;pvalue=1.08e-08;qvalue= 7.87e-09;sequence=TTGGTATGTAG;
+phiX174	fimo	polypeptide_motif	904	914	79.5	+	.	Name=1;ID=1-50-phiX174;pvalue=1.11e-08;qvalue= 7.93e-09;sequence=AGGTACTAAAG;
+phiX174	fimo	polypeptide_motif	2279	2289	79.4	+	.	Name=1;ID=1-51-phiX174;pvalue=1.13e-08;qvalue= 7.93e-09;sequence=TCGTGATAAAA;
+phiX174	fimo	polypeptide_motif	3164	3174	79.3	+	.	Name=1;ID=1-52-phiX174;pvalue=1.16e-08;qvalue= 7.98e-09;sequence=AGCTGGTAAAG;
+phiX174	fimo	polypeptide_motif	24	34	79.1	+	.	Name=1;ID=1-53-phiX174;pvalue=1.23e-08;qvalue= 8.24e-09;sequence=AGAAGTTAACA;
+phiX174	fimo	polypeptide_motif	838	848	78.9	+	.	Name=1;ID=1-54-phiX174;pvalue=1.27e-08;qvalue= 8.24e-09;sequence=GAGTGATGTAA;
+phiX174	fimo	polypeptide_motif	853	863	78.9	+	.	Name=1;ID=1-55-phiX174;pvalue=1.27e-08;qvalue= 8.24e-09;sequence=TAAAGGTAAAA;
+phiX174	fimo	polypeptide_motif	1984	1994	78.6	+	.	Name=1;ID=1-56-phiX174;pvalue=1.36e-08;qvalue= 8.68e-09;sequence=AATTTCTATGA;
+phiX174	fimo	polypeptide_motif	1	11	78.3	+	.	Name=1;ID=1-57-phiX174;pvalue=1.46e-08;qvalue= 9.05e-09;sequence=GAGTTTTATCG;
+phiX174	fimo	polypeptide_motif	4307	4317	78.3	+	.	Name=1;ID=1-58-phiX174;pvalue=1.47e-08;qvalue= 9.05e-09;sequence=TATTAATAACA;
+phiX174	fimo	polypeptide_motif	4303	4313	78.2	+	.	Name=1;ID=1-59-phiX174;pvalue=1.52e-08;qvalue= 9.19e-09;sequence=TTGATATTAAT;
+phiX174	fimo	polypeptide_motif	5033	5043	 78	+	.	Name=1;ID=1-60-phiX174;pvalue=1.58e-08;qvalue= 9.41e-09;sequence=GTCAGATATGG;
+phiX174	fimo	polypeptide_motif	2579	2589	77.6	+	.	Name=1;ID=1-61-phiX174;pvalue=1.73e-08;qvalue= 1.01e-08;sequence=TGGATACATCT;
+phiX174	fimo	polypeptide_motif	322	332	77.4	+	.	Name=1;ID=1-62-phiX174;pvalue=1.82e-08;qvalue= 1.05e-08;sequence=GACATTTTAAA;
+phiX174	fimo	polypeptide_motif	5001	5011	76.8	+	.	Name=1;ID=1-63-phiX174;pvalue=2.09e-08;qvalue= 1.19e-08;sequence=GGTTTCTATGT;
+phiX174	fimo	polypeptide_motif	4217	4227	76.7	+	.	Name=1;ID=1-64-phiX174;pvalue=2.15e-08;qvalue= 1.2e-08;sequence=TGCTTCTGACG;
+phiX174	fimo	polypeptide_motif	4262	4272	76.6	+	.	Name=1;ID=1-65-phiX174;pvalue=2.18e-08;qvalue= 1.2e-08;sequence=AATGGATGAAT;
+phiX174	fimo	polypeptide_motif	3569	3579	76.5	+	.	Name=1;ID=1-66-phiX174;pvalue=2.26e-08;qvalue= 1.22e-08;sequence=TATGGAAAACA;
+phiX174	fimo	polypeptide_motif	194	204	76.4	+	.	Name=1;ID=1-67-phiX174;pvalue=2.29e-08;qvalue= 1.22e-08;sequence=ATCAACTAACG;
+phiX174	fimo	polypeptide_motif	131	141	 76	+	.	Name=1;ID=1-68-phiX174;pvalue=2.49e-08;qvalue= 1.31e-08;sequence=AAATGAGAAAA;
+phiX174	fimo	polypeptide_motif	1491	1501	75.9	+	.	Name=1;ID=1-69-phiX174;pvalue=2.55e-08;qvalue= 1.32e-08;sequence=GCCATCTCAAA;
+phiX174	fimo	polypeptide_motif	434	444	75.7	+	.	Name=1;ID=1-70-phiX174;pvalue=2.67e-08;qvalue= 1.36e-08;sequence=GGCCTCTATTA;
+phiX174	fimo	polypeptide_motif	4565	4575	75.6	+	.	Name=1;ID=1-71-phiX174;pvalue=2.73e-08;qvalue= 1.36e-08;sequence=TTGGTTTATCG;
+phiX174	fimo	polypeptide_motif	102	112	75.6	+	.	Name=1;ID=1-72-phiX174;pvalue=2.75e-08;qvalue= 1.36e-08;sequence=GAATTAAATCG;
+phiX174	fimo	polypeptide_motif	903	913	75.5	+	.	Name=1;ID=1-73-phiX174;pvalue=2.82e-08;qvalue= 1.38e-08;sequence=GAGGTACTAAA;
+phiX174	fimo	polypeptide_motif	4748	4758	75.2	+	.	Name=1;ID=1-74-phiX174;pvalue=3.01e-08;qvalue= 1.45e-08;sequence=TACAGCTAATG;
+phiX174	fimo	polypeptide_motif	2622	2632	 75	+	.	Name=1;ID=1-75-phiX174;pvalue=3.16e-08;qvalue= 1.5e-08;sequence=TGCTGATATTG;
+phiX174	fimo	polypeptide_motif	467	477	74.7	+	.	Name=1;ID=1-76-phiX174;pvalue=3.35e-08;qvalue= 1.57e-08;sequence=TTTGGATTTAA;
+phiX174	fimo	polypeptide_motif	4033	4043	74.6	+	.	Name=1;ID=1-77-phiX174;pvalue=3.44e-08;qvalue= 1.58e-08;sequence=AGCGTATCGAG;
+phiX174	fimo	polypeptide_motif	1348	1358	74.6	+	.	Name=1;ID=1-78-phiX174;pvalue=3.46e-08;qvalue= 1.58e-08;sequence=TACCAATAAAA;
+phiX174	fimo	polypeptide_motif	239	249	74.4	+	.	Name=1;ID=1-79-phiX174;pvalue=3.62e-08;qvalue= 1.64e-08;sequence=AGTGGCTTAAT;
+phiX174	fimo	polypeptide_motif	500	510	74.1	+	.	Name=1;ID=1-80-phiX174;pvalue=3.84e-08;qvalue= 1.71e-08;sequence=GACGAGTAACA;
+phiX174	fimo	polypeptide_motif	3001	3011	 74	+	.	Name=1;ID=1-81-phiX174;pvalue=3.93e-08;qvalue= 1.73e-08;sequence=GCGGTCAAAAA;
+phiX174	fimo	polypeptide_motif	3776	3786	 74	+	.	Name=1;ID=1-82-phiX174;pvalue=3.98e-08;qvalue= 1.73e-08;sequence=TATTTCTAATG;
+phiX174	fimo	polypeptide_motif	2026	2036	73.9	+	.	Name=1;ID=1-83-phiX174;pvalue=4.06e-08;qvalue= 1.75e-08;sequence=GAAGTTTAAGA;
+phiX174	fimo	polypeptide_motif	4237	4247	73.8	+	.	Name=1;ID=1-84-phiX174;pvalue=4.12e-08;qvalue= 1.75e-08;sequence=AGTTTGTATCT;
+phiX174	fimo	polypeptide_motif	803	813	73.7	+	.	Name=1;ID=1-85-phiX174;pvalue=4.24e-08;qvalue= 1.78e-08;sequence=AGAAGAAAACG;
+phiX174	fimo	polypeptide_motif	3770	3780	73.6	+	.	Name=1;ID=1-86-phiX174;pvalue=4.35e-08;qvalue= 1.81e-08;sequence=AAAGGATATTT;
+phiX174	fimo	polypeptide_motif	3429	3439	73.5	+	.	Name=1;ID=1-87-phiX174;pvalue=4.45e-08;qvalue= 1.82e-08;sequence=GAGATGCAAAA;
+phiX174	fimo	polypeptide_motif	99	109	73.5	+	.	Name=1;ID=1-88-phiX174;pvalue=4.48e-08;qvalue= 1.82e-08;sequence=TACGAATTAAA;
+phiX174	fimo	polypeptide_motif	67	77	73.2	+	.	Name=1;ID=1-89-phiX174;pvalue=4.78e-08;qvalue= 1.92e-08;sequence=TCTTGATAAAG;
+phiX174	fimo	polypeptide_motif	5332	5342	72.9	+	.	Name=1;ID=1-90-phiX174;pvalue=5.13e-08;qvalue= 2.01e-08;sequence=ATCTGCTCAAA;
+phiX174	fimo	polypeptide_motif	277	287	72.9	+	.	Name=1;ID=1-91-phiX174;pvalue=5.14e-08;qvalue= 2.01e-08;sequence=TTTAGATATGA;
+phiX174	fimo	polypeptide_motif	4338	4348	72.8	+	.	Name=1;ID=1-92-phiX174;pvalue=5.18e-08;qvalue= 2.01e-08;sequence=GGGGACGAAAA;
+phiX174	fimo	polypeptide_motif	3812	3822	72.8	+	.	Name=1;ID=1-93-phiX174;pvalue=5.28e-08;qvalue= 2.03e-08;sequence=GGTTGATATTT;
+phiX174	fimo	polypeptide_motif	1909	1919	72.6	+	.	Name=1;ID=1-94-phiX174;pvalue=5.51e-08;qvalue= 2.08e-08;sequence=TAACGCTAAAG;
+phiX174	fimo	polypeptide_motif	3000	3010	72.6	+	.	Name=1;ID=1-95-phiX174;pvalue=5.54e-08;qvalue= 2.08e-08;sequence=GGCGGTCAAAA;
+phiX174	fimo	polypeptide_motif	3891	3901	72.4	+	.	Name=1;ID=1-96-phiX174;pvalue=5.75e-08;qvalue= 2.11e-08;sequence=ATTGGCTCTAA;
+phiX174	fimo	polypeptide_motif	3079	3089	72.4	+	.	Name=1;ID=1-97-phiX174;pvalue=5.76e-08;qvalue= 2.11e-08;sequence=CTGGTATTAAA;
+phiX174	fimo	polypeptide_motif	37	47	72.4	+	.	Name=1;ID=1-98-phiX174;pvalue=5.79e-08;qvalue= 2.11e-08;sequence=TTCGGATATTT;
+phiX174	fimo	polypeptide_motif	380	390	72.2	+	.	Name=1;ID=1-99-phiX174;pvalue=6.01e-08;qvalue= 2.17e-08;sequence=GTAAGAAATCA;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/fimo_output_almost-gff_2.txt	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,100 @@
+##gff-version 3
+phiX174	fimo	polypeptide_motif	1388	1398	102	+	.	Name=1;ID=1-1-phiX174;pvalue=6.36e-11;sequence=AATATCTATAA;
+phiX174	fimo	polypeptide_motif	847	857	102	+	.	Name=1;ID=1-2-phiX174;pvalue=7.02e-11;sequence=AATGTCTAAAG;
+phiX174	fimo	polypeptide_motif	2301	2311	99.6	+	.	Name=1;ID=1-3-phiX174;pvalue=1.08e-10;sequence=AGGTTATAACG;
+phiX174	fimo	polypeptide_motif	5063	5073	95.6	+	.	Name=1;ID=1-4-phiX174;pvalue=2.73e-10;sequence=AGGAGCTAAAG;
+phiX174	fimo	polypeptide_motif	989	999	 95	+	.	Name=1;ID=1-5-phiX174;pvalue=3.15e-10;sequence=TGAGGATAAAT;
+phiX174	fimo	polypeptide_motif	4713	4723	91.1	+	.	Name=1;ID=1-6-phiX174;pvalue=7.74e-10;sequence=GACTGCTATCA;
+phiX174	fimo	polypeptide_motif	5048	5058	90.7	+	.	Name=1;ID=1-7-phiX174;pvalue=8.51e-10;sequence=TGCTGCTAAAG;
+phiX174	fimo	polypeptide_motif	855	865	90.6	+	.	Name=1;ID=1-8-phiX174;pvalue=8.64e-10;sequence=AAGGTAAAAAA;
+phiX174	fimo	polypeptide_motif	3155	3165	90.1	+	.	Name=1;ID=1-9-phiX174;pvalue=9.76e-10;sequence=TATGGCTAAAG;
+phiX174	fimo	polypeptide_motif	5009	5019	90.1	+	.	Name=1;ID=1-10-phiX174;pvalue=9.76e-10;sequence=TGTGGCTAAAT;
+phiX174	fimo	polypeptide_motif	814	824	88.9	+	.	Name=1;ID=1-11-phiX174;pvalue=1.28e-09;sequence=TGCGTCAAAAA;
+phiX174	fimo	polypeptide_motif	2832	2842	88.5	+	.	Name=1;ID=1-12-phiX174;pvalue=1.42e-09;sequence=TTGGTCTAACT;
+phiX174	fimo	polypeptide_motif	3830	3840	87.7	+	.	Name=1;ID=1-13-phiX174;pvalue=1.7e-09;sequence=TATTGATAAAG;
+phiX174	fimo	polypeptide_motif	3560	3570	87.2	+	.	Name=1;ID=1-14-phiX174;pvalue=1.89e-09;sequence=TGCGTCTATTA;
+phiX174	fimo	polypeptide_motif	2882	2892	86.4	+	.	Name=1;ID=1-15-phiX174;pvalue=2.29e-09;sequence=AGGTTATTAAA;
+phiX174	fimo	polypeptide_motif	4453	4463	85.9	+	.	Name=1;ID=1-16-phiX174;pvalue=2.58e-09;sequence=AAGGTATTAAG;
+phiX174	fimo	polypeptide_motif	2493	2503	85.1	+	.	Name=1;ID=1-17-phiX174;pvalue=3.06e-09;sequence=GACACCTAAAG;
+phiX174	fimo	polypeptide_motif	4104	4114	85.1	+	.	Name=1;ID=1-18-phiX174;pvalue=3.08e-09;sequence=GGCTTCCATAA;
+phiX174	fimo	polypeptide_motif	4955	4965	85.1	+	.	Name=1;ID=1-19-phiX174;pvalue=3.08e-09;sequence=TGATGCTAAAG;
+phiX174	fimo	polypeptide_motif	1885	1895	84.4	+	.	Name=1;ID=1-20-phiX174;pvalue=3.61e-09;sequence=TGCGACTAAAG;
+phiX174	fimo	polypeptide_motif	3376	3386	84.2	+	.	Name=1;ID=1-21-phiX174;pvalue=3.81e-09;sequence=AGAATCAAAAA;
+phiX174	fimo	polypeptide_motif	52	62	83.9	+	.	Name=1;ID=1-22-phiX174;pvalue=4.06e-09;sequence=TGAGTCGAAAA;
+phiX174	fimo	polypeptide_motif	1390	1400	83.7	+	.	Name=1;ID=1-23-phiX174;pvalue=4.26e-09;sequence=TATCTATAACA;
+phiX174	fimo	polypeptide_motif	2017	2027	83.4	+	.	Name=1;ID=1-24-phiX174;pvalue=4.6e-09;sequence=TTCGTCTAAGA;
+phiX174	fimo	polypeptide_motif	1000	1010	83.1	+	.	Name=1;ID=1-25-phiX174;pvalue=4.88e-09;sequence=TATGTCTAATA;
+phiX174	fimo	polypeptide_motif	1555	1565	82.5	+	.	Name=1;ID=1-26-phiX174;pvalue=5.58e-09;sequence=GACTTCTACCA;
+phiX174	fimo	polypeptide_motif	4430	4440	82.5	+	.	Name=1;ID=1-27-phiX174;pvalue=5.62e-09;sequence=TGAGTATAATT;
+phiX174	fimo	polypeptide_motif	1927	1937	82.3	+	.	Name=1;ID=1-28-phiX174;pvalue=5.82e-09;sequence=GACTTATACCG;
+phiX174	fimo	polypeptide_motif	2981	2991	82.1	+	.	Name=1;ID=1-29-phiX174;pvalue=6.13e-09;sequence=CATGTCTAAAT;
+phiX174	fimo	polypeptide_motif	4203	4213	 82	+	.	Name=1;ID=1-30-phiX174;pvalue=6.34e-09;sequence=GACGGCCATAA;
+phiX174	fimo	polypeptide_motif	1669	1679	81.9	+	.	Name=1;ID=1-31-phiX174;pvalue=6.4e-09;sequence=TGGAGGTAAAA;
+phiX174	fimo	polypeptide_motif	3260	3270	81.5	+	.	Name=1;ID=1-32-phiX174;pvalue=7.01e-09;sequence=CGCTGATAAAG;
+phiX174	fimo	polypeptide_motif	3047	3057	81.3	+	.	Name=1;ID=1-33-phiX174;pvalue=7.4e-09;sequence=TACCGATAACA;
+phiX174	fimo	polypeptide_motif	4176	4186	81.2	+	.	Name=1;ID=1-34-phiX174;pvalue=7.6e-09;sequence=GAGTTCGATAA;
+phiX174	fimo	polypeptide_motif	4118	4128	81.1	+	.	Name=1;ID=1-35-phiX174;pvalue=7.7e-09;sequence=GATGGATAACC;
+phiX174	fimo	polypeptide_motif	5370	5380	80.9	+	.	Name=1;ID=1-36-phiX174;pvalue=8.03e-09;sequence=GGCGTATCCAA;
+phiX174	fimo	polypeptide_motif	1242	1252	80.5	+	.	Name=1;ID=1-37-phiX174;pvalue=8.94e-09;sequence=AGTGGATTAAG;
+phiX174	fimo	polypeptide_motif	2583	2593	80.5	+	.	Name=1;ID=1-38-phiX174;pvalue=8.94e-09;sequence=TACATCTGTCA;
+phiX174	fimo	polypeptide_motif	698	708	80.4	+	.	Name=1;ID=1-39-phiX174;pvalue=9.13e-09;sequence=TACGGAAAACA;
+phiX174	fimo	polypeptide_motif	2299	2309	80.3	+	.	Name=1;ID=1-40-phiX174;pvalue=9.26e-09;sequence=TGAGGTTATAA;
+phiX174	fimo	polypeptide_motif	4189	4199	80.1	+	.	Name=1;ID=1-41-phiX174;pvalue=9.69e-09;sequence=GTGATATGTAT;
+phiX174	fimo	polypeptide_motif	275	285	80.1	+	.	Name=1;ID=1-42-phiX174;pvalue=9.85e-09;sequence=GGTTTAGATAT;
+phiX174	fimo	polypeptide_motif	1801	1811	 80	+	.	Name=1;ID=1-43-phiX174;pvalue=1e-08;sequence=GACCTATAAAC;
+phiX174	fimo	polypeptide_motif	1386	1396	79.9	+	.	Name=1;ID=1-44-phiX174;pvalue=1.03e-08;sequence=TGAATATCTAT;
+phiX174	fimo	polypeptide_motif	1303	1313	79.8	+	.	Name=1;ID=1-45-phiX174;pvalue=1.03e-08;sequence=TGGTTATATTG;
+phiX174	fimo	polypeptide_motif	3772	3782	79.8	+	.	Name=1;ID=1-46-phiX174;pvalue=1.04e-08;sequence=AGGATATTTCT;
+phiX174	fimo	polypeptide_motif	1288	1298	79.8	+	.	Name=1;ID=1-47-phiX174;pvalue=1.04e-08;sequence=GACTGTTAACA;
+phiX174	fimo	polypeptide_motif	2577	2587	79.7	+	.	Name=1;ID=1-48-phiX174;pvalue=1.08e-08;sequence=GATGGATACAT;
+phiX174	fimo	polypeptide_motif	937	947	79.6	+	.	Name=1;ID=1-49-phiX174;pvalue=1.08e-08;sequence=TTGGTATGTAG;
+phiX174	fimo	polypeptide_motif	904	914	79.5	+	.	Name=1;ID=1-50-phiX174;pvalue=1.11e-08;sequence=AGGTACTAAAG;
+phiX174	fimo	polypeptide_motif	2279	2289	79.4	+	.	Name=1;ID=1-51-phiX174;pvalue=1.13e-08;sequence=TCGTGATAAAA;
+phiX174	fimo	polypeptide_motif	3164	3174	79.3	+	.	Name=1;ID=1-52-phiX174;pvalue=1.16e-08;sequence=AGCTGGTAAAG;
+phiX174	fimo	polypeptide_motif	24	34	79.1	+	.	Name=1;ID=1-53-phiX174;pvalue=1.23e-08;sequence=AGAAGTTAACA;
+phiX174	fimo	polypeptide_motif	838	848	78.9	+	.	Name=1;ID=1-54-phiX174;pvalue=1.27e-08;sequence=GAGTGATGTAA;
+phiX174	fimo	polypeptide_motif	853	863	78.9	+	.	Name=1;ID=1-55-phiX174;pvalue=1.27e-08;sequence=TAAAGGTAAAA;
+phiX174	fimo	polypeptide_motif	1984	1994	78.6	+	.	Name=1;ID=1-56-phiX174;pvalue=1.36e-08;sequence=AATTTCTATGA;
+phiX174	fimo	polypeptide_motif	1	11	78.3	+	.	Name=1;ID=1-57-phiX174;pvalue=1.46e-08;sequence=GAGTTTTATCG;
+phiX174	fimo	polypeptide_motif	4307	4317	78.3	+	.	Name=1;ID=1-58-phiX174;pvalue=1.47e-08;sequence=TATTAATAACA;
+phiX174	fimo	polypeptide_motif	4303	4313	78.2	+	.	Name=1;ID=1-59-phiX174;pvalue=1.52e-08;sequence=TTGATATTAAT;
+phiX174	fimo	polypeptide_motif	5033	5043	 78	+	.	Name=1;ID=1-60-phiX174;pvalue=1.58e-08;sequence=GTCAGATATGG;
+phiX174	fimo	polypeptide_motif	2579	2589	77.6	+	.	Name=1;ID=1-61-phiX174;pvalue=1.73e-08;sequence=TGGATACATCT;
+phiX174	fimo	polypeptide_motif	322	332	77.4	+	.	Name=1;ID=1-62-phiX174;pvalue=1.82e-08;sequence=GACATTTTAAA;
+phiX174	fimo	polypeptide_motif	5001	5011	76.8	+	.	Name=1;ID=1-63-phiX174;pvalue=2.09e-08;sequence=GGTTTCTATGT;
+phiX174	fimo	polypeptide_motif	4217	4227	76.7	+	.	Name=1;ID=1-64-phiX174;pvalue=2.15e-08;sequence=TGCTTCTGACG;
+phiX174	fimo	polypeptide_motif	4262	4272	76.6	+	.	Name=1;ID=1-65-phiX174;pvalue=2.18e-08;sequence=AATGGATGAAT;
+phiX174	fimo	polypeptide_motif	3569	3579	76.5	+	.	Name=1;ID=1-66-phiX174;pvalue=2.26e-08;sequence=TATGGAAAACA;
+phiX174	fimo	polypeptide_motif	194	204	76.4	+	.	Name=1;ID=1-67-phiX174;pvalue=2.29e-08;sequence=ATCAACTAACG;
+phiX174	fimo	polypeptide_motif	131	141	 76	+	.	Name=1;ID=1-68-phiX174;pvalue=2.49e-08;sequence=AAATGAGAAAA;
+phiX174	fimo	polypeptide_motif	1491	1501	75.9	+	.	Name=1;ID=1-69-phiX174;pvalue=2.55e-08;sequence=GCCATCTCAAA;
+phiX174	fimo	polypeptide_motif	434	444	75.7	+	.	Name=1;ID=1-70-phiX174;pvalue=2.67e-08;sequence=GGCCTCTATTA;
+phiX174	fimo	polypeptide_motif	4565	4575	75.6	+	.	Name=1;ID=1-71-phiX174;pvalue=2.73e-08;sequence=TTGGTTTATCG;
+phiX174	fimo	polypeptide_motif	102	112	75.6	+	.	Name=1;ID=1-72-phiX174;pvalue=2.75e-08;sequence=GAATTAAATCG;
+phiX174	fimo	polypeptide_motif	903	913	75.5	+	.	Name=1;ID=1-73-phiX174;pvalue=2.82e-08;sequence=GAGGTACTAAA;
+phiX174	fimo	polypeptide_motif	4748	4758	75.2	+	.	Name=1;ID=1-74-phiX174;pvalue=3.01e-08;sequence=TACAGCTAATG;
+phiX174	fimo	polypeptide_motif	2622	2632	 75	+	.	Name=1;ID=1-75-phiX174;pvalue=3.16e-08;sequence=TGCTGATATTG;
+phiX174	fimo	polypeptide_motif	467	477	74.7	+	.	Name=1;ID=1-76-phiX174;pvalue=3.35e-08;sequence=TTTGGATTTAA;
+phiX174	fimo	polypeptide_motif	4033	4043	74.6	+	.	Name=1;ID=1-77-phiX174;pvalue=3.44e-08;sequence=AGCGTATCGAG;
+phiX174	fimo	polypeptide_motif	1348	1358	74.6	+	.	Name=1;ID=1-78-phiX174;pvalue=3.46e-08;sequence=TACCAATAAAA;
+phiX174	fimo	polypeptide_motif	239	249	74.4	+	.	Name=1;ID=1-79-phiX174;pvalue=3.62e-08;sequence=AGTGGCTTAAT;
+phiX174	fimo	polypeptide_motif	500	510	74.1	+	.	Name=1;ID=1-80-phiX174;pvalue=3.84e-08;sequence=GACGAGTAACA;
+phiX174	fimo	polypeptide_motif	3001	3011	 74	+	.	Name=1;ID=1-81-phiX174;pvalue=3.93e-08;sequence=GCGGTCAAAAA;
+phiX174	fimo	polypeptide_motif	3776	3786	 74	+	.	Name=1;ID=1-82-phiX174;pvalue=3.98e-08;sequence=TATTTCTAATG;
+phiX174	fimo	polypeptide_motif	2026	2036	73.9	+	.	Name=1;ID=1-83-phiX174;pvalue=4.06e-08;sequence=GAAGTTTAAGA;
+phiX174	fimo	polypeptide_motif	4237	4247	73.8	+	.	Name=1;ID=1-84-phiX174;pvalue=4.12e-08;sequence=AGTTTGTATCT;
+phiX174	fimo	polypeptide_motif	803	813	73.7	+	.	Name=1;ID=1-85-phiX174;pvalue=4.24e-08;sequence=AGAAGAAAACG;
+phiX174	fimo	polypeptide_motif	3770	3780	73.6	+	.	Name=1;ID=1-86-phiX174;pvalue=4.35e-08;sequence=AAAGGATATTT;
+phiX174	fimo	polypeptide_motif	3429	3439	73.5	+	.	Name=1;ID=1-87-phiX174;pvalue=4.45e-08;sequence=GAGATGCAAAA;
+phiX174	fimo	polypeptide_motif	99	109	73.5	+	.	Name=1;ID=1-88-phiX174;pvalue=4.48e-08;sequence=TACGAATTAAA;
+phiX174	fimo	polypeptide_motif	67	77	73.2	+	.	Name=1;ID=1-89-phiX174;pvalue=4.78e-08;sequence=TCTTGATAAAG;
+phiX174	fimo	polypeptide_motif	5332	5342	72.9	+	.	Name=1;ID=1-90-phiX174;pvalue=5.13e-08;sequence=ATCTGCTCAAA;
+phiX174	fimo	polypeptide_motif	277	287	72.9	+	.	Name=1;ID=1-91-phiX174;pvalue=5.14e-08;sequence=TTTAGATATGA;
+phiX174	fimo	polypeptide_motif	4338	4348	72.8	+	.	Name=1;ID=1-92-phiX174;pvalue=5.18e-08;sequence=GGGGACGAAAA;
+phiX174	fimo	polypeptide_motif	3812	3822	72.8	+	.	Name=1;ID=1-93-phiX174;pvalue=5.28e-08;sequence=GGTTGATATTT;
+phiX174	fimo	polypeptide_motif	1909	1919	72.6	+	.	Name=1;ID=1-94-phiX174;pvalue=5.51e-08;sequence=TAACGCTAAAG;
+phiX174	fimo	polypeptide_motif	3000	3010	72.6	+	.	Name=1;ID=1-95-phiX174;pvalue=5.54e-08;sequence=GGCGGTCAAAA;
+phiX174	fimo	polypeptide_motif	3891	3901	72.4	+	.	Name=1;ID=1-96-phiX174;pvalue=5.75e-08;sequence=ATTGGCTCTAA;
+phiX174	fimo	polypeptide_motif	3079	3089	72.4	+	.	Name=1;ID=1-97-phiX174;pvalue=5.76e-08;sequence=CTGGTATTAAA;
+phiX174	fimo	polypeptide_motif	37	47	72.4	+	.	Name=1;ID=1-98-phiX174;pvalue=5.79e-08;sequence=TTCGGATATTT;
+phiX174	fimo	polypeptide_motif	380	390	72.2	+	.	Name=1;ID=1-99-phiX174;pvalue=6.01e-08;sequence=GTAAGAAATCA;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/fimo_output_html_1.html	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,97 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html xmlns:cis="http://zlab.bu.edu/schema/cisml" xmlns:fimo="http://noble.gs.washington.edu/schema/cisml" xmlns:mem="http://noble.gs.washington.edu/meme">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<meta charset="UTF-8">
+<title>FIMO Results</title>
+<style type="text/css">
+td.left {text-align: left;}
+td.right {text-align: right; padding-right: 1cm;}
+</style>
+</head>
+<body bgcolor="#D5F0FF">
+<a name="top_buttons"></a>
+<hr>
+<table summary="buttons" align="left" cellspacing="0">
+<tr>
+<td bgcolor="#00FFFF"><a href="#database_and_motifs"><b>Database and Motifs</b></a></td>
+<td bgcolor="#DDFFDD"><a href="#sec_i"><b>High-scoring Motif Occurences</b></a></td>
+<td bgcolor="#DDDDFF"><a href="#debugging_information"><b>Debugging Information</b></a></td>
+</tr>
+</table>
+<br/>
+<br/>
+<hr/>
+<center><big><b>FIMO - Motif search tool</b></big></center>
+<hr>
+<p>
+For further information on how to interpret these results
+or to get a copy of the FIMO software please access
+<a href="http://meme.nbcr.net">http://meme.nbcr.net</a></p>
+<p>If you use FIMO in your research, please cite the following paper:<br>
+Charles E. Grant, Timothy L. Bailey, and William Stafford Noble,
+"FIMO: Scanning for occurrences of a given motif",
+<i>Bioinformatics</i>, <b>27</b>(7):1017-1018, 2011.
+<a href="http://bioinformatics.oxfordjournals.org/content/27/7/1017">[full text]</a></p>
+<hr>
+<center><big><b><a name="database_and_motifs">DATABASE AND MOTIFS</a></b></big></center>
+<hr>
+<div style="padding-left: 0.75in; line-height: 1em; font-family: monospace;">
+<p>
+  <br />
+  Database contains 1 sequences, 5386 residues
+</p>
+<p>
+  <table>
+    <thead>
+      <tr>
+        <th style="border-bottom: 1px dashed;">MOTIF</th>
+        <th style="border-bottom: 1px dashed; padding-left: 1em;">WIDTH</th>
+        <th style="border-bottom: 1px dashed; padding-left: 1em;text-align:left;" >
+         BEST POSSIBLE MATCH
+        </th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr>
+        <td style="text-align:right;">1</td>
+        <td style="text-align:right;padding-left: 1em;">11</td>
+        <td style="text-align:left;padding-left: 1em;">GGGGTATAAAA</td>
+       </tr>
+    </tbody>
+  </table>
+</p>
+<p>
+Random model letter frequencies (from non-redundant database):
+<br/>
+
+A 0.073 C 0.018 D 0.052 E 0.062 F 0.040 G 0.069 H 0.022 I 0.056 K 0.058 
+L 0.092 M 0.023 N 0.046 P 0.051 Q 0.041 R 0.052 S 0.074 T 0.059 V 0.064 
+W 0.013 Y 0.033 </p>
+</div>
+<hr>
+<center><big><b><a name="sec_i">SECTION I: HIGH-SCORING MOTIF OCCURENCES</a></b></big></center>
+<hr>
+<ul>
+<li>
+There were 1937 motif occurences with a p-value less than 0.0001.
+<b>Only the most significant 1000 matches are shown here.</b>
+
+The full set of motif occurences can be seen in the
+tab-delimited plain text output file
+<a href="fimo.txt">fimo.txt</a>, 
+the GFF file 
+<a href="fimo.gff">fimo.gff</a> 
+which may be suitable for uploading to the 
+<a href="http://genome.ucsc.edu/cgi-bin/hgTables">UCSC Genome Table Browser</a>
+(assuming the FASTA input sequences included genomic coordinates in UCSC or Galaxy format),
+or the XML file 
+<a href="fimo.xml">fimo.xml</a>.
+</li>
+<li>
+The p-value of a motif occurrence is defined as the
+probability of a random sequence of the same length as the motif
+matching that position of the sequence with as good or better a score.
+</li>
+<li>
+The score for the match of a position in a sequence to a motif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/fimo_output_html_2.html	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,97 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html xmlns:cis="http://zlab.bu.edu/schema/cisml" xmlns:fimo="http://noble.gs.washington.edu/schema/cisml" xmlns:mem="http://noble.gs.washington.edu/meme">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<meta charset="UTF-8">
+<title>FIMO Results</title>
+<style type="text/css">
+td.left {text-align: left;}
+td.right {text-align: right; padding-right: 1cm;}
+</style>
+</head>
+<body bgcolor="#D5F0FF">
+<a name="top_buttons"></a>
+<hr>
+<table summary="buttons" align="left" cellspacing="0">
+<tr>
+<td bgcolor="#00FFFF"><a href="#database_and_motifs"><b>Database and Motifs</b></a></td>
+<td bgcolor="#DDFFDD"><a href="#sec_i"><b>High-scoring Motif Occurences</b></a></td>
+<td bgcolor="#DDDDFF"><a href="#debugging_information"><b>Debugging Information</b></a></td>
+</tr>
+</table>
+<br/>
+<br/>
+<hr/>
+<center><big><b>FIMO - Motif search tool</b></big></center>
+<hr>
+<p>
+For further information on how to interpret these results
+or to get a copy of the FIMO software please access
+<a href="http://meme.nbcr.net">http://meme.nbcr.net</a></p>
+<p>If you use FIMO in your research, please cite the following paper:<br>
+Charles E. Grant, Timothy L. Bailey, and William Stafford Noble,
+"FIMO: Scanning for occurrences of a given motif",
+<i>Bioinformatics</i>, <b>27</b>(7):1017-1018, 2011.
+<a href="http://bioinformatics.oxfordjournals.org/content/27/7/1017">[full text]</a></p>
+<hr>
+<center><big><b><a name="database_and_motifs">DATABASE AND MOTIFS</a></b></big></center>
+<hr>
+<div style="padding-left: 0.75in; line-height: 1em; font-family: monospace;">
+<p>
+  <br />
+  Database contains 1 sequences, 5386 residues
+</p>
+<p>
+  <table>
+    <thead>
+      <tr>
+        <th style="border-bottom: 1px dashed;">MOTIF</th>
+        <th style="border-bottom: 1px dashed; padding-left: 1em;">WIDTH</th>
+        <th style="border-bottom: 1px dashed; padding-left: 1em;text-align:left;" >
+         BEST POSSIBLE MATCH
+        </th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr>
+        <td style="text-align:right;">1</td>
+        <td style="text-align:right;padding-left: 1em;">11</td>
+        <td style="text-align:left;padding-left: 1em;">GGGGTATAAAA</td>
+       </tr>
+    </tbody>
+  </table>
+</p>
+<p>
+Random model letter frequencies (from non-redundant database):
+<br/>
+
+A 0.073 C 0.018 D 0.052 E 0.062 F 0.040 G 0.069 H 0.022 I 0.056 K 0.058 
+L 0.092 M 0.023 N 0.046 P 0.051 Q 0.041 R 0.052 S 0.074 T 0.059 V 0.064 
+W 0.013 Y 0.033 </p>
+</div>
+<hr>
+<center><big><b><a name="sec_i">SECTION I: HIGH-SCORING MOTIF OCCURENCES</a></b></big></center>
+<hr>
+<ul>
+<li>
+There were 1937 motif occurences with a p-value less than 0.0001.
+<b>Only the most significant 1000 matches are shown here.</b>
+
+The full set of motif occurences can be seen in the
+tab-delimited plain text output file
+<a href="fimo.txt">fimo.txt</a>, 
+the GFF file 
+<a href="fimo.gff">fimo.gff</a> 
+which may be suitable for uploading to the 
+<a href="http://genome.ucsc.edu/cgi-bin/hgTables">UCSC Genome Table Browser</a>
+(assuming the FASTA input sequences included genomic coordinates in UCSC or Galaxy format),
+or the XML file 
+<a href="fimo.xml">fimo.xml</a>.
+</li>
+<li>
+The p-value of a motif occurrence is defined as the
+probability of a random sequence of the same length as the motif
+matching that position of the sequence with as good or better a score.
+</li>
+<li>
+The score for the match of a position in a sequence to a motif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/fimo_output_interval_1.txt	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,100 @@
+#chr	start	end	pattern name	score	strand	matched sequence	p-value	q-value
+phiX174	1387	1398	1	+	+	1.25e-09	29.4024	6.36e-11
+phiX174	846	857	1	+	+	1.25e-09	29.122	7.02e-11
+phiX174	2300	2311	1	+	+	1.29e-09	27.6463	1.08e-10
+phiX174	5062	5073	1	+	+	2.25e-09	25.5366	2.73e-10
+phiX174	988	999	1	+	+	2.25e-09	25.3049	3.15e-10
+phiX174	4712	4723	1	+	+	3.48e-09	23.622	7.74e-10
+phiX174	5047	5058	1	+	+	3.48e-09	23.3293	8.51e-10
+phiX174	854	865	1	+	+	3.48e-09	23.3049	8.64e-10
+phiX174	3154	3165	1	+	+	3.48e-09	23.0366	9.76e-10
+phiX174	5008	5019	1	+	+	3.48e-09	23.0366	9.76e-10
+phiX174	813	824	1	+	+	4.14e-09	22.5854	1.28e-09
+phiX174	2831	2842	1	+	+	4.23e-09	22.3415	1.42e-09
+phiX174	3829	3840	1	+	+	4.68e-09	21.8293	1.7e-09
+phiX174	3559	3570	1	+	+	4.82e-09	21.5976	1.89e-09
+phiX174	2881	2892	1	+	+	5.46e-09	21.1951	2.29e-09
+phiX174	4452	4463	1	+	+	5.75e-09	20.8902	2.58e-09
+phiX174	2492	2503	1	+	+	5.79e-09	20.3415	3.06e-09
+phiX174	4103	4114	1	+	+	5.79e-09	20.3171	3.08e-09
+phiX174	4954	4965	1	+	+	5.79e-09	20.3171	3.08e-09
+phiX174	1884	1895	1	+	+	6.45e-09	19.9268	3.61e-09
+phiX174	3375	3386	1	+	+	6.48e-09	19.7683	3.81e-09
+phiX174	51	62	1	+	+	6.58e-09	19.5732	4.06e-09
+phiX174	1389	1400	1	+	+	6.61e-09	19.378	4.26e-09
+phiX174	2016	2027	1	+	+	6.85e-09	19.0854	4.6e-09
+phiX174	999	1010	1	+	+	6.97e-09	18.878	4.88e-09
+phiX174	1554	1565	1	+	+	7.37e-09	18.439	5.58e-09
+phiX174	4429	4440	1	+	+	7.37e-09	18.4268	5.62e-09
+phiX174	1926	1937	1	+	+	7.37e-09	18.2927	5.82e-09
+phiX174	2980	2991	1	+	+	7.37e-09	18.0732	6.13e-09
+phiX174	4202	4213	1	+	+	7.37e-09	17.9268	6.34e-09
+phiX174	1668	1679	1	+	+	7.37e-09	17.8659	6.4e-09
+phiX174	3259	3270	1	+	+	7.82e-09	17.5	7.01e-09
+phiX174	3046	3057	1	+	+	7.85e-09	17.2805	7.4e-09
+phiX174	4175	4186	1	+	+	7.85e-09	17.1829	7.6e-09
+phiX174	4117	4128	1	+	+	7.85e-09	17.1341	7.7e-09
+phiX174	5369	5380	1	+	+	7.87e-09	16.9878	8.03e-09
+phiX174	1241	1252	1	+	+	7.87e-09	16.5122	8.94e-09
+phiX174	2582	2593	1	+	+	7.87e-09	16.5122	8.94e-09
+phiX174	697	708	1	+	+	7.87e-09	16.4146	9.13e-09
+phiX174	2298	2309	1	+	+	7.87e-09	16.3537	9.26e-09
+phiX174	4188	4199	1	+	+	7.87e-09	16.1707	9.69e-09
+phiX174	274	285	1	+	+	7.87e-09	16.0976	9.85e-09
+phiX174	1800	1811	1	+	+	7.87e-09	16.0366	1e-08
+phiX174	1385	1396	1	+	+	7.87e-09	15.9268	1.03e-08
+phiX174	1302	1313	1	+	+	7.87e-09	15.9024	1.03e-08
+phiX174	3771	3782	1	+	+	7.87e-09	15.878	1.04e-08
+phiX174	1287	1298	1	+	+	7.87e-09	15.8659	1.04e-08
+phiX174	2576	2587	1	+	+	7.87e-09	15.7683	1.08e-08
+phiX174	936	947	1	+	+	7.87e-09	15.7561	1.08e-08
+phiX174	903	914	1	+	+	7.93e-09	15.6585	1.11e-08
+phiX174	2278	2289	1	+	+	7.93e-09	15.5854	1.13e-08
+phiX174	3163	3174	1	+	+	7.98e-09	15.5	1.16e-08
+phiX174	23	34	1	+	+	8.24e-09	15.3293	1.23e-08
+phiX174	837	848	1	+	+	8.24e-09	15.2561	1.27e-08
+phiX174	852	863	1	+	+	8.24e-09	15.2561	1.27e-08
+phiX174	1983	1994	1	+	+	8.68e-09	15.0244	1.36e-08
+phiX174	0	11	1	+	+	9.05e-09	14.8293	1.46e-08
+phiX174	4306	4317	1	+	+	9.05e-09	14.7927	1.47e-08
+phiX174	4302	4313	1	+	+	9.19e-09	14.6585	1.52e-08
+phiX174	5032	5043	1	+	+	9.41e-09	14.561	1.58e-08
+phiX174	2578	2589	1	+	+	1.01e-08	14.2927	1.73e-08
+phiX174	321	332	1	+	+	1.05e-08	14.1951	1.82e-08
+phiX174	5000	5011	1	+	+	1.19e-08	13.8902	2.09e-08
+phiX174	4216	4227	1	+	+	1.2e-08	13.8171	2.15e-08
+phiX174	4261	4272	1	+	+	1.2e-08	13.7805	2.18e-08
+phiX174	3568	3579	1	+	+	1.22e-08	13.7073	2.26e-08
+phiX174	193	204	1	+	+	1.22e-08	13.6829	2.29e-08
+phiX174	130	141	1	+	+	1.31e-08	13.4756	2.49e-08
+phiX174	1490	1501	1	+	+	1.32e-08	13.4024	2.55e-08
+phiX174	433	444	1	+	+	1.36e-08	13.2805	2.67e-08
+phiX174	4564	4575	1	+	+	1.36e-08	13.2439	2.73e-08
+phiX174	101	112	1	+	+	1.36e-08	13.2195	2.75e-08
+phiX174	902	913	1	+	+	1.38e-08	13.1463	2.82e-08
+phiX174	4747	4758	1	+	+	1.45e-08	12.9756	3.01e-08
+phiX174	2621	2632	1	+	+	1.5e-08	12.8659	3.16e-08
+phiX174	466	477	1	+	+	1.57e-08	12.7317	3.35e-08
+phiX174	4032	4043	1	+	+	1.58e-08	12.6829	3.44e-08
+phiX174	1347	1358	1	+	+	1.58e-08	12.6707	3.46e-08
+phiX174	238	249	1	+	+	1.64e-08	12.5732	3.62e-08
+phiX174	499	510	1	+	+	1.71e-08	12.4634	3.84e-08
+phiX174	3000	3011	1	+	+	1.73e-08	12.4146	3.93e-08
+phiX174	3775	3786	1	+	+	1.73e-08	12.378	3.98e-08
+phiX174	2025	2036	1	+	+	1.75e-08	12.3293	4.06e-08
+phiX174	4236	4247	1	+	+	1.75e-08	12.3049	4.12e-08
+phiX174	802	813	1	+	+	1.78e-08	12.2439	4.24e-08
+phiX174	3769	3780	1	+	+	1.81e-08	12.1829	4.35e-08
+phiX174	3428	3439	1	+	+	1.82e-08	12.122	4.45e-08
+phiX174	98	109	1	+	+	1.82e-08	12.1098	4.48e-08
+phiX174	66	77	1	+	+	1.92e-08	11.9268	4.78e-08
+phiX174	5331	5342	1	+	+	2.01e-08	11.7195	5.13e-08
+phiX174	276	287	1	+	+	2.01e-08	11.7073	5.14e-08
+phiX174	4337	4348	1	+	+	2.01e-08	11.6951	5.18e-08
+phiX174	3811	3822	1	+	+	2.03e-08	11.6585	5.28e-08
+phiX174	1908	1919	1	+	+	2.08e-08	11.5488	5.51e-08
+phiX174	2999	3010	1	+	+	2.08e-08	11.5366	5.54e-08
+phiX174	3890	3901	1	+	+	2.11e-08	11.439	5.75e-08
+phiX174	3078	3089	1	+	+	2.11e-08	11.4268	5.76e-08
+phiX174	36	47	1	+	+	2.11e-08	11.4146	5.79e-08
+phiX174	379	390	1	+	+	2.17e-08	11.3293	6.01e-08
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/fimo_output_interval_2.txt	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,100 @@
+#chr	start	end	pattern name	score	strand	matched sequence	p-value	q-value
+phiX174	1387	1398	1	+	+	0	29.4024	6.36e-11
+phiX174	846	857	1	+	+	0	29.122	7.02e-11
+phiX174	2300	2311	1	+	+	0	27.6463	1.08e-10
+phiX174	5062	5073	1	+	+	0	25.5366	2.73e-10
+phiX174	988	999	1	+	+	0	25.3049	3.15e-10
+phiX174	4712	4723	1	+	+	0	23.622	7.74e-10
+phiX174	5047	5058	1	+	+	0	23.3293	8.51e-10
+phiX174	854	865	1	+	+	0	23.3049	8.64e-10
+phiX174	3154	3165	1	+	+	0	23.0366	9.76e-10
+phiX174	5008	5019	1	+	+	0	23.0366	9.76e-10
+phiX174	813	824	1	+	+	0	22.5854	1.28e-09
+phiX174	2831	2842	1	+	+	0	22.3415	1.42e-09
+phiX174	3829	3840	1	+	+	0	21.8293	1.7e-09
+phiX174	3559	3570	1	+	+	0	21.5976	1.89e-09
+phiX174	2881	2892	1	+	+	0	21.1951	2.29e-09
+phiX174	4452	4463	1	+	+	0	20.8902	2.58e-09
+phiX174	2492	2503	1	+	+	0	20.3415	3.06e-09
+phiX174	4103	4114	1	+	+	0	20.3171	3.08e-09
+phiX174	4954	4965	1	+	+	0	20.3171	3.08e-09
+phiX174	1884	1895	1	+	+	0	19.9268	3.61e-09
+phiX174	3375	3386	1	+	+	0	19.7683	3.81e-09
+phiX174	51	62	1	+	+	0	19.5732	4.06e-09
+phiX174	1389	1400	1	+	+	0	19.378	4.26e-09
+phiX174	2016	2027	1	+	+	0	19.0854	4.6e-09
+phiX174	999	1010	1	+	+	0	18.878	4.88e-09
+phiX174	1554	1565	1	+	+	0	18.439	5.58e-09
+phiX174	4429	4440	1	+	+	0	18.4268	5.62e-09
+phiX174	1926	1937	1	+	+	0	18.2927	5.82e-09
+phiX174	2980	2991	1	+	+	0	18.0732	6.13e-09
+phiX174	4202	4213	1	+	+	0	17.9268	6.34e-09
+phiX174	1668	1679	1	+	+	0	17.8659	6.4e-09
+phiX174	3259	3270	1	+	+	0	17.5	7.01e-09
+phiX174	3046	3057	1	+	+	0	17.2805	7.4e-09
+phiX174	4175	4186	1	+	+	0	17.1829	7.6e-09
+phiX174	4117	4128	1	+	+	0	17.1341	7.7e-09
+phiX174	5369	5380	1	+	+	0	16.9878	8.03e-09
+phiX174	1241	1252	1	+	+	0	16.5122	8.94e-09
+phiX174	2582	2593	1	+	+	0	16.5122	8.94e-09
+phiX174	697	708	1	+	+	0	16.4146	9.13e-09
+phiX174	2298	2309	1	+	+	0	16.3537	9.26e-09
+phiX174	4188	4199	1	+	+	0	16.1707	9.69e-09
+phiX174	274	285	1	+	+	0	16.0976	9.85e-09
+phiX174	1800	1811	1	+	+	0	16.0366	1e-08
+phiX174	1385	1396	1	+	+	0	15.9268	1.03e-08
+phiX174	1302	1313	1	+	+	0	15.9024	1.03e-08
+phiX174	3771	3782	1	+	+	0	15.878	1.04e-08
+phiX174	1287	1298	1	+	+	0	15.8659	1.04e-08
+phiX174	2576	2587	1	+	+	0	15.7683	1.08e-08
+phiX174	936	947	1	+	+	0	15.7561	1.08e-08
+phiX174	903	914	1	+	+	0	15.6585	1.11e-08
+phiX174	2278	2289	1	+	+	0	15.5854	1.13e-08
+phiX174	3163	3174	1	+	+	0	15.5	1.16e-08
+phiX174	23	34	1	+	+	0	15.3293	1.23e-08
+phiX174	837	848	1	+	+	0	15.2561	1.27e-08
+phiX174	852	863	1	+	+	0	15.2561	1.27e-08
+phiX174	1983	1994	1	+	+	0	15.0244	1.36e-08
+phiX174	0	11	1	+	+	0	14.8293	1.46e-08
+phiX174	4306	4317	1	+	+	0	14.7927	1.47e-08
+phiX174	4302	4313	1	+	+	0	14.6585	1.52e-08
+phiX174	5032	5043	1	+	+	0	14.561	1.58e-08
+phiX174	2578	2589	1	+	+	0	14.2927	1.73e-08
+phiX174	321	332	1	+	+	0	14.1951	1.82e-08
+phiX174	5000	5011	1	+	+	0	13.8902	2.09e-08
+phiX174	4216	4227	1	+	+	0	13.8171	2.15e-08
+phiX174	4261	4272	1	+	+	0	13.7805	2.18e-08
+phiX174	3568	3579	1	+	+	0	13.7073	2.26e-08
+phiX174	193	204	1	+	+	0	13.6829	2.29e-08
+phiX174	130	141	1	+	+	0	13.4756	2.49e-08
+phiX174	1490	1501	1	+	+	0	13.4024	2.55e-08
+phiX174	433	444	1	+	+	0	13.2805	2.67e-08
+phiX174	4564	4575	1	+	+	0	13.2439	2.73e-08
+phiX174	101	112	1	+	+	0	13.2195	2.75e-08
+phiX174	902	913	1	+	+	0	13.1463	2.82e-08
+phiX174	4747	4758	1	+	+	0	12.9756	3.01e-08
+phiX174	2621	2632	1	+	+	0	12.8659	3.16e-08
+phiX174	466	477	1	+	+	0	12.7317	3.35e-08
+phiX174	4032	4043	1	+	+	0	12.6829	3.44e-08
+phiX174	1347	1358	1	+	+	0	12.6707	3.46e-08
+phiX174	238	249	1	+	+	0	12.5732	3.62e-08
+phiX174	499	510	1	+	+	0	12.4634	3.84e-08
+phiX174	3000	3011	1	+	+	0	12.4146	3.93e-08
+phiX174	3775	3786	1	+	+	0	12.378	3.98e-08
+phiX174	2025	2036	1	+	+	0	12.3293	4.06e-08
+phiX174	4236	4247	1	+	+	0	12.3049	4.12e-08
+phiX174	802	813	1	+	+	0	12.2439	4.24e-08
+phiX174	3769	3780	1	+	+	0	12.1829	4.35e-08
+phiX174	3428	3439	1	+	+	0	12.122	4.45e-08
+phiX174	98	109	1	+	+	0	12.1098	4.48e-08
+phiX174	66	77	1	+	+	0	11.9268	4.78e-08
+phiX174	5331	5342	1	+	+	0	11.7195	5.13e-08
+phiX174	276	287	1	+	+	0	11.7073	5.14e-08
+phiX174	4337	4348	1	+	+	0	11.6951	5.18e-08
+phiX174	3811	3822	1	+	+	0	11.6585	5.28e-08
+phiX174	1908	1919	1	+	+	0	11.5488	5.51e-08
+phiX174	2999	3010	1	+	+	0	11.5366	5.54e-08
+phiX174	3890	3901	1	+	+	0	11.439	5.75e-08
+phiX174	3078	3089	1	+	+	0	11.4268	5.76e-08
+phiX174	36	47	1	+	+	0	11.4146	5.79e-08
+phiX174	379	390	1	+	+	0	11.3293	6.01e-08
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/fimo_output_txt_1.txt	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,100 @@
+#pattern name	sequence name	start	stop	strand	score	p-value	q-value	matched sequence
+1	phiX174	1388	1398	+	29.4024	6.36e-11	1.25e-09	AATATCTATAA
+1	phiX174	847	857	+	29.122	7.02e-11	1.25e-09	AATGTCTAAAG
+1	phiX174	2301	2311	+	27.6463	1.08e-10	1.29e-09	AGGTTATAACG
+1	phiX174	5063	5073	+	25.5366	2.73e-10	2.25e-09	AGGAGCTAAAG
+1	phiX174	989	999	+	25.3049	3.15e-10	2.25e-09	TGAGGATAAAT
+1	phiX174	4713	4723	+	23.622	7.74e-10	3.48e-09	GACTGCTATCA
+1	phiX174	5048	5058	+	23.3293	8.51e-10	3.48e-09	TGCTGCTAAAG
+1	phiX174	855	865	+	23.3049	8.64e-10	3.48e-09	AAGGTAAAAAA
+1	phiX174	3155	3165	+	23.0366	9.76e-10	3.48e-09	TATGGCTAAAG
+1	phiX174	5009	5019	+	23.0366	9.76e-10	3.48e-09	TGTGGCTAAAT
+1	phiX174	814	824	+	22.5854	1.28e-09	4.14e-09	TGCGTCAAAAA
+1	phiX174	2832	2842	+	22.3415	1.42e-09	4.23e-09	TTGGTCTAACT
+1	phiX174	3830	3840	+	21.8293	1.7e-09	4.68e-09	TATTGATAAAG
+1	phiX174	3560	3570	+	21.5976	1.89e-09	4.82e-09	TGCGTCTATTA
+1	phiX174	2882	2892	+	21.1951	2.29e-09	5.46e-09	AGGTTATTAAA
+1	phiX174	4453	4463	+	20.8902	2.58e-09	5.75e-09	AAGGTATTAAG
+1	phiX174	2493	2503	+	20.3415	3.06e-09	5.79e-09	GACACCTAAAG
+1	phiX174	4104	4114	+	20.3171	3.08e-09	5.79e-09	GGCTTCCATAA
+1	phiX174	4955	4965	+	20.3171	3.08e-09	5.79e-09	TGATGCTAAAG
+1	phiX174	1885	1895	+	19.9268	3.61e-09	6.45e-09	TGCGACTAAAG
+1	phiX174	3376	3386	+	19.7683	3.81e-09	6.48e-09	AGAATCAAAAA
+1	phiX174	52	62	+	19.5732	4.06e-09	6.58e-09	TGAGTCGAAAA
+1	phiX174	1390	1400	+	19.378	4.26e-09	6.61e-09	TATCTATAACA
+1	phiX174	2017	2027	+	19.0854	4.6e-09	6.85e-09	TTCGTCTAAGA
+1	phiX174	1000	1010	+	18.878	4.88e-09	6.97e-09	TATGTCTAATA
+1	phiX174	1555	1565	+	18.439	5.58e-09	7.37e-09	GACTTCTACCA
+1	phiX174	4430	4440	+	18.4268	5.62e-09	7.37e-09	TGAGTATAATT
+1	phiX174	1927	1937	+	18.2927	5.82e-09	7.37e-09	GACTTATACCG
+1	phiX174	2981	2991	+	18.0732	6.13e-09	7.37e-09	CATGTCTAAAT
+1	phiX174	4203	4213	+	17.9268	6.34e-09	7.37e-09	GACGGCCATAA
+1	phiX174	1669	1679	+	17.8659	6.4e-09	7.37e-09	TGGAGGTAAAA
+1	phiX174	3260	3270	+	17.5	7.01e-09	7.82e-09	CGCTGATAAAG
+1	phiX174	3047	3057	+	17.2805	7.4e-09	7.85e-09	TACCGATAACA
+1	phiX174	4176	4186	+	17.1829	7.6e-09	7.85e-09	GAGTTCGATAA
+1	phiX174	4118	4128	+	17.1341	7.7e-09	7.85e-09	GATGGATAACC
+1	phiX174	5370	5380	+	16.9878	8.03e-09	7.87e-09	GGCGTATCCAA
+1	phiX174	1242	1252	+	16.5122	8.94e-09	7.87e-09	AGTGGATTAAG
+1	phiX174	2583	2593	+	16.5122	8.94e-09	7.87e-09	TACATCTGTCA
+1	phiX174	698	708	+	16.4146	9.13e-09	7.87e-09	TACGGAAAACA
+1	phiX174	2299	2309	+	16.3537	9.26e-09	7.87e-09	TGAGGTTATAA
+1	phiX174	4189	4199	+	16.1707	9.69e-09	7.87e-09	GTGATATGTAT
+1	phiX174	275	285	+	16.0976	9.85e-09	7.87e-09	GGTTTAGATAT
+1	phiX174	1801	1811	+	16.0366	1e-08	7.87e-09	GACCTATAAAC
+1	phiX174	1386	1396	+	15.9268	1.03e-08	7.87e-09	TGAATATCTAT
+1	phiX174	1303	1313	+	15.9024	1.03e-08	7.87e-09	TGGTTATATTG
+1	phiX174	3772	3782	+	15.878	1.04e-08	7.87e-09	AGGATATTTCT
+1	phiX174	1288	1298	+	15.8659	1.04e-08	7.87e-09	GACTGTTAACA
+1	phiX174	2577	2587	+	15.7683	1.08e-08	7.87e-09	GATGGATACAT
+1	phiX174	937	947	+	15.7561	1.08e-08	7.87e-09	TTGGTATGTAG
+1	phiX174	904	914	+	15.6585	1.11e-08	7.93e-09	AGGTACTAAAG
+1	phiX174	2279	2289	+	15.5854	1.13e-08	7.93e-09	TCGTGATAAAA
+1	phiX174	3164	3174	+	15.5	1.16e-08	7.98e-09	AGCTGGTAAAG
+1	phiX174	24	34	+	15.3293	1.23e-08	8.24e-09	AGAAGTTAACA
+1	phiX174	838	848	+	15.2561	1.27e-08	8.24e-09	GAGTGATGTAA
+1	phiX174	853	863	+	15.2561	1.27e-08	8.24e-09	TAAAGGTAAAA
+1	phiX174	1984	1994	+	15.0244	1.36e-08	8.68e-09	AATTTCTATGA
+1	phiX174	1	11	+	14.8293	1.46e-08	9.05e-09	GAGTTTTATCG
+1	phiX174	4307	4317	+	14.7927	1.47e-08	9.05e-09	TATTAATAACA
+1	phiX174	4303	4313	+	14.6585	1.52e-08	9.19e-09	TTGATATTAAT
+1	phiX174	5033	5043	+	14.561	1.58e-08	9.41e-09	GTCAGATATGG
+1	phiX174	2579	2589	+	14.2927	1.73e-08	1.01e-08	TGGATACATCT
+1	phiX174	322	332	+	14.1951	1.82e-08	1.05e-08	GACATTTTAAA
+1	phiX174	5001	5011	+	13.8902	2.09e-08	1.19e-08	GGTTTCTATGT
+1	phiX174	4217	4227	+	13.8171	2.15e-08	1.2e-08	TGCTTCTGACG
+1	phiX174	4262	4272	+	13.7805	2.18e-08	1.2e-08	AATGGATGAAT
+1	phiX174	3569	3579	+	13.7073	2.26e-08	1.22e-08	TATGGAAAACA
+1	phiX174	194	204	+	13.6829	2.29e-08	1.22e-08	ATCAACTAACG
+1	phiX174	131	141	+	13.4756	2.49e-08	1.31e-08	AAATGAGAAAA
+1	phiX174	1491	1501	+	13.4024	2.55e-08	1.32e-08	GCCATCTCAAA
+1	phiX174	434	444	+	13.2805	2.67e-08	1.36e-08	GGCCTCTATTA
+1	phiX174	4565	4575	+	13.2439	2.73e-08	1.36e-08	TTGGTTTATCG
+1	phiX174	102	112	+	13.2195	2.75e-08	1.36e-08	GAATTAAATCG
+1	phiX174	903	913	+	13.1463	2.82e-08	1.38e-08	GAGGTACTAAA
+1	phiX174	4748	4758	+	12.9756	3.01e-08	1.45e-08	TACAGCTAATG
+1	phiX174	2622	2632	+	12.8659	3.16e-08	1.5e-08	TGCTGATATTG
+1	phiX174	467	477	+	12.7317	3.35e-08	1.57e-08	TTTGGATTTAA
+1	phiX174	4033	4043	+	12.6829	3.44e-08	1.58e-08	AGCGTATCGAG
+1	phiX174	1348	1358	+	12.6707	3.46e-08	1.58e-08	TACCAATAAAA
+1	phiX174	239	249	+	12.5732	3.62e-08	1.64e-08	AGTGGCTTAAT
+1	phiX174	500	510	+	12.4634	3.84e-08	1.71e-08	GACGAGTAACA
+1	phiX174	3001	3011	+	12.4146	3.93e-08	1.73e-08	GCGGTCAAAAA
+1	phiX174	3776	3786	+	12.378	3.98e-08	1.73e-08	TATTTCTAATG
+1	phiX174	2026	2036	+	12.3293	4.06e-08	1.75e-08	GAAGTTTAAGA
+1	phiX174	4237	4247	+	12.3049	4.12e-08	1.75e-08	AGTTTGTATCT
+1	phiX174	803	813	+	12.2439	4.24e-08	1.78e-08	AGAAGAAAACG
+1	phiX174	3770	3780	+	12.1829	4.35e-08	1.81e-08	AAAGGATATTT
+1	phiX174	3429	3439	+	12.122	4.45e-08	1.82e-08	GAGATGCAAAA
+1	phiX174	99	109	+	12.1098	4.48e-08	1.82e-08	TACGAATTAAA
+1	phiX174	67	77	+	11.9268	4.78e-08	1.92e-08	TCTTGATAAAG
+1	phiX174	5332	5342	+	11.7195	5.13e-08	2.01e-08	ATCTGCTCAAA
+1	phiX174	277	287	+	11.7073	5.14e-08	2.01e-08	TTTAGATATGA
+1	phiX174	4338	4348	+	11.6951	5.18e-08	2.01e-08	GGGGACGAAAA
+1	phiX174	3812	3822	+	11.6585	5.28e-08	2.03e-08	GGTTGATATTT
+1	phiX174	1909	1919	+	11.5488	5.51e-08	2.08e-08	TAACGCTAAAG
+1	phiX174	3000	3010	+	11.5366	5.54e-08	2.08e-08	GGCGGTCAAAA
+1	phiX174	3891	3901	+	11.439	5.75e-08	2.11e-08	ATTGGCTCTAA
+1	phiX174	3079	3089	+	11.4268	5.76e-08	2.11e-08	CTGGTATTAAA
+1	phiX174	37	47	+	11.4146	5.79e-08	2.11e-08	TTCGGATATTT
+1	phiX174	380	390	+	11.3293	6.01e-08	2.17e-08	GTAAGAAATCA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/fimo_output_txt_2.txt	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,100 @@
+#pattern name	sequence name	start	stop	strand	score	p-value	q-value	matched sequence
+1	phiX174	1388	1398	+	29.4024	6.36e-11	0	AATATCTATAA
+1	phiX174	847	857	+	29.122	7.02e-11	0	AATGTCTAAAG
+1	phiX174	2301	2311	+	27.6463	1.08e-10	0	AGGTTATAACG
+1	phiX174	5063	5073	+	25.5366	2.73e-10	0	AGGAGCTAAAG
+1	phiX174	989	999	+	25.3049	3.15e-10	0	TGAGGATAAAT
+1	phiX174	4713	4723	+	23.622	7.74e-10	0	GACTGCTATCA
+1	phiX174	5048	5058	+	23.3293	8.51e-10	0	TGCTGCTAAAG
+1	phiX174	855	865	+	23.3049	8.64e-10	0	AAGGTAAAAAA
+1	phiX174	3155	3165	+	23.0366	9.76e-10	0	TATGGCTAAAG
+1	phiX174	5009	5019	+	23.0366	9.76e-10	0	TGTGGCTAAAT
+1	phiX174	814	824	+	22.5854	1.28e-09	0	TGCGTCAAAAA
+1	phiX174	2832	2842	+	22.3415	1.42e-09	0	TTGGTCTAACT
+1	phiX174	3830	3840	+	21.8293	1.7e-09	0	TATTGATAAAG
+1	phiX174	3560	3570	+	21.5976	1.89e-09	0	TGCGTCTATTA
+1	phiX174	2882	2892	+	21.1951	2.29e-09	0	AGGTTATTAAA
+1	phiX174	4453	4463	+	20.8902	2.58e-09	0	AAGGTATTAAG
+1	phiX174	2493	2503	+	20.3415	3.06e-09	0	GACACCTAAAG
+1	phiX174	4104	4114	+	20.3171	3.08e-09	0	GGCTTCCATAA
+1	phiX174	4955	4965	+	20.3171	3.08e-09	0	TGATGCTAAAG
+1	phiX174	1885	1895	+	19.9268	3.61e-09	0	TGCGACTAAAG
+1	phiX174	3376	3386	+	19.7683	3.81e-09	0	AGAATCAAAAA
+1	phiX174	52	62	+	19.5732	4.06e-09	0	TGAGTCGAAAA
+1	phiX174	1390	1400	+	19.378	4.26e-09	0	TATCTATAACA
+1	phiX174	2017	2027	+	19.0854	4.6e-09	0	TTCGTCTAAGA
+1	phiX174	1000	1010	+	18.878	4.88e-09	0	TATGTCTAATA
+1	phiX174	1555	1565	+	18.439	5.58e-09	0	GACTTCTACCA
+1	phiX174	4430	4440	+	18.4268	5.62e-09	0	TGAGTATAATT
+1	phiX174	1927	1937	+	18.2927	5.82e-09	0	GACTTATACCG
+1	phiX174	2981	2991	+	18.0732	6.13e-09	0	CATGTCTAAAT
+1	phiX174	4203	4213	+	17.9268	6.34e-09	0	GACGGCCATAA
+1	phiX174	1669	1679	+	17.8659	6.4e-09	0	TGGAGGTAAAA
+1	phiX174	3260	3270	+	17.5	7.01e-09	0	CGCTGATAAAG
+1	phiX174	3047	3057	+	17.2805	7.4e-09	0	TACCGATAACA
+1	phiX174	4176	4186	+	17.1829	7.6e-09	0	GAGTTCGATAA
+1	phiX174	4118	4128	+	17.1341	7.7e-09	0	GATGGATAACC
+1	phiX174	5370	5380	+	16.9878	8.03e-09	0	GGCGTATCCAA
+1	phiX174	1242	1252	+	16.5122	8.94e-09	0	AGTGGATTAAG
+1	phiX174	2583	2593	+	16.5122	8.94e-09	0	TACATCTGTCA
+1	phiX174	698	708	+	16.4146	9.13e-09	0	TACGGAAAACA
+1	phiX174	2299	2309	+	16.3537	9.26e-09	0	TGAGGTTATAA
+1	phiX174	4189	4199	+	16.1707	9.69e-09	0	GTGATATGTAT
+1	phiX174	275	285	+	16.0976	9.85e-09	0	GGTTTAGATAT
+1	phiX174	1801	1811	+	16.0366	1e-08	0	GACCTATAAAC
+1	phiX174	1386	1396	+	15.9268	1.03e-08	0	TGAATATCTAT
+1	phiX174	1303	1313	+	15.9024	1.03e-08	0	TGGTTATATTG
+1	phiX174	3772	3782	+	15.878	1.04e-08	0	AGGATATTTCT
+1	phiX174	1288	1298	+	15.8659	1.04e-08	0	GACTGTTAACA
+1	phiX174	2577	2587	+	15.7683	1.08e-08	0	GATGGATACAT
+1	phiX174	937	947	+	15.7561	1.08e-08	0	TTGGTATGTAG
+1	phiX174	904	914	+	15.6585	1.11e-08	0	AGGTACTAAAG
+1	phiX174	2279	2289	+	15.5854	1.13e-08	0	TCGTGATAAAA
+1	phiX174	3164	3174	+	15.5	1.16e-08	0	AGCTGGTAAAG
+1	phiX174	24	34	+	15.3293	1.23e-08	0	AGAAGTTAACA
+1	phiX174	838	848	+	15.2561	1.27e-08	0	GAGTGATGTAA
+1	phiX174	853	863	+	15.2561	1.27e-08	0	TAAAGGTAAAA
+1	phiX174	1984	1994	+	15.0244	1.36e-08	0	AATTTCTATGA
+1	phiX174	1	11	+	14.8293	1.46e-08	0	GAGTTTTATCG
+1	phiX174	4307	4317	+	14.7927	1.47e-08	0	TATTAATAACA
+1	phiX174	4303	4313	+	14.6585	1.52e-08	0	TTGATATTAAT
+1	phiX174	5033	5043	+	14.561	1.58e-08	0	GTCAGATATGG
+1	phiX174	2579	2589	+	14.2927	1.73e-08	0	TGGATACATCT
+1	phiX174	322	332	+	14.1951	1.82e-08	0	GACATTTTAAA
+1	phiX174	5001	5011	+	13.8902	2.09e-08	0	GGTTTCTATGT
+1	phiX174	4217	4227	+	13.8171	2.15e-08	0	TGCTTCTGACG
+1	phiX174	4262	4272	+	13.7805	2.18e-08	0	AATGGATGAAT
+1	phiX174	3569	3579	+	13.7073	2.26e-08	0	TATGGAAAACA
+1	phiX174	194	204	+	13.6829	2.29e-08	0	ATCAACTAACG
+1	phiX174	131	141	+	13.4756	2.49e-08	0	AAATGAGAAAA
+1	phiX174	1491	1501	+	13.4024	2.55e-08	0	GCCATCTCAAA
+1	phiX174	434	444	+	13.2805	2.67e-08	0	GGCCTCTATTA
+1	phiX174	4565	4575	+	13.2439	2.73e-08	0	TTGGTTTATCG
+1	phiX174	102	112	+	13.2195	2.75e-08	0	GAATTAAATCG
+1	phiX174	903	913	+	13.1463	2.82e-08	0	GAGGTACTAAA
+1	phiX174	4748	4758	+	12.9756	3.01e-08	0	TACAGCTAATG
+1	phiX174	2622	2632	+	12.8659	3.16e-08	0	TGCTGATATTG
+1	phiX174	467	477	+	12.7317	3.35e-08	0	TTTGGATTTAA
+1	phiX174	4033	4043	+	12.6829	3.44e-08	0	AGCGTATCGAG
+1	phiX174	1348	1358	+	12.6707	3.46e-08	0	TACCAATAAAA
+1	phiX174	239	249	+	12.5732	3.62e-08	0	AGTGGCTTAAT
+1	phiX174	500	510	+	12.4634	3.84e-08	0	GACGAGTAACA
+1	phiX174	3001	3011	+	12.4146	3.93e-08	0	GCGGTCAAAAA
+1	phiX174	3776	3786	+	12.378	3.98e-08	0	TATTTCTAATG
+1	phiX174	2026	2036	+	12.3293	4.06e-08	0	GAAGTTTAAGA
+1	phiX174	4237	4247	+	12.3049	4.12e-08	0	AGTTTGTATCT
+1	phiX174	803	813	+	12.2439	4.24e-08	0	AGAAGAAAACG
+1	phiX174	3770	3780	+	12.1829	4.35e-08	0	AAAGGATATTT
+1	phiX174	3429	3439	+	12.122	4.45e-08	0	GAGATGCAAAA
+1	phiX174	99	109	+	12.1098	4.48e-08	0	TACGAATTAAA
+1	phiX174	67	77	+	11.9268	4.78e-08	0	TCTTGATAAAG
+1	phiX174	5332	5342	+	11.7195	5.13e-08	0	ATCTGCTCAAA
+1	phiX174	277	287	+	11.7073	5.14e-08	0	TTTAGATATGA
+1	phiX174	4338	4348	+	11.6951	5.18e-08	0	GGGGACGAAAA
+1	phiX174	3812	3822	+	11.6585	5.28e-08	0	GGTTGATATTT
+1	phiX174	1909	1919	+	11.5488	5.51e-08	0	TAACGCTAAAG
+1	phiX174	3000	3010	+	11.5366	5.54e-08	0	GGCGGTCAAAA
+1	phiX174	3891	3901	+	11.439	5.75e-08	0	ATTGGCTCTAA
+1	phiX174	3079	3089	+	11.4268	5.76e-08	0	CTGGTATTAAA
+1	phiX174	37	47	+	11.4146	5.79e-08	0	TTCGGATATTT
+1	phiX174	380	390	+	11.3293	6.01e-08	0	GTAAGAAATCA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/fimo_output_xml_1.xml	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Begin document body -->
+<settings>
+<setting name="allow clobber">false</setting>
+<setting name="compute q-values">true</setting>
+<setting name="parse genomic coord.">false</setting>
+<setting name="text only">false</setting>
+<setting name="scan both strands">false</setting>
+<setting name="output threshold">0.0001</setting>
+<setting name="threshold type">p-value</setting>
+<setting name="max stored scores">100000</setting>
+<setting name="pseudocount">0.1</setting>
+<setting name="verbosity">1</setting>
+</settings>
+<sequence-data num-sequences="1" num-residues="5386" />
+<alphabet name="Protein" like="protein">
+<letter id="A" symbol="A" name="Alanine" colour="0000CC"/>
+<letter id="C" symbol="C" name="Cysteine" colour="0000CC"/>
+<letter id="D" symbol="D" name="Aspartic acid" colour="FF00FF"/>
+<letter id="E" symbol="E" name="Glutamic acid" colour="FF00FF"/>
+<letter id="F" symbol="F" name="Phenylalanine" colour="0000CC"/>
+<letter id="G" symbol="G" name="Glycine" colour="FFB300"/>
+<letter id="H" symbol="H" name="Histidine" colour="FFCCCC"/>
+<letter id="I" symbol="I" name="Isoleucine" colour="0000CC"/>
+<letter id="K" symbol="K" name="Lysine" colour="CC0000"/>
+<letter id="L" symbol="L" name="Leucine" colour="0000CC"/>
+<letter id="M" symbol="M" name="Methionine" colour="0000CC"/>
+<letter id="N" symbol="N" name="Asparagine" colour="008000"/>
+<letter id="P" symbol="P" name="Proline" colour="FFFF00"/>
+<letter id="Q" symbol="Q" name="Glutamine" colour="008000"/>
+<letter id="R" symbol="R" name="Arginine" colour="CC0000"/>
+<letter id="S" symbol="S" name="Serine" colour="008000"/>
+<letter id="T" symbol="T" name="Threonine" colour="008000"/>
+<letter id="V" symbol="V" name="Valine" colour="0000CC"/>
+<letter id="W" symbol="W" name="Tryptophan" colour="0000CC"/>
+<letter id="Y" symbol="Y" name="Tyrosine" colour="33E6CC"/>
+<letter id="X" symbol="X" aliases="*." equals="ACDEFGHIKLMNPQRSTVWY" name="Any amino acid"/>
+<letter id="B" symbol="B" equals="DN" name="Asparagine or Aspartic acid"/>
+<letter id="Z" symbol="Z" equals="EQ" name="Glutamine or Glutamic acid"/>
+<letter id="J" symbol="J" equals="IL" name="Leucine or Isoleucine"/>
+</alphabet>
+<motif name="1" width="11" best-possible-match="GGGGTATAAAA"/>
+<background source="non-redundant database">
+<value letter="A">0.073</value>
+<value letter="C">0.018</value>
+<value letter="D">0.052</value>
+<value letter="E">0.062</value>
+<value letter="F">0.040</value>
+<value letter="G">0.069</value>
+<value letter="H">0.022</value>
+<value letter="I">0.056</value>
+<value letter="K">0.058</value>
+<value letter="L">0.092</value>
+<value letter="M">0.023</value>
+<value letter="N">0.046</value>
+<value letter="P">0.051</value>
+<value letter="Q">0.041</value>
+<value letter="R">0.052</value>
+<value letter="S">0.074</value>
+<value letter="T">0.059</value>
+<value letter="V">0.064</value>
+<value letter="W">0.013</value>
+<value letter="Y">0.033</value>
+</background>
+<cisml-file>cisml.xml</cisml-file>
+</fimo>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/fimo_output_xml_2.xml	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Begin document body -->
+<settings>
+<setting name="allow clobber">false</setting>
+<setting name="compute q-values">false</setting>
+<setting name="text only">false</setting>
+<setting name="scan both strands">false</setting>
+<setting name="output threshold">0.0001</setting>
+<setting name="threshold type">p-value</setting>
+<setting name="max stored scores">100000</setting>
+<setting name="pseudocount">0.1</setting>
+<setting name="verbosity">1</setting>
+</settings>
+<sequence-data num-sequences="1" num-residues="5386" />
+<alphabet name="Protein" like="protein">
+<letter id="A" symbol="A" name="Alanine" colour="0000CC"/>
+<letter id="C" symbol="C" name="Cysteine" colour="0000CC"/>
+<letter id="D" symbol="D" name="Aspartic acid" colour="FF00FF"/>
+<letter id="E" symbol="E" name="Glutamic acid" colour="FF00FF"/>
+<letter id="F" symbol="F" name="Phenylalanine" colour="0000CC"/>
+<letter id="G" symbol="G" name="Glycine" colour="FFB300"/>
+<letter id="H" symbol="H" name="Histidine" colour="FFCCCC"/>
+<letter id="I" symbol="I" name="Isoleucine" colour="0000CC"/>
+<letter id="K" symbol="K" name="Lysine" colour="CC0000"/>
+<letter id="L" symbol="L" name="Leucine" colour="0000CC"/>
+<letter id="M" symbol="M" name="Methionine" colour="0000CC"/>
+<letter id="N" symbol="N" name="Asparagine" colour="008000"/>
+<letter id="P" symbol="P" name="Proline" colour="FFFF00"/>
+<letter id="Q" symbol="Q" name="Glutamine" colour="008000"/>
+<letter id="R" symbol="R" name="Arginine" colour="CC0000"/>
+<letter id="S" symbol="S" name="Serine" colour="008000"/>
+<letter id="T" symbol="T" name="Threonine" colour="008000"/>
+<letter id="V" symbol="V" name="Valine" colour="0000CC"/>
+<letter id="W" symbol="W" name="Tryptophan" colour="0000CC"/>
+<letter id="Y" symbol="Y" name="Tyrosine" colour="33E6CC"/>
+<letter id="X" symbol="X" aliases="*." equals="ACDEFGHIKLMNPQRSTVWY" name="Any amino acid"/>
+<letter id="B" symbol="B" equals="DN" name="Asparagine or Aspartic acid"/>
+<letter id="Z" symbol="Z" equals="EQ" name="Glutamine or Glutamic acid"/>
+<letter id="J" symbol="J" equals="IL" name="Leucine or Isoleucine"/>
+</alphabet>
+<motif name="1" width="11" best-possible-match="GGGGTATAAAA"/>
+<background source="non-redundant database">
+<value letter="A">0.073</value>
+<value letter="C">0.018</value>
+<value letter="D">0.052</value>
+<value letter="E">0.062</value>
+<value letter="F">0.040</value>
+<value letter="G">0.069</value>
+<value letter="H">0.022</value>
+<value letter="I">0.056</value>
+<value letter="K">0.058</value>
+<value letter="L">0.092</value>
+<value letter="M">0.023</value>
+<value letter="N">0.046</value>
+<value letter="P">0.051</value>
+<value letter="Q">0.041</value>
+<value letter="R">0.052</value>
+<value letter="S">0.074</value>
+<value letter="T">0.059</value>
+<value letter="V">0.064</value>
+<value letter="W">0.013</value>
+<value letter="Y">0.033</value>
+</background>
+<cisml-file>cisml.xml</cisml-file>
+</fimo>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/meme_input_1.fasta	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,66 @@
+>chr21_19617074_19617124_+
+AAAAATTATTACTAGGGAGGGGGCCGGAACCTCGGGACGTGGGTATATAA
+>chr21_26934381_26934431_+
+GCGCCTGGTCGGTTATGAGTCACAAGTGAGTTATAAAAGGGTCGCACGTT
+>chr21_28217753_28217803_-
+CAAAGGGGAGGAGTGGGGTGGGGGTGGGGGTTTCACTGGTCCACTATAAA
+>chr21_31710037_31710087_-
+AACACCCAGGTTTCTGAGTATATAATCGCCGCACCAAAGAATTTAATTTT
+>chr21_31744582_31744632_-
+CCCAGGTCTAAGAGCATATATAACTTGGAGTCCAGACTATGACATTCAAA
+>chr21_31768316_31768366_+
+AACGTATATAAATGGTCCTGTCCAGATGTGGCATGCAAACTCAGAATCTT
+>chr21_31914206_31914256_-
+TGACACCCACTACTTAGAGTATAAAATCATTCTGAGAAGTTAGAGACACC
+>chr21_31933633_31933683_-
+TCAGAGTATATATAAATGTTCCTGTCCAGTCACAGTCACCAAACTGACCT
+>chr21_31962741_31962791_-
+ACATATAACTCAGGTTGGATAAAATAATTTGTACAAATCAGGAGAGTCAA
+>chr21_31964683_31964733_+
+TCTGATTCACTGAGGCATATAAAAGGCCCTCTGCGGAGAAGTGTCCATAC
+>chr21_31973364_31973414_+
+aaacttaaaactctataaacttaaaactCTAGAATCTGATCCTGCTATAC
+>chr21_31992870_31992920_+
+CTCATACACTATTGAAGATGTATAAAATTTCATTTGCAGATGGTGACATT
+>chr21_32185595_32185645_-
+TCACCACCCACCAGAGCTGGGATATATAAAGAAGGTTCTGAGACTAGGAA
+>chr21_32202076_32202126_-
+TGCCCACCAGCTTGAGGTATAAAAAGCCCTGTACGGGAAGAGACCTTCAT
+>chr21_32253899_32253949_-
+AGCCCCACCCACCAGCAAGGATATATAAAAGCTCAGGAGTCTGGAGTGAC
+>chr21_32410820_32410870_-
+TCTACCCCACTAATCACTGAGGATGTATAAAAGTCCCAGGGAAGCTGGTG
+>chr21_36411748_36411798_-
+ATAGTTCTGTATAGTTTCAGTTGGCATCtaaaaattatataactttattt
+>chr21_37838750_37838800_-
+gatggttttataaggggcctcaccctcggctcagccctcattcttctcct
+>chr21_45705687_45705737_+
+CCGGGGCGGAGCGGCCTTTGCTCTTTGCGTGGTCGCGGGGGTATAACAGC
+>chr21_45971413_45971463_-
+CAGGCCCTGGGCATATAAAAGCCCCAGCAGCCAACAGGctcacacacaca
+>chr21_45978668_45978718_-
+CAGAGGGGTATAAAGGTTCCGACCACTCAGAGGCCTGGCACGAtcactca
+>chr21_45993530_45993580_+
+CCAAGGAGGAGTATAAAAGCCCCACAAACCCGAGCACCTCACTCACTCGC
+>chr21_46020421_46020471_+
+GAGACATATAAAAGCCAACATCCCTGAGCACCTAACACACGGactcactc
+>chr21_46031920_46031970_+
+GGAAAATACCCAGGGAGGGTATAAAACCTCAGCAGCCAGGGCACACAAAC
+>chr21_46046964_46047014_+
+ACAAGGCCAGGAGGGGTATAAAAGCCTGAGAGCCCCAAGAACctcacaca
+>chr21_46057197_46057247_+
+ATTGCTGAGTCTCCTGCTGGGAAAACACAGGCCCTGGGCATATAAAAGCC
+>chr21_46086869_46086919_-
+GACAGGTGTGCTTCTGTGCTGTGGGGATGCCTGGGCCCAGGTATAAAGGC
+>chr21_46102103_46102153_-
+AGGTGTGTGCTTCTGTGCTGTGGGGATGCCTGGGTCCAGGTATAAAGGCT
+>chr21_47517957_47518007_+
+CCTGGCGGCGGGGCGGGTCAGGCCGGCGGGGCGGGGTATAAAGGGGGCGG
+>chr21_47517957_47518007_+
+CCTGGCGGCGGGGCGGGTCAGGCCGGCGGGGCGGGGTATAAAGGGGGCGG
+>chr21_47517957_47518007_+
+CCTGGCGGCGGGGCGGGTCAGGCCGGCGGGGCGGGGTATAAAGGGGGCGG
+>chr21_47575506_47575556_-
+TGAGAAGCCGGTGGGGAGGTGCTGCCGGTGAGCGTATAAAGGCCCTGGCG
+>chr21_47575506_47575556_-
+TGAGAAGCCGGTGGGGAGGTGCTGCCGGTGAGCGTATAAAGGCCCTGGCG
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/meme_output_html_1.html	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,95 @@
+<!DOCTYPE HTML>
+<html>
+  <head>
+    <meta charset="UTF-8">
+    <title>MEME</title>
+    <script>
+      // @JSON_VAR data
+      var data = {
+        "program": "MEME",
+        "stop_reason": "Stopped because requested number of motifs (1) found.",
+        "cmd": [
+          "meme",
+          "-nostatus"
+        ],
+        "options": {
+          "mod": "zoops",
+          "revcomp": false,
+          "nmotifs": 1,
+          "minw": 8,
+          "maxw": 50,
+          "minsites": 2,
+          "maxsites": 30,
+          "wnsites": 0.8,
+          "spmap": "pam",
+          "spfuzz": 120,
+          "maxwords": -1,
+          "prior": "megap",
+          "b": 7500,
+          "maxiter": 50,
+          "distance": 1e-05,
+          "wg": 11,
+          "ws": 1,
+          "noendgaps": false,
+          "substring": true
+        },
+        "alphabet": {
+          "name": "Protein",
+          "like": "protein",
+          "ncore": 20,
+          "symbols": [
+            {
+              "symbol": "A",
+              "name": "Alanine",
+              "colour": "0000CC"
+            }, {
+              "symbol": "C",
+              "name": "Cysteine",
+              "colour": "0000CC"
+            }, {
+              "symbol": "D",
+              "name": "Aspartic acid",
+              "colour": "FF00FF"
+            }, {
+              "symbol": "E",
+              "name": "Glutamic acid",
+              "colour": "FF00FF"
+            }, {
+              "symbol": "F",
+              "name": "Phenylalanine",
+              "colour": "0000CC"
+            }, {
+              "symbol": "G",
+              "name": "Glycine",
+              "colour": "FFB300"
+            }, {
+              "symbol": "H",
+              "name": "Histidine",
+              "colour": "FFCCCC"
+            }, {
+              "symbol": "I",
+              "name": "Isoleucine",
+              "colour": "0000CC"
+            }, {
+              "symbol": "K",
+              "name": "Lysine",
+              "colour": "CC0000"
+            }, {
+              "symbol": "L",
+              "name": "Leucine",
+              "colour": "0000CC"
+            }, {
+              "symbol": "M",
+              "name": "Methionine",
+              "colour": "0000CC"
+            }, {
+              "symbol": "N",
+              "name": "Asparagine",
+              "colour": "008000"
+            }, {
+              "symbol": "P",
+              "name": "Proline",
+              "colour": "FFFF00"
+            }, {
+              "symbol": "Q",
+              "name": "Glutamine",
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/meme_output_html_2.html	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML>
+<html>
+  <head>
+    <meta charset="UTF-8">
+    <title>MEME</title>
+    <script>
+      // @JSON_VAR data
+      var data = {
+        "program": "MEME",
+        "stop_reason": "Stopped because requested number of motifs (1) found.",
+        "cmd": [
+          "meme",
+        ],
+        "options": {
+          "mod": "zoops",
+          "revcomp": false,
+          "nmotifs": 1,
+          "minw": 8,
+          "maxw": 50,
+          "minsites": 2,
+          "maxsites": 30,
+          "wnsites": 0.8,
+          "spmap": "uni",
+          "spfuzz": 0.5,
+          "maxwords": -1,
+          "prior": "dirichlet",
+          "b": 0.01,
+          "maxiter": 50,
+          "distance": 0.001,
+          "wg": 11,
+          "ws": 1,
+          "noendgaps": false,
+          "substring": true
+        },
+        "alphabet": {
+          "name": "DNA",
+          "like": "dna",
+          "ncore": 4,
+          "symbols": [
+            {
+              "symbol": "A",
+              "name": "Adenine",
+              "colour": "CC0000",
+              "complement": "T"
+            }, {
+              "symbol": "C",
+              "name": "Cytosine",
+              "colour": "0000CC",
+              "complement": "G"
+            }, {
+              "symbol": "G",
+              "name": "Guanine",
+              "colour": "FFB300",
+              "complement": "C"
+            }, {
+              "symbol": "T",
+              "aliases": "U",
+              "name": "Thymine",
+              "colour": "008000",
+              "complement": "A"
+            }, {
+              "symbol": "N",
+              "aliases": "X.",
+              "name": "Any base",
+              "equals": "ACGT"
+            }, {
+              "symbol": "V",
+              "name": "Not T",
+              "equals": "ACG"
+            }, {
+              "symbol": "H",
+              "name": "Not G",
+              "equals": "ACT"
+            }, {
+              "symbol": "D",
+              "name": "Not C",
+              "equals": "AGT"
+            }, {
+              "symbol": "B",
+              "name": "Not A",
+              "equals": "CGT"
+            }, {
+              "symbol": "M",
+              "name": "Amino",
+              "equals": "AC"
+            }, {
+              "symbol": "R",
+              "name": "Purine",
+              "equals": "AG"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/meme_output_txt_1.txt	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,325 @@
+********************************************************************************
+MEME - Motif discovery tool
+********************************************************************************
+MEME version 4.11.2 (Release date: Thu May 05 14:58:55 2016 -0700)
+
+For further information on how to interpret these results or to get
+a copy of the MEME software please access http://meme-suite.org .
+
+This file may be used as input to the MAST algorithm for searching
+sequence databases for matches to groups of motifs.  MAST is available
+for interactive use and downloading at http://meme-suite.org .
+********************************************************************************
+
+
+********************************************************************************
+REFERENCE
+********************************************************************************
+If you use this program in your research, please cite:
+
+Timothy L. Bailey and Charles Elkan,
+"Fitting a mixture model by expectation maximization to discover
+motifs in biopolymers", Proceedings of the Second International
+Conference on Intelligent Systems for Molecular Biology, pp. 28-36,
+AAAI Press, Menlo Park, California, 1994.
+********************************************************************************
+
+
+********************************************************************************
+TRAINING SET
+********************************************************************************
+DATAFILE= /tmp/tmpCNK6l0/files/000/dataset_22.dat
+ALPHABET= ACDEFGHIKLMNPQRSTVWY
+Sequence name            Weight Length  Sequence name            Weight Length  
+-------------            ------ ------  -------------            ------ ------  
+chr21_19617074_19617124_ 1.0000     50  chr21_26934381_26934431_ 1.0000     50  
+chr21_28217753_28217803_ 1.0000     50  chr21_31710037_31710087_ 1.0000     50  
+chr21_31744582_31744632_ 1.0000     50  chr21_31768316_31768366_ 1.0000     50  
+chr21_31914206_31914256_ 1.0000     50  chr21_31933633_31933683_ 1.0000     50  
+chr21_31962741_31962791_ 1.0000     50  chr21_31964683_31964733_ 1.0000     50  
+chr21_31973364_31973414_ 1.0000     50  chr21_31992870_31992920_ 1.0000     50  
+chr21_32185595_32185645_ 1.0000     50  chr21_32202076_32202126_ 1.0000     50  
+chr21_32253899_32253949_ 1.0000     50  chr21_32410820_32410870_ 1.0000     50  
+chr21_36411748_36411798_ 1.0000     50  chr21_37838750_37838800_ 1.0000     50  
+chr21_45705687_45705737_ 1.0000     50  chr21_45971413_45971463_ 1.0000     50  
+chr21_45978668_45978718_ 1.0000     50  chr21_45993530_45993580_ 1.0000     50  
+chr21_46020421_46020471_ 1.0000     50  chr21_46031920_46031970_ 1.0000     50  
+chr21_46046964_46047014_ 1.0000     50  chr21_46057197_46057247_ 1.0000     50  
+chr21_46086869_46086919_ 1.0000     50  chr21_46102103_46102153_ 1.0000     50  
+chr21_47517957_47518007_ 1.0000     50  chr21_47575506_47575556_ 1.0000     50  
+********************************************************************************
+
+********************************************************************************
+COMMAND LINE SUMMARY
+********************************************************************************
+This information can also be useful in the event you wish to report a
+problem with the MEME software.
+
+command: meme /tmp/tmpCNK6l0/files/000/dataset_22.dat -o /tmp/tmpCNK6l0/job_working_directory/000/11/dataset_23_files -nostatus -maxsize 1000000 
+
+model:  mod=         zoops    nmotifs=         1    evt=           inf
+object function=  E-value of product of p-values
+width:  minw=            8    maxw=           50
+width:  wg=             11    ws=              1    endgaps=       yes
+nsites: minsites=        2    maxsites=       30    wnsites=       0.8
+theta:  spmap=         pam    spfuzz=        120
+global: substring=     yes    branching=      no    wbranch=        no
+em:     prior=       megap    b=            7500    maxiter=        50
+        distance=    1e-05
+data:   n=            1500    N=              30    shuffle=        -1
+
+sample: seed=            0    ctfrac=         -1    maxwords=       -1
+Dirichlet mixture priors file: prior30.plib
+Letter frequencies in dataset:
+A 0.294 C 0.231 D 0.000 E 0.000 F 0.000 G 0.257 H 0.000 I 0.000 K 0.000 
+L 0.000 M 0.000 N 0.000 P 0.000 Q 0.000 R 0.000 S 0.000 T 0.217 V 0.000 
+W 0.000 Y 0.000 
+Background letter frequencies (from dataset with add-one prior applied):
+A 0.291 C 0.229 D 0.001 E 0.001 F 0.001 G 0.255 H 0.001 I 0.001 K 0.001 
+L 0.001 M 0.001 N 0.001 P 0.001 Q 0.001 R 0.001 S 0.001 T 0.215 V 0.001 
+W 0.001 Y 0.001 
+********************************************************************************
+
+
+********************************************************************************
+MOTIF  1 MEME	width =  11  sites =  25  llr = 239  E-value = 2.4e-011
+********************************************************************************
+--------------------------------------------------------------------------------
+	Motif 1 Description
+--------------------------------------------------------------------------------
+Simplified        A  2323:a:a8a8
+pos.-specific     C  ::3::::::::
+probability       D  :::::::::::
+matrix            E  :::::::::::
+                  F  :::::::::::
+                  G  7746::::::1
+                  H  :::::::::::
+                  I  :::::::::::
+                  K  :::::::::::
+                  L  :::::::::::
+                  M  :::::::::::
+                  N  :::::::::::
+                  P  :::::::::::
+                  Q  :::::::::::
+                  R  :::::::::::
+                  S  :::::::::::
+                  T  1:2:a:a:2::
+                  V  :::::::::::
+                  W  :::::::::::
+                  Y  :::::::::::
+
+         bits   10.6            
+                 9.5            
+                 8.5            
+                 7.4            
+Relative         6.3            
+Entropy          5.3            
+(13.8 bits)      4.2            
+                 3.2            
+                 2.1     * **   
+                 1.1 ** ********
+                 0.0 -----------
+
+Multilevel           GGGGTATAAAA
+consensus            AACA    T  
+sequence                        
+                                
+                                
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+	Motif 1 sites sorted by position p-value
+--------------------------------------------------------------------------------
+Sequence name             Start   P-value               Site  
+-------------             ----- ---------            -----------
+chr21_46046964_46047014_     13  1.06e-06 AAGGCCAGGA GGGGTATAAAA GCCTGAGAGC
+chr21_46057197_46057247_     37  3.41e-06 ACAGGCCCTG GGCATATAAAA GCC       
+chr21_45971413_45971463_     10  3.41e-06  CAGGCCCTG GGCATATAAAA GCCCCAGCAG
+chr21_31964683_31964733_     14  3.41e-06 GATTCACTGA GGCATATAAAA GGCCCTCTGC
+chr21_45993530_45993580_      8  4.00e-06    CCAAGGA GGAGTATAAAA GCCCCACAAA
+chr21_32202076_32202126_     14  5.01e-06 CCACCAGCTT GAGGTATAAAA AGCCCTGTAC
+chr21_46031920_46031970_     16  6.06e-06 ATACCCAGGG AGGGTATAAAA CCTCAGCAGC
+chr21_32410820_32410870_     22  8.67e-06 AATCACTGAG GATGTATAAAA GTCCCAGGGA
+chr21_32185595_32185645_     19  8.67e-06 CACCAGAGCT GGGATATATAA AGAAGGTTCT
+chr21_31992870_31992920_     17  8.67e-06 CACTATTGAA GATGTATAAAA TTTCATTTGC
+chr21_46020421_46020471_      3  1.21e-05         GA GACATATAAAA GCCAACATCC
+chr21_47517957_47518007_     33  1.59e-05 CCGGCGGGGC GGGGTATAAAG GGGGCGG   
+chr21_45978668_45978718_      5  1.59e-05       CAGA GGGGTATAAAG GTTCCGACCA
+chr21_31914206_31914256_     16  1.68e-05 CCCACTACTT AGAGTATAAAA TCATTCTGAG
+chr21_32253899_32253949_     20  2.03e-05 CACCAGCAAG GATATATAAAA GCTCAGGAGT
+chr21_31744582_31744632_     13  3.06e-05 CAGGTCTAAG AGCATATATAA CTTGGAGTCC
+chr21_19617074_19617124_     40  3.06e-05 CCTCGGGACG TGGGTATATAA           
+chr21_45705687_45705737_     38  3.82e-05 CGTGGTCGCG GGGGTATAACA GC        
+chr21_31768316_31768366_      1  3.82e-05          . AACGTATATAA ATGGTCCTGT
+chr21_47575506_47575556_     31  4.02e-05 GCTGCCGGTG AGCGTATAAAG GCCCTGGCG 
+chr21_26934381_26934431_     28  5.52e-05 AGTCACAAGT GAGTTATAAAA GGGTCGCACG
+chr21_31710037_31710087_     15  5.94e-05 CCCAGGTTTC TGAGTATATAA TCGCCGCACC
+chr21_36411748_36411798_     23  6.78e-05 AGTTTCAGTT GGCATCtaaaa attatataac
+chr21_31933633_31933683_      3  2.08e-04         TC AGAGTATATAT AAATGTTCCT
+chr21_31962741_31962791_     14  4.05e-04 TATAACTCAG GTTGGATAAAA TAATTTGTAC
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+	Motif 1 block diagrams
+--------------------------------------------------------------------------------
+SEQUENCE NAME            POSITION P-VALUE  MOTIF DIAGRAM
+-------------            ----------------  -------------
+chr21_46046964_46047014_          1.1e-06  12_[1]_27
+chr21_46057197_46057247_          3.4e-06  36_[1]_3
+chr21_45971413_45971463_          3.4e-06  9_[1]_30
+chr21_31964683_31964733_          3.4e-06  13_[1]_26
+chr21_45993530_45993580_            4e-06  7_[1]_32
+chr21_32202076_32202126_            5e-06  13_[1]_26
+chr21_46031920_46031970_          6.1e-06  15_[1]_24
+chr21_32410820_32410870_          8.7e-06  21_[1]_18
+chr21_32185595_32185645_          8.7e-06  18_[1]_21
+chr21_31992870_31992920_          8.7e-06  16_[1]_23
+chr21_46020421_46020471_          1.2e-05  2_[1]_37
+chr21_47517957_47518007_          1.6e-05  32_[1]_7
+chr21_45978668_45978718_          1.6e-05  4_[1]_35
+chr21_31914206_31914256_          1.7e-05  15_[1]_24
+chr21_32253899_32253949_            2e-05  19_[1]_20
+chr21_31744582_31744632_          3.1e-05  12_[1]_27
+chr21_19617074_19617124_          3.1e-05  39_[1]
+chr21_45705687_45705737_          3.8e-05  37_[1]_2
+chr21_31768316_31768366_          3.8e-05  [1]_39
+chr21_47575506_47575556_            4e-05  30_[1]_9
+chr21_26934381_26934431_          5.5e-05  27_[1]_12
+chr21_31710037_31710087_          5.9e-05  14_[1]_25
+chr21_36411748_36411798_          6.8e-05  22_[1]_17
+chr21_31933633_31933683_          0.00021  2_[1]_37
+chr21_31962741_31962791_           0.0004  13_[1]_26
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+	Motif 1 in BLOCKS format
+--------------------------------------------------------------------------------
+BL   MOTIF 1 width=11 seqs=25
+chr21_46046964_46047014_ (   13) GGGGTATAAAA  1 
+chr21_46057197_46057247_ (   37) GGCATATAAAA  1 
+chr21_45971413_45971463_ (   10) GGCATATAAAA  1 
+chr21_31964683_31964733_ (   14) GGCATATAAAA  1 
+chr21_45993530_45993580_ (    8) GGAGTATAAAA  1 
+chr21_32202076_32202126_ (   14) GAGGTATAAAA  1 
+chr21_46031920_46031970_ (   16) AGGGTATAAAA  1 
+chr21_32410820_32410870_ (   22) GATGTATAAAA  1 
+chr21_32185595_32185645_ (   19) GGGATATATAA  1 
+chr21_31992870_31992920_ (   17) GATGTATAAAA  1 
+chr21_46020421_46020471_ (    3) GACATATAAAA  1 
+chr21_47517957_47518007_ (   33) GGGGTATAAAG  1 
+chr21_45978668_45978718_ (    5) GGGGTATAAAG  1 
+chr21_31914206_31914256_ (   16) AGAGTATAAAA  1 
+chr21_32253899_32253949_ (   20) GATATATAAAA  1 
+chr21_31744582_31744632_ (   13) AGCATATATAA  1 
+chr21_19617074_19617124_ (   40) TGGGTATATAA  1 
+chr21_45705687_45705737_ (   38) GGGGTATAACA  1 
+chr21_31768316_31768366_ (    1) AACGTATATAA  1 
+chr21_47575506_47575556_ (   31) AGCGTATAAAG  1 
+chr21_26934381_26934431_ (   28) GAGTTATAAAA  1 
+chr21_31710037_31710087_ (   15) TGAGTATATAA  1 
+chr21_36411748_36411798_ (   23) GGCATCTAAAA  1 
+chr21_31933633_31933683_ (    3) AGAGTATATAT  1 
+chr21_31962741_31962791_ (   14) GTTGGATAAAA  1 
+//
+
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+	Motif 1 position-specific scoring matrix
+--------------------------------------------------------------------------------
+log-odds matrix: alength= 20 w= 11 n= 1200 bayes= 5.33554 E= 2.4e-011 
+   -32   -680     91     77      7    138    -20     55     64    107     11    150    142     72     87    396   -148    221   -140    -36 
+   -11   -680     89     76      7    137    -21     55     63    107     10    149    141     71     87    396   -239    220   -140    -36 
+   -79     41      4     21     -7     44    -62     42     -5     99      0     99    138     52     42    399    -46    223   -173    -68 
+    11   -677     48     47     -2    127    -43     46     27    101      3    124    138     60     62    397   -235    220   -160    -55 
+  -596   -820     12    -21    -53   -267    -74     37     16     44    -37     98     31      9     19    319    212    127   -193    -95 
+   165   -261     70    110     77   -521     -4    147     95    201     90    121    124     91    107    425   -527    314    -95      8 
+  -838   -990    -89   -149   -151   -841   -161   -117   -113    -66   -209    -68    -69   -129    -91    111    221    -55   -255   -173 
+   176   -858    -79   -103   -115   -717   -148    -95   -108    -17   -162    -61    -12    -95    -69    193   -737     52   -240   -153 
+   134   -686      0     16    -12   -553    -68     44     -8     96     -9     88    124     41     36    384     11    216   -177    -71 
+   165   -261     70    110     77   -521     -4    147     95    201     90    121    124     91    107    425   -527    314    -95      8 
+   147   -614     89    129     93   -121     12    160    113    217    108    144    144    111    125    447   -241    332    -81     22 
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+	Motif 1 position-specific probability matrix
+--------------------------------------------------------------------------------
+letter-probability matrix: alength= 20 w= 11 nsites= 25 E= 2.4e-011 
+ 0.240000  0.000000  0.000000  0.000000  0.000000  0.680000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.080000  0.000000  0.000000  0.000000 
+ 0.280000  0.000000  0.000000  0.000000  0.000000  0.680000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.040000  0.000000  0.000000  0.000000 
+ 0.160000  0.320000  0.000000  0.000000  0.000000  0.360000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.160000  0.000000  0.000000  0.000000 
+ 0.320000  0.000000  0.000000  0.000000  0.000000  0.640000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.040000  0.000000  0.000000  0.000000 
+ 0.000000  0.000000  0.000000  0.000000  0.000000  0.040000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.960000  0.000000  0.000000  0.000000 
+ 0.960000  0.040000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000 
+ 0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  1.000000  0.000000  0.000000  0.000000 
+ 1.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000 
+ 0.760000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.240000  0.000000  0.000000  0.000000 
+ 0.960000  0.040000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000 
+ 0.840000  0.000000  0.000000  0.000000  0.000000  0.120000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.040000  0.000000  0.000000  0.000000 
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+	Motif 1 regular expression
+--------------------------------------------------------------------------------
+[GA][GA][GC][GA]TATA[AT]AA
+--------------------------------------------------------------------------------
+
+
+
+
+Time  0.72 secs.
+
+********************************************************************************
+
+
+********************************************************************************
+SUMMARY OF MOTIFS
+********************************************************************************
+
+--------------------------------------------------------------------------------
+	Combined block diagrams: non-overlapping sites with p-value < 0.0001
+--------------------------------------------------------------------------------
+SEQUENCE NAME            COMBINED P-VALUE  MOTIF DIAGRAM
+-------------            ----------------  -------------
+chr21_19617074_19617124_         1.22e-03  39_[1(3.06e-05)]
+chr21_26934381_26934431_         2.21e-03  27_[1(5.52e-05)]_12
+chr21_28217753_28217803_         7.29e-01  50
+chr21_31710037_31710087_         2.37e-03  14_[1(5.94e-05)]_25
+chr21_31744582_31744632_         1.22e-03  12_[1(3.06e-05)]_27
+chr21_31768316_31768366_         1.53e-03  [1(3.82e-05)]_39
+chr21_31914206_31914256_         6.70e-04  15_[1(1.68e-05)]_24
+chr21_31933633_31933683_         1.81e-03  4_[1(4.54e-05)]_35
+chr21_31962741_31962791_         1.61e-02  50
+chr21_31964683_31964733_         1.36e-04  13_[1(3.41e-06)]_26
+chr21_31973364_31973414_         1.99e-01  50
+chr21_31992870_31992920_         3.47e-04  16_[1(8.67e-06)]_23
+chr21_32185595_32185645_         3.47e-04  18_[1(8.67e-06)]_21
+chr21_32202076_32202126_         2.01e-04  13_[1(5.01e-06)]_26
+chr21_32253899_32253949_         8.11e-04  19_[1(2.03e-05)]_20
+chr21_32410820_32410870_         3.47e-04  21_[1(8.67e-06)]_18
+chr21_36411748_36411798_         2.71e-03  22_[1(6.78e-05)]_17
+chr21_37838750_37838800_         8.23e-02  50
+chr21_45705687_45705737_         1.53e-03  37_[1(3.82e-05)]_2
+chr21_45971413_45971463_         1.36e-04  9_[1(3.41e-06)]_30
+chr21_45978668_45978718_         6.37e-04  4_[1(1.59e-05)]_35
+chr21_45993530_45993580_         1.60e-04  7_[1(4.00e-06)]_32
+chr21_46020421_46020471_         4.83e-04  2_[1(1.21e-05)]_37
+chr21_46031920_46031970_         2.43e-04  15_[1(6.06e-06)]_24
+chr21_46046964_46047014_         4.26e-05  12_[1(1.06e-06)]_27
+chr21_46057197_46057247_         1.36e-04  36_[1(3.41e-06)]_3
+chr21_46086869_46086919_         4.30e-02  50
+chr21_46102103_46102153_         4.30e-02  50
+chr21_47517957_47518007_         6.37e-04  32_[1(1.59e-05)]_7
+chr21_47575506_47575556_         1.61e-03  30_[1(4.02e-05)]_9
+--------------------------------------------------------------------------------
+
+********************************************************************************
+
+
+********************************************************************************
+Stopped because requested number of motifs (1) found.
+********************************************************************************
+
+CPU: bigsky
+
+********************************************************************************
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/meme_output_txt_2.txt	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,319 @@
+********************************************************************************
+MEME - Motif discovery tool
+********************************************************************************
+MEME version 4.11.2 (Release date: Thu May 05 14:58:55 2016 -0700)
+
+For further information on how to interpret these results or to get
+a copy of the MEME software please access http://meme-suite.org .
+
+This file may be used as input to the MAST algorithm for searching
+sequence databases for matches to groups of motifs.  MAST is available
+for interactive use and downloading at http://meme-suite.org .
+********************************************************************************
+
+
+********************************************************************************
+REFERENCE
+********************************************************************************
+If you use this program in your research, please cite:
+
+Timothy L. Bailey and Charles Elkan,
+"Fitting a mixture model by expectation maximization to discover
+motifs in biopolymers", Proceedings of the Second International
+Conference on Intelligent Systems for Molecular Biology, pp. 28-36,
+AAAI Press, Menlo Park, California, 1994.
+********************************************************************************
+
+
+********************************************************************************
+TRAINING SET
+********************************************************************************
+DATAFILE= Galaxy_FASTA_Input
+ALPHABET= ACGT
+Sequence name            Weight Length  Sequence name            Weight Length  
+-------------            ------ ------  -------------            ------ ------  
+chr21_19617074_19617124_ 1.0000     50  chr21_26934381_26934431_ 1.0000     50  
+chr21_28217753_28217803_ 1.0000     50  chr21_31710037_31710087_ 1.0000     50  
+chr21_31744582_31744632_ 1.0000     50  chr21_31768316_31768366_ 1.0000     50  
+chr21_31914206_31914256_ 1.0000     50  chr21_31933633_31933683_ 1.0000     50  
+chr21_31962741_31962791_ 1.0000     50  chr21_31964683_31964733_ 1.0000     50  
+chr21_31973364_31973414_ 1.0000     50  chr21_31992870_31992920_ 1.0000     50  
+chr21_32185595_32185645_ 1.0000     50  chr21_32202076_32202126_ 1.0000     50  
+chr21_32253899_32253949_ 1.0000     50  chr21_32410820_32410870_ 1.0000     50  
+chr21_36411748_36411798_ 1.0000     50  chr21_37838750_37838800_ 1.0000     50  
+chr21_45705687_45705737_ 1.0000     50  chr21_45971413_45971463_ 1.0000     50  
+chr21_45978668_45978718_ 1.0000     50  chr21_45993530_45993580_ 1.0000     50  
+chr21_46020421_46020471_ 1.0000     50  chr21_46031920_46031970_ 1.0000     50  
+chr21_46046964_46047014_ 1.0000     50  chr21_46057197_46057247_ 1.0000     50  
+chr21_46086869_46086919_ 1.0000     50  chr21_46102103_46102153_ 1.0000     50  
+chr21_47517957_47518007_ 1.0000     50  chr21_47575506_47575556_ 1.0000     50  
+********************************************************************************
+
+********************************************************************************
+COMMAND LINE SUMMARY
+********************************************************************************
+This information can also be useful in the event you wish to report a
+problem with the MEME software.
+
+command: meme /tmp/tmpCNK6l0/files/000/dataset_26.dat -o /tmp/tmpCNK6l0/job_working_directory/000/14/dataset_28_files -nostatus -maxsize 1000000 -sf Galaxy_FASTA_Input -dna -mod zoops -nmotifs 1 -wnsites 0.8 -evt inf -minw 8 -maxw 50 -wg 11 -ws 1 -maxiter 50 -distance 0.001 -prior dirichlet -b 0.01 -plib /tmp/tmpCNK6l0/files/000/dataset_27.dat -spmap uni -spfuzz 0.5 
+
+model:  mod=         zoops    nmotifs=         1    evt=           inf
+object function=  E-value of product of p-values
+width:  minw=            8    maxw=           50
+width:  wg=             11    ws=              1    endgaps=       yes
+nsites: minsites=        2    maxsites=       30    wnsites=       0.8
+theta:  spmap=         uni    spfuzz=        0.5
+global: substring=     yes    branching=      no    wbranch=        no
+em:     prior=   dirichlet    b=            0.01    maxiter=        50
+        distance=    0.001
+data:   n=            1500    N=              30    shuffle=        -1
+strands: +
+sample: seed=            0    ctfrac=         -1    maxwords=       -1
+Dirichlet mixture priors file: dataset_27.dat
+Letter frequencies in dataset:
+A 0.294 C 0.231 G 0.257 T 0.217 
+Background letter frequencies (from dataset with add-one prior applied):
+A 0.294 C 0.231 G 0.257 T 0.217 
+********************************************************************************
+
+
+********************************************************************************
+MOTIF  1 MEME	width =  11  sites =  30  llr = 254  E-value = 5.1e-040
+********************************************************************************
+--------------------------------------------------------------------------------
+	Motif 1 Description
+--------------------------------------------------------------------------------
+Simplified        A  3313:9:a798
+pos.-specific     C  1:3::1:::1:
+probability       G  6756::::::2
+matrix            T  1:11a1a:3::
+
+         bits    2.2       *    
+                 2.0     * *    
+                 1.8     * *    
+                 1.5     * ** * 
+Relative         1.3     * ** * 
+Entropy          1.1     ****** 
+(12.2 bits)      0.9  *  *******
+                 0.7  *  *******
+                 0.4 ** ********
+                 0.2 ***********
+                 0.0 -----------
+
+Multilevel           GGGGTATAAAA
+consensus            AACA    T  
+sequence                        
+                                
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+	Motif 1 sites sorted by position p-value
+--------------------------------------------------------------------------------
+Sequence name             Start   P-value               Site  
+-------------             ----- ---------            -----------
+chr21_46046964_46047014_     13  4.51e-07 AAGGCCAGGA GGGGTATAAAA GCCTGAGAGC
+chr21_46031920_46031970_     16  2.22e-06 ATACCCAGGG AGGGTATAAAA CCTCAGCAGC
+chr21_32202076_32202126_     14  2.74e-06 CCACCAGCTT GAGGTATAAAA AGCCCTGTAC
+chr21_46057197_46057247_     37  4.86e-06 ACAGGCCCTG GGCATATAAAA GCC       
+chr21_45993530_45993580_      8  4.86e-06    CCAAGGA GGAGTATAAAA GCCCCACAAA
+chr21_45971413_45971463_     10  4.86e-06  CAGGCCCTG GGCATATAAAA GCCCCAGCAG
+chr21_31964683_31964733_     14  4.86e-06 GATTCACTGA GGCATATAAAA GGCCCTCTGC
+chr21_47517957_47518007_     33  6.48e-06 CCGGCGGGGC GGGGTATAAAG GGGGCGG   
+chr21_45978668_45978718_      5  6.48e-06       CAGA GGGGTATAAAG GTTCCGACCA
+chr21_32185595_32185645_     19  6.48e-06 CACCAGAGCT GGGATATATAA AGAAGGTTCT
+chr21_32410820_32410870_     22  1.38e-05 AATCACTGAG GATGTATAAAA GTCCCAGGGA
+chr21_31992870_31992920_     17  1.38e-05 CACTATTGAA GATGTATAAAA TTTCATTTGC
+chr21_19617074_19617124_     40  1.41e-05 CCTCGGGACG TGGGTATATAA           
+chr21_31914206_31914256_     16  1.61e-05 CCCACTACTT AGAGTATAAAA TCATTCTGAG
+chr21_46020421_46020471_      3  1.95e-05         GA GACATATAAAA GCCAACATCC
+chr21_32253899_32253949_     18  1.95e-05 CCCACCAGCA AGGATATATAA AAGCTCAGGA
+chr21_45705687_45705737_     38  2.16e-05 CGTGGTCGCG GGGGTATAACA GC        
+chr21_47575506_47575556_     31  3.04e-05 GCTGCCGGTG AGCGTATAAAG GCCCTGGCG 
+chr21_31744582_31744632_     13  3.04e-05 CAGGTCTAAG AGCATATATAA CTTGGAGTCC
+chr21_31768316_31768366_      1  3.67e-05          . AACGTATATAA ATGGTCCTGT
+chr21_26934381_26934431_     28  3.93e-05 AGTCACAAGT GAGTTATAAAA GGGTCGCACG
+chr21_31933633_31933683_      5  5.65e-05       TCAG AGTATATATAA ATGTTCCTGT
+chr21_31710037_31710087_     15  6.24e-05 CCCAGGTTTC TGAGTATATAA TCGCCGCACC
+chr21_36411748_36411798_     23  7.15e-05 AGTTTCAGTT GGCATCtaaaa attatataac
+chr21_46102103_46102153_     37  1.39e-04 TGCCTGGGTC CAGGTATAAAG GCT       
+chr21_46086869_46086919_     38  1.39e-04 TGCCTGGGCC CAGGTATAAAG GC        
+chr21_37838750_37838800_      3  4.81e-04         ga tggttttataa ggggcctcac
+chr21_31962741_31962791_     14  8.57e-04 TATAACTCAG GTTGGATAAAA TAATTTGTAC
+chr21_31973364_31973414_      8  1.47e-03    aaactta aaactctataa acttaaaact
+chr21_28217753_28217803_     27  2.64e-03 GGTGGGGGTG GGGGTTTCACT GGTCCACTAT
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+	Motif 1 block diagrams
+--------------------------------------------------------------------------------
+SEQUENCE NAME            POSITION P-VALUE  MOTIF DIAGRAM
+-------------            ----------------  -------------
+chr21_46046964_46047014_          4.5e-07  12_[+1]_27
+chr21_46031920_46031970_          2.2e-06  15_[+1]_24
+chr21_32202076_32202126_          2.7e-06  13_[+1]_26
+chr21_46057197_46057247_          4.9e-06  36_[+1]_3
+chr21_45993530_45993580_          4.9e-06  7_[+1]_32
+chr21_45971413_45971463_          4.9e-06  9_[+1]_30
+chr21_31964683_31964733_          4.9e-06  13_[+1]_26
+chr21_47517957_47518007_          6.5e-06  32_[+1]_7
+chr21_45978668_45978718_          6.5e-06  4_[+1]_35
+chr21_32185595_32185645_          6.5e-06  18_[+1]_21
+chr21_32410820_32410870_          1.4e-05  21_[+1]_18
+chr21_31992870_31992920_          1.4e-05  16_[+1]_23
+chr21_19617074_19617124_          1.4e-05  39_[+1]
+chr21_31914206_31914256_          1.6e-05  15_[+1]_24
+chr21_46020421_46020471_          1.9e-05  2_[+1]_37
+chr21_32253899_32253949_          1.9e-05  17_[+1]_22
+chr21_45705687_45705737_          2.2e-05  37_[+1]_2
+chr21_47575506_47575556_            3e-05  30_[+1]_9
+chr21_31744582_31744632_            3e-05  12_[+1]_27
+chr21_31768316_31768366_          3.7e-05  [+1]_39
+chr21_26934381_26934431_          3.9e-05  27_[+1]_12
+chr21_31933633_31933683_          5.6e-05  4_[+1]_35
+chr21_31710037_31710087_          6.2e-05  14_[+1]_25
+chr21_36411748_36411798_          7.1e-05  22_[+1]_17
+chr21_46102103_46102153_          0.00014  36_[+1]_3
+chr21_46086869_46086919_          0.00014  37_[+1]_2
+chr21_37838750_37838800_          0.00048  2_[+1]_37
+chr21_31962741_31962791_          0.00086  13_[+1]_26
+chr21_31973364_31973414_           0.0015  7_[+1]_32
+chr21_28217753_28217803_           0.0026  26_[+1]_13
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+	Motif 1 in BLOCKS format
+--------------------------------------------------------------------------------
+BL   MOTIF 1 width=11 seqs=30
+chr21_46046964_46047014_ (   13) GGGGTATAAAA  1 
+chr21_46031920_46031970_ (   16) AGGGTATAAAA  1 
+chr21_32202076_32202126_ (   14) GAGGTATAAAA  1 
+chr21_46057197_46057247_ (   37) GGCATATAAAA  1 
+chr21_45993530_45993580_ (    8) GGAGTATAAAA  1 
+chr21_45971413_45971463_ (   10) GGCATATAAAA  1 
+chr21_31964683_31964733_ (   14) GGCATATAAAA  1 
+chr21_47517957_47518007_ (   33) GGGGTATAAAG  1 
+chr21_45978668_45978718_ (    5) GGGGTATAAAG  1 
+chr21_32185595_32185645_ (   19) GGGATATATAA  1 
+chr21_32410820_32410870_ (   22) GATGTATAAAA  1 
+chr21_31992870_31992920_ (   17) GATGTATAAAA  1 
+chr21_19617074_19617124_ (   40) TGGGTATATAA  1 
+chr21_31914206_31914256_ (   16) AGAGTATAAAA  1 
+chr21_46020421_46020471_ (    3) GACATATAAAA  1 
+chr21_32253899_32253949_ (   18) AGGATATATAA  1 
+chr21_45705687_45705737_ (   38) GGGGTATAACA  1 
+chr21_47575506_47575556_ (   31) AGCGTATAAAG  1 
+chr21_31744582_31744632_ (   13) AGCATATATAA  1 
+chr21_31768316_31768366_ (    1) AACGTATATAA  1 
+chr21_26934381_26934431_ (   28) GAGTTATAAAA  1 
+chr21_31933633_31933683_ (    5) AGTATATATAA  1 
+chr21_31710037_31710087_ (   15) TGAGTATATAA  1 
+chr21_36411748_36411798_ (   23) GGCATCTAAAA  1 
+chr21_46102103_46102153_ (   37) CAGGTATAAAG  1 
+chr21_46086869_46086919_ (   38) CAGGTATAAAG  1 
+chr21_37838750_37838800_ (    3) TGGTTTTATAA  1 
+chr21_31962741_31962791_ (   14) GTTGGATAAAA  1 
+chr21_31973364_31973414_ (    8) AAACTCTATAA  1 
+chr21_28217753_28217803_ (   27) GGGGTTTCACT  1 
+//
+
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+	Motif 1 position-specific scoring matrix
+--------------------------------------------------------------------------------
+log-odds matrix: alength= 4 w= 11 n= 1200 bayes= 5.2854 E= 5.1e-040 
+   -14   -179    114   -112 
+     3  -1155    137   -270 
+  -114     20     86    -71 
+     3   -279    122   -170 
+ -1155  -1155   -295    215 
+   156   -179  -1155   -170 
+ -1155  -1155  -1155    220 
+   172   -279  -1155  -1155 
+   125  -1155  -1155     46 
+   167   -179  -1155  -1155 
+   144  -1155    -63   -270 
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+	Motif 1 position-specific probability matrix
+--------------------------------------------------------------------------------
+letter-probability matrix: alength= 4 w= 11 nsites= 30 E= 5.1e-040 
+ 0.266667  0.066667  0.566667  0.100000 
+ 0.300000  0.000000  0.666667  0.033333 
+ 0.133333  0.266667  0.466667  0.133333 
+ 0.300000  0.033333  0.600000  0.066667 
+ 0.000000  0.000000  0.033333  0.966667 
+ 0.866667  0.066667  0.000000  0.066667 
+ 0.000000  0.000000  0.000000  1.000000 
+ 0.966667  0.033333  0.000000  0.000000 
+ 0.700000  0.000000  0.000000  0.300000 
+ 0.933333  0.066667  0.000000  0.000000 
+ 0.800000  0.000000  0.166667  0.033333 
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+	Motif 1 regular expression
+--------------------------------------------------------------------------------
+[GA][GA][GC][GA]TATA[AT]AA
+--------------------------------------------------------------------------------
+
+
+
+
+Time  0.32 secs.
+
+********************************************************************************
+
+
+********************************************************************************
+SUMMARY OF MOTIFS
+********************************************************************************
+
+--------------------------------------------------------------------------------
+	Combined block diagrams: non-overlapping sites with p-value < 0.0001
+--------------------------------------------------------------------------------
+SEQUENCE NAME            COMBINED P-VALUE  MOTIF DIAGRAM
+-------------            ----------------  -------------
+chr21_19617074_19617124_         5.63e-04  39_[+1(1.41e-05)]
+chr21_26934381_26934431_         1.57e-03  27_[+1(3.93e-05)]_12
+chr21_28217753_28217803_         1.00e-01  50
+chr21_31710037_31710087_         2.49e-03  14_[+1(6.24e-05)]_25
+chr21_31744582_31744632_         1.22e-03  12_[+1(3.04e-05)]_27
+chr21_31768316_31768366_         1.47e-03  [+1(3.67e-05)]_39
+chr21_31914206_31914256_         6.45e-04  15_[+1(1.61e-05)]_24
+chr21_31933633_31933683_         2.26e-03  4_[+1(5.65e-05)]_35
+chr21_31962741_31962791_         3.37e-02  50
+chr21_31964683_31964733_         1.95e-04  13_[+1(4.86e-06)]_26
+chr21_31973364_31973414_         5.73e-02  50
+chr21_31992870_31992920_         5.52e-04  16_[+1(1.38e-05)]_23
+chr21_32185595_32185645_         2.59e-04  18_[+1(6.48e-06)]_21
+chr21_32202076_32202126_         1.10e-04  13_[+1(2.74e-06)]_26
+chr21_32253899_32253949_         7.78e-04  17_[+1(1.95e-05)]_22
+chr21_32410820_32410870_         5.52e-04  21_[+1(1.38e-05)]_18
+chr21_36411748_36411798_         2.85e-03  22_[+1(7.15e-05)]_17
+chr21_37838750_37838800_         1.90e-02  50
+chr21_45705687_45705737_         8.63e-04  37_[+1(2.16e-05)]_2
+chr21_45971413_45971463_         1.95e-04  9_[+1(4.86e-06)]_30
+chr21_45978668_45978718_         2.59e-04  4_[+1(6.48e-06)]_35
+chr21_45993530_45993580_         1.95e-04  7_[+1(4.86e-06)]_32
+chr21_46020421_46020471_         7.78e-04  2_[+1(1.95e-05)]_37
+chr21_46031920_46031970_         8.89e-05  15_[+1(2.22e-06)]_24
+chr21_46046964_46047014_         1.80e-05  12_[+1(4.51e-07)]_27
+chr21_46057197_46057247_         1.95e-04  36_[+1(4.86e-06)]_3
+chr21_46086869_46086919_         5.54e-03  50
+chr21_46102103_46102153_         5.54e-03  50
+chr21_47517957_47518007_         2.59e-04  32_[+1(6.48e-06)]_7
+chr21_47575506_47575556_         1.22e-03  30_[+1(3.04e-05)]_9
+--------------------------------------------------------------------------------
+
+********************************************************************************
+
+
+********************************************************************************
+Stopped because requested number of motifs (1) found.
+********************************************************************************
+
+CPU: bigsky
+
+********************************************************************************
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/meme_output_xml_1.xml	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,1285 @@
+<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
+<!-- Document definition -->
+<!DOCTYPE MEME[
+<!ELEMENT MEME (
+  training_set,
+  model, 
+  motifs, 
+  scanned_sites_summary?
+)>
+<!ATTLIST MEME 
+  version CDATA #REQUIRED
+  release CDATA #REQUIRED
+>
+<!-- Training-set elements -->
+<!ELEMENT training_set (alphabet, ambigs, sequence*, letter_frequencies)>
+<!ATTLIST training_set datafile CDATA #REQUIRED length CDATA #REQUIRED>
+<!ELEMENT alphabet (letter*)>
+<!ATTLIST alphabet name CDATA #REQUIRED>
+<!ELEMENT ambigs (letter*)>
+<!ELEMENT letter EMPTY>
+<!ATTLIST letter id ID #REQUIRED>
+<!ATTLIST letter symbol CDATA #REQUIRED>
+<!ATTLIST letter equals CDATA #IMPLIED>
+<!ATTLIST letter aliases CDATA #IMPLIED>
+<!ATTLIST letter complement CDATA #IMPLIED>
+<!ATTLIST letter name CDATA #IMPLIED>
+<!ATTLIST letter colour CDATA #IMPLIED>
+<!ELEMENT sequence EMPTY>
+<!ATTLIST sequence id ID #REQUIRED
+                   name CDATA #REQUIRED
+                   length CDATA #REQUIRED
+                   weight CDATA #REQUIRED
+>
+<!ELEMENT letter_frequencies (alphabet_array)>
+
+<!-- Model elements -->
+<!ELEMENT model (
+  command_line,
+  host,
+  type,
+  nmotifs,
+  evalue_threshold,
+  object_function,
+  min_width,
+  max_width,
+  minic,
+  wg,
+  ws,
+  endgaps,
+  minsites,
+  maxsites,
+  wnsites,
+  prob,
+  spmap,
+  spfuzz,
+  prior,
+  beta,
+  maxiter,
+  distance,
+  num_sequences,
+  num_positions,
+  seed,
+  seqfrac,
+  strands,
+  priors_file,
+  reason_for_stopping,
+  background_frequencies
+)>
+<!ELEMENT command_line (#PCDATA)*>
+<!ELEMENT host (#PCDATA)*>
+<!ELEMENT type (#PCDATA)*>
+<!ELEMENT nmotifs (#PCDATA)*>
+<!ELEMENT evalue_threshold (#PCDATA)*>
+<!ELEMENT object_function (#PCDATA)*>
+<!ELEMENT min_width (#PCDATA)*>
+<!ELEMENT max_width (#PCDATA)*>
+<!ELEMENT minic (#PCDATA)*>
+<!ELEMENT wg (#PCDATA)*>
+<!ELEMENT ws (#PCDATA)*>
+<!ELEMENT endgaps (#PCDATA)*>
+<!ELEMENT minsites (#PCDATA)*>
+<!ELEMENT maxsites (#PCDATA)*>
+<!ELEMENT wnsites (#PCDATA)*>
+<!ELEMENT prob (#PCDATA)*>
+<!ELEMENT spmap (#PCDATA)*>
+<!ELEMENT spfuzz (#PCDATA)*>
+<!ELEMENT prior (#PCDATA)*>
+<!ELEMENT beta (#PCDATA)*>
+<!ELEMENT maxiter (#PCDATA)*>
+<!ELEMENT distance (#PCDATA)*>
+<!ELEMENT num_sequences (#PCDATA)*>
+<!ELEMENT num_positions (#PCDATA)*>
+<!ELEMENT seed (#PCDATA)*>
+<!ELEMENT seqfrac (#PCDATA)*>
+<!ELEMENT strands (#PCDATA)*>
+<!ELEMENT priors_file (#PCDATA)*>
+<!ELEMENT reason_for_stopping (#PCDATA)*>
+<!ELEMENT background_frequencies (alphabet_array)>
+<!ATTLIST background_frequencies source CDATA #REQUIRED>
+
+<!-- Motif elements -->
+<!ELEMENT motifs (motif*)>
+<!ELEMENT motif (scores, probabilities, regular_expression?, contributing_sites)>
+<!ATTLIST motif id ID #REQUIRED
+                name CDATA #REQUIRED
+                width CDATA #REQUIRED
+                sites CDATA #REQUIRED
+                llr CDATA #REQUIRED
+                ic CDATA #REQUIRED
+                re CDATA #REQUIRED
+                bayes_threshold CDATA #REQUIRED
+                e_value CDATA #REQUIRED
+                elapsed_time CDATA #REQUIRED
+                url CDATA ""
+>
+<!ELEMENT scores (alphabet_matrix)>
+<!ELEMENT probabilities (alphabet_matrix)>
+<!ELEMENT regular_expression (#PCDATA)*>
+
+<!-- Contributing site elements -->
+<!-- Contributing sites are motif occurences found during the motif discovery phase -->
+<!ELEMENT contributing_sites (contributing_site*)>
+<!ELEMENT contributing_site (left_flank, site, right_flank)>
+<!ATTLIST contributing_site sequence_id IDREF #REQUIRED
+                          position CDATA #REQUIRED
+                          strand (plus|minus|none) 'none'
+                          pvalue CDATA #REQUIRED
+>
+<!-- The left_flank contains the sequence for 10 bases to the left of the motif start -->
+<!ELEMENT left_flank (#PCDATA)>
+<!-- The site contains the sequence for the motif instance -->
+<!ELEMENT site (letter_ref*)>
+<!-- The right_flank contains the sequence for 10 bases to the right of the motif end -->
+<!ELEMENT right_flank (#PCDATA)>
+
+<!-- Scanned site elements -->
+<!-- Scanned sites are motif occurences found during the sequence scan phase -->
+<!ELEMENT scanned_sites_summary (scanned_sites*)>
+<!ATTLIST scanned_sites_summary p_thresh CDATA #REQUIRED>
+<!ELEMENT scanned_sites (scanned_site*)>
+<!ATTLIST scanned_sites sequence_id IDREF #REQUIRED
+                        pvalue CDATA #REQUIRED
+                        num_sites CDATA #REQUIRED>
+<!ELEMENT scanned_site EMPTY>
+<!ATTLIST scanned_site  motif_id IDREF #REQUIRED
+                        strand (plus|minus|none) 'none'
+                        position CDATA #REQUIRED
+                        pvalue CDATA #REQUIRED>
+
+<!-- Utility elements -->
+<!-- A reference to a letter in the alphabet -->
+<!ELEMENT letter_ref EMPTY>
+<!ATTLIST letter_ref letter_id IDREF #REQUIRED>
+<!-- A alphabet-array contains one floating point value for each letter in an alphabet -->
+<!ELEMENT alphabet_array (value*)>
+<!ELEMENT value (#PCDATA)>
+<!ATTLIST value letter_id IDREF #REQUIRED>
+
+<!-- A alphabet_matrix contains one alphabet_array for each position in a motif -->
+<!ELEMENT alphabet_matrix (alphabet_array*)>
+
+]>
+<!-- Begin document body -->
+<MEME version="4.11.2" release="Thu May 05 14:58:55 2016 -0700">
+<training_set datafile="/Users/gvk/work/git_workspace/galaxy/database/files/002/dataset_2490.dat" length="30">
+<alphabet name="Protein" like="protein">
+<letter id="A" symbol="A" name="Alanine" colour="0000CC"/>
+<letter id="C" symbol="C" name="Cysteine" colour="0000CC"/>
+<letter id="D" symbol="D" name="Aspartic acid" colour="FF00FF"/>
+<letter id="E" symbol="E" name="Glutamic acid" colour="FF00FF"/>
+<letter id="F" symbol="F" name="Phenylalanine" colour="0000CC"/>
+<letter id="G" symbol="G" name="Glycine" colour="FFB300"/>
+<letter id="H" symbol="H" name="Histidine" colour="FFCCCC"/>
+<letter id="I" symbol="I" name="Isoleucine" colour="0000CC"/>
+<letter id="K" symbol="K" name="Lysine" colour="CC0000"/>
+<letter id="L" symbol="L" name="Leucine" colour="0000CC"/>
+<letter id="M" symbol="M" name="Methionine" colour="0000CC"/>
+<letter id="N" symbol="N" name="Asparagine" colour="008000"/>
+<letter id="P" symbol="P" name="Proline" colour="FFFF00"/>
+<letter id="Q" symbol="Q" name="Glutamine" colour="008000"/>
+<letter id="R" symbol="R" name="Arginine" colour="CC0000"/>
+<letter id="S" symbol="S" name="Serine" colour="008000"/>
+<letter id="T" symbol="T" name="Threonine" colour="008000"/>
+<letter id="V" symbol="V" name="Valine" colour="0000CC"/>
+<letter id="W" symbol="W" name="Tryptophan" colour="0000CC"/>
+<letter id="Y" symbol="Y" name="Tyrosine" colour="33E6CC"/>
+<letter id="X" symbol="X" aliases="*." equals="ACDEFGHIKLMNPQRSTVWY" name="Any amino acid"/>
+<letter id="B" symbol="B" equals="DN" name="Asparagine or Aspartic acid"/>
+<letter id="Z" symbol="Z" equals="EQ" name="Glutamine or Glutamic acid"/>
+<letter id="J" symbol="J" equals="IL" name="Leucine or Isoleucine"/>
+</alphabet>
+<sequence id="sequence_0" name="chr21_19617074_19617124_+" length="50" weight="1.000000" />
+<sequence id="sequence_1" name="chr21_26934381_26934431_+" length="50" weight="1.000000" />
+<sequence id="sequence_2" name="chr21_28217753_28217803_-" length="50" weight="1.000000" />
+<sequence id="sequence_3" name="chr21_31710037_31710087_-" length="50" weight="1.000000" />
+<sequence id="sequence_4" name="chr21_31744582_31744632_-" length="50" weight="1.000000" />
+<sequence id="sequence_5" name="chr21_31768316_31768366_+" length="50" weight="1.000000" />
+<sequence id="sequence_6" name="chr21_31914206_31914256_-" length="50" weight="1.000000" />
+<sequence id="sequence_7" name="chr21_31933633_31933683_-" length="50" weight="1.000000" />
+<sequence id="sequence_8" name="chr21_31962741_31962791_-" length="50" weight="1.000000" />
+<sequence id="sequence_9" name="chr21_31964683_31964733_+" length="50" weight="1.000000" />
+<sequence id="sequence_10" name="chr21_31973364_31973414_+" length="50" weight="1.000000" />
+<sequence id="sequence_11" name="chr21_31992870_31992920_+" length="50" weight="1.000000" />
+<sequence id="sequence_12" name="chr21_32185595_32185645_-" length="50" weight="1.000000" />
+<sequence id="sequence_13" name="chr21_32202076_32202126_-" length="50" weight="1.000000" />
+<sequence id="sequence_14" name="chr21_32253899_32253949_-" length="50" weight="1.000000" />
+<sequence id="sequence_15" name="chr21_32410820_32410870_-" length="50" weight="1.000000" />
+<sequence id="sequence_16" name="chr21_36411748_36411798_-" length="50" weight="1.000000" />
+<sequence id="sequence_17" name="chr21_37838750_37838800_-" length="50" weight="1.000000" />
+<sequence id="sequence_18" name="chr21_45705687_45705737_+" length="50" weight="1.000000" />
+<sequence id="sequence_19" name="chr21_45971413_45971463_-" length="50" weight="1.000000" />
+<sequence id="sequence_20" name="chr21_45978668_45978718_-" length="50" weight="1.000000" />
+<sequence id="sequence_21" name="chr21_45993530_45993580_+" length="50" weight="1.000000" />
+<sequence id="sequence_22" name="chr21_46020421_46020471_+" length="50" weight="1.000000" />
+<sequence id="sequence_23" name="chr21_46031920_46031970_+" length="50" weight="1.000000" />
+<sequence id="sequence_24" name="chr21_46046964_46047014_+" length="50" weight="1.000000" />
+<sequence id="sequence_25" name="chr21_46057197_46057247_+" length="50" weight="1.000000" />
+<sequence id="sequence_26" name="chr21_46086869_46086919_-" length="50" weight="1.000000" />
+<sequence id="sequence_27" name="chr21_46102103_46102153_-" length="50" weight="1.000000" />
+<sequence id="sequence_28" name="chr21_47517957_47518007_+" length="50" weight="1.000000" />
+<sequence id="sequence_29" name="chr21_47575506_47575556_-" length="50" weight="1.000000" />
+<letter_frequencies>
+<alphabet_array>
+<value letter_id="A">0.294</value>
+<value letter_id="C">0.231</value>
+<value letter_id="D">0.000</value>
+<value letter_id="E">0.000</value>
+<value letter_id="F">0.000</value>
+<value letter_id="G">0.257</value>
+<value letter_id="H">0.000</value>
+<value letter_id="I">0.000</value>
+<value letter_id="K">0.000</value>
+<value letter_id="L">0.000</value>
+<value letter_id="M">0.000</value>
+<value letter_id="N">0.000</value>
+<value letter_id="P">0.000</value>
+<value letter_id="Q">0.000</value>
+<value letter_id="R">0.000</value>
+<value letter_id="S">0.000</value>
+<value letter_id="T">0.217</value>
+<value letter_id="V">0.000</value>
+<value letter_id="W">0.000</value>
+<value letter_id="Y">0.000</value>
+</alphabet_array>
+</letter_frequencies>
+</training_set>
+<model>
+<command_line>meme /Users/gvk/work/git_workspace/galaxy/database/files/002/dataset_2490.dat -o /Users/gvk/work/git_workspace/galaxy/database/job_working_directory/001/1912/dataset_2530_files -nostatus </command_line>
+<host>MacBook-Pro-2.local</host>
+<type>zoops</type>
+<nmotifs>1</nmotifs>
+<evalue_threshold>inf</evalue_threshold>
+<object_function>E-value of product of p-values</object_function>
+<use_llr>0</use_llr>
+<min_width>8</min_width>
+<max_width>50</max_width>
+<wg>11</wg>
+<ws>1</ws>
+<endgaps>yes</endgaps>
+<substring>yes</substring>
+<minsites>2</minsites>
+<maxsites>30</maxsites>
+<wnsites>0.8</wnsites>
+<spmap>pam</spmap>
+<spfuzz>120</spfuzz>
+<prior>megap</prior>
+<beta>7500</beta>
+<maxiter>50</maxiter>
+<distance>1e-05</distance>
+<num_sequences>30</num_sequences>
+<num_positions>1500</num_positions>
+<seed>0</seed>
+<ctfrac>-1</ctfrac>
+<maxwords>-1</maxwords>
+<strands>none</strands>
+<priors_file>prior30.plib</priors_file>
+<reason_for_stopping>Stopped because requested number of motifs (1) found.</reason_for_stopping>
+<background_frequencies source="dataset with add-one prior applied">
+<alphabet_array>
+<value letter_id="A">0.291</value>
+<value letter_id="C">0.229</value>
+<value letter_id="D">0.001</value>
+<value letter_id="E">0.001</value>
+<value letter_id="F">0.001</value>
+<value letter_id="G">0.255</value>
+<value letter_id="H">0.001</value>
+<value letter_id="I">0.001</value>
+<value letter_id="K">0.001</value>
+<value letter_id="L">0.001</value>
+<value letter_id="M">0.001</value>
+<value letter_id="N">0.001</value>
+<value letter_id="P">0.001</value>
+<value letter_id="Q">0.001</value>
+<value letter_id="R">0.001</value>
+<value letter_id="S">0.001</value>
+<value letter_id="T">0.215</value>
+<value letter_id="V">0.001</value>
+<value letter_id="W">0.001</value>
+<value letter_id="Y">0.001</value>
+</alphabet_array>
+</background_frequencies>
+</model>
+<motifs>
+<motif id="motif_1" name="1" width="11" sites="25" ic="40.0" re="13.8" llr="239" e_value="2.4e-011" bayes_threshold="5.33554" elapsed_time="0.533107">
+<scores>
+<alphabet_matrix>
+<alphabet_array>
+<value letter_id="A">-32</value>
+<value letter_id="C">-680</value>
+<value letter_id="D">91</value>
+<value letter_id="E">77</value>
+<value letter_id="F">7</value>
+<value letter_id="G">138</value>
+<value letter_id="H">-20</value>
+<value letter_id="I">55</value>
+<value letter_id="K">64</value>
+<value letter_id="L">107</value>
+<value letter_id="M">11</value>
+<value letter_id="N">150</value>
+<value letter_id="P">142</value>
+<value letter_id="Q">72</value>
+<value letter_id="R">87</value>
+<value letter_id="S">396</value>
+<value letter_id="T">-148</value>
+<value letter_id="V">221</value>
+<value letter_id="W">-140</value>
+<value letter_id="Y">-36</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">-11</value>
+<value letter_id="C">-680</value>
+<value letter_id="D">89</value>
+<value letter_id="E">76</value>
+<value letter_id="F">7</value>
+<value letter_id="G">137</value>
+<value letter_id="H">-21</value>
+<value letter_id="I">55</value>
+<value letter_id="K">63</value>
+<value letter_id="L">107</value>
+<value letter_id="M">10</value>
+<value letter_id="N">149</value>
+<value letter_id="P">141</value>
+<value letter_id="Q">71</value>
+<value letter_id="R">87</value>
+<value letter_id="S">396</value>
+<value letter_id="T">-239</value>
+<value letter_id="V">220</value>
+<value letter_id="W">-140</value>
+<value letter_id="Y">-36</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">-79</value>
+<value letter_id="C">41</value>
+<value letter_id="D">4</value>
+<value letter_id="E">21</value>
+<value letter_id="F">-7</value>
+<value letter_id="G">44</value>
+<value letter_id="H">-62</value>
+<value letter_id="I">42</value>
+<value letter_id="K">-5</value>
+<value letter_id="L">99</value>
+<value letter_id="M">0</value>
+<value letter_id="N">99</value>
+<value letter_id="P">138</value>
+<value letter_id="Q">52</value>
+<value letter_id="R">42</value>
+<value letter_id="S">399</value>
+<value letter_id="T">-46</value>
+<value letter_id="V">223</value>
+<value letter_id="W">-173</value>
+<value letter_id="Y">-68</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">11</value>
+<value letter_id="C">-677</value>
+<value letter_id="D">48</value>
+<value letter_id="E">47</value>
+<value letter_id="F">-2</value>
+<value letter_id="G">127</value>
+<value letter_id="H">-43</value>
+<value letter_id="I">46</value>
+<value letter_id="K">27</value>
+<value letter_id="L">101</value>
+<value letter_id="M">3</value>
+<value letter_id="N">124</value>
+<value letter_id="P">138</value>
+<value letter_id="Q">60</value>
+<value letter_id="R">62</value>
+<value letter_id="S">397</value>
+<value letter_id="T">-235</value>
+<value letter_id="V">220</value>
+<value letter_id="W">-160</value>
+<value letter_id="Y">-55</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">-596</value>
+<value letter_id="C">-820</value>
+<value letter_id="D">12</value>
+<value letter_id="E">-21</value>
+<value letter_id="F">-53</value>
+<value letter_id="G">-267</value>
+<value letter_id="H">-74</value>
+<value letter_id="I">37</value>
+<value letter_id="K">16</value>
+<value letter_id="L">44</value>
+<value letter_id="M">-37</value>
+<value letter_id="N">98</value>
+<value letter_id="P">31</value>
+<value letter_id="Q">9</value>
+<value letter_id="R">19</value>
+<value letter_id="S">319</value>
+<value letter_id="T">212</value>
+<value letter_id="V">127</value>
+<value letter_id="W">-193</value>
+<value letter_id="Y">-95</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">165</value>
+<value letter_id="C">-261</value>
+<value letter_id="D">70</value>
+<value letter_id="E">110</value>
+<value letter_id="F">77</value>
+<value letter_id="G">-521</value>
+<value letter_id="H">-4</value>
+<value letter_id="I">147</value>
+<value letter_id="K">95</value>
+<value letter_id="L">201</value>
+<value letter_id="M">90</value>
+<value letter_id="N">121</value>
+<value letter_id="P">124</value>
+<value letter_id="Q">91</value>
+<value letter_id="R">107</value>
+<value letter_id="S">425</value>
+<value letter_id="T">-527</value>
+<value letter_id="V">314</value>
+<value letter_id="W">-95</value>
+<value letter_id="Y">8</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">-838</value>
+<value letter_id="C">-990</value>
+<value letter_id="D">-89</value>
+<value letter_id="E">-149</value>
+<value letter_id="F">-151</value>
+<value letter_id="G">-841</value>
+<value letter_id="H">-161</value>
+<value letter_id="I">-117</value>
+<value letter_id="K">-113</value>
+<value letter_id="L">-66</value>
+<value letter_id="M">-209</value>
+<value letter_id="N">-68</value>
+<value letter_id="P">-69</value>
+<value letter_id="Q">-129</value>
+<value letter_id="R">-91</value>
+<value letter_id="S">111</value>
+<value letter_id="T">221</value>
+<value letter_id="V">-55</value>
+<value letter_id="W">-255</value>
+<value letter_id="Y">-173</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">176</value>
+<value letter_id="C">-858</value>
+<value letter_id="D">-79</value>
+<value letter_id="E">-103</value>
+<value letter_id="F">-115</value>
+<value letter_id="G">-717</value>
+<value letter_id="H">-148</value>
+<value letter_id="I">-95</value>
+<value letter_id="K">-108</value>
+<value letter_id="L">-17</value>
+<value letter_id="M">-162</value>
+<value letter_id="N">-61</value>
+<value letter_id="P">-12</value>
+<value letter_id="Q">-95</value>
+<value letter_id="R">-69</value>
+<value letter_id="S">193</value>
+<value letter_id="T">-737</value>
+<value letter_id="V">52</value>
+<value letter_id="W">-240</value>
+<value letter_id="Y">-153</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">134</value>
+<value letter_id="C">-686</value>
+<value letter_id="D">0</value>
+<value letter_id="E">16</value>
+<value letter_id="F">-12</value>
+<value letter_id="G">-553</value>
+<value letter_id="H">-68</value>
+<value letter_id="I">44</value>
+<value letter_id="K">-8</value>
+<value letter_id="L">96</value>
+<value letter_id="M">-9</value>
+<value letter_id="N">88</value>
+<value letter_id="P">124</value>
+<value letter_id="Q">41</value>
+<value letter_id="R">36</value>
+<value letter_id="S">384</value>
+<value letter_id="T">11</value>
+<value letter_id="V">216</value>
+<value letter_id="W">-177</value>
+<value letter_id="Y">-71</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">165</value>
+<value letter_id="C">-261</value>
+<value letter_id="D">70</value>
+<value letter_id="E">110</value>
+<value letter_id="F">77</value>
+<value letter_id="G">-521</value>
+<value letter_id="H">-4</value>
+<value letter_id="I">147</value>
+<value letter_id="K">95</value>
+<value letter_id="L">201</value>
+<value letter_id="M">90</value>
+<value letter_id="N">121</value>
+<value letter_id="P">124</value>
+<value letter_id="Q">91</value>
+<value letter_id="R">107</value>
+<value letter_id="S">425</value>
+<value letter_id="T">-527</value>
+<value letter_id="V">314</value>
+<value letter_id="W">-95</value>
+<value letter_id="Y">8</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">147</value>
+<value letter_id="C">-614</value>
+<value letter_id="D">89</value>
+<value letter_id="E">129</value>
+<value letter_id="F">93</value>
+<value letter_id="G">-121</value>
+<value letter_id="H">12</value>
+<value letter_id="I">160</value>
+<value letter_id="K">113</value>
+<value letter_id="L">217</value>
+<value letter_id="M">108</value>
+<value letter_id="N">144</value>
+<value letter_id="P">144</value>
+<value letter_id="Q">111</value>
+<value letter_id="R">125</value>
+<value letter_id="S">447</value>
+<value letter_id="T">-241</value>
+<value letter_id="V">332</value>
+<value letter_id="W">-81</value>
+<value letter_id="Y">22</value>
+</alphabet_array>
+</alphabet_matrix>
+</scores>
+<probabilities>
+<alphabet_matrix>
+<alphabet_array>
+<value letter_id="A">0.240000</value>
+<value letter_id="C">0.000000</value>
+<value letter_id="D">0.000000</value>
+<value letter_id="E">0.000000</value>
+<value letter_id="F">0.000000</value>
+<value letter_id="G">0.680000</value>
+<value letter_id="H">0.000000</value>
+<value letter_id="I">0.000000</value>
+<value letter_id="K">0.000000</value>
+<value letter_id="L">0.000000</value>
+<value letter_id="M">0.000000</value>
+<value letter_id="N">0.000000</value>
+<value letter_id="P">0.000000</value>
+<value letter_id="Q">0.000000</value>
+<value letter_id="R">0.000000</value>
+<value letter_id="S">0.000000</value>
+<value letter_id="T">0.080000</value>
+<value letter_id="V">0.000000</value>
+<value letter_id="W">0.000000</value>
+<value letter_id="Y">0.000000</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">0.280000</value>
+<value letter_id="C">0.000000</value>
+<value letter_id="D">0.000000</value>
+<value letter_id="E">0.000000</value>
+<value letter_id="F">0.000000</value>
+<value letter_id="G">0.680000</value>
+<value letter_id="H">0.000000</value>
+<value letter_id="I">0.000000</value>
+<value letter_id="K">0.000000</value>
+<value letter_id="L">0.000000</value>
+<value letter_id="M">0.000000</value>
+<value letter_id="N">0.000000</value>
+<value letter_id="P">0.000000</value>
+<value letter_id="Q">0.000000</value>
+<value letter_id="R">0.000000</value>
+<value letter_id="S">0.000000</value>
+<value letter_id="T">0.040000</value>
+<value letter_id="V">0.000000</value>
+<value letter_id="W">0.000000</value>
+<value letter_id="Y">0.000000</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">0.160000</value>
+<value letter_id="C">0.320000</value>
+<value letter_id="D">0.000000</value>
+<value letter_id="E">0.000000</value>
+<value letter_id="F">0.000000</value>
+<value letter_id="G">0.360000</value>
+<value letter_id="H">0.000000</value>
+<value letter_id="I">0.000000</value>
+<value letter_id="K">0.000000</value>
+<value letter_id="L">0.000000</value>
+<value letter_id="M">0.000000</value>
+<value letter_id="N">0.000000</value>
+<value letter_id="P">0.000000</value>
+<value letter_id="Q">0.000000</value>
+<value letter_id="R">0.000000</value>
+<value letter_id="S">0.000000</value>
+<value letter_id="T">0.160000</value>
+<value letter_id="V">0.000000</value>
+<value letter_id="W">0.000000</value>
+<value letter_id="Y">0.000000</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">0.320000</value>
+<value letter_id="C">0.000000</value>
+<value letter_id="D">0.000000</value>
+<value letter_id="E">0.000000</value>
+<value letter_id="F">0.000000</value>
+<value letter_id="G">0.640000</value>
+<value letter_id="H">0.000000</value>
+<value letter_id="I">0.000000</value>
+<value letter_id="K">0.000000</value>
+<value letter_id="L">0.000000</value>
+<value letter_id="M">0.000000</value>
+<value letter_id="N">0.000000</value>
+<value letter_id="P">0.000000</value>
+<value letter_id="Q">0.000000</value>
+<value letter_id="R">0.000000</value>
+<value letter_id="S">0.000000</value>
+<value letter_id="T">0.040000</value>
+<value letter_id="V">0.000000</value>
+<value letter_id="W">0.000000</value>
+<value letter_id="Y">0.000000</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">0.000000</value>
+<value letter_id="C">0.000000</value>
+<value letter_id="D">0.000000</value>
+<value letter_id="E">0.000000</value>
+<value letter_id="F">0.000000</value>
+<value letter_id="G">0.040000</value>
+<value letter_id="H">0.000000</value>
+<value letter_id="I">0.000000</value>
+<value letter_id="K">0.000000</value>
+<value letter_id="L">0.000000</value>
+<value letter_id="M">0.000000</value>
+<value letter_id="N">0.000000</value>
+<value letter_id="P">0.000000</value>
+<value letter_id="Q">0.000000</value>
+<value letter_id="R">0.000000</value>
+<value letter_id="S">0.000000</value>
+<value letter_id="T">0.960000</value>
+<value letter_id="V">0.000000</value>
+<value letter_id="W">0.000000</value>
+<value letter_id="Y">0.000000</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">0.960000</value>
+<value letter_id="C">0.040000</value>
+<value letter_id="D">0.000000</value>
+<value letter_id="E">0.000000</value>
+<value letter_id="F">0.000000</value>
+<value letter_id="G">0.000000</value>
+<value letter_id="H">0.000000</value>
+<value letter_id="I">0.000000</value>
+<value letter_id="K">0.000000</value>
+<value letter_id="L">0.000000</value>
+<value letter_id="M">0.000000</value>
+<value letter_id="N">0.000000</value>
+<value letter_id="P">0.000000</value>
+<value letter_id="Q">0.000000</value>
+<value letter_id="R">0.000000</value>
+<value letter_id="S">0.000000</value>
+<value letter_id="T">0.000000</value>
+<value letter_id="V">0.000000</value>
+<value letter_id="W">0.000000</value>
+<value letter_id="Y">0.000000</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">0.000000</value>
+<value letter_id="C">0.000000</value>
+<value letter_id="D">0.000000</value>
+<value letter_id="E">0.000000</value>
+<value letter_id="F">0.000000</value>
+<value letter_id="G">0.000000</value>
+<value letter_id="H">0.000000</value>
+<value letter_id="I">0.000000</value>
+<value letter_id="K">0.000000</value>
+<value letter_id="L">0.000000</value>
+<value letter_id="M">0.000000</value>
+<value letter_id="N">0.000000</value>
+<value letter_id="P">0.000000</value>
+<value letter_id="Q">0.000000</value>
+<value letter_id="R">0.000000</value>
+<value letter_id="S">0.000000</value>
+<value letter_id="T">1.000000</value>
+<value letter_id="V">0.000000</value>
+<value letter_id="W">0.000000</value>
+<value letter_id="Y">0.000000</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">1.000000</value>
+<value letter_id="C">0.000000</value>
+<value letter_id="D">0.000000</value>
+<value letter_id="E">0.000000</value>
+<value letter_id="F">0.000000</value>
+<value letter_id="G">0.000000</value>
+<value letter_id="H">0.000000</value>
+<value letter_id="I">0.000000</value>
+<value letter_id="K">0.000000</value>
+<value letter_id="L">0.000000</value>
+<value letter_id="M">0.000000</value>
+<value letter_id="N">0.000000</value>
+<value letter_id="P">0.000000</value>
+<value letter_id="Q">0.000000</value>
+<value letter_id="R">0.000000</value>
+<value letter_id="S">0.000000</value>
+<value letter_id="T">0.000000</value>
+<value letter_id="V">0.000000</value>
+<value letter_id="W">0.000000</value>
+<value letter_id="Y">0.000000</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">0.760000</value>
+<value letter_id="C">0.000000</value>
+<value letter_id="D">0.000000</value>
+<value letter_id="E">0.000000</value>
+<value letter_id="F">0.000000</value>
+<value letter_id="G">0.000000</value>
+<value letter_id="H">0.000000</value>
+<value letter_id="I">0.000000</value>
+<value letter_id="K">0.000000</value>
+<value letter_id="L">0.000000</value>
+<value letter_id="M">0.000000</value>
+<value letter_id="N">0.000000</value>
+<value letter_id="P">0.000000</value>
+<value letter_id="Q">0.000000</value>
+<value letter_id="R">0.000000</value>
+<value letter_id="S">0.000000</value>
+<value letter_id="T">0.240000</value>
+<value letter_id="V">0.000000</value>
+<value letter_id="W">0.000000</value>
+<value letter_id="Y">0.000000</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">0.960000</value>
+<value letter_id="C">0.040000</value>
+<value letter_id="D">0.000000</value>
+<value letter_id="E">0.000000</value>
+<value letter_id="F">0.000000</value>
+<value letter_id="G">0.000000</value>
+<value letter_id="H">0.000000</value>
+<value letter_id="I">0.000000</value>
+<value letter_id="K">0.000000</value>
+<value letter_id="L">0.000000</value>
+<value letter_id="M">0.000000</value>
+<value letter_id="N">0.000000</value>
+<value letter_id="P">0.000000</value>
+<value letter_id="Q">0.000000</value>
+<value letter_id="R">0.000000</value>
+<value letter_id="S">0.000000</value>
+<value letter_id="T">0.000000</value>
+<value letter_id="V">0.000000</value>
+<value letter_id="W">0.000000</value>
+<value letter_id="Y">0.000000</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">0.840000</value>
+<value letter_id="C">0.000000</value>
+<value letter_id="D">0.000000</value>
+<value letter_id="E">0.000000</value>
+<value letter_id="F">0.000000</value>
+<value letter_id="G">0.120000</value>
+<value letter_id="H">0.000000</value>
+<value letter_id="I">0.000000</value>
+<value letter_id="K">0.000000</value>
+<value letter_id="L">0.000000</value>
+<value letter_id="M">0.000000</value>
+<value letter_id="N">0.000000</value>
+<value letter_id="P">0.000000</value>
+<value letter_id="Q">0.000000</value>
+<value letter_id="R">0.000000</value>
+<value letter_id="S">0.000000</value>
+<value letter_id="T">0.040000</value>
+<value letter_id="V">0.000000</value>
+<value letter_id="W">0.000000</value>
+<value letter_id="Y">0.000000</value>
+</alphabet_array>
+</alphabet_matrix>
+</probabilities>
+<regular_expression>
+[GA][GA][GC][GA]TATA[AT]AA
+</regular_expression>
+<contributing_sites>
+<contributing_site sequence_id="sequence_24" position="12" strand="none" pvalue="1.06e-06" >
+<left_flank>AAGGCCAGGA</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>GCCTGAGAGC</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_25" position="36" strand="none" pvalue="3.41e-06" >
+<left_flank>ACAGGCCCTG</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>GCC</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_19" position="9" strand="none" pvalue="3.41e-06" >
+<left_flank>CAGGCCCTG</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>GCCCCAGCAG</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_9" position="13" strand="none" pvalue="3.41e-06" >
+<left_flank>GATTCACTGA</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>GGCCCTCTGC</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_21" position="7" strand="none" pvalue="4.00e-06" >
+<left_flank>CCAAGGA</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>GCCCCACAAA</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_13" position="13" strand="none" pvalue="5.01e-06" >
+<left_flank>CCACCAGCTT</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>AGCCCTGTAC</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_23" position="15" strand="none" pvalue="6.06e-06" >
+<left_flank>ATACCCAGGG</left_flank>
+<site>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>CCTCAGCAGC</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_15" position="21" strand="none" pvalue="8.67e-06" >
+<left_flank>AATCACTGAG</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>GTCCCAGGGA</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_12" position="18" strand="none" pvalue="8.67e-06" >
+<left_flank>CACCAGAGCT</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>AGAAGGTTCT</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_11" position="16" strand="none" pvalue="8.67e-06" >
+<left_flank>CACTATTGAA</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>TTTCATTTGC</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_22" position="2" strand="none" pvalue="1.21e-05" >
+<left_flank>GA</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>GCCAACATCC</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_28" position="32" strand="none" pvalue="1.59e-05" >
+<left_flank>CCGGCGGGGC</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+</site>
+<right_flank>GGGGCGG</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_20" position="4" strand="none" pvalue="1.59e-05" >
+<left_flank>CAGA</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+</site>
+<right_flank>GTTCCGACCA</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_6" position="15" strand="none" pvalue="1.68e-05" >
+<left_flank>CCCACTACTT</left_flank>
+<site>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>TCATTCTGAG</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_14" position="19" strand="none" pvalue="2.03e-05" >
+<left_flank>CACCAGCAAG</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>GCTCAGGAGT</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_4" position="12" strand="none" pvalue="3.06e-05" >
+<left_flank>CAGGTCTAAG</left_flank>
+<site>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>CTTGGAGTCC</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_0" position="39" strand="none" pvalue="3.06e-05" >
+<left_flank>CCTCGGGACG</left_flank>
+<site>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank></right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_18" position="37" strand="none" pvalue="3.82e-05" >
+<left_flank>CGTGGTCGCG</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>GC</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_5" position="0" strand="none" pvalue="3.82e-05" >
+<left_flank></left_flank>
+<site>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>ATGGTCCTGT</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_29" position="30" strand="none" pvalue="4.02e-05" >
+<left_flank>GCTGCCGGTG</left_flank>
+<site>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+</site>
+<right_flank>GCCCTGGCG</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_1" position="27" strand="none" pvalue="5.52e-05" >
+<left_flank>AGTCACAAGT</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>GGGTCGCACG</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_3" position="14" strand="none" pvalue="5.94e-05" >
+<left_flank>CCCAGGTTTC</left_flank>
+<site>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>TCGCCGCACC</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_16" position="22" strand="none" pvalue="6.78e-05" >
+<left_flank>AGTTTCAGTT</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>attatataac</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_7" position="2" strand="none" pvalue="2.08e-04" >
+<left_flank>TC</left_flank>
+<site>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+</site>
+<right_flank>AAATGTTCCT</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_8" position="13" strand="none" pvalue="4.05e-04" >
+<left_flank>TATAACTCAG</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>TAATTTGTAC</right_flank>
+</contributing_site>
+</contributing_sites>
+</motif>
+</motifs>
+<scanned_sites_summary p_thresh="0.0001">
+<scanned_sites sequence_id="sequence_0" pvalue="1.22e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="39" pvalue="3.06e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_1" pvalue="2.21e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="27" pvalue="5.52e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_2" pvalue="7.29e-01" num_sites="0"></scanned_sites>
+<scanned_sites sequence_id="sequence_3" pvalue="2.37e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="14" pvalue="5.94e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_4" pvalue="1.22e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="12" pvalue="3.06e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_5" pvalue="1.53e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="0" pvalue="3.82e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_6" pvalue="6.70e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="15" pvalue="1.68e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_7" pvalue="1.81e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="4" pvalue="4.54e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_8" pvalue="1.61e-02" num_sites="0"></scanned_sites>
+<scanned_sites sequence_id="sequence_9" pvalue="1.36e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="13" pvalue="3.41e-06"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_10" pvalue="1.99e-01" num_sites="0"></scanned_sites>
+<scanned_sites sequence_id="sequence_11" pvalue="3.47e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="16" pvalue="8.67e-06"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_12" pvalue="3.47e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="18" pvalue="8.67e-06"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_13" pvalue="2.01e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="13" pvalue="5.01e-06"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_14" pvalue="8.11e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="19" pvalue="2.03e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_15" pvalue="3.47e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="21" pvalue="8.67e-06"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_16" pvalue="2.71e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="22" pvalue="6.78e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_17" pvalue="8.23e-02" num_sites="0"></scanned_sites>
+<scanned_sites sequence_id="sequence_18" pvalue="1.53e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="37" pvalue="3.82e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_19" pvalue="1.36e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="9" pvalue="3.41e-06"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_20" pvalue="6.37e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="4" pvalue="1.59e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_21" pvalue="1.60e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="7" pvalue="4.00e-06"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_22" pvalue="4.83e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="2" pvalue="1.21e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_23" pvalue="2.43e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="15" pvalue="6.06e-06"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_24" pvalue="4.26e-05" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="12" pvalue="1.06e-06"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_25" pvalue="1.36e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="36" pvalue="3.41e-06"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_26" pvalue="4.30e-02" num_sites="0"></scanned_sites>
+<scanned_sites sequence_id="sequence_27" pvalue="4.30e-02" num_sites="0"></scanned_sites>
+<scanned_sites sequence_id="sequence_28" pvalue="6.37e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="32" pvalue="1.59e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_29" pvalue="1.61e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="none" position="30" pvalue="4.02e-05"/>
+</scanned_sites>
+</scanned_sites_summary>
+</MEME>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/meme_output_xml_2.xml	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,977 @@
+<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
+<!-- Document definition -->
+<!DOCTYPE MEME[
+<!ELEMENT MEME (
+  training_set,
+  model, 
+  motifs, 
+  scanned_sites_summary?
+)>
+<!ATTLIST MEME 
+  version CDATA #REQUIRED
+  release CDATA #REQUIRED
+>
+<!-- Training-set elements -->
+<!ELEMENT training_set (alphabet, ambigs, sequence*, letter_frequencies)>
+<!ATTLIST training_set datafile CDATA #REQUIRED length CDATA #REQUIRED>
+<!ELEMENT alphabet (letter*)>
+<!ATTLIST alphabet name CDATA #REQUIRED>
+<!ELEMENT ambigs (letter*)>
+<!ELEMENT letter EMPTY>
+<!ATTLIST letter id ID #REQUIRED>
+<!ATTLIST letter symbol CDATA #REQUIRED>
+<!ATTLIST letter equals CDATA #IMPLIED>
+<!ATTLIST letter aliases CDATA #IMPLIED>
+<!ATTLIST letter complement CDATA #IMPLIED>
+<!ATTLIST letter name CDATA #IMPLIED>
+<!ATTLIST letter colour CDATA #IMPLIED>
+<!ELEMENT sequence EMPTY>
+<!ATTLIST sequence id ID #REQUIRED
+                   name CDATA #REQUIRED
+                   length CDATA #REQUIRED
+                   weight CDATA #REQUIRED
+>
+<!ELEMENT letter_frequencies (alphabet_array)>
+
+<!-- Model elements -->
+<!ELEMENT model (
+  command_line,
+  host,
+  type,
+  nmotifs,
+  evalue_threshold,
+  object_function,
+  min_width,
+  max_width,
+  minic,
+  wg,
+  ws,
+  endgaps,
+  minsites,
+  maxsites,
+  wnsites,
+  prob,
+  spmap,
+  spfuzz,
+  prior,
+  beta,
+  maxiter,
+  distance,
+  num_sequences,
+  num_positions,
+  seed,
+  seqfrac,
+  strands,
+  priors_file,
+  reason_for_stopping,
+  background_frequencies
+)>
+<!ELEMENT command_line (#PCDATA)*>
+<!ELEMENT host (#PCDATA)*>
+<!ELEMENT type (#PCDATA)*>
+<!ELEMENT nmotifs (#PCDATA)*>
+<!ELEMENT evalue_threshold (#PCDATA)*>
+<!ELEMENT object_function (#PCDATA)*>
+<!ELEMENT min_width (#PCDATA)*>
+<!ELEMENT max_width (#PCDATA)*>
+<!ELEMENT minic (#PCDATA)*>
+<!ELEMENT wg (#PCDATA)*>
+<!ELEMENT ws (#PCDATA)*>
+<!ELEMENT endgaps (#PCDATA)*>
+<!ELEMENT minsites (#PCDATA)*>
+<!ELEMENT maxsites (#PCDATA)*>
+<!ELEMENT wnsites (#PCDATA)*>
+<!ELEMENT prob (#PCDATA)*>
+<!ELEMENT spmap (#PCDATA)*>
+<!ELEMENT spfuzz (#PCDATA)*>
+<!ELEMENT prior (#PCDATA)*>
+<!ELEMENT beta (#PCDATA)*>
+<!ELEMENT maxiter (#PCDATA)*>
+<!ELEMENT distance (#PCDATA)*>
+<!ELEMENT num_sequences (#PCDATA)*>
+<!ELEMENT num_positions (#PCDATA)*>
+<!ELEMENT seed (#PCDATA)*>
+<!ELEMENT seqfrac (#PCDATA)*>
+<!ELEMENT strands (#PCDATA)*>
+<!ELEMENT priors_file (#PCDATA)*>
+<!ELEMENT reason_for_stopping (#PCDATA)*>
+<!ELEMENT background_frequencies (alphabet_array)>
+<!ATTLIST background_frequencies source CDATA #REQUIRED>
+
+<!-- Motif elements -->
+<!ELEMENT motifs (motif*)>
+<!ELEMENT motif (scores, probabilities, regular_expression?, contributing_sites)>
+<!ATTLIST motif id ID #REQUIRED
+                name CDATA #REQUIRED
+                width CDATA #REQUIRED
+                sites CDATA #REQUIRED
+                llr CDATA #REQUIRED
+                ic CDATA #REQUIRED
+                re CDATA #REQUIRED
+                bayes_threshold CDATA #REQUIRED
+                e_value CDATA #REQUIRED
+                elapsed_time CDATA #REQUIRED
+                url CDATA ""
+>
+<!ELEMENT scores (alphabet_matrix)>
+<!ELEMENT probabilities (alphabet_matrix)>
+<!ELEMENT regular_expression (#PCDATA)*>
+
+<!-- Contributing site elements -->
+<!-- Contributing sites are motif occurences found during the motif discovery phase -->
+<!ELEMENT contributing_sites (contributing_site*)>
+<!ELEMENT contributing_site (left_flank, site, right_flank)>
+<!ATTLIST contributing_site sequence_id IDREF #REQUIRED
+                          position CDATA #REQUIRED
+                          strand (plus|minus|none) 'none'
+                          pvalue CDATA #REQUIRED
+>
+<!-- The left_flank contains the sequence for 10 bases to the left of the motif start -->
+<!ELEMENT left_flank (#PCDATA)>
+<!-- The site contains the sequence for the motif instance -->
+<!ELEMENT site (letter_ref*)>
+<!-- The right_flank contains the sequence for 10 bases to the right of the motif end -->
+<!ELEMENT right_flank (#PCDATA)>
+
+<!-- Scanned site elements -->
+<!-- Scanned sites are motif occurences found during the sequence scan phase -->
+<!ELEMENT scanned_sites_summary (scanned_sites*)>
+<!ATTLIST scanned_sites_summary p_thresh CDATA #REQUIRED>
+<!ELEMENT scanned_sites (scanned_site*)>
+<!ATTLIST scanned_sites sequence_id IDREF #REQUIRED
+                        pvalue CDATA #REQUIRED
+                        num_sites CDATA #REQUIRED>
+<!ELEMENT scanned_site EMPTY>
+<!ATTLIST scanned_site  motif_id IDREF #REQUIRED
+                        strand (plus|minus|none) 'none'
+                        position CDATA #REQUIRED
+                        pvalue CDATA #REQUIRED>
+
+<!-- Utility elements -->
+<!-- A reference to a letter in the alphabet -->
+<!ELEMENT letter_ref EMPTY>
+<!ATTLIST letter_ref letter_id IDREF #REQUIRED>
+<!-- A alphabet-array contains one floating point value for each letter in an alphabet -->
+<!ELEMENT alphabet_array (value*)>
+<!ELEMENT value (#PCDATA)>
+<!ATTLIST value letter_id IDREF #REQUIRED>
+
+<!-- A alphabet_matrix contains one alphabet_array for each position in a motif -->
+<!ELEMENT alphabet_matrix (alphabet_array*)>
+
+]>
+<!-- Begin document body -->
+<MEME version="4.11.2" release="Thu May 05 14:58:55 2016 -0700">
+<training_set datafile="Galaxy_FASTA_Input" length="30">
+<alphabet name="DNA" like="dna">
+<letter id="A" symbol="A" complement="T" name="Adenine" colour="CC0000"/>
+<letter id="C" symbol="C" complement="G" name="Cytosine" colour="0000CC"/>
+<letter id="G" symbol="G" complement="C" name="Guanine" colour="FFB300"/>
+<letter id="T" symbol="T" aliases="U" complement="A" name="Thymine" colour="008000"/>
+<letter id="N" symbol="N" aliases="X." equals="ACGT" name="Any base"/>
+<letter id="V" symbol="V" equals="ACG" name="Not T"/>
+<letter id="H" symbol="H" equals="ACT" name="Not G"/>
+<letter id="D" symbol="D" equals="AGT" name="Not C"/>
+<letter id="B" symbol="B" equals="CGT" name="Not A"/>
+<letter id="M" symbol="M" equals="AC" name="Amino"/>
+<letter id="R" symbol="R" equals="AG" name="Purine"/>
+<letter id="W" symbol="W" equals="AT" name="Weak"/>
+<letter id="S" symbol="S" equals="CG" name="Strong"/>
+<letter id="Y" symbol="Y" equals="CT" name="Pyrimidine"/>
+<letter id="K" symbol="K" equals="GT" name="Keto"/>
+</alphabet>
+<sequence id="sequence_0" name="chr21_19617074_19617124_+" length="50" weight="1.000000" />
+<sequence id="sequence_1" name="chr21_26934381_26934431_+" length="50" weight="1.000000" />
+<sequence id="sequence_2" name="chr21_28217753_28217803_-" length="50" weight="1.000000" />
+<sequence id="sequence_3" name="chr21_31710037_31710087_-" length="50" weight="1.000000" />
+<sequence id="sequence_4" name="chr21_31744582_31744632_-" length="50" weight="1.000000" />
+<sequence id="sequence_5" name="chr21_31768316_31768366_+" length="50" weight="1.000000" />
+<sequence id="sequence_6" name="chr21_31914206_31914256_-" length="50" weight="1.000000" />
+<sequence id="sequence_7" name="chr21_31933633_31933683_-" length="50" weight="1.000000" />
+<sequence id="sequence_8" name="chr21_31962741_31962791_-" length="50" weight="1.000000" />
+<sequence id="sequence_9" name="chr21_31964683_31964733_+" length="50" weight="1.000000" />
+<sequence id="sequence_10" name="chr21_31973364_31973414_+" length="50" weight="1.000000" />
+<sequence id="sequence_11" name="chr21_31992870_31992920_+" length="50" weight="1.000000" />
+<sequence id="sequence_12" name="chr21_32185595_32185645_-" length="50" weight="1.000000" />
+<sequence id="sequence_13" name="chr21_32202076_32202126_-" length="50" weight="1.000000" />
+<sequence id="sequence_14" name="chr21_32253899_32253949_-" length="50" weight="1.000000" />
+<sequence id="sequence_15" name="chr21_32410820_32410870_-" length="50" weight="1.000000" />
+<sequence id="sequence_16" name="chr21_36411748_36411798_-" length="50" weight="1.000000" />
+<sequence id="sequence_17" name="chr21_37838750_37838800_-" length="50" weight="1.000000" />
+<sequence id="sequence_18" name="chr21_45705687_45705737_+" length="50" weight="1.000000" />
+<sequence id="sequence_19" name="chr21_45971413_45971463_-" length="50" weight="1.000000" />
+<sequence id="sequence_20" name="chr21_45978668_45978718_-" length="50" weight="1.000000" />
+<sequence id="sequence_21" name="chr21_45993530_45993580_+" length="50" weight="1.000000" />
+<sequence id="sequence_22" name="chr21_46020421_46020471_+" length="50" weight="1.000000" />
+<sequence id="sequence_23" name="chr21_46031920_46031970_+" length="50" weight="1.000000" />
+<sequence id="sequence_24" name="chr21_46046964_46047014_+" length="50" weight="1.000000" />
+<sequence id="sequence_25" name="chr21_46057197_46057247_+" length="50" weight="1.000000" />
+<sequence id="sequence_26" name="chr21_46086869_46086919_-" length="50" weight="1.000000" />
+<sequence id="sequence_27" name="chr21_46102103_46102153_-" length="50" weight="1.000000" />
+<sequence id="sequence_28" name="chr21_47517957_47518007_+" length="50" weight="1.000000" />
+<sequence id="sequence_29" name="chr21_47575506_47575556_-" length="50" weight="1.000000" />
+<letter_frequencies>
+<alphabet_array>
+<value letter_id="A">0.294</value>
+<value letter_id="C">0.231</value>
+<value letter_id="G">0.257</value>
+<value letter_id="T">0.217</value>
+</alphabet_array>
+</letter_frequencies>
+</training_set>
+<model>
+<command_line>meme /Users/gvk/work/git_workspace/galaxy/database/files/002/dataset_2490.dat -o /Users/gvk/work/git_workspace/galaxy/database/job_working_directory/001/1929/dataset_2578_files -nostatus -sf Galaxy_FASTA_Input -dna -mod zoops -nmotifs 1 -wnsites 0.8 -minw 8 -maxw 50 -wg 11 -ws 1 -maxiter 50 -distance 0.001 -prior dirichlet -b 0.01 -plib /Users/gvk/work/git_workspace/galaxy/database/files/002/dataset_2577.dat -spmap uni -spfuzz 0.5 </command_line>
+<host>MacBook-Pro-2.local</host>
+<type>zoops</type>
+<nmotifs>1</nmotifs>
+<evalue_threshold>inf</evalue_threshold>
+<object_function>E-value of product of p-values</object_function>
+<use_llr>0</use_llr>
+<min_width>8</min_width>
+<max_width>50</max_width>
+<wg>11</wg>
+<ws>1</ws>
+<endgaps>yes</endgaps>
+<substring>yes</substring>
+<minsites>2</minsites>
+<maxsites>30</maxsites>
+<wnsites>0.8</wnsites>
+<spmap>uni</spmap>
+<spfuzz>0.5</spfuzz>
+<prior>dirichlet</prior>
+<beta>0.01</beta>
+<maxiter>50</maxiter>
+<distance>0.001</distance>
+<num_sequences>30</num_sequences>
+<num_positions>1500</num_positions>
+<seed>0</seed>
+<ctfrac>-1</ctfrac>
+<maxwords>-1</maxwords>
+<strands>forward</strands>
+<priors_file>dataset_2577.dat</priors_file>
+<reason_for_stopping>Stopped because requested number of motifs (1) found.</reason_for_stopping>
+<background_frequencies source="dataset with add-one prior applied">
+<alphabet_array>
+<value letter_id="A">0.294</value>
+<value letter_id="C">0.231</value>
+<value letter_id="G">0.257</value>
+<value letter_id="T">0.217</value>
+</alphabet_array>
+</background_frequencies>
+</model>
+<motifs>
+<motif id="motif_1" name="1" width="11" sites="30" ic="13.0" re="12.2" llr="254" e_value="5.1e-040" bayes_threshold="5.2854" elapsed_time="0.168106">
+<scores>
+<alphabet_matrix>
+<alphabet_array>
+<value letter_id="A">-14</value>
+<value letter_id="C">-179</value>
+<value letter_id="G">114</value>
+<value letter_id="T">-112</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">3</value>
+<value letter_id="C">-1155</value>
+<value letter_id="G">137</value>
+<value letter_id="T">-270</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">-114</value>
+<value letter_id="C">20</value>
+<value letter_id="G">86</value>
+<value letter_id="T">-71</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">3</value>
+<value letter_id="C">-279</value>
+<value letter_id="G">122</value>
+<value letter_id="T">-170</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">-1155</value>
+<value letter_id="C">-1155</value>
+<value letter_id="G">-295</value>
+<value letter_id="T">215</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">156</value>
+<value letter_id="C">-179</value>
+<value letter_id="G">-1155</value>
+<value letter_id="T">-170</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">-1155</value>
+<value letter_id="C">-1155</value>
+<value letter_id="G">-1155</value>
+<value letter_id="T">220</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">172</value>
+<value letter_id="C">-279</value>
+<value letter_id="G">-1155</value>
+<value letter_id="T">-1155</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">125</value>
+<value letter_id="C">-1155</value>
+<value letter_id="G">-1155</value>
+<value letter_id="T">46</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">167</value>
+<value letter_id="C">-179</value>
+<value letter_id="G">-1155</value>
+<value letter_id="T">-1155</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">144</value>
+<value letter_id="C">-1155</value>
+<value letter_id="G">-63</value>
+<value letter_id="T">-270</value>
+</alphabet_array>
+</alphabet_matrix>
+</scores>
+<probabilities>
+<alphabet_matrix>
+<alphabet_array>
+<value letter_id="A">0.266667</value>
+<value letter_id="C">0.066667</value>
+<value letter_id="G">0.566667</value>
+<value letter_id="T">0.100000</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">0.300000</value>
+<value letter_id="C">0.000000</value>
+<value letter_id="G">0.666667</value>
+<value letter_id="T">0.033333</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">0.133333</value>
+<value letter_id="C">0.266667</value>
+<value letter_id="G">0.466667</value>
+<value letter_id="T">0.133333</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">0.300000</value>
+<value letter_id="C">0.033333</value>
+<value letter_id="G">0.600000</value>
+<value letter_id="T">0.066667</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">0.000000</value>
+<value letter_id="C">0.000000</value>
+<value letter_id="G">0.033333</value>
+<value letter_id="T">0.966667</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">0.866667</value>
+<value letter_id="C">0.066667</value>
+<value letter_id="G">0.000000</value>
+<value letter_id="T">0.066667</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">0.000000</value>
+<value letter_id="C">0.000000</value>
+<value letter_id="G">0.000000</value>
+<value letter_id="T">1.000000</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">0.966667</value>
+<value letter_id="C">0.033333</value>
+<value letter_id="G">0.000000</value>
+<value letter_id="T">0.000000</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">0.700000</value>
+<value letter_id="C">0.000000</value>
+<value letter_id="G">0.000000</value>
+<value letter_id="T">0.300000</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">0.933333</value>
+<value letter_id="C">0.066667</value>
+<value letter_id="G">0.000000</value>
+<value letter_id="T">0.000000</value>
+</alphabet_array>
+<alphabet_array>
+<value letter_id="A">0.800000</value>
+<value letter_id="C">0.000000</value>
+<value letter_id="G">0.166667</value>
+<value letter_id="T">0.033333</value>
+</alphabet_array>
+</alphabet_matrix>
+</probabilities>
+<regular_expression>
+[GA][GA][GC][GA]TATA[AT]AA
+</regular_expression>
+<contributing_sites>
+<contributing_site sequence_id="sequence_24" position="12" strand="plus" pvalue="4.51e-07" >
+<left_flank>AAGGCCAGGA</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>GCCTGAGAGC</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_23" position="15" strand="plus" pvalue="2.22e-06" >
+<left_flank>ATACCCAGGG</left_flank>
+<site>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>CCTCAGCAGC</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_13" position="13" strand="plus" pvalue="2.74e-06" >
+<left_flank>CCACCAGCTT</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>AGCCCTGTAC</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_25" position="36" strand="plus" pvalue="4.86e-06" >
+<left_flank>ACAGGCCCTG</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>GCC</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_21" position="7" strand="plus" pvalue="4.86e-06" >
+<left_flank>CCAAGGA</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>GCCCCACAAA</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_19" position="9" strand="plus" pvalue="4.86e-06" >
+<left_flank>CAGGCCCTG</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>GCCCCAGCAG</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_9" position="13" strand="plus" pvalue="4.86e-06" >
+<left_flank>GATTCACTGA</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>GGCCCTCTGC</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_28" position="32" strand="plus" pvalue="6.48e-06" >
+<left_flank>CCGGCGGGGC</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+</site>
+<right_flank>GGGGCGG</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_20" position="4" strand="plus" pvalue="6.48e-06" >
+<left_flank>CAGA</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+</site>
+<right_flank>GTTCCGACCA</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_12" position="18" strand="plus" pvalue="6.48e-06" >
+<left_flank>CACCAGAGCT</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>AGAAGGTTCT</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_15" position="21" strand="plus" pvalue="1.38e-05" >
+<left_flank>AATCACTGAG</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>GTCCCAGGGA</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_11" position="16" strand="plus" pvalue="1.38e-05" >
+<left_flank>CACTATTGAA</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>TTTCATTTGC</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_0" position="39" strand="plus" pvalue="1.41e-05" >
+<left_flank>CCTCGGGACG</left_flank>
+<site>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank></right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_6" position="15" strand="plus" pvalue="1.61e-05" >
+<left_flank>CCCACTACTT</left_flank>
+<site>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>TCATTCTGAG</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_22" position="2" strand="plus" pvalue="1.95e-05" >
+<left_flank>GA</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>GCCAACATCC</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_14" position="17" strand="plus" pvalue="1.95e-05" >
+<left_flank>CCCACCAGCA</left_flank>
+<site>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>AAGCTCAGGA</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_18" position="37" strand="plus" pvalue="2.16e-05" >
+<left_flank>CGTGGTCGCG</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>GC</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_29" position="30" strand="plus" pvalue="3.04e-05" >
+<left_flank>GCTGCCGGTG</left_flank>
+<site>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+</site>
+<right_flank>GCCCTGGCG</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_4" position="12" strand="plus" pvalue="3.04e-05" >
+<left_flank>CAGGTCTAAG</left_flank>
+<site>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>CTTGGAGTCC</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_5" position="0" strand="plus" pvalue="3.67e-05" >
+<left_flank></left_flank>
+<site>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>ATGGTCCTGT</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_1" position="27" strand="plus" pvalue="3.93e-05" >
+<left_flank>AGTCACAAGT</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>GGGTCGCACG</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_7" position="4" strand="plus" pvalue="5.65e-05" >
+<left_flank>TCAG</left_flank>
+<site>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>ATGTTCCTGT</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_3" position="14" strand="plus" pvalue="6.24e-05" >
+<left_flank>CCCAGGTTTC</left_flank>
+<site>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>TCGCCGCACC</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_16" position="22" strand="plus" pvalue="7.15e-05" >
+<left_flank>AGTTTCAGTT</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>attatataac</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_27" position="36" strand="plus" pvalue="1.39e-04" >
+<left_flank>TGCCTGGGTC</left_flank>
+<site>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+</site>
+<right_flank>GCT</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_26" position="37" strand="plus" pvalue="1.39e-04" >
+<left_flank>TGCCTGGGCC</left_flank>
+<site>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="G"/>
+</site>
+<right_flank>GC</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_17" position="2" strand="plus" pvalue="4.81e-04" >
+<left_flank>ga</left_flank>
+<site>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>ggggcctcac</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_8" position="13" strand="plus" pvalue="8.57e-04" >
+<left_flank>TATAACTCAG</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>TAATTTGTAC</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_10" position="7" strand="plus" pvalue="1.47e-03" >
+<left_flank>aaactta</left_flank>
+<site>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="A"/>
+</site>
+<right_flank>acttaaaact</right_flank>
+</contributing_site>
+<contributing_site sequence_id="sequence_2" position="26" strand="plus" pvalue="2.64e-03" >
+<left_flank>GGTGGGGGTG</left_flank>
+<site>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="G"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="T"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="A"/>
+<letter_ref letter_id="C"/>
+<letter_ref letter_id="T"/>
+</site>
+<right_flank>GGTCCACTAT</right_flank>
+</contributing_site>
+</contributing_sites>
+</motif>
+</motifs>
+<scanned_sites_summary p_thresh="0.0001">
+<scanned_sites sequence_id="sequence_0" pvalue="5.63e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="39" pvalue="1.41e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_1" pvalue="1.57e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="27" pvalue="3.93e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_2" pvalue="1.00e-01" num_sites="0"></scanned_sites>
+<scanned_sites sequence_id="sequence_3" pvalue="2.49e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="14" pvalue="6.24e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_4" pvalue="1.22e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="12" pvalue="3.04e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_5" pvalue="1.47e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="0" pvalue="3.67e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_6" pvalue="6.45e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="15" pvalue="1.61e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_7" pvalue="2.26e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="4" pvalue="5.65e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_8" pvalue="3.37e-02" num_sites="0"></scanned_sites>
+<scanned_sites sequence_id="sequence_9" pvalue="1.95e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="13" pvalue="4.86e-06"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_10" pvalue="5.73e-02" num_sites="0"></scanned_sites>
+<scanned_sites sequence_id="sequence_11" pvalue="5.52e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="16" pvalue="1.38e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_12" pvalue="2.59e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="18" pvalue="6.48e-06"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_13" pvalue="1.10e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="13" pvalue="2.74e-06"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_14" pvalue="7.78e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="17" pvalue="1.95e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_15" pvalue="5.52e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="21" pvalue="1.38e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_16" pvalue="2.85e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="22" pvalue="7.15e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_17" pvalue="1.90e-02" num_sites="0"></scanned_sites>
+<scanned_sites sequence_id="sequence_18" pvalue="8.63e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="37" pvalue="2.16e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_19" pvalue="1.95e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="9" pvalue="4.86e-06"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_20" pvalue="2.59e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="4" pvalue="6.48e-06"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_21" pvalue="1.95e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="7" pvalue="4.86e-06"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_22" pvalue="7.78e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="2" pvalue="1.95e-05"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_23" pvalue="8.89e-05" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="15" pvalue="2.22e-06"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_24" pvalue="1.80e-05" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="12" pvalue="4.51e-07"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_25" pvalue="1.95e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="36" pvalue="4.86e-06"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_26" pvalue="5.54e-03" num_sites="0"></scanned_sites>
+<scanned_sites sequence_id="sequence_27" pvalue="5.54e-03" num_sites="0"></scanned_sites>
+<scanned_sites sequence_id="sequence_28" pvalue="2.59e-04" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="32" pvalue="6.48e-06"/>
+</scanned_sites>
+<scanned_sites sequence_id="sequence_29" pvalue="1.22e-03" num_sites="1"><scanned_site motif_id="motif_1" strand="plus" position="30" pvalue="3.04e-05"/>
+</scanned_sites>
+</scanned_sites_summary>
+</MEME>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/meme_psp_gen_reports_output.tabular	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,19 @@
+540 bases or amino acids
+0.5	0.5	4	4
+0.5	0.5	6	6
+0.5	0.5	7	7
+0.5	0.5	8	8
+0.5	0.5	9	9
+0.5	0.5	10	10
+0.5	0.5	11	11
+0.5	0.5	12	12
+0.5	0.5	13	13
+0.5	0.5	14	14
+0.5	0.5	15	15
+0.5	0.5	16	16
+0.5	0.5	17	17
+0.5	0.5	18	18
+0.5	0.5	19	19
+0.5	0.5	20	20
+
+score 0.9 occurred 483 times
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/meme_psp_protein_input.fasta	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,17 @@
+>ICYA_MANSE 
+GDIFYPGYCPDVKPVNDFDLSAFAGAWHEIAKLPLENENQGKCTIAEYKY
+DGKKASVYNSFVSNGVKEYMEGDLEIAPDAKYTKQGKYVMTFKFGQRVVN
+LVPWVLATDYKNYAINYNCDYHPDKKAHSIHAWILSKSKVLEGNTKEVVD
+NVLKTFSHLIDASKFISNDFSEAACQYSTTYSLTGPDRH
+
+>LACB_BOVIN 
+MKCLLLALALTCGAQALIVTQTMKGLDIQKVAGTWYSLAMAASDISLLDA
+QSAPLRVYVEELKPTPEGDLEILLQKWENGECAQKKIIAEKTKIPAVFKI
+DALNENKVLVLDTDYKKYLLFCMENSAEPEQSLACQCLVRTPEVDDEALE
+KFDKALKALPMHIRLSFNPTQLEEQCHI
+
+>BBP_PIEBR 
+NVYHDGACPEVKPVDNFDWSNYHGKWWEVAKYPNSVEKYGKCGWAEYTPE
+GKSVKVSNYHVIHGKEYFIEGTAYPVGDSKIGKIYHKLTYGGVTKENVFN
+VLSTDNKNYIIGYYCKYDEDKKGHQDFVWVLSRSKVLTGEAKTAVENYLI
+GSPVVDSQKLVYSDFSEAACKVN
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/motif1.gff	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,100 @@
+##gff-version 3
+phiX174	fimo	polypeptide_motif	1	11	78.3	+	.	Name=1;ID=1-57-phiX174;pvalue=1.46e-08;sequence=GAGTTTTATCG;
+phiX174	fimo	polypeptide_motif	3	13	57.5	+	.	Name=1;ID=1-471-phiX174;pvalue=1.79e-06;sequence=GTTTTATCGCT;
+phiX174	fimo	polypeptide_motif	7	17	 45	+	.	Name=1;ID=1-1378-phiX174;pvalue=3.18e-05;sequence=TATCGCTTCCA;
+phiX174	fimo	polypeptide_motif	10	20	53.9	+	.	Name=1;ID=1-605-phiX174;pvalue=4.1e-06;sequence=CGCTTCCATGA;
+phiX174	fimo	polypeptide_motif	17	27	40.2	+	.	Name=1;ID=1-1887-phiX174;pvalue=9.55e-05;sequence=ATGACGCAGAA;
+phiX174	fimo	polypeptide_motif	18	28	45.3	+	.	Name=1;ID=1-1349-phiX174;pvalue=2.98e-05;sequence=TGACGCAGAAG;
+phiX174	fimo	polypeptide_motif	19	29	55.8	+	.	Name=1;ID=1-527-phiX174;pvalue=2.6e-06;sequence=GACGCAGAAGT;
+phiX174	fimo	polypeptide_motif	21	31	41.5	+	.	Name=1;ID=1-1705-phiX174;pvalue=7.07e-05;sequence=CGCAGAAGTTA;
+phiX174	fimo	polypeptide_motif	22	32	44.6	+	.	Name=1;ID=1-1404-phiX174;pvalue=3.44e-05;sequence=GCAGAAGTTAA;
+phiX174	fimo	polypeptide_motif	24	34	79.1	+	.	Name=1;ID=1-53-phiX174;pvalue=1.23e-08;sequence=AGAAGTTAACA;
+phiX174	fimo	polypeptide_motif	25	35	45.3	+	.	Name=1;ID=1-1347-phiX174;pvalue=2.97e-05;sequence=GAAGTTAACAC;
+phiX174	fimo	polypeptide_motif	26	36	59.2	+	.	Name=1;ID=1-417-phiX174;pvalue=1.19e-06;sequence=AAGTTAACACT;
+phiX174	fimo	polypeptide_motif	30	40	44.7	+	.	Name=1;ID=1-1399-phiX174;pvalue=3.4e-05;sequence=TAACACTTTCG;
+phiX174	fimo	polypeptide_motif	37	47	72.4	+	.	Name=1;ID=1-98-phiX174;pvalue=5.79e-08;sequence=TTCGGATATTT;
+phiX174	fimo	polypeptide_motif	39	49	65.3	+	.	Name=1;ID=1-213-phiX174;pvalue=2.92e-07;sequence=CGGATATTTCT;
+phiX174	fimo	polypeptide_motif	41	51	55.3	+	.	Name=1;ID=1-548-phiX174;pvalue=2.97e-06;sequence=GATATTTCTGA;
+phiX174	fimo	polypeptide_motif	43	53	58.4	+	.	Name=1;ID=1-442-phiX174;pvalue=1.43e-06;sequence=TATTTCTGATG;
+phiX174	fimo	polypeptide_motif	46	56	53.7	+	.	Name=1;ID=1-617-phiX174;pvalue=4.23e-06;sequence=TTCTGATGAGT;
+phiX174	fimo	polypeptide_motif	50	60	45.4	+	.	Name=1;ID=1-1333-phiX174;pvalue=2.86e-05;sequence=GATGAGTCGAA;
+phiX174	fimo	polypeptide_motif	51	61	48.4	+	.	Name=1;ID=1-1094-phiX174;pvalue=1.44e-05;sequence=ATGAGTCGAAA;
+phiX174	fimo	polypeptide_motif	52	62	83.9	+	.	Name=1;ID=1-22-phiX174;pvalue=4.06e-09;sequence=TGAGTCGAAAA;
+phiX174	fimo	polypeptide_motif	53	63	53.9	+	.	Name=1;ID=1-601-phiX174;pvalue=4.03e-06;sequence=GAGTCGAAAAA;
+phiX174	fimo	polypeptide_motif	54	64	62.9	+	.	Name=1;ID=1-297-phiX174;pvalue=5.16e-07;sequence=AGTCGAAAAAT;
+phiX174	fimo	polypeptide_motif	55	65	52.8	+	.	Name=1;ID=1-675-phiX174;pvalue=5.26e-06;sequence=GTCGAAAAATT;
+phiX174	fimo	polypeptide_motif	56	66	41.4	+	.	Name=1;ID=1-1713-phiX174;pvalue=7.2e-05;sequence=TCGAAAAATTA;
+phiX174	fimo	polypeptide_motif	58	68	43.4	+	.	Name=1;ID=1-1500-phiX174;pvalue=4.56e-05;sequence=GAAAAATTATC;
+phiX174	fimo	polypeptide_motif	59	69	59.6	+	.	Name=1;ID=1-409-phiX174;pvalue=1.1e-06;sequence=AAAAATTATCT;
+phiX174	fimo	polypeptide_motif	61	71	61.8	+	.	Name=1;ID=1-329-phiX174;pvalue=6.52e-07;sequence=AAATTATCTTG;
+phiX174	fimo	polypeptide_motif	63	73	59.2	+	.	Name=1;ID=1-419-phiX174;pvalue=1.2e-06;sequence=ATTATCTTGAT;
+phiX174	fimo	polypeptide_motif	65	75	53.3	+	.	Name=1;ID=1-643-phiX174;pvalue=4.66e-06;sequence=TATCTTGATAA;
+phiX174	fimo	polypeptide_motif	66	76	51.8	+	.	Name=1;ID=1-737-phiX174;pvalue=6.54e-06;sequence=ATCTTGATAAA;
+phiX174	fimo	polypeptide_motif	67	77	73.2	+	.	Name=1;ID=1-89-phiX174;pvalue=4.78e-08;sequence=TCTTGATAAAG;
+phiX174	fimo	polypeptide_motif	69	79	63.8	+	.	Name=1;ID=1-268-phiX174;pvalue=4.15e-07;sequence=TTGATAAAGCA;
+phiX174	fimo	polypeptide_motif	71	81	40.2	+	.	Name=1;ID=1-1882-phiX174;pvalue=9.49e-05;sequence=GATAAAGCAGG;
+phiX174	fimo	polypeptide_motif	73	83	45.4	+	.	Name=1;ID=1-1334-phiX174;pvalue=2.87e-05;sequence=TAAAGCAGGAA;
+phiX174	fimo	polypeptide_motif	74	84	50.9	+	.	Name=1;ID=1-832-phiX174;pvalue=8.05e-06;sequence=AAAGCAGGAAT;
+phiX174	fimo	polypeptide_motif	76	86	52.2	+	.	Name=1;ID=1-710-phiX174;pvalue=5.96e-06;sequence=AGCAGGAATTA;
+phiX174	fimo	polypeptide_motif	78	88	51.8	+	.	Name=1;ID=1-741-phiX174;pvalue=6.65e-06;sequence=CAGGAATTACT;
+phiX174	fimo	polypeptide_motif	79	89	 45	+	.	Name=1;ID=1-1369-phiX174;pvalue=3.16e-05;sequence=AGGAATTACTA;
+phiX174	fimo	polypeptide_motif	80	90	43.3	+	.	Name=1;ID=1-1511-phiX174;pvalue=4.63e-05;sequence=GGAATTACTAC;
+phiX174	fimo	polypeptide_motif	81	91	59.8	+	.	Name=1;ID=1-402-phiX174;pvalue=1.05e-06;sequence=GAATTACTACT;
+phiX174	fimo	polypeptide_motif	82	92	46.9	+	.	Name=1;ID=1-1205-phiX174;pvalue=2.03e-05;sequence=AATTACTACTG;
+phiX174	fimo	polypeptide_motif	88	98	41.2	+	.	Name=1;ID=1-1744-phiX174;pvalue=7.51e-05;sequence=TACTGCTTGTT;
+phiX174	fimo	polypeptide_motif	91	101	53.6	+	.	Name=1;ID=1-621-phiX174;pvalue=4.33e-06;sequence=TGCTTGTTTAC;
+phiX174	fimo	polypeptide_motif	92	102	44.8	+	.	Name=1;ID=1-1388-phiX174;pvalue=3.31e-05;sequence=GCTTGTTTACG;
+phiX174	fimo	polypeptide_motif	93	103	43.2	+	.	Name=1;ID=1-1525-phiX174;pvalue=4.82e-05;sequence=CTTGTTTACGA;
+phiX174	fimo	polypeptide_motif	95	105	61.9	+	.	Name=1;ID=1-327-phiX174;pvalue=6.5e-07;sequence=TGTTTACGAAT;
+phiX174	fimo	polypeptide_motif	96	106	42.9	+	.	Name=1;ID=1-1553-phiX174;pvalue=5.08e-05;sequence=GTTTACGAATT;
+phiX174	fimo	polypeptide_motif	98	108	45.4	+	.	Name=1;ID=1-1340-phiX174;pvalue=2.9e-05;sequence=TTACGAATTAA;
+phiX174	fimo	polypeptide_motif	99	109	73.5	+	.	Name=1;ID=1-88-phiX174;pvalue=4.48e-08;sequence=TACGAATTAAA;
+phiX174	fimo	polypeptide_motif	100	110	 53	+	.	Name=1;ID=1-661-phiX174;pvalue=4.99e-06;sequence=ACGAATTAAAT;
+phiX174	fimo	polypeptide_motif	102	112	75.6	+	.	Name=1;ID=1-72-phiX174;pvalue=2.75e-08;sequence=GAATTAAATCG;
+phiX174	fimo	polypeptide_motif	104	114	52.2	+	.	Name=1;ID=1-713-phiX174;pvalue=6.05e-06;sequence=ATTAAATCGAA;
+phiX174	fimo	polypeptide_motif	106	116	59.6	+	.	Name=1;ID=1-407-phiX174;pvalue=1.09e-06;sequence=TAAATCGAAGT;
+phiX174	fimo	polypeptide_motif	112	122	41.6	+	.	Name=1;ID=1-1683-phiX174;pvalue=6.85e-05;sequence=GAAGTGGACTG;
+phiX174	fimo	polypeptide_motif	114	124	45.3	+	.	Name=1;ID=1-1342-phiX174;pvalue=2.92e-05;sequence=AGTGGACTGCT;
+phiX174	fimo	polypeptide_motif	118	128	56.2	+	.	Name=1;ID=1-512-phiX174;pvalue=2.38e-06;sequence=GACTGCTGGCG;
+phiX174	fimo	polypeptide_motif	122	132	51.4	+	.	Name=1;ID=1-774-phiX174;pvalue=7.15e-06;sequence=GCTGGCGGAAA;
+phiX174	fimo	polypeptide_motif	123	133	43.1	+	.	Name=1;ID=1-1533-phiX174;pvalue=4.93e-05;sequence=CTGGCGGAAAA;
+phiX174	fimo	polypeptide_motif	124	134	48.6	+	.	Name=1;ID=1-1085-phiX174;pvalue=1.38e-05;sequence=TGGCGGAAAAT;
+phiX174	fimo	polypeptide_motif	125	135	68.3	+	.	Name=1;ID=1-146-phiX174;pvalue=1.49e-07;sequence=GGCGGAAAATG;
+phiX174	fimo	polypeptide_motif	126	136	46.4	+	.	Name=1;ID=1-1243-phiX174;pvalue=2.27e-05;sequence=GCGGAAAATGA;
+phiX174	fimo	polypeptide_motif	128	138	58.3	+	.	Name=1;ID=1-446-phiX174;pvalue=1.48e-06;sequence=GGAAAATGAGA;
+phiX174	fimo	polypeptide_motif	129	139	43.2	+	.	Name=1;ID=1-1522-phiX174;pvalue=4.78e-05;sequence=GAAAATGAGAA;
+phiX174	fimo	polypeptide_motif	130	140	54.1	+	.	Name=1;ID=1-595-phiX174;pvalue=3.92e-06;sequence=AAAATGAGAAA;
+phiX174	fimo	polypeptide_motif	131	141	 76	+	.	Name=1;ID=1-68-phiX174;pvalue=2.49e-08;sequence=AAATGAGAAAA;
+phiX174	fimo	polypeptide_motif	132	142	51.2	+	.	Name=1;ID=1-800-phiX174;pvalue=7.57e-06;sequence=AATGAGAAAAT;
+phiX174	fimo	polypeptide_motif	133	143	56.2	+	.	Name=1;ID=1-513-phiX174;pvalue=2.41e-06;sequence=ATGAGAAAATT;
+phiX174	fimo	polypeptide_motif	134	144	41.1	+	.	Name=1;ID=1-1761-phiX174;pvalue=7.83e-05;sequence=TGAGAAAATTC;
+phiX174	fimo	polypeptide_motif	135	145	50.3	+	.	Name=1;ID=1-910-phiX174;pvalue=9.39e-06;sequence=GAGAAAATTCG;
+phiX174	fimo	polypeptide_motif	136	146	43.3	+	.	Name=1;ID=1-1517-phiX174;pvalue=4.66e-05;sequence=AGAAAATTCGA;
+phiX174	fimo	polypeptide_motif	139	149	54.2	+	.	Name=1;ID=1-588-phiX174;pvalue=3.75e-06;sequence=AAATTCGACCT;
+phiX174	fimo	polypeptide_motif	141	151	42.2	+	.	Name=1;ID=1-1625-phiX174;pvalue=6.01e-05;sequence=ATTCGACCTAT;
+phiX174	fimo	polypeptide_motif	143	153	 50	+	.	Name=1;ID=1-938-phiX174;pvalue=9.94e-06;sequence=TCGACCTATCC;
+phiX174	fimo	polypeptide_motif	145	155	44.6	+	.	Name=1;ID=1-1403-phiX174;pvalue=3.42e-05;sequence=GACCTATCCTT;
+phiX174	fimo	polypeptide_motif	155	165	51.3	+	.	Name=1;ID=1-787-phiX174;pvalue=7.35e-06;sequence=TGCGCAGCTCG;
+phiX174	fimo	polypeptide_motif	157	167	51.1	+	.	Name=1;ID=1-807-phiX174;pvalue=7.68e-06;sequence=CGCAGCTCGAG;
+phiX174	fimo	polypeptide_motif	159	169	44.5	+	.	Name=1;ID=1-1420-phiX174;pvalue=3.56e-05;sequence=CAGCTCGAGAA;
+phiX174	fimo	polypeptide_motif	160	170	 40	+	.	Name=1;ID=1-1921-phiX174;pvalue=9.89e-05;sequence=AGCTCGAGAAG;
+phiX174	fimo	polypeptide_motif	166	176	60.9	+	.	Name=1;ID=1-365-phiX174;pvalue=8.02e-07;sequence=AGAAGCTCTTA;
+phiX174	fimo	polypeptide_motif	168	178	62.3	+	.	Name=1;ID=1-311-phiX174;pvalue=5.87e-07;sequence=AAGCTCTTACT;
+phiX174	fimo	polypeptide_motif	181	191	49.9	+	.	Name=1;ID=1-946-phiX174;pvalue=1.01e-05;sequence=GCGACCTTTCG;
+phiX174	fimo	polypeptide_motif	187	197	52.5	+	.	Name=1;ID=1-694-phiX174;pvalue=5.64e-06;sequence=TTTCGCCATCA;
+phiX174	fimo	polypeptide_motif	191	201	46.6	+	.	Name=1;ID=1-1232-phiX174;pvalue=2.2e-05;sequence=GCCATCAACTA;
+phiX174	fimo	polypeptide_motif	194	204	76.4	+	.	Name=1;ID=1-67-phiX174;pvalue=2.29e-08;sequence=ATCAACTAACG;
+phiX174	fimo	polypeptide_motif	201	211	40.1	+	.	Name=1;ID=1-1908-phiX174;pvalue=9.77e-05;sequence=AACGATTCTGT;
+phiX174	fimo	polypeptide_motif	203	213	 63	+	.	Name=1;ID=1-291-phiX174;pvalue=5e-07;sequence=CGATTCTGTCA;
+phiX174	fimo	polypeptide_motif	205	215	53.8	+	.	Name=1;ID=1-610-phiX174;pvalue=4.16e-06;sequence=ATTCTGTCAAA;
+phiX174	fimo	polypeptide_motif	206	216	59.1	+	.	Name=1;ID=1-421-phiX174;pvalue=1.23e-06;sequence=TTCTGTCAAAA;
+phiX174	fimo	polypeptide_motif	207	217	 68	+	.	Name=1;ID=1-153-phiX174;pvalue=1.58e-07;sequence=TCTGTCAAAAA;
+phiX174	fimo	polypeptide_motif	209	219	49.6	+	.	Name=1;ID=1-988-phiX174;pvalue=1.09e-05;sequence=TGTCAAAAACT;
+phiX174	fimo	polypeptide_motif	210	220	40.8	+	.	Name=1;ID=1-1810-phiX174;pvalue=8.33e-05;sequence=GTCAAAAACTG;
+phiX174	fimo	polypeptide_motif	213	223	59.7	+	.	Name=1;ID=1-404-phiX174;pvalue=1.06e-06;sequence=AAAAACTGACG;
+phiX174	fimo	polypeptide_motif	223	233	 42	+	.	Name=1;ID=1-1654-phiX174;pvalue=6.36e-05;sequence=GCGTTGGATGA;
+phiX174	fimo	polypeptide_motif	225	235	61.4	+	.	Name=1;ID=1-349-phiX174;pvalue=7.16e-07;sequence=GTTGGATGAGG;
+phiX174	fimo	polypeptide_motif	227	237	40.3	+	.	Name=1;ID=1-1874-phiX174;pvalue=9.32e-05;sequence=TGGATGAGGAG;
+phiX174	fimo	polypeptide_motif	228	238	49.9	+	.	Name=1;ID=1-947-phiX174;pvalue=1.01e-05;sequence=GGATGAGGAGA;
+phiX174	fimo	polypeptide_motif	229	239	 45	+	.	Name=1;ID=1-1370-phiX174;pvalue=3.16e-05;sequence=GATGAGGAGAA;
+phiX174	fimo	polypeptide_motif	230	240	44.8	+	.	Name=1;ID=1-1395-phiX174;pvalue=3.33e-05;sequence=ATGAGGAGAAG;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/output.memepsp	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,6 @@
+>BBP_PIEBR 20 scaledmin = 0.1 scaledmax = 0.9
+0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0.006488825 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+>ICYA_MANSE 20 scaledmin = 0.1 scaledmax = 0.9
+0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0.005878511 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+>LACB_BOVIN 20 scaledmin = 0.1 scaledmax = 0.9
+0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0.006284916 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/phiX.fasta	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,79 @@
+>phiX174
+GAGTTTTATCGCTTCCATGACGCAGAAGTTAACACTTTCGGATATTTCTGATGAGTCGAAAAATTATCTT
+GATAAAGCAGGAATTACTACTGCTTGTTTACGAATTAAATCGAAGTGGACTGCTGGCGGAAAATGAGAAA
+ATTCGACCTATCCTTGCGCAGCTCGAGAAGCTCTTACTTTGCGACCTTTCGCCATCAACTAACGATTCTG
+TCAAAAACTGACGCGTTGGATGAGGAGAAGTGGCTTAATATGCTTGGCACGTTCGTCAAGGACTGGTTTA
+GATATGAGTCACATTTTGTTCATGGTAGAGATTCTCTTGTTGACATTTTAAAAGAGCGTGGATTACTATC
+TGAGTCCGATGCTGTTCAACCACTAATAGGTAAGAAATCATGAGTCAAGTTACTGAACAATCCGTACGTT
+TCCAGACCGCTTTGGCCTCTATTAAGCTCATTCAGGCTTCTGCCGTTTTGGATTTAACCGAAGATGATTT
+CGATTTTCTGACGAGTAACAAAGTTTGGATTGCTACTGACCGCTCTCGTGCTCGTCGCTGCGTTGAGGCT
+TGCGTTTATGGTACGCTGGACTTTGTGGGATACCCTCGCTTTCCTGCTCCTGTTGAGTTTATTGCTGCCG
+TCATTGCTTATTATGTTCATCCCGTCAACATTCAAACGGCCTGTCTCATCATGGAAGGCGCTGAATTTAC
+GGAAAACATTATTAATGGCGTCGAGCGTCCGGTTAAAGCCGCTGAATTGTTCGCGTTTACCTTGCGTGTA
+CGCGCAGGAAACACTGACGTTCTTACTGACGCAGAAGAAAACGTGCGTCAAAAATTACGTGCAGAAGGAG
+TGATGTAATGTCTAAAGGTAAAAAACGTTCTGGCGCTCGCCCTGGTCGTCCGCAGCCGTTGCGAGGTACT
+AAAGGCAAGCGTAAAGGCGCTCGTCTTTGGTATGTAGGTGGTCAACAATTTTAATTGCAGGGGCTTCGGC
+CCCTTACTTGAGGATAAATTATGTCTAATATTCAAACTGGCGCCGAGCGTATGCCGCATGACCTTTCCCA
+TCTTGGCTTCCTTGCTGGTCAGATTGGTCGTCTTATTACCATTTCAACTACTCCGGTTATCGCTGGCGAC
+TCCTTCGAGATGGACGCCGTTGGCGCTCTCCGTCTTTCTCCATTGCGTCGTGGCCTTGCTATTGACTCTA
+CTGTAGACATTTTTACTTTTTATGTCCCTCATCGTCACGTTTATGGTGAACAGTGGATTAAGTTCATGAA
+GGATGGTGTTAATGCCACTCCTCTCCCGACTGTTAACACTACTGGTTATATTGACCATGCCGCTTTTCTT
+GGCACGATTAACCCTGATACCAATAAAATCCCTAAGCATTTGTTTCAGGGTTATTTGAATATCTATAACA
+ACTATTTTAAAGCGCCGTGGATGCCTGACCGTACCGAGGCTAACCCTAATGAGCTTAATCAAGATGATGC
+TCGTTATGGTTTCCGTTGCTGCCATCTCAAAAACATTTGGACTGCTCCGCTTCCTCCTGAGACTGAGCTT
+TCTCGCCAAATGACGACTTCTACCACATCTATTGACATTATGGGTCTGCAAGCTGCTTATGCTAATTTGC
+ATACTGACCAAGAACGTGATTACTTCATGCAGCGTTACCGTGATGTTATTTCTTCATTTGGAGGTAAAAC
+CTCTTATGACGCTGACAACCGTCCTTTACTTGTCATGCGCTCTAATCTCTGGGCATCTGGCTATGATGTT
+GATGGAACTGACCAAACGTCGTTAGGCCAGTTTTCTGGTCGTGTTCAACAGACCTATAAACATTCTGTGC
+CGCGTTTCTTTGTTCCTGAGCATGGCACTATGTTTACTCTTGCGCTTGTTCGTTTTCCGCCTACTGCGAC
+TAAAGAGATTCAGTACCTTAACGCTAAAGGTGCTTTGACTTATACCGATATTGCTGGCGACCCTGTTTTG
+TATGGCAACTTGCCGCCGCGTGAAATTTCTATGAAGGATGTTTTCCGTTCTGGTGATTCGTCTAAGAAGT
+TTAAGATTGCTGAGGGTCAGTGGTATCGTTATGCGCCTTCGTATGTTTCTCCTGCTTATCACCTTCTTGA
+AGGCTTCCCATTCATTCAGGAACCGCCTTCTGGTGATTTGCAAGAACGCGTACTTATTCGCCACCATGAT
+TATGACCAGTGTTTCCAGTCCGTTCAGTTGTTGCAGTGGAATAGTCAGGTTAAATTTAATGTGACCGTTT
+ATCGCAATCTGCCGACCACTCGCGATTCAATCATGACTTCGTGATAAAAGATTGAGTGTGAGGTTATAAC
+GCCGAAGCGGTAAAAATTTTAATTTTTGCCGCTGAGGGGTTGACCAAGCGAAGCGCGGTAGGTTTTCTGC
+TTAGGAGTTTAATCATGTTTCAGACTTTTATTTCTCGCCATAATTCAAACTTTTTTTCTGATAAGCTGGT
+TCTCACTTCTGTTACTCCAGCTTCTTCGGCACCTGTTTTACAGACACCTAAAGCTACATCGTCAACGTTA
+TATTTTGATAGTTTGACGGTTAATGCTGGTAATGGTGGTTTTCTTCATTGCATTCAGATGGATACATCTG
+TCAACGCCGCTAATCAGGTTGTTTCTGTTGGTGCTGATATTGCTTTTGATGCCGACCCTAAATTTTTTGC
+CTGTTTGGTTCGCTTTGAGTCTTCTTCGGTTCCGACTACCCTCCCGACTGCCTATGATGTTTATCCTTTG
+AATGGTCGCCATGATGGTGGTTATTATACCGTCAAGGACTGTGTGACTATTGACGTCCTTCCCCGTACGC
+CGGGCAATAATGTTTATGTTGGTTTCATGGTTTGGTCTAACTTTACCGCTACTAAATGCCGCGGATTGGT
+TTCGCTGAATCAGGTTATTAAAGAGATTATTTGTCTCCAGCCACTTAAGTGAGGTGATTTATGTTTGGTG
+CTATTGCTGGCGGTATTGCTTCTGCTCTTGCTGGTGGCGCCATGTCTAAATTGTTTGGAGGCGGTCAAAA
+AGCCGCCTCCGGTGGCATTCAAGGTGATGTGCTTGCTACCGATAACAATACTGTAGGCATGGGTGATGCT
+GGTATTAAATCTGCCATTCAAGGCTCTAATGTTCCTAACCCTGATGAGGCCGCCCCTAGTTTTGTTTCTG
+GTGCTATGGCTAAAGCTGGTAAAGGACTTCTTGAAGGTACGTTGCAGGCTGGCACTTCTGCCGTTTCTGA
+TAAGTTGCTTGATTTGGTTGGACTTGGTGGCAAGTCTGCCGCTGATAAAGGAAAGGATACTCGTGATTAT
+CTTGCTGCTGCATTTCCTGAGCTTAATGCTTGGGAGCGTGCTGGTGCTGATGCTTCCTCTGCTGGTATGG
+TTGACGCCGGATTTGAGAATCAAAAAGAGCTTACTAAAATGCAACTGGACAATCAGAAAGAGATTGCCGA
+GATGCAAAATGAGACTCAAAAAGAGATTGCTGGCATTCAGTCGGCGACTTCACGCCAGAATACGAAAGAC
+CAGGTATATGCACAAAATGAGATGCTTGCTTATCAACAGAAGGAGTCTACTGCTCGCGTTGCGTCTATTA
+TGGAAAACACCAATCTTTCCAAGCAACAGCAGGTTTCCGAGATTATGCGCCAAATGCTTACTCAAGCTCA
+AACGGCTGGTCAGTATTTTACCAATGACCAAATCAAAGAAATGACTCGCAAGGTTAGTGCTGAGGTTGAC
+TTAGTTCATCAGCAAACGCAGAATCAGCGGTATGGCTCTTCTCATATTGGCGCTACTGCAAAGGATATTT
+CTAATGTCGTCACTGATGCTGCTTCTGGTGTGGTTGATATTTTTCATGGTATTGATAAAGCTGTTGCCGA
+TACTTGGAACAATTTCTGGAAAGACGGTAAAGCTGATGGTATTGGCTCTAATTTGTCTAGGAAATAACCG
+TCAGGATTGACACCCTCCCAATTGTATGTTTTCATGCCTCCAAATCTTGGAGGCTTTTTTATGGTTCGTT
+CTTATTACCCTTCTGAATGTCACGCTGATTATTTTGACTTTGAGCGTATCGAGGCTCTTAAACCTGCTAT
+TGAGGCTTGTGGCATTTCTACTCTTTCTCAATCCCCAATGCTTGGCTTCCATAAGCAGATGGATAACCGC
+ATCAAGCTCTTGGAAGAGATTCTGTCTTTTCGTATGCAGGGCGTTGAGTTCGATAATGGTGATATGTATG
+TTGACGGCCATAAGGCTGCTTCTGACGTTCGTGATGAGTTTGTATCTGTTACTGAGAAGTTAATGGATGA
+ATTGGCACAATGCTACAATGTGCTCCCCCAACTTGATATTAATAACACTATAGACCACCGCCCCGAAGGG
+GACGAAAAATGGTTTTTAGAGAACGAGAAGACGGTTACGCAGTTTTGCCGCAAGCTGGCTGCTGAACGCC
+CTCTTAAGGATATTCGCGATGAGTATAATTACCCCAAAAAGAAAGGTATTAAGGATGAGTGTTCAAGATT
+GCTGGAGGCCTCCACTATGAAATCGCGTAGAGGCTTTACTATTCAGCGTTTGATGAATGCAATGCGACAG
+GCTCATGCTGATGGTTGGTTTATCGTTTTTGACACTCTCACGTTGGCTGACGACCGATTAGAGGCGTTTT
+ATGATAATCCCAATGCTTTGCGTGACTATTTTCGTGATATTGGTCGTATGGTTCTTGCTGCCGAGGGTCG
+CAAGGCTAATGATTCACACGCCGACTGCTATCAGTATTTTTGTGTGCCTGAGTATGGTACAGCTAATGGC
+CGTCTTCATTTCCATGCGGTGCATTTTATGCGGACACTTCCTACAGGTAGCGTTGACCCTAATTTTGGTC
+GTCGGGTACGCAATCGCCGCCAGTTAAATAGCTTGCAAAATACGTGGCCTTATGGTTACAGTATGCCCAT
+CGCAGTTCGCTACACGCAGGACGCTTTTTCACGTTCTGGTTGGTTGTGGCCTGTTGATGCTAAAGGTGAG
+CCGCTTAAAGCTACCAGTTATATGGCTGTTGGTTTCTATGTGGCTAAATACGTTAACAAAAAGTCAGATA
+TGGACCTTGCTGCTAAAGGTCTAGGAGCTAAAGAATGGAACAACTCACTAAAAACCAAGCTGTCGCTACT
+TCCCAAGAAGCTGTTCAGAATCAGAATGAGCCGCAACTTCGGGATGAAAATGCTCACAATGACAAATCTG
+TCCACGGAGTGCTTAATCCAACTTACCAAGCTGGGTTACGACGCGACGCCGTTCAACCAGATATTGAAGC
+AGAACGCAAAAAGAGAGATGAGATTGAGGCTGGGAAAAGTTACTGTAGCCGACGTTTTGGCGGCGCAACC
+TGTGACGACAAATCTGCTCAAATTTATGCGCGCTTCGATAAAAATGATTGGCGTATCCAACCTGCA
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/prior30.plib	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,275 @@
+Alphabet= ACDEFGHIKLMNPQRSTVWY
+NumDistr= 30
+Number= 0
+Mixture= 0.055795
+B= 5.623820
+Alpha= 0.0855491 0.0221831 0.0111063 0.0209959 0.0505726 0.025437 0.0155389 0.132951 0.0247865 0.150287 0.0577239 0.0209317 0.0166629 0.0220905 0.0244295 0.0497608 0.070277 0.157532 0.0102219 0.0309633 
+FullUpdate= 1
+QUpdate= 1
+StructID=      0
+Comment=    HMM9.4 reestimated in henikoff29.2
+
+Number= 1
+Mixture= 0.198333
+B= 0.097240
+Alpha= 0.0562629 0.0329597 0.0692513 0.0385232 0.0400041 0.143573 0.0428939 0.0226244 0.0442102 0.0665467 0.0117853 0.0447655 0.0833299 0.0395825 0.0611271 0.0588852 0.0513472 0.0317153 0.0237865 0.0368161 
+FullUpdate= 1
+QUpdate= 1
+StructID=       24
+Comment=      Outside
+
+Number= 2
+Mixture= 0.043566
+B= 1.648336
+Alpha= 0.0144564 0.00845337 0.00785519 0.00864933 0.255959 0.0110815 0.0509526 0.0234533 0.0120443 0.0561967 0.015111 0.0190974 0.00857653 0.0167812 0.0164918 0.0197108 0.0151013 0.0252782 0.050139 0.364613 
+FullUpdate= 1
+QUpdate= 1
+StructID=       26
+Comment=       Inside
+
+Number= 3
+Mixture= 0.060170
+B= 2.595432
+Alpha= 0.0452144 0.00587917 0.169731 0.0751478 0.00749471 0.0845832 0.0369819 0.00610072 0.0548186 0.011029 0.00382749 0.212785 0.0206532 0.0416705 0.0280716 0.117267 0.0533742 0.00943157 0.00216149 0.0137784 
+FullUpdate= 1
+QUpdate= 1
+StructID=       19
+Comment=      Outside Alpha
+
+Number= 4
+Mixture= 0.065466
+B= 3.112271
+Alpha= 0.0361167 0.0049157 0.0134924 0.0461325 0.00557631 0.0209043 0.0302551 0.016425 0.307554 0.0338255 0.0139435 0.0360733 0.0127659 0.0873761 0.222668 0.0369042 0.0354442 0.0228891 0.00434827 0.0123906 
+FullUpdate= 1
+QUpdate= 1
+StructID=       21
+Comment=       Outside Beta
+
+Number= 5
+Mixture= 0.067614
+B= 2.053644
+Alpha= 0.0194362 0.00765176 0.00188738 0.00372898 0.0849894 0.00421787 0.00400459 0.152735 0.00407958 0.4568 0.106051 0.00304386 0.00545956 0.00900935 0.00605071 0.00519029 0.016255 0.0861045 0.00787965 0.0154248 
+FullUpdate= 1
+QUpdate= 1
+StructID=       22
+Comment=      Inside alpha
+
+Number= 6
+Mixture= 0.080724
+B= 2.138987
+Alpha= 0.0423172 0.0153891 0.00409306 0.00565735 0.0197117 0.00590607 0.00139926 0.307863 0.00544884 0.115721 0.0285808 0.00522771 0.00474851 0.00328193 0.00351054 0.00892385 0.0348922 0.380003 0.00117673 0.00614917 
+FullUpdate= 1
+QUpdate= 1
+StructID=       23
+Comment=       Inside beta
+
+Number= 7
+Mixture= 0.051030
+B= 3.878926
+Alpha= 0.0548123 0.000759746 0.144127 0.46019 0.00249502 0.0192754 0.0106535 0.00938765 0.0562429 0.0163148 0.00717389 0.0245612 0.0177482 0.0744802 0.0199233 0.0323535 0.0257651 0.018574 0.00087086 0.00429088 
+FullUpdate= 1
+QUpdate= 1
+StructID=       23
+Comment=      Alpha helix
+
+Number= 8
+Mixture= 0.103529
+B= 1.486325
+Alpha= 0.315754 0.0384546 0.0116388 0.0133665 0.0111126 0.107921 0.00752325 0.0154885 0.0111281 0.0231087 0.011626 0.0228375 0.0304785 0.0166632 0.0156345 0.186379 0.0954421 0.0546691 0.00351538 0.00725682 
+FullUpdate= 1
+QUpdate= 1
+StructID=       23
+Comment=      Beta strand
+
+Number= 9
+Mixture= 0.062940
+B= 8.221215
+Alpha= 0.0869919 0.00672577 0.0600995 0.10763 0.0153489 0.0378086 0.0325335 0.023388 0.113765 0.041623 0.0196906 0.0625344 0.0262599 0.0788667 0.0707399 0.0886634 0.0666777 0.0361472 0.00484308 0.0196629 
+FullUpdate= 1
+QUpdate= 1
+StructID=       23
+Comment=      Other
+
+Number= 10
+Mixture= 0.012518
+B= 38.955631
+Alpha= 0.732922 0.0145131 0.00623235 0.00951423 0.00717778 0.0289521 0.00351664 0.0125081 0.00886593 0.0183651 0.00832812 0.00670968 0.00364556 0.00622169 0.00812899 0.0582399 0.0205067 0.0394327 0.00207485 0.00414489 
+FullUpdate= 1
+QUpdate= 1
+StructID=      0
+Comment=      A
+
+Number= 11
+Mixture= 0.004953
+B= 381.562195
+Alpha= 0.00563239 0.959814 0.00144129 0.00213042 0.00158645 0.00168393 0.000989765 0.00325263 0.00148501 0.00343924 0.00168673 0.00159054 0.00121534 0.00129942 0.00195209 0.00296106 0.0039912 0.00266944 0.000327808 0.000851203 
+FullUpdate= 1
+QUpdate= 1
+StructID=      0
+Comment=      C
+
+Number= 12
+Mixture= 0.013849
+B= 90.727570
+Alpha= 0.00897115 0.00169015 0.859473 0.0360829 0.00269485 0.00606504 0.00469816 0.00400134 0.0047981 0.00514968 0.00208395 0.029754 0.00241276 0.0045506 0.00433816 0.0088208 0.00511143 0.00527448 0.00104469 0.00298475 
+FullUpdate= 1
+QUpdate= 1
+StructID=      0
+Comment=     D 
+
+Number= 13
+Mixture= 0.008388
+B= 404.591034
+Alpha= 0.00241514 0.000413991 0.0122981 0.96369 0.000665578 0.00187461 0.00106904 0.00149214 0.00121548 0.00129791 0.000554145 0.00253496 0.000624495 0.00316839 0.00115045 0.00171781 0.001468 0.0014564 0.000278652 0.000614791 
+FullUpdate= 1
+QUpdate= 1
+StructID=      0
+Comment=      E 
+
+Number= 14
+Mixture= 0.008064
+B= 83.323669
+Alpha= 0.00839779 0.00428348 0.00298116 0.00358128 0.850936 0.00329382 0.00196832 0.0130534 0.00320345 0.0351883 0.00729724 0.00287304 0.00358482 0.00218728 0.00264753 0.00833798 0.00418729 0.0120684 0.00448366 0.025446 
+FullUpdate= 1
+QUpdate= 1
+StructID=      0
+Comment=     F 
+
+Number= 15
+Mixture= 0.032205
+B= 32.644871
+Alpha= 0.0234448 0.00236512 0.0112957 0.00811395 0.00248143 0.868718 0.00345598 0.00342985 0.00859682 0.0040966 0.00239339 0.012342 0.00423123 0.00440054 0.00795347 0.0165095 0.0065024 0.00550512 0.00140604 0.00275817 
+FullUpdate= 1
+QUpdate= 1
+StructID=      0
+Comment=     G 
+
+Number= 16
+Mixture= 0.005033
+B= 35.520824
+Alpha= 0.0100058 0.00386024 0.0131498 0.0108984 0.0122851 0.00738691 0.722249 0.00521193 0.00686054 0.0150103 0.00673014 0.0367074 0.00625526 0.0429912 0.0234127 0.0187246 0.0128445 0.00837399 0.00390723 0.0331349 
+FullUpdate= 1
+QUpdate= 1
+StructID=      0
+Comment=     H 
+
+Number= 17
+Mixture= 0.007454
+B= 101.265472
+Alpha= 0.0106938 0.00267663 0.00404166 0.00466637 0.00838963 0.00372808 0.00182575 0.681615 0.0059102 0.0770333 0.0184335 0.004676 0.0027124 0.00372663 0.00418165 0.00773357 0.0109237 0.140679 0.00140417 0.00494911 
+FullUpdate= 1
+QUpdate= 1
+StructID=      0
+Comment=     I 
+
+Number= 18
+Mixture= 0.009400
+B= 150.415985
+Alpha= 0.00688657 0.00169711 0.00222738 0.00346887 0.00115861 0.00302866 0.00209171 0.00400905 0.903944 0.0037747 0.00186061 0.00449531 0.00249618 0.00324487 0.041775 0.00392196 0.00461714 0.00296607 0.000893256 0.00144282 
+FullUpdate= 1
+QUpdate= 1
+StructID=      0
+Comment=      K 
+
+Number= 19
+Mixture= 0.017057
+B= 31.896633
+Alpha= 0.0114646 0.00367926 0.00296188 0.00596126 0.0190009 0.00382486 0.00338381 0.0401936 0.00650072 0.790038 0.031659 0.00392791 0.0050046 0.00753591 0.00771818 0.00748621 0.0101555 0.0312597 0.00242405 0.00581952 
+FullUpdate= 1
+QUpdate= 1
+StructID=      0
+Comment=     L 
+
+Number= 20
+Mixture= 0.002761
+B= 201.346268
+Alpha= 0.00353933 0.00165628 0.0014931 0.00161065 0.00279831 0.00194259 0.00101868 0.00969101 0.00211316 0.0217036 0.928022 0.00162899 0.0015681 0.0015629 0.00138977 0.00294601 0.00311476 0.00723178 0.00156295 0.00340569 
+FullUpdate= 1
+QUpdate= 1
+StructID=      0
+Comment=     M 
+
+Number= 21
+Mixture= 0.005734
+B= 108.343185
+Alpha= 0.0067512 0.00239062 0.0140378 0.0043452 0.00365788 0.00689345 0.0148828 0.00715373 0.00789036 0.00614036 0.00289697 0.858995 0.00399721 0.00770961 0.00570515 0.0238176 0.011602 0.00591549 0.00167893 0.00353897 
+FullUpdate= 1
+QUpdate= 1
+StructID=      0
+Comment=     N 
+
+Number= 22
+Mixture= 0.022818
+B= 15.153304
+Alpha= 0.0417987 0.00360232 0.0113792 0.0152366 0.00564775 0.0123795 0.00606957 0.0091353 0.0165122 0.0167265 0.00490487 0.00915437 0.755604 0.0131375 0.012587 0.0283392 0.0189623 0.0140029 0.0012848 0.00353553 
+FullUpdate= 1
+QUpdate= 1
+StructID=      0
+Comment=     P 
+
+Number= 23
+Mixture= 0.005931
+B= 79.417511
+Alpha= 0.0142993 0.00266984 0.0053289 0.0321605 0.0028715 0.00426743 0.0257509 0.00565307 0.0106106 0.0161186 0.00955753 0.0104696 0.00638107 0.807311 0.0149106 0.0111968 0.00889459 0.00681482 0.00206658 0.00266624 
+FullUpdate= 1
+QUpdate= 1
+StructID=      0
+Comment=     Q 
+
+Number= 24
+Mixture= 0.011491
+B= 93.103897
+Alpha= 0.00756896 0.00314197 0.00296652 0.00327634 0.00194604 0.00467894 0.00721049 0.00406061 0.0277257 0.00663852 0.00217868 0.00577047 0.00473306 0.00953551 0.889701 0.00650859 0.00506022 0.00294281 0.00205549 0.00230062 
+FullUpdate= 1
+QUpdate= 1
+StructID=      0
+Comment=      R 
+
+Number= 25
+Mixture= 0.008219
+B= 47.504795
+Alpha= 0.0284818 0.00697155 0.00749796 0.00604665 0.00515171 0.00954817 0.00380684 0.00637929 0.0104463 0.00908885 0.00471437 0.0194592 0.00711823 0.00611827 0.00979722 0.707416 0.139256 0.00656298 0.0015377 0.00460086 
+FullUpdate= 1
+QUpdate= 1
+StructID=    0
+Comment=     S 
+
+Number= 26
+Mixture= 0.019050
+B= 14.027470
+Alpha= 0.0247201 0.00718027 0.00845584 0.0076239 0.00600101 0.0073401 0.00492149 0.0173757 0.0129878 0.0125773 0.0100452 0.0230424 0.00659406 0.0110314 0.0112037 0.107763 0.690341 0.0249364 0.00193884 0.00392074 
+FullUpdate= 1
+QUpdate= 1
+StructID=      0
+Comment=     T 
+
+Number= 27
+Mixture= 0.007047
+B= 76.958153
+Alpha= 0.0447488 0.00734525 0.00576457 0.00805666 0.00714188 0.00593389 0.0041663 0.0688592 0.00714299 0.0255115 0.00800708 0.00501678 0.00632646 0.00492002 0.00812967 0.0100074 0.0240134 0.745035 0.00126243 0.00261056 
+FullUpdate= 1
+QUpdate= 1
+StructID=      0
+Comment=     V 
+
+Number= 28
+Mixture= 0.003957
+B= 150.973328
+Alpha= 0.00517343 0.00213336 0.00350645 0.00390297 0.018439 0.0041919 0.0023655 0.00404231 0.00420998 0.0171406 0.00379068 0.00363696 0.00245861 0.00387467 0.00502035 0.00465674 0.00417283 0.00620977 0.888513 0.012561 
+FullUpdate= 1
+QUpdate= 1
+StructID=      0
+Comment=     W 
+
+Number= 29
+Mixture= 0.004904
+B= 30.653225
+Alpha= 0.0342049 0.00809912 0.0126852 0.0174701 0.156033 0.0118268 0.0431342 0.0204751 0.0164439 0.0363664 0.0129811 0.0131986 0.0103037 0.0116235 0.0159032 0.0287792 0.0176143 0.024986 0.0131845 0.494687 
+FullUpdate= 1
+QUpdate= 1
+StructID=      0
+Comment=     Y 
+
+/* $Header$ */
+/* $Header$ */
+/* $Header$ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tool_data_table_conf.xml.sample	Wed Apr 25 12:13:22 2018 -0400
@@ -0,0 +1,7 @@
+<tables>
+    <!-- Locations of all fasta files under genome directory -->
+    <table name="all_fasta" comment_char="#" allow_duplicate_entries="False">
+        <columns>value, dbkey, name, path</columns>
+        <file path="tool-data/all_fasta.loc" />
+    </table>
+</tables>