[med-svn] [axe-demultiplexer] 01/06: New upstream version 0.3.2+dfsg
Kevin Murray
daube-guest at moszumanska.debian.org
Thu Dec 1 01:52:05 UTC 2016
This is an automated email from the git hooks/post-receive script.
daube-guest pushed a commit to branch master
in repository axe-demultiplexer.
commit aee843ae19471227aa92f6a158fcb1b616a7ebcc
Author: Kevin Murray <kdmfoss at gmail.com>
Date: Thu Dec 1 12:32:06 2016 +1100
New upstream version 0.3.2+dfsg
---
.gitmodules | 3 -
.travis.yml | 38 +-
CMakeLists.txt | 42 +-
README.md | 8 +-
docs/gitversion.py | 4 +-
src/axe.c | 31 +-
src/axe.h | 13 +-
src/axe_config.h.in | 2 +
src/gsl/combination.c | 171 -
src/gsl/error.c | 77 -
src/gsl/gsl_combination.h | 76 -
src/gsl/gsl_errno.h | 153 -
src/gsl/gsl_message.h | 79 -
src/gsl/init.c | 127 -
src/gsl/message.c | 37 -
src/gsl/stream.c | 65 -
src/gsl/strerror.c | 100 -
src/libqes/.gitignore | 12 +
src/libqes/.gitmodules | 0
src/libqes/.travis.yml | 35 +
src/libqes/AUTHORS | 1 +
src/libqes/CMakeLists.txt | 147 +
src/libqes/LICENSE | 619 +++
src/libqes/README.md | 31 +
src/libqes/TODO.md | 11 +
src/libqes/cmake-modules/CodeCoverage.cmake | 158 +
src/libqes/cmake-modules/FindLIBQES.cmake | 97 +
.../cmake-modules/GetGitRevisionDescription.cmake | 130 +
.../GetGitRevisionDescription.cmake.in | 38 +
src/libqes/cmake-modules/GitSemVer.cmake | 49 +
src/libqes/src/CMakeLists.txt | 27 +
src/libqes/src/crc.c | 101 +
src/libqes/src/crc.h | 46 +
src/libqes/src/qes.h | 42 +
src/libqes/src/qes_compat.c | 82 +
src/libqes/src/qes_compat.h | 45 +
src/libqes/src/qes_config.h.in | 92 +
src/libqes/src/qes_file.c | 520 +++
src/libqes/src/qes_file.h | 229 ++
src/libqes/src/qes_libgnu.c | 32 +
src/libqes/src/qes_libgnu.h | 44 +
src/libqes/src/qes_log.c | 267 ++
src/libqes/src/qes_log.h | 166 +
src/libqes/src/qes_match.c | 99 +
src/libqes/src/qes_match.h | 66 +
src/libqes/src/qes_seq.c | 232 ++
src/libqes/src/qes_seq.h | 219 ++
src/libqes/src/qes_seqfile.c | 327 ++
src/libqes/src/qes_seqfile.h | 240 ++
src/libqes/src/qes_sequtil.c | 272 ++
src/libqes/src/qes_sequtil.h | 39 +
src/libqes/src/qes_str.c | 52 +
src/libqes/src/qes_str.h | 184 +
src/libqes/src/qes_util.c | 75 +
src/libqes/src/qes_util.h | 250 ++
src/libqes/test/CMakeLists.txt | 45 +
src/libqes/test/benchmarks.c | 311 ++
src/libqes/test/data/bad_diff_lens.fastq | 4 +
src/libqes/test/data/bad_nohdr.fastq | 3 +
src/libqes/test/data/bad_noqual.fastq | 3 +
src/libqes/test/data/bad_noqualhdrchr.fastq | 4 +
src/libqes/test/data/bad_noqualhdreol.fastq | 3 +
src/libqes/test/data/empty.fastq | 1 +
src/libqes/test/data/empty.txt | 0
src/libqes/test/data/loremipsum.txt | 11 +
src/libqes/test/data/loremipsum.txt.gz | Bin 0 -> 427 bytes
src/libqes/test/data/nocomment.fasta | 5 +
src/libqes/test/data/random.bin | Bin 0 -> 8192 bytes
src/libqes/test/data/test.fasta | 4061 ++++++++++++++++++++
src/libqes/test/data/test.fastq | 4000 +++++++++++++++++++
src/libqes/test/data/test.fastq.bz2 | Bin 0 -> 17766 bytes
src/libqes/test/data/test.fastq.gz | Bin 0 -> 24811 bytes
src/libqes/test/data/test_large.fasta.gz | Bin 0 -> 317571 bytes
src/libqes/test/data/truth/log_test.txt | 2 +
src/libqes/test/data/truth/qes_seq_print.fa | 2 +
src/libqes/test/data/truth/qes_seq_print.fq | 4 +
src/libqes/test/helpers.c | 207 +
src/libqes/test/helpers.h | 56 +
src/libqes/test/kseq.h | 235 ++
src/libqes/test/kseqcat.c | 41 +
src/libqes/test/logdemo.c | 50 +
src/libqes/test/qes_seqcat.c | 30 +
src/libqes/test/qes_seqprint.c | 21 +
src/libqes/test/test.c | 80 +
src/libqes/test/test_file.c | 446 +++
src/libqes/test/test_helpers.c | 70 +
src/libqes/test/test_log.c | 189 +
src/libqes/test/test_match.c | 105 +
src/libqes/test/test_seq.c | 500 +++
src/libqes/test/test_seqcats.sh | 34 +
src/libqes/test/test_seqfile.c | 418 ++
src/libqes/test/test_sequtil.c | 67 +
src/libqes/test/test_util.c | 161 +
src/libqes/test/testdata.c | 160 +
src/libqes/test/testdata.h | 65 +
src/libqes/test/tests.h | 57 +
src/libqes/test/tinytest/tinytest.c | 493 +++
src/libqes/test/tinytest/tinytest.h | 100 +
src/libqes/test/tinytest/tinytest_macros.h | 199 +
src/libqes/util/make_codon_list.py | 38 +
src/libqes/util/make_codon_map.py | 21 +
src/main.c | 137 +-
tests/CMakeLists.txt | 2 +-
utils/hbb_script.sh | 25 +
utils/make-tarball.sh | 19 -
utils/static_build.sh | 28 +
106 files changed, 17555 insertions(+), 1060 deletions(-)
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index 3c4636a..0000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "src/libqes"]
- path = src/libqes
- url = https://github.com/kdmurray91/libqes.git
diff --git a/.travis.yml b/.travis.yml
index 82afcc5..4351a9d 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,49 +1,29 @@
language: c
+sudo: required
+dist: trusty
+
env:
- matrix:
- BUILD_TYPE=Release
- BUILD_TYPE=Debug
compiler:
- - clang
- - gcc
-
-sudo: false
+ - clang
+ - gcc
notifications:
email:
- - spam at kdmurray.id.au
-
-addons:
- apt:
- sources:
- - kalakris-cmake
- packages:
- - cmake
- - lcov
- - libgsl0-dev
- - python
- - python-sphinx
+ - kdmfoss at gmail.com
install:
- - pushd $HOME
- - wget http://zlib.net/zlib-1.2.8.tar.xz
- - tar xvf zlib-1.2.8.tar.xz
- - cd zlib-1.2.8
- - ./configure --prefix=$HOME
- - make
- - make install
- - popd
- - git submodule update --init
+ - sudo apt-get install zlib1g-dev libgsl0-dev
- mkdir build
- mkdir target
- - cd build
script:
+ - cd build
- cmake .. -DCMAKE_INSTALL_PREFIX=../target -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DZLIB_ROOT=$HOME
- make
- - python ../tests/axe_cli_tests.py .
- - ./bin/test_axe
+ - ctest --verbose
- make install
- test -f ../target/bin/axe-demux
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4d4e6cd..27d91f3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,5 +1,5 @@
-CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(axe C)
+CMAKE_MINIMUM_REQUIRED(VERSION 3.0)
LIST(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake-modules")
@@ -13,9 +13,7 @@ IF (NOT CMAKE_BUILD_TYPE)
SET(CMAKE_BUILD_TYPE Release)
ENDIF()
-IF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/version")
- FILE(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/version" AXE_VERSION)
-ELSE()
+IF (NOT AXE_VERSION)
# git describe as versioning
EXECUTE_PROCESS(COMMAND git describe
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
@@ -43,33 +41,17 @@ ENDIF()
## Set Compiler Options ##
##########################
-IF (CMAKE_COMPILER_IS_GNUCC)
- SET(AXEWRN "${AXEWRN} -Woverride-init -Wnormalized=id -Wlogical-op")
- EXECUTE_PROCESS(COMMAND ${CMAKE_C_COMPILER} -dumpversion
- OUTPUT_VARIABLE GCC_VERSION)
- IF (GCC_VERSION VERSION_GREATER 4.9 OR GCC_VERSION VERSION_EQUAL 4.9)
- SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdiagnostics-color=always")
- ENDIF()
-ENDIF()
-
# Set CFLAGS
-SET(AXEWRN "${AXEWRN} -fstack-protector-all -Wstack-protector -Wfloat-equal")
-SET(AXEWRN "${AXEWRN} -Wundef -Wpointer-arith -Wstrict-prototypes")
-SET(AXEWRN "${AXEWRN} -Wmissing-prototypes -Wwrite-strings -Wredundant-decls")
-SET(AXEWRN "${AXEWRN} -Wchar-subscripts -Wcomment -Wformat=2 -Wwrite-strings")
-SET(AXEWRN "${AXEWRN} -Wmissing-declarations -Wredundant-decls -Wnested-externs")
-SET(AXEWRN "${AXEWRN} -Wbad-function-cast -Wswitch-enum -Winit-self")
-SET(AXEWRN "${AXEWRN} -Wmissing-field-initializers -Wdeclaration-after-statement")
-SET(AXEWRN "${AXEWRN} -Wold-style-definition -Waddress -Wmissing-noreturn ")
-SET(AXEWRN "${AXEWRN} -Wstrict-overflow=1 -Wextra -Warray-bounds -Wall -D_FORTIFY_SOURCE=2")
-
-SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")
+SET(AXEWRN "${AXEWRN} -fstack-protector-all -Wstack-protector")
+SET(AXEWRN "${AXEWRN} -Wall -Wextra -Wpedantic")
+
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${AXEWRN}")
-INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src
- ${CMAKE_SOURCE_DIR}/src/datrie
- ${CMAKE_SOURCE_DIR}/src/libqes/src
- ${CMAKE_SOURCE_DIR}/src/gsl)
+INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src
+ ${PROJECT_SOURCE_DIR}/src/datrie
+ ${PROJECT_SOURCE_DIR}/src/libqes/src
+ ${PROJECT_SOURCE_DIR}/src/gsl)
LINK_DIRECTORIES(${CMAKE_BINARY_DIR}/lib)
INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR})
@@ -77,8 +59,8 @@ INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR})
CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/src/axe_config.h.in
${CMAKE_BINARY_DIR}/axe_config.h)
+SET(LIBQES_AS_SUBMODULE True) # stop libqes installing itself
+ADD_SUBDIRECTORY(src/libqes)
ADD_SUBDIRECTORY(docs)
ADD_SUBDIRECTORY(tests)
ADD_SUBDIRECTORY(src)
-SET(LIBQES_AS_SUBMODULE True) # stop libqes installing itself
-ADD_SUBDIRECTORY(src/libqes)
diff --git a/README.md b/README.md
index 2fd6cc8..38a4340 100644
--- a/README.md
+++ b/README.md
@@ -3,8 +3,11 @@ AXE
> De-multiplex NGS reads using trie data structures. It's fast, and made of tries!
-[![DOI](https://zenodo.org/badge/6357/kdmurray91/axe.png)](https://zenodo.org/record/12278)
+
+
+[![DOI](https://zenodo.org/badge/6357/kdmurray91/axe.svg)](https://zenodo.org/badge/latestdoi/6357/kdmurray91/axe)
[![Documentation Status](https://readthedocs.org/projects/axe-demultiplexer/badge/?version=latest)](https://readthedocs.org/projects/axe-demultiplexer/?badge=latest)
+[![Join the chat at https://gitter.im/axe-demultipexer/Lobby](https://badges.gitter.im/axe-demultipexer/Lobby.svg)](https://gitter.im/axe-demultipexer/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
AXE very rapidly selects the optimal barcode present in a sequence read, even
@@ -19,9 +22,8 @@ spirit of "release early and often", here it is.
###Tests:
-| Jenkins GNU/Linux | [![Build Status](http://biojenkins.anu.edu.au/job/axe/badge/icon)](http://biojenkins.anu.edu.au/job/axe/) |
-| ----------------- | --- |
| TravisCI | [![Build Status](https://travis-ci.org/kdmurray91/axe.svg?branch=master)](https://travis-ci.org/kdmurray91/axe) |
+| ----------------- | --- |
| Test Coverage | [![Coverage Status](https://img.shields.io/coveralls/kdmurray91/axe.svg)](https://coveralls.io/r/kdmurray91/axe?branch=master) |
| Coverity Scans | [![Coverity Scan Build Status](https://scan.coverity.com/projects/2666/badge.svg)](https://scan.coverity.com/projects/2666) |
diff --git a/docs/gitversion.py b/docs/gitversion.py
index 72f145e..0913b07 100644
--- a/docs/gitversion.py
+++ b/docs/gitversion.py
@@ -8,8 +8,8 @@
# versioneer-0.13 (https://github.com/warner/python-versioneer)
# these strings will be replaced by git during git-archive
-git_refnames = " (HEAD -> master, tag: 0.3.1)"
-git_full = "5779b83807f368192275a7d5ae37facfd5f85737"
+git_refnames = " (HEAD -> master, tag: 0.3.2)"
+git_full = "0faf8e3e05ba45343357e0cfa6c9657cedee4cc9"
# these strings are filled in when 'setup.py versioneer' creates _version.py
tag_prefix = ""
diff --git a/src/axe.c b/src/axe.c
index 9d56fec..6390418 100644
--- a/src/axe.c
+++ b/src/axe.c
@@ -45,26 +45,26 @@ axe_formatter(struct qes_log_entry *entry)
if (entry->level <= QES_LOG_DEBUG) {
marker = '.';
- colour = ANSIBEG ATDIM FGCYN BGBLK ANSIEND;
+ colour = ANSIBEG ATDIM FGCYN ANSIEND;
reset = "";
} else if (entry->level == AXE_LOG_PROGRESS) {
marker = progress_bar_chars[format_call_number++ % 4];
- colour = ANSIBEG ATNRM FGGRN BGBLK ANSIEND;
+ colour = ANSIBEG ATNRM FGGRN ANSIEND;
} else if (entry->level == AXE_LOG_BOLD) {
marker = '\0';
- colour = ANSIBEG ATBLD FGCYN BGBLK ANSIEND;
+ colour = ANSIBEG ATBLD FGCYN ANSIEND;
} else if (entry->level <= QES_LOG_INFO) {
marker = '\0';
- colour = ANSIBEG ATNRM FGGRN BGBLK ANSIEND;
+ colour = ANSIBEG ATNRM FGGRN ANSIEND;
} else if (entry->level <= QES_LOG_WARNING) {
marker = '!';
- colour = ANSIBEG ATULN FGYEL BGBLK ANSIEND;
+ colour = ANSIBEG ATBLD FGRED ANSIEND;
} else if (entry->level <= QES_LOG_ERROR) {
marker = 'E';
- colour = ANSIBEG ATBLD FGMAG BGBLK ANSIEND;
+ colour = ANSIBEG ATBLD FGMAG ANSIEND;
} else {
marker = 'F';
- colour = ANSIBEG ATBLD ATBNK FGRED BGBLK ANSIEND;
+ colour = ANSIBEG ATBLD FGRED ANSIEND;
}
if (marker == '\0') {
res = asprintf(&buf, "%s%s%s", colour, entry->message, reset);
@@ -1599,7 +1599,8 @@ axe_print_summary(const struct axe_config *config)
{
const char *tmp;
-#define million(r) ((float)(r / 1000000.0))
+#define hr(r) ((float)((r) / ((r) > 1000000.0 ? 1000000.0 : 1000.0)))
+#define unit(r) ((r) > 1000000.0 ? 'M' : 'K')
if (!axe_config_ok(config)) {
return -1;
}
@@ -1614,15 +1615,17 @@ axe_print_summary(const struct axe_config *config)
}
tmp = config->out_mode == READS_SINGLE ? "reads" : "read pairs";
axe_format_bold(config->logger,
- "Processed %.2fM %s in %0.1f seconds (%0.1fK %s/sec)\n",
- million(config->reads_processed), tmp, config->time_taken,
+ "Processed %.2f%c %s in %0.1f seconds (%0.1fK %s/sec)\n",
+ hr(config->reads_processed), unit(config->reads_processed), tmp, config->time_taken,
(float)(config->reads_processed / 1000) / config->time_taken, tmp);
axe_format_bold(config->logger,
- "%.2fM %s contained valid barcodes\n",
- million(config->reads_demultiplexed), tmp);
+ "%.2f%c %s contained valid barcodes\n",
+ hr(config->reads_demultiplexed), unit(config->reads_demultiplexed), tmp);
axe_format_bold(config->logger,
- "%.2fM %s could not be demultiplexed (%0.1f%%)\n",
- million(config->reads_failed), tmp,
+ "%.2f%c %s could not be demultiplexed (%0.1f%%)\n",
+ hr(config->reads_failed), unit(config->reads_failed), tmp,
((float)config->reads_failed/(float)(config->reads_processed)*100.0));
return 0;
+#undef hr
+#undef unit
}
diff --git a/src/axe.h b/src/axe.h
index e1fe5b9..7a4f031 100644
--- a/src/axe.h
+++ b/src/axe.h
@@ -25,6 +25,8 @@
#ifndef AXE_H
#define AXE_H
+#include "axe_config.h"
+
#include <stdint.h>
#include <stdlib.h>
#include <assert.h>
@@ -38,7 +40,6 @@
#include "datrie/trie.h"
#include "datrie/alpha-map.h"
-#include "axe_config.h"
/* General rules:
* Most functions are declared as `int X(...);`. These functions return:
@@ -107,11 +108,11 @@ struct axe_config {
uint64_t reads_failed;
float time_taken;
int verbosity;
- int have_cli_opts :1; /* Set to 1 once CLI is parsed */
- int match_combo :1; /* Match using combinatorial strategy */
- int permissive :1; /* Don't error on mutated bcd confict */
- int trim_rev :1; /* Trim rev read same as fwd read */
- int debug :1; /* Enable debug mode */
+ bool have_cli_opts; /* Set to 1 once CLI is parsed */
+ bool match_combo; /* Match using combinatorial strategy */
+ bool permissive; /* Don't error on mutated bcd confict */
+ bool trim_rev; /* Trim rev read same as fwd read */
+ bool debug; /* Enable debug mode */
};
extern unsigned int format_call_number;
diff --git a/src/axe_config.h.in b/src/axe_config.h.in
index c084105..89f963c 100644
--- a/src/axe_config.h.in
+++ b/src/axe_config.h.in
@@ -25,6 +25,8 @@
#ifndef AXE_CONFIG_H
#define AXE_CONFIG_H
+#define _GNU_SOURCE
+
#define AXE_VERSION "${AXE_VERSION}"
#endif /* AXE_CONFIG_H */
diff --git a/src/gsl/combination.c b/src/gsl/combination.c
deleted file mode 100644
index 6401c04..0000000
--- a/src/gsl/combination.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/* combination/combination.c
- * based on permutation/permutation.c by Brian Gough
- *
- * Copyright (C) 2001 Szymon Jaroszewicz
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#include "gsl_errno.h"
-#include "gsl_combination.h"
-
-size_t
-gsl_combination_n (const gsl_combination * c)
-{
- return c->n ;
-}
-
-size_t
-gsl_combination_k (const gsl_combination * c)
-{
- return c->k ;
-}
-
-size_t *
-gsl_combination_data (const gsl_combination * c)
-{
- return c->data ;
-}
-
-int
-gsl_combination_valid (gsl_combination * c)
-{
- const size_t n = c->n ;
- const size_t k = c->k ;
-
- size_t i, j ;
-
- if( k > n )
- {
- GSL_ERROR("combination has k greater than n", GSL_FAILURE) ;
- }
- for (i = 0; i < k; i++)
- {
- const size_t ci = c->data[i];
-
- if (ci >= n)
- {
- GSL_ERROR("combination index outside range", GSL_FAILURE) ;
- }
-
- for (j = 0; j < i; j++)
- {
- if (c->data[j] == ci)
- {
- GSL_ERROR("duplicate combination index", GSL_FAILURE) ;
- }
- if (c->data[j] > ci)
- {
- GSL_ERROR("combination indices not in increasing order",
- GSL_FAILURE) ;
- }
- }
- }
-
- return GSL_SUCCESS;
-}
-
-
-int
-gsl_combination_next (gsl_combination * c)
-{
- /* Replaces c with the next combination (in the standard lexicographical
- * ordering). Returns GSL_FAILURE if there is no next combination.
- */
- const size_t n = c->n;
- const size_t k = c->k;
- size_t *data = c->data;
- size_t i;
-
- if(k == 0)
- {
- return GSL_FAILURE;
- }
- i = k - 1;
-
- while(i > 0 && data[i] == n - k + i)
- {
- i--;
- }
- if(i == 0 && data[i] == n - k)
- {
- return GSL_FAILURE;
- }
- data[i]++;
- for(; i < k - 1; i++)
- {
- data[i + 1] = data[i] + 1;
- }
- return GSL_SUCCESS;
-}
-
-int
-gsl_combination_prev (gsl_combination * c)
-{
- /* Replaces c with the previous combination (in the standard
- * lexicographical ordering). Returns GSL_FAILURE if there is no
- * previous combination.
- */
- const size_t n = c->n;
- const size_t k = c->k;
- size_t *data = c->data;
- size_t i;
-
- if(k == 0)
- {
- return GSL_FAILURE;
- }
- i = k - 1;
-
- while(i > 0 && data[i] == data[i-1] + 1)
- {
- i--;
- }
- if(i == 0 && data[i] == 0)
- {
- return GSL_FAILURE;
- }
- data[i++]--;
- for(; i < k; i++)
- {
- data[i] = n - k + i;
- }
- return GSL_SUCCESS;
-}
-
-int
-gsl_combination_memcpy (gsl_combination * dest, const gsl_combination * src)
-{
- const size_t src_n = src->n;
- const size_t src_k = src->k;
- const size_t dest_n = dest->n;
- const size_t dest_k = dest->k;
-
- if (src_n != dest_n || src_k != dest_k)
- {
- GSL_ERROR ("combination lengths are not equal", GSL_EBADLEN);
- }
-
- {
- size_t j;
-
- for (j = 0; j < src_k; j++)
- {
- dest->data[j] = src->data[j];
- }
- }
-
- return GSL_SUCCESS;
-}
diff --git a/src/gsl/error.c b/src/gsl/error.c
deleted file mode 100644
index ef4a45e..0000000
--- a/src/gsl/error.c
+++ /dev/null
@@ -1,77 +0,0 @@
-/* err/error.c
- *
- * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#include <stddef.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-#include "gsl_errno.h"
-#include "gsl_message.h"
-
-gsl_error_handler_t * gsl_error_handler = NULL;
-
-static void no_error_handler (const char *reason, const char *file, int line, int gsl_errno);
-
-void
-gsl_error (const char * reason, const char * file, int line, int gsl_errno)
-{
- if (gsl_error_handler)
- {
- (*gsl_error_handler) (reason, file, line, gsl_errno);
- return ;
- }
-
- gsl_stream_printf ("ERROR", file, line, reason);
-
- fflush (stdout);
- fprintf (stderr, "Default GSL error handler invoked.\n");
- fflush (stderr);
-
- abort ();
-}
-
-gsl_error_handler_t *
-gsl_set_error_handler (gsl_error_handler_t * new_handler)
-{
- gsl_error_handler_t * previous_handler = gsl_error_handler;
- gsl_error_handler = new_handler;
- return previous_handler;
-}
-
-
-gsl_error_handler_t *
-gsl_set_error_handler_off (void)
-{
- gsl_error_handler_t * previous_handler = gsl_error_handler;
- gsl_error_handler = no_error_handler;
- return previous_handler;
-}
-
-static void
-no_error_handler (const char *reason, const char *file, int line, int gsl_errno)
-{
- /* do nothing */
- (void) reason;
- (void) file;
- (void) line;
- (void) gsl_errno;
- return;
-}
-
-
diff --git a/src/gsl/gsl_combination.h b/src/gsl/gsl_combination.h
deleted file mode 100644
index ee13dfb..0000000
--- a/src/gsl/gsl_combination.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* combination/gsl_combination.h
- * based on permutation/gsl_permutation.h by Brian Gough
- *
- * Copyright (C) 2001 Szymon Jaroszewicz
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#ifndef __GSL_COMBINATION_H__
-#define __GSL_COMBINATION_H__
-
-#include <stdlib.h>
-#include "gsl_errno.h"
-
-#undef __BEGIN_DECLS
-#undef __END_DECLS
-#ifdef __cplusplus
-# define __BEGIN_DECLS extern "C" {
-# define __END_DECLS }
-#else
-# define __BEGIN_DECLS /* empty */
-# define __END_DECLS /* empty */
-#endif
-
-__BEGIN_DECLS
-
-struct gsl_combination_struct
-{
- size_t n;
- size_t k;
- size_t *data;
-};
-
-typedef struct gsl_combination_struct gsl_combination;
-
-gsl_combination *gsl_combination_alloc (const size_t n, const size_t k);
-gsl_combination *gsl_combination_calloc (const size_t n, const size_t k);
-void gsl_combination_init_first (gsl_combination * c);
-void gsl_combination_init_last (gsl_combination * c);
-void gsl_combination_free (gsl_combination * c);
-int gsl_combination_memcpy (gsl_combination * dest, const gsl_combination * src);
-
-int gsl_combination_fread (FILE * stream, gsl_combination * c);
-int gsl_combination_fwrite (FILE * stream, const gsl_combination * c);
-int gsl_combination_fscanf (FILE * stream, gsl_combination * c);
-int gsl_combination_fprintf (FILE * stream, const gsl_combination * c, const char *format);
-
-size_t gsl_combination_n (const gsl_combination * c);
-size_t gsl_combination_k (const gsl_combination * c);
-size_t * gsl_combination_data (const gsl_combination * c);
-
-int gsl_combination_valid (gsl_combination * c);
-int gsl_combination_next (gsl_combination * c);
-int gsl_combination_prev (gsl_combination * c);
-
-static inline size_t
-gsl_combination_get (const gsl_combination * c, const size_t i)
-{
- return c->data[i];
-}
-
-__END_DECLS
-
-#endif /* __GSL_COMBINATION_H__ */
diff --git a/src/gsl/gsl_errno.h b/src/gsl/gsl_errno.h
deleted file mode 100644
index 76a998c..0000000
--- a/src/gsl/gsl_errno.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/* err/gsl_errno.h
- *
- * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#ifndef __GSL_ERRNO_H__
-#define __GSL_ERRNO_H__
-
-#include <stdio.h>
-#include <errno.h>
-
-#undef __BEGIN_DECLS
-#undef __END_DECLS
-#ifdef __cplusplus
-# define __BEGIN_DECLS extern "C" {
-# define __END_DECLS }
-#else
-# define __BEGIN_DECLS /* empty */
-# define __END_DECLS /* empty */
-#endif
-
-__BEGIN_DECLS
-
-enum {
- GSL_SUCCESS = 0,
- GSL_FAILURE = -1,
- GSL_CONTINUE = -2, /* iteration has not converged */
- GSL_EDOM = 1, /* input domain error, e.g sqrt(-1) */
- GSL_ERANGE = 2, /* output range error, e.g. exp(1e100) */
- GSL_EFAULT = 3, /* invalid pointer */
- GSL_EINVAL = 4, /* invalid argument supplied by user */
- GSL_EFAILED = 5, /* generic failure */
- GSL_EFACTOR = 6, /* factorization failed */
- GSL_ESANITY = 7, /* sanity check failed - shouldn't happen */
- GSL_ENOMEM = 8, /* malloc failed */
- GSL_EBADFUNC = 9, /* problem with user-supplied function */
- GSL_ERUNAWAY = 10, /* iterative process is out of control */
- GSL_EMAXITER = 11, /* exceeded max number of iterations */
- GSL_EZERODIV = 12, /* tried to divide by zero */
- GSL_EBADTOL = 13, /* user specified an invalid tolerance */
- GSL_ETOL = 14, /* failed to reach the specified tolerance */
- GSL_EUNDRFLW = 15, /* underflow */
- GSL_EOVRFLW = 16, /* overflow */
- GSL_ELOSS = 17, /* loss of accuracy */
- GSL_EROUND = 18, /* failed because of roundoff error */
- GSL_EBADLEN = 19, /* matrix, vector lengths are not conformant */
- GSL_ENOTSQR = 20, /* matrix not square */
- GSL_ESING = 21, /* apparent singularity detected */
- GSL_EDIVERGE = 22, /* integral or series is divergent */
- GSL_EUNSUP = 23, /* requested feature is not supported by the hardware */
- GSL_EUNIMPL = 24, /* requested feature not (yet) implemented */
- GSL_ECACHE = 25, /* cache limit exceeded */
- GSL_ETABLE = 26, /* table limit exceeded */
- GSL_ENOPROG = 27, /* iteration is not making progress towards solution */
- GSL_ENOPROGJ = 28, /* jacobian evaluations are not improving the solution */
- GSL_ETOLF = 29, /* cannot reach the specified tolerance in F */
- GSL_ETOLX = 30, /* cannot reach the specified tolerance in X */
- GSL_ETOLG = 31, /* cannot reach the specified tolerance in gradient */
- GSL_EOF = 32 /* end of file */
-} ;
-
-void gsl_error (const char * reason, const char * file, int line,
- int gsl_errno);
-
-void gsl_stream_printf (const char *label, const char *file,
- int line, const char *reason);
-
-const char * gsl_strerror (const int gsl_errno);
-
-typedef void gsl_error_handler_t (const char * reason, const char * file,
- int line, int gsl_errno);
-
-typedef void gsl_stream_handler_t (const char * label, const char * file,
- int line, const char * reason);
-
-gsl_error_handler_t *
-gsl_set_error_handler (gsl_error_handler_t * new_handler);
-
-gsl_error_handler_t *
-gsl_set_error_handler_off (void);
-
-gsl_stream_handler_t *
-gsl_set_stream_handler (gsl_stream_handler_t * new_handler);
-
-FILE * gsl_set_stream (FILE * new_stream);
-
-/* GSL_ERROR: call the error handler, and return the error code */
-
-#define GSL_ERROR(reason, gsl_errno) \
- do { \
- gsl_error (reason, __FILE__, __LINE__, gsl_errno) ; \
- return gsl_errno ; \
- } while (0)
-
-/* GSL_ERROR_VAL: call the error handler, and return the given value */
-
-#define GSL_ERROR_VAL(reason, gsl_errno, value) \
- do { \
- gsl_error (reason, __FILE__, __LINE__, gsl_errno) ; \
- return value ; \
- } while (0)
-
-/* GSL_ERROR_VOID: call the error handler, and then return
- (for void functions which still need to generate an error) */
-
-#define GSL_ERROR_VOID(reason, gsl_errno) \
- do { \
- gsl_error (reason, __FILE__, __LINE__, gsl_errno) ; \
- return ; \
- } while (0)
-
-/* GSL_ERROR_NULL suitable for out-of-memory conditions */
-
-#define GSL_ERROR_NULL(reason, gsl_errno) GSL_ERROR_VAL(reason, gsl_errno, 0)
-
-/* Sometimes you have several status results returned from
- * function calls and you want to combine them in some sensible
- * way. You cannot produce a "total" status condition, but you can
- * pick one from a set of conditions based on an implied hierarchy.
- *
- * In other words:
- * you have: status_a, status_b, ...
- * you want: status = (status_a if it is bad, or status_b if it is bad,...)
- *
- * In this example you consider status_a to be more important and
- * it is checked first, followed by the others in the order specified.
- *
- * Here are some dumb macros to do this.
- */
-#define GSL_ERROR_SELECT_2(a,b) ((a) != GSL_SUCCESS ? (a) : ((b) != GSL_SUCCESS ? (b) : GSL_SUCCESS))
-#define GSL_ERROR_SELECT_3(a,b,c) ((a) != GSL_SUCCESS ? (a) : GSL_ERROR_SELECT_2(b,c))
-#define GSL_ERROR_SELECT_4(a,b,c,d) ((a) != GSL_SUCCESS ? (a) : GSL_ERROR_SELECT_3(b,c,d))
-#define GSL_ERROR_SELECT_5(a,b,c,d,e) ((a) != GSL_SUCCESS ? (a) : GSL_ERROR_SELECT_4(b,c,d,e))
-
-#define GSL_STATUS_UPDATE(sp, s) do { if ((s) != GSL_SUCCESS) *(sp) = (s);} while(0)
-
-__END_DECLS
-
-#endif /* __GSL_ERRNO_H__ */
diff --git a/src/gsl/gsl_message.h b/src/gsl/gsl_message.h
deleted file mode 100644
index 2061ddb..0000000
--- a/src/gsl/gsl_message.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* err/gsl_message.h
- *
- * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#ifndef __GSL_MESSAGE_H__
-#define __GSL_MESSAGE_H__
-
-#undef __BEGIN_DECLS
-#undef __END_DECLS
-#ifdef __cplusplus
-# define __BEGIN_DECLS extern "C" {
-# define __END_DECLS }
-#else
-# define __BEGIN_DECLS /* empty */
-# define __END_DECLS /* empty */
-#endif
-
-__BEGIN_DECLS
-
-/* Provide a general messaging service for client use. Messages can
- * be selectively turned off at compile time by defining an
- * appropriate message mask. Client code which uses the GSL_MESSAGE()
- * macro must provide a mask which is or'ed with the GSL_MESSAGE_MASK.
- *
- * The messaging service can be completely turned off
- * by defining GSL_MESSAGING_OFF. */
-
-void gsl_message(const char * message, const char * file, int line,
- unsigned int mask);
-
-#ifndef GSL_MESSAGE_MASK
-#define GSL_MESSAGE_MASK 0xffffffffu /* default all messages allowed */
-#endif
-
-unsigned int gsl_message_mask ;
-
-/* Provide some symolic masks for client ease of use. */
-
-enum {
- GSL_MESSAGE_MASK_A = 1,
- GSL_MESSAGE_MASK_B = 2,
- GSL_MESSAGE_MASK_C = 4,
- GSL_MESSAGE_MASK_D = 8,
- GSL_MESSAGE_MASK_E = 16,
- GSL_MESSAGE_MASK_F = 32,
- GSL_MESSAGE_MASK_G = 64,
- GSL_MESSAGE_MASK_H = 128
-} ;
-
-#ifdef GSL_MESSAGING_OFF /* throw away messages */
-#define GSL_MESSAGE(message, mask) do { } while(0)
-#else /* output all messages */
-#define GSL_MESSAGE(message, mask) \
- do { \
- if (mask & GSL_MESSAGE_MASK) \
- gsl_message (message, __FILE__, __LINE__, mask) ; \
- } while (0)
-#endif
-
-__END_DECLS
-
-#endif /* __GSL_MESSAGE_H__ */
-
-
diff --git a/src/gsl/init.c b/src/gsl/init.c
deleted file mode 100644
index 3a50c78..0000000
--- a/src/gsl/init.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/* combination/init.c
- * based on permutation/init.c by Brian Gough
- *
- * Copyright (C) 2001 Szymon Jaroszewicz
- * Copyright (C) 2009 Brian Gough
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#include <stdlib.h>
-#include "gsl_errno.h"
-#include "gsl_combination.h"
-
-gsl_combination *
-gsl_combination_alloc (const size_t n, const size_t k)
-{
- gsl_combination * c;
-
- if (n == 0)
- {
- GSL_ERROR_VAL ("combination parameter n must be positive integer",
- GSL_EDOM, 0);
- }
- if (k > n)
- {
- GSL_ERROR_VAL ("combination length k must be an integer less than or equal to n",
- GSL_EDOM, 0);
- }
- c = (gsl_combination *) malloc (sizeof (gsl_combination));
-
- if (c == 0)
- {
- GSL_ERROR_VAL ("failed to allocate space for combination struct",
- GSL_ENOMEM, 0);
- }
-
- if (k > 0)
- {
- c->data = (size_t *) malloc (k * sizeof (size_t));
-
- if (c->data == 0)
- {
- free (c); /* exception in constructor, avoid memory leak */
-
- GSL_ERROR_VAL ("failed to allocate space for combination data",
- GSL_ENOMEM, 0);
- }
- }
- else
- {
- c->data = 0;
- }
-
- c->n = n;
- c->k = k;
-
- return c;
-}
-
-gsl_combination *
-gsl_combination_calloc (const size_t n, const size_t k)
-{
- size_t i;
-
- gsl_combination * c = gsl_combination_alloc (n, k);
-
- if (c == 0)
- return 0;
-
- /* initialize combination to identity */
-
- for (i = 0; i < k; i++)
- {
- c->data[i] = i;
- }
-
- return c;
-}
-
-void
-gsl_combination_init_first (gsl_combination * c)
-{
- const size_t k = c->k ;
- size_t i;
-
- /* initialize combination to identity */
-
- for (i = 0; i < k; i++)
- {
- c->data[i] = i;
- }
-}
-
-void
-gsl_combination_init_last (gsl_combination * c)
-{
- const size_t k = c->k ;
- size_t i;
- size_t n = c->n;
-
- /* initialize combination to identity */
-
- for (i = 0; i < k; i++)
- {
- c->data[i] = n - k + i;
- }
-}
-
-void
-gsl_combination_free (gsl_combination * c)
-{
- if (c == NULL) return;
- if (c->k > 0) free (c->data);
- free (c);
-}
diff --git a/src/gsl/message.c b/src/gsl/message.c
deleted file mode 100644
index a8961b0..0000000
--- a/src/gsl/message.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* err/message.c
- *
- * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#include <stddef.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-#include "gsl_errno.h"
-#include "gsl_message.h"
-
-unsigned int gsl_message_mask = GSL_MESSAGE_MASK;
-
-void
-gsl_message (const char * reason, const char * file, int line,
- unsigned int mask)
-{
- if (mask & gsl_message_mask)
- {
- gsl_stream_printf ("MESSAGE", file, line, reason);
- }
-}
diff --git a/src/gsl/stream.c b/src/gsl/stream.c
deleted file mode 100644
index 8cf2ef1..0000000
--- a/src/gsl/stream.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/* err/stream.c
- *
- * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#include <stddef.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-#include "gsl_errno.h"
-#include "gsl_message.h"
-
-FILE * gsl_stream = NULL ;
-gsl_stream_handler_t * gsl_stream_handler = NULL;
-
-void
-gsl_stream_printf (const char *label, const char *file, int line,
- const char *reason)
-{
- if (gsl_stream == NULL)
- {
- gsl_stream = stderr;
- }
- if (gsl_stream_handler)
- {
- (*gsl_stream_handler) (label, file, line, reason);
- return;
- }
- fprintf (gsl_stream, "gsl: %s:%d: %s: %s\n", file, line, label, reason);
-
-}
-
-gsl_stream_handler_t *
-gsl_set_stream_handler (gsl_stream_handler_t * new_handler)
-{
- gsl_stream_handler_t * previous_handler = gsl_stream_handler;
- gsl_stream_handler = new_handler;
- return previous_handler;
-}
-
-FILE *
-gsl_set_stream (FILE * new_stream)
-{
- FILE * previous_stream;
- if (gsl_stream == NULL) {
- gsl_stream = stderr;
- }
- previous_stream = gsl_stream;
- gsl_stream = new_stream;
- return previous_stream;
-}
diff --git a/src/gsl/strerror.c b/src/gsl/strerror.c
deleted file mode 100644
index 398a132..0000000
--- a/src/gsl/strerror.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/* err/strerror.c
- *
- * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#include "gsl_errno.h"
-
-const char *
-gsl_strerror (const int gsl_errno)
-{
- switch (gsl_errno)
- {
- case GSL_SUCCESS:
- return "success" ;
- case GSL_FAILURE:
- return "failure" ;
- case GSL_CONTINUE:
- return "the iteration has not converged yet";
- case GSL_EDOM:
- return "input domain error" ;
- case GSL_ERANGE:
- return "output range error" ;
- case GSL_EFAULT:
- return "invalid pointer" ;
- case GSL_EINVAL:
- return "invalid argument supplied by user" ;
- case GSL_EFAILED:
- return "generic failure" ;
- case GSL_EFACTOR:
- return "factorization failed" ;
- case GSL_ESANITY:
- return "sanity check failed - shouldn't happen" ;
- case GSL_ENOMEM:
- return "malloc failed" ;
- case GSL_EBADFUNC:
- return "problem with user-supplied function";
- case GSL_ERUNAWAY:
- return "iterative process is out of control";
- case GSL_EMAXITER:
- return "exceeded max number of iterations" ;
- case GSL_EZERODIV:
- return "tried to divide by zero" ;
- case GSL_EBADTOL:
- return "specified tolerance is invalid or theoretically unattainable" ;
- case GSL_ETOL:
- return "failed to reach the specified tolerance" ;
- case GSL_EUNDRFLW:
- return "underflow" ;
- case GSL_EOVRFLW:
- return "overflow" ;
- case GSL_ELOSS:
- return "loss of accuracy" ;
- case GSL_EROUND:
- return "roundoff error" ;
- case GSL_EBADLEN:
- return "matrix/vector sizes are not conformant" ;
- case GSL_ENOTSQR:
- return "matrix not square" ;
- case GSL_ESING:
- return "singularity or extremely bad function behavior detected" ;
- case GSL_EDIVERGE:
- return "integral or series is divergent" ;
- case GSL_EUNSUP:
- return "the required feature is not supported by this hardware platform";
- case GSL_EUNIMPL:
- return "the requested feature is not (yet) implemented";
- case GSL_ECACHE:
- return "cache limit exceeded";
- case GSL_ETABLE:
- return "table limit exceeded";
- case GSL_ENOPROG:
- return "iteration is not making progress towards solution";
- case GSL_ENOPROGJ:
- return "jacobian evaluations are not improving the solution";
- case GSL_ETOLF:
- return "cannot reach the specified tolerance in F";
- case GSL_ETOLX:
- return "cannot reach the specified tolerance in X";
- case GSL_ETOLG:
- return "cannot reach the specified tolerance in gradient";
- case GSL_EOF:
- return "end of file";
- default:
- return "unknown error code" ;
- }
-}
diff --git a/src/libqes/.gitignore b/src/libqes/.gitignore
new file mode 100644
index 0000000..b383896
--- /dev/null
+++ b/src/libqes/.gitignore
@@ -0,0 +1,12 @@
+# Editor temp files
+*.swp
+*.bak
+*~
+
+# compiled
+build
+*.o
+*.a
+*.so
+tags
+version
diff --git a/src/libqes/.gitmodules b/src/libqes/.gitmodules
new file mode 100644
index 0000000..e69de29
diff --git a/src/libqes/.travis.yml b/src/libqes/.travis.yml
new file mode 100644
index 0000000..89c69e9
--- /dev/null
+++ b/src/libqes/.travis.yml
@@ -0,0 +1,35 @@
+language: c
+
+sudo: required
+dist: trusty
+
+env:
+ - BUILD_TYPE=Release
+ - BUILD_TYPE=Debug
+ - BUILD_TYPE=Coverage
+
+compiler:
+ - clang
+ - gcc
+
+notifications:
+ email:
+ - kdmfoss at gmail.com
+
+install:
+ - sudo apt-get install lcov python-pip zlib1g-dev
+ - sudo pip install cpp-coveralls
+ - mkdir build
+ - mkdir target
+ - cd build
+
+script:
+ - cmake .. -DCMAKE_INSTALL_PREFIX=../target -DCMAKE_BUILD_TYPE=$BUILD_TYPE
+ - make
+ - ctest --verbose
+ - make install
+ - test -f ../target/include/qes.h
+
+after_success:
+ - cd ..
+ - if [ "$BUILD_TYPE" == "Coverage" ] ; then coveralls -e target -e test -e util -e zlib -E '.*\.h' -e build/CMakeFiles; fi
diff --git a/src/libqes/AUTHORS b/src/libqes/AUTHORS
new file mode 100644
index 0000000..cd220fe
--- /dev/null
+++ b/src/libqes/AUTHORS
@@ -0,0 +1 @@
+Kevin Murray <spam at kdmurray.id.au>
diff --git a/src/libqes/CMakeLists.txt b/src/libqes/CMakeLists.txt
new file mode 100644
index 0000000..1fb3d6c
--- /dev/null
+++ b/src/libqes/CMakeLists.txt
@@ -0,0 +1,147 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
+PROJECT(libqes C)
+
+# Append cmake-modules to module path
+SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
+ "${CMAKE_CURRENT_SOURCE_DIR}/cmake-modules")
+
+
+IF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/version")
+ FILE(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/version" LIBQES_VERSION)
+ELSE()
+ # git describe as versioning
+ EXECUTE_PROCESS(COMMAND git describe
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ OUTPUT_VARIABLE LIBQES_VERSION
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ENDIF()
+
+#############################
+## Setup CMAKE Environment ##
+#############################
+
+# Set this before you include libqes as a CMake subproject, so that we know not
+# to add cmake to the install rule
+IF (LIBQES_AS_SUBMODULE)
+ SET(LIBQES_DONT_INSTALL True)
+ELSE()
+ SET(LIBQES_DONT_INSTALL False)
+ENDIF()
+
+OPTION(NO_OPENMP "Disable OpenMP" False)
+OPTION(NO_ZLIB "Disable zlib" False)
+# Shortcut to enable dev compile options
+OPTION(DEV "Enable developer warnings")
+IF (DEV)
+ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fsanitize=leak -fsanitize=undefined")
+ SET(CMAKE_BUILD_TYPE Coverage)
+ENDIF()
+
+IF (NOT CMAKE_BUILD_TYPE)
+ SET(CMAKE_BUILD_TYPE Release)
+ENDIF()
+
+MESSAGE(STATUS "${CMAKE_BUILD_TYPE} build of ${PROJECT_NAME} version: ${LIBQES_VERSION}")
+
+# Set output directories
+SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
+SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
+SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
+
+# Include coverage module IFF out build type is Coverage to avoid bailing out
+# with unmet dependencies on Release builds, i.e. other peoples' computers
+IF (CMAKE_BUILD_TYPE STREQUAL "Coverage")
+ INCLUDE(CodeCoverage)
+ENDIF()
+
+# Testing
+ENABLE_TESTING()
+
+# Packaging
+SET(CPACK_GENERATOR "TGZ;TBZ2")
+INCLUDE(CPack)
+
+##########################
+## Set Compiler Options ##
+##########################
+
+
+SET(WARN_FLAGS "${WARN_FLAGS} -Wall -Wextra -Wpedantic")
+
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -D_GNU_SOURCE ${WARN_FLAGS}")
+
+SET(CMAKE_C_FLAGS_DEBUG "-ggdb")
+SET(CMAKE_C_FLAGS_RELEASE "-O3")
+
+
+###############################
+## Find Packages and Headers ##
+###############################
+
+# Header/symbols
+INCLUDE(CheckSymbolExists)
+INCLUDE(CheckFunctionExists)
+INCLUDE(CheckLibraryExists)
+INCLUDE(CheckIncludeFiles)
+
+CHECK_SYMBOL_EXISTS(vasprintf stdio.h VASPRINTF_FOUND)
+CHECK_SYMBOL_EXISTS(asprintf stdio.h ASPRINTF_FOUND)
+CHECK_SYMBOL_EXISTS(getline stdio.h GETLINE_FOUND)
+CHECK_SYMBOL_EXISTS(strndup string.h STRNDUP_FOUND)
+
+IF (NOT ${NO_ZLIB})
+ FIND_PACKAGE(ZLIB 1.2.5 REQUIRED)
+ CHECK_LIBRARY_EXISTS(${ZLIB_LIBRARIES} gzbuffer "" GZBUFFER_FOUND)
+ELSE()
+ SET(ZLIB_FOUND FALSE)
+ SET(GZBUFFER_FOUND FALSE)
+ SET(ZLIB_C_FLAGS "")
+ SET(ZLIB_LIBRARIES "")
+ SET(ZLIB_INCLUDE_DIRS "")
+ MESSAGE(STATUS "Building without zlib")
+ENDIF()
+
+IF (NOT ${NO_OPENMP})
+ FIND_PACKAGE(OpenMP)
+ELSE()
+ SET(OPENMP_FOUND FALSE)
+ SET(OpenMP_C_FLAGS "")
+ MESSAGE(STATUS "Building without OpenMP")
+ENDIF()
+
+# Set dependency flags appropriately
+SET(LIBQES_DEPENDS_LIBS
+ ${LIBQES_DEPENDS_LIBS}
+ ${ZLIB_LIBRARIES})
+SET(LIBQES_DEPENDS_INCLUDE_DIRS
+ ${LIBQES_DEPENDS_INCLUDE_DIRS}
+ ${ZLIB_INCLUDE_DIRS})
+SET(LIBQES_DEPENDS_CFLAGS
+ ${LIBQES_DEPENDS_CFLAGS}
+ ${ZLIB_CFLAGS}
+ ${OpenMP_C_FLAGS})
+
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LIBQES_DEPENDS_CFLAGS}")
+
+
+#####################
+## Set CMake Paths ##
+#####################
+
+# Set include dirs
+INCLUDE_DIRECTORIES(
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/src
+ ${CMAKE_CURRENT_SOURCE_DIR}/test
+ ${CMAKE_CURRENT_SOURCE_DIR}/test/tinytest
+ ${LIBQES_DEPENDS_INCLUDE_DIRS}
+ )
+
+# Set link dirs
+LINK_DIRECTORIES(${CMAKE_BINARY_DIR}/lib)
+
+# Traverse to library source and tests
+ADD_SUBDIRECTORY(src)
+if (NOT LIBQES_AS_SUBMODULE)
+ ADD_SUBDIRECTORY(test)
+endif()
diff --git a/src/libqes/LICENSE b/src/libqes/LICENSE
new file mode 100644
index 0000000..bc08fe2
--- /dev/null
+++ b/src/libqes/LICENSE
@@ -0,0 +1,619 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
diff --git a/src/libqes/README.md b/src/libqes/README.md
new file mode 100644
index 0000000..ace5ed8
--- /dev/null
+++ b/src/libqes/README.md
@@ -0,0 +1,31 @@
+libqes
+======
+
+A C library for various bioinformatics-y tasks. Proper docs will come in time.
+For now, we have reasonable test coverage under `./test/` that demonstrate the
+API.
+
+###Tests:
+
+| Jenkins GNU/Linux | [![Build Status](http://biojenkins.anu.edu.au/job/libqes/badge/icon)](http://biojenkins.anu.edu.au/job/libqes/) |
+| ----------------- | --- |
+| Jenkins MinGW | [![Build Status](http://biojenkins.anu.edu.au/job/libqes-mingw/badge/icon)](http://biojenkins.anu.edu.au/job/libqes-mingw/) |
+| TravisCI | [![Build Status](https://travis-ci.org/kdmurray91/libqes.svg?branch=dev)](https://travis-ci.org/kdmurray91/libqes) |
+| Test Coverage | [![Coverage Status](https://img.shields.io/coveralls/kdmurray91/libqes.svg)](https://coveralls.io/r/kdmurray91/libqes?branch=master) |
+
+
+License
+=======
+
+![GPL logo](http://www.gnu.org/graphics/gplv3-127x51.png)
+
+All libqes source code is licensed under the GNU Public License version 3, or a
+later version at your preference. For license text, see `./gpl-3.0.txt` or
+[the GNU website here](http://www.gnu.org/licenses/gpl-3.0.html).
+
+The source of `tinytest`, located in `tests/tinytest`, is Copyright 2009-2012
+Nick Matthewson; `tinytest` is distributed under the 3-clause BSD license.
+`tinytest` is hosted at
+[Nick's github page](https://github.com/nmathewson/tinytest).
+
+`src/crc.[ch]` are from gnulib, and are licensed under the LGPL.
diff --git a/src/libqes/TODO.md b/src/libqes/TODO.md
new file mode 100644
index 0000000..2cc3820
--- /dev/null
+++ b/src/libqes/TODO.md
@@ -0,0 +1,11 @@
+KDM Todos:
+---------
+
+Error handling:
+
+ - write tests
+
+qes_seq:
+
+ - split qes_seq_print into separate functions for FASTQ and FASTA. Also maybe
+ allow line wrapping for FASTA.
diff --git a/src/libqes/cmake-modules/CodeCoverage.cmake b/src/libqes/cmake-modules/CodeCoverage.cmake
new file mode 100644
index 0000000..749c979
--- /dev/null
+++ b/src/libqes/cmake-modules/CodeCoverage.cmake
@@ -0,0 +1,158 @@
+#
+# 2012-01-31, Lars Bilke
+# - Enable Code Coverage
+#
+# 2013-09-17, Joakim Söderberg
+# - Added support for Clang.
+# - Some additional usage instructions.
+#
+# USAGE:
+# 1. Copy this file into your cmake modules path.
+#
+# 2. Add the following line to your CMakeLists.txt:
+# INCLUDE(CodeCoverage)
+#
+# 3. Set compiler flags to turn off optimization and enable coverage:
+# SET(CMAKE_CXX_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage")
+# SET(CMAKE_C_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage")
+#
+# 3. Use the function SETUP_TARGET_FOR_COVERAGE to create a custom make target
+# which runs your test executable and produces a lcov code coverage report:
+# Example:
+# SETUP_TARGET_FOR_COVERAGE(
+# my_coverage_target # Name for custom target.
+# test_driver # Name of the test driver executable that runs the tests.
+# # NOTE! This should always have a ZERO as exit code
+# # otherwise the coverage generation will not complete.
+# coverage # Name of output directory.
+# )
+#
+# 4. Build a Debug build:
+# cmake -DCMAKE_BUILD_TYPE=Debug ..
+# make
+# make my_coverage_target
+#
+#
+
+# Check prereqs
+FIND_PROGRAM( GCOV_PATH gcov )
+FIND_PROGRAM( LCOV_PATH lcov )
+FIND_PROGRAM( GENHTML_PATH genhtml )
+FIND_PROGRAM( GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/tests)
+
+
+
+SET(CMAKE_CXX_FLAGS_COVERAGE
+ "${CMAKE_CXX_FLAGS_DEBUG} -g -O0 --coverage -fprofile-arcs -ftest-coverage"
+ CACHE STRING "Flags used by the C++ compiler during coverage builds."
+ FORCE)
+SET(CMAKE_C_FLAGS_COVERAGE
+ "${CMAKE_C_FLAGS_DEBUG} -g -O0 --coverage -fprofile-arcs -ftest-coverage"
+ CACHE STRING "Flags used by the C compiler during coverage builds."
+ FORCE)
+SET(CMAKE_EXE_LINKER_FLAGS_COVERAGE
+ ""
+ CACHE STRING "Flags used for linking binaries during coverage builds."
+ FORCE)
+SET(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
+ ""
+ CACHE STRING "Flags used by the shared libraries linker during coverage builds."
+ FORCE)
+MARK_AS_ADVANCED(
+ CMAKE_CXX_FLAGS_COVERAGE
+ CMAKE_C_FLAGS_COVERAGE
+ CMAKE_EXE_LINKER_FLAGS_COVERAGE
+ CMAKE_SHARED_LINKER_FLAGS_COVERAGE )
+
+IF(NOT GCOV_PATH)
+ MESSAGE(FATAL_ERROR "gcov not found! Aborting...")
+ENDIF() # NOT GCOV_PATH
+
+IF(NOT CMAKE_COMPILER_IS_GNUCC AND NOT CMAKE_COMPILER_IS_GNUCXX)
+ # Clang version 3.0.0 and greater now supports gcov as well.
+ MESSAGE(WARNING "Compiler is not GNU gcc! Clang Version 3.0.0 and greater supports gcov as well, but older versions don't.")
+
+ IF(NOT "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" AND NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+ MESSAGE(FATAL_ERROR "Compiler is not GNU gcc! Aborting...")
+ ENDIF()
+ENDIF() # NOT CMAKE_COMPILER_IS_GNUCXX
+
+
+
+# Param _targetname The name of new the custom make target
+# Param _testrunner The name of the target which runs the tests.
+# MUST return ZERO always, even on errors.
+# If not, no coverage report will be created!
+# Param _outputname lcov output is generated as _outputname.info
+# HTML report is generated in _outputname/index.html
+# Optional fourth parameter is passed as arguments to _testrunner
+# Pass them in list form, e.g.: "-j;2" for -j 2
+FUNCTION(SETUP_TARGET_FOR_COVERAGE _targetname _testrunner _outputname _coverdir)
+
+ IF(NOT LCOV_PATH)
+ MESSAGE(FATAL_ERROR "lcov not found! Aborting...")
+ ENDIF() # NOT LCOV_PATH
+
+ IF(NOT GENHTML_PATH)
+ MESSAGE(FATAL_ERROR "genhtml not found! Aborting...")
+ ENDIF() # NOT GENHTML_PATH
+
+ # Setup target
+ ADD_CUSTOM_TARGET(${_targetname}
+
+ # Cleanup lcov
+ ${LCOV_PATH} --rc lcov_branch_coverage=1 --directory ${_coverdir} --zerocounters
+
+ # Run tests
+ COMMAND ${_testrunner} ${ARGV4}
+
+ # Capturing lcov counters and generating report
+ COMMAND ${LCOV_PATH} --rc lcov_branch_coverage=1 --directory ${_coverdir} --capture --output-file ${_outputname}.info
+ COMMAND ${GENHTML_PATH} --branch-coverage -o ${_outputname} ${_outputname}.info
+ COMMAND ${CMAKE_COMMAND} -E remove ${_outputname}.info
+
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+ COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report."
+ )
+
+ # Show info where to find the report
+ ADD_CUSTOM_COMMAND(TARGET ${_targetname} POST_BUILD
+ COMMAND ;
+ COMMENT "Open ./${_outputname}/index.html in your browser to view the coverage report."
+ )
+
+ENDFUNCTION() # SETUP_TARGET_FOR_COVERAGE
+
+# Param _targetname The name of new the custom make target
+# Param _testrunner The name of the target which runs the tests
+# Param _outputname cobertura output is generated as _outputname.xml
+# Optional fourth parameter is passed as arguments to _testrunner
+# Pass them in list form, e.g.: "-j;2" for -j 2
+FUNCTION(SETUP_TARGET_FOR_COVERAGE_COBERTURA _targetname _testrunner _outputname)
+
+ IF(NOT PYTHON_EXECUTABLE)
+ MESSAGE(FATAL_ERROR "Python not found! Aborting...")
+ ENDIF() # NOT PYTHON_EXECUTABLE
+
+ IF(NOT GCOVR_PATH)
+ MESSAGE(FATAL_ERROR "gcovr not found! Aborting...")
+ ENDIF() # NOT GCOVR_PATH
+
+ ADD_CUSTOM_TARGET(${_targetname}
+
+ # Run tests
+ ${_testrunner} ${ARGV3}
+
+ # Running gcovr
+ COMMAND ${GCOVR_PATH} -x -r ${CMAKE_SOURCE_DIR} -e '${CMAKE_SOURCE_DIR}/tests/' -o ${_outputname}.xml
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+ COMMENT "Running gcovr to produce Cobertura code coverage report."
+ )
+
+ # Show info where to find the report
+ ADD_CUSTOM_COMMAND(TARGET ${_targetname} POST_BUILD
+ COMMAND ;
+ COMMENT "Cobertura code coverage report saved in ${_outputname}.xml."
+ )
+
+ENDFUNCTION() # SETUP_TARGET_FOR_COVERAGE_COBERTURA
diff --git a/src/libqes/cmake-modules/FindLIBQES.cmake b/src/libqes/cmake-modules/FindLIBQES.cmake
new file mode 100644
index 0000000..b62fd79
--- /dev/null
+++ b/src/libqes/cmake-modules/FindLIBQES.cmake
@@ -0,0 +1,97 @@
+# - Find libqes
+# Find the native libqes includes and library.
+# Once done this will define
+#
+# LIBQES_INCLUDE_DIRS - where to find qes.h, etc.
+# LIBQES_LIBRARIES - List of libraries when using libqes.
+# LIBQES_FOUND - True if libqes found.
+#
+# LIBQES_VERSION_STRING - The version of libqes found (x.y.z)
+# LIBQES_VERSION_MAJOR - The major version of libqes
+# LIBQES_VERSION_MINOR - The minor version of libqes
+# LIBQES_VERSION_PATCH - The patch version of libqes
+# LIBQES_VERSION_PREREL - The pre-release version of libqes
+# LIBQES_VERSION_GIT - The git version of libqes
+#
+# An includer may set LIBQES_ROOT to a libqes installation root to tell
+# this module where to look.
+
+# =============================================================================
+# Copyright 2014 Kevin Murray. Adapted from FindZLIB.cmake
+# Licensed under the 3-clause BSD license
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. Neither the name of the University nor the names of its contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+set(_LIBQES_SEARCHES)
+
+# Search LIBQES_ROOT first if it is set.
+if(LIBQES_ROOT)
+ set(_LIBQES_SEARCH_ROOT PATHS ${LIBQES_ROOT} NO_DEFAULT_PATH)
+ list(APPEND _LIBQES_SEARCHES _LIBQES_SEARCH_ROOT)
+endif()
+
+# Normal search.
+set(_LIBQES_SEARCH_NORMAL
+ PATHS "$ENV{PROGRAMFILES}/libqes"
+ )
+list(APPEND _LIBQES_SEARCHES _LIBQES_SEARCH_NORMAL)
+
+# Try each search configuration.
+foreach(search ${_LIBQES_SEARCHES})
+ find_path(LIBQES_INCLUDE_DIR NAMES qes.h ${${search}} PATH_SUFFIXES include)
+ find_library(LIBQES_LIBRARY NAMES qes ${${search}} PATH_SUFFIXES lib)
+endforeach()
+
+mark_as_advanced(LIBQES_LIBRARY LIBQES_INCLUDE_DIR)
+# Handle version. Again, flogged from zlib
+if(LIBQES_INCLUDE_DIR AND EXISTS "${LIBQES_INCLUDE_DIR}/qes_config.h")
+ file(STRINGS "${LIBQES_INCLUDE_DIR}/qes_config.h" LIBQES_H REGEX "^#define LIBQES_VERSION \"[^\"]*\"")
+
+ string(REGEX REPLACE "^.*LIBQES_VERSION \"[Vv]?([0-9]+).*$" "\\1" LIBQES_VERSION_MAJOR "${LIBQES_H}")
+ string(REGEX REPLACE "^.*LIBQES_VERSION \"[Vv]?[0-9]+\\.([0-9]+).*$" "\\1" LIBQES_VERSION_MINOR "${LIBQES_H}")
+ string(REGEX REPLACE "^.*LIBQES_VERSION \"[Vv]?[0-9]+\\.[0-9]+\\.([0-9]+).*$" "\\1" LIBQES_VERSION_PATCH "${LIBQES_H}")
+ set(LIBQES_VERSION_STRING "${LIBQES_VERSION_MAJOR}.${LIBQES_VERSION_MINOR}.${LIBQES_VERSION_PATCH}")
+
+ # only append a EXTRA version if it exists:
+ set(LIBQES_VERSION_EXTRA "")
+ if( "${LIBQES_H}" MATCHES "^.*LIBQES_VERSION \"[Vv]?[0-9]+\\.[0-9]+\\.[0-9]+(.+)\\+git.*$")
+ set(LIBQES_VERSION_PREREL "${CMAKE_MATCH_1}")
+ endif()
+ if( "${LIBQES_H}" MATCHES "^.*LIBQES_VERSION \"[Vv]?[0-9]+\\.[0-9]+\\.[0-9]+.*\\+git\\.(.+)$")
+ set(LIBQES_VERSION_git "${CMAKE_MATCH_1}")
+ endif()
+ set(LIBQES_VERSION_STRING "${LIBQES_VERSION_STRING}${LIBQES_VERSION_PREREL}")
+endif()
+
+# handle the QUIETLY and REQUIRED arguments and set LIBQES_FOUND to TRUE if
+# all listed variables are TRUE
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(LIBQES REQUIRED_VARS LIBQES_LIBRARY LIBQES_INCLUDE_DIR
+ VERSION_VAR LIBQES_VERSION_STRING)
+
+if(LIBQES_FOUND)
+ set(LIBQES_INCLUDE_DIRS ${LIBQES_INCLUDE_DIR})
+ set(LIBQES_LIBRARIES ${LIBQES_LIBRARY})
+endif()
+
diff --git a/src/libqes/cmake-modules/GetGitRevisionDescription.cmake b/src/libqes/cmake-modules/GetGitRevisionDescription.cmake
new file mode 100644
index 0000000..c8d27f2
--- /dev/null
+++ b/src/libqes/cmake-modules/GetGitRevisionDescription.cmake
@@ -0,0 +1,130 @@
+# - Returns a version string from Git
+#
+# These functions force a re-configure on each git commit so that you can
+# trust the values of the variables in your build system.
+#
+# get_git_head_revision(<refspecvar> <hashvar> [<additional arguments to git describe> ...])
+#
+# Returns the refspec and sha hash of the current head revision
+#
+# git_describe(<var> [<additional arguments to git describe> ...])
+#
+# Returns the results of git describe on the source tree, and adjusting
+# the output so that it tests false if an error occurs.
+#
+# git_get_exact_tag(<var> [<additional arguments to git describe> ...])
+#
+# Returns the results of git describe --exact-match on the source tree,
+# and adjusting the output so that it tests false if there was no exact
+# matching tag.
+#
+# Requires CMake 2.6 or newer (uses the 'function' command)
+#
+# Original Author:
+# 2009-2010 Ryan Pavlik <rpavlik at iastate.edu> <abiryan at ryand.net>
+# http://academic.cleardefinition.com
+# Iowa State University HCI Graduate Program/VRAC
+#
+# Copyright Iowa State University 2009-2010.
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+if(__get_git_revision_description)
+ return()
+endif()
+set(__get_git_revision_description YES)
+
+# We must run the following at "include" time, not at function call time,
+# to find the path to this module rather than the path to a calling list file
+get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
+
+function(get_git_head_revision _refspecvar _hashvar)
+ set(GIT_PARENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
+ set(GIT_DIR "${GIT_PARENT_DIR}/.git")
+ while(NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories
+ set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}")
+ get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH)
+ if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT)
+ # We have reached the root directory, we are not in git
+ set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE)
+ set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE)
+ return()
+ endif()
+ set(GIT_DIR "${GIT_PARENT_DIR}/.git")
+ endwhile()
+ # check if this is a submodule
+ if(NOT IS_DIRECTORY ${GIT_DIR})
+ file(READ ${GIT_DIR} submodule)
+ string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule})
+ get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH)
+ get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE)
+ endif()
+ set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data")
+ if(NOT EXISTS "${GIT_DATA}")
+ file(MAKE_DIRECTORY "${GIT_DATA}")
+ endif()
+
+ if(NOT EXISTS "${GIT_DIR}/HEAD")
+ return()
+ endif()
+ set(HEAD_FILE "${GIT_DATA}/HEAD")
+ configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY)
+
+ configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in"
+ "${GIT_DATA}/grabRef.cmake"
+ @ONLY)
+ include("${GIT_DATA}/grabRef.cmake")
+
+ set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE)
+ set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE)
+endfunction()
+
+function(git_describe _var)
+ if(NOT GIT_FOUND)
+ find_package(Git QUIET)
+ endif()
+ get_git_head_revision(refspec hash)
+ if(NOT GIT_FOUND)
+ set(${_var} "GIT-NOTFOUND" PARENT_SCOPE)
+ return()
+ endif()
+ if(NOT hash)
+ set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE)
+ return()
+ endif()
+
+ # TODO sanitize
+ #if((${ARGN}" MATCHES "&&") OR
+ # (ARGN MATCHES "||") OR
+ # (ARGN MATCHES "\\;"))
+ # message("Please report the following error to the project!")
+ # message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}")
+ #endif()
+
+ #message(STATUS "Arguments to execute_process: ${ARGN}")
+
+ execute_process(COMMAND
+ "${GIT_EXECUTABLE}"
+ describe
+ ${hash}
+ ${ARGN}
+ WORKING_DIRECTORY
+ "${CMAKE_SOURCE_DIR}"
+ RESULT_VARIABLE
+ res
+ OUTPUT_VARIABLE
+ out
+ ERROR_QUIET
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ if(NOT res EQUAL 0)
+ set(out "${out}-${res}-NOTFOUND")
+ endif()
+
+ set(${_var} "${out}" PARENT_SCOPE)
+endfunction()
+
+function(git_get_exact_tag _var)
+ git_describe(out --exact-match ${ARGN})
+ set(${_var} "${out}" PARENT_SCOPE)
+endfunction()
diff --git a/src/libqes/cmake-modules/GetGitRevisionDescription.cmake.in b/src/libqes/cmake-modules/GetGitRevisionDescription.cmake.in
new file mode 100644
index 0000000..888ce13
--- /dev/null
+++ b/src/libqes/cmake-modules/GetGitRevisionDescription.cmake.in
@@ -0,0 +1,38 @@
+#
+# Internal file for GetGitRevisionDescription.cmake
+#
+# Requires CMake 2.6 or newer (uses the 'function' command)
+#
+# Original Author:
+# 2009-2010 Ryan Pavlik <rpavlik at iastate.edu> <abiryan at ryand.net>
+# http://academic.cleardefinition.com
+# Iowa State University HCI Graduate Program/VRAC
+#
+# Copyright Iowa State University 2009-2010.
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+set(HEAD_HASH)
+
+file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024)
+
+string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS)
+if(HEAD_CONTENTS MATCHES "ref")
+ # named branch
+ string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}")
+ if(EXISTS "@GIT_DIR@/${HEAD_REF}")
+ configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY)
+ elseif(EXISTS "@GIT_DIR@/logs/${HEAD_REF}")
+ configure_file("@GIT_DIR@/logs/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY)
+ set(HEAD_HASH "${HEAD_REF}")
+ endif()
+else()
+ # detached HEAD
+ configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY)
+endif()
+
+if(NOT HEAD_HASH)
+ file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024)
+ string(STRIP "${HEAD_HASH}" HEAD_HASH)
+endif()
diff --git a/src/libqes/cmake-modules/GitSemVer.cmake b/src/libqes/cmake-modules/GitSemVer.cmake
new file mode 100644
index 0000000..c112796
--- /dev/null
+++ b/src/libqes/cmake-modules/GitSemVer.cmake
@@ -0,0 +1,49 @@
+# Copyright (c) 2014-2015 Kevin Murray <spam at kdmurray.id.au>
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+INCLUDE(GetGitRevisionDescription)
+
+function(GetGitSemVer _var)
+ get_git_head_revision(rev hash)
+ git_get_exact_tag(tag)
+
+ IF(NOT "${tag}" MATCHES "^-")
+ SET(vers "${tag}")
+ ELSE()
+ git_describe(gitdesc "--always")
+ if("${gitdesc}" MATCHES "^.+-.+-.+$")
+ STRING (REGEX REPLACE "-" " " gdlist ${gitdesc})
+ SEPARATE_ARGUMENTS(gdlist)
+ LIST(GET gdlist 0 tag)
+ LIST(GET gdlist 1 cmts_since_tag)
+ SET(vers "${tag}-${cmts_since_tag}-dirty")
+ ELSE()
+ SET(vers "dirty")
+ ENDIF()
+ ENDIF()
+
+ IF (NOT "${hash}" STREQUAL "")
+ STRING(SUBSTRING ${hash} 0 7 hash)
+ set(vers "${vers}+git=${hash}")
+ ENDIF()
+ set(${_var} ${vers} PARENT_SCOPE)
+endfunction()
diff --git a/src/libqes/src/CMakeLists.txt b/src/libqes/src/CMakeLists.txt
new file mode 100644
index 0000000..5e818d1
--- /dev/null
+++ b/src/libqes/src/CMakeLists.txt
@@ -0,0 +1,27 @@
+file(GLOB LIBQES_SOURCES qes_*.c)
+
+# Targets
+if(LIBQES_DONT_INSTALL)
+ ADD_LIBRARY(qes_static STATIC EXCLUDE_FROM_ALL ${LIBQES_SOURCES})
+ ADD_LIBRARY(qes SHARED EXCLUDE_FROM_ALL ${LIBQES_SOURCES})
+else()
+ ADD_LIBRARY(qes_static STATIC ${LIBQES_SOURCES})
+ ADD_LIBRARY(qes SHARED ${LIBQES_SOURCES})
+endif()
+
+
+SET_TARGET_PROPERTIES(qes_static PROPERTIES OUTPUT_NAME qes)
+TARGET_LINK_LIBRARIES(qes_static ${LIBQES_DEPENDS_LIBS})
+target_include_directories(qes_static PUBLIC ${LIBQES_DEPENDS_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR})
+
+SET_TARGET_PROPERTIES(qes PROPERTIES SONAME_VERSION 0 VERSION 0)
+TARGET_LINK_LIBRARIES(qes ${LIBQES_DEPENDS_LIBS})
+target_include_directories(qes PUBLIC ${LIBQES_DEPENDS_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR})
+
+CONFIGURE_FILE(qes_config.h.in ${CMAKE_BINARY_DIR}/qes_config.h)
+FILE(GLOB LIBQES_HEADERS ${CMAKE_SOURCE_DIR}/src/*.h ${CMAKE_BINARY_DIR}/qes_config.h)
+
+IF (NOT LIBQES_DONT_INSTALL)
+ INSTALL(FILES ${LIBQES_HEADERS} DESTINATION "include")
+ INSTALL(TARGETS qes qes_static DESTINATION "lib")
+ENDIF()
diff --git a/src/libqes/src/crc.c b/src/libqes/src/crc.c
new file mode 100644
index 0000000..ee4ef56
--- /dev/null
+++ b/src/libqes/src/crc.c
@@ -0,0 +1,101 @@
+/* crc.c -- cyclic redundancy checks
+ Copyright (C) 2005-2006, 2009-2014 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Simon Josefsson. */
+
+#include "crc.h"
+
+/* Table of CRCs of all 8-bit messages. Generated by running code
+ from RFC 1952 modified to print out the table. */
+static const uint32_t crc32_table[256] = {
+ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
+ 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
+ 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
+ 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
+ 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
+ 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
+ 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
+ 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
+ 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
+ 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+ 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
+ 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
+ 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
+ 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
+ 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
+ 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
+ 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
+ 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
+ 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
+ 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
+ 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
+ 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
+ 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
+ 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
+ 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
+ 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
+ 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
+ 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
+ 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+ 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
+ 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
+ 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
+ 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
+ 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
+ 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
+ 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
+ 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
+ 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
+ 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+ 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
+ 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
+ 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
+};
+
+/*
+ * The following function was extracted from RFC 1952 by Simon
+ * Josefsson. It was modified to avoid initial and final XOR, to use
+ * size_t for the buffer length, and to use the const keyword.
+ */
+uint32_t
+crc32_update_no_xor (uint32_t crc, const char *buf, size_t len)
+{
+ size_t n;
+
+ for (n = 0; n < len; n++)
+ crc = crc32_table[(crc ^ buf[n]) & 0xff] ^ (crc >> 8);
+
+ return crc;
+}
+
+uint32_t
+crc32_no_xor (const char *buf, size_t len)
+{
+ return crc32_update_no_xor (0L, buf, len);
+}
+
+uint32_t
+crc32_update (uint32_t crc, const char *buf, size_t len)
+{
+ return crc32_update_no_xor (crc ^ 0xffffffff, buf, len) ^ 0xffffffff;
+}
+
+uint32_t
+crc32 (const char *buf, size_t len)
+{
+ return crc32_update (0L, buf, len);
+}
diff --git a/src/libqes/src/crc.h b/src/libqes/src/crc.h
new file mode 100644
index 0000000..52c1747
--- /dev/null
+++ b/src/libqes/src/crc.h
@@ -0,0 +1,46 @@
+/* crc.h -- cyclic redundancy checks
+ Copyright (C) 2005, 2009-2014 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Simon Josefsson. */
+
+#ifndef CRC_H
+# define CRC_H 1
+
+#include <stddef.h>
+#include <stdint.h>
+
+/* Compute CRC-32 value of LEN bytes long BUF, and return it. */
+uint32_t crc32 (const char *buf, size_t len);
+
+/* Incrementally update CRC-32 value CRC using LEN bytes long BUF. In
+ the first call, use 0 as the value for CRC. Return the updated
+ CRC-32 value. */
+uint32_t crc32_update (uint32_t crc, const char *buf, size_t len);
+
+/* Compute modified-CRC-32 value of LEN bytes long BUF, and return it.
+ The "modification" is to avoid the initial and final XOR operation.
+ Due to historic implementation errors, this variant is sometimes
+ used (i.e., in RFC 3961). */
+uint32_t crc32_no_xor (const char *buf, size_t len);
+
+/* Incrementally update modified-CRC-32 value CRC using LEN bytes long
+ BUF. In the first call, use 0 as the value for CRC. Return the
+ updated modified-CRC-32 value. The "modification" is to avoid the
+ initial and final XOR operation. Due to historic implementation
+ errors, this variant is sometimes used (i.e., in RFC 3961). */
+uint32_t crc32_update_no_xor (uint32_t crc, const char *buf, size_t len);
+
+#endif /* CRC_H */
diff --git a/src/libqes/src/qes.h b/src/libqes/src/qes.h
new file mode 100644
index 0000000..cb5e27e
--- /dev/null
+++ b/src/libqes/src/qes.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ==========================================================================
+ *
+ * Filename: qes.h
+ *
+ * Description: Some common sequence analysis stuff
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ===========================================================================
+ */
+
+#ifndef LIBQES_H
+#define LIBQES_H
+
+
+/* ##### HEADER FILE INCLUDES ########################################## */
+#include <qes_match.h>
+#include <qes_seqfile.h>
+#include <qes_seq.h>
+#include <qes_sequtil.h>
+#include <qes_str.h>
+#include <qes_util.h>
+#include <qes_file.h>
+
+#endif /* LIBQES_H */
diff --git a/src/libqes/src/qes_compat.c b/src/libqes/src/qes_compat.c
new file mode 100644
index 0000000..4b6538c
--- /dev/null
+++ b/src/libqes/src/qes_compat.c
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: qes_compat.c
+ *
+ * Description: Compatibility helpers for cross-platformness
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include "qes_compat.h"
+
+
+#ifndef STRNDUP_FOUND
+char *
+strndup(const char *s, size_t n)
+{
+ char *dest = malloc(n+1);
+ if (dest == NULL) return NULL;
+ strncpy(dest, s, n);
+ dest[n] = '\0';
+ return dest;
+}
+#endif
+
+#ifndef VASPRINTF_FOUND
+int vasprintf(char **ret, const char *format, va_list args)
+{
+ va_list copy;
+ int count;
+ va_copy(copy, args);
+
+ *ret = NULL;
+
+ count = vsnprintf(NULL, 0, format, args);
+ if (count >= 0) {
+ char *buffer = malloc(count + 1);
+ if (buffer == NULL) {
+ count = -1;
+ } else if ((count = vsnprintf(buffer, count + 1, format, copy)) < 0) {
+ free(buffer);
+ }
+ else {
+ *ret = buffer;
+ }
+ }
+ va_end(copy);
+
+ return count;
+}
+#endif
+
+#ifndef ASPRINTF_FOUND
+int asprintf(char **ret, const char *format, ...)
+{
+ va_list args;
+ int count;
+
+ va_start(args, format);
+ count = vasprintf(ret, format, args);
+ va_end(args);
+ return(count);
+}
+#endif
diff --git a/src/libqes/src/qes_compat.h b/src/libqes/src/qes_compat.h
new file mode 100644
index 0000000..b2abdc3
--- /dev/null
+++ b/src/libqes/src/qes_compat.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: qes_compat.h
+ *
+ * Description: Compatibility helpers for cross-platformness
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include "qes_config.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+
+
+#ifndef STRNDUP_FOUND
+char *strndup(const char *s, size_t n);
+#endif
+
+#ifndef VASPRINTF_FOUND
+int vasprintf(char **ret, const char *format, va_list args);
+#endif
+
+#ifndef ASPRINTF_FOUND
+int asprintf(char **ret, const char *format, ...);
+#endif
diff --git a/src/libqes/src/qes_config.h.in b/src/libqes/src/qes_config.h.in
new file mode 100644
index 0000000..a3ae570
--- /dev/null
+++ b/src/libqes/src/qes_config.h.in
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: qes_config.h.in
+ *
+ * Description: Define various things from CMake.
+ *
+ * Created: 15/08/14 12:09:59
+ * License: GPLv3+
+ * Compiler: gcc, clang
+ *
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#ifndef QES_CONFIG_H
+#define QES_CONFIG_H
+
+#define LIBQES_VERSION "${LIBQES_VERSION}"
+#cmakedefine GETLINE_FOUND
+#cmakedefine STRNDUP_FOUND
+#cmakedefine ZLIB_FOUND
+#cmakedefine GZBUFFER_FOUND
+#cmakedefine OPENMP_FOUND
+#cmakedefine ASPRINTF_FOUND
+#cmakedefine VASPRINTF_FOUND
+
+/* Definitions to make changing fp type easy */
+#ifdef ZLIB_FOUND
+# include <zlib.h>
+# define QES_ZTYPE gzFile
+# define QES_ZOPEN gzopen
+# define QES_ZDOPEN gzdopen
+# define QES_ZCLOSE gzclose
+# define QES_ZREAD gzread
+# define QES_ZWRITE gzwrite
+# define QES_ZFLUSH(fp) gzflush(fp, Z_SYNC_FLUSH)
+# define QES_ZFPRINTF gzprintf
+# define QES_ZFPUTS gzputs
+# define QES_ZFPUTC gzputc
+# define QES_ZFGETS gzgets
+# define QES_ZFGETC gzgetc
+# define QES_ZFUNGETC gzungetc
+# define QES_ZERR gzerror
+# define QES_ZEOF gzeof
+#ifdef GZBUFFER_FOUND
+# define QES_ZBUFFER gzbuffer
+#endif
+# define QES_ZSEEK gzseek
+# define QES_ZTELL gztell
+# define QES_ZREWIND gzrewind
+#else
+# define QES_ZTYPE FILE*
+# define QES_ZOPEN fopen
+# define QES_ZCLOSE fclose
+# define QES_ZDOPEN fdopen
+# define QES_ZCLOSE fclose
+# define QES_ZREAD(fp, buf, ln) fread(buf, 1, ln, fp)
+# define QES_ZWRITE(fp, buf, ln) fwrite(buf, 1, ln, fp)
+# define QES_ZFLUSH fflush
+# define QES_ZFPRINTF fprintf
+# define QES_ZFPUTS(fp, s) fputs(s, fp)
+# define QES_ZFPUTC(fp, c) fputc(c, fp)
+# define QES_ZFGETS(fp, s, l) fgets(s, l, fp)
+# define QES_ZFGETC fgetc
+# define QES_ZFUNGETC fungetc
+# define QES_ZERR ferror
+# define QES_ZEOF feof
+# define QES_ZBUFFER(fp, sz) setvbuf(fp, NULL, _IOFBF, sz)
+# define QES_ZSEEK fseek
+# define QES_ZTELL ftell
+# define QES_ZREWIND rewind
+#endif
+
+#endif /* QES_CONFIG_H */
diff --git a/src/libqes/src/qes_file.c b/src/libqes/src/qes_file.c
new file mode 100644
index 0000000..93fee0f
--- /dev/null
+++ b/src/libqes/src/qes_file.c
@@ -0,0 +1,520 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: qes_file.c
+ *
+ * Description: Compressed file IO
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include "qes_file.h"
+
+static int
+__qes_file_fill_buffer (struct qes_file *file)
+{
+ ssize_t res = 0;
+
+ if (!qes_file_ok(file)) {
+ return 0;
+ }
+ if (file->feof || file->eof) {
+ file->eof = 1;
+ return EOF;
+ }
+ res = QES_ZREAD(file->fp, file->buffer, QES_FILEBUFFER_LEN - 1);
+ if (res < 0) {
+ /* Errored */
+ return 0;
+ } else if (res == 0) {
+ /* At both buffer & file EOF */
+ file->eof = 1;
+ file->feof = 1;
+ return EOF;
+ } else if (res < (QES_FILEBUFFER_LEN) - 1) {
+ /* At file EOF */
+ file->feof = 1;
+ }
+ file->bufiter = file->buffer;
+ file->bufend = file->buffer + res;
+ file->bufend[0] = '\0';
+ return 1;
+}
+
+struct qes_file *
+qes_file_open_ (const char *path, const char *mode, qes_errhandler_func onerr,
+ const char *file, int line)
+{
+ struct qes_file *qf = NULL;
+
+ /* Error out with NULL */
+ if (path == NULL || mode == NULL || onerr == NULL || file == NULL) {
+ return NULL;
+ }
+
+ /* create file struct */
+ qf = qes_calloc(1, sizeof(*qf));
+ /* Open file, handling any errors */
+ if (strcmp(path, "-") == 0) {
+ if (tolower(mode[0]) == 'r') {
+ qf->fp = QES_ZDOPEN(STDIN_FILENO, mode);
+ } else {
+ qf->fp = QES_ZDOPEN(STDOUT_FILENO, mode);
+ }
+ } else {
+ qf->fp = QES_ZOPEN(path, mode);
+ }
+ if (qf->fp == NULL) {
+ (*onerr)("Opening file %s failed:\n%s\n", file, line,
+ path, strerror(errno));
+ qes_free(qf);
+ return(NULL);
+ }
+ qf->mode = qes_file_guess_mode(mode);
+ if (qf->mode == QES_FILE_MODE_UNKNOWN) {
+ QES_ZCLOSE(qf->fp);
+ qes_free(qf);
+ return NULL;
+ }
+ qf->buffer = qes_calloc_(sizeof(*qf->buffer), QES_FILEBUFFER_LEN,
+ onerr, file, line);
+ if (qf->buffer == NULL) {
+ QES_ZCLOSE(qf->fp);
+ qes_free(qf);
+ (*onerr)("Coudn't allocate buffer memory", file, line);
+ return NULL;
+ }
+ qf->bufiter = qf->buffer;
+ qf->buffer[0] = '\0';
+ qf->bufend = qf->buffer;
+ /* init struct fields */
+ qf->eof = 0;
+ qf->filepos = 0;
+ qf->path = strndup(path, QES_MAX_FN_LEN);
+ return(qf);
+}
+
+enum qes_file_mode
+qes_file_guess_mode (const char *mode)
+{
+ if (mode[0] == 'r') {
+ return QES_FILE_MODE_READ;
+ } else if(mode[0] == 'w' || mode[0] == 'a') {
+ return QES_FILE_MODE_WRITE;
+ }
+ return QES_FILE_MODE_UNKNOWN;
+}
+
+void
+qes_file_rewind (struct qes_file *file)
+{
+ if (qes_file_ok(file)) {
+ QES_ZSEEK(file->fp, 0, SEEK_SET);
+ file->filepos = 0;
+ file->eof = 0;
+ file->feof = 0;
+ file->bufiter = file->buffer;
+ file->bufend = file->buffer;
+ }
+}
+
+void
+qes_file_close_ (struct qes_file *file)
+{
+ if (file != NULL) {
+ if (file->fp != NULL) {
+ QES_ZCLOSE(file->fp);
+ }
+ qes_free(file->path);
+ qes_free(file->buffer);
+ file->bufiter = NULL;
+ file->bufend = NULL;
+ qes_free(file);
+ }
+}
+
+
+const char *
+qes_file_error (struct qes_file *file)
+{
+ int error = 0;
+ const char *errstr = "";
+
+ if (!qes_file_ok(file)) {
+ /* Never return NULL, or we'll SIGSEGV printf */
+ return "BAD FILE";
+ }
+#ifdef ZLIB_FOUND
+ errstr = gzerror(file->fp, &error);
+ if (error == Z_ERRNO) {
+ return strerror(errno);
+ }
+#else
+ error = ferror(file->fp);
+ if (error != 0) {
+ errstr = strerror(errno);
+ clearerr(file->fp);
+ }
+#endif
+ return errstr;
+}
+
+
+int
+qes_file_readable(struct qes_file *file)
+{
+ /* Here we check that reads won't fail. We refil if we need to. */
+ /* Can we possibly read from this file? */
+ if (!qes_file_ok(file) || file->mode == QES_FILE_MODE_UNKNOWN || \
+ file->mode == QES_FILE_MODE_WRITE || file->eof) {
+ return 0;
+ }
+ /* We can read from buffer */
+ if (file->bufiter < file->bufend && file->bufiter[0] != '\0') {
+ return 1;
+ }
+ /* Buffer needs a refil */
+ if (__qes_file_fill_buffer(file) != 0) {
+ /* we either successfully refilled, or are at EOF */
+ return file->eof ? EOF : 1;
+ } else {
+ /* No, we can't read */
+ return 0;
+ }
+}
+
+int
+qes_file_writable(struct qes_file *file)
+{
+ /* Here we check that reads won't fail. We refil if we need to. */
+ /* Can we possibly read from this file? */
+ if (!qes_file_ok(file) || file->mode == QES_FILE_MODE_UNKNOWN || \
+ file->mode == QES_FILE_MODE_READ) {
+ return 0;
+ }
+ /* TODO: be more rigorous here */
+ return 1;
+}
+
+int
+qes_file_peek(struct qes_file *file)
+{
+ if (!qes_file_ok(file) || qes_file_readable(file) == 0) {
+ return -2;
+ } else if (file->eof) {
+ return EOF;
+ }
+ return file->bufiter[0];
+}
+
+int
+qes_file_putstr(struct qes_file *stream, const struct qes_str *str)
+{
+ /* TODO: use the buffer in write mode */
+ return QES_ZWRITE(stream->fp, str->str, str->len);
+}
+
+int
+qes_file_puts(struct qes_file *file, const char *str)
+{
+ if (!qes_file_ok(file) || !qes_file_writable(file)) {
+ return -2;
+ }
+ return QES_ZFPUTS(file->fp, str);
+}
+
+int
+qes_file_putc(struct qes_file *file, const int chr)
+{
+ int res = 0;
+ if (!qes_file_ok(file) || !qes_file_writable(file)) {
+ return -2;
+ }
+ res = QES_ZFPUTC(file->fp, chr);
+ if (res != chr) {
+ return -1;
+ }
+ return 1;
+}
+
+
+int
+qes_file_getc(struct qes_file *file)
+{
+ if (!qes_file_ok(file) || qes_file_readable(file) == 0) {
+ return -2;
+ }
+ if (file->eof) {
+ return EOF;
+ }
+ return (file->bufiter++)[0];
+}
+
+ssize_t
+qes_file_getuntil_realloc_(struct qes_file *file, int delim, char **bufref,
+ size_t *sizeref, qes_errhandler_func onerr,
+ const char *src, const int line)
+{
+ size_t len = 0;
+ size_t tocpy = 0;
+ char *buf = NULL;
+ char *nextbuf = NULL;
+ char *end = NULL;
+ size_t size = 0;
+ int ret = 0;
+
+ if (bufref == NULL || !qes_file_ok(file) || sizeref == NULL) {
+ return -2;
+ }
+ if (file->eof) {
+ return EOF;
+ }
+ /* store local copies to stop dereferencing every time we need them */
+ buf = *bufref;
+ size = *sizeref;
+ /* Alloc the buffer if it's NULL */
+ if (buf == NULL) {
+ buf = qes_malloc_(__INIT_LINE_LEN * sizeof(*buf), onerr, src, line);
+ size = __INIT_LINE_LEN;
+ buf[0] = '\0';
+ }
+ /* Set nextbuf AFTER we may/may not have alloced buf above
+ * In case we error out below, we always set bufref = buf here, as
+ * then we don't lose the memory alloced above */
+ *bufref = nextbuf = buf;
+ /* Read until delim is in file->buffer, filling buffer */
+ while ((end = memchr(file->bufiter, delim, file->bufend - file->bufiter))
+ == NULL) {
+ /* copy the remainder of the buffer */
+ tocpy = file->bufend - file->bufiter;
+ len += tocpy;
+ while (len + 1 >= size) {
+ size = qes_roundupz(size);
+ buf = qes_realloc_(buf, sizeof(*buf) * size, onerr, src, line);
+ if (buf == NULL) {
+ /* We bail out here, and *bufref is untouched. This means we
+ * can check for errors, and free *bufref from the calling
+ * function */
+ return -2;
+ }
+ *bufref = buf;
+ }
+ /* set to the correct position in the NEW buf, maybe after realloc */
+ nextbuf = buf + len - tocpy;
+ memcpy(nextbuf, file->bufiter, tocpy);
+ /* Update pointers to point to their respective heads */
+ nextbuf += tocpy;
+ file->bufiter += tocpy;
+ /* Null-terminate buf */
+ buf[len] = '\0';
+ /* file->buffer should now be empty, so fill 'er up! */
+ ret = __qes_file_fill_buffer(file);
+ if (ret == 0) {
+ /* Couln't fill, error out */
+ return -2;
+ } else if (ret == EOF) {
+ /* EOF time */
+ break;
+ }
+ }
+ if (end != NULL) {
+ /* We've got the delimter in the buffer */
+ tocpy = end + 1 - file->bufiter; /* +1 includes the delimiter */
+ } else if (file->bufiter < file->bufend) {
+ /* No delimiter, but we return what we have. */
+ tocpy = file->bufend - file->bufiter;
+ } else {
+ /* Nothign left at all */
+ file->eof = 1;
+ goto done;
+ }
+ /* we need to ensure that we still have enough room.
+ * This happens as above */
+ len += tocpy;
+ while (len + 1 >= size) {
+ size = qes_roundupz(size + 1);
+ buf = qes_realloc_(buf, sizeof(*buf) * size, onerr, src, line);
+ if (buf == NULL) {
+ /* We bail out here, and *bufref is untouched. This means we
+ * can check for errors, and free *bufref from the calling
+ * function */
+ return -2;
+ }
+ *bufref = buf;
+ }
+ nextbuf = buf + len - tocpy;
+ memcpy(nextbuf, file->bufiter, tocpy);
+ file->bufiter += tocpy;
+ /* We don't bother updating nextbuf, as this was our final copy to buf */
+ goto done;
+done:
+ /* restore/update referred values */
+ *bufref = buf;
+ *sizeref = size;
+ if (len > 0) {
+ /* We have something to return, so return its length */
+ file->filepos += len;
+ buf[len] = '\0';
+ return len;
+ } else if (file->eof) {
+ return EOF;
+ } else {
+ /* Shouldn't reach here! */
+ return -2;
+ }
+}
+#define qes_file_getuntil_realloc(fp, dlm, buf, sz) \
+ qes_file_getuntil_realloc_(fp, dlm, buf, sz, QES_DEFAULT_ERR_FN, \
+ __FILE__, __LINE__)
+#define qes_file_getuntil_realloc_errnil(fp, dlm, buf, sz) \
+ qes_file_getuntil_realloc_(fp, dlm, buf, sz, errnil, __FILE__, __LINE__)
+#define qes_file_getuntil_realloc_errprint(fp, dlm, buf, sz) \
+ qes_file_getuntil_realloc_(fp, dlm, buf, sz, errprint, __FILE__, __LINE__)
+#define qes_file_getuntil_realloc_errprintexit(fp, dlm, buf, sz) \
+ qes_file_getuntil_realloc_(fp, dlm, buf, sz, errprintexit, __FILE__, \
+ __LINE__)
+
+
+/* === FUNCTION =============================================================
+ Name: qes_file_readline_realloc
+ Description: Read a line from `file` into a `char *` pointed to by `buf`.
+ This function has the added benefit of `realloc`-ing `buf`
+ to the next highest base-2 power, if we run out of space.
+ If it is realloced, `(*size)` is updated to the new buffer
+ size. DON'T USE ON STACK BUFFERS.
+ Returns: ssize_t set to either the length of the line copied to `*buf`,
+ or one of -1 (EOF) or -2 (error).
+ * ==========================================================================*/
+ssize_t
+qes_file_readline_realloc_ (struct qes_file *file, char **buf, size_t *size,
+ qes_errhandler_func onerr, const char *src, const int line)
+{
+ return qes_file_getuntil_realloc_(file, '\n', buf, size, onerr, src, line);
+}
+#define qes_file_readline_realloc(fp, buf, sz) \
+ qes_file_readline_realloc_(fp, buf, sz, QES_DEFAULT_ERR_FN, __FILE__, \
+ __LINE__)
+#define qes_file_readline_realloc_errnil(fp, buf, sz) \
+ qes_file_readline_realloc_(fp, buf, sz, errnil, __FILE__, __LINE__)
+#define qes_file_readline_realloc_errprint(fp, buf, sz) \
+ qes_file_readline_realloc_(fp, buf, sz, errprint, __FILE__, __LINE__)
+#define qes_file_readline_realloc_errprintexit(fp, buf, sz) \
+ qes_file_readline_realloc_(fp, buf, sz, errprintexit, __FILE__, __LINE__)
+
+
+/*=== FUNCTION ============================================================*
+Name: qes_file_getuntil
+Parameters: struct qes_file *file: File to read
+ const int delim: Delimiter char.
+Description: Reads ``file`` into ``dest`` until ``delim`` is found or
+ ``maxlen - `` bytes have been read. ``delim`` is copied into
+ ``dest``! ``delim`` can be EOF for "read until EOF", or any
+ other thing that fits in a ``char``.
+Returns: ssize_t: EOF, -2 (error) or size of data read.
+ *===========================================================================*/
+ssize_t
+qes_file_getuntil (struct qes_file *file, const int delim, char *dest,
+ size_t maxlen)
+{
+ size_t len = 0;
+ char *nextbuf = dest;
+ size_t tocpy = 0;
+ char *end = NULL;
+ int ret = 0 ;
+ if (dest == NULL || !qes_file_ok(file) || maxlen < 1 || delim > 255) {
+ /* EOF is normally == -1, so use -2 to differentiate them */
+ return -2;
+ }
+ /* For detailed commentary, see qes_file_getuntil_realloc */
+ /* Get out early if we're at EOF already */
+ if (file->eof) {
+ return EOF;
+ }
+ while ((end = memchr(file->bufiter, delim, file->bufend - file->bufiter))
+ == NULL) {
+ tocpy = file->bufend - file->bufiter;
+ if (len + tocpy >= maxlen) {
+ /* + 1 because we always leave space for \0 */
+ tocpy += maxlen - (len + tocpy + 1);
+ }
+ len += tocpy;
+ memcpy(nextbuf, file->bufiter, tocpy);
+ nextbuf += tocpy;
+ file->bufiter += tocpy;
+ dest[len] = '\0'; /* Null-terminate buf */
+ ret = __qes_file_fill_buffer(file);
+ if (ret == 0) {
+ return -2;
+ } else if (ret == EOF) {
+ break;
+ }
+ }
+ if (end != NULL) {
+ tocpy = (end - file->bufiter) + 1; /* +1 includes the delimiter */
+ } else if (file->bufiter < file->bufend) {
+ tocpy = file->bufend - file->bufiter;
+ } else {
+ /* Nothign left at all */
+ file->eof = 1;
+ goto done;
+ }
+ if (len + tocpy >= maxlen) {
+ /* maxlen - 1 because we always leave space for \0 */
+ tocpy += maxlen - (len + tocpy + 1);
+ }
+ memcpy(nextbuf, file->bufiter, tocpy);
+ len += tocpy;
+ file->bufiter += tocpy;
+ goto done;
+done:
+ if (len > 0) {
+ file->filepos += len;
+ dest[len] = '\0';
+ return len;
+ } else if (file->eof) {
+ return EOF;
+ } else {
+ return -2;
+ }
+}
+
+ssize_t
+qes_file_readline (struct qes_file *file, char *dest, size_t maxlen)
+{
+ return qes_file_getuntil(file, '\n', dest, maxlen);
+}
+
+ssize_t
+qes_file_readline_str (struct qes_file *file, struct qes_str *str)
+{
+ ssize_t len = 0;
+
+ if (file == NULL || !qes_str_ok(str)) {
+ return -2; /* ERROR, not EOF */
+ }
+ len = qes_file_readline_realloc(file, &(str->str), &(str->capacity));
+ if (len < 0) {
+ qes_str_nullify(str);
+ return len;
+ }
+ str->len = len;
+ return len;
+}
diff --git a/src/libqes/src/qes_file.h b/src/libqes/src/qes_file.h
new file mode 100644
index 0000000..341d39e
--- /dev/null
+++ b/src/libqes/src/qes_file.h
@@ -0,0 +1,229 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: qes_file.h
+ *
+ * Description: Compressed file IO
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#ifndef QES_FILE_H
+#define QES_FILE_H
+
+#include <qes_util.h>
+#include <qes_str.h>
+
+enum qes_file_mode {
+ QES_FILE_MODE_UNKNOWN,
+ QES_FILE_MODE_READ,
+ QES_FILE_MODE_WRITE
+};
+
+struct qes_file {
+ QES_ZTYPE fp;
+ char *path;
+ char *buffer;
+ char *bufiter;
+ char *bufend;
+ off_t filepos;
+ enum qes_file_mode mode;
+ /* Is the fp at EOF, AND do we have nothing left to copy from the buffer */
+ int eof;
+ /* Is the fp at EOF */
+ int feof;
+};
+
+/* qes_file_open:
+ Create a `struct qes_file` and open `path` with mode `mode` and
+ errorhandler `onerr`
+ */
+struct qes_file *qes_file_open_(const char *path,
+ const char *mode,
+ qes_errhandler_func onerr,
+ const char *file,
+ int line);
+#define qes_file_open(pth, mod) \
+ qes_file_open_(pth, mod, QES_DEFAULT_ERR_FN, __FILE__, __LINE__)
+#define qes_file_open_errnil(pth, mod) \
+ qes_file_open_(pth, mod, errnil, __FILE__, __LINE__)
+#define qes_file_open_errprint(pth, mod) \
+ qes_file_open_(pth, mod, errprint, __FILE__, __LINE__)
+#define qes_file_open_errprintexit(pth, mod) \
+ qes_file_open_(pth, mod, errprintexit, __FILE__, __LINE__)
+
+
+/*=== FUNCTION ============================================================*
+Name: qes_file_close
+Parameters: struct qes_file *file: file to close.
+Description: Closes the file pointer in ``file``, frees dynamically
+ allocated members of ``file`` and sets ``file`` to NULL.
+Returns: void
+ *===========================================================================*/
+void qes_file_close_ (struct qes_file *file);
+#define qes_file_close(file) do { \
+ qes_file_close_ (file); \
+ file = NULL; \
+ } while(0)
+
+int qes_file_readable (struct qes_file *file);
+int qes_file_writable (struct qes_file *file);
+enum qes_file_mode qes_file_guess_mode
+ (const char *mode);
+
+void qes_file_rewind (struct qes_file *file);
+int qes_file_peek (struct qes_file *file);
+
+int qes_file_putstr (struct qes_file *stream,
+ const struct qes_str *str);
+int qes_file_puts (struct qes_file *file,
+ const char *str);
+int qes_file_putc (struct qes_file *stream,
+ const int chr);
+int qes_file_getc (struct qes_file *file);
+
+
+/*=== FUNCTION ============================================================*
+Name: qes_file_readline
+Parameters: struct qes_file *file: File to read
+ char *dest: Destination buffer
+ size_t maxlen: size of destination buffer
+Description: Reads at most ``maxlen - 1`` bytes of the next '\n' delimited
+ line into ``dest``, and null- terminates ``dest``. The '\n' is
+ copied, and therefore counts towards ``strlen()`` of ``dest``.
+Returns: ssize_t: EOF, -2 (error), or length of bytes copied, i.e.
+ ``strlen(dest);``
+ *===========================================================================*/
+ssize_t qes_file_readline (struct qes_file *file,
+ char *dest,
+ size_t maxlen);
+
+/*=== FUNCTION ============================================================*
+Name: qes_file_readline_str
+Parameters: struct qes_file *file: File to read.
+ struct qes_str *str: struct qes_str object to read into.
+Description: Convenience wrapper around qes_file_readline_realloc, which
+ reads a line into a struct qes_str object, passing str->str to
+ and str->capacity to qes_file_readline_realloc.
+Returns: ssize_t set to either the length of the line copied to the
+ struct qes_str, or one of -1 (EOF) or -2 (error).
+* ===========================================================================*/
+ssize_t qes_file_readline_str (struct qes_file *file,
+ struct qes_str *str);
+
+/*=== FUNCTION ============================================================*
+Name: qes_file_getuntil
+Parameters: struct qes_file *file: File to read
+ const int delim: Delimiter char.
+Description: Reads ``file`` into ``dest`` until ``delim`` is found or
+ ``maxlen - `` bytes have been read. ``delim`` is copied into
+ ``dest``! ``delim`` can be EOF for "read until EOF", or any
+ other thing that fits in a ``char``.
+Returns: ssize_t: EOF, -2 (error) or size of data read.
+ *===========================================================================*/
+ssize_t qes_file_getuntil (struct qes_file *file,
+ const int delim,
+ char *dest,
+ size_t maxlen);
+
+/*=== FUNCTION ============================================================*
+Name: qes_file_getuntil_realloc
+Parameters: qes_file *file: File to read.
+ int delim: Delimiter char.
+ char **bufref: reference to a `char *` containing the buffer.
+ Must not refer to a ``char[]`` that cannot be resized with
+ ``realloc``.
+ size *sizeref: Reference to a variable tracking the allocated
+ size of the ``char *`` referred to by ``bufref``.
+Description: Read a string from `file` into a
+ `char *` pointed to by
+ `bufref` up to and inclding the character ``delim``. This
+ function has the added benefit of `realloc`-ing `*bufref` to
+ the next highest base-2 power, if we run out of space. If it
+ is realloced, `(*sizeref)` is updated to the new buffer size.
+Returns: ssize_t set to either the length of the line copied to
+ `*bufref`, or one of -1 (EOF) or -2 (error).
+*============================================================================*/
+ssize_t qes_file_getuntil_realloc_
+ (struct qes_file *file,
+ int delim,
+ char **bufref,
+ size_t *sizeref,
+ qes_errhandler_func onerr,
+ const char *src,
+ const int line);
+
+#define qes_file_getuntil_realloc(fp, dlm, buf, sz) \
+ qes_file_getuntil_realloc_(fp, dlm, buf, sz, QES_DEFAULT_ERR_FN, \
+ __FILE__, __LINE__)
+#define qes_file_getuntil_realloc_errnil(fp, dlm, buf, sz) \
+ qes_file_getuntil_realloc_(fp, dlm, buf, sz, errnil, __FILE__, __LINE__)
+#define qes_file_getuntil_realloc_errprint(fp, dlm, buf, sz) \
+ qes_file_getuntil_realloc_(fp, dlm, buf, sz, errprint, __FILE__, __LINE__)
+#define qes_file_getuntil_realloc_errprintexit(fp, dlm, buf, sz) \
+ qes_file_getuntil_realloc_(fp, dlm, buf, sz, errprintexit, __FILE__, \
+ __LINE__)
+
+
+/* === FUNCTION =============================================================
+ Name: qes_file_readline_realloc
+ Description: Read a line from `file` into a `char *` pointed to by `buf`.
+ This function has the added benefit of `realloc`-ing `buf`
+ to the next highest base-2 power, if we run out of space.
+ If it is realloced, `(*size)` is updated to the new buffer
+ size. DON'T USE ON STACK BUFFERS.
+ Returns: ssize_t set to either the length of the line copied to `*buf`,
+ or one of -1 (EOF) or -2 (error).
+ * ==========================================================================*/
+ssize_t qes_file_readline_realloc_
+ (struct qes_file *file,
+ char **buf,
+ size_t *size,
+ qes_errhandler_func onerr,
+ const char *src,
+ const int line);
+#define qes_file_readline_realloc(fp, buf, sz) \
+ qes_file_readline_realloc_(fp, buf, sz, QES_DEFAULT_ERR_FN, __FILE__, \
+ __LINE__)
+#define qes_file_readline_realloc_errnil(fp, buf, sz) \
+ qes_file_readline_realloc_(fp, buf, sz, errnil, __FILE__, __LINE__)
+#define qes_file_readline_realloc_errprint(fp, buf, sz) \
+ qes_file_readline_realloc_(fp, buf, sz, errprint, __FILE__, __LINE__)
+#define qes_file_readline_realloc_errprintexit(fp, buf, sz) \
+ qes_file_readline_realloc_(fp, buf, sz, errprintexit, __FILE__, __LINE__)
+
+
+const char *qes_file_error (struct qes_file *file);
+
+static inline int
+qes_file_ok (const struct qes_file *qf)
+{
+ /* qes_file_ok just check we won't dereference NULLs, so we check pointer
+ * NULLness for all pointers we care about in current modes. Which, unless
+ * we're Write-only, is all of them */
+ return qf != NULL && \
+ qf->fp != NULL && \
+ qf->bufiter != NULL && \
+ qf->buffer != NULL;
+}
+
+
+#endif /* QES_FILE_H */
diff --git a/src/libqes/src/qes_libgnu.c b/src/libqes/src/qes_libgnu.c
new file mode 100644
index 0000000..1d6d88a
--- /dev/null
+++ b/src/libqes/src/qes_libgnu.c
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: qes_libgnu.c
+ * Description: Functions required from gnulib
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include "qes_libgnu.h"
+
+#ifndef ZLIB_FOUND
+# include "crc.c"
+#endif
diff --git a/src/libqes/src/qes_libgnu.h b/src/libqes/src/qes_libgnu.h
new file mode 100644
index 0000000..17b7a78
--- /dev/null
+++ b/src/libqes/src/qes_libgnu.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: qes_libgnu.h
+ * Description: Functions required from gnulib
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#ifndef QES_LIBGNU_H
+#define QES_LIBGNU_H
+
+#include "qes_config.h"
+
+/* This file and qes_libgnu.c are designed to allow us to keep the sources of
+ * the gnulib functions intact and in their original separate form. */
+
+#ifndef ZLIB_FOUND
+# include "crc.h"
+#else
+# include <zlib.h>
+/* Cast is to avoid a difference in signed-ness in the two implementations. */
+# define crc32_update(c, b, l) crc32(c, (const unsigned char *)b, l)
+#endif
+
+#endif /* QES_LIBGNU_H */
diff --git a/src/libqes/src/qes_log.c b/src/libqes/src/qes_log.c
new file mode 100644
index 0000000..49a2103
--- /dev/null
+++ b/src/libqes/src/qes_log.c
@@ -0,0 +1,267 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: qes_log.c
+ *
+ * Description: Logging module of libngs2
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include "qes_log.h"
+
+
+struct qes_logger *
+qes_logger_create(void)
+{
+ return qes_calloc(1, sizeof(struct qes_logger));
+}
+
+int
+qes_logger_init(struct qes_logger *logger,
+ const char *name,
+ enum qes_log_level level)
+{
+ if (logger == NULL) return 1;
+
+ if (name != NULL) {
+ logger->name = strdup(name);
+ } else if (logger->name != NULL) {
+ free(logger->name);
+ logger->name = NULL;
+ }
+ logger->level = level;
+ return 0;
+}
+
+int
+qes_logger_add_destination_formatted(struct qes_logger *logger,
+ FILE *stream,
+ enum qes_log_level level,
+ char *(*formatter)(struct qes_log_entry *entry))
+{
+ struct qes_log_destination *new = NULL;
+ size_t new_sz = logger->n_destinations + 1;
+
+ new = qes_realloc(logger->destinations,
+ new_sz * sizeof(*logger->destinations));
+ if (new == NULL) {
+ return 1;
+ }
+ logger->destinations = new;
+ logger->n_destinations = new_sz;
+ /* For ease of reference, save the ptr to the (new) final struct in
+ * the array */
+ new = &new[new_sz - 1];
+ new->stream = stream;
+ new->level = level;
+ new->formatter = formatter;
+ return 0;
+}
+
+void
+_qes_logger_destroy(struct qes_logger *logger)
+{
+ if (logger != NULL) {
+ qes_free(logger->name);
+ qes_free(logger->destinations);
+ qes_free(logger);
+ }
+}
+
+struct qes_log_entry *
+qes_log_entry_create(void)
+{
+ return qes_calloc(1, sizeof(struct qes_log_entry));
+}
+
+int
+qes_log_entry_init(struct qes_log_entry *entry,
+ enum qes_log_level level,
+ const char *message)
+{
+ if (entry == NULL || message == NULL) return -1;
+
+ entry->level = level;
+ entry->message = strdup(message);
+ return 0;
+}
+
+int
+qes_log_entry_format_va(struct qes_log_entry *entry,
+ enum qes_log_level level,
+ const char *format,
+ va_list args)
+{
+ int res = 0;
+ char *message = NULL;
+
+ /* Format the error message w/ user input */
+ res = vasprintf(&message, format, args);
+ if (res < 1) {
+ /* Alloc inside vasprintf failed */
+ return 1;
+ }
+ /* Make the entry struct */
+ res = qes_log_entry_init(entry, level, message);
+ free(message);
+ return res;
+}
+
+int
+qes_log_entry_format(struct qes_log_entry *entry,
+ enum qes_log_level level,
+ const char *format,
+ ...)
+{
+ va_list args;
+ int res = 0;
+
+ /* Format the error message w/ user input */
+ va_start(args, format);
+ res = qes_log_entry_format_va(entry, level, format, args);
+ va_end(args);
+ return res;
+}
+
+void
+_qes_log_entry_destroy(struct qes_log_entry *entry)
+{
+ if (entry != NULL) {
+ qes_free(entry->message);
+ qes_free(entry);
+ }
+}
+void qes_log_entry_clear(struct qes_log_entry *entry)
+{
+ if (entry != NULL) {
+ qes_free(entry->message);
+ entry->level = QES_LOG_DEBUG;
+ }
+}
+
+int
+qes_logger_write_entry(struct qes_logger *logger,
+ struct qes_log_entry *entry)
+{
+ size_t iii;
+ int res;
+
+ if (logger == NULL || entry == NULL) return 1;
+
+ /* Message is to unimportant for this logger */
+ if (logger->level > entry->level) return 0;
+
+ for (iii = 0; iii < logger->n_destinations; iii++) {
+ char *formatted = NULL;
+ struct qes_log_destination *dest = &logger->destinations[iii];
+
+ /* Message is to unimportant for this destination */
+ if (dest->level > entry->level) continue;
+
+ formatted = dest->formatter(entry);
+ if (formatted == NULL) return 1;
+ res = fprintf(dest->stream, "%s", formatted);
+ fflush(dest->stream);
+ qes_free(formatted);
+ if (res < 0) return 1;
+ }
+ return 0;
+}
+
+int
+qes_log_message(struct qes_logger *logger,
+ enum qes_log_level level,
+ const char *message)
+{
+ struct qes_log_entry entry;
+ int res = 0;
+
+ res = qes_log_entry_format(&entry, level, "%s", message);
+ if (res != 0) return res;
+ res = qes_logger_write_entry(logger, &entry);
+ qes_log_entry_clear(&entry);
+ return res;
+}
+
+int
+qes_log_format(struct qes_logger *logger,
+ enum qes_log_level level,
+ const char *format,
+ ...)
+{
+ struct qes_log_entry entry;
+ va_list args;
+ int res = 0;
+
+ va_start(args, format);
+ res = qes_log_entry_format_va(&entry, level, format, args);
+ va_end(args);
+ if (res != 0) return res;
+ res = qes_logger_write_entry(logger, &entry);
+ qes_log_entry_clear(&entry);
+ return res;
+}
+
+char *
+qes_log_formatter_plain(struct qes_log_entry *entry)
+{
+ /* In the plain-text case, we just pass the message as is. */
+ if (entry == NULL) return NULL;
+ if (entry->message == NULL) return NULL;
+ return strdup(entry->message);
+}
+
+char *
+qes_log_formatter_pretty(struct qes_log_entry *entry)
+{
+ char *buf = NULL;
+ const char *colour = ANSIRST;
+ const char *reset = ANSIRST;
+ char marker = ' ';
+ int res = 0;
+
+ if (entry == NULL || entry->message == NULL) return NULL;
+
+ if (entry->level <= QES_LOG_DEBUG) {
+ marker = '.';
+ colour = ANSIBEG ATDIM FGCYN BGBLK ANSIEND;
+ reset = "";
+ } else if (entry->level <= QES_LOG_INFO) {
+ marker = '*';
+ colour = ANSIBEG ATNRM FGGRN BGBLK ANSIEND;
+ } else if (entry->level <= QES_LOG_WARNING) {
+ marker = '!';
+ colour = ANSIBEG ATULN FGYEL BGBLK ANSIEND;
+ } else if (entry->level <= QES_LOG_ERROR) {
+ marker = 'E';
+ colour = ANSIBEG ATBLD FGMAG BGBLK ANSIEND;
+ } else {
+ marker = 'F';
+ colour = ANSIBEG ATBLD ATBNK FGRED BGBLK ANSIEND;
+ }
+ res = asprintf(&buf, "%s[%c] %s%s", colour, marker, entry->message, reset);
+ if (res > 0) {
+ return buf;
+ } else {
+ return NULL;
+ }
+}
diff --git a/src/libqes/src/qes_log.h b/src/libqes/src/qes_log.h
new file mode 100644
index 0000000..fe81088
--- /dev/null
+++ b/src/libqes/src/qes_log.h
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: qes_log.h
+ *
+ * Description: Logging module of libngs2
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#ifndef QES_LOG_H
+#define QES_LOG_H
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <qes_util.h>
+
+#define ANSIBEG "\033["
+#define ANSIEND "m"
+
+#define ANSIRST ANSIBEG "0" ANSIEND
+
+#define ATNRM "0;"
+#define ATBLD "1;"
+#define ATDIM "2;"
+#define ATULN "3;"
+#define ATBNK "5;"
+#define ATREV "7;"
+#define ATHID "8;"
+
+#define FGBLK "30;"
+#define FGRED "31;"
+#define FGGRN "32;"
+#define FGYEL "33;"
+#define FGBLU "34;"
+#define FGMAG "35;"
+#define FGCYN "36;"
+#define FGWHT "37;"
+
+#define BGBLK "40"
+#define BGRED "41"
+#define BGGRN "42"
+#define BGYEL "43"
+#define BGBLU "44"
+#define BGMAG "45"
+#define BGCYN "46"
+#define BGWHT "47"
+
+enum qes_log_level {
+ /* The idea is that the user can add values between these, if they need
+ * to. a la Python's logging module. */
+ QES_LOG_DEBUG = 0,
+ QES_LOG_INFO = 10,
+ QES_LOG_WARNING = 20,
+ QES_LOG_ERROR = 30,
+ QES_LOG_FATAL = 40,
+};
+
+typedef enum qes_log_level QesLogLevel;
+
+struct qes_log_entry {
+ char *message;
+ enum qes_log_level level;
+};
+
+typedef struct qes_log_entry QesLogEntry;
+struct qes_log_destination {
+ FILE *stream;
+ enum qes_log_level level;
+ char *(*formatter)(struct qes_log_entry *entry);
+};
+typedef struct qes_log_destination QesLogDestination;
+
+struct qes_logger {
+ struct qes_log_destination *destinations;
+ size_t n_destinations;
+ enum qes_log_level level;
+ char *name;
+ int lock;
+};
+typedef struct qes_logger QesLogger;
+
+
+struct qes_logger *qes_logger_create(void);
+int qes_logger_init(struct qes_logger *logger, const char *name,
+ enum qes_log_level level);
+int qes_logger_add_destination_formatted(struct qes_logger *logger,
+ FILE *stream,
+ enum qes_log_level level,
+ char *(*formatter)(struct qes_log_entry *entry));
+#define qes_logger_add_destination(log, stream, level) \
+ qes_logger_add_destination_formatted(log, stream, level, \
+ &qes_log_formatter_plain)
+void _qes_logger_destroy(struct qes_logger *logger);
+#define qes_logger_destroy(l) STMT_BEGIN _qes_logger_destroy(l); l = NULL; STMT_END
+
+
+struct qes_log_entry *qes_log_entry_create(void);
+int qes_log_entry_init(struct qes_log_entry *entry, enum qes_log_level level,
+ const char *message);
+void qes_log_entry_clear(struct qes_log_entry *entry);
+
+char *qes_log_formatter_plain(struct qes_log_entry *entry);
+char *qes_log_formatter_pretty(struct qes_log_entry *entry);
+
+int qes_log_entry_format(struct qes_log_entry *entry, enum qes_log_level level,
+ const char *format, ...);
+int qes_log_entry_format_va(struct qes_log_entry *entry,
+ enum qes_log_level level, const char *format,
+ va_list args);
+int qes_logger_write_entry(struct qes_logger *logger,
+ struct qes_log_entry *entry);
+void _qes_log_entry_destroy(struct qes_log_entry *log_entry);
+#define qes_log_entry_destroy(l) STMT_BEGIN _qes_log_entry_destroy(l); l = NULL; STMT_END
+
+
+int qes_log_message(struct qes_logger *logger, enum qes_log_level level,
+ const char *message);
+#ifndef NDEBUG
+#define qes_log_message_debug(log, msg) qes_log_message(log, QES_LOG_DEBUG, msg)
+#else
+#define qes_log_message_debug(log, msg)
+#endif
+#define qes_log_message_info(log, msg) qes_log_message(log, QES_LOG_INFO, msg)
+#define qes_log_message_warning(log, msg) qes_log_message(log, QES_LOG_WARNING, msg)
+#define qes_log_message_error(log, msg) qes_log_message(log, QES_LOG_ERROR, msg)
+#define qes_log_message_fatal(log, msg) qes_log_message(log, QES_LOG_FATAL, msg)
+
+
+int qes_log_format(struct qes_logger *logger, enum qes_log_level level,
+ const char *format, ...);
+#ifndef NDEBUG
+#define qes_log_format_debug(log, fmt, ...) \
+ qes_log_format(log, QES_LOG_DEBUG, fmt, __VA_ARGS__)
+#else
+#define qes_log_format_debug(log, fmt, ...)
+#endif
+#define qes_log_format_info(log, fmt, ...) \
+ qes_log_format(log, QES_LOG_INFO, fmt, __VA_ARGS__)
+#define qes_log_format_warning(log, fmt, ...) \
+ qes_log_format(log, QES_LOG_WARNING, fmt, __VA_ARGS__)
+#define qes_log_format_error(log, fmt, ...) \
+ qes_log_format(log, QES_LOG_ERROR, fmt, __VA_ARGS__)
+#define qes_log_format_fatal(log, fmt, ...) \
+ qes_log_format(log, QES_LOG_FATAL, fmt, __VA_ARGS__)
+
+
+#endif /* QES_LOG_H */
diff --git a/src/libqes/src/qes_match.c b/src/libqes/src/qes_match.c
new file mode 100644
index 0000000..6874734
--- /dev/null
+++ b/src/libqes/src/qes_match.c
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: qes_match.c
+ *
+ * Description: Sequence matching and finding functions used in
+ * bioinformatic tasks
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include "qes_match.h"
+
+
+inline int_fast32_t
+qes_match_hamming (const char *seq1, const char *seq2, size_t len)
+{
+ int_fast32_t mismatches = 0;
+ size_t iii = 0;
+
+ /* Error out on bad arguments */
+ if (seq1 == NULL || seq2 == NULL) {
+ return -1;
+ }
+ /* If we've been given a length of 0, we make it up ourselves */
+ if (len == 0) {
+ size_t len2 = strlen(seq2);
+ len = strlen(seq1);
+ /* Max of len & len2 */
+ if (len > len2) {
+ len = len2;
+ }
+ }
+ /* Count mismatches. See comment on analogous loop in qes_match_hamming_max
+ * for an explanation. */
+ while(iii < len) {
+ if (seq2[iii] != seq1[iii]) {
+ mismatches++;
+ }
+ iii++;
+ }
+ return mismatches;
+}
+
+
+inline int_fast32_t
+qes_match_hamming_max(const char *seq1, const char *seq2, size_t len,
+ int_fast32_t max)
+{
+ int_fast32_t mismatches = 0;
+ size_t iii = 0;
+
+ /* Error out on bad arguments */
+ if (seq1 == NULL || seq2 == NULL || max < 0) {
+ return -1;
+ }
+ /* If we've been given a length of 0, we make it up ourselves */
+ if (len == 0) {
+ size_t len2 = strlen(seq2);
+ len = strlen(seq1);
+ /* Max of len & len2 */
+ if (len > len2) {
+ len = len2;
+ }
+ }
+ /* We obediently go until ``len``, assuming whoever gave us ``len`` knew
+ WTF they were doing. This makes things a bit faster, since these
+ functions are expected to be very much inner-loop. */
+ while(iii < len) {
+ /* Find mismatch count */
+ if (seq2[iii] != seq1[iii]) {
+ mismatches++;
+ }
+ iii++;
+ if (mismatches > max) {
+ /* Bail out if we're over max, always cap at max + 1 */
+ return max + 1;
+ }
+ }
+ return mismatches;
+}
diff --git a/src/libqes/src/qes_match.h b/src/libqes/src/qes_match.h
new file mode 100644
index 0000000..3098ea4
--- /dev/null
+++ b/src/libqes/src/qes_match.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: qes_match.h
+ *
+ * Description: Sequence matching and finding functions used in
+ * bioinformatic tasks
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#ifndef QES_MATCH_H
+#define QES_MATCH_H
+
+#include <qes_util.h>
+
+
+/*=== FUNCTION ============================================================*
+Name: qes_match_hamming
+Parameters: const char *seq1, *seq2: Two strings to compare.
+ size_t len: Compare ``len`` chars. If 0, guess length with
+ strlen (may be unsafe).
+Description: Find the hamming distance between two strings. The strings are
+ matched until the length of the smallest string.
+Returns: The hamming distance between ``seq1`` and ``seq2``, or -1 on
+ error.
+ *===========================================================================*/
+extern int_fast32_t qes_match_hamming(const char *seq1, const char *seq2, size_t len);
+
+
+/*=== FUNCTION ============================================================*
+Name: qes_match_hamming_max
+Parameters: const char *seq1, *seq2: Two strings to compare.
+ size_t len: Compare ``len`` chars. If 0, guess length with
+ strlen (may be unsafe).
+ int_fast32_t max: Stop counting at ``max``, return ``max + 1``.
+Description: Find the hamming distance between two strings. The strings are
+ matched until the length of the smallest string, or ``len``
+ charachers, or until the maximum hamming distance (``max``) is
+ reached.
+Returns: The hamming distance between ``seq1`` and ``seq2``, or
+ ``max + 1`` if the hamming distance exceeds ``max``, or -1 on
+ error.
+ *===========================================================================*/
+extern int_fast32_t qes_match_hamming_max(const char *seq1, const char *seq2, size_t len,
+ int_fast32_t max);
+
+#endif /* QES_MATCH_H */
diff --git a/src/libqes/src/qes_seq.c b/src/libqes/src/qes_seq.c
new file mode 100644
index 0000000..f9e8e61
--- /dev/null
+++ b/src/libqes/src/qes_seq.c
@@ -0,0 +1,232 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: qes_seq.c
+ *
+ * Description: Sequence structures
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include "qes_seq.h"
+
+
+void
+qes_seq_init (struct qes_seq *seq)
+{
+ qes_str_init(&seq->name, __INIT_LINE_LEN);
+ qes_str_init(&seq->comment, __INIT_LINE_LEN);
+ qes_str_init(&seq->seq, __INIT_LINE_LEN);
+ qes_str_init(&seq->qual, __INIT_LINE_LEN);
+}
+
+struct qes_seq *
+qes_seq_create (void)
+{
+ struct qes_seq *seq = qes_malloc(sizeof(*seq));
+
+ qes_str_init(&seq->name, __INIT_LINE_LEN);
+ qes_str_init(&seq->comment, __INIT_LINE_LEN);
+ qes_str_init(&seq->seq, __INIT_LINE_LEN);
+ qes_str_init(&seq->qual, __INIT_LINE_LEN);
+ return seq;
+}
+
+struct qes_seq *
+qes_seq_create_no_qual (void)
+{
+ struct qes_seq *seq = qes_malloc(sizeof(*seq));
+
+ qes_str_init(&seq->name, __INIT_LINE_LEN);
+ qes_str_init(&seq->comment, __INIT_LINE_LEN);
+ qes_str_init(&seq->seq, __INIT_LINE_LEN);
+ seq->qual.capacity = 0;
+ seq->qual.len = 0;
+ seq->qual.str = NULL;
+ return seq;
+}
+
+struct qes_seq *
+qes_seq_create_no_qual_or_comment (void)
+{
+ struct qes_seq *seq = qes_malloc(sizeof(*seq));
+ qes_str_init(&seq->name, __INIT_LINE_LEN);
+ qes_str_init(&seq->seq, __INIT_LINE_LEN);
+ seq->qual.capacity = 0;
+ seq->qual.len = 0;
+ seq->qual.str = NULL;
+ seq->comment.capacity = 0;
+ seq->comment.len = 0;
+ seq->comment.str = NULL;
+ return seq;
+}
+
+
+inline int
+qes_seq_fill_name (struct qes_seq *seqobj, const char *name, size_t len)
+{
+ if (seqobj == NULL || name == NULL || len < 1) {
+ return 1;
+ }
+ qes_str_fill_charptr(&seqobj->name, name, len);
+ return 0;
+}
+
+inline int
+qes_seq_fill_comment (struct qes_seq *seqobj, const char *comment, size_t len)
+{
+ if (seqobj == NULL || comment == NULL || len < 1) {
+ return 1;
+ }
+ qes_str_fill_charptr(&seqobj->comment, comment, len);
+ return 0;
+}
+
+inline int
+qes_seq_fill_seq (struct qes_seq *seqobj, const char *seq, size_t len)
+{
+ if (seqobj == NULL || seq == NULL || len < 1) {
+ return 1;
+ }
+ qes_str_fill_charptr(&seqobj->seq, seq, len);
+ return 0;
+}
+
+inline int
+qes_seq_fill_qual (struct qes_seq *seqobj, const char *qual, size_t len)
+{
+ if (seqobj == NULL || qual == NULL || len < 1) {
+ return 1;
+ }
+ qes_str_fill_charptr(&seqobj->qual, qual, len);
+ return 0;
+}
+
+inline int
+qes_seq_fill_header (struct qes_seq *seqobj, char *header, size_t len)
+{
+ char *tmp = NULL;
+ size_t startfrom = 0;
+
+ if (seqobj == NULL || header == NULL) {
+ return 1;
+ }
+ if (len < 1) {
+ len = strlen(header);
+ }
+ while (isspace(header[len-1])) {
+ header[--len] = '\0';
+ }
+ tmp = memchr(header, ' ', len);
+ startfrom = header[0] == '@' || header[0] == '>' ? 1 : 0;
+ if (tmp != NULL) {
+ qes_str_fill_charptr(&seqobj->name, header + startfrom,
+ tmp - header - startfrom);
+ qes_str_fill_charptr(&seqobj->comment, tmp + 1, 0);
+ } else {
+ qes_str_fill_charptr(&seqobj->name, header + startfrom, len - startfrom);
+ qes_str_nullify(&seqobj->comment);
+ }
+ return 0;
+}
+
+inline int
+qes_seq_fill(struct qes_seq *seqobj, const char *name, const char *comment,
+ const char *seq, const char *qual)
+{
+ if (!qes_seq_ok(seqobj) || name == NULL || comment == NULL || seq == NULL \
+ || qual == NULL) {
+ return 1;
+ }
+ qes_str_nullify(&seqobj->name);
+ qes_str_nullify(&seqobj->comment);
+ qes_str_nullify(&seqobj->seq);
+ qes_str_nullify(&seqobj->qual);
+ if (qes_seq_fill_name(seqobj, name, strlen(name)) != 0) return 1;
+ if (qes_seq_fill_comment(seqobj, comment, strlen(comment)) != 0) return 1;
+ if (qes_seq_fill_seq(seqobj, seq, strlen(seq)) != 0) return 1;
+ if (strlen(qual) > 0 &&
+ qes_seq_fill_qual(seqobj, qual, strlen(qual)) != 0) return 1;
+ return 0;
+}
+
+/*=== FUNCTION ============================================================*
+Name: qes_seq_destroy
+Parameters: struct qes_seq *: seq to destroy.
+Description: Deallocate and set to NULL a struct qes_seq on the heap.
+Returns: void.
+ *===========================================================================*/
+void
+qes_seq_destroy_(struct qes_seq *seq)
+{
+ if (seq != NULL) {
+ qes_str_destroy_cp(&seq->name);
+ qes_str_destroy_cp(&seq->comment);
+ qes_str_destroy_cp(&seq->seq);
+ qes_str_destroy_cp(&seq->qual);
+ qes_free(seq);
+ }
+}
+
+static inline void
+_printstr_linewrap(const struct qes_str *str, size_t linelen, FILE *stream)
+{
+
+ for (size_t i = 0; i < str->len; i += linelen) {
+ const size_t remaining = str->len - i;
+ const size_t towrite = remaining < linelen ? remaining : linelen;
+ fwrite(str->str + i, towrite, 1, stream);
+ fputc('\n', stream);
+ }
+}
+
+int
+qes_seq_print(const struct qes_seq *seq, FILE *stream, bool fasta, int tag)
+{
+ if (!qes_seq_ok(seq)) return 1;
+ if (stream == NULL) return 1;
+ size_t linelen = fasta ? 79 : SIZE_MAX - 1;
+
+ if (fasta) {
+ fputc('>', stream);
+ } else {
+ fputc('@', stream);
+ }
+ fputs(seq->name.str, stream);
+ if (tag > 0) {
+ // Add tag only if read is not already tagged.
+ if (seq->name.len > 2 && seq->name.str[seq->name.len - 2] != '/') {
+ fprintf(stream, "/%d", tag);
+ }
+ }
+ if (seq->comment.str) {
+ fputc(' ', stream);
+ fputs(seq->comment.str, stream);
+ }
+ fputc('\n', stream);
+ _printstr_linewrap(&seq->seq, linelen, stream);
+ if (!fasta) {
+ fputs("+\n", stream);
+ _printstr_linewrap(&seq->qual, linelen, stream);
+ }
+ fflush(stream);
+ return 0;
+}
diff --git a/src/libqes/src/qes_seq.h b/src/libqes/src/qes_seq.h
new file mode 100644
index 0000000..f2a1b46
--- /dev/null
+++ b/src/libqes/src/qes_seq.h
@@ -0,0 +1,219 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: qes_seq.h
+ *
+ * Description: Sequence structures
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#ifndef QES_SEQ_H
+#define QES_SEQ_H
+
+#include <stdbool.h>
+#include <qes_util.h>
+#include <qes_str.h>
+
+
+/*---------------------------------------------------------------------------
+ | qes_seq module -- data structures to hold NGS sequences |
+ ---------------------------------------------------------------------------*/
+
+/* TYPE DEFINITIONS */
+struct qes_seq {
+ struct qes_str name;
+ struct qes_str comment;
+ struct qes_str seq;
+ struct qes_str qual;
+};
+
+/* PROTOTYPES */
+
+/*=== FUNCTION ============================================================*
+Name: qes_seq_create
+Parameters: void
+Description: Create a ``struct qes_seq`` object on the heap, creating and
+ initialising all members. qes_seq_create_no_X functions do not
+ create or initialise the members in their names.
+Returns: struct qes_seq *: A non-null memory address on success, otherwise NULL.
+ *===========================================================================*/
+struct qes_seq *qes_seq_create (void);
+struct qes_seq *qes_seq_create_no_qual (void);
+struct qes_seq *qes_seq_create_no_qual_or_comment (void);
+
+void qes_seq_init (struct qes_seq *seq);
+
+/*=== FUNCTION ============================================================*
+Name: qes_seq_ok
+Parameters: struct qes_seq *: seq to check
+Description: Check if ``seq`` is a usable struct qes_seq struct. qes_seq_ok_no-X
+ functions permit the member(s) in their names to be unusable.
+Returns: 1 if usable, 0 otherwise.
+ *===========================================================================*/
+static inline int
+qes_seq_ok (const struct qes_seq *seq)
+{
+ return \
+ seq != NULL && \
+ qes_str_ok(&seq->name) && \
+ qes_str_ok(&seq->comment) && \
+ qes_str_ok(&seq->seq) && \
+ qes_str_ok(&seq->qual);
+}
+
+static inline int
+qes_seq_ok_no_comment (const struct qes_seq *seq)
+{
+ return \
+ seq != NULL && \
+ qes_str_ok(&seq->name) && \
+ qes_str_ok(&seq->seq) && \
+ qes_str_ok(&seq->qual);
+}
+
+static inline int
+qes_seq_ok_no_qual (const struct qes_seq *seq)
+{
+ return \
+ seq != NULL && \
+ qes_str_ok(&seq->name) && \
+ qes_str_ok(&seq->comment) && \
+ qes_str_ok(&seq->seq);
+}
+
+static inline int
+qes_seq_ok_no_comment_or_qual (const struct qes_seq *seq)
+{
+ return \
+ seq != NULL && \
+ qes_str_ok(&seq->name) && \
+ qes_str_ok(&seq->seq);
+}
+
+static inline int
+qes_seq_has_comment (const struct qes_seq *seq)
+{
+ return qes_seq_ok(seq) && seq->comment.len > 0;
+}
+
+static inline int
+qes_seq_has_qual (const struct qes_seq *seq)
+{
+ return qes_seq_ok(seq) && seq->qual.len > 0;
+}
+
+static inline int
+qes_seq_n_bytes (const struct qes_seq *seq)
+{
+ if (!qes_seq_ok(seq)) {
+ return -1;
+ }
+ /* Arragned per line in a fastq */
+ return 1 + seq->name.len + \
+ (qes_seq_has_comment(seq) ? 1 + seq->comment.len : 0) + 1 + \
+ seq->seq.len + 1 +\
+ qes_seq_has_qual(seq) ? 2 + seq->qual.len + 1 : 0;
+}
+
+static inline int
+qes_seq_truncate (struct qes_seq *seq, const size_t at)
+{
+ if (!qes_seq_ok(seq)) return -1;
+
+ int res = 0;
+ res = qes_str_truncate(&seq->seq, at);
+ if (res != 0) return res;
+
+ res = qes_str_truncate(&seq->qual, at);
+ return res;
+}
+
+/*=== FUNCTION ============================================================*
+Name: qes_seq_fill_header
+Parameters: struct qes_seq *seqobj: Seq object that will receive the header.
+Description: Fills the name and comment members of a ``struct qes_seq`` from the
+ header line of a fasta/fastq file.
+Returns: int: 1 on success, otherwise 0 for failure.
+ *===========================================================================*/
+extern int qes_seq_fill_header(struct qes_seq *seqobj, char *header, size_t len);
+
+
+/*=== FUNCTION ============================================================*
+Name: qes_seq_fill_X
+Parameters: These functions take a ``struct qes_seq``, a char array and
+ the length of the char array as a size_t.
+Description: Fill a struct qes_seq's name, comment, seq or qual member from
+ a char array. If a non-zero value is given to ``len``, it is
+ assumed to be the length of the string, otherwise the length of
+ the string is calculated using strlen.
+Returns: int: 1 on success, 0 on failure.
+ *===========================================================================*/
+extern int qes_seq_fill_name(struct qes_seq *seqobj, const char *name,
+ size_t len);
+extern int qes_seq_fill_comment(struct qes_seq *seqobj, const char *comment,
+ size_t len);
+extern int qes_seq_fill_seq(struct qes_seq *seqobj, const char *seq,
+ size_t len);
+extern int qes_seq_fill_qual(struct qes_seq *seqobj, const char *qual,
+ size_t len);
+extern int qes_seq_fill(struct qes_seq *seqobj, const char *name,
+ const char *comment, const char *seq, const char *qual);
+
+/*=== FUNCTION ============================================================*
+Name: qes_seq_print
+Parameters: const struct qes_seq *seq: seq to print
+ FILE *stream: open file stream to print to.
+ bool fasta: Print as fasta?
+ int tag: Tag read name with /%d. use 0 to disable.
+Description: Print ``seq`` in formatted per ``format`` to ``stream``.
+Returns: int: 1 on success, 0 on failure.
+ *===========================================================================*/
+int qes_seq_print (const struct qes_seq *seq,
+ FILE *stream,
+ bool fasta,
+ int tag);
+
+/*=== FUNCTION ============================================================*
+Name: qes_seq_destroy
+Parameters: struct qes_seq *: seq to destroy.
+Description: Deallocate and set to NULL a struct qes_seq on the heap.
+Returns: void.
+ *===========================================================================*/
+void qes_seq_destroy_(struct qes_seq *seq);
+#define qes_seq_destroy(seq) do { \
+ qes_seq_destroy_(seq); \
+ seq = NULL; \
+ } while(0)
+
+static inline int
+qes_seq_copy(struct qes_seq *dest, const struct qes_seq *src)
+{
+ if (dest == src || !qes_seq_ok(dest) || !qes_seq_ok(src)) return 1;
+
+ if (qes_str_copy(&dest->name, &src->name) != 0) return 1;
+ if (qes_str_copy(&dest->comment, &src->comment) != 0) return 1;
+ if (qes_str_copy(&dest->seq, &src->seq) != 0) return 1;
+ if (qes_str_copy(&dest->qual, &src->qual) != 0) return 1;
+ return 0;
+}
+
+#endif /* QES_SEQ_H */
diff --git a/src/libqes/src/qes_seqfile.c b/src/libqes/src/qes_seqfile.c
new file mode 100644
index 0000000..469ec3b
--- /dev/null
+++ b/src/libqes/src/qes_seqfile.c
@@ -0,0 +1,327 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: qes_seqfile.c
+ *
+ * Description: qes_seqfile -- read sequences in FASTA or FASTQ format.
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include "qes_seqfile.h"
+
+
+static inline ssize_t
+read_fastq_seqfile(struct qes_seqfile *seqfile, struct qes_seq *seq)
+{
+ /* Convenience macro, this happens a lot */
+#define CHECK_AND_TRIM(subrec) if (len < 1) { \
+ goto error; \
+ } else { \
+ subrec.str[--len] = '\0'; \
+ subrec.len = len; \
+ }
+ ssize_t len = 0;
+ int next = '\0';
+ int errcode = -1;
+
+ /* Fast-forward past the delimiter '@', ensuring it exists */
+ next = qes_file_getc(seqfile->qf);
+ if (next == EOF) {
+ return EOF;
+ } else if (next != FASTQ_DELIM) {
+ /* This ain't a fastq! WTF! */
+ errcode = -3;
+ goto error;
+ }
+ len = qes_file_readline_str(seqfile->qf, &seqfile->scratch);
+ if (len < 1) {
+ /* Weird truncated file */
+ errcode = -3;
+ goto error;
+ }
+ qes_seq_fill_header(seq, seqfile->scratch.str, seqfile->scratch.len);
+ /* Fill the actual sequence directly */
+ len = qes_file_readline_str(seqfile->qf, &seq->seq);
+ errcode = -4;
+ CHECK_AND_TRIM(seq->seq)
+ /* read the qual header, but don't store it. */
+ errcode = -5;
+ next = qes_file_getc(seqfile->qf);
+ if (next != FASTQ_QUAL_DELIM) {
+ goto error;
+ }
+ while ((next = qes_file_getc(seqfile->qf)) != '\n') {
+ if (next == EOF) {
+ goto error;
+ }
+ }
+ if (next != '\n') goto error;
+ /* Fill the qual score string directly */
+ len = qes_file_readline_str(seqfile->qf, &seq->qual);
+ errcode = -6;
+ CHECK_AND_TRIM(seq->qual)
+ if ((size_t)len != seq->seq.len) {
+ /* Error out on different len qual/seq entries */
+ errcode = -7;
+ goto error;
+ }
+ /* return seq/qual len */
+ seqfile->n_records++;
+ return seq->seq.len;
+error:
+ qes_str_nullify(&seq->name);
+ qes_str_nullify(&seq->comment);
+ qes_str_nullify(&seq->seq);
+ qes_str_nullify(&seq->qual);
+ return errcode;
+#undef CHECK_AND_TRIM
+}
+
+static inline ssize_t
+read_fasta_seqfile(struct qes_seqfile *seqfile, struct qes_seq *seq)
+{
+ /* Convenience macro, this happens a lot */
+#define CHECK_AND_TRIM(subrec) if (len < 1) { \
+ goto error; \
+ } else { \
+ subrec.str[--len] = '\0'; \
+ subrec.len = len; \
+ }
+ ssize_t len = 0;
+ int next = '\0';
+
+ /* This bit is basically a copy-paste from above */
+ /* Fast-forward past the delimiter '>', ensuring it exists */
+ next = qes_file_getc(seqfile->qf);
+ if (next == EOF) {
+ return EOF;
+ } else if (next != FASTA_DELIM) {
+ /* This ain't a fasta! WTF! */
+ goto error;
+ }
+ len = qes_file_readline_str(seqfile->qf, &seqfile->scratch);
+ if (len < 1) {
+ goto error;
+ }
+ qes_seq_fill_header(seq, seqfile->scratch.str, seqfile->scratch.len);
+ /* we need to nullify seq, as we rely on seq.len being 0 as we enter this
+ * while loop */
+ qes_str_nullify(&seq->seq);
+ qes_str_nullify(&seqfile->scratch);
+ /* While the next char is not a '>', i.e. until next header line */
+ while ((next = qes_file_peek(seqfile->qf)) != EOF && next != FASTA_DELIM) {
+ len = qes_file_readline_str(seqfile->qf, &seqfile->scratch);
+ CHECK_AND_TRIM(seqfile->scratch)
+ if (len < 0) {
+ goto error;
+ }
+ qes_str_cat(&seq->seq, &seqfile->scratch);
+ }
+ seq->seq.str[seq->seq.len] = '\0';
+ /* return seq len */
+ seqfile->n_records++;
+ qes_str_nullify(&seq->qual);
+ return seq->seq.len;
+error:
+ qes_str_nullify(&seq->name);
+ qes_str_nullify(&seq->comment);
+ qes_str_nullify(&seq->seq);
+ qes_str_nullify(&seq->qual);
+ return -2;
+#undef CHECK_AND_TRIM
+}
+
+ssize_t
+qes_seqfile_read (struct qes_seqfile *seqfile, struct qes_seq *seq)
+{
+ if (!qes_seqfile_ok(seqfile) || !qes_seq_ok(seq)) {
+ return -2;
+ }
+ if (seqfile->qf->eof) {
+ return EOF;
+ }
+ if (seqfile->format == FASTQ_FMT) {
+ return read_fastq_seqfile(seqfile, seq);
+ } else if (seqfile->format == FASTA_FMT) {
+ return read_fasta_seqfile(seqfile, seq);
+ }
+ /* If we reach here, bail out with an error */
+ qes_str_nullify(&seq->name);
+ qes_str_nullify(&seq->comment);
+ qes_str_nullify(&seq->seq);
+ qes_str_nullify(&seq->qual);
+ return -2;
+}
+
+struct qes_seqfile *
+qes_seqfile_create (const char *path, const char *mode)
+{
+ struct qes_seqfile *sf = NULL;
+ if (path == NULL || mode == NULL) return NULL;
+ sf = qes_calloc(1, sizeof(*sf));
+ sf->qf = qes_file_open(path, mode);
+ if (sf->qf == NULL) {
+ qes_free(sf->qf);
+ qes_free(sf);
+ return NULL;
+ }
+ qes_str_init(&sf->scratch, __INIT_LINE_LEN);
+ sf->n_records = 0;
+ qes_seqfile_guess_format(sf);
+ return sf;
+}
+
+enum qes_seqfile_format
+qes_seqfile_guess_format (struct qes_seqfile *seqfile)
+{
+ int first_char = '\0';
+ if (!qes_seqfile_ok(seqfile)) return UNKNOWN_FMT;
+ if (!qes_file_readable(seqfile->qf)) return UNKNOWN_FMT;
+ first_char = qes_file_peek(seqfile->qf);
+ switch (first_char) {
+ case FASTQ_DELIM:
+ seqfile->format = FASTQ_FMT;
+ return FASTQ_FMT;
+ break;
+ case FASTA_DELIM:
+ seqfile->format = FASTA_FMT;
+ return FASTA_FMT;
+ break;
+ default:
+ seqfile->format = UNKNOWN_FMT;
+ return UNKNOWN_FMT;
+ }
+}
+
+void
+qes_seqfile_set_format (struct qes_seqfile *seqfile,
+ enum qes_seqfile_format format)
+{
+ if (!qes_seqfile_ok(seqfile)) return;
+ seqfile->format = format;
+}
+
+void
+qes_seqfile_destroy_(struct qes_seqfile *seqfile)
+{
+ if (seqfile != NULL) {
+ qes_file_close(seqfile->qf);
+ qes_str_destroy_cp(&seqfile->scratch);
+ qes_free(seqfile);
+ }
+}
+
+size_t
+qes_seqfile_format_seq(const struct qes_seq *seq, enum qes_seqfile_format fmt,
+ char *buffer, size_t maxlen)
+{
+ size_t len = 0;
+ if (buffer == NULL || maxlen < 1) {
+ return 0;
+ }
+ switch (fmt) {
+ case FASTQ_FMT:
+ if (!qes_seq_ok(seq)) {
+ buffer[0] = '\0';
+ return 0;
+ }
+ len = snprintf(buffer, maxlen, "%c%s %s\n%s\n%c\n%s\n",
+ FASTQ_DELIM, seq->name.str, seq->comment.str,
+ seq->seq.str,
+ FASTQ_QUAL_DELIM,
+ seq->qual.str);
+ return len;
+ break;
+ case FASTA_FMT:
+ if (!qes_seq_ok_no_qual(seq)) {
+ buffer[0] = '\0';
+ return 0;
+ }
+ len = snprintf(buffer, maxlen, "%c%s %s\n%s\n",
+ FASTA_DELIM, seq->name.str, seq->comment.str,
+ seq->seq.str);
+ return len;
+ break;
+ case UNKNOWN_FMT:
+ default:
+ return 0;
+ }
+}
+
+
+ssize_t
+qes_seqfile_write (struct qes_seqfile *seqfile, struct qes_seq *seq)
+{
+#define sf_putc_check(c) ret = QES_ZFPUTC(seqfile->qf->fp, c); \
+ if (ret != c) {return -2;} \
+ else {res_len += 1;} \
+ ret = 0
+#define sf_puts_check(s) ret = QES_ZFPUTS(seqfile->qf->fp, s.str); \
+ if (ret < 0) {return -2;} \
+ else {res_len += s.len;} \
+ ret = 0
+
+ int ret = 0;
+ ssize_t res_len = 0;
+
+ if (!qes_seqfile_ok(seqfile) || !qes_seq_ok(seq)) {
+ return -2;
+ }
+ switch (seqfile->format) {
+ case FASTA_FMT:
+ sf_putc_check(FASTA_DELIM);
+ sf_puts_check(seq->name);
+ if (qes_seq_has_comment(seq)) {
+ sf_putc_check(' ');
+ sf_puts_check(seq->comment);
+ }
+ sf_putc_check('\n');
+ sf_puts_check(seq->seq);
+ sf_putc_check('\n');
+ break;
+ case FASTQ_FMT:
+ sf_putc_check(FASTQ_DELIM);
+ sf_puts_check(seq->name);
+ if (qes_seq_has_comment(seq)) {
+ sf_putc_check(' ');
+ sf_puts_check(seq->comment);
+ }
+ sf_putc_check('\n');
+ sf_puts_check(seq->seq);
+ sf_putc_check('\n');
+ if (qes_seq_has_qual(seq)) {
+ sf_putc_check('+');
+ sf_putc_check('\n');
+ sf_puts_check(seq->qual);
+ sf_putc_check('\n');
+
+ }
+ break;
+ case UNKNOWN_FMT:
+ default:
+ return -2;
+ break;
+ }
+ return res_len;
+#undef sf_putc_check
+#undef sf_puts_check
+}
diff --git a/src/libqes/src/qes_seqfile.h b/src/libqes/src/qes_seqfile.h
new file mode 100644
index 0000000..ce69ad0
--- /dev/null
+++ b/src/libqes/src/qes_seqfile.h
@@ -0,0 +1,240 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: qes_seqfile.h
+ *
+ * Description: qes_seqfile -- read sequences in FASTA or FASTQ format.
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#ifndef QES_SEQFILE_H
+#define QES_SEQFILE_H
+
+#include <qes_util.h>
+#include <qes_seq.h>
+#include <qes_file.h>
+
+
+/*--------------------------------------------------------------------------
+ | Seqfile -- seamless reading & writing of FASTA & FASTQ |
+ ---------------------------------------------------------------------------*/
+
+#define FASTA_DELIM '>'
+#define FASTQ_DELIM '@'
+#define FASTQ_QUAL_DELIM '+'
+
+enum qes_seqfile_format {
+ UNKNOWN_FMT = 0,
+ FASTA_FMT = 1,
+ FASTQ_FMT = 2,
+};
+
+struct qes_seqfile {
+ struct qes_file *qf;
+ size_t n_records;
+ enum qes_seqfile_format format;
+ /* A buffer to store misc shit in while reading.
+ One per file to keep it re-entrant */
+ struct qes_str scratch;
+};
+
+
+/*=== FUNCTION ============================================================*
+Name: qes_seqfile_create
+Parameters: const char *path: Path to open.
+ const char *mode: Mode to pass to the fopen equivalent used.
+Description: Allocates structures, initialises values and opens the internal
+ file handle.
+Returns: A fully usable ``struct qes_seqfile *`` or NULL.
+ *===========================================================================*/
+struct qes_seqfile *qes_seqfile_create (const char *path, const char *mode);
+
+
+/*=== FUNCTION ============================================================*
+Name: qes_seqfile_ok
+Parameters: const struct qes_seqfile *file: File reference to check.
+Description: Check a file reference ``file``, ensuring that it may be
+ dereferenced and used. This checks if a buffer has been
+ allocated and buffer pointers set appropriately IFF the file is
+ opened for reading. No guarantees are given about being able to
+ read from the file.
+Returns: An int evaluating to true if ``file`` is OK, otherwise false.
+ *===========================================================================*/
+static inline int
+qes_seqfile_ok(const struct qes_seqfile *file)
+{
+ return (file != NULL && qes_file_ok(file->qf));
+}
+
+
+
+/*=== FUNCTION ============================================================*
+Name: qes_seqfile_guess_format
+Parameters: struct qes_seqfile *file: File whose format we guess.
+Description: Guess, using qes_file_peek, the format of ``file``. This only inspects
+ the first character, so it will be confused if the first
+ character of the file is incorrect. Only use this at the start
+ of a file (this is checked).
+Returns: The file's format as a enum qes_seqfile_format, or UNKNOWN_FMT if the
+ file is not readable, or not a FASTA/FASTQ file.
+ *===========================================================================*/
+enum qes_seqfile_format qes_seqfile_guess_format(struct qes_seqfile *file);
+
+void qes_seqfile_set_format (struct qes_seqfile *file,
+ enum qes_seqfile_format format);
+
+ssize_t qes_seqfile_read (struct qes_seqfile *file, struct qes_seq *seq);
+
+ssize_t qes_seqfile_write (struct qes_seqfile *file, struct qes_seq *seq);
+
+size_t qes_seqfile_format_seq(const struct qes_seq *seq, enum qes_seqfile_format fmt,
+ char *buffer, size_t maxlen);
+
+void qes_seqfile_destroy_(struct qes_seqfile *seqfile);
+#define qes_seqfile_destroy(seqfile) do { \
+ qes_seqfile_destroy_(seqfile); \
+ seqfile = NULL; \
+ } while(0)
+
+#ifdef OPENMP_FOUND
+#define QES_SEQFILE_ITER_PARALLEL_SINGLE_BEGIN(fle, sq, ln, opts) \
+ _Pragma(STRINGIFY(omp parallel shared(fle) opts default(none))) \
+ { \
+ struct qes_seq *sq = qes_seq_create(); \
+ ssize_t ln = 0; \
+ while(1) { \
+ _Pragma(STRINGIFY(omp critical)) \
+ { \
+ ln = qes_seqfile_read(fle, sq); \
+ } \
+ if (ln < 0) { \
+ break; \
+ }
+
+#define QES_SEQFILE_ITER_PARALLEL_SINGLE_END(sq) \
+ } \
+ qes_seq_destroy(sq); \
+ }
+
+#define QES_SEQFILE_ITER_PARALLEL_PAIRED_BEGIN(fle1, fle2, sq1, sq2, ln1, ln2, opts)\
+ _Pragma(STRINGIFY(omp parallel shared(fle1, fle2) opts default(none))) \
+ { \
+ struct qes_seq *sq1 = qes_seq_create(); \
+ struct qes_seq *sq2 = qes_seq_create(); \
+ ssize_t ln1 = 0; \
+ ssize_t ln2 = 0; \
+ while(1) { \
+ _Pragma(STRINGIFY(omp critical)) \
+ { \
+ ln1 = qes_seqfile_read(fle1, sq1); \
+ ln2 = qes_seqfile_read(fle2, sq2); \
+ } \
+ if (ln1 < 0 || ln2 < 0) { \
+ break; \
+ }
+
+#define QES_SEQFILE_ITER_PARALLEL_PAIRED_END(sq1, sq2) \
+ } \
+ qes_seq_destroy(sq1); \
+ qes_seq_destroy(sq2); \
+ }
+
+#define QES_SEQFILE_ITER_PARALLEL_INTERLEAVED_BEGIN(fle, sq1, sq2, ln1, ln2, opts)\
+ _Pragma(STRINGIFY(omp parallel shared(fle) opts default(none))) \
+ { \
+ struct qes_seq *sq1 = qes_seq_create(); \
+ struct qes_seq *sq2 = qes_seq_create(); \
+ ssize_t ln1 = 0; \
+ ssize_t ln2 = 0; \
+ while(1) { \
+ _Pragma(STRINGIFY(omp critical)) \
+ { \
+ ln1 = qes_seqfile_read(fle, sq1); \
+ ln2 = qes_seqfile_read(fle, sq2); \
+ } \
+ if (ln1 < 0 || ln2 < 0) { \
+ break; \
+ }
+
+#define QES_SEQFILE_ITER_PARALLEL_INTERLEAVED_END(sq1, sq2) \
+ } \
+ qes_seq_destroy(sq1); \
+ qes_seq_destroy(sq2); \
+ }
+
+#endif /* OPENMP_FOUND */
+
+#define QES_SEQFILE_ITER_SINGLE_BEGIN(fle, sq, ln) \
+ { \
+ struct qes_seq *sq = qes_seq_create(); \
+ /* TODO MUSTFIX check for null sq */ \
+ ssize_t ln = 0; \
+ while(1) { \
+ ln = qes_seqfile_read(fle, sq); \
+ if (ln < 0) { \
+ break; \
+ }
+
+#define QES_SEQFILE_ITER_SINGLE_END(sq) \
+ } \
+ qes_seq_destroy(sq); \
+ }
+
+#define QES_SEQFILE_ITER_PAIRED_BEGIN(fle1, fle2, sq1, sq2, ln1, ln2) \
+ { \
+ struct qes_seq *sq1 = qes_seq_create(); \
+ struct qes_seq *sq2 = qes_seq_create(); \
+ ssize_t ln1 = 0; \
+ ssize_t ln2 = 0; \
+ while(1) { \
+ ln1 = qes_seqfile_read(fle1, sq1); \
+ ln2 = qes_seqfile_read(fle2, sq2); \
+ if (ln1 < 0 || ln2 < 0) { \
+ break; \
+ }
+
+#define QES_SEQFILE_ITER_PAIRED_END(sq1, sq2) \
+ } \
+ qes_seq_destroy(sq1); \
+ qes_seq_destroy(sq2); \
+ }
+
+#define QES_SEQFILE_ITER_INTERLEAVED_BEGIN(fle, sq1, sq2, ln1, ln2) \
+ { \
+ struct qes_seq *sq1 = qes_seq_create(); \
+ struct qes_seq *sq2 = qes_seq_create(); \
+ ssize_t ln1 = 0; \
+ ssize_t ln2 = 0; \
+ while(1) { \
+ ln1 = qes_seqfile_read(fle, sq1); \
+ ln2 = qes_seqfile_read(fle, sq2); \
+ if (ln1 < 0 || ln2 < 0) { \
+ break; \
+ }
+
+#define QES_SEQFILE_ITER_INTERLEAVED_END(sq1, sq2) \
+ } \
+ qes_seq_destroy(sq1); \
+ qes_seq_destroy(sq2); \
+ }
+
+#endif /* QES_SEQFILE_H */
diff --git a/src/libqes/src/qes_sequtil.c b/src/libqes/src/qes_sequtil.c
new file mode 100644
index 0000000..124d44b
--- /dev/null
+++ b/src/libqes/src/qes_sequtil.c
@@ -0,0 +1,272 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: qes_sequtil.c
+ *
+ * Description: Sequence utility functions
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include "qes_sequtil.h"
+
+
+/*
+ * === FUNCTION =============================================================
+ * Name: qes_sequtil_translate_codon
+ * Description: translate a codon to an amino acid.
+ * ============================================================================
+ */
+
+inline int
+qes_sequtil_translate_codon (const char *codon)
+{
+ if (codon == NULL || strnlen(codon, 4) != 3) {
+ return -1;
+ }
+ if (codon[0] == 'A') {
+ if (codon[1] == 'A') {
+ if (codon[2] == 'A') return 'K';
+ else if (codon[2] == 'C') return 'N';
+ else if (codon[2] == 'G') return 'K';
+ else if (codon[2] == 'T') return 'N';
+ else if (codon[2] == 'U') return 'N';
+ }
+ else if (codon[1] == 'C') {
+ if (codon[2] == 'A') return 'T';
+ else if (codon[2] == 'C') return 'T';
+ else if (codon[2] == 'G') return 'T';
+ else if (codon[2] == 'T') return 'T';
+ else if (codon[2] == 'U') return 'T';
+ }
+ else if (codon[1] == 'G') {
+ if (codon[2] == 'A') return 'R';
+ else if (codon[2] == 'C') return 'S';
+ else if (codon[2] == 'G') return 'R';
+ else if (codon[2] == 'T') return 'S';
+ else if (codon[2] == 'U') return 'S';
+ }
+ else if (codon[1] == 'T') {
+ if (codon[2] == 'A') return 'I';
+ else if (codon[2] == 'C') return 'I';
+ else if (codon[2] == 'G') return 'M';
+ else if (codon[2] == 'T') return 'I';
+ else if (codon[2] == 'U') return 'I';
+ }
+ else if (codon[1] == 'U') {
+ if (codon[2] == 'A') return 'I';
+ else if (codon[2] == 'C') return 'I';
+ else if (codon[2] == 'G') return 'M';
+ else if (codon[2] == 'T') return 'I';
+ else if (codon[2] == 'U') return 'I';
+ }
+ }
+ else if (codon[0] == 'C') {
+ if (codon[1] == 'A') {
+ if (codon[2] == 'A') return 'Q';
+ else if (codon[2] == 'C') return 'H';
+ else if (codon[2] == 'G') return 'Q';
+ else if (codon[2] == 'T') return 'H';
+ else if (codon[2] == 'U') return 'H';
+ }
+ else if (codon[1] == 'C') {
+ if (codon[2] == 'A') return 'P';
+ else if (codon[2] == 'C') return 'P';
+ else if (codon[2] == 'G') return 'P';
+ else if (codon[2] == 'T') return 'P';
+ else if (codon[2] == 'U') return 'P';
+ }
+ else if (codon[1] == 'G') {
+ if (codon[2] == 'A') return 'R';
+ else if (codon[2] == 'C') return 'R';
+ else if (codon[2] == 'G') return 'R';
+ else if (codon[2] == 'T') return 'R';
+ else if (codon[2] == 'U') return 'R';
+ }
+ else if (codon[1] == 'T') {
+ if (codon[2] == 'A') return 'L';
+ else if (codon[2] == 'C') return 'L';
+ else if (codon[2] == 'G') return 'L';
+ else if (codon[2] == 'T') return 'L';
+ else if (codon[2] == 'U') return 'L';
+ }
+ else if (codon[1] == 'U') {
+ if (codon[2] == 'A') return 'L';
+ else if (codon[2] == 'C') return 'L';
+ else if (codon[2] == 'G') return 'L';
+ else if (codon[2] == 'T') return 'L';
+ else if (codon[2] == 'U') return 'L';
+ }
+ }
+ else if (codon[0] == 'G') {
+ if (codon[1] == 'A') {
+ if (codon[2] == 'A') return 'E';
+ else if (codon[2] == 'C') return 'D';
+ else if (codon[2] == 'G') return 'E';
+ else if (codon[2] == 'T') return 'D';
+ else if (codon[2] == 'U') return 'D';
+ }
+ else if (codon[1] == 'C') {
+ if (codon[2] == 'A') return 'A';
+ else if (codon[2] == 'C') return 'A';
+ else if (codon[2] == 'G') return 'A';
+ else if (codon[2] == 'T') return 'A';
+ else if (codon[2] == 'U') return 'A';
+ }
+ else if (codon[1] == 'G') {
+ if (codon[2] == 'A') return 'G';
+ else if (codon[2] == 'C') return 'G';
+ else if (codon[2] == 'G') return 'G';
+ else if (codon[2] == 'T') return 'G';
+ else if (codon[2] == 'U') return 'G';
+ }
+ else if (codon[1] == 'T') {
+ if (codon[2] == 'A') return 'V';
+ else if (codon[2] == 'C') return 'V';
+ else if (codon[2] == 'G') return 'V';
+ else if (codon[2] == 'T') return 'V';
+ else if (codon[2] == 'U') return 'V';
+ }
+ else if (codon[1] == 'U') {
+ if (codon[2] == 'A') return 'V';
+ else if (codon[2] == 'C') return 'V';
+ else if (codon[2] == 'G') return 'V';
+ else if (codon[2] == 'T') return 'V';
+ else if (codon[2] == 'U') return 'V';
+ }
+ }
+ else if (codon[0] == 'T') {
+ if (codon[1] == 'A') {
+ if (codon[2] == 'A') return '*';
+ else if (codon[2] == 'C') return 'Y';
+ else if (codon[2] == 'G') return '*';
+ else if (codon[2] == 'T') return 'Y';
+ else if (codon[2] == 'U') return 'Y';
+ }
+ else if (codon[1] == 'C') {
+ if (codon[2] == 'A') return 'S';
+ else if (codon[2] == 'C') return 'S';
+ else if (codon[2] == 'G') return 'S';
+ else if (codon[2] == 'T') return 'S';
+ else if (codon[2] == 'U') return 'S';
+ }
+ else if (codon[1] == 'G') {
+ if (codon[2] == 'A') return '*';
+ else if (codon[2] == 'C') return 'C';
+ else if (codon[2] == 'G') return 'W';
+ else if (codon[2] == 'T') return 'C';
+ else if (codon[2] == 'U') return 'C';
+ }
+ else if (codon[1] == 'T') {
+ if (codon[2] == 'A') return 'L';
+ else if (codon[2] == 'C') return 'F';
+ else if (codon[2] == 'G') return 'L';
+ else if (codon[2] == 'T') return 'F';
+ else if (codon[2] == 'U') return 'F';
+ }
+ else if (codon[1] == 'U') {
+ if (codon[2] == 'A') return 'L';
+ else if (codon[2] == 'C') return 'F';
+ else if (codon[2] == 'G') return 'L';
+ else if (codon[2] == 'T') return 'F';
+ else if (codon[2] == 'U') return 'F';
+ }
+ }
+ else if (codon[0] == 'U') {
+ if (codon[1] == 'A') {
+ if (codon[2] == 'A') return '*';
+ else if (codon[2] == 'C') return 'Y';
+ else if (codon[2] == 'G') return '*';
+ else if (codon[2] == 'T') return 'Y';
+ else if (codon[2] == 'U') return 'Y';
+ }
+ else if (codon[1] == 'C') {
+ if (codon[2] == 'A') return 'S';
+ else if (codon[2] == 'C') return 'S';
+ else if (codon[2] == 'G') return 'S';
+ else if (codon[2] == 'T') return 'S';
+ else if (codon[2] == 'U') return 'S';
+ }
+ else if (codon[1] == 'G') {
+ if (codon[2] == 'A') return '*';
+ else if (codon[2] == 'C') return 'C';
+ else if (codon[2] == 'G') return 'W';
+ else if (codon[2] == 'T') return 'C';
+ else if (codon[2] == 'U') return 'C';
+ }
+ else if (codon[1] == 'T') {
+ if (codon[2] == 'A') return 'L';
+ else if (codon[2] == 'C') return 'F';
+ else if (codon[2] == 'G') return 'L';
+ else if (codon[2] == 'T') return 'F';
+ else if (codon[2] == 'U') return 'F';
+ }
+ else if (codon[1] == 'U') {
+ if (codon[2] == 'A') return 'L';
+ else if (codon[2] == 'C') return 'F';
+ else if (codon[2] == 'G') return 'L';
+ else if (codon[2] == 'T') return 'F';
+ else if (codon[2] == 'U') return 'F';
+ }
+ }
+ return 'X';
+}
+
+
+inline char *
+qes_sequtil_revcomp (const char *seq, size_t len)
+{
+ size_t seqlen = strlen(seq);
+ char *outseq = strdup(seq);
+ seqlen = seqlen < len ? seqlen : len - 1;
+
+ if (outseq[seqlen - 1] == '\n') {
+ outseq[seqlen - 1] = '\0';
+ seqlen--;
+ }
+
+ qes_sequtil_revcomp_inplace(outseq, len);
+ return outseq;
+}
+
+inline void
+qes_sequtil_revcomp_inplace (char *seq, size_t len)
+{
+ size_t iii;
+ /* Trim trailing whitespace */
+ while (len > 0 && isspace(seq[len - 1])) {
+ seq[--len] = '\0';
+ }
+ for (iii = 0; iii < len && seq[iii] != '\0'; iii++) {
+ size_t endpos = len - iii - 1;
+ char endchar = seq[endpos];
+ if (seq[iii] == 'a' || seq[iii] == 'A') seq[endpos] = 'T';
+ else if (seq[iii] == 'c' || seq[iii] == 'C') seq[endpos] = 'G';
+ else if (seq[iii] == 'g' || seq[iii] == 'G') seq[endpos] = 'C';
+ else if (seq[iii] == 't' || seq[iii] == 'T') seq[endpos] = 'A';
+ else seq[endpos] = 'N';
+ if (endchar == 'a' || endchar == 'A') seq[iii] = 'T';
+ else if (endchar == 'c' || endchar == 'C') seq[iii] = 'G';
+ else if (endchar == 'g' || endchar == 'G') seq[iii] = 'C';
+ else if (endchar == 't' || endchar == 'T') seq[iii] = 'A';
+ else seq[iii] = 'N';
+ }
+}
diff --git a/src/libqes/src/qes_sequtil.h b/src/libqes/src/qes_sequtil.h
new file mode 100644
index 0000000..f3369b9
--- /dev/null
+++ b/src/libqes/src/qes_sequtil.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: qes_sequtil.h
+ *
+ * Description: Sequence utility functions
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#ifndef QES_SEQUTIL_H
+#define QES_SEQUTIL_H
+
+#include <qes_util.h>
+
+
+extern int qes_sequtil_translate_codon(const char *codon);
+extern char *qes_sequtil_revcomp(const char *seq, size_t len);
+extern void qes_sequtil_revcomp_inplace(char *seq, size_t len);
+
+#endif /* QES_SEQUTIL_H */
diff --git a/src/libqes/src/qes_str.c b/src/libqes/src/qes_str.c
new file mode 100644
index 0000000..6f173a1
--- /dev/null
+++ b/src/libqes/src/qes_str.c
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: qes_str.c
+ *
+ * Description: String handling functions
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include "qes_str.h"
+
+
+void
+qes_str_print (const struct qes_str *str, FILE *stream)
+{
+ if (qes_str_ok(str)) {
+ fwrite(str->str, 1, str->len, stream);
+ }
+}
+
+void
+qes_str_destroy_cp (struct qes_str *str)
+{
+ if (str != NULL) qes_free(str->str);
+}
+
+void
+qes_str_destroy (struct qes_str *str)
+{
+ qes_str_destroy_cp(str);
+ qes_free(str);
+}
+
diff --git a/src/libqes/src/qes_str.h b/src/libqes/src/qes_str.h
new file mode 100644
index 0000000..79fed96
--- /dev/null
+++ b/src/libqes/src/qes_str.h
@@ -0,0 +1,184 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: qes_str.h
+ *
+ * Description: String handling functions
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#ifndef QES_STR_H
+#define QES_STR_H
+
+#include <qes_util.h>
+
+struct qes_str {
+ char *str;
+ size_t len;
+ size_t capacity;
+};
+
+
+/*=== FUNCTION ============================================================*
+Name: qes_str_ok
+Parameters: const struct qes_str *str: `struct qes_str` ref to check.
+Description: Checks if a string is OK to use, i.e. checks that `str->str` is
+ a valid `char` array.
+Returns: An `int` that evaluates to true or false.
+ *===========================================================================*/
+static inline int
+qes_str_ok (const struct qes_str *str)
+{
+ return str != NULL && str->str != NULL && str->capacity > 0;
+}
+
+/*=== FUNCTION ============================================================*
+Name: qes_str_init
+Parameters: struct qes_str *str: String to initialise (normally on the
+ stack).
+ size_t len: Initial capacity of `struct qes_str`.
+Description: Initialise a `struct qes_str` (typically on the stack) with
+ room for `len` characters.
+Returns: void
+ *===========================================================================*/
+static inline void
+qes_str_init (struct qes_str *str, size_t capacity)
+{
+ if (str == NULL) return;
+ str->len = 0;
+ str->str = qes_calloc(capacity, sizeof(*str->str));
+ str->capacity = capacity;
+}
+
+/*=== FUNCTION ============================================================*
+Name: qes_str_create
+Parameters: size_t len: Initial capacity of `struct qes_str`.
+Description: Create a `struct qes_str` on the heap with room for `len`
+ characters.
+Returns: `struct qes_str *` Pointer to a memory address.
+ *===========================================================================*/
+static inline struct qes_str *
+qes_str_create (size_t capacity)
+{
+ struct qes_str *str = qes_calloc(1, sizeof(*str));
+
+ /* We don't worry about NULL here. qes_str_init will return before
+ * derefencing and we'll return NULL below. */
+ qes_str_init(str, capacity);
+ return str;
+}
+
+static inline int
+qes_str_resize (struct qes_str *str, size_t len)
+{
+ if (str == NULL) return 0;
+ if (str->capacity < len + 1) {
+ while (str->capacity < len + 1) {
+ str->capacity = qes_roundupz(str->capacity);
+ }
+ str->str = qes_realloc(str->str, str->capacity * sizeof(*str->str));
+ }
+ return 1;
+}
+
+static inline int
+qes_str_fill_charptr (struct qes_str *str, const char *cp, size_t len)
+{
+ if (str == NULL || cp == NULL) return 0;
+ if (len == 0) {
+ len = strlen(cp);
+ }
+ qes_str_resize(str, len);
+ memcpy(str->str, cp, len);
+ str->str[len] = '\0';
+ str->len = len;
+ return 1;
+}
+
+/*=== FUNCTION ============================================================*
+Name: qes_str_nullify
+Parameters: struct qes_str *str: `struct qes_str` to nullify.
+Description: Invalidates a `struct qes_str` without freeing the `char []`.
+Returns: int: 0 on success, otherwise 1.
+ *===========================================================================*/
+static inline int
+qes_str_nullify (struct qes_str *str)
+{
+ if (!qes_str_ok(str)) return 1;
+ str->str[0] = '\0';
+ str->len = 0;
+ return 0;
+}
+
+static inline int
+qes_str_copy (struct qes_str *dest, const struct qes_str *src)
+{
+ if (!qes_str_ok(src) || dest == NULL) return 1;
+ if (!qes_str_ok(dest)) qes_str_init(dest, src->capacity);
+ else qes_str_resize(dest, src->capacity);
+ memcpy(dest->str, src->str, src->capacity);
+ return 0;
+}
+
+static inline int
+qes_str_cat (struct qes_str *dest, const struct qes_str *src)
+{
+ if (!qes_str_ok(src) || dest == NULL) return 1;
+ if (!qes_str_ok(dest)) qes_str_init(dest, src->capacity);
+ else qes_str_resize(dest, dest->len + src->len);
+
+ memcpy(dest->str + dest->len, src->str, src->len);
+ dest->len += src->len;
+ dest->str[dest->len] = '\0';
+ return 0;
+}
+
+static inline int
+qes_str_truncate (struct qes_str *str, const size_t at)
+{
+ if (!qes_str_ok(str)) return 1;
+ if (at >= str->len) return 0;
+ str->str[at] = '\0';
+ str->len = at;
+ return 0;
+}
+
+extern void qes_str_print (const struct qes_str *str, FILE *stream);
+
+/*=== FUNCTION ============================================================*
+Name: qes_str_destroy
+Parameters: struct qes_str *: `struct qes_str` to destroy.
+Description: Frees `str->str` and the struct qes_str struct itself.
+Returns: void
+ *===========================================================================*/
+extern void qes_str_destroy (struct qes_str *str);
+
+/*=== FUNCTION ============================================================*
+Name: qes_str_destroy_cp
+Parameters: struct qes_str *: String to destrop
+Description: Frees `str->str` without freeing the struct qes_str struct
+ itself. For use on `struct qes_str`s allocated on the stack.
+Returns: void
+ *===========================================================================*/
+extern void qes_str_destroy_cp (struct qes_str *str);
+
+#endif /* QES_STR_H */
diff --git a/src/libqes/src/qes_util.c b/src/libqes/src/qes_util.c
new file mode 100644
index 0000000..1586fac
--- /dev/null
+++ b/src/libqes/src/qes_util.c
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: qes_util.c
+ *
+ * Description: Wrappers around std library functions
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include "qes_util.h"
+
+
+/* Pull LIBQES_VERSION in from qes_config.h */
+const char *libqes_version = LIBQES_VERSION;
+
+/* Valid non-function to pass to libqes functions */
+void
+errnil (QES_ERRFN_ARGS)
+{
+ (void) (msg);
+ (void) (file);
+ (void) (line);
+}
+
+/* Function to pass to libqes functions which prints out errors to stderr */
+void
+errprint (QES_ERRFN_ARGS)
+{
+ char msg_fmt[1<<8] = "";
+ va_list args;
+ if (msg == NULL) {
+ msg = "GENERIC ERROR WITH NO MESSAGE";
+ }
+ va_start (args, line);
+ vsnprintf(msg_fmt, 1<<8, msg, args);
+ va_end (args);
+ fprintf(stderr, "[%s: %d]: %s\n", file, line, msg_fmt);
+}
+
+/* Function to pass to libqes functions which prints out errors to stderr and
+ calls `exit(EXIT_FAILURE)` */
+void
+errprintexit (QES_ERRFN_ARGS)
+{
+ char msg_fmt[1<<8] = "";
+ va_list args;
+ if (msg == NULL) {
+ msg = "GENERIC ERROR WITH NO MESSAGE";
+ }
+ va_start (args, line);
+ vsnprintf(msg_fmt, 1<<8, msg, args);
+ va_end (args);
+ fprintf(stderr, "[%s: %d]: %s\n", file, line, msg_fmt);
+ QES_EXIT_FN(EXIT_FAILURE);
+}
+
diff --git a/src/libqes/src/qes_util.h b/src/libqes/src/qes_util.h
new file mode 100644
index 0000000..8e01ce1
--- /dev/null
+++ b/src/libqes/src/qes_util.h
@@ -0,0 +1,250 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ ============================================================================
+ *
+ * Filename: qes_util.h
+ *
+ * Description: Wrappers around std library functions
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#ifndef QES_UTIL_H
+#define QES_UTIL_H
+
+
+/* ##### HEADER FILE INCLUDES ########################################## */
+#include <ctype.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include "qes_config.h"
+
+
+/*
+ * Cross-platform bollocks. Thanks windows.
+ */
+
+#if defined(WIN32) || defined(_WIN32)
+#include <windows.h>
+#define QES_PATHSEP "\\"
+#else
+#define QES_PATHSEP "/"
+#include <unistd.h>
+#endif
+
+/*
+ * Misc constants
+ */
+
+extern const char *libqes_version;
+
+#define QES_MAX_FN_LEN (1<<16)
+/* Size of buffers for file IO */
+#define QES_FILEBUFFER_LEN (16384)
+/* Starting point for allocing a char pointer. Set to slightly larger than the
+ standard size of whatever you're reading in. */
+#define __INIT_LINE_LEN (128)
+
+/*
+ * Macro helpers from tor
+ */
+
+/* Expands to a syntactically valid empty statement. */
+#define STMT_NIL (void)0
+
+/* Expands to a syntactically valid empty statement, explicitly (void)ing its
+ * argument. */
+#define STMT_VOID(a) while (0) { (void)(a); }
+
+/* STMT_BEGIN and STMT_END are used to wrap blocks inside macros so that
+ * the macro can be used as if it were a single C statement. */
+#ifdef __GNUC__
+ #define STMT_BEGIN (void) __extension__ ({
+ #define STMT_END })
+#elif defined(sun) || defined(__sun__)
+ #define STMT_BEGIN if (1) {
+ #define STMT_END } else STMT_NIL
+#else
+ #define STMT_BEGIN do {
+ #define STMT_END } while (0)
+#endif
+
+/* This can be helpful in some macros, particularly with #pragma */
+#ifndef STRINGIFY
+ #define STRINGIFY(a) #a
+#endif
+
+/*
+ * Error handling functions
+ */
+
+/* use the stdlib exit function by default, during testing we can #define this
+ * to some kind of error handler if we need to. */
+#ifndef QES_EXIT_FN
+ #define QES_EXIT_FN exit
+#endif
+
+
+/* By default, we use this error handler. At compile or include time, we can
+ * chose another more appropriate one if we need to. */
+#ifndef QES_DEFAULT_ERR_FN
+ #define QES_DEFAULT_ERR_FN errprintexit
+#endif
+
+
+#define QES_ERRFN_ARGS const char *msg, const char *file, int line, ...
+void errnil(QES_ERRFN_ARGS);
+void errprint (QES_ERRFN_ARGS);
+void errprintexit (QES_ERRFN_ARGS) __attribute__ ((noreturn));
+typedef void (*qes_errhandler_func) (const char*, const char *, int, ...);
+
+/* qes_roundupz:
+ * Round up a `size_t` to the next highest power of two.
+ */
+/* Flogged from http://stackoverflow.com/a/1322548 and
+ http://graphics.stanford.edu/~seander/bithacks.html, and kseq.h */
+static inline size_t
+qes_roundupz (size_t sz)
+{
+ /* Decrement v only if v is not already a power of 2 */
+ /* I.e, roundup things already a power of 2 */
+ if ((sz & (sz - 1)) != 0) sz--;
+ /* mask all bits below MSB to 1 */
+ sz |= sz>>1;
+ sz |= sz>>2;
+ sz |= sz>>4;
+ sz |= sz>>8;
+ sz |= sz>>16;
+#if UINTPTR_MAX == 0xffffffffffffffff /* 64-bit system */
+ sz |= sz>>32;
+#endif
+ return sz + 1;
+}
+
+static inline uint32_t
+qes_roundup32 (uint32_t u32)
+{
+ /* Roundup things already a power of 2 */
+ if ((u32 & (u32 - 1)) != 0) u32--;
+ /* mask all bits below MSB to 1 */
+ u32 |= u32>>1;
+ u32 |= u32>>2;
+ u32 |= u32>>4;
+ u32 |= u32>>8;
+ u32 |= u32>>16;
+ return u32 + 1;
+}
+
+static inline uint64_t
+qes_roundup64 (uint64_t u64)
+{
+ /* Roundup things already a power of 2 */
+ if ((u64 & (u64 - 1)) != 0) u64--;
+ /* mask all bits below MSB to 1 */
+ u64 |= u64>>1;
+ u64 |= u64>>2;
+ u64 |= u64>>4;
+ u64 |= u64>>8;
+ u64 |= u64>>16;
+ u64 |= u64>>32;
+ return u64 + 1;
+}
+
+
+/* INLINE FUNCTIONS */
+
+/* Memory allocation/deallocation */
+static inline void *
+qes_calloc_ (size_t n, size_t size, qes_errhandler_func onerr, const char *file,
+ int line)
+{
+ void *ret = calloc(n, size);
+ if (ret == NULL) {
+ (*onerr)("calloc returned NULL -- Out of memory", file, line);
+ return NULL;
+ } else {
+ return ret;
+ }
+}
+#define qes_calloc(n, sz) \
+ qes_calloc_(n, sz, QES_DEFAULT_ERR_FN, __FILE__, __LINE__)
+#define qes_calloc_errnil(n, sz) \
+ qes_calloc_(n, sz, errnil, __FILE__, __LINE__)
+#define qes_calloc_errprint(n, sz) \
+ qes_calloc_(n, sz, errprint, __FILE__, __LINE__)
+#define qes_calloc_errprintexit(n, sz) \
+ qes_calloc_(n, sz, errprintexit, __FILE__, __LINE__)
+
+static inline void *
+qes_malloc_ (size_t size, qes_errhandler_func onerr, const char *file, int line)
+{
+ void *ret = malloc(size);
+ if (ret == NULL) {
+ (*onerr)("malloc returned NULL -- Out of memory", file, line);
+ return NULL;
+ } else {
+ return ret;
+ }
+}
+#define qes_malloc(sz) \
+ qes_malloc_(sz, QES_DEFAULT_ERR_FN, __FILE__, __LINE__)
+#define qes_malloc_errnil(sz) \
+ qes_malloc_(sz, errnil, __FILE__, __LINE__)
+#define qes_malloc_errprint(sz) \
+ qes_malloc_(sz, errprint, __FILE__, __LINE__)
+#define qes_malloc_errprintexit(sz) \
+ qes_malloc_(sz, errprintexit, __FILE__, __LINE__)
+
+static inline void *
+qes_realloc_ (void *data, size_t size, qes_errhandler_func onerr, const char *file,
+ int line)
+{
+ void *ret = realloc(data, size);
+ if (ret == NULL) {
+ (*onerr)("realloc returned NULL -- Out of memory", file, line);
+ return NULL;
+ } else {
+ return ret;
+ }
+}
+
+#define qes_realloc(ptr, sz) \
+ qes_realloc_(ptr, sz, QES_DEFAULT_ERR_FN, __FILE__, __LINE__)
+#define qes_realloc_errnil(ptr, sz) \
+ qes_realloc_(ptr, sz, errnil, __FILE__, __LINE__)
+#define qes_realloc_errprint(ptr, sz) \
+ qes_realloc_(ptr, sz, errprint, __FILE__, __LINE__)
+#define qes_realloc_errprintexit(ptr, sz) \
+ qes_realloc_(ptr, sz, errprintexit, __FILE__, __LINE__)
+#define qes_free(data) \
+ STMT_BEGIN \
+ if (data != NULL) { \
+ free(data); \
+ data = NULL; \
+ } \
+ STMT_END
+
+#endif /* QES_UTIL_H */
diff --git a/src/libqes/test/CMakeLists.txt b/src/libqes/test/CMakeLists.txt
new file mode 100644
index 0000000..845853d
--- /dev/null
+++ b/src/libqes/test/CMakeLists.txt
@@ -0,0 +1,45 @@
+## Compile tests, & set up coverage
+SET(COMMON_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/helpers.c)
+FILE(GLOB TEST_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/test*.c)
+SET(TEST_SRCS ${COMMON_SRCS} ${TEST_SRCS} ${CMAKE_CURRENT_SOURCE_DIR}/tinytest/tinytest.c)
+ADD_EXECUTABLE(test_libqes ${TEST_SRCS})
+TARGET_LINK_LIBRARIES(test_libqes qes ${LIBQES_DEPENDS_LIBS})
+IF (CMAKE_BUILD_TYPE STREQUAL "Coverage")
+ SETUP_TARGET_FOR_COVERAGE(coverage test_libqes coverage src)
+ENDIF()
+ADD_TEST(NAME run_test_libqes
+ COMMAND ${CMAKE_BINARY_DIR}/bin/test_libqes ${CMAKE_BINARY_DIR})
+
+ADD_EXECUTABLE(qes_seqcat ${CMAKE_CURRENT_SOURCE_DIR}/qes_seqcat.c)
+TARGET_LINK_LIBRARIES(qes_seqcat qes ${LIBQES_DEPENDS_LIBS})
+
+ADD_EXECUTABLE(qes_seqprint ${CMAKE_CURRENT_SOURCE_DIR}/qes_seqprint.c)
+TARGET_LINK_LIBRARIES(qes_seqprint qes ${LIBQES_DEPENDS_LIBS})
+
+ADD_EXECUTABLE(kseqcat ${CMAKE_CURRENT_SOURCE_DIR}/kseqcat.c)
+TARGET_LINK_LIBRARIES(kseqcat qes ${LIBQES_DEPENDS_LIBS})
+
+# Demos
+ADD_EXECUTABLE(log_demo ${CMAKE_CURRENT_SOURCE_DIR}/logdemo.c)
+TARGET_LINK_LIBRARIES(log_demo qes ${LIBQES_DEPENDS_LIBS})
+ADD_TEST(NAME run_log_demo
+ COMMAND ${CMAKE_BINARY_DIR}/bin/log_demo)
+
+# Benchmarking:
+ADD_EXECUTABLE(bench_libqes ${CMAKE_CURRENT_SOURCE_DIR}/benchmarks.c ${COMMON_SRCS})
+TARGET_LINK_LIBRARIES(bench_libqes qes ${LIBQES_DEPENDS_LIBS})
+ADD_TEST(NAME run_bench_libqes
+ COMMAND ${CMAKE_BINARY_DIR}/bin/bench_libqes
+ ${CMAKE_BINARY_DIR}/data/test.fastq
+ 50
+ qes_seqfile_write
+ kseq_parse_fq
+ gnu_getline
+ qes_seqfile_parse_fq
+ qes_file_readline_realloc)
+
+# Copy test files over to bin dir
+ADD_CUSTOM_COMMAND(TARGET test_libqes
+ COMMAND ${CMAKE_COMMAND} -E copy_directory
+ ${CMAKE_CURRENT_SOURCE_DIR}/data
+ ${CMAKE_BINARY_DIR}/data)
diff --git a/src/libqes/test/benchmarks.c b/src/libqes/test/benchmarks.c
new file mode 100644
index 0000000..ec36dc3
--- /dev/null
+++ b/src/libqes/test/benchmarks.c
@@ -0,0 +1,311 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: benchmarks.c
+ *
+ * Description: Some benchmarks
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+#include <time.h>
+#include <stdlib.h>
+#include <qes_file.h>
+#include <qes_seqfile.h>
+#ifdef ZLIB_FOUND
+# include <zlib.h>
+#else
+# include <sys/stat.h>
+# include <fcntl.h>
+#endif
+
+#include "helpers.h"
+#include "kseq.h"
+
+
+void bench_qes_file_readline_realloc_file(int silent);
+void bench_qes_file_readline_file(int silent);
+#ifdef GELINE_FOUND
+void bench_gnu_getline_file(int silent);
+#endif
+void bench_qes_seqfile_parse_fq(int silent);
+void bench_kseq_parse_fq(int silent);
+void bench_qes_seqfile_write(int silent);
+#ifdef OPENMP_FOUND
+void bench_qes_seqfile_par_iter_fq_macro(int silent);
+#endif
+
+
+#ifdef ZLIB_FOUND
+KSEQ_INIT(gzFile, gzread)
+#else
+KSEQ_INIT(int, read)
+#endif
+
+static char *infile;
+
+typedef struct __bench {
+ const char *name;
+ void (*fn)(int silent);
+} bench_t;
+
+void
+bench_qes_file_readline_realloc_file(int silent)
+{
+ size_t bsz = 1<<4;
+ char *buf = malloc(bsz);
+ ssize_t len = 0;
+ off_t flen = 0;
+ struct qes_file *file = qes_file_open(infile, "r");
+
+ assert(buf != NULL);
+ while ((len = qes_file_readline_realloc(file, &buf, &bsz)) != EOF) {
+ flen += len;
+ }
+ if (!silent)
+ printf("[qes_file_readline_realloc]\tFile of %lu chars\n",
+ (long unsigned)flen);
+ qes_file_close(file);
+ free(buf);
+}
+
+void
+bench_qes_file_readline_file(int silent)
+{
+ size_t bsz = 1<<10;
+ char buf[bsz];
+ ssize_t len = 0;
+ off_t flen = 0;
+
+ struct qes_file *file = qes_file_open(infile, "r");
+ while ((len = qes_file_readline(file, buf, bsz)) != EOF) {
+ flen += len;
+ }
+ if (!silent)
+ printf("[qes_file_readline]\t\tFile of %lu chars\n",
+ (long unsigned)flen);
+ qes_file_close(file);
+}
+
+#ifdef GELINE_FOUND
+void
+bench_gnu_getline_file(int silent)
+{
+ size_t bsz = 1<<4;
+ char *buf = malloc(bsz);
+ ssize_t len = 0;
+ off_t flen = 0;
+ FILE *file = fopen(infile, "r");
+
+ assert(buf != NULL);
+ while ((len = getline(&buf, &bsz, file)) != EOF) {
+ flen += len;
+ }
+ if (!silent)
+ printf("[getline]\t\tFile of %lu chars\n",
+ (long unsigned)flen);
+ fclose(file);
+ free(buf);
+}
+#endif
+
+
+#ifdef OPENMP_FOUND
+void
+bench_qes_seqfile_par_iter_fq_macro(int silent)
+{
+ struct qes_seqfile *sf = qes_seqfile_create(infile, "r");
+ size_t total_len = 0;
+
+ QES_SEQFILE_ITER_PARALLEL_SINGLE_BEGIN(sf, seq, seq_len, shared(total_len))
+ #pragma omp critical
+ {
+ total_len += seq->seq.len;
+ }
+ QES_SEQFILE_ITER_PARALLEL_SINGLE_END(seq)
+
+ if (!silent) {
+ printf("[qes_seqfile_iter_fq_macro] Total seq len %lu\n",
+ (long unsigned)total_len);
+ }
+ qes_seqfile_destroy(sf);
+}
+#endif
+
+void
+bench_qes_seqfile_parse_fq(int silent)
+{
+ struct qes_seq *seq = qes_seq_create();
+ struct qes_seqfile *sf = qes_seqfile_create(infile, "r");
+ ssize_t res = 0;
+ size_t n_recs = 0;
+ size_t seq_len = 0;
+
+ while (res != EOF) {
+ res = qes_seqfile_read(sf, seq);
+ if (res < 1) {
+ break;
+ }
+ seq_len += res;
+ n_recs++;
+ }
+ if (!silent) {
+ printf("[qes_seqfile_fq] Total seq len %lu\n",
+ (long unsigned)seq_len);
+ }
+ qes_seqfile_destroy(sf);
+ qes_seq_destroy(seq);
+}
+
+void
+bench_kseq_parse_fq(int silent)
+{
+#ifdef ZLIB_FOUND
+ gzFile fp = gzopen(infile, "r");
+#else
+ int fp = open(infile, O_RDONLY);
+#endif
+ kseq_t *seq = kseq_init(fp);
+ ssize_t res = 0;
+ size_t n_recs = 0;
+ size_t seq_len = 0;
+
+ while ((res = kseq_read(seq)) >= 0) {
+ seq_len += res;
+ n_recs++;
+ }
+ if (!silent) {
+ printf("[kseq_fq] Total seq len %lu\n",
+ (long unsigned) seq_len);
+ }
+ kseq_destroy(seq);
+#ifdef ZLIB_FOUND
+ gzclose(fp);
+#else
+ close(fp);
+#endif
+}
+
+void
+bench_qes_seqfile_write(int silent)
+{
+ struct qes_seq *seq = qes_seq_create();
+ ssize_t res = 0;
+ struct qes_seqfile *sf = NULL;
+ char *fname = tmpnam(NULL);
+ size_t iii = 0;
+
+ /* Make a seq to write */
+ qes_seq_fill_name(seq, "HWI-TEST", 8);
+ qes_seq_fill_comment(seq, "testseq 1 2 3", 13);
+ qes_seq_fill_seq(seq, "ACTCAATT", 8);
+ qes_seq_fill_qual(seq, "IIIIIIII", 8);
+ /* Setup file for writing */
+ sf = qes_seqfile_create(fname, "wT");
+ qes_seqfile_set_format(sf, FASTQ_FMT);
+ for (iii = 0; iii < 1<<11; iii++) {
+ res += qes_seqfile_write(sf, seq);
+ }
+ if (!silent) {
+ printf("[qes_seqfile_write] Total file len %lu to %s\n",
+ (long unsigned)res, fname);
+ }
+ qes_seqfile_destroy(sf);
+ qes_seq_destroy(seq);
+ remove(fname);
+
+}
+
+static const bench_t benchmarks[] = {
+ { "qes_file_readline", &bench_qes_file_readline_file},
+ { "qes_file_readline_realloc", &bench_qes_file_readline_realloc_file},
+#ifdef GELINE_FOUND
+ { "gnu_getline", &bench_gnu_getline_file},
+#endif
+ { "qes_seqfile_parse_fq", &bench_qes_seqfile_parse_fq},
+#ifdef OPENMP_FOUND
+ { "qes_seqfile_par_iter_fq_macro", &bench_qes_seqfile_par_iter_fq_macro},
+#endif
+ { "kseq_parse_fq", &bench_kseq_parse_fq},
+ { "qes_seqfile_write", &bench_qes_seqfile_write},
+ { NULL, NULL}
+};
+
+int
+main (int argc, char *argv[])
+{
+ bench_t thisbench;
+ clock_t start, end;
+ size_t iii = 0;
+ int rnds = 0;
+ size_t nbench = 0;
+
+ if (argc == 1) {
+ fprintf(stderr, "USAGE:\nbench <file> <rounds> <bench> [<bench> ...]\n\n");
+ fprintf(stderr, "\nAvalilable benchmarks are:\n");
+ nbench = 0;
+ while (1) {
+ thisbench = benchmarks[nbench++];
+ if ((thisbench.name && thisbench.fn)) {
+ fprintf(stderr, "%s\n", thisbench.name);
+ } else {
+ return EXIT_FAILURE;
+ }
+ }
+ }
+ if (argc < 4) {
+ fprintf(stderr, "USAGE:\nbench <file> <rounds> <bench> [<bench> ...]\n\n");
+ return EXIT_FAILURE;
+ } else {
+ infile = strdup(argv[1]);
+ rnds = atoi(argv[2]);
+ printf("Beginning benchmarks.\n");
+ printf("---------------------------------------------------------------------\n");
+ }
+ for (iii = 3; iii < (unsigned int) argc; iii++) {
+ nbench = 0;
+ while (1) {
+ thisbench = benchmarks[nbench++];
+ if (!(thisbench.name && thisbench.fn)) {
+ fprintf(stderr, "bad benchmark %s\n", argv[iii]);
+ break;
+ }
+ if (strcmp(argv[iii], thisbench.name) == 0) {
+ int rnd = 0;
+ start = clock();
+ for (rnd = 0; rnd<rnds; rnd++) {
+ (*thisbench.fn)(rnd != rnds - 1);
+ }
+ end = clock();
+ printf("Benchmark %s took %0.6fs per round [%d rounds]\n",
+ thisbench.name,
+ (float)(end - start) / (float)(CLOCKS_PER_SEC * rnds),
+ rnds);
+ printf("---------------------------------------------------------------------\n");
+ break;
+ }
+ }
+ }
+ free(infile);
+ return EXIT_SUCCESS;
+} /* ---------- end of function main ---------- */
diff --git a/src/libqes/test/data/bad_diff_lens.fastq b/src/libqes/test/data/bad_diff_lens.fastq
new file mode 100644
index 0000000..c4dac0f
--- /dev/null
+++ b/src/libqes/test/data/bad_diff_lens.fastq
@@ -0,0 +1,4 @@
+ at HWI-ST960:105:D10GVACXX:2:1101:1151:2158 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAANGACATTGAATCTATATGT
++
+JJJJJIJHIJCC#4ADFFHHHGHJJJJIJJJ
diff --git a/src/libqes/test/data/bad_nohdr.fastq b/src/libqes/test/data/bad_nohdr.fastq
new file mode 100644
index 0000000..8a1eac8
--- /dev/null
+++ b/src/libqes/test/data/bad_nohdr.fastq
@@ -0,0 +1,3 @@
+CACGATCAGATCAANGACATTGAATCTATATGT
++
+JJJJJJJIJHIJCC#4ADFFHHHGHJJJJIJJJ
diff --git a/src/libqes/test/data/bad_noqual.fastq b/src/libqes/test/data/bad_noqual.fastq
new file mode 100644
index 0000000..67d3a81
--- /dev/null
+++ b/src/libqes/test/data/bad_noqual.fastq
@@ -0,0 +1,3 @@
+ at HWI-ST960:105:D10GVACXX:2:1101:1151:2158 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAANGACATTGAATCTATATGT
++
diff --git a/src/libqes/test/data/bad_noqualhdrchr.fastq b/src/libqes/test/data/bad_noqualhdrchr.fastq
new file mode 100644
index 0000000..9f91fe1
--- /dev/null
+++ b/src/libqes/test/data/bad_noqualhdrchr.fastq
@@ -0,0 +1,4 @@
+ at HWI-ST960:105:D10GVACXX:2:1101:1151:2158 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAANGACATTGAATCTATATGT
+
+CACGATCAGATCAANGACATTGAATCTATATGT
diff --git a/src/libqes/test/data/bad_noqualhdreol.fastq b/src/libqes/test/data/bad_noqualhdreol.fastq
new file mode 100644
index 0000000..5aaf3cc
--- /dev/null
+++ b/src/libqes/test/data/bad_noqualhdreol.fastq
@@ -0,0 +1,3 @@
+ at HWI-ST960:105:D10GVACXX:2:1101:1151:2158 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAANGACATTGAATCTATATGT
++HWI-BLERG
\ No newline at end of file
diff --git a/src/libqes/test/data/empty.fastq b/src/libqes/test/data/empty.fastq
new file mode 100644
index 0000000..b516b2c
--- /dev/null
+++ b/src/libqes/test/data/empty.fastq
@@ -0,0 +1 @@
+@
\ No newline at end of file
diff --git a/src/libqes/test/data/empty.txt b/src/libqes/test/data/empty.txt
new file mode 100644
index 0000000..e69de29
diff --git a/src/libqes/test/data/loremipsum.txt b/src/libqes/test/data/loremipsum.txt
new file mode 100644
index 0000000..eaf1478
--- /dev/null
+++ b/src/libqes/test/data/loremipsum.txt
@@ -0,0 +1,11 @@
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec ornare tortor et
+rhoncus iaculis. Sed suscipit, arcu nec elementum vestibulum, tortor tortor
+dictum dui, eu sodales magna orci eu libero. Cras commodo, ligula tempor auctor
+vulputate, eros urna gravida eros, eget congue leo quam quis mi. Curabitur
+luctus augue nibh, eget vehicula augue commodo eget. Donec condimentum molestie
+adipiscing. In non purus lacus. Nam nec mollis mauris. Donec rhoncus, diam sit
+amet rhoncus viverra, lectus risus tincidunt ipsum, in dignissim justo purus
+eget enim. Fusce congue nulla egestas est auctor faucibus. Integer feugiat
+molestie leo, a interdum neque pretium nec. Etiam sit amet nibh leo.
+
+End of lorem ipsum.
diff --git a/src/libqes/test/data/loremipsum.txt.gz b/src/libqes/test/data/loremipsum.txt.gz
new file mode 100644
index 0000000..cb768d6
Binary files /dev/null and b/src/libqes/test/data/loremipsum.txt.gz differ
diff --git a/src/libqes/test/data/nocomment.fasta b/src/libqes/test/data/nocomment.fasta
new file mode 100644
index 0000000..732a2b7
--- /dev/null
+++ b/src/libqes/test/data/nocomment.fasta
@@ -0,0 +1,5 @@
+>HWI-ST960:105:D10GVACXX:2:1101:1122:2186
+CACACTTGAA
+TCCAGTTTAA
+AGTTAACTCA
+TTG
diff --git a/src/libqes/test/data/random.bin b/src/libqes/test/data/random.bin
new file mode 100644
index 0000000..9f95426
Binary files /dev/null and b/src/libqes/test/data/random.bin differ
diff --git a/src/libqes/test/data/test.fasta b/src/libqes/test/data/test.fasta
new file mode 100644
index 0000000..f814857
--- /dev/null
+++ b/src/libqes/test/data/test.fasta
@@ -0,0 +1,4061 @@
+>HWI-ST960:105:D10GVACXX:2:1101:1122:2186 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCAGTTTAA
+AGTTAACTCA
+TTG
+>HWI-ST960:105:D10GVACXX:2:1101:1229:2187 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTGAGTTT
+TTGGACTGTA
+CAT
+>HWI-ST960:105:D10GVACXX:2:1101:1175:2195 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTAATTGT
+CACTGTTTCA
+CCC
+>HWI-ST960:105:D10GVACXX:2:1101:1175:2224 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTGTGACT
+CTGTTCCTGT
+TGT
+>HWI-ST960:105:D10GVACXX:2:1101:1204:2232 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATCACAGA
+GCAGCAGTAT
+TTC
+>HWI-ST960:105:D10GVACXX:2:1101:1237:2239 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTACACAC
+GTATATGCAA
+TAC
+>HWI-ST960:105:D10GVACXX:2:1101:1123:2239 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAATAATGT
+GGTATTAGTC
+TG
+>HWI-ST960:105:D10GVACXX:2:1101:1155:2246 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAGCCACTG
+AACTAAAAAA
+AAA
+>HWI-ST960:105:D10GVACXX:2:1101:1443:2173 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTACCAAAG
+TCTGAATGAT
+TAT
+>HWI-ST960:105:D10GVACXX:2:1101:1360:2176 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCCGGCTCT
+GTCTCTCTCT
+CCC
+>HWI-ST960:105:D10GVACXX:2:1101:1272:2183 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATCATTTA
+GAGGAAGGAG
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:1423:2185 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTATGACGT
+CAAATTATGC
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:1398:2186 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAAAAAAAA
+AAAGAATAAA
+GAA
+>HWI-ST960:105:D10GVACXX:2:1101:1333:2199 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTATTACAA
+AGTTTACATC
+TCT
+>HWI-ST960:105:D10GVACXX:2:1101:1388:2214 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTCGTCT
+TCCATTTCTA
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:1366:2229 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTATGTAT
+ATGCTGTGGT
+AG
+>HWI-ST960:105:D10GVACXX:2:1101:1297:2232 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCATTCATGT
+TGATATATTT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:1374:2245 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTGTGTGT
+CTGAAGTAGT
+TGA
+>HWI-ST960:105:D10GVACXX:2:1101:1277:2249 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATGTTTCA
+GACTTCGAGA
+AGC
+>HWI-ST960:105:D10GVACXX:2:1101:1425:2250 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTATATAC
+TTCACAACTC
+TG
+>HWI-ST960:105:D10GVACXX:2:1101:1601:2174 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGA
+TCTTTTACGT
+AGACGATGTG
+CC
+>HWI-ST960:105:D10GVACXX:2:1101:1581:2174 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCAGTTGAG
+GAACTATTGT
+TTC
+>HWI-ST960:105:D10GVACXX:2:1101:1717:2186 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCAATCTTTG
+TACTGTTGAA
+CAA
+>HWI-ST960:105:D10GVACXX:2:1101:1538:2187 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAACTGTTT
+GTGTCAATCA
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:1687:2195 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTGTCCTTC
+GGATCACTCA
+A
+>HWI-ST960:105:D10GVACXX:2:1101:1589:2195 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTGAGCACA
+AAGATGATCA
+AAC
+>HWI-ST960:105:D10GVACXX:2:1101:1611:2205 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTGAGAGT
+AGCTCTGTTT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:1672:2207 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTATATTTG
+ATACATCGGT
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:1595:2220 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTCTGACT
+GATGAACATA
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:1706:2224 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTGTGCAAT
+TAGTGCAACT
+GA
+>HWI-ST960:105:D10GVACXX:2:1101:1575:2228 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCGTTTGAGA
+CTCTATCTTA
+CCT
+>HWI-ST960:105:D10GVACXX:2:1101:1557:2229 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATTTTTGT
+GTGTACTTGT
+CC
+>HWI-ST960:105:D10GVACXX:2:1101:1747:2233 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTATATACA
+ATTGTGGACT
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:1921:2172 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTTTTAGA
+ACTCTTTTCC
+TA
+>HWI-ST960:105:D10GVACXX:2:1101:1992:2192 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTTGTTGG
+GGTAAAAAAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:1925:2197 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTAAGTGT
+GATTCTTTTG
+G
+>HWI-ST960:105:D10GVACXX:2:1101:1792:2234 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTAAAGTC
+ATGTCTTTGT
+TGT
+>HWI-ST960:105:D10GVACXX:2:1101:1771:2239 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGGTGACCG
+AGAAATGTTT
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:1915:2243 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTCAGTCT
+AACTAAAGTA
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:1899:2246 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCACTAATA
+CAATTGTTGC
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:2049:2181 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTGTTCTTG
+TACTACAGTG
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:2035:2185 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATGTAGAA
+TTCAGAATGT
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:2214:2203 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCTGTACACG
+GCTTAATTTA
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:2244:2217 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCGGTTTGA
+GTGTTGCAAA
+TCT
+>HWI-ST960:105:D10GVACXX:2:1101:2185:2223 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCAACAAGGT
+CGTTGTAGTA
+TAG
+>HWI-ST960:105:D10GVACXX:2:1101:2067:2226 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATTCCATA
+GATTGTAGCC
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:2032:2227 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTTTGTTA
+GTTACGCTTT
+GC
+>HWI-ST960:105:D10GVACXX:2:1101:2011:2230 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTAATAT
+GATATGAAAA
+TCT
+>HWI-ST960:105:D10GVACXX:2:1101:2444:2173 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTTCCTGT
+GATTTGCAAT
+TTC
+>HWI-ST960:105:D10GVACXX:2:1101:2254:2194 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCCATAAAA
+AGTCTCTACA
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:2448:2203 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAGAAGAAA
+AAGATGACCA
+GCT
+>HWI-ST960:105:D10GVACXX:2:1101:2342:2213 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAATGTTCG
+ACTGTGAACC
+TTC
+>HWI-ST960:105:D10GVACXX:2:1101:2268:2215 1:N:0: bcd:RPI3 seq:CACTTAGGCATC
+CACTTAGGCA
+TCAATATCAG
+AACTCGTTAT
+ATT
+>HWI-ST960:105:D10GVACXX:2:1101:2411:2223 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGA
+TCGCAACTGT
+AGCAAGAAGA
+AAC
+>HWI-ST960:105:D10GVACXX:2:1101:2292:2229 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTTTACTT
+AAAGAGCCCT
+AAC
+>HWI-ST960:105:D10GVACXX:2:1101:2448:2233 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATGAGTGT
+AGGCTTACTT
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:2389:2235 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTCGATCT
+GGTTTGTAGA
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:2675:2178 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTAAGTGA
+ACTCTGTGCG
+TCT
+>HWI-ST960:105:D10GVACXX:2:1101:2548:2190 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAATCTTCT
+GTTGACTCAT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:2610:2203 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTAGTAT
+CAATTGAACT
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:2657:2203 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCATATATA
+TATAAATGCA
+GAC
+>HWI-ST960:105:D10GVACXX:2:1101:2576:2213 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATATTTTT
+CCCACTGTGT
+TCT
+>HWI-ST960:105:D10GVACXX:2:1101:2626:2215 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGAGAACTC
+TAGAAACCTG
+CTT
+>HWI-ST960:105:D10GVACXX:2:1101:2660:2219 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTCTACAAT
+GTACTGGAAA
+CTT
+>HWI-ST960:105:D10GVACXX:2:1101:2509:2223 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTCAAACTT
+TATGTAAACT
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:2536:2233 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCATACCAA
+ATAGAATTTC
+TG
+>HWI-ST960:105:D10GVACXX:2:1101:2584:2233 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTGTGCCT
+GGATTAATAT
+GA
+>HWI-ST960:105:D10GVACXX:2:1101:2674:2235 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATGCAACT
+GCAAATTCTG
+CA
+>HWI-ST960:105:D10GVACXX:2:1101:2718:2235 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCACGGAACC
+AGTGACCGTC
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:2630:2245 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTACTTGA
+ACAGGATCTG
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:2869:2185 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCTCCGATG
+ATGATCAAAT
+CAT
+>HWI-ST960:105:D10GVACXX:2:1101:2917:2207 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAAGTCTCG
+CTTATGACTA
+TGA
+>HWI-ST960:105:D10GVACXX:2:1101:2789:2236 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATATTGGT
+CTGTATTGTG
+CTC
+>HWI-ST960:105:D10GVACXX:2:1101:2841:2242 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAAGAACTA
+ACAGATATAT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:3211:2194 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTATGTAAT
+GTAGTCTTTA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:3145:2195 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTGGCTGTG
+GAGTAAAAAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:3082:2195 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCACTGTGTT
+GGCGTTTTAT
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:3160:2208 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCACTTGTTG
+GCCAAAAAAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:3135:2214 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCGACAGGAG
+AGGTGATCGG
+AGT
+>HWI-ST960:105:D10GVACXX:2:1101:3213:2220 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTGTTCTGT
+TGAAGGAGCT
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:3036:2225 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTATATAC
+TTCACAACTC
+TG
+>HWI-ST960:105:D10GVACXX:2:1101:3140:2228 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAGCAAATA
+AGTCAAAACT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:3106:2228 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCTTAGCTCG
+ACCTAACACT
+T
+>HWI-ST960:105:D10GVACXX:2:1101:3085:2237 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCTCATCAAC
+TTTGTCTCTG
+CTT
+>HWI-ST960:105:D10GVACXX:2:1101:3151:2243 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAATTCCAT
+GTACTTACAT
+TCC
+>HWI-ST960:105:D10GVACXX:2:1101:3041:2247 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTGTAATAC
+CTTTTATATA
+TAG
+>HWI-ST960:105:D10GVACXX:2:1101:3218:2248 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAGCCCAAA
+CTGCATGCAC
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:3440:2193 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTTGGATT
+GAAGGGAGCT
+C
+>HWI-ST960:105:D10GVACXX:2:1101:3302:2194 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCAAGTCAT
+GACTCATGAG
+CTA
+>HWI-ST960:105:D10GVACXX:2:1101:3369:2202 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATTGTCAT
+ATTTGCGATG
+TAT
+>HWI-ST960:105:D10GVACXX:2:1101:3257:2202 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTATGTAAA
+CTCTCGTGTG
+GCT
+>HWI-ST960:105:D10GVACXX:2:1101:3285:2210 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTGAGATGC
+AAAACAGTAG
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:3316:2236 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTAAATC
+TTAATCTCAA
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:3597:2170 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTCCCCCG
+TGAGTTACTT
+CAC
+>HWI-ST960:105:D10GVACXX:2:1101:3651:2176 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTATATGTA
+GGCTAAAAAA
+AAA
+>HWI-ST960:105:D10GVACXX:2:1101:3568:2179 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTATTTATG
+TTTTGGACTT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:3545:2181 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATGTGTGT
+TGTGGTTTTT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:3669:2182 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCACTGTGTT
+GGCGTTTTAT
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:3587:2184 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTAAGTGT
+AGAATGCATA
+CAA
+>HWI-ST960:105:D10GVACXX:2:1101:3570:2218 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTGTTGTAT
+GATTGAAGAA
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:3530:2235 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTAACGAAA
+ACTATTTAAA
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:3706:2247 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAAGGCGAG
+TGTATCTCAA
+CAA
+>HWI-ST960:105:D10GVACXX:2:1101:3775:2173 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTACATTA
+AGGCAGTTCA
+TTG
+>HWI-ST960:105:D10GVACXX:2:1101:3902:2188 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTCACAAA
+TGAACTTAAA
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:3885:2192 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTACCTACT
+CGTCGTACAT
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:3807:2204 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCATCTCGG
+ACCAAAGAGA
+GC
+>HWI-ST960:105:D10GVACXX:2:1101:3780:2206 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTGCATGTT
+GTGCACCGGC
+TCC
+>HWI-ST960:105:D10GVACXX:2:1101:3853:2215 1:N:0: bcd:RPI3 seq:CACTTAGGCATC
+CACTTAGGCA
+TCTCCGATGA
+TGATCAAATC
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:3946:2218 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTAGTCT
+TTTGGTATTT
+TA
+>HWI-ST960:105:D10GVACXX:2:1101:3976:2221 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATTGTTCG
+GCTTTGGATT
+AAG
+>HWI-ST960:105:D10GVACXX:2:1101:3866:2227 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAATACGAT
+ATGTATATGT
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:3816:2234 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTAGGTCT
+TGTGTAGAAA
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:3779:2243 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTTTGAGT
+TTCGAGTTAT
+CTG
+>HWI-ST960:105:D10GVACXX:2:1101:3799:2247 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATTCTATC
+TACTACTTTT
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:3759:2247 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAACTAGTA
+TAGTCAGAAA
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:3912:2249 1:N:0: bcd:RPI3 seq:CACTTAGGCATC
+CACTTAGGCA
+TCATGTGAAC
+AAGAACATAT
+CCT
+>HWI-ST960:105:D10GVACXX:2:1101:4099:2173 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCTTGGCTCA
+TGAAGTAAAA
+TAA
+>HWI-ST960:105:D10GVACXX:2:1101:4193:2190 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCACTTTACA
+GCTTCTTCTT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:4045:2192 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCACTGTGTT
+GGCGTTTTAT
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:4171:2195 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGA
+TCGAAGTTGA
+AGAACCTATA
+A
+>HWI-ST960:105:D10GVACXX:2:1101:4159:2232 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCGTATCAAA
+CGTAGAGGCA
+G
+>HWI-ST960:105:D10GVACXX:2:1101:4186:2233 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTTAGTCA
+GCTGCAACAC
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:4072:2235 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTAACACCA
+AACAACTCTT
+TCT
+>HWI-ST960:105:D10GVACXX:2:1101:4053:2236 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTTGGAGG
+TTTGAGATAT
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:4001:2239 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTCAAATGA
+GAACTTTGAA
+GGC
+>HWI-ST960:105:D10GVACXX:2:1101:4487:2169 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAAGCATGT
+AGTTTGATGA
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:4487:2182 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAAATTGTT
+ACGCAACAAA
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:4428:2194 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTAAATAT
+TTTTTCTATT
+CA
+>HWI-ST960:105:D10GVACXX:2:1101:4264:2201 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCACTTAATC
+TGAGTCTCTG
+CTT
+>HWI-ST960:105:D10GVACXX:2:1101:4422:2216 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCACTTTACA
+CGACAAAATA
+A
+>HWI-ST960:105:D10GVACXX:2:1101:4332:2220 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTTCCGA
+GTACAACTTT
+GG
+>HWI-ST960:105:D10GVACXX:2:1101:4424:2238 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTAATCTTG
+TGTCGGCAGG
+TGT
+>HWI-ST960:105:D10GVACXX:2:1101:4369:2249 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCGATAATGA
+TGATGAAAGA
+TG
+>HWI-ST960:105:D10GVACXX:2:1101:4279:2250 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTATGTAG
+AACTCTTTGC
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:4583:2173 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTAGTGA
+AATACACTCT
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:4599:2173 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTGTTATC
+GTGTCTGTAA
+GC
+>HWI-ST960:105:D10GVACXX:2:1101:4699:2181 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTGCCTTC
+AAGTTAACTT
+TGT
+>HWI-ST960:105:D10GVACXX:2:1101:4615:2183 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAGTCTTCT
+TCTTCTGTAT
+TA
+>HWI-ST960:105:D10GVACXX:2:1101:4505:2183 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATCCTATG
+CTTTGGTCAT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:4515:2195 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTACTTAG
+ACTCATGCTT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:4695:2199 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCAATGACTG
+TAACTTACTC
+TTC
+>HWI-ST960:105:D10GVACXX:2:1101:4586:2200 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTATAGGA
+ATCTGTAACT
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:4624:2201 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTATTTGCG
+ATGTATCATG
+TAT
+>HWI-ST960:105:D10GVACXX:2:1101:4717:2204 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTTTGGTT
+TATTTACATG
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:4738:2224 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATAGCTTC
+TCTGTTATGT
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:4745:2243 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTGATAT
+CTAAGCTTAT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:4619:2246 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTCAGATT
+TCTTACATTC
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:4707:2246 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCAGTGTTT
+GTCTGAACTC
+TG
+>HWI-ST960:105:D10GVACXX:2:1101:4754:2182 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATCGTCGT
+CAAGCCTGCC
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:4768:2182 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAAACTTCT
+CTGTTTAGTT
+TGT
+>HWI-ST960:105:D10GVACXX:2:1101:4842:2184 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTAATCAT
+TATAGAGATG
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:4964:2184 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCAAGTCAT
+GACTCATGAG
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:4787:2188 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAACAAACT
+TGCATGTCGG
+CAC
+>HWI-ST960:105:D10GVACXX:2:1101:4867:2194 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTCTTCTTT
+CCAATCTTAT
+CAC
+>HWI-ST960:105:D10GVACXX:2:1101:4934:2200 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTTGTAG
+TAACTGAAAA
+CG
+>HWI-ST960:105:D10GVACXX:2:1101:4988:2205 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCTTCTTTC
+TCGAGAAATC
+GG
+>HWI-ST960:105:D10GVACXX:2:1101:4973:2209 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTGCTGTAA
+TTACAGATTG
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:4783:2210 1:N:0: bcd:RPI3 seq:CACTTAGGCATC
+CACTTAGGCA
+TCGATGAATA
+CATCATGGTA
+GTG
+>HWI-ST960:105:D10GVACXX:2:1101:4861:2212 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTATGTTT
+AGTTTAGAAG
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:4929:2223 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAACTGTGT
+CTCATCACTC
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:4966:2233 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATATTCAA
+ACTCTTGGAC
+TGA
+>HWI-ST960:105:D10GVACXX:2:1101:4877:2249 1:N:0: bcd:RPI2 seq:CACCGATGTATC
+CACCGATGTA
+TCCTTCCTAC
+TTGAAGAAGG
+TTG
+>HWI-ST960:105:D10GVACXX:2:1101:5029:2168 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGA
+TCTTTTGGTT
+CTGTAGACAC
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:5174:2170 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTATATAAT
+ATTCCCTAAG
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:5153:2178 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAATACCCC
+GAAAATTAGA
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:5078:2188 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTCTTGGTC
+TGGTGGTAAC
+AAT
+>HWI-ST960:105:D10GVACXX:2:1101:5182:2192 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATTTGTCA
+ACTTCAATTT
+CAG
+>HWI-ST960:105:D10GVACXX:2:1101:5054:2198 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTACTGTA
+TCTCATTAGC
+TGA
+>HWI-ST960:105:D10GVACXX:2:1101:5208:2202 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTATGTTTC
+TCTTGGAACG
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:5105:2206 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCATGAACTG
+TATTAAACTT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:5029:2212 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAACATTTC
+GAACAATGAA
+CAA
+>HWI-ST960:105:D10GVACXX:2:1101:5084:2222 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTACCTCT
+CTCTGACTTC
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:5223:2223 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCCGGAGTTT
+TTTCAGCAGT
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:5173:2228 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTATGTGT
+AATGATTCCT
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:5208:2240 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATTTACTT
+TGATCAGAAA
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:5101:2247 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAAACTCTA
+CCTTTATTAC
+AGT
+>HWI-ST960:105:D10GVACXX:2:1101:5189:2247 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCTACAAAA
+CTTTCTAATT
+TG
+>HWI-ST960:105:D10GVACXX:2:1101:5018:2248 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTATGTAG
+AATATGAGTT
+TA
+>HWI-ST960:105:D10GVACXX:2:1101:5160:2249 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTGCTTGA
+TTTTGAAGTT
+AG
+>HWI-ST960:105:D10GVACXX:2:1101:5498:2182 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAGCGAGAG
+TTCTTGAACT
+GA
+>HWI-ST960:105:D10GVACXX:2:1101:5435:2184 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTATAAGGA
+CTGTGAAGTG
+TG
+>HWI-ST960:105:D10GVACXX:2:1101:5472:2190 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCACTGTAA
+TCTCACGGTG
+TGT
+>HWI-ST960:105:D10GVACXX:2:1101:5358:2205 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTATGTAAT
+GTAGTCTTTA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:5420:2213 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCGTTTGAT
+TTGCAAGCTG
+>HWI-ST960:105:D10GVACXX:2:1101:5318:2214 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATTTGTAG
+CAAGGCACTG
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:5357:2223 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCTTCATTT
+CTGCTCTTAT
+CAC
+>HWI-ST960:105:D10GVACXX:2:1101:5300:2224 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAATGTAGA
+ACACACATGA
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:5485:2228 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAAAATATC
+GTATCCGTTC
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:5295:2241 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCAAAGACT
+TGGACCTTCT
+TTC
+>HWI-ST960:105:D10GVACXX:2:1101:5281:2244 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGGAGCGTA
+CCGACATGCG
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:5679:2172 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTAACAATA
+TTCTCATGCA
+CCT
+>HWI-ST960:105:D10GVACXX:2:1101:5663:2184 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTTTGTAA
+TCTGACTCTC
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:5539:2195 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTGAAAGA
+AAGAGCCATT
+GGT
+>HWI-ST960:105:D10GVACXX:2:1101:5728:2197 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATCTGTAT
+AAATAGTTTT
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:5500:2203 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTATCAAT
+TGAACTAGAT
+TCA
+>HWI-ST960:105:D10GVACXX:2:1101:5592:2204 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGA
+TCAATAAAGC
+TGTTGAATGA
+GAT
+>HWI-ST960:105:D10GVACXX:2:1101:5553:2233 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCGATCTGTA
+AACTAAAAAA
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:5604:2241 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATTTGATT
+ACCATAGCAT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:5743:2243 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAAGGTTTT
+AAGTTCTTAG
+AAC
+>HWI-ST960:105:D10GVACXX:2:1101:5682:2243 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTCTTGAGT
+ATGTAGAATC
+TG
+>HWI-ST960:105:D10GVACXX:2:1101:5979:2179 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCTCTCTAG
+AAAATATCAG
+A
+>HWI-ST960:105:D10GVACXX:2:1101:5958:2186 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTGCGATGA
+TGATAAAATA
+GC
+>HWI-ST960:105:D10GVACXX:2:1101:5985:2215 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTATAGTT
+TTGTTGTTTC
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:5952:2229 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTAGCAGTA
+CAATTGCAGA
+AGT
+>HWI-ST960:105:D10GVACXX:2:1101:5970:2231 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCTTATGTA
+GTCTCATTTC
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:5909:2233 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCACCAGTTT
+TACAGAGTGT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:5792:2239 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTATATAC
+TTCACAACTC
+TG
+>HWI-ST960:105:D10GVACXX:2:1101:5990:2248 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCACGGGAAG
+GTGATATTTG
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:6014:2179 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTACTTCT
+AAGTTTAGTA
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:6138:2192 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCTTTATAT
+GAACCAATAA
+TAG
+>HWI-ST960:105:D10GVACXX:2:1101:6181:2194 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATCACAAA
+ATATATAGGA
+AGT
+>HWI-ST960:105:D10GVACXX:2:1101:6001:2199 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTTGTGAA
+TCTGATTATA
+CAC
+>HWI-ST960:105:D10GVACXX:2:1101:6161:2202 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTAAGTCA
+TAATAATAGT
+AGC
+>HWI-ST960:105:D10GVACXX:2:1101:6053:2206 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTTTGTTG
+GCATGAGAAC
+CAA
+>HWI-ST960:105:D10GVACXX:2:1101:6128:2212 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCATTGTTG
+TACTCTTTAA
+TAT
+>HWI-ST960:105:D10GVACXX:2:1101:6082:2221 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATTTTGTG
+TGAAAAAAAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:6229:2231 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTTTGGTG
+AAGTTTTTAA
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:6024:2233 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTAAACCT
+ATAATATTTC
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:6181:2236 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTCGGCTAA
+TACCTAATGT
+CA
+>HWI-ST960:105:D10GVACXX:2:1101:6060:2238 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTGAATCA
+TGTTGCTTTA
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:6084:2243 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAATGTGTT
+CTCTCTGTTC
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:6492:2184 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCTTCACAT
+TATGAATATC
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:6252:2185 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTATATAC
+TTCACAACTC
+TG
+>HWI-ST960:105:D10GVACXX:2:1101:6273:2186 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAATGTTGT
+CTCTCCCTCT
+TAT
+>HWI-ST960:105:D10GVACXX:2:1101:6457:2201 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTGTGAAAC
+TCTATCAATT
+CA
+>HWI-ST960:105:D10GVACXX:2:1101:6377:2203 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGAATATGT
+TGCTGTAGTC
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:6427:2203 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCAAACCAGA
+GACAAATGAC
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:6279:2218 1:N:0: bcd:RPI2 seq:CACCGATGTATC
+CACCGATGTA
+TCTTGGACTG
+TGAAGTTTGG
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:6366:2222 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAGATGTCG
+GCGTTGAATA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:6393:2231 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTATTGCAG
+TAGAACATAA
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:6268:2234 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAACTCTTG
+TGTACCATAA
+AAA
+>HWI-ST960:105:D10GVACXX:2:1101:6467:2241 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTATCACCA
+TGTTCCAATT
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:6481:2244 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAATACTAG
+TGTTTAAGAA
+GTT
+>HWI-ST960:105:D10GVACXX:2:1101:6397:2246 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTAACTTT
+GGCGAATGGA
+TAC
+>HWI-ST960:105:D10GVACXX:2:1101:6429:2247 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTATATAT
+GGAGAAAATG
+GA
+>HWI-ST960:105:D10GVACXX:2:1101:6525:2176 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCACTGTAAG
+CTGAGGAACT
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:6517:2192 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTATGGCAC
+GGCTATGAAA
+TCT
+>HWI-ST960:105:D10GVACXX:2:1101:6700:2194 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCACATCTCA
+CTGCTCACTA
+CTC
+>HWI-ST960:105:D10GVACXX:2:1101:6538:2194 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTGCTAGAG
+AGAGGAGGAG
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:6575:2195 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTGTTTTAA
+CACCTCTACT
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:6501:2202 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCTTTATGG
+CTCTAGTACA
+AGC
+>HWI-ST960:105:D10GVACXX:2:1101:6631:2202 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTATCTCT
+AAAATTGCAA
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:6672:2205 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGA
+TCATGGTTGC
+TTTAATATTT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:6579:2213 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCGACTTTG
+ATCCAAAAAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:6552:2217 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCATCTTTAG
+CTTTATTTAC
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:6685:2223 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCATTATTA
+TCAATAGCTC
+TTC
+>HWI-ST960:105:D10GVACXX:2:1101:6503:2223 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTTAGGGG
+CTGATTTGTC
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:6613:2224 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTCTACCAT
+TATGCACTAT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:6670:2231 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCGGCGTGA
+AAGGGCGACT
+AAA
+>HWI-ST960:105:D10GVACXX:2:1101:6721:2233 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTAAACTT
+TCTTAGCTTG
+TCC
+>HWI-ST960:105:D10GVACXX:2:1101:6642:2234 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGGGTGATG
+AACGAAATAA
+AAA
+>HWI-ST960:105:D10GVACXX:2:1101:6589:2242 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATTAAAGA
+CAGAGAGATA
+GA
+>HWI-ST960:105:D10GVACXX:2:1101:6684:2245 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGATCGAAA
+CCAAACACCG
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:6830:2173 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCTTGTCAT
+TCTCTAAATA
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:6954:2174 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTATAACT
+CTCTCGCCTT
+TGT
+>HWI-ST960:105:D10GVACXX:2:1101:6754:2179 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTAAGTCG
+TATCTAGGTG
+TGT
+>HWI-ST960:105:D10GVACXX:2:1101:6877:2188 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAACAAAGT
+CGTTGTAGTA
+TAC
+>HWI-ST960:105:D10GVACXX:2:1101:6970:2193 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATCACACT
+GTCAAATCCG
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:6918:2197 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATTCGGCT
+CTGTTCATAT
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:6851:2211 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTTTCTGG
+CTGTAGAATC
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:6836:2224 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCACGCACA
+CCGCGTGTAG
+AG
+>HWI-ST960:105:D10GVACXX:2:1101:6948:2228 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCCGATAGAG
+AACCTTGCTG
+ACC
+>HWI-ST960:105:D10GVACXX:2:1101:6923:2230 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTATTTTA
+TGTGGTGTTA
+CTT
+>HWI-ST960:105:D10GVACXX:2:1101:6971:2233 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATCAGTGA
+TGAAATTATG
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:6883:2236 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTGAGTGAG
+ATATAAAATG
+GG
+>HWI-ST960:105:D10GVACXX:2:1101:6822:2246 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGAATTCAG
+ACTGTGAAAC
+TGC
+>HWI-ST960:105:D10GVACXX:2:1101:7018:2176 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGA
+TCGGAGTTTT
+TTCAGCAGTT
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:7182:2176 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATTGTATT
+TGTGCGTGTA
+GC
+>HWI-ST960:105:D10GVACXX:2:1101:7145:2178 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATAATAAG
+ACTCTTAATC
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:7091:2178 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTATGTAAT
+GTAGTCTTAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:7123:2181 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTCCTTGA
+CTGGAAAAAT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:7068:2182 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTAATGTA
+CCGATGCATA
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:7245:2192 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTGTTTACC
+ATGGAACGAA
+CAT
+>HWI-ST960:105:D10GVACXX:2:1101:7109:2196 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATTGTAAT
+TCAGTTAGCT
+CAA
+>HWI-ST960:105:D10GVACXX:2:1101:7209:2197 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTTGTCAA
+TGCATAGACA
+AAA
+>HWI-ST960:105:D10GVACXX:2:1101:7060:2201 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTGTGTGT
+TGGTGGATAT
+AAC
+>HWI-ST960:105:D10GVACXX:2:1101:7155:2215 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTTGTTGG
+CCTTTAAAAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:7198:2217 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTATATAT
+TTCGTTTCAT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:7115:2229 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTAAGGCT
+GTGGAGGTTA
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:7149:2234 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTTTGTTA
+GACTCTTCGA
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:7127:2244 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTATGTAGA
+TACTGATATT
+A
+>HWI-ST960:105:D10GVACXX:2:1101:7018:2247 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCTTTATAT
+GAACCAATAA
+TAG
+>HWI-ST960:105:D10GVACXX:2:1101:7382:2185 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTAGTAGAC
+TTGCAAAGAT
+CGT
+>HWI-ST960:105:D10GVACXX:2:1101:7449:2187 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAATACCCC
+GAAAATTAGA
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:7359:2193 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAGGCTGAT
+TGTAGAATGG
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:7292:2202 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTCAA
+TCCATGGTTT
+TCTCAAAGTT
+TTC
+>HWI-ST960:105:D10GVACXX:2:1101:7393:2205 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTATGTCT
+CTGTACTGTA
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:7359:2210 1:N:0: bcd:RPI1 seq:CACATCACGATC
+CACATCACGA
+TCAGAGATCG
+GAAGAGATGG
+CTT
+>HWI-ST960:105:D10GVACXX:2:1101:7415:2224 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATTAATTA
+TTCGTATGAA
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:7403:2225 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCGTCTTAC
+CATTTCTTTC
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:7373:2225 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTATGTCTG
+TCTAGTCTAT
+TG
+>HWI-ST960:105:D10GVACXX:2:1101:7324:2231 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAATCAAAT
+GTATTATATA
+TAT
+>HWI-ST960:105:D10GVACXX:2:1101:7309:2246 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTGAGTTT
+TTACATGTTT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:7475:2247 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTTGACTG
+TATTGAGCAA
+CC
+>HWI-ST960:105:D10GVACXX:2:1101:7649:2170 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCTGAGTAGA
+CAATTTAATC
+A
+>HWI-ST960:105:D10GVACXX:2:1101:7708:2170 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAGTTTAAT
+AAAACAGAAC
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:7709:2191 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTCTCTCTC
+TTACCTTTCT
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:7690:2197 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATTCGATT
+AGTACCGTTA
+GTG
+>HWI-ST960:105:D10GVACXX:2:1101:7607:2203 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCCGGAATG
+GTGCCTTTGT
+TAC
+>HWI-ST960:105:D10GVACXX:2:1101:7698:2214 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCTCTGGCT
+TTGCTCAGAT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:7518:2217 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCAATTCTTT
+TACCGGGTTG
+AG
+>HWI-ST960:105:D10GVACXX:2:1101:7534:2218 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATAATGAA
+TGTTTCGGAC
+TTC
+>HWI-ST960:105:D10GVACXX:2:1101:7679:2220 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATCGGTGA
+GTGGAACTTC
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:7747:2228 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCACGAGTC
+GAGGCTCTCA
+ATA
+>HWI-ST960:105:D10GVACXX:2:1101:7610:2232 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTCAGTGGT
+AGAGCGCGTG
+GC
+>HWI-ST960:105:D10GVACXX:2:1101:7532:2235 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTATGTTC
+ACTGTTCTCT
+GC
+>HWI-ST960:105:D10GVACXX:2:1101:7676:2238 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGA
+TCCAGCCGTC
+GGATACTGAC
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:7641:2240 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATCTGTAG
+CCTCTCTTTT
+AGT
+>HWI-ST960:105:D10GVACXX:2:1101:7966:2176 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATGCAACT
+GCAAATTCTG
+CA
+>HWI-ST960:105:D10GVACXX:2:1101:7948:2186 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTTGCTGT
+GGATGATCTG
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:7864:2190 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCGGAAGAAC
+TCTGGAAGTG
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:7912:2193 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAACAAGAT
+GTTTAATCAT
+CC
+>HWI-ST960:105:D10GVACXX:2:1101:7970:2195 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCACAATTGT
+TGTCTTGTAG
+TA
+>HWI-ST960:105:D10GVACXX:2:1101:7819:2202 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTAATTGT
+TTCTTAGCAT
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:7762:2204 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTACTTTAT
+AAGGACTGTG
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:7847:2207 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATGCAACC
+CTGTCTTGCT
+TTA
+>HWI-ST960:105:D10GVACXX:2:1101:7775:2219 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTATTGTG
+TTACTGAATC
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:7900:2219 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATTACGCC
+CGAACGCAAA
+CC
+>HWI-ST960:105:D10GVACXX:2:1101:7800:2227 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCTCTTATGA
+TGTCAAAACT
+TTC
+>HWI-ST960:105:D10GVACXX:2:1101:7973:2227 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTATGTGT
+TCTGCAGATC
+GA
+>HWI-ST960:105:D10GVACXX:2:1101:7844:2229 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTTCGTTG
+GGTTTTCTTC
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:7863:2232 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATAAATTT
+TCGAAGGAGA
+CAA
+>HWI-ST960:105:D10GVACXX:2:1101:7912:2234 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCGTGTGTAA
+CCTCATATGG
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:7940:2245 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCGTGTCAA
+GTGTAGAATC
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:8023:2182 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATGTATCT
+TGTTGTTTAT
+CTA
+>HWI-ST960:105:D10GVACXX:2:1101:8157:2184 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTCAGTGGT
+AGAGCGCGTG
+GC
+>HWI-ST960:105:D10GVACXX:2:1101:8117:2186 1:N:0: bcd:RPI3 seq:CACTTAGGCATC
+CACTTAGGCA
+TCACTGAATC
+GACTTTGGGC
+AAA
+>HWI-ST960:105:D10GVACXX:2:1101:8197:2187 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATGGTGCT
+TAAAAAAAAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:8236:2188 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTATGTCG
+GCTTAAACTC
+TAT
+>HWI-ST960:105:D10GVACXX:2:1101:8088:2193 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTATGGAAA
+TGTGCTATGG
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:8085:2226 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTCGCAGTC
+GCTAAGCGTC
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:8003:2228 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATATTTGT
+GGATGATGAA
+GA
+>HWI-ST960:105:D10GVACXX:2:1101:8138:2242 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTATATGA
+TTCTACTTAG
+TCA
+>HWI-ST960:105:D10GVACXX:2:1101:8069:2250 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTGGTACTA
+TGAACATTGT
+GAC
+>HWI-ST960:105:D10GVACXX:2:1101:8355:2173 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTATGTGT
+AACCCTGTCC
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:8375:2177 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TATTGCTATA
+GAGTCACGCA
+TCT
+>HWI-ST960:105:D10GVACXX:2:1101:8257:2177 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCACCTGGAG
+ACTCATGTGT
+TGA
+>HWI-ST960:105:D10GVACXX:2:1101:8438:2178 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTTGGTTT
+GGATTTTGGT
+TA
+>HWI-ST960:105:D10GVACXX:2:1101:8299:2178 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATCTCTGG
+CTGTTGAATA
+GA
+>HWI-ST960:105:D10GVACXX:2:1101:8333:2183 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAGCTTGCA
+AGTTCTCTCT
+GAA
+>HWI-ST960:105:D10GVACXX:2:1101:8309:2194 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCACTGTGTT
+GGCGTTTTAT
+CTG
+>HWI-ST960:105:D10GVACXX:2:1101:8363:2198 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCAAGCATG
+ATGAATTGAT
+GAG
+>HWI-ST960:105:D10GVACXX:2:1101:8494:2200 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTTTGCAT
+TGATTGTGGT
+TAC
+>HWI-ST960:105:D10GVACXX:2:1101:8291:2212 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGA
+TCTCTACTCT
+ACTAAACCTC
+TGT
+>HWI-ST960:105:D10GVACXX:2:1101:8482:2215 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATCTTCCG
+TCTGTTTCTG
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:8322:2218 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCTTGACCGA
+TGCTCGGACA
+A
+>HWI-ST960:105:D10GVACXX:2:1101:8388:2225 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGA
+TCGTGTGTAT
+TTAGTAATTC
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:8442:2226 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATTTTCTA
+TGTTGTTTGG
+TAG
+>HWI-ST960:105:D10GVACXX:2:1101:8339:2233 1:N:0: bcd:RPI2 seq:CACCGATGTATC
+CACCGATGTA
+TCATCTCTAG
+AACTCTTTAT
+AAT
+>HWI-ST960:105:D10GVACXX:2:1101:8376:2238 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATGTGTCA
+GATTCTAAAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:8457:2246 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCACTCTGTG
+GATTATGCTT
+TA
+>HWI-ST960:105:D10GVACXX:2:1101:8627:2171 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAGGTAAAT
+TTGTCTGAAT
+TA
+>HWI-ST960:105:D10GVACXX:2:1101:8743:2178 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATCATCTT
+TTCTTATGTA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:8722:2182 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTATGTAG
+AGAAAGTGAT
+TA
+>HWI-ST960:105:D10GVACXX:2:1101:8678:2182 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTGATGTAT
+ATTTACGAGA
+TGT
+>HWI-ST960:105:D10GVACXX:2:1101:8565:2183 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTGTCCTTC
+GGATCACTCA
+ATT
+>HWI-ST960:105:D10GVACXX:2:1101:8583:2192 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTAACGCT
+TTTATGTGCT
+TCT
+>HWI-ST960:105:D10GVACXX:2:1101:8633:2194 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTATACATA
+TTGGGTTGTG
+ATT
+>HWI-ST960:105:D10GVACXX:2:1101:8687:2198 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATTTCTGT
+AGACTATGTG
+TTG
+>HWI-ST960:105:D10GVACXX:2:1101:8605:2201 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGA
+TCTTTCTTGT
+CTAGTCGGTT
+TAT
+>HWI-ST960:105:D10GVACXX:2:1101:8532:2207 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAATGAATG
+TGTAGAAAAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:8688:2216 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTGGGGAA
+GGATCAGATG
+CA
+>HWI-ST960:105:D10GVACXX:2:1101:8560:2228 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAATTGGTG
+CCTGTAGGTC
+AG
+>HWI-ST960:105:D10GVACXX:2:1101:8658:2230 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCTGCTATA
+GAATCTGGAC
+AAA
+>HWI-ST960:105:D10GVACXX:2:1101:8538:2232 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTCTTATCT
+TTTACTTTCC
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:8669:2248 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTACTGTT
+TTTTCCGCCT
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:8917:2174 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATGTTGTT
+GTTGCATGCT
+GTG
+>HWI-ST960:105:D10GVACXX:2:1101:8755:2195 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATGATGTC
+GTTGGGTCTT
+TGT
+>HWI-ST960:105:D10GVACXX:2:1101:8885:2196 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCTCCGATGA
+TGATCAAATC
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:8967:2201 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTTCTTT
+ATTCCTGGGT
+TGT
+>HWI-ST960:105:D10GVACXX:2:1101:8797:2213 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTTAACTC
+TTGCCTCTTC
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:8831:2214 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTTTGGGT
+TTGTGGTGGG
+GGT
+>HWI-ST960:105:D10GVACXX:2:1101:8957:2220 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTGTCTTTA
+GCATCGACTG
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:8751:2221 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTGTGTTTG
+TGTTTAAGTG
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:8914:2223 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCGTTTTGG
+CTTTCGTTCT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:8937:2229 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGA
+TCTGGAATGA
+TGATAACGAT
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:8832:2238 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTTGTCAG
+TCTAAGAAAA
+TG
+>HWI-ST960:105:D10GVACXX:2:1101:8894:2244 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCGAATGTTT
+AAATTGGATC
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:8849:2246 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTTACTGT
+AGTATATATG
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:9130:2168 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAGGAATTG
+TTGAGTTTGG
+TA
+>HWI-ST960:105:D10GVACXX:2:1101:9203:2174 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCTTGACTGT
+GATTTAAACG
+AG
+>HWI-ST960:105:D10GVACXX:2:1101:9183:2182 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTACTCTA
+TCTTAAACAT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:9125:2192 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTATCGGAT
+TGTCAAATGT
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:9001:2202 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCTTCTTGT
+TGTCTAACTC
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:9175:2204 1:N:0: bcd:RPI1 seq:CACATCACGATC
+CACATCACGA
+TCTGAGAATA
+AGAACATACA
+TAA
+>HWI-ST960:105:D10GVACXX:2:1101:9224:2207 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATCGTAAA
+AACTTTGGGA
+TGC
+>HWI-ST960:105:D10GVACXX:2:1101:9118:2208 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTATAGTTC
+AGTCGACATG
+AAT
+>HWI-ST960:105:D10GVACXX:2:1101:9087:2209 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATATGGAT
+GGATAATTTT
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:9013:2211 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAGGAGCCT
+CTGTAATTTT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:9153:2219 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCTCTTCGA
+ATGACGAGTT
+CC
+>HWI-ST960:105:D10GVACXX:2:1101:9188:2234 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCCTTTGTCG
+CTAAGATTCG
+A
+>HWI-ST960:105:D10GVACXX:2:1101:9022:2234 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTAAAATA
+AACACATGTA
+CTT
+>HWI-ST960:105:D10GVACXX:2:1101:9098:2234 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCGAGGAGAG
+CAGTCTATTC
+TG
+>HWI-ST960:105:D10GVACXX:2:1101:9115:2236 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTGTTTAG
+TTGGCGGTTT
+CAC
+>HWI-ST960:105:D10GVACXX:2:1101:9136:2239 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTTTGCTT
+CCTTTAACAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:9477:2182 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATTTATGG
+CACAACATGT
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:9421:2187 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCCCAGCCT
+CATAGAGGAA
+CTG
+>HWI-ST960:105:D10GVACXX:2:1101:9299:2194 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCACCAAACT
+TTTCAAACCA
+TGT
+>HWI-ST960:105:D10GVACXX:2:1101:9456:2199 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAATTTCGG
+AAATGCTAAT
+CG
+>HWI-ST960:105:D10GVACXX:2:1101:9347:2201 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGCATAATA
+ATGTATTTAT
+TTG
+>HWI-ST960:105:D10GVACXX:2:1101:9436:2206 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTTATGAG
+TGTGCGTCTC
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:9384:2226 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTCTGTTA
+CACGCCGAGA
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:9328:2231 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCACTGTTGC
+AGTCGGTGTT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:9477:2238 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTATGTGT
+GCTGCTTTCT
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:9563:2176 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCCTCGACA
+CTGTTACTCC
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:9614:2178 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATTGTCAT
+ATTTGCGATG
+TAT
+>HWI-ST960:105:D10GVACXX:2:1101:9676:2191 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTTTAAAT
+CATTGTCTGA
+ATT
+>HWI-ST960:105:D10GVACXX:2:1101:9526:2191 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAATCTTTT
+GTATTTTGCT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:9622:2195 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCTGTACCT
+GTTATGCTTT
+AAA
+>HWI-ST960:105:D10GVACXX:2:1101:9597:2203 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAGTAGCTG
+TGGAATGAAA
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:9507:2209 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTCTAGAG
+CTCTGATGAG
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:9613:2210 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCTTTTCAT
+AACTCATCCT
+ACT
+>HWI-ST960:105:D10GVACXX:2:1101:9741:2245 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTATGAGAC
+TGTATCCTTT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:9572:2247 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTATTAAA
+ATTAGAACAA
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:9606:2249 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTACATATA
+GTAGTGGAGG
+CCT
+>HWI-ST960:105:D10GVACXX:2:1101:9995:2170 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTATGGGAA
+CTCTTTTGGA
+CC
+>HWI-ST960:105:D10GVACXX:2:1101:9998:2188 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATCTTATT
+AGTTTTAACT
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:9771:2192 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCCCTATAAA
+TAAAAAACAG
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:9841:2194 1:N:0: bcd:RPI1 seq:CACATCACGATC
+CACATCACGA
+TCTACACCAA
+ACTCTGGTAC
+AGT
+>HWI-ST960:105:D10GVACXX:2:1101:9751:2194 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAATTGTTG
+TAGGCTGTGG
+TCC
+>HWI-ST960:105:D10GVACXX:2:1101:9885:2199 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTATGTTTG
+TGTAACTGTA
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:9758:2211 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTTGGCGA
+CTTTCTACCG
+CAC
+>HWI-ST960:105:D10GVACXX:2:1101:9838:2213 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTGTAGCT
+CCATGAACAA
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:9815:2214 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTAATAAA
+CACAAAAGTT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:9945:2214 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCAGGATTG
+GTTTGGTGGA
+TTA
+>HWI-ST960:105:D10GVACXX:2:1101:9878:2215 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTGAAGCC
+AGATCAGAAT
+CTT
+>HWI-ST960:105:D10GVACXX:2:1101:9912:2218 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCAAAGTTA
+ATTTCTGTTT
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:9753:2227 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTTACCAA
+ATAAGCTTAA
+GTC
+>HWI-ST960:105:D10GVACXX:2:1101:9999:2231 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCTTTGTGAT
+ATCTGAAAAA
+CAT
+>HWI-ST960:105:D10GVACXX:2:1101:9840:2233 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTGATTTT
+TCCTTTGTTA
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:9928:2239 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTGCAAAGG
+CAAGGCTCTG
+CTG
+>HWI-ST960:105:D10GVACXX:2:1101:9937:2249 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAGTCGGCT
+TAACTAAGGT
+GGA
+>HWI-ST960:105:D10GVACXX:2:1101:9908:2249 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAAGAACTC
+TGTAATTTCT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:10129:2182 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTTGTCCT
+TAATTCATTT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:10012:2196 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTTTGTAT
+CCTTTCTCAT
+TTA
+>HWI-ST960:105:D10GVACXX:2:1101:10236:2203 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATATCACC
+ATGTTCCAAT
+TTC
+>HWI-ST960:105:D10GVACXX:2:1101:10124:2225 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAGTGTTGG
+CATGGGCCTC
+GA
+>HWI-ST960:105:D10GVACXX:2:1101:10018:2233 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTCGGTTGA
+CTGGAATTAT
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:10188:2243 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTTGTGAT
+TGTTGGCAAT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:10113:2246 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTAAGTGT
+AGAATGCATA
+C
+>HWI-ST960:105:D10GVACXX:2:1101:10363:2184 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTGGATTCT
+TCGTTCAGGC
+CAT
+>HWI-ST960:105:D10GVACXX:2:1101:10329:2196 1:N:0: bcd:RPI3 seq:CACTTAGGCATC
+CACTTAGGCA
+TCAAGACTGC
+AACAACTTCT
+GC
+>HWI-ST960:105:D10GVACXX:2:1101:10309:2198 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTCTTCTGT
+CATCTACATA
+TGC
+>HWI-ST960:105:D10GVACXX:2:1101:10373:2200 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAGTACTGT
+ATTTGCTATT
+CCC
+>HWI-ST960:105:D10GVACXX:2:1101:10440:2212 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCTTTTCTT
+TTTGTCGGCA
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:10352:2213 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTATTATCT
+CTGTTGATTG
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:10470:2218 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCCTAGAAC
+TTGCTCAAAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:10322:2233 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCACTGGAAC
+TCTTTCTTCT
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:10300:2236 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGAATCCAT
+AGTCTTACCA
+TGA
+>HWI-ST960:105:D10GVACXX:2:1101:10348:2237 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTATGACA
+AGTCGAATCT
+ATT
+>HWI-ST960:105:D10GVACXX:2:1101:10434:2240 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTATGTCG
+TTTCTTTGAA
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:10326:2249 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAAGAGTTG
+ATTGTGCAAA
+CAA
+>HWI-ST960:105:D10GVACXX:2:1101:10707:2172 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTATTTAA
+ATTCCTTCAA
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:10553:2176 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTATGTGTA
+GACTTAATTT
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:10597:2193 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTAATGTA
+CCGATGCATA
+GTC
+>HWI-ST960:105:D10GVACXX:2:1101:10566:2195 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTAGTTTT
+TGGATTGTAA
+ATT
+>HWI-ST960:105:D10GVACXX:2:1101:10694:2196 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTTGTAA
+TGTTAAATAA
+CTC
+>HWI-ST960:105:D10GVACXX:2:1101:10746:2198 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTAACAGGG
+ACAGTCGGGG
+GGT
+>HWI-ST960:105:D10GVACXX:2:1101:10522:2206 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTCTGTAC
+AGATATACTT
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:10609:2213 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATTTGGCT
+TTTCTCTGCT
+>HWI-ST960:105:D10GVACXX:2:1101:10672:2216 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTTGGACT
+CGGATACGCT
+TCA
+>HWI-ST960:105:D10GVACXX:2:1101:10584:2225 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGATGTTGA
+GGCTCAAAAG
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:10743:2225 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTCGATAG
+AACTACAAAG
+AAT
+>HWI-ST960:105:D10GVACXX:2:1101:10653:2225 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTGTCCTTC
+GGATCACTCA
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:10642:2240 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAGATTTTA
+AAGTGTTACA
+AG
+>HWI-ST960:105:D10GVACXX:2:1101:10627:2242 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAACAAGTT
+GGTCTGGGTT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:10734:2245 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTAATCTG
+GGATGAACTC
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:10579:2247 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAATCTTTA
+GTAGAACAAA
+ATC
+>HWI-ST960:105:D10GVACXX:2:1101:10596:2249 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGGTACTAA
+TGGCGAAAGA
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:10984:2173 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATTACGAT
+GTCTCTGTAC
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:10870:2185 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATGGGTTC
+GACGTTAAAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:10979:2195 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAACTGAAA
+TGAACCAAAA
+CC
+>HWI-ST960:105:D10GVACXX:2:1101:10780:2199 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTTGGTGG
+AACTACATTA
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:10858:2207 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTGTTTGCG
+GATTATGCGT
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:10924:2209 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAACAAAGT
+CGTTGTAGTA
+TAG
+>HWI-ST960:105:D10GVACXX:2:1101:10881:2211 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCATACTGT
+GTCTGCTTCT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:10798:2212 1:N:0: bcd:RPI2 seq:CACCGATGTATC
+CACCGATGTA
+TCAATGTAGG
+TTGTTTTTGG
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:10962:2219 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTATAGGA
+ATCTGTAACT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:10898:2220 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTAATTTC
+GGCTGTAGCA
+TGT
+>HWI-ST960:105:D10GVACXX:2:1101:10771:2225 1:N:0: bcd:RPI1 seq:CACATCACGATC
+CACATCACGA
+TCGAGAATGA
+TGAACCAATT
+AG
+>HWI-ST960:105:D10GVACXX:2:1101:10861:2226 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTTGTTA
+GACTCTTCGA
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:10883:2230 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAAATGTTC
+TCTTTCTGAT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:10793:2238 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAACTAATG
+GATGTATGAA
+TAT
+>HWI-ST960:105:D10GVACXX:2:1101:10996:2241 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTTTGTGT
+TGTTGACTCT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:10908:2243 1:N:0: bcd:RPI2 seq:CACCGATGTATC
+CACCGATGTA
+TCTGGAATGA
+TGATAACGAT
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:10822:2244 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTGTGTGTC
+TCAGAAAAAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:11150:2169 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTTGTAG
+TAACTGAAAA
+CGG
+>HWI-ST960:105:D10GVACXX:2:1101:11176:2178 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTCTGTTGA
+CCAAAAAAAA
+A
+>HWI-ST960:105:D10GVACXX:2:1101:11080:2183 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTCCATAA
+GCTTTGATCA
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:11039:2186 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTAGTTAGT
+TGTTTTAAAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:11213:2190 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCAATAAGAA
+TAAGAATAAG
+A
+>HWI-ST960:105:D10GVACXX:2:1101:11039:2203 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAGAGAAAA
+TGAGCATTAT
+TAT
+>HWI-ST960:105:D10GVACXX:2:1101:11145:2212 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTATGTTGT
+CTCTTAATCG
+GC
+>HWI-ST960:105:D10GVACXX:2:1101:11168:2217 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAATCAATG
+CTGGTGCTAA
+CTT
+>HWI-ST960:105:D10GVACXX:2:1101:11088:2218 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAAGAACAA
+GAACACATTT
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:11184:2224 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCACATCCTT
+TCAAAACAAG
+TTC
+>HWI-ST960:105:D10GVACXX:2:1101:11073:2233 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTAAGTCT
+GGAATAGCTT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:11102:2235 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATTTGTCG
+AACTTGTAAA
+AAA
+>HWI-ST960:105:D10GVACXX:2:1101:11129:2239 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGGTTGGTT
+ATACACCAAA
+CTC
+>HWI-ST960:105:D10GVACXX:2:1101:11163:2245 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTAATAT
+GTCTGGCTTG
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:11321:2204 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAAATCTGT
+TTGGTTGTGG
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:11427:2204 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCTTCTTGG
+TAAAGGTTGA
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:11305:2204 1:N:0: bcd:RPI2 seq:CACCGATGTATC
+CACCGATGTA
+TCTACTGACC
+CCGAGGCTTT
+CGC
+>HWI-ST960:105:D10GVACXX:2:1101:11259:2205 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAATATGTT
+TCGTAGAACT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:11401:2214 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTGTAGAAA
+ATGAACTATA
+AAT
+>HWI-ST960:105:D10GVACXX:2:1101:11352:2220 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATTGAATA
+GTCGGGGTTA
+CTT
+>HWI-ST960:105:D10GVACXX:2:1101:11437:2220 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATTGCGTC
+GTATGAGTAA
+AAG
+>HWI-ST960:105:D10GVACXX:2:1101:11258:2232 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAACCGAGT
+ACTTTTGGTA
+GC
+>HWI-ST960:105:D10GVACXX:2:1101:11443:2243 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTATGTAGT
+GTAGTGGTAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:11272:2245 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAGTGCTTC
+AACGGCTCTG
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:11399:2247 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGA
+TCATATGAAC
+TACGTGTGGC
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:11611:2171 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAGGAGCTC
+AAGAACGGAA
+GAT
+>HWI-ST960:105:D10GVACXX:2:1101:11736:2174 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGAATACTG
+TGGTTGTTTT
+AG
+>HWI-ST960:105:D10GVACXX:2:1101:11736:2194 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTGATACAA
+TTTCGGTTTC
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:11623:2201 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTGTTTTG
+GGGTTTTAAA
+CAT
+>HWI-ST960:105:D10GVACXX:2:1101:11724:2214 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTTAGGAC
+AGTTCATGTT
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:11676:2225 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTGCATCAA
+GCTGTAACCG
+AAC
+>HWI-ST960:105:D10GVACXX:2:1101:11707:2233 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGGTATGAA
+CTATGAACAC
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:11640:2237 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTTGTTA
+GACTCTTCGA
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:11532:2244 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCACTAGTAA
+TAGAGCTTGG
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:11511:2247 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATTGGAGA
+TATTGGTTAA
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:11573:2247 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAACAATTC
+GGCTAGAAAT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:11773:2169 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCTTTCTTAC
+TTCGGCCTGT
+T
+>HWI-ST960:105:D10GVACXX:2:1101:11943:2187 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAAGATCAT
+ATGGACGTAA
+CAT
+>HWI-ST960:105:D10GVACXX:2:1101:11759:2191 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATTGAGCT
+CTTCTTTTCT
+TA
+>HWI-ST960:105:D10GVACXX:2:1101:11857:2196 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTCTGTAG
+TAGGCTTGCA
+TGC
+>HWI-ST960:105:D10GVACXX:2:1101:11838:2200 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTATCAATG
+TATTGTATCC
+G
+>HWI-ST960:105:D10GVACXX:2:1101:11790:2208 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTGAATTTC
+TGTAGACTAT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:11770:2213 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGGATGCGA
+TCATACCAGC
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:11869:2213 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCTGATGTT
+GGTTTGTAAT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:11959:2213 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTACTGTA
+CACACAAACT
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:11892:2215 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAATAAAAT
+GACTCTGAAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:11899:2234 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTATAATGT
+AATAGTACTC
+ACC
+>HWI-ST960:105:D10GVACXX:2:1101:12088:2170 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCTTTTGTA
+CAAATCCAAA
+CCT
+>HWI-ST960:105:D10GVACXX:2:1101:12143:2181 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCTTCTGTC
+AACCTCTTCG
+GA
+>HWI-ST960:105:D10GVACXX:2:1101:12198:2193 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCAGGGATGA
+TGATTCAATT
+A
+>HWI-ST960:105:D10GVACXX:2:1101:12019:2199 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCATTGTTG
+AACTTAGAAT
+CAA
+>HWI-ST960:105:D10GVACXX:2:1101:12174:2199 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTCTGTAG
+CTCTAGACCA
+TTC
+>HWI-ST960:105:D10GVACXX:2:1101:12126:2204 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTATTCCCG
+TTGAGAGGAT
+CAT
+>HWI-ST960:105:D10GVACXX:2:1101:12157:2207 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTGCTACTC
+TCCTCGTCTC
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:12048:2210 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTACCACTC
+TTGCATTTGC
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:12070:2217 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCACAGAGCT
+CTGATTAAAG
+TG
+>HWI-ST960:105:D10GVACXX:2:1101:12006:2219 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTAGTTGA
+GCGGTTGAAT
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:12122:2230 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTCTGTAT
+GCTTTTTTGG
+GAC
+>HWI-ST960:105:D10GVACXX:2:1101:12107:2231 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTCACAAC
+CTGTGAAAAT
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:12066:2240 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTGTGGAT
+GATGAAGAGT
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:12166:2250 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCTGCAATA
+TTCTAAAGAA
+CTC
+>HWI-ST960:105:D10GVACXX:2:1101:12124:2250 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGAATTTGG
+ATTTGATCAG
+TA
+>HWI-ST960:105:D10GVACXX:2:1101:12436:2174 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTATAAAGT
+TAGTTGGTGG
+TTG
+>HWI-ST960:105:D10GVACXX:2:1101:12303:2179 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATCTTTCT
+ACTTTCATTA
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:12490:2188 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCTTCAATT
+ATGAGTTTTC
+CA
+>HWI-ST960:105:D10GVACXX:2:1101:12308:2196 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGA
+TCTATAGTTA
+AAAGAGCACT
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:12371:2201 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTGGTTTGG
+ACAAAAAAAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:12329:2218 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGA
+TCCTTTGTCG
+CTAAGATTCG
+A
+>HWI-ST960:105:D10GVACXX:2:1101:12376:2223 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCTGATCAA
+GTACAAGGGT
+TAT
+>HWI-ST960:105:D10GVACXX:2:1101:12362:2226 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTAATATC
+GCATTAGCCC
+AGT
+>HWI-ST960:105:D10GVACXX:2:1101:12430:2229 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTAATATA
+CACTGAACTT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:12484:2235 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTAAGTTT
+CTATCAAAAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:12259:2237 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGCCTTGCT
+CTTCATTGGT
+TTC
+>HWI-ST960:105:D10GVACXX:2:1101:12345:2240 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCCCGATAA
+ATAGAACGAT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:12290:2249 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTTGTCTG
+AAAAAAAAAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:12617:2173 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTAGTCT
+TATTGTATCT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:12673:2203 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTGATTCA
+AATCGATCCC
+T
+>HWI-ST960:105:D10GVACXX:2:1101:12575:2204 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTTTATAT
+TATGTGAAGT
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:12730:2214 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTGAGTCG
+ATCGTAGAGT
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:12674:2224 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTTTGTTT
+GATGTCTATG
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:12690:2226 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCACTAGCT
+TCTACTTTGA
+TAT
+>HWI-ST960:105:D10GVACXX:2:1101:12653:2228 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATTGTTTC
+TGTCTATGAC
+TCC
+>HWI-ST960:105:D10GVACXX:2:1101:12702:2234 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAGAGCCTT
+GTTTCTTATT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:12587:2240 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCTTATTGA
+TGATTCTATC
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:12614:2244 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTCGACATT
+TGGTGTGAAA
+TGC
+>HWI-ST960:105:D10GVACXX:2:1101:12849:2171 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGCCCGACC
+TCGGACTGGG
+AAC
+>HWI-ST960:105:D10GVACXX:2:1101:12894:2184 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAAAGTAGT
+CTCATCTTAT
+CAC
+>HWI-ST960:105:D10GVACXX:2:1101:12816:2185 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTTAAAGG
+CTTATTATCA
+AAA
+>HWI-ST960:105:D10GVACXX:2:1101:12946:2186 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTCTGATGA
+AATCTCATAT
+TGA
+>HWI-ST960:105:D10GVACXX:2:1101:12964:2189 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCTAATATAT
+GGACAATTTG
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:12914:2190 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTATGTAA
+CAACTTTTCA
+TCT
+>HWI-ST960:105:D10GVACXX:2:1101:12899:2205 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAAGAAAGT
+AGCATCAAAA
+CAA
+>HWI-ST960:105:D10GVACXX:2:1101:12750:2211 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCATCTAGTA
+CATACTCTGT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:12962:2211 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTTTTGTC
+TGAGTACGAA
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:12876:2225 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTATAATT
+TTTAGTGAAT
+AAC
+>HWI-ST960:105:D10GVACXX:2:1101:12908:2229 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATTATGAT
+GTAGAAGTAT
+TG
+>HWI-ST960:105:D10GVACXX:2:1101:12760:2229 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTTGGGCT
+CTTGTTGTGA
+ATC
+>HWI-ST960:105:D10GVACXX:2:1101:12926:2234 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTATTCAG
+CAGGATTATG
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:12942:2239 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTATTTCAT
+TGTCTTGTCG
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:12902:2246 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTTATTTA
+CATGTTGTTT
+GG
+>HWI-ST960:105:D10GVACXX:2:1101:13052:2176 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCTTTGTGA
+CTGATCATTA
+G
+>HWI-ST960:105:D10GVACXX:2:1101:13197:2180 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTTTGTCA
+CATTGTAAAT
+CCC
+>HWI-ST960:105:D10GVACXX:2:1101:13235:2181 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTAATAAG
+ATTTTCTAGT
+TG
+>HWI-ST960:105:D10GVACXX:2:1101:13099:2185 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TTCTCTGTAT
+CTCTCGACTC
+TCT
+>HWI-ST960:105:D10GVACXX:2:1101:13082:2187 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTAGTATTA
+TTATACACAC
+TTG
+>HWI-ST960:105:D10GVACXX:2:1101:13132:2192 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTATAAAT
+AAGCTTTGTT
+CA
+>HWI-ST960:105:D10GVACXX:2:1101:13120:2196 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTAATTTG
+GACTGAGTCT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:13177:2199 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCACTACGTC
+GTTTTGTTCT
+CTC
+>HWI-ST960:105:D10GVACXX:2:1101:13060:2203 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAATTAAAG
+AAGAACCCAA
+AAC
+>HWI-ST960:105:D10GVACXX:2:1101:13106:2213 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTCGTAAAC
+TCATAAATAA
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:13215:2231 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCACTGTGTT
+GGCGTTTTAT
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:13012:2238 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAAATGCCC
+ATTAATCGTG
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:13172:2240 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTGCCTAT
+TTATTTGCTG
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:13045:2241 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTCTGAG
+ATTGTAGAAC
+AAT
+>HWI-ST960:105:D10GVACXX:2:1101:13155:2249 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCAAAAGGT
+CAAGGTTGGC
+AAG
+>HWI-ST960:105:D10GVACXX:2:1101:13458:2176 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTATGTAAT
+GTAGTCTTTT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:13473:2178 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCGTTAGGAC
+AGTTC
+>HWI-ST960:105:D10GVACXX:2:1101:13435:2183 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTGAATAAT
+GAACTTTGAT
+TAA
+>HWI-ST960:105:D10GVACXX:2:1101:13272:2183 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTAAATCT
+CCCTTTTTTT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:13312:2186 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTGTGTAG
+AATCTGCTTA
+TAA
+>HWI-ST960:105:D10GVACXX:2:1101:13253:2186 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TAGTTTGGAC
+GTTGGTACAC
+GA
+>HWI-ST960:105:D10GVACXX:2:1101:13363:2187 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTGCTAAGG
+AAGTAAAAGC
+CAT
+>HWI-ST960:105:D10GVACXX:2:1101:13404:2208 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCACGACATT
+GCATTGTATG
+TTG
+>HWI-ST960:105:D10GVACXX:2:1101:13366:2209 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTATATGTT
+GTCGGTTCTA
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:13340:2212 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAATATGTT
+TCGTAGAACT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:13430:2220 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTATGTTTT
+GGATACATAA
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:13478:2222 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCATGGTGAT
+GAAACGAATA
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:13253:2222 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTATGGGTC
+TCTAGATGCT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:13357:2234 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTGTCTTTG
+GTGCCCATGC
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:13444:2236 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTTTACGA
+TTCATGGTTC
+TGT
+>HWI-ST960:105:D10GVACXX:2:1101:13383:2241 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATAATCTC
+TACTGTTTGT
+TCT
+>HWI-ST960:105:D10GVACXX:2:1101:13323:2243 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATTCTCAA
+TACTTTCTTC
+CTC
+>HWI-ST960:105:D10GVACXX:2:1101:13556:2177 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTTTGTAT
+AAACGGAATT
+TCT
+>HWI-ST960:105:D10GVACXX:2:1101:13647:2177 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCTTGATCA
+CGAACATAAT
+ATT
+>HWI-ST960:105:D10GVACXX:2:1101:13575:2184 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAGCTTGCA
+AGTTCTCTCT
+GAA
+>HWI-ST960:105:D10GVACXX:2:1101:13528:2185 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATAGTATG
+TTTGCGGATT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:13614:2188 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTTCTTTC
+GAGTTTTATG
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:13510:2190 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTGTCTTT
+CTCCTTCTCT
+TCT
+>HWI-ST960:105:D10GVACXX:2:1101:13692:2200 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTGCTTTG
+CTTAATTCAT
+TG
+>HWI-ST960:105:D10GVACXX:2:1101:13666:2203 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTCAAATTT
+CAATGAGATT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:13720:2208 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATCAGAGT
+GACTCAACCA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:13526:2209 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAGCCCTTT
+GTCGCTAAGA
+TTC
+>HWI-ST960:105:D10GVACXX:2:1101:13506:2209 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAATAATGT
+GTGTGGGACT
+TA
+>HWI-ST960:105:D10GVACXX:2:1101:13623:2212 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAATGGCAA
+TCGTCTCTCT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:13684:2220 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTATGGTC
+CCCACTGAGA
+ACT
+>HWI-ST960:105:D10GVACXX:2:1101:13646:2224 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTTTGTTA
+TAGATTCCTC
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:13506:2227 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAGGAACAA
+GGATTACAAG
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:13700:2234 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTATAAGCT
+GAGCGAATAT
+TAG
+>HWI-ST960:105:D10GVACXX:2:1101:13525:2242 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTGTTATT
+GGCCCAAGTA
+GA
+>HWI-ST960:105:D10GVACXX:2:1101:13744:2243 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTATGCTCT
+TTTAATGTGC
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:13514:2246 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTTTTCAA
+ACTGAGCAAA
+AAT
+>HWI-ST960:105:D10GVACXX:2:1101:13631:2249 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAGTTAATG
+TCTCTGAAAC
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:13611:2250 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAACGTAGA
+AACTCTTGGT
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:13873:2169 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGGGGGTCC
+CAGTTCCGAA
+CCC
+>HWI-ST960:105:D10GVACXX:2:1101:13832:2175 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTTGTGC
+CTTTTTCTCT
+TCT
+>HWI-ST960:105:D10GVACXX:2:1101:13756:2181 1:N:0: bcd:RPI1 seq:CACATCACGATC
+CACATCACGA
+TCACAGTCGG
+CTTACCCGGG
+GAC
+>HWI-ST960:105:D10GVACXX:2:1101:13888:2181 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTGAGAGA
+TTTCGTAAAA
+AAC
+>HWI-ST960:105:D10GVACXX:2:1101:13863:2184 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTTGGTTG
+GTGTAAAAAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:13978:2187 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTTGACTC
+TGTAGCTTTA
+CTT
+>HWI-ST960:105:D10GVACXX:2:1101:13770:2198 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCAACATAT
+GTTTCATAAT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:13874:2204 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCATAAAAGT
+TGTCGTAGCA
+TAA
+>HWI-ST960:105:D10GVACXX:2:1101:13985:2213 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCTCTTGAC
+TTGCCTCCTT
+ACC
+>HWI-ST960:105:D10GVACXX:2:1101:13941:2214 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGA
+TCTATTTATA
+TATTTGATGT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:13963:2214 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTCTGTCT
+ATTTCGTTAA
+ATC
+>HWI-ST960:105:D10GVACXX:2:1101:13752:2222 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCTTTGTCAA
+TTGTCATATT
+TGC
+>HWI-ST960:105:D10GVACXX:2:1101:13859:2223 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTCTGTTT
+CAATGTCCCT
+TGC
+>HWI-ST960:105:D10GVACXX:2:1101:13939:2238 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAGAGTCAA
+GACTCAAGAC
+TAT
+>HWI-ST960:105:D10GVACXX:2:1101:14180:2173 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCACAACAG
+CATATTTATA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:14103:2174 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAACAAAAG
+TGGCTGTAGT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:14196:2181 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTAGGTGT
+TACTGTGGAT
+TTC
+>HWI-ST960:105:D10GVACXX:2:1101:14128:2184 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTAATGTA
+GTAGCAACTC
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:14033:2191 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTGGTAA
+CTGGACTCTG
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:14074:2199 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTAATACA
+CTTTCCCTTA
+CAT
+>HWI-ST960:105:D10GVACXX:2:1101:14019:2201 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCTCTCTGT
+GATTCTCTTT
+TTA
+>HWI-ST960:105:D10GVACXX:2:1101:14232:2204 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAAGCTGGA
+AACTTTGAGC
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:14143:2204 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTTGTGG
+CACACTAAGC
+TG
+>HWI-ST960:105:D10GVACXX:2:1101:14121:2210 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTCTAGTAG
+CATGTGAATT
+TA
+>HWI-ST960:105:D10GVACXX:2:1101:14168:2213 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTATTCTAT
+CGGATTCTCA
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:14102:2217 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTGTATTTG
+ATCTACATTG
+TAT
+>HWI-ST960:105:D10GVACXX:2:1101:14036:2225 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTCCCGAAC
+TCTACGTAGA
+AAT
+>HWI-ST960:105:D10GVACXX:2:1101:14209:2227 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTACTCAA
+CACTCTCTTC
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:14087:2229 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTGAGTTCT
+TAGCCATTGC
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:14127:2230 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCACTCTGGA
+TTCAATTTGG
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:14472:2172 1:N:0: bcd:RPI1 seq:CACATCACGATC
+CACATAACGA
+TCCTCTGTGT
+CTCTCTCGAT
+CGA
+>HWI-ST960:105:D10GVACXX:2:1101:14402:2183 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAATAAAGT
+GGTCTAGTGG
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:14443:2185 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCTTTTACTG
+TCCTCTGATC
+AG
+>HWI-ST960:105:D10GVACXX:2:1101:14420:2208 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTATGTAT
+ATATAAGAGT
+CAT
+>HWI-ST960:105:D10GVACXX:2:1101:14467:2209 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTGAAACTG
+TACTTGAGAT
+TA
+>HWI-ST960:105:D10GVACXX:2:1101:14311:2215 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTCTTTAT
+GGCTCTAGTA
+CAA
+>HWI-ST960:105:D10GVACXX:2:1101:14442:2218 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAAAAATGT
+CGTTGTAGTA
+TAG
+>HWI-ST960:105:D10GVACXX:2:1101:14388:2226 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAATTCCAG
+TTGATTGAGG
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:14404:2228 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTGTTGTTG
+GCTATGATGT
+TAT
+>HWI-ST960:105:D10GVACXX:2:1101:14361:2234 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAAATTATG
+ATGGAAGATT
+TGT
+>HWI-ST960:105:D10GVACXX:2:1101:14303:2235 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCACATTTAG
+GCTCAGTGGG
+A
+>HWI-ST960:105:D10GVACXX:2:1101:14342:2235 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGCTCTTCA
+ACCTTAGAAG
+A
+>HWI-ST960:105:D10GVACXX:2:1101:14263:2238 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTACTTTC
+TCGTGCTAAC
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:14512:2169 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGCAATCCC
+TCTGTTTCCT
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:14677:2181 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTGACAGA
+AGATAGAGAG
+CAC
+>HWI-ST960:105:D10GVACXX:2:1101:14738:2194 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAATGTTCA
+TGTCTAAATT
+CG
+>HWI-ST960:105:D10GVACXX:2:1101:14684:2203 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAAGCCGGA
+GACAGGAGAG
+GTG
+>HWI-ST960:105:D10GVACXX:2:1101:14526:2204 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCACATAGAC
+TAATCTTATA
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:14580:2206 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAAATAAGG
+TATCAGGTTT
+TA
+>HWI-ST960:105:D10GVACXX:2:1101:14592:2223 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTTATAGG
+GAGAAGAAGA
+GGC
+>HWI-ST960:105:D10GVACXX:2:1101:14659:2235 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAATTGGTG
+CCTGTAGGTC
+AG
+>HWI-ST960:105:D10GVACXX:2:1101:14548:2237 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCAATTTTAT
+GTCGTTTCTT
+TG
+>HWI-ST960:105:D10GVACXX:2:1101:14962:2168 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAATCCACA
+CTAAGTCCAA
+GC
+>HWI-ST960:105:D10GVACXX:2:1101:14851:2171 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTATTTGTA
+GCAATTCTGT
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:14982:2172 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCGTAATCTG
+GGATGAACTC
+ACT
+>HWI-ST960:105:D10GVACXX:2:1101:14927:2184 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATTCTTGT
+TTAGAAGCAA
+GAA
+>HWI-ST960:105:D10GVACXX:2:1101:14906:2195 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGCCAACTC
+TGTTTCTTCT
+TCT
+>HWI-ST960:105:D10GVACXX:2:1101:14858:2195 1:N:0: bcd:RPI3 seq:CACTTAGGCATC
+CACTTAGGCA
+TCATTCGTTT
+CAATGTCAAT
+CTC
+>HWI-ST960:105:D10GVACXX:2:1101:14936:2201 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAGCCAATG
+TTGTAGAACT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:14780:2204 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTTGTGAA
+TCCTTTTCCA
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:14808:2217 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAATGAAGA
+GGCTGTTTCT
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:14828:2217 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATGTATGT
+TGTTATTTGA
+TAA
+>HWI-ST960:105:D10GVACXX:2:1101:14929:2217 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAACACTCT
+TATCAAAAAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:14844:2223 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCATACATCT
+TTGCAGAACT
+CAT
+>HWI-ST960:105:D10GVACXX:2:1101:14988:2233 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAGCTTAGA
+CTTGGTAGTT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:14821:2236 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAGTGTACT
+TGTGGACAAG
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:14761:2243 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATTTGTAG
+TCGTAAATAT
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:15030:2168 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTCTGTTA
+CACGCCGAGA
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:15079:2180 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTCAGGGCA
+AGCACAACAT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:15143:2186 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCATCTTTTT
+CATCCCAATC
+TGT
+>HWI-ST960:105:D10GVACXX:2:1101:15178:2193 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAGTGATGA
+ACCTTTTGAA
+CC
+>HWI-ST960:105:D10GVACXX:2:1101:15053:2195 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAATCCAGT
+CTCATCGCTG
+TTG
+>HWI-ST960:105:D10GVACXX:2:1101:15025:2214 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGA
+TCGTATGTAA
+AGGTTTACTC
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:15186:2216 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCAGAGCAAG
+TCGAAATCTG
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:15065:2224 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTGTGCTG
+GGAACTATTT
+GAC
+>HWI-ST960:105:D10GVACXX:2:1101:15143:2225 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATGAAAAC
+TTCTTGAGTT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:15008:2227 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCTTTCTTGG
+GACTTGATTT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:15207:2236 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTAGTGT
+GTAATGTTAT
+TGG
+>HWI-ST960:105:D10GVACXX:2:1101:15000:2247 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTTGGTCA
+TGTTTGCTAT
+TTG
+>HWI-ST960:105:D10GVACXX:2:1101:15274:2198 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCATCTGTC
+TAAAGTTTGT
+TCT
+>HWI-ST960:105:D10GVACXX:2:1101:15308:2216 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAGTAATTT
+AGCATGTTGC
+AAA
+>HWI-ST960:105:D10GVACXX:2:1101:15475:2222 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTCTGTAG
+TTGTATTTCA
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:15291:2232 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTATGTTG
+TTAGCTATCA
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:15347:2233 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTGAACTCT
+GACCAATGAA
+CTT
+>HWI-ST960:105:D10GVACXX:2:1101:15331:2245 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTGTTATA
+TATTACTGAC
+TAC
+>HWI-ST960:105:D10GVACXX:2:1101:15450:2248 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTGTTTTGT
+CCCTTTGTAT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:15691:2179 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTACTAGTC
+TCGTATTAAC
+TA
+>HWI-ST960:105:D10GVACXX:2:1101:15591:2179 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTTTGCTT
+ATGTGCCCGT
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:15612:2183 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATATCCTA
+TGTCTAAAAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:15528:2190 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCATTTCGGA
+TCTTGGCTAC
+TAA
+>HWI-ST960:105:D10GVACXX:2:1101:15503:2198 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAATCTAAA
+GGGATTTGGT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:15541:2201 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CAAACTTGAA
+TCGTCTGTAG
+CTCTAGACCA
+TTC
+>HWI-ST960:105:D10GVACXX:2:1101:15700:2204 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTAAATTC
+TCTTCCTTTG
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:15649:2217 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTAATGTGA
+TGGTTTCTTC
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:15573:2222 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAATAGCTA
+GTCATAACTC
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:15731:2236 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAATATGTT
+TCGTAGAACT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:15639:2244 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCTTTTACG
+GAGTACAAGA
+GAT
+>HWI-ST960:105:D10GVACXX:2:1101:15824:2174 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTATATGTC
+TGTACACAAT
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:15924:2187 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTATGAAA
+ATGTTGTGAA
+CTG
+>HWI-ST960:105:D10GVACXX:2:1101:15857:2189 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCTTAGGTT
+TAGAGCTAAA
+AAA
+>HWI-ST960:105:D10GVACXX:2:1101:15755:2216 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTATACTA
+CTAATACATT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:15970:2220 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCCATGACTG
+AAGTTGTTTG
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:15886:2223 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTTGTTTT
+ATTTCTTATT
+CAA
+>HWI-ST960:105:D10GVACXX:2:1101:15866:2238 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCTGTGTTG
+GCGTTTTATC
+TG
+>HWI-ST960:105:D10GVACXX:2:1101:15925:2243 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTTTTGTT
+GGATTGTTTT
+GCT
+>HWI-ST960:105:D10GVACXX:2:1101:15938:2248 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTCTTGTCC
+GTTACATTTG
+CC
+>HWI-ST960:105:D10GVACXX:2:1101:16016:2182 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCACTGTGTT
+GGCGTTTTAT
+CTG
+>HWI-ST960:105:D10GVACXX:2:1101:16084:2189 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAAATGTGA
+AATCTTAAAA
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:16060:2193 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCGAGAATGA
+TGAACCAATT
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:16022:2204 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCATGAGAT
+ACTGAATTCA
+AGC
+>HWI-ST960:105:D10GVACXX:2:1101:16131:2207 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTATGTAT
+GATCATATTT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:16147:2216 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCATTCAAAT
+CAGAGGCTTG
+TTA
+>HWI-ST960:105:D10GVACXX:2:1101:16171:2218 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTCTTCTTC
+GTTTGGCTAT
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:16114:2220 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTGCAGCAC
+TTGTCTGACC
+CAT
+>HWI-ST960:105:D10GVACXX:2:1101:16083:2223 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAATGTAGA
+GAATCGATTT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:16174:2241 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCACTTTGAG
+AACTAAAAAA
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:16002:2242 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTGGAGTTT
+TGGTTAGGTT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:16214:2243 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTTGGTAG
+ATGATAACAA
+ATC
+>HWI-ST960:105:D10GVACXX:2:1101:16126:2245 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATTGTTGT
+TGTTGTTGTT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:16191:2247 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCTGGAGAAC
+TTGGCAACTC
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:16438:2169 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATGTTCGG
+TTGTGGGATT
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:16355:2177 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTTGTTA
+GACTCTTCGA
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:16306:2182 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTACCTACT
+CGTCGTACAT
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:16427:2183 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGTTGATTT
+TAATGGTTAC
+TGT
+>HWI-ST960:105:D10GVACXX:2:1101:16368:2191 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATAAAAAC
+TCTGAATTTA
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:16496:2191 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTTCTGTTG
+AACCTCTTG
+>HWI-ST960:105:D10GVACXX:2:1101:16268:2194 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTCAAACC
+ATTGAGACAG
+CTT
+>HWI-ST960:105:D10GVACXX:2:1101:16478:2197 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCCTGTGAAA
+CTGCGAATGG
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:16378:2215 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTACGTTA
+TTTAAAATCC
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:16273:2227 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTGTTATGT
+GACTGGAGAG
+A
+>HWI-ST960:105:D10GVACXX:2:1101:16350:2227 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTGTGGCT
+CAGAACCACC
+AC
+>HWI-ST960:105:D10GVACXX:2:1101:16328:2230 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAA
+TCACTGATCG
+CGTCGTGTTA
+C
+>HWI-ST960:105:D10GVACXX:2:1101:16408:2232 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTTCGAAC
+AATGAACAAT
+TGC
+>HWI-ST960:105:D10GVACXX:2:1101:16369:2234 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTACATTGT
+GAAATGATAT
+TTC
+>HWI-ST960:105:D10GVACXX:2:1101:16305:2250 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCAAACCTG
+TATCTGTGTA
+ACT
+>HWI-ST960:105:D10GVACXX:2:1101:16647:2170 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTAATTGAA
+TATCTTCAAT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:16734:2178 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTACGAAT
+TCTAAATTTT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:16682:2192 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTATCAATA
+AGCGGAGGAA
+AAG
+>HWI-ST960:105:D10GVACXX:2:1101:16516:2203 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGAGAGTTC
+GAATCTGTCA
+GGC
+>HWI-ST960:105:D10GVACXX:2:1101:16583:2204 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATCGGCGC
+TTGTTCACCT
+CTC
+>HWI-ST960:105:D10GVACXX:2:1101:16633:2220 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCATTGTATT
+TTAACAGCAC
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:16696:2231 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTATGTAAT
+GTAGTCTTTT
+AT
+>HWI-ST960:105:D10GVACXX:2:1101:16666:2233 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCTTAACAC
+TTGGTTCCGT
+TTC
+>HWI-ST960:105:D10GVACXX:2:1101:16730:2240 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCCTATAAA
+TCGTCTCATG
+AA
+>HWI-ST960:105:D10GVACXX:2:1101:16561:2240 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATAACCCT
+TTCCAGGCCA
+TGT
+>HWI-ST960:105:D10GVACXX:2:1101:16708:2243 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCACCATTG
+TCTGAATAAA
+AAG
+>HWI-ST960:105:D10GVACXX:2:1101:16847:2173 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCGATGTCGG
+CTCTTCCTAT
+CAT
+>HWI-ST960:105:D10GVACXX:2:1101:16809:2177 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCACATCCTC
+ATAATCACTT
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:16946:2180 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTCTTTTG
+TCGGCGTTAG
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:16831:2183 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTATGTTAT
+GGATTCAAAA
+AAA
+>HWI-ST960:105:D10GVACXX:2:1101:16770:2187 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTCAGCCCT
+TTGTCGCTAA
+GA
+>HWI-ST960:105:D10GVACXX:2:1101:16858:2188 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAATTTTTA
+GTGACCCTTT
+TA
+>HWI-ST960:105:D10GVACXX:2:1101:16876:2193 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTATGTTC
+TCTGTTATTC
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:16983:2194 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCCTTTGTGG
+GTTGAGTTGT
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:16842:2205 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTATGAAA
+TCGACCATGA
+CA
+>HWI-ST960:105:D10GVACXX:2:1101:16962:2210 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTCATGCT
+GTTTTCCAAC
+AGC
+>HWI-ST960:105:D10GVACXX:2:1101:16751:2219 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTACTGTT
+TTCTGTTTTC
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:16898:2223 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCAACCCCCG
+AACTATATCC
+TC
+>HWI-ST960:105:D10GVACXX:2:1101:16969:2228 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCATTATCTT
+GTAGAATGTT
+CA
+>HWI-ST960:105:D10GVACXX:2:1101:16781:2240 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTTCTCCT
+CTCGTCCATA
+AAT
+>HWI-ST960:105:D10GVACXX:2:1101:17222:2169 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTGGATCCT
+GTTTTGGATT
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:17028:2180 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATA
+TCCTATTTAC
+TATTTGAAAA
+AGC
+>HWI-ST960:105:D10GVACXX:2:1101:17127:2184 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCAATTGGAC
+TGTTTAACGT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:17143:2189 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCAAATTTCT
+ATATATTGTT
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:17161:2201 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCTTCTGGAC
+ATTAGCCATT
+AGT
+>HWI-ST960:105:D10GVACXX:2:1101:17133:2206 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCTGCCTTTT
+CCTTCTTGTC
+GG
+>HWI-ST960:105:D10GVACXX:2:1101:17121:2224 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGGCACTTC
+TGTTCTGATC
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:17033:2228 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCACTAGACA
+AACTCTCAAG
+A
+>HWI-ST960:105:D10GVACXX:2:1101:17178:2238 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGTTTGTAG
+TCATAATTTA
+GT
+>HWI-ST960:105:D10GVACXX:2:1101:17141:2241 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGA
+TCGTATGTTT
+CACTCTGTAA
+CT
+>HWI-ST960:105:D10GVACXX:2:1101:17119:2246 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCGAGACCAG
+ATGTGCGATG
+TTT
+>HWI-ST960:105:D10GVACXX:2:1101:17246:2247 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAA
+TCATTTGGTT
+AGGTCCTTTG
+TTC
+>HWI-ST960:105:D10GVACXX:2:1101:17011:2248 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTTTTGAGG
+TTTTAAGATG
+TT
+>HWI-ST960:105:D10GVACXX:2:1101:17469:2169 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCA
+TCTGTGTTGG
+TGAAGGAAGG
+AAC
diff --git a/src/libqes/test/data/test.fastq b/src/libqes/test/data/test.fastq
new file mode 100644
index 0000000..c66fd84
--- /dev/null
+++ b/src/libqes/test/data/test.fastq
@@ -0,0 +1,4000 @@
+ at HWI-ST960:105:D10GVACXX:2:1101:1151:2158 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAANGACATTGAATCTATATGT
++
+JJJJJJJIJHIJCC#4ADFFHHHGHJJJJIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1205:2165 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTGNATTCTTCTTTTGGAACTC
++
+JIJIJJJJJIIIBC#4ADDDHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1122:2186 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCAGTTTAAAGTTAACTCATTG
++
+JIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1229:2187 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTGAGTTTTTGGACTGTACAT
++
+IJJJJJJJJJJJCCCFFDFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1175:2195 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTAATTGTCACTGTTTCACCC
++
+IJJHHIJJJJJJCB at FFFFFHHHHHJJJJJIGJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1175:2224 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTGTGACTCTGTTCCTGTTGT
++
+IJJJJJJJJJJJ at BCFFFFFHHHHHIJJIIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1204:2232 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATCACAGAGCAGCAGTATTTC
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJHIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1237:2239 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTACACACGTATATGCAATAC
++
+IJJJJJJJJJJICCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1123:2239 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAATAATGTGGTATTAGTCTG
++
+JJJIJJJJIJJJBCCFFFFFHHFHHJIJIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1155:2246 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAGCCACTGAACTAAAAAAAAA
++
+HFFFFFEEEEEECCCFFFFFHGHHGJJJJJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1466:2165 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTGNAAACGCATGTAGATGAT
++
+JJJJJJJJJJJJCC#4ADFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1443:2173 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTACCAAAGTCTGAATGATTAT
++
+IJJJJJJJJJJJCCCFFFFFHHHHGJIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1360:2176 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCCGGCTCTGTCTCTCTCTCCC
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1272:2183 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATCATTTAGAGGAAGGAGAA
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJIIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1423:2185 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTATGACGTCAAATTATGCCT
++
+JIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1398:2186 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAAAAAAAAAAAGAATAAAGAA
++
+C at CBBAABCCCC@@@DDDDDHHFDFIBFHG<FH
+ at HWI-ST960:105:D10GVACXX:2:1101:1333:2199 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTATTACAAAGTTTACATCTCT
++
+JJJJJJJJJIJJCCCFFFFFHHHHHJIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1388:2214 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTCGTCTTCCATTTCTATTT
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1366:2229 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTATGTATATGCTGTGGTAG
++
+JIIJJJJJJJIJCBCFFFFFHHHHHJIIJFFG
+ at HWI-ST960:105:D10GVACXX:2:1101:1297:2232 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCATTCATGTTGATATATTTAT
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1374:2245 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTGTGTGTCTGAAGTAGTTGA
++
+IIIIGIIJJJJJ@@CFDDFFHHHHFJGIIIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1277:2249 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATGTTTCAGACTTCGAGAAGC
++
+JJJJJJJJJGIHCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1425:2250 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTATATACTTCACAACTCTG
++
+JJJJIIJJJJJJCCCFFFFFHHHHHJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1714:2160 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTNGTATGAACTCTGGTTTA
++
+JJJJJJJJHJJJ@@#4ADDFHHHHHJJJIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1601:2174 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGATCTTTTACGTAGACGATGTGCC
++
+IGJJJJJCDHGICCCFFFFFHHHHHIJIIGIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1581:2174 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCAGTTGAGGAACTATTGTTTC
++
+HIJJIIIJIIIJCCCFDFFFHHHHHJJJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:1717:2186 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCAATCTTTGTACTGTTGAACAA
++
+HIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1538:2187 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAACTGTTTGTGTCAATCATT
++
+JHJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1687:2195 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTGTCCTTCGGATCACTCAA
++
+IGIIJJJJJJJJCCBFFFFFHHHHGJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1589:2195 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTGAGCACAAAGATGATCAAAC
++
+JJJJJJJIJJJJCCCFFFFFHHGHHJJIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1611:2205 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTGAGAGTAGCTCTGTTTAT
++
+IJJJJJJJJJIJCCCFFFFEHHHHHJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1672:2207 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTATATTTGATACATCGGTTC
++
+IIJJJJJIJJJJCCCFFFFFGHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1595:2220 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTCTGACTGATGAACATATTT
++
+IDHIIJJIJEIGCCCFFFFFGFHGFHIIIGIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1706:2224 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTGTGCAATTAGTGCAACTGA
++
+JJJJJJJJJJJJCCBDFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1575:2228 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCGTTTGAGACTCTATCTTACCT
++
+JJJJJJJJJJJJ at CCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1557:2229 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATTTTTGTGTGTACTTGTCC
++
+IGIJIGIJGGGH at CCFFFFDHDHHHJIJGHIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1747:2233 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTATATACAATTGTGGACTAC
++
+IIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1835:2159 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTNAGTTTCTTCTTCATTGT
++
+JHJJJJJJJJJJ at B#4ADDFHHHHHJJJJJIG
+ at HWI-ST960:105:D10GVACXX:2:1101:1976:2160 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCACNAGGTCGAATCGAAATGT
++
+HAHIIJJIJJIH@@#4ADADDHHHHIIJJJII
+ at HWI-ST960:105:D10GVACXX:2:1101:1781:2164 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTNTGTGTTGTTGACTCTGT
++
+JJJJJJJJIJJJCB#4ADDDHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1903:2165 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATNATCAGAGACTAAAGTAGT
++
+IJJJJJJJJJJJ at C#4ADDDHFDHHJGIGEIGH
+ at HWI-ST960:105:D10GVACXX:2:1101:1854:2165 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATNATATCCTACTACAATGC
++
+IIIFBGDGCGII@@#4ADD=FHDHHGIGIIII
+ at HWI-ST960:105:D10GVACXX:2:1101:1756:2166 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATNTGGTCGATATGTCTTTT
++
+HGJJJJJJJHHHBC#4ADDFHHHHHJIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1921:2172 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTTTTAGAACTCTTTTCCTA
++
+FHIIB8CHGIII@@<DDD?DH??FFEDHGC@@
+ at HWI-ST960:105:D10GVACXX:2:1101:1992:2192 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTTGTTGGGGTAAAAAAAAA
++
+@@CE@?BCACDCBCCFFFFFHH at FHJJJJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1925:2197 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTAAGTGTGATTCTTTTGG
++
+GDHIEHJJGEGH@@BFFBDEHHHGHIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1792:2234 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTAAAGTCATGTCTTTGTTGT
++
+HIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1771:2239 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGGTGACCGAGAAATGTTTAA
++
+IIIIIIIIIIFF@?@DDDDD?CCF:EGG at G@D
+ at HWI-ST960:105:D10GVACXX:2:1101:1915:2243 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTCAGTCTAACTAAAGTATT
++
+IJJIJJJJJJJJ@@BFFDEFHHHHHJJJFHJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:1899:2246 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCACTAATACAATTGTTGCTC
++
+JJJJJJJJJJJJ at CCFFFFFHHHHHGHGHHII
+ at HWI-ST960:105:D10GVACXX:2:1101:2023:2160 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTANAATTGTGTGTAAAGTAA
++
+IJJJJIJJJJJJ@@#4ADDFHHHHFHIIJHIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2059:2162 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTANTGGGAACATAAATGAAGG
++
+FCFAEFHGCEAC@@#4ABBDHDHFFFHIGIIIH
+ at HWI-ST960:105:D10GVACXX:2:1101:2077:2163 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTNGGTTCCGAGGCCCTCTC
++
+@=CAHHEFFFFC@@#4AABDHHFHFIGIIGIG
+ at HWI-ST960:105:D10GVACXX:2:1101:2182:2164 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTANCTTCTCTGTTATGTCTC
++
+JJJJJJJJJJJJCC#4ADFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2049:2181 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGTTCTTGTACTACAGTGAT
++
+HGIFGGCDFGIH:??DBDDBFBFDHGIEADCI
+ at HWI-ST960:105:D10GVACXX:2:1101:2035:2185 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATGTAGAATTCAGAATGTCT
++
+IIJJJIJJJJJJCCCFFFFFHHHHHJJJJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2214:2203 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCTGTACACGGCTTAATTTATT
++
+JJJJIJJJJJJJCCBFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2244:2217 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCGGTTTGAGTGTTGCAAATCT
++
+==BCC at C@D at 77??<A?D?BC2<DDCEEEE at BF
+ at HWI-ST960:105:D10GVACXX:2:1101:2185:2223 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCAACAAGGTCGTTGTAGTATAG
++
+IJJJJJJJJJJJCCCFFFFDHHHHHJJJIIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2067:2226 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATTCCATAGATTGTAGCCTC
++
+IGIJJJJJJJJJCCCFFFFFHHHHHIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2032:2227 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTTTGTTAGTTACGCTTTGC
++
+JIIIJJJJJJJJCBCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2011:2230 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTAATATGATATGAAAATCT
++
+JJJJJJJJJJJJCBCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2444:2173 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTTCCTGTGATTTGCAATTTC
++
+HJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2254:2194 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCCATAAAAAGTCTCTACAAT
++
+JJJJJJJJJJJJCCCFFFFFHHFHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2448:2203 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAGAAGAAAAAGATGACCAGCT
++
+HIJJJIIJJJJJCCCFFFFFHHHHHIJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2342:2213 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAATGTTCGACTGTGAACCTTC
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2268:2215 1:N:0: bcd:RPI3 seq:CACTTAGGCATC
+CACTTAGGCATCAATATCAGAACTCGTTATATT
++
+IJJJJJIIJJJJBBCFFFFFCDFFHJHIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2411:2223 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGATCGCAACTGTAGCAAGAAGAAAC
++
+GIJJJJJGIJJICCCFFFFFHHHHHJJJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2292:2229 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTTTACTTAAAGAGCCCTAAC
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2448:2233 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATGAGTGTAGGCTTACTTAC
++
+HIJJJJJJJJJICCCFFEFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2389:2235 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTCGATCTGGTTTGTAGAAC
++
+IIJJJIJJJJJJCCCFFFFFHHHHHJHIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2607:2158 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTNAACCTGTAGTAATGAAG
++
+IJJJJJJJJJJJCC#4ADFFHHHHFHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2633:2162 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAGNATGAACTCATGAACTTTT
++
+HIJJJJJJJJJHCC#4ADFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2513:2166 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTANGTAATGTAGTCTTTTAT
++
+JJJIIJJJJJJJCC#4ADDFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2675:2178 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTAAGTGAACTCTGTGCGTCT
++
+JIJJJJJJJJJJCCCFFFFFHHHHHJJJJJHIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2548:2190 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAATCTTCTGTTGACTCATGT
++
+JIJIHJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2610:2203 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTAGTATCAATTGAACTTTT
++
+IJJJJJJJJJJJCBCFFDFFHHHHHIJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2657:2203 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCATATATATATAAATGCAGAC
++
+FHJJJIJJJJJJCCCFFFFFHHHHHJJIIJIII
+ at HWI-ST960:105:D10GVACXX:2:1101:2576:2213 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATATTTTTCCCACTGTGTTCT
++
+HIJJJJIJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2626:2215 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGAGAACTCTAGAAACCTGCTT
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2660:2219 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTCTACAATGTACTGGAAACTT
++
+JJJIJHEEGIII@@@FFFFEFFDDDFGHGHIGI
+ at HWI-ST960:105:D10GVACXX:2:1101:2509:2223 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTCAAACTTTATGTAAACTCT
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2536:2233 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCATACCAAATAGAATTTCTG
++
+HIJIGHEGGIGACCCFFFFFHHHHFFHGJJII
+ at HWI-ST960:105:D10GVACXX:2:1101:2584:2233 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTGTGCCTGGATTAATATGA
++
+IJJJIJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2674:2235 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATGCAACTGCAAATTCTGCA
++
+IIIJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2718:2235 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCACGGAACCAGTGACCGTCGT
++
+IIJHHGHHHHHFCCCFFFFDHHHHHJIEIIIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2630:2245 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTACTTGAACAGGATCTGTT
++
+?FGBGECHEHE9111442=BFFHHHHGEADDA
+ at HWI-ST960:105:D10GVACXX:2:1101:2808:2165 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCACNTGTGATTGTAGTCATGT
++
+IHJIJJJJJJJJCC#4ADDFHHHHHJIIJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:2922:2166 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCTNACTGGCGGCGAGAATAT
++
+DDDDDDDDDDDDBC#4ADDFHHHHHJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2869:2185 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCTCCGATGATGATCAAATCAT
++
+HJJJJIJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2917:2207 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAAGTCTCGCTTATGACTATGA
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2789:2236 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATATTGGTCTGTATTGTGCTC
++
+FGIIJGIIIIJIC at CFFFFDHHHHHHIJHIIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:2841:2242 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAAGAACTAACAGATATATGT
++
+IEIJJJJJJJIJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3131:2158 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATNGACTTAACAAGTTGGTCT
++
+IJJJJJJJJJIJCC#4ADFFHHHHHJHIJJGIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3006:2164 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTNTTCAGCTACATGCTGAC
++
+IJJIJJJJJJJJCB#4ADFFHHHHHJFIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3043:2167 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGANAAGAACCAAAACTATAA
++
+JJJJJJJJJJJJCC#4ADDFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3188:2167 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAANAGTGGTGGATTAGTAGT
++
+JJJJJJJJJJJJBC#4ADDFHHHHHJJJHIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3211:2194 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTATGTAATGTAGTCTTTAAA
++
+JJIJJJJJJJJJCCCFFFFFHHHHHIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3145:2195 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTGGCTGTGGAGTAAAAAAAA
++
+HFHHDFFFDEEE at CCFFFDFHHHDHEHIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3082:2195 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCACTGTGTTGGCGTTTTATCT
++
+JIJJJJJJJJJHCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3160:2208 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCACTTGTTGGCCAAAAAAAAA
++
+FFFFFEEEEEEECCCFFEFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3135:2214 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCGACAGGAGAGGTGATCGGAGT
++
+############?=?D;2=2CDB22C:<A:??F
+ at HWI-ST960:105:D10GVACXX:2:1101:3213:2220 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTGTTCTGTTGAAGGAGCTTTT
++
+HIJJJHIJJIHHBC at FFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3036:2225 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTATATACTTCACAACTCTG
++
+IJJJJJJJJJJJCCBFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3140:2228 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAGCAAATAAGTCAAAACTTT
++
+HGHIGGHHHIGIB at CFFDDDFHFFHJJIIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3106:2228 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCTTAGCTCGACCTAACACTT
++
+IIJJJJJHHHHHCCCFFFFFHHHHHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3085:2237 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCTCATCAACTTTGTCTCTGCTT
++
+HJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3151:2243 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAATTCCATGTACTTACATTCC
++
+JJJJJJJJIIJICCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3041:2247 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTGTAATACCTTTTATATATAG
++
+IJJJJJIDHIJJCC at FFFFFHHHHHJJJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:3218:2248 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAGCCCAAACTGCATGCACAT
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3400:2159 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTNGAACTCTTCTTGGCTGC
++
+JJJJJIGEGIIJCC#4ADDFHHGHGIIIIIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3487:2160 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTNGACATATATCAACTTTAC
++
+HIJJJJJJJJJJCC#4ADDFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3325:2162 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTNATATTTCGTTGGACTGT
++
+IJJIIJJJJJJJCC#4ADFFHHHFHIIJJIIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3342:2163 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTNGTTACTTTGATCCTGAA
++
+IJJJIJJJJJJJCC#4ADDFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3432:2166 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGCNCTGTGATTGCTTCGCCT
++
+JJJJJIJJJJJJCC#4BDDDHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3370:2167 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATNTCAAAGTGTTTCTTTGTT
++
+HIJJJJJJJJJJCC#4ADFFHFHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3440:2193 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTTGGATTGAAGGGAGCTC
++
+HIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3302:2194 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCAAGTCATGACTCATGAGCTA
++
+FHIJJIJIJJJJCCCFFFFFHHHHHJJJJJJII
+ at HWI-ST960:105:D10GVACXX:2:1101:3369:2202 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATTGTCATATTTGCGATGTAT
++
+HJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3257:2202 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTATGTAAACTCTCGTGTGGCT
++
+FHIIIGIJIJJHCCCFFFFFHHHHHJHJHIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3285:2210 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTGAGATGCAAAACAGTAGTTT
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJHIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3316:2236 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTAAATCTTAATCTCAAAT
++
+IGIIIIIJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3555:2158 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTNGTAATCTGACTCTCTTT
++
+IJJJJJJJJJJJCC#4ADDFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3609:2161 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAANGTTATGTTCTGGACCTAA
++
+HEHHIHCHGIIICC#4ADDFHHHGGIIEHGIII
+ at HWI-ST960:105:D10GVACXX:2:1101:3629:2162 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTNTTATGTAGAACTAAGAT
++
+JJIEFIJJIIIJCC#4ADDFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3522:2164 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTNAGTTCTTTTGTGCCTTC
++
+JJJJJJJJJJIJBB#4ABDDHHHHHHIJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3597:2170 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTCCCCCGTGAGTTACTTCAC
++
+HIIGG at ADHHHH@@?ADDDDCFHDHGIBGEGH@
+ at HWI-ST960:105:D10GVACXX:2:1101:3651:2176 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTATATGTAGGCTAAAAAAAAA
++
+HEEDFFFFEEEEC at CFFFEFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3568:2179 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTATTTATGTTTTGGACTTGT
++
+HGHIJJJJJJJJCCCFFFFFHHHHGJIJJJIH
+ at HWI-ST960:105:D10GVACXX:2:1101:3545:2181 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATGTGTGTTGTGGTTTTTAT
++
+FCHIIIGIIHIG@@@ADBDDFHFFHFHGIIJG
+ at HWI-ST960:105:D10GVACXX:2:1101:3669:2182 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCACTGTGTTGGCGTTTTATCT
++
+JJJJJJJJJJJHCCCFFFFFHHGHHGIJIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3587:2184 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTAAGTGTAGAATGCATACAA
++
+IJJGJGIIIJJJCCCFFDFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3570:2218 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGTTGTATGATTGAAGAAAT
++
+JJJJJJJJJJJJCCBFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3530:2235 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTAACGAAAACTATTTAAAAT
++
+HIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3706:2247 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAAGGCGAGTGTATCTCAACAA
++
+IJJGHIHGHHHF at CCFFFFFCFDDHHIGIHHGJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3809:2165 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAANCTGTAGTTTTCCTTCCTT
++
+IJJJJJJJJJJJCC#4ADDFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3872:2165 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTGNGGTAGATATGAGGTTAA
++
+JIJIJJJIJJJJCC#4ADDFHHHHHJJJHIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3775:2173 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTACATTAAGGCAGTTCATTG
++
+IJJJJJJJJJJJCCCFFFFFGHHGHJIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3902:2188 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTCACAAATGAACTTAAACT
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3885:2192 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTACCTACTCGTCGTACATTTT
++
+==CCDCEE??AA@;@DDDDDAHDHFIIGGE at HH
+ at HWI-ST960:105:D10GVACXX:2:1101:3807:2204 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCATCTCGGACCAAAGAGAGC
++
+JJJJJJIJHHHHCCCFFFFFHHHHHJJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:3780:2206 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTGCATGTTGTGCACCGGCTCC
++
+GHJIHHHHFFFFCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3853:2215 1:N:0: bcd:RPI3 seq:CACTTAGGCATC
+CACTTAGGCATCTCCGATGATGATCAAATCAT
++
+JJIGGIIJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3946:2218 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTAGTCTTTTGGTATTTTA
++
+JJJJJJJJJJJJCBCFFFFFHHHHHGHIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3976:2221 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATTGTTCGGCTTTGGATTAAG
++
+IJJJJJJJJJJHCCCFFFFFHHHHHJJIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3866:2227 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAATACGATATGTATATGTAC
++
+JHJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3816:2234 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTAGGTCTTGTGTAGAAACT
++
+JJJJJJJJJJJJCBCFFEFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3779:2243 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTTTGAGTTTCGAGTTATCTG
++
+JJJJJIJJJIIICCCFFFFFHGHHHJHIIJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3799:2247 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATTCTATCTACTACTTTTTC
++
+JIJJJJJJJJJJ at BCFFFFFHHHHHIJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3759:2247 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAACTAGTATAGTCAGAAAAT
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:3912:2249 1:N:0: bcd:RPI3 seq:CACTTAGGCATC
+CACTTAGGCATCATGTGAACAAGAACATATCCT
++
+IJIJHIHJJJJJCCCDFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4038:2162 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCGTNGATTGAGGTCGGCAACAT
++
+JJJIHHHFFFFFCC#4ADFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4099:2173 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCTTGGCTCATGAAGTAAAATAA
++
+HIIJJJJJJJJJCCCFFFFFHHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4193:2190 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCACTTTACAGCTTCTTCTTAT
++
+IJJJIJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4045:2192 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCACTGTGTTGGCGTTTTATCT
++
+IJJJJJJJJJJHCCCFFFFFHHHHHIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4171:2195 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGATCGAAGTTGAAGAACCTATAA
++
+HIJJJJJEHIIJCCCFFFFFHHHHHJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4159:2232 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCGTATCAAACGTAGAGGCAG
++
+IIJIJJJJJHHH@@@FFFFFHHHHHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4186:2233 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTTAGTCAGCTGCAACACTTT
++
+IJJIJJJIJIJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4072:2235 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTAACACCAAACAACTCTTTCT
++
+HJJJJJJJIJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4053:2236 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTTGGAGGTTTGAGATATAA
++
+JJJJIJJJJJJJCCCFFFFFHHHHHJIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4001:2239 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTCAAATGAGAACTTTGAAGGC
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4493:2158 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAGNCGTTTGGACGTTGGTAC
++
+HHIIIIIIIIIH@@#4=DDDHFFHFE=DHACH
+ at HWI-ST960:105:D10GVACXX:2:1101:4487:2169 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAAGCATGTAGTTTGATGATC
++
+IIIGGICFHHII@@@DDDDDHDCABEBEBG>F
+ at HWI-ST960:105:D10GVACXX:2:1101:4487:2182 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAAATTGTTACGCAACAAACT
++
+HFI85DDBCEHH@@<BABADFDDDFGAFGHGC
+ at HWI-ST960:105:D10GVACXX:2:1101:4428:2194 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTAAATATTTTTTCTATTCA
++
+8/=CC68.8=;=@:?BBD;AFBFFFBAGII<A
+ at HWI-ST960:105:D10GVACXX:2:1101:4264:2201 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCACTTAATCTGAGTCTCTGCTT
++
+IIJIJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4422:2216 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCACTTTACACGACAAAATAA
++
+HGIJIJJJJJJHCCCFFFFFHHHHHJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4332:2220 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTTCCGAGTACAACTTTGG
++
+JIIIJJJJIJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4424:2238 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTAATCTTGTGTCGGCAGGTGT
++
+HIJIHHHFFFFFCCCFFFFFHHHHHJJJJJBGH
+ at HWI-ST960:105:D10GVACXX:2:1101:4369:2249 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCGATAATGATGATGAAAGATG
++
+IJJJIJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4279:2250 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTATGTAGAACTCTTTGCTT
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4589:2160 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTGNTTTGTTTGGTACTGAAA
++
+IIIIIIIIIIII@@#4=BDDHFHHFHIIIIII
+ at HWI-ST960:105:D10GVACXX:2:1101:4565:2165 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCACNTGTGAAAATCTGATTAT
++
+IIIGHIIIIIII?@#4ADDFFHHHHIIIIIII
+ at HWI-ST960:105:D10GVACXX:2:1101:4583:2173 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTAGTGAAATACACTCTCT
++
+IIIIIIIIIIII??:B?ABBAB?DHGDHG>>@
+ at HWI-ST960:105:D10GVACXX:2:1101:4599:2173 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTGTTATCGTGTCTGTAAGC
++
+JJJJJIJJJJJJ@@@DFFFFDHHBHIIJGJGB
+ at HWI-ST960:105:D10GVACXX:2:1101:4699:2181 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTGCCTTCAAGTTAACTTTGT
++
+GIIHIHIJIJJJ@@BFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4615:2183 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAGTCTTCTTCTTCTGTATTA
++
+DBGDEHGIGG at C@@@FDDFDDFFHFHBAGDII
+ at HWI-ST960:105:D10GVACXX:2:1101:4505:2183 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATCCTATGCTTTGGTCATAT
++
+IIIGIGGGGIII@@?DDADDH?FHFE<CEHFH
+ at HWI-ST960:105:D10GVACXX:2:1101:4515:2195 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTACTTAGACTCATGCTTGT
++
+HIJJIJJJJJJJCCCFFFFFHHHHHJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4695:2199 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCAATGACTGTAACTTACTCTTC
++
+HIJIHIJIJIJJ at CCFDEFFDHHHHIJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4586:2200 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTATAGGAATCTGTAACTTTT
++
+IJJJJJJJJIIJCCCFFFFFHHHHHIJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4624:2201 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTATTTGCGATGTATCATGTAT
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJHJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4717:2204 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTTTGGTTTATTTACATGTTT
++
+JJJIJIJJIIJJ at BCFFFDFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4738:2224 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATAGCTTCTCTGTTATGTCT
++
+HIJJIJJIJJJJCCCFFFFFHHHHHJIJJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4745:2243 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTGATATCTAAGCTTATGT
++
+JJJJJJJJJJJJCBCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4619:2246 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTCAGATTTCTTACATTCAA
++
+IIJIJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4707:2246 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCAGTGTTTGTCTGAACTCTG
++
+IGIIJJJJJJJJBCCDFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4784:2161 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTCNGTACTGGTACTGTAATA
++
+JIJIJJJJIJJJ at C#4ADDFHHFHHJJHEGHJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4903:2162 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATNGACAAGTTGGTTTCGAT
++
+IIJJHIJJJJJJCC#4ADDFHHHHHGIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4957:2163 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTNTGTCCTCCAGACAACCC
++
+HIJJJJJJJJHHC@#4ADDFHHHHGJGGIJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4807:2163 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCTNGTTTGTGGTTAGTGTCA
++
+IIJJJJJJJJJJBC#4ADDFHHHHHJJHIIIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4863:2165 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATNGTTGCGTAAGAATCAGGA
++
+HJJHHIJIIHHHBC#4=BDDHHHHGIJGIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4754:2182 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATCGTCGTCAAGCCTGCCAC
++
+HGJIGIJHHHHHCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4768:2182 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAAACTTCTCTGTTTAGTTTGT
++
+BDFFGDHIDHDF@@?DDDDDHHDDDFCH<?EEH
+ at HWI-ST960:105:D10GVACXX:2:1101:4842:2184 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTAATCATTATAGAGATGGT
++
+HIJIJJJJJJJJCCCFFFFFHHHHGJJJJJJH
+ at HWI-ST960:105:D10GVACXX:2:1101:4964:2184 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCAAGTCATGACTCATGAGAT
++
+JIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4787:2188 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAACAAACTTGCATGTCGGCAC
++
+IJJJJJJJHHHHCCCFFFFFHHHHHJIJJJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4867:2194 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTCTTCTTTCCAATCTTATCAC
++
+JJJGIIJJIJJJ@@@FFFFFHHHDFGIGGIHII
+ at HWI-ST960:105:D10GVACXX:2:1101:4934:2200 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTTGTAGTAACTGAAAACG
++
+IIJIJJJJJJJJCBCFFFFFHHHHHJJJIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4988:2205 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCTTCTTTCTCGAGAAATCGG
++
+JJJJJJJJJJHHCCCFFFFFHHHHHIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4973:2209 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGCTGTAATTACAGATTGAA
++
+JJJJJJJJJJJJ@@CDFFFFHHHHGIJIJIGG
+ at HWI-ST960:105:D10GVACXX:2:1101:4783:2210 1:N:0: bcd:RPI3 seq:CACTTAGGCATC
+CACTTAGGCATCGATGAATACATCATGGTAGTG
++
+IJJIJIGHIIJJCCCFFFFFHHHHHJJJGHJII
+ at HWI-ST960:105:D10GVACXX:2:1101:4861:2212 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTATGTTTAGTTTAGAAGAA
++
+FHIIJIJJIIIJ@@@FFFFFHHBHHJIJIIGJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4929:2223 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAACTGTGTCTCATCACTCAA
++
+IIJHJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4966:2233 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATATTCAAACTCTTGGACTGA
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:4877:2249 1:N:0: bcd:RPI2 seq:CACCGATGTATC
+CACCGATGTATCCTTCCTACTTGAAGAAGGTTG
++
+IJJJIIJJHHHHCCCFFFFFHHHHHJJJJJHIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5072:2160 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGCNTGTCCCTTACTCTGTAT
++
+JIJJJJJJJJJJCC#4ADFFHHHHHJJIIIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5006:2164 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCTNTCCTCTGAATATTTCTA
++
+HGIIJJJJJJJICC#4ADDFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5029:2168 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGATCTTTTGGTTCTGTAGACACAC
++
+IJJJJJJGIJJICCCFFFDFHHGHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5174:2170 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTATATAATATTCCCTAAGAA
++
+JIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5153:2178 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAATACCCCGAAAATTAGATC
++
+JJJJJJJJJHHHCCCFFEFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5078:2188 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTCTTGGTCTGGTGGTAACAAT
++
+HIJJJJJJJJJJCCCFFFDFHHHDHIGHIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5182:2192 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATTTGTCAACTTCAATTTCAG
++
+HIJIJJJJJIJJCCCFFFFFHHHHHJJJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5054:2198 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTACTGTATCTCATTAGCTGA
++
+HIJIJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5208:2202 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTATGTTTCTCTTGGAACGAA
++
+HIJIJJJJIJJJCCCFFFFFGHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5105:2206 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCATGAACTGTATTAAACTTTT
++
+JJJIIJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5029:2212 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAACATTTCGAACAATGAACAA
++
+HIJJJIJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5084:2222 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTACCTCTCTCTGACTTCAC
++
+IJJIIJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5223:2223 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCCGGAGTTTTTTCAGCAGTTC
++
+JJJJJJJHHHHHBCCFFDDFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5173:2228 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTATGTGTAATGATTCCTTC
++
+JIJJJJJJJJJJBB at FFEFEHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5208:2240 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATTTACTTTGATCAGAAATT
++
+JJIFHIIGHIJJ at BCFFFFFHHGHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5101:2247 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAAACTCTACCTTTATTACAGT
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5189:2247 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCTACAAAACTTTCTAATTTG
++
+IHJIJJJJIJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5018:2248 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTATGTAGAATATGAGTTTA
++
+IJJJJJJJJJJJBBCFFDFFHHHHHJJJHIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5160:2249 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTGCTTGATTTTGAAGTTAG
++
+IJJJJJJJJJJJCCCFFFFFHHHHHIJJHIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5491:2158 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTCNCTAAGATTCGACCCTCCC
++
+HIJJJJJHHHHHCC#4ADDFGHHHGIJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5363:2158 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTNTGATTGTAGTCAGAACC
++
+IIJJJJJJJJJJCB#4ADDFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5471:2159 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGNGGGTTTGGCTTGAAACTC
++
+HIIIIIIIIGIH@@#4=DADDFHFHIIGGII at E
+ at HWI-ST960:105:D10GVACXX:2:1101:5293:2163 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATNATAGACCAAAAGCAATTC
++
+IJIJJJJJJJIJCC#4ADDFHGHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5262:2165 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTCNAACTTTGAGGCTTAAAAA
++
+HJH<DDE@@AC=CC#4ADDFHGHHHJJJJJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5313:2166 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTNTCATATTTGCGATGTAT
++
+JJJJJJJJJJJHCC#4ADDFHHHHHJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5498:2182 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAGCGAGAGTTCTTGAACTGA
++
+IJJJJJJIJJJJBC at FFFFFHFHFHGIIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5435:2184 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTATAAGGACTGTGAAGTGTG
++
+JIIJIJJJJJJJCCCFFFFFHHHHHJJJGHJI
+ at HWI-ST960:105:D10GVACXX:2:1101:5472:2190 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCACTGTAATCTCACGGTGTGT
++
+IIJJJJJIJJHHCCCFFFFFHHHHHJJJHHGIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5358:2205 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTATGTAATGTAGTCTTTAAA
++
+IIJJJJJJJJJJCCCFFFFFHHHHHJJJIIHJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5420:2213 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCGTTTGATTTGCAAGCTG
++
+HEIJIIJJJJJJCC at FFFFFHHHHHJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5318:2214 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATTTGTAGCAAGGCACTGAT
++
+IIJJJJJJJJJJCCCFFFFFHHHGHIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5357:2223 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCTTCATTTCTGCTCTTATCAC
++
+BBF at FCGHDFGH@@CDDFFFFHDDHIIIG at EIG
+ at HWI-ST960:105:D10GVACXX:2:1101:5300:2224 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAATGTAGAACACACATGATTT
++
+FBF=CFEFGEEE?@@?DDD;:DBFFFFIF+AIF
+ at HWI-ST960:105:D10GVACXX:2:1101:5485:2228 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAAAATATCGTATCCGTTCAA
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5295:2241 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCAAAGACTTGGACCTTCTTTC
++
+B=FHFBDF===C@?@DBDDBFBFHHGGIIGGIB
+ at HWI-ST960:105:D10GVACXX:2:1101:5281:2244 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGGAGCGTACCGACATGCGGT
++
+EFFDFFDEEEEECCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5593:2158 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAANCTTAGAGTCTGTTTTTT
++
+HGIFHHHHHEEE@@#4=BDDHH?FHHFHIIEI
+ at HWI-ST960:105:D10GVACXX:2:1101:5636:2160 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCTNCGATGATGATCAAATCAT
++
+IIJGJJJJJIGICC#4ADFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5558:2161 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTNCTTGGGTTCAACTGCCTT
++
+=BCFFCFF at EEE?:#4=BDDFCFFFFCED at EBH
+ at HWI-ST960:105:D10GVACXX:2:1101:5611:2162 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTNAGAACTTGATCATGCAT
++
+IIJJJJJJJJJJC@#4ADDFHHGHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5679:2172 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTAACAATATTCTCATGCACCT
++
+HJJJJJJJJJJJCCCFFFFFHHGHHJIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5663:2184 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTTTGTAATCTGACTCTCTT
++
+IGIG?HIJHIJJC at CFFFFFHGHHHJJJIJII
+ at HWI-ST960:105:D10GVACXX:2:1101:5539:2195 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTGAAAGAAAGAGCCATTGGT
++
+HIJJJJJJJJJJCCCFFFFFHHHHHJJIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5728:2197 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATCTGTATAAATAGTTTTAA
++
+HHJJJJJJJJJJCCCFFFFFHHHHHJHIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5500:2203 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTATCAATTGAACTAGATTCA
++
+IJJIJJJJJJJJCCCFFFFFHHHHHJJJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5592:2204 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGATCAATAAAGCTGTTGAATGAGAT
++
+HJJJJJJFHIJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5553:2233 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCGATCTGTAAACTAAAAAAAC
++
+IJJIJJHHFFFFCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5604:2241 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATTTGATTACCATAGCATTT
++
+JJJJJJJJJJJJCCCFFFFFHGHFDIHIJIIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5743:2243 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAAGGTTTTAAGTTCTTAGAAC
++
+IJJHJIJJIJJJCCCFDEFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5682:2243 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTCTTGAGTATGTAGAATCTG
++
+IIJJJJJJJJJJCCCFFFFDHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5999:2166 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTCNCTCTCTCTTTAGTTGTT
++
+JJJEIJJJJJJJCC#4ADDFHHHHHJJIJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5979:2179 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCTCTCTAGAAAATATCAGA
++
+HIJIIJJJJIJJCCCFFFFFHHHHHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5958:2186 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGCGATGATGATAAAATAGC
++
+IIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:5985:2215 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTATAGTTTTGTTGTTTCTT
++
+IGIIIIJJJJJJCBCFFFFFHHHHHJHJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5952:2229 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTAGCAGTACAATTGCAGAAGT
++
+HJJJJJJJJJJJCCCFFFFFHHHHHJJJJIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5970:2231 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCTTATGTAGTCTCATTTCCT
++
+HBGDHGHIIGGI at CCFFFFFHDFHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5909:2233 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCACCAGTTTTACAGAGTGTTT
++
+JIJJJJJJJJJJCCCFFFFFHHHHHJJEHHJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5792:2239 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTATATACTTCACAACTCTG
++
+JJJJJJJJJJJJCBBFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:5990:2248 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCACGGGAAGGTGATATTTGCT
++
+JJJJJJJJJJJJ at CCFFFFFHCFHGJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6177:2163 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTANCATCGCTTCGTTTTTAT
++
+HHJJJJIJJJHHC@#4ADFFHHHHHHIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6014:2179 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTACTTCTAAGTTTAGTAAC
++
+JJJJJJJJJJJJCBBFFFFFHHHHHJJJIIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6138:2192 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCTTTATATGAACCAATAATAG
++
+FGHIGGHIIJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6181:2194 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATCACAAAATATATAGGAAGT
++
+IIJJJJJJJJJJCCCFFFFFHHHHHJJJJIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6001:2199 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTTGTGAATCTGATTATACAC
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6161:2202 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTAAGTCATAATAATAGTAGC
++
+GHIJJJIJJJJJ at BCFFDEFHHHHHJJJJHHIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6053:2206 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTTTGTTGGCATGAGAACCAA
++
+HIJJJJJJJJJJCCCFFFFFHHHHHJJIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6128:2212 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCATTGTTGTACTCTTTAATAT
++
+GIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6082:2221 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATTTTGTGTGAAAAAAAAAA
++
+B;CECAEDDDDD at CCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6229:2231 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTTTGGTGAAGTTTTTAAGT
++
+JJJJJJJJJJJJCCCFFFDFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6024:2233 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTAAACCTATAATATTTCTT
++
+IJJJJJJJJJJJCBCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6181:2236 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTCGGCTAATACCTAATGTCA
++
+IGIIIJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6060:2238 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTGAATCATGTTGCTTTACT
++
+HHIJJIJJJJJJ at B@DFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6084:2243 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAATGTGTTCTCTCTGTTCAA
++
+IGIJIJJJJJII at CCFDFFFHHHHHJJHGIIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6273:2161 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTNACTGTCTTTGGACCCTTT
++
+GGIBHFCHGGFF=@#4=BDDFHGHHJIGIJIIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6431:2161 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTANTGGTGATTTGTCTGTAT
++
+IJJJIIJJJIIJCC#4ADDDHHHHHGHJIHIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6304:2163 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATNTGATGTTATAGTAAGCAT
++
+JJJJJJJJJJJJCC#4ADFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6492:2184 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCTTCACATTATGAATATCAA
++
+JJJIJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6252:2185 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTATATACTTCACAACTCTG
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6273:2186 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAATGTTGTCTCTCCCTCTTAT
++
+IJJIJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6457:2201 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTGTGAAACTCTATCAATTCA
++
+JIIJIJJJJJJJBC at DFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6377:2203 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGAATATGTTGCTGTAGTCAC
++
+IHJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6427:2203 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCAAACCAGAGACAAATGACAC
++
+JIJJJJJJJJHHCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6279:2218 1:N:0: bcd:RPI2 seq:CACCGATGTATC
+CACCGATGTATCTTGGACTGTGAAGTTTGGCT
++
+JIJHGGGICGHHCCCFFFFFHHGHHGGIJJII
+ at HWI-ST960:105:D10GVACXX:2:1101:6366:2222 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAGATGTCGGCGTTGAATAAA
++
+IJJHHHHHHFFFCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6393:2231 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTATTGCAGTAGAACATAAGT
++
+IHIJJJJJJJIICCCFFFFFHFFHHJJIIJIF
+ at HWI-ST960:105:D10GVACXX:2:1101:6268:2234 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAACTCTTGTGTACCATAAAAA
++
+IIHIIJJJJJJJCCCFFFFFHGHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6467:2241 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTATCACCATGTTCCAATTTC
++
+IGIIJJJJJJJJCCCFFFFFHHHHHIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6481:2244 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAATACTAGTGTTTAAGAAGTT
++
+IJJJIJJJJIJJ at CCFFFEFHHHHHJJJGIJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:6397:2246 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTAACTTTGGCGAATGGATAC
++
+@@FFGGII;AHC@??BDDADHBFDF?CFEGIGI
+ at HWI-ST960:105:D10GVACXX:2:1101:6429:2247 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTATATATGGAGAAAATGGA
++
+IIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6523:2161 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATNAGTACTATGTTCTCATTT
++
+FCFIGIIIIGEF@@#4=2ADFBDAFFFIIBHII
+ at HWI-ST960:105:D10GVACXX:2:1101:6687:2163 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCTNGTAGACTCTGTTTTGTC
++
+IIJJJJJJJJJJCC#4ADFFHHHHHJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6525:2176 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCACTGTAAGCTGAGGAACTCT
++
+IGIJJIJJIJGICCCFFFFFHGHHHJGIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6517:2192 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTATGGCACGGCTATGAAATCT
++
+IHGBEIGHCHHH at CCFFDFDDFHHGIEIIIGGH
+ at HWI-ST960:105:D10GVACXX:2:1101:6700:2194 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCACATCTCACTGCTCACTACTC
++
+HJJGJJJJGIJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6538:2194 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTGCTAGAGAGAGGAGGAGAC
++
+JJJJJJJJJJHHCCCFFFFFHHHHHJJJJIIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6575:2195 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGTTTTAACACCTCTACTTTT
++
+HIIHIJIJJJJJBB?DFFFFFGHHHJJJHBHJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6501:2202 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCTTTATGGCTCTAGTACAAGC
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJGIIIJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6631:2202 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTATCTCTAAAATTGCAAAT
++
+JJJJJJJJJJJJCC at FFFFFGHHHHJJIIIII
+ at HWI-ST960:105:D10GVACXX:2:1101:6672:2205 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGATCATGGTTGCTTTAATATTTTT
++
+JJJJJJJHIJHHBCCFFFFFHHHHHJIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6579:2213 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCGACTTTGATCCAAAAAAAA
++
+HAHEHHGFFFFFC at BFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6552:2217 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCATCTTTAGCTTTATTTACTC
++
+IJJJGIJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6685:2223 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCATTATTATCAATAGCTCTTC
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6503:2223 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTTAGGGGCTGATTTGTCTT
++
+JJJJJJJJJJHHCCCFFFFFHHHHHJJJIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6613:2224 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTCTACCATTATGCACTATTT
++
+IJJJJJJJJJIJCCCFFFFFHHHGHJJJIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6670:2231 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCGGCGTGAAAGGGCGACTAAA
++
+HHHHFFFFEEEECCCFFFFFHHHFGEIGIGIJH
+ at HWI-ST960:105:D10GVACXX:2:1101:6721:2233 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTAAACTTTCTTAGCTTGTCC
++
+IJJGIIJJHIJICBBFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6642:2234 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGGGTGATGAACGAAATAAAAA
++
+IIJJJJJJJJJJBCCBDFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6589:2242 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATTAAAGACAGAGAGATAGA
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6684:2245 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGATCGAAACCAAACACCGAT
++
+IGJHHHHFFFDECCCFFFFFHHHHHJIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6942:2160 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAANGGTCGATTTAGTTAAAA
++
+HGIIJIJJJJFI@@#4A=BDHHHHHJGGIIIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6987:2160 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTANACCAGCTGAAGAAAAGGC
++
+HIJIIJJJIAEHCC#4ADDFHHHHHJJJJJJIF
+ at HWI-ST960:105:D10GVACXX:2:1101:6968:2161 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCATNTTGATCGGATGGGCAGAA
++
+GIIHGGIJHHHHBC#4ADDFHHHHHJIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6922:2166 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTNTGGAACTGTGGATTAAAA
++
+IJIIJIJJJJJJCC#4ADDFHHGHHIIJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:6902:2167 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTCNTCTTATTCTTTCTCTTT
++
+IIJJJJJJJJJJCC#4ADFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6830:2173 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCTTGTCATTCTCTAAATAAC
++
+IIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6954:2174 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTATAACTCTCTCGCCTTTGT
++
+IJJIJJJJJJJJCBCFFFFFHHHHHJJJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:6754:2179 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTAAGTCGTATCTAGGTGTGT
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJGHIHJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6877:2188 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAACAAAGTCGTTGTAGTATAC
++
+JJJIJJJJIJJJCCCFFFFDHHHHHJJJIHJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6970:2193 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATCACACTGTCAAATCCGAA
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6918:2197 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATTCGGCTCTGTTCATATAC
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6851:2211 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTTTCTGGCTGTAGAATCTT
++
+IIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6836:2224 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCACGCACACCGCGTGTAGAG
++
+IHHHHHHFFFFFCCCFFFFFHHHHHHJHJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6948:2228 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCCGATAGAGAACCTTGCTGACC
++
+HIJJJJJJJIJJCCCFFFFFGHHHHJIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6923:2230 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTATTTTATGTGGTGTTACTT
++
+IJJJJJJJJJJJ at BCFFFFFHHHHHFHIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6971:2233 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATCAGTGATGAAATTATGTC
++
+HIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6883:2236 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGAGTGAGATATAAAATGGG
++
+IJJJJJJJJJJJCCCFDFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:6822:2246 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGAATTCAGACTGTGAAACTGC
++
+IDHIIEG:FHIH??;AD?DAFBAFCEHHIEGGC
+ at HWI-ST960:105:D10GVACXX:2:1101:7194:2161 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCTNCTTTATATGAACCAATAA
++
+C8B88FF:C3=@@@#4=AD;FBFFDBFBBF?FA
+ at HWI-ST960:105:D10GVACXX:2:1101:7080:2163 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTCNGGATTCTCACTCTCAGC
++
+HHJJJJJJJJJJCC#4ADDFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7018:2176 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGATCGGAGTTTTTTCAGCAGTTCT
++
+JIJJIIJDHIJJBCBFDEFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7182:2176 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATTGTATTTGTGCGTGTAGC
++
+JIJJJJJJJJJJBCCFFFFFHHFHGJIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7145:2178 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATAATAAGACTCTTAATCAA
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7091:2178 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTATGTAATGTAGTCTTAAAA
++
+JJJJJJJJJJJJBC at FDEFFHHGHFHIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7123:2181 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTCCTTGACTGGAAAAATGT
++
+JGIJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7068:2182 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTAATGTACCGATGCATAGT
++
+HHJJJIJJJJJJCBCFFFFFHHHGHJJHIIEH
+ at HWI-ST960:105:D10GVACXX:2:1101:7245:2192 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGTTTACCATGGAACGAACAT
++
+HJJJJJJJJJJHCCBFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7109:2196 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATTGTAATTCAGTTAGCTCAA
++
+IIIJJJJJJJJJCCCFFFFFHHHHHIJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7209:2197 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTTGTCAATGCATAGACAAAA
++
+JJJJJJJJIJJJCCCFFFFFHHHHHJJJJJJJG
+ at HWI-ST960:105:D10GVACXX:2:1101:7060:2201 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTGTGTGTTGGTGGATATAAC
++
+IGJJJJJJJJJJBBCDDEFFHHHFHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7155:2215 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTTGTTGGCCTTTAAAAAAA
++
+HDGBGHHFFFDDC at CFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7198:2217 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTATATATTTCGTTTCATTT
++
+HGIJGHIJJJJJCBCFFFFFHHHHHJJJIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7115:2229 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTAAGGCTGTGGAGGTTATC
++
+HIIIIIIIIIIICCCFFBDFHHHGDGGHHHAH
+ at HWI-ST960:105:D10GVACXX:2:1101:7149:2234 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTTTGTTAGACTCTTCGATTT
++
+IJJJIJJJJJJJCBCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7127:2244 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTATGTAGATACTGATATTA
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7018:2247 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCTTTATATGAACCAATAATAG
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7448:2162 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCAGNGTGGATGCTGCGGAAGAT
++
+GGIJIJHHHHFFBB#4=DDFHHHHHJJJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7352:2162 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTNTGTTGTGGGTGACTTTGA
++
+IJJJJJJJJJHHCC#4ADFFHHFHDGHJJJIJI
+ at HWI-ST960:105:D10GVACXX:2:1101:7420:2163 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCACNGTGTTGGCGTTTTATCT
++
+IJJJJJJJJHHH at C#4=DDFHHGHHIJJIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7296:2163 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTCNATCTGTCGTACTGTTGT
++
+IJJJJJJJJJJHCC#4ADFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7382:2185 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTAGTAGACTTGCAAAGATCGT
++
+HIJJJJJJJJJJB@@DDFFDDHHGHJIIJIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7449:2187 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAATACCCCGAAAATTAGATC
++
+IGIJJJJJJHHHBCBFFFFFHHHHHHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7359:2193 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAGGCTGATTGTAGAATGGTT
++
+HGHJJJJEGIII@@@FF>DFHFFFFGIIJJII
+ at HWI-ST960:105:D10GVACXX:2:1101:7292:2202 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTCAATCCATGGTTTTCTCAAAGTTTTC
++
+HJJJJJJJJJJJCCCFFDFFHHHHHJJJHIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7393:2205 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTATGTCTCTGTACTGTAAC
++
+JIJIJJJJJJJJC at BFFFFFHHHHHJIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7359:2210 1:N:0: bcd:RPI1 seq:CACATCACGATC
+CACATCACGATCAGAGATCGGAAGAGATGGCTT
++
+JFGGHHJJGEHH at C@FFFFFHGHAFGIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7415:2224 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATTAATTATTCGTATGAACT
++
+IIJIJJJJJJJJ@@CFFFFFHHFHHJJIIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7403:2225 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCGTCTTACCATTTCTTTCAT
++
+III@=F4./@FI@@@A?DD>AC>BF at GFGBHI
+ at HWI-ST960:105:D10GVACXX:2:1101:7373:2225 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTATGTCTGTCTAGTCTATTG
++
+IHIGIJIJJJIJ at CCFFFFFHHHHGHIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7324:2231 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAATCAAATGTATTATATATAT
++
+IJJJJJJJJJJJC at CFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7309:2246 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTGAGTTTTTACATGTTTGT
++
+IIJJJJJJJJJJ at BBFFDFFHHHHHJJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7475:2247 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTTGACTGTATTGAGCAACC
++
+IIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7687:2161 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTNTAGTCTAAGGCTTTTCAA
++
+HIJJJJJJJJJJCC#4BDDFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7649:2170 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCTGAGTAGACAATTTAATCA
++
+F?B at FHGIJGEH@@@FADEFHHHFHJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7708:2170 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAGTTTAATAAAACAGAACAA
++
+IJJJJJJJJJJJCCBDFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7709:2191 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTCTCTCTCTTACCTTTCTCT
++
+JJJJIJJIJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7690:2197 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATTCGATTAGTACCGTTAGTG
++
+IIIEIHIJJIHHCCCFFFFFHGHHHJIHIIJIG
+ at HWI-ST960:105:D10GVACXX:2:1101:7607:2203 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCCGGAATGGTGCCTTTGTTAC
++
+HJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7698:2214 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCTCTGGCTTTGCTCAGATTT
++
+IJJJJJJJJJJJ at BCFFFFFHHHHHJJJIIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7518:2217 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCAATTCTTTTACCGGGTTGAG
++
+HHIJHJJJJHHHCCCFFFFFHHHHHJJGHJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7534:2218 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATAATGAATGTTTCGGACTTC
++
+FFGIJIEHIJGH at CCFFFFFHHHHHJJIGIIJG
+ at HWI-ST960:105:D10GVACXX:2:1101:7679:2220 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATCGGTGAGTGGAACTTCTT
++
+IJJJJJJJJJJJBCCFFDDDHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7747:2228 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCACGAGTCGAGGCTCTCAATA
++
+HJJJJJHHHHHHBCCFFFDFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7610:2232 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTCAGTGGTAGAGCGCGTGGC
++
+HHHHHFFFFFFECCCFDFFEHHHHHJJJHIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7532:2235 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTATGTTCACTGTTCTCTGC
++
+DBFFCCFHGGEG?@CFDDDDHHHHHGGJJGIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7676:2238 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGATCCAGCCGTCGGATACTGACTT
++
+IIIIIHHACHHF<@@FFFFDHHHHHDDHIIII
+ at HWI-ST960:105:D10GVACXX:2:1101:7641:2240 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATCTGTAGCCTCTCTTTTAGT
++
+HIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJH
+ at HWI-ST960:105:D10GVACXX:2:1101:7824:2158 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTNAGTCTCTTTTTTGAATT
++
+GGHDHHIEGHGH@@#4=ADBFHHHGIIGIGGI
+ at HWI-ST960:105:D10GVACXX:2:1101:7876:2164 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAANACATGGGAAAATATGTG
++
+==='566A@===@@#442AAAD?CB?C at G>IB
+ at HWI-ST960:105:D10GVACXX:2:1101:7774:2165 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCTCNAACGAGGAAAGGCTTAC
++
+JJJJJJJHHHHFCC#4ADFFHHHHHIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7839:2165 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTNTAAAACTGTGCCATTAT
++
+IJJJJJJJJJJJCC#4ADFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7920:2167 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAANTTCTTTATACTTTGTAAA
++
+HIJJJJJJJJJJCC#4ADFFHHHHHJJJJHIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7966:2176 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATGCAACTGCAAATTCTGCA
++
+JJIJJJJJJJJJCCCFFFFFHHHHHJJJIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7948:2186 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTTGCTGTGGATGATCTGGT
++
+HIJJIJJJJJJJ at CCFFFFFHHGHHJJJJJJH
+ at HWI-ST960:105:D10GVACXX:2:1101:7864:2190 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCGGAAGAACTCTGGAAGTGAA
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJHIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7912:2193 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAACAAGATGTTTAATCATCC
++
+HIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7970:2195 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCACAATTGTTGTCTTGTAGTA
++
+IIJGHJJJIIGJ at C@FDFFFHHFFAHIHIJHH
+ at HWI-ST960:105:D10GVACXX:2:1101:7819:2202 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTAATTGTTTCTTAGCATCT
++
+IJJJJJJJJJJJCBCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7762:2204 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTACTTTATAAGGACTGTGAA
++
+IJJIJIJJJJJJCCCFFFFFGHHHHJJJIIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7847:2207 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATGCAACCCTGTCTTGCTTTA
++
+IJJIIJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7775:2219 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTATTGTGTTACTGAATCTT
++
+JJJJJJJIJJJJCCCFFFFFHHHHHJIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7900:2219 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATTACGCCCGAACGCAAACC
++
+HFFFFDDDEDDDCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7800:2227 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCTCTTATGATGTCAAAACTTTC
++
+HIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7973:2227 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTATGTGTTCTGCAGATCGA
++
+IIJIJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7844:2229 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTTCGTTGGGTTTTCTTCAT
++
+IIJJJJJJJJJJ at BBFFFFFHHDHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7863:2232 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATAAATTTTCGAAGGAGACAA
++
+HIJJJIJJIJIH?BBFFFFFHHHHHJIJJIGII
+ at HWI-ST960:105:D10GVACXX:2:1101:7912:2234 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCGTGTGTAACCTCATATGGAC
++
+IIJJGIJJJJJJCCCDFFFFHHHHHJJJJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:7940:2245 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCGTGTCAAGTGTAGAATCAA
++
+IJJJJJJJJJJJBBBDDFFFHFHHHIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8088:2158 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCANTGGAAGGCTGTGGAGGA
++
+IJJJJJJJJJHHCC#4ADFFHHHHHHIIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8140:2163 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCCGNTGGGTTGGGGATCCGGT
++
+HEHE at DBDBCCC@@#4ADB=?DDDHIAFBE@?
+ at HWI-ST960:105:D10GVACXX:2:1101:8156:2163 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATNTGTAAGTATGAACAAAA
++
+IIIIJJJJJJJJCC#4ADFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8057:2166 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAGNAACATTGAACAAGCAGTT
++
+IJJJJJJJJJJJCC#4ADDFHHHHHJJJJIJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8023:2182 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATGTATCTTGTTGTTTATCTA
++
+HIJJJJJJJJJJCCCDFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8157:2184 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTCAGTGGTAGAGCGCGTGGC
++
+EHHFHHFFFFFF at BBFDFFDFHGHHJIJIIJI
+ at HWI-ST960:105:D10GVACXX:2:1101:8117:2186 1:N:0: bcd:RPI3 seq:CACTTAGGCATC
+CACTTAGGCATCACTGAATCGACTTTGGGCAAA
++
+HJJIIHFHIJJJCCCFFFFFHHHHGGIJJIIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8197:2187 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATGGTGCTTAAAAAAAAAAA
++
+C;@>BBDDACCA at CCFDEFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8236:2188 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTATGTCGGCTTAAACTCTAT
++
+FGIIJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8088:2193 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTATGGAAATGTGCTATGGAC
++
+JJJJJJJJJJJJCCCFFFFFHHFHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8085:2226 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTCGCAGTCGCTAAGCGTCAC
++
+JJJJJHHHHHHFCCCFFFFFHHHHHJIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8003:2228 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATATTTGTGGATGATGAAGA
++
+IIJJJJJJJJJJCCCFFFFDHHHHHJJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:8138:2242 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTATATGATTCTACTTAGTCA
++
+IJJJJJJJEIJICCCFFFFFHHHHHJJJJJIIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8069:2250 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGGTACTATGAACATTGTGAC
++
+HGIIGGIGHIII at CCDDFFFHHGHHJJJIIIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8445:2158 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTNAGATTAGACTCTGTTTGC
++
+IJJJJJJJJJJJCC#4ADFFHHHHHJJJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8271:2161 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCTNTGTATAATTGGAACAAG
++
+HIJHGIJIHIGIBC#4=ADFHHHHHJIJIJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8390:2167 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTNCGTGTAGAAGGGAAATGA
++
+IJJJJJJJIJHHCB#4ADDFHHHHHJJJJJIII
+ at HWI-ST960:105:D10GVACXX:2:1101:8355:2173 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTATGTGTAACCCTGTCCTT
++
+IJJJJJJJJJJJCCCFFFFEHHHHHIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8375:2177 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATATTGCTATAGAGTCACGCATCT
++
+IJJJJJJJIJJH at CCFFFFFHGGFHIIIGIJII
+ at HWI-ST960:105:D10GVACXX:2:1101:8257:2177 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCACCTGGAGACTCATGTGTTGA
++
+IJJJJJJJIJJIBCCFFFFFHHHHHJJIJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:8438:2178 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTTGGTTTGGATTTTGGTTA
++
+IJJJJJJJJJJJCCCFFDFFHHHHHJJJJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8299:2178 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATCTCTGGCTGTTGAATAGA
++
+IJJJJIIJJJJJCCCFFFFFHHHHHJIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8333:2183 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAGCTTGCAAGTTCTCTCTGAA
++
+HJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8309:2194 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCACTGTGTTGGCGTTTTATCTG
++
+IJJJJJIHFHHH at CCFDFFFHHGHHJIIJIJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:8363:2198 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCAAGCATGATGAATTGATGAG
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8494:2200 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTTTGCATTGATTGTGGTTAC
++
+HIJJJJJJJJJJCCCFFFFFHHGHHJIJIGGJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8291:2212 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGATCTCTACTCTACTAAACCTCTGT
++
+IJJJJJJHIJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8482:2215 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATCTTCCGTCTGTTTCTGAT
++
+HGIHIIJIHHGICCCFFFFFHHHHHJJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:8322:2218 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCTTGACCGATGCTCGGACAA
++
+HGHHHHHFFFFECCCFFFFFHHHHHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8388:2225 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGATCGTGTGTATTTAGTAATTCAT
++
+JJJJJJJGIJIJ at B@DDEFFHHHHHIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8442:2226 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATTTTCTATGTTGTTTGGTAG
++
+HIJJJJJJJJJJCCCFFFFFHHHHHIJJJJFII
+ at HWI-ST960:105:D10GVACXX:2:1101:8339:2233 1:N:0: bcd:RPI2 seq:CACCGATGTATC
+CACCGATGTATCATCTCTAGAACTCTTTATAAT
++
+HIJJIJJJHIJJCC at FFFFFHHHHHJJJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:8376:2238 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATGTGTCAGATTCTAAAAAA
++
+IIIIIHHIIIII@@CDFFDFHFDHHBHGIIII
+ at HWI-ST960:105:D10GVACXX:2:1101:8457:2246 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCACTCTGTGGATTATGCTTTA
++
+IGIJIJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8675:2161 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTNTAGTAGAATTGGTTGCAT
++
+IGIIIIIIIIII@@#4ADDDHHHHHIIGIIIII
+ at HWI-ST960:105:D10GVACXX:2:1101:8657:2165 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCGANCGTTTCTCTAGTTTTGT
++
+IIJJGJJJJJJJCC#4ABDDHHHHHJHIJJJG
+ at HWI-ST960:105:D10GVACXX:2:1101:8627:2171 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAGGTAAATTTGTCTGAATTA
++
+JIJJJJJJJJJJBCCBDFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8743:2178 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATCATCTTTTCTTATGTAAA
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJIHHJG
+ at HWI-ST960:105:D10GVACXX:2:1101:8722:2182 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTATGTAGAGAAAGTGATTA
++
+IIJJJJIIJJIJCBBFFFFFHHHHGJ<EHIEG
+ at HWI-ST960:105:D10GVACXX:2:1101:8678:2182 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTGATGTATATTTACGAGATGT
++
+HJJJJJJJJJJJBC at FFDFFHHHHHJJIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8565:2183 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTGTCCTTCGGATCACTCAATT
++
+HJJIIJJJIHHHCC at FFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8583:2192 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTAACGCTTTTATGTGCTTCT
++
+HIIIIJJJJJJJCB at FFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8633:2194 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTATACATATTGGGTTGTGATT
++
+HJJJJJJJJJJJCCCFFFFFHHHHHHIJHHIIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8687:2198 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATTTCTGTAGACTATGTGTTG
++
+JJJJJJJJJJIJ at B@FFFFFHHGHFIIGHHJEG
+ at HWI-ST960:105:D10GVACXX:2:1101:8605:2201 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGATCTTTCTTGTCTAGTCGGTTTAT
++
+IIJIJJJEHIJICCCFFFFFHHHHHIJJHIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8532:2207 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAATGAATGTGTAGAAAAAAA
++
+HIJIJJHHHHHFBCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8688:2216 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTGGGGAAGGATCAGATGCA
++
+HGIIJJJJJJIJ at BBFFFFFHHHHHIIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8560:2228 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAATTGGTGCCTGTAGGTCAG
++
+HIJJJJJJHHHH at CCFFFFFGHHGHJJJIIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8658:2230 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCTGCTATAGAATCTGGACAAA
++
+IIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8538:2232 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTCTTATCTTTTACTTTCCTC
++
+IJJJIJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8669:2248 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTACTGTTTTTTCCGCCTTC
++
+HIJIJJHHHHFFCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8931:2159 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATNGCAGTCTCTGTAGAATAA
++
+JIJJJJJJJJJJCC#4ADDFHHHHHIIIJJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8978:2160 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTNAGTGGATATATTCATTAC
++
+IIJJJJJJJJIJCC#4ABDFHHHHHJJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8804:2166 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGNAGAAGTGTTAGATATAGT
++
+HJJJJJJJJJJJBC#4ADDFFHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8917:2174 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATGTTGTTGTTGCATGCTGTG
++
+JJJIJJJJJJJJBCCDFFFFHHHHHJJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8755:2195 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATGATGTCGTTGGGTCTTTGT
++
+B==/;6.;==A?@@@DDAD?FHF??FEEED at AH
+ at HWI-ST960:105:D10GVACXX:2:1101:8885:2196 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCTCCGATGATGATCAAATCAT
++
+IIH:F;@FDHII@@@DABDDHDBFHAEHFHAE
+ at HWI-ST960:105:D10GVACXX:2:1101:8967:2201 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTTCTTTATTCCTGGGTTGT
++
+IJJJIJJJJIJJCCCFFFFFHHHHHJJJJGHIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8797:2213 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTTAACTCTTGCCTCTTCTT
++
+JIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8831:2214 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTTTGGGTTTGTGGTGGGGGT
++
+EEDDDDDDDDDDBCCFFFFDHHHHHJEGIJJJF
+ at HWI-ST960:105:D10GVACXX:2:1101:8957:2220 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGTCTTTAGCATCGACTGTT
++
+IJJJJJJJJJJJCCBFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8751:2221 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGTGTTTGTGTTTAAGTGCT
++
+HIJJJJJJJJJJBCBDDFFFHHHHHJJJHIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8914:2223 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCGTTTTGGCTTTCGTTCTGT
++
+JJJJJJJJJJHHCCBFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8937:2229 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGATCTGGAATGATGATAACGATTTT
++
+JJJJJJJHHGIJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8832:2238 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTTGTCAGTCTAAGAAAATG
++
+IJJJJJIJJJJJBCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8894:2244 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCGAATGTTTAAATTGGATCAA
++
+IGIJJJJJJJJJCBCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:8849:2246 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTTACTGTAGTATATATGAT
++
+JGIJIJJJJGHJBCCFFFFFHHHHHJJJJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9183:2160 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTANAACCTGTTGAATTTATA
++
+IIJJJJJJJJIJCC#4ADFFHDHHGIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9200:2160 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCACNTAGCGAAATGCGATACTT
++
+HIIIIGHEAEA@@@#4=DDDAFFHHDHIIIIII
+ at HWI-ST960:105:D10GVACXX:2:1101:9117:2160 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCANTTTAGTTTGGTACTAAT
++
+HIJJJJJJJJJJBC#4ADDFFHHHHGIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9238:2160 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCTANATTATACAATGTCTCTGT
++
+IJJJIIJJJGIJCC#4ADFFHHHHHJHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9130:2168 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAGGAATTGTTGAGTTTGGTA
++
+IIIB=B;@=@FI;?@BADDDFF?ADEFFEF<A
+ at HWI-ST960:105:D10GVACXX:2:1101:9203:2174 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCTTGACTGTGATTTAAACGAG
++
+==FB at FDDF@@E??@DDEDDDHAHHGGIIEEF
+ at HWI-ST960:105:D10GVACXX:2:1101:9183:2182 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTACTCTATCTTAAACATGT
++
+HIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:9125:2192 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTATCGGATTGTCAAATGTCT
++
+FHHIIGHIJJGICCCFFFFFHHHHHJJJICJH
+ at HWI-ST960:105:D10GVACXX:2:1101:9001:2202 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCTTCTTGTTGTCTAACTCTC
++
+IGI67B at A7CEH@@@DDBDDD?CDDGHBFAFE
+ at HWI-ST960:105:D10GVACXX:2:1101:9175:2204 1:N:0: bcd:RPI1 seq:CACATCACGATC
+CACATCACGATCTGAGAATAAGAACATACATAA
++
+JBFHHHIIJIJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9224:2207 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATCGTAAAAACTTTGGGATGC
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9118:2208 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTATAGTTCAGTCGACATGAAT
++
+IJJJJJJJJJJJCCCFFDFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9087:2209 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATATGGATGGATAATTTTCT
++
+IJJIIJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9013:2211 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAGGAGCCTCTGTAATTTTGT
++
+JJJIJJIIGIJJ at CCFFFFFGHHFHJIGIJJG
+ at HWI-ST960:105:D10GVACXX:2:1101:9153:2219 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCTCTTCGAATGACGAGTTCC
++
+JJJJJJJJJJJJC at CFFFFFHHHHHJJJGIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9188:2234 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCCTTTGTCGCTAAGATTCGA
++
+HIIIIJJJJJJJCCCFFFFFHHHHHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9022:2234 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTAAAATAAACACATGTACTT
++
+HJJJJJJJJJJJCCCFFFFFHHHHHJJJHJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9098:2234 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCGAGGAGAGCAGTCTATTCTG
++
+FFHGEHGIJJHI7@@FFFFFGHHHHIIJJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9115:2236 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTGTTTAGTTGGCGGTTTCAC
++
+IJJEHHFFFFFE at BCDFFFFHHHHHJJGHJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9136:2239 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTTTGCTTCCTTTAACAAAA
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9346:2162 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTCNCATGTCACATGAACGA
++
+HHIJJIJJJJJJBC#4ADFDHFHHHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9443:2167 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCANATTAATCGAACTAAAGAA
++
+IJJJJJJJJJJJCC#4ADFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9477:2182 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATTTATGGCACAACATGTAA
++
+IIJJJJJJJJJJ at CCFFFFFHFHHHJJJJHHJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9421:2187 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCCCAGCCTCATAGAGGAACTG
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9299:2194 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCACCAAACTTTTCAAACCATGT
++
+IJJHJIJJJHIJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9456:2199 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAATTTCGGAAATGCTAATCG
++
+IJJJJJJJJJJHCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9347:2201 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGCATAATAATGTATTTATTTG
++
+HJJJJJJJJIJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9436:2206 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTTATGAGTGTGCGTCTCAC
++
+IGIIJJJJJJJJBCCFFFFFHHFHHJIIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9384:2226 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTCTGTTACACGCCGAGATC
++
+IGIHHHHHHFFFCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9328:2231 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCACTGTTGCAGTCGGTGTTAT
++
+IEIIJJJJJHHHCCCFFFFFHHHHHJHGHIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9477:2238 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTATGTGTGCTGCTTTCTCT
++
+IIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9580:2160 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTNTCTACTTGTTCTGGCCT
++
+HIIIIIIIIHII@@#4ADFDFHHHHII at GHII
+ at HWI-ST960:105:D10GVACXX:2:1101:9707:2161 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTANGGAAATGTGCTATGGAC
++
+IJJA;FHIGJJJ@@#4ABDDHGHHHGHFGHII
+ at HWI-ST960:105:D10GVACXX:2:1101:9631:2165 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTNGAATAATGCGTTTGTAT
++
+JIJJJJJJJJHHCC#4ADFFHHHHHIJJJHIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9722:2167 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAANTCCACATGTTCAAGATT
++
+IGJJJJJJJJJJCC#4ADDFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9563:2176 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCCTCGACACTGTTACTCCAC
++
+JJJJJ(=EHHHHCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9614:2178 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATTGTCATATTTGCGATGTAT
++
+IJJJIHJJJJJJCCCFDFFFHHHHHIJGIGGHC
+ at HWI-ST960:105:D10GVACXX:2:1101:9676:2191 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTTTAAATCATTGTCTGAATT
++
+IJJIJJJJJHJJCCCFFFFFHHHHHJJJJIIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9526:2191 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAATCTTTTGTATTTTGCTGT
++
+JJJJJJJJJJJJCCCFFFFFHHHGHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9622:2195 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCTGTACCTGTTATGCTTTAAA
++
+HJJIGHGGGIJJ@@@DDDEFDHHDHIIIJJIJI
+ at HWI-ST960:105:D10GVACXX:2:1101:9597:2203 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAGTAGCTGTGGAATGAAAGT
++
+IHJJJJJJJJJJCCBFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9507:2209 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTCTAGAGCTCTGATGAGTT
++
+IIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9613:2210 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCTTTTCATAACTCATCCTACT
++
+IGIGIJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9741:2245 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTATGAGACTGTATCCTTTAT
++
+JGJJJIJJIIJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9572:2247 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTATTAAAATTAGAACAAAT
++
+JJJJJJJJJJJJCBCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9606:2249 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTACATATAGTAGTGGAGGCCT
++
+IJJJJJJJJJJJCCCFFFFFHHHHHIJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9767:2159 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAANCCATCGGCTCCTTCTTTC
++
+HJJJJJJJJGHHCC#4ADFFHHHHHJJJIIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9910:2161 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTCNTTCTCTCTAGTTTGTTT
++
+IJIJJJJJJJJJCC#4ADDFHHHHHHIJJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9952:2162 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAANACATCTTGTAGACTAAA
++
+IHJJJJJJJJJJCC#4BDFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9830:2163 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTNGTTTCGAAGATCAATAC
++
+IJJJJJJJJJJJCC#4ADDFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9980:2165 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAGNTTTTCTATATTCTTACT
++
+IHIJIGJIJJJJ@@#4=ADDDFFHHJGGHIIE
+ at HWI-ST960:105:D10GVACXX:2:1101:9995:2170 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTATGGGAACTCTTTTGGACC
++
+JJJFIIGGGHIJ@<@FFDDDFHHFHJIGEHIG
+ at HWI-ST960:105:D10GVACXX:2:1101:9998:2188 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATCTTATTAGTTTTAACTTC
++
+IHIIIIIIJJJJ@@@FFFDFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9771:2192 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCCCTATAAATAAAAAACAGAC
++
+JGIGIJJHHHHHCCCFFFFFHHHHHJJJJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9841:2194 1:N:0: bcd:RPI1 seq:CACATCACGATC
+CACATCACGATCTACACCAAACTCTGGTACAGT
++
+GCGGGHGJJIJJCCCFFFFFHHHHHJJFHIJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:9751:2194 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAATTGTTGTAGGCTGTGGTCC
++
+JJJJJJJJJJJJBCCFFEFFHHHGHJJIJJIII
+ at HWI-ST960:105:D10GVACXX:2:1101:9885:2199 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTATGTTTGTGTAACTGTAAC
++
+IJJJIJJJJJJJ at CCFFFFFHHHHHJJJIIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9758:2211 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTTGGCGACTTTCTACCGCAC
++
+IHHEHDEF at CEE@@@<DDADHHHDHIIIIIIEG
+ at HWI-ST960:105:D10GVACXX:2:1101:9838:2213 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTGTAGCTCCATGAACAAAT
++
+GGHEHIJJJIJJ at CCDFFFFFHGBFHIIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9815:2214 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTAATAAACACAAAAGTTTT
++
+HIJIJJJJJJHHCBBFFFFFHHHHHJJJFHJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9945:2214 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCAGGATTGGTTTGGTGGATTA
++
+HIJJJJIJJJJJB at CFFFFFHFHHHJCGIHJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:9878:2215 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTGAAGCCAGATCAGAATCTT
++
+FGFHIHIIIIIIC@@FFFFFHHHDBFHGIGGHI
+ at HWI-ST960:105:D10GVACXX:2:1101:9912:2218 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCAAAGTTAATTTCTGTTTCT
++
+HIJJJJJJJJJJCCCFFFFFHHHHHJJHJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9753:2227 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTTACCAAATAAGCTTAAGTC
++
+IJJJJJIIJJJJCCCFFFFFHHHHHJJJJJJHH
+ at HWI-ST960:105:D10GVACXX:2:1101:9999:2231 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCTTTGTGATATCTGAAAAACAT
++
+IJJJGIJJJJJJCCCFDFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9840:2233 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTGATTTTTCCTTTGTTATC
++
+IJJJIJJJJJIJBBBFFFFFHHHHHJIIIIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:9928:2239 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTGCAAAGGCAAGGCTCTGCTG
++
+IJJIGJJGIJIICCCFFFFFHHHGHJJJIJGIE
+ at HWI-ST960:105:D10GVACXX:2:1101:9937:2249 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAGTCGGCTTAACTAAGGTGGA
++
+IIIEGGIHFHHH?@?BDDDFGHHGHHIEGACGH
+ at HWI-ST960:105:D10GVACXX:2:1101:9908:2249 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAAGAACTCTGTAATTTCTGT
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10110:2162 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTNTGAGTTTATATTTCGGA
++
+HHJHIJJJJJHHCC#4ADFDHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10222:2164 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTNAGACTTGGTCCCTAACAT
++
+JJJJJJJJJJJJCC#4ADFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10062:2166 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTNCTGTACTCATTATCATCT
++
+JJJJJJJJJIJJCC#4ADDFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10017:2167 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTNCGAACAATGAACAATTGC
++
+HIIGIIIIIEHH?@#44BDBHH??FHBHIDDHI
+ at HWI-ST960:105:D10GVACXX:2:1101:10129:2182 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTTGTCCTTAATTCATTTAT
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10012:2196 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTTTGTATCCTTTCTCATTTA
++
+HIJJIJJIIIII at CCFFDDFHHHHHJJJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10236:2203 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATATCACCATGTTCCAATTTC
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10124:2225 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAGTGTTGGCATGGGCCTCGA
++
+IJJJJIJJHHHHCC at DDFFFHHHHHJJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:10018:2233 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTCGGTTGACTGGAATTATTTT
++
+IJJJJJJJHHGHCCCFFFFFHHGHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10188:2243 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTTGTGATTGTTGGCAATAT
++
+HGIIIJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10113:2246 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTAAGTGTAGAATGCATAC
++
+IGHIIJJJJJIJ@@CFFDEDHHGHHJJIJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10362:2160 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTCNGGACTGGAGTTTGACTCT
++
+IJJJJJJJIJJICC#4ADDFFGFHHGHEHJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10363:2184 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTGGATTCTTCGTTCAGGCCAT
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10329:2196 1:N:0: bcd:RPI3 seq:CACTTAGGCATC
+CACTTAGGCATCAAGACTGCAACAACTTCTGC
++
+JGHIIIJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10309:2198 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTCTTCTGTCATCTACATATGC
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10373:2200 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAGTACTGTATTTGCTATTCCC
++
+IJJIHJJJJJJJBCBDFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10440:2212 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCTTTTCTTTTTGTCGGCATC
++
+C7CFGEGIIHHE@@CFFFFFHHHHCFGHIIII
+ at HWI-ST960:105:D10GVACXX:2:1101:10352:2213 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTATTATCTCTGTTGATTGAT
++
+HJJJJJJJJJJJCCCFFFFFHHHHHJJJIJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10470:2218 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCCTAGAACTTGCTCAAAAAA
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10322:2233 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCACTGGAACTCTTTCTTCTAA
++
+IJIFIJJJIJJJCCCFFFFFHGHHHJIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10300:2236 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGAATCCATAGTCTTACCATGA
++
+ICHJJJJJJJJICCCFFFFFHHFHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10348:2237 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTATGACAAGTCGAATCTATT
++
+IIJJJJJIJIJJ@@CFFFFFHHFHHIJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10434:2240 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTATGTCGTTTCTTTGAACT
++
+GDFHIIJJJJII@@@FFDDAFFHHFIJGJJII
+ at HWI-ST960:105:D10GVACXX:2:1101:10326:2249 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAAGAGTTGATTGTGCAAACAA
++
+HGH>HH?GCEHG@?@DDBBDBHHFHGIIIGEHI
+ at HWI-ST960:105:D10GVACXX:2:1101:10530:2160 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGATCCTNGTGATCATGAAAAAAAA
++
+IHHGHHF at CFFFBC#4=DDFHHHGHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10666:2165 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTANCTCTCCAGTTTGTCATCT
++
+FHHIIJHEEHGI at C#4ADDFHHHHHJJGHGGHJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10737:2166 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTNTGCTTATGTGCCCGTTTT
++
+JJJDHIJHHHHHCC#4ADDFHHGDHIJJJIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10690:2167 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATNTAAATTTCGGAAATGCT
++
+JJJ>@GHGGHHHCC#4ADDFFHHGFGIGGIIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10707:2172 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTATTTAAATTCCTTCAAGT
++
+JJJJJJJJJJJJCB at FFFFFHHHHGJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10553:2176 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTATGTGTAGACTTAATTTTTT
++
+HIJGIHHHFFFF at CCFDFFFHHHHHIIJJIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10597:2193 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTAATGTACCGATGCATAGTC
++
+IJJJJJJJJJJJBBCFFFFEHHHHHJJJJJJHH
+ at HWI-ST960:105:D10GVACXX:2:1101:10566:2195 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTAGTTTTTGGATTGTAAATT
++
+IJJJJJJIJJJJCBCFDFFFHHHHHJJIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10694:2196 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTTGTAATGTTAAATAACTC
++
+HIJIJJJJJJJJBB at FFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10746:2198 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTAACAGGGACAGTCGGGGGGT
++
+DDDDDDDDDDDDCCCFFFFFHHGHHIIJJJJD:
+ at HWI-ST960:105:D10GVACXX:2:1101:10522:2206 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTCTGTACAGATATACTTTTT
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10609:2213 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATTTGGCTTTTCTCTGCT
++
+GIJGIJJJJIJJCCCFFFFFHHHHHJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10672:2216 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTTGGACTCGGATACGCTTCA
++
+IIJJJJJJJHHH at CCFFFFFHHHGHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10584:2225 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGATGTTGAGGCTCAAAAGTT
++
+HIJJJJJJJJJJCCCFFFFFHHHHHJJJJIII
+ at HWI-ST960:105:D10GVACXX:2:1101:10743:2225 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTCGATAGAACTACAAAGAAT
++
+IJJJJJJJJJIJCCCFFFFFHHHHHJJJIIIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10653:2225 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTGTCCTTCGGATCACTCAAT
++
+IIJJJJJJJJJJCCBFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10642:2240 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAGATTTTAAAGTGTTACAAG
++
+IJJGEIJIIJIJ at C@DDFFFHDDHHGGJIIJG
+ at HWI-ST960:105:D10GVACXX:2:1101:10627:2242 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAACAAGTTGGTCTGGGTTGT
++
+IJJJJJJJJGHHB@@FFFFDFFDFFIIJFGHG
+ at HWI-ST960:105:D10GVACXX:2:1101:10734:2245 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTAATCTGGGATGAACTCAC
++
+HEHIIGIJJJJJC at CFDFFFHHHHHIIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10579:2247 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAATCTTTAGTAGAACAAAATC
++
+IIJGIJIDIJJJ at CCFFFFFHFFFHIGHIIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10596:2249 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGGTACTAATGGCGAAAGAAC
++
+IIJJJJJIIHHH at C@DFFFFHHHHHJJJGGGI
+ at HWI-ST960:105:D10GVACXX:2:1101:10939:2167 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCANTAATTCCCTCTGATTCAT
++
+HHHIIJGIJIJJ@@#4ADDFFHHHFGHJJJGJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10984:2173 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATTACGATGTCTCTGTACTC
++
+IJJJJJIJJJJJCCCFFFFFHGHHHJJGHIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10870:2185 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATGGGTTCGACGTTAAAAAA
++
+JJHHHHHFFFFFBCCFFDDFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10979:2195 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAACTGAAATGAACCAAAACC
++
+HHIIIIIICEGHCCCFDFFFHGFHHJJJJJJH
+ at HWI-ST960:105:D10GVACXX:2:1101:10780:2199 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTTGGTGGAACTACATTATC
++
+JJJJIJJJJJJJCCCFFDFFGHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10858:2207 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGTTTGCGGATTATGCGTTTT
++
+HHHHHFFFFFFECCBFFFFFHHHHHJJJJFGIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10924:2209 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAACAAAGTCGTTGTAGTATAG
++
+JJJJJJJJJIJJCCCFFFFDHHHHHHIJFHJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:10881:2211 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCATACTGTGTCTGCTTCTAT
++
+IGIIIIIGGHII@@<DDFFEHHHHGIIBHIGI
+ at HWI-ST960:105:D10GVACXX:2:1101:10798:2212 1:N:0: bcd:RPI2 seq:CACCGATGTATC
+CACCGATGTATCAATGTAGGTTGTTTTTGGAC
++
+IJJJJJJHHHHH at CCFFFFFHHHHHJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10962:2219 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTATAGGAATCTGTAACTTT
++
+IGHIJIGIJJJJ@@@FFFFFHHHHGIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10898:2220 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTAATTTCGGCTGTAGCATGT
++
+HIIEFHIIIIIJCBBFFFFFHHHHGEHIIIJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10771:2225 1:N:0: bcd:RPI1 seq:CACATCACGATC
+CACATCACGATCGAGAATGATGAACCAATTAG
++
+IFGHHHIJIGJICCCFFFFFHGHHGJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10861:2226 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTTGTTAGACTCTTCGATTT
++
+JJJJIJIJJIJJC at CFFFFFHGHHHJJJJHIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10883:2230 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAAATGTTCTCTTTCTGATTT
++
+JJJIJJJJJJIJ at CCFFDFFHHGHHIJJIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10793:2238 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAACTAATGGATGTATGAATAT
++
+HIJJJJJJJIIJCCCFFFFFHHGHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10996:2241 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTTTGTGTTGTTGACTCTGT
++
+IJJJIJJJJJJJCBCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10908:2243 1:N:0: bcd:RPI2 seq:CACCGATGTATC
+CACCGATGTATCTGGAATGATGATAACGATTTT
++
+IIJJJJJHEHHHCCCFFFFFHHHHHJJJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:10822:2244 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGTGTGTCTCAGAAAAAAAA
++
+HGHHFHHFFFFF at C@DDFDDHHGGFGGIIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11036:2163 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTCNATACAAGGACTGATTTT
++
+IIJJJJJJJJJJCC#4ADFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11235:2165 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGNGTCACTGTTGTTGTTCTT
++
+IIJJJJJJJJJJCC#4ADDFHHGHHJJJIJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11150:2169 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTTGTAGTAACTGAAAACGG
++
+JJJJJJJJIJJJCBCFFDFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11176:2178 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTCTGTTGACCAAAAAAAAA
++
+FEFFFFFEEEEECCCFFFFFHHHHHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11080:2183 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTCCATAAGCTTTGATCACT
++
+JJJJJJJJIJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11039:2186 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTAGTTAGTTGTTTTAAAAAA
++
+JJJJIFHJJGHH@<??DFFDHHDDHJJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11213:2190 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCAATAAGAATAAGAATAAGA
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11039:2203 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAGAGAAAATGAGCATTATTAT
++
+IIIGIJIIGHIJCC at FFFFFHHHHHJEEHEHJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11145:2212 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTATGTTGTCTCTTAATCGGC
++
+HJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:11168:2217 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAATCAATGCTGGTGCTAACTT
++
+HJJJJJJJJJJJCCCFFFFFHHGGDHIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11088:2218 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAAGAACAAGAACACATTTAC
++
+IJJJJJIJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11184:2224 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCACATCCTTTCAAAACAAGTTC
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJIIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11073:2233 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTAAGTCTGGAATAGCTTTT
++
+IJJJJJJJJJJJBBCFFDFFHHGGHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11102:2235 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATTTGTCGAACTTGTAAAAAA
++
+JJJIJJJHHHGHCCCFFEFFHHHHHJEHIJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11129:2239 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGGTTGGTTATACACCAAACTC
++
+IJJJJJIJJJJJB@=DFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11163:2245 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTAATATGTCTGGCTTGTTT
++
+IJJJJJJGIJJJC at CFFFFFHHHHHJJJJJGIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11431:2161 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCCGNCTTTGACTTGAACCATAC
++
+HJIJIJJJJJJJCC#4ADFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11339:2162 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTNATAGGATATCAATAAAAC
++
+JIIJJJJJJJIJCC#4ADDFHHHHHJIIIJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:11265:2164 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTNGGTCAATAGTAGATACTT
++
+IJJJJJJJIGHJ@@#4ABDFHHHGCGEIFIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11288:2167 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCTANATCTTCTTTTCAAATTTC
++
+HJJJIJJJJJJJCC#4ADDFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11397:2167 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATNCCAGACGGCAAGTGTGA
++
+JJJIJJJJHHHHCC#4ADDFHHHGHJJHIHJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11321:2204 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAAATCTGTTTGGTTGTGGAA
++
+JGJJJJJJJJJHCCCFFFFEHHHHHIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11427:2204 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCTTCTTGGTAAAGGTTGAGT
++
+IJJJJJJIJJJJCCCFFFFFFHHHHICGHHIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11305:2204 1:N:0: bcd:RPI2 seq:CACCGATGTATC
+CACCGATGTATCTACTGACCCCGAGGCTTTCGC
++
+HHHEFFCC;>>C@@@FDDBDFFHGGIIIIJHGH
+ at HWI-ST960:105:D10GVACXX:2:1101:11259:2205 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAATATGTTTCGTAGAACTAT
++
+IIIJGIJJJIJJCCCFFFFFHHHHHIJJJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11401:2214 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTGTAGAAAATGAACTATAAAT
++
+IJJIJJJJJHIJCCBFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11352:2220 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATTGAATAGTCGGGGTTACTT
++
+IJJJHHHHFDFFCCCFFFFFHHHHHJJHIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11437:2220 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATTGCGTCGTATGAGTAAAAG
++
+JJJIJJHHHHHF at CCFFFFFHHHHHIJGIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11258:2232 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAACCGAGTACTTTTGGTAGC
++
+HIJJHIJIJJJJ at BBFFFFDHHHHHJJJFHIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11443:2243 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTATGTAGTGTAGTGGTAAAA
++
+JGIJJJJJJJJJ at CCFFFFFHHHHHIJFHJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11272:2245 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAGTGCTTCAACGGCTCTGGT
++
+HIJJJJJJHHHH@@@DDFFFHGHFHIHGIIJH
+ at HWI-ST960:105:D10GVACXX:2:1101:11399:2247 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGATCATATGAACTACGTGTGGCTT
++
+JJJIJIJGIIJJCCCFFFFFHHHHHJHIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11695:2166 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAGNGCTTCCTAGAGCAAAGGA
++
+IJJJJJJJJJJJCC#4ADFFHHHHHJJJJJJHJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11611:2171 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAGGAGCTCAAGAACGGAAGAT
++
+IIJJJJJIJJHHCCCFFFFFGHHHHJJJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11736:2174 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGAATACTGTGGTTGTTTTAG
++
+JIJJJJJJJJJJCCCFFFFFHHHHHJHIJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:11736:2194 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTGATACAATTTCGGTTTCGT
++
+JJJIJJJJJHHHC at CFFFFFHHHHHJHIJJIH
+ at HWI-ST960:105:D10GVACXX:2:1101:11623:2201 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTGTTTTGGGGTTTTAAACAT
++
+IJJJJJHHHHFFCCCDFFFFHHHFHIJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11724:2214 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTTAGGACAGTTCATGTTTTT
++
+JJJJJJHHHHHFCCCFFFFFHHHHHJJJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11676:2225 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGCATCAAGCTGTAACCGAAC
++
+HJJJJJIJJHHHCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11707:2233 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGGTATGAACTATGAACACAA
++
+IJJJJJJJJJJJCCBDFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11640:2237 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTTGTTAGACTCTTCGATTT
++
+HHJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11532:2244 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCACTAGTAATAGAGCTTGGAA
++
+IIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11511:2247 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATTGGAGATATTGGTTAACT
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJIIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11573:2247 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAACAATTCGGCTAGAAATTT
++
+IGIJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11924:2158 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTNCGTCGTTGTAGAATATC
++
+IIIJJJJJJJJJCC#4ADDFHHHHHJJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:11984:2158 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCACNACCATCTCTGAACTCAT
++
+JJJJJJJJJJJJCC#4ADFFHHHHHIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11822:2166 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTNATTTTTTCTTGCAACAC
++
+JJJJJJJHHHHHCC#4ADFFHHHHHJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11773:2169 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCTTTCTTACTTCGGCCTGTT
++
+JJJIJJJJJHHHCCCFFFFFHHHHHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11943:2187 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAAGATCATATGGACGTAACAT
++
+IJJJJJJJJHJHCCCFFFFFHHHHHJJJJIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11759:2191 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATTGAGCTCTTCTTTTCTTA
++
+JJJJIJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11857:2196 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTCTGTAGTAGGCTTGCATGC
++
+HHIIJJIIJJJICCCFFFFFHHHHHJJJJJJEH
+ at HWI-ST960:105:D10GVACXX:2:1101:11838:2200 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTATCAATGTATTGTATCCG
++
+IIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11790:2208 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTGAATTTCTGTAGACTATGT
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11770:2213 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGGATGCGATCATACCAGCAC
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11869:2213 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCTGATGTTGGTTTGTAATAT
++
+IJJJJJJJJJJJBCCDFFFFHHFHHJIJJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11959:2213 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTACTGTACACACAAACTTC
++
+JJJJJJJJJJJJCBCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11892:2215 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAATAAAATGACTCTGAAAAA
++
+JJIJJJJJJJJJBCCFFFFFGHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:11899:2234 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTATAATGTAATAGTACTCACC
++
+IJJJJJJJJGHJ at BCFFFFDHHHHHHIJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12145:2162 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTGNTTCCGTTCCTGTTATCT
++
+III<==8=8 at DI?<#4=BDD:<CDDEBEE9<D
+ at HWI-ST960:105:D10GVACXX:2:1101:12229:2166 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAGNACTATTTGGGCTAAAAA
++
+JJJJJJJJJJJJCC#4BDFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12088:2170 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCTTTTGTACAAATCCAAACCT
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12143:2181 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCTTCTGTCAACCTCTTCGGA
++
+IJJJIJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12198:2193 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCAGGGATGATGATTCAATTA
++
+HIJJIJJJJJJJCCCFFFFFHHHHHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12019:2199 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCATTGTTGAACTTAGAATCAA
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12174:2199 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTCTGTAGCTCTAGACCATTC
++
+JGIIJJJJJJJJ at CCFFFFFHHHHHJJJIJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:12126:2204 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTATTCCCGTTGAGAGGATCAT
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12157:2207 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTGCTACTCTCCTCGTCTCCT
++
+JGJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12048:2210 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTACCACTCTTGCATTTGCAT
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12070:2217 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCACAGAGCTCTGATTAAAGTG
++
+JJJJJJJJJJJJCCCFFFFFHHHGHJJJJJHI
+ at HWI-ST960:105:D10GVACXX:2:1101:12006:2219 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTAGTTGAGCGGTTGAATAC
++
+IIJJJJJJJJHHCCCFFFFFHHHHHIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12122:2230 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTCTGTATGCTTTTTTGGGAC
++
+==C@=@@A=777@@CFFDFDD<DFHGHIEHGEC
+ at HWI-ST960:105:D10GVACXX:2:1101:12107:2231 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTCACAACCTGTGAAAATCT
++
+HFHIGIJJJJIJCCCFFFFFHHHHHIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12066:2240 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTGTGGATGATGAAGAGTTTT
++
+IIJJJJJJJIJJCCCFFFFFHHHGHJJIIGJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12166:2250 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCTGCAATATTCTAAAGAACTC
++
+JHJJJJJJJIJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12124:2250 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGAATTTGGATTTGATCAGTA
++
+JJJJJJJJJJJJCBCFFFFFHHHHHHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12360:2161 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTNTAATTTCTATTTGGACT
++
+IJIJJJJJJJJ)CC#4ADDFHHHHHJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12436:2174 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTATAAAGTTAGTTGGTGGTTG
++
+IJJJJJJJHHHHCCCFFFFFHHHHHJJGHIHII
+ at HWI-ST960:105:D10GVACXX:2:1101:12303:2179 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATCTTTCTACTTTCATTAAC
++
+JJJJGJJJJJJJ at BBFFFFDHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12490:2188 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCTTCAATTATGAGTTTTCCA
++
+HIJJJJJJJJJJCCCFFFFFHHHHHHIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12308:2196 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGATCTATAGTTAAAAGAGCACTAA
++
+JJJIJIG at HHIJ@@CFFFFFHHHHHJIJJIJG
+ at HWI-ST960:105:D10GVACXX:2:1101:12371:2201 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTGGTTTGGACAAAAAAAAAA
++
+C at CBBDDBC:ACCCCDFFFFHHHHHJJIJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:12329:2218 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGATCCTTTGTCGCTAAGATTCGA
++
+JJJJJJJFHJIICCCFFFFFHHHHHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12376:2223 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCTGATCAAGTACAAGGGTTAT
++
+JJJJJJJJJJJJCCCFFFFFHFHFHJIIJEGHJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12362:2226 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTAATATCGCATTAGCCCAGT
++
+IIIIIIIIIIII@@@DDDD?FFFFAGIFFFF9F
+ at HWI-ST960:105:D10GVACXX:2:1101:12430:2229 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTAATATACACTGAACTTTT
++
+JJJJJJJJJJJJCBCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12484:2235 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTAAGTTTCTATCAAAAAAA
++
+IJJJJJJJHHHHBBCFFFF;FHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12259:2237 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGCCTTGCTCTTCATTGGTTTC
++
+HIJIIGIGIIIJ at CCFFFFFHHHHHJJIIIJHH
+ at HWI-ST960:105:D10GVACXX:2:1101:12345:2240 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCCCGATAAATAGAACGATAT
++
+JJJJJJJJJJHHCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12290:2249 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTTGTCTGAAAAAAAAAAAA
++
+C at CBDBDBCDDCCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12543:2162 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCACNCGGTTGGTTTCCGTTAT
++
+JIJJJJJJJJHHCC#4ADDFHHHHHJJJIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12590:2166 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATNTGTATAAATAGTTTAAA
++
+IIIJJJJJJJJJCC#4BDDFHHHHHJIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12617:2173 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTAGTCTTATTGTATCTGT
++
+IHIJJJJJJJJJCBCFFDEFHHHHHIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12673:2203 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTGATTCAAATCGATCCCT
++
+IIJJJIJJJJJJC at BFFFFFHHHHHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12575:2204 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTTTATATTATGTGAAGTAC
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12730:2214 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTGAGTCGATCGTAGAGTCT
++
+HJJJJJJIJJJJCBCFFFFFHHHHHJJIJHHJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12674:2224 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTTTGTTTGATGTCTATGAT
++
+GFHIJGJIIJJJCB at FFFFFGGHHHJJIJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12690:2226 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCACTAGCTTCTACTTTGATAT
++
+?9D:CHGHC787@@@DAD8DBFHAHIIB?<F?I
+ at HWI-ST960:105:D10GVACXX:2:1101:12653:2228 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATTGTTTCTGTCTATGACTCC
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12702:2234 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAGAGCCTTGTTTCTTATTTT
++
+IGIJIIJIJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12587:2240 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCTTATTGATGATTCTATCTT
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12614:2244 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTCGACATTTGGTGTGAAATGC
++
+HJJJJJJJJIJHCCCFFFFFHHHHHIJJJJJHI
+ at HWI-ST960:105:D10GVACXX:2:1101:12898:2157 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTNGTTAGTCGGACATCTTT
++
+HIIJJJJJHHFHCC#4ADDDFHHHGJJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12779:2159 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTNTAGGAATCTGTAACTTTT
++
+IJJJJJJJJGJJCC#4ADFFHHHHHIIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12941:2162 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAANCCATCGGCTCCTTCTTTC
++
+FGIIJGIGIJEHCC#4ADFFHHGHHJGIIIJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:12761:2162 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATNGAATTCAGAACTTTGTG
++
+HIIIIIIIIIII@@#4=BDDHHHHHIIIIIIG
+ at HWI-ST960:105:D10GVACXX:2:1101:12849:2171 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGCCCGACCTCGGACTGGGAAC
++
+HHHHHHFFFFFFCCCFFFFFHHHHHJJJJJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12894:2184 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAAAGTAGTCTCATCTTATCAC
++
+HJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12816:2185 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTTAAAGGCTTATTATCAAAA
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12946:2186 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTCTGATGAAATCTCATATTGA
++
+HJJJJJIIJJJJ@@BFFFFFHGGGHJJJJJJEI
+ at HWI-ST960:105:D10GVACXX:2:1101:12964:2189 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCTAATATATGGACAATTTGGT
++
+HGIIIJJJJJJJCCCFFFFFHHGHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12914:2190 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTATGTAACAACTTTTCATCT
++
+IIIIJJJJJJJJCBCFFEFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12899:2205 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAAGAAAGTAGCATCAAAACAA
++
+IJJHJIJJJJJJ at CCFFFFBFHFHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12750:2211 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCATCTAGTACATACTCTGTTT
++
+JIJIJJJJJJIJCCCFFFEFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12962:2211 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTTTTGTCTGAGTACGAACT
++
+JJJJJJIHJJJJCCCFFFFFHHHHFHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12876:2225 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTATAATTTTTAGTGAATAAC
++
+IJJJJJJJJIIJBBBFFFFFHHHHHHIHJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12908:2229 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATTATGATGTAGAAGTATTG
++
+IJJJJJIJJJJJBCCFFFFDHBFHHJJFHIJI
+ at HWI-ST960:105:D10GVACXX:2:1101:12760:2229 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTTGGGCTCTTGTTGTGAATC
++
+IIJIJIJJJIJJCCCFFFFFHHHHHJJIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12926:2234 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTATTCAGCAGGATTATGCT
++
+GHJGEIJJIJJIC@@FFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12942:2239 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTATTTCATTGTCTTGTCGGT
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJHIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:12902:2246 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTTATTTACATGTTGTTTGG
++
+IGIHIIIJJJJJCCCFFFFFHHHHGIJIJJJH
+ at HWI-ST960:105:D10GVACXX:2:1101:13152:2167 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGNAGAGCTGAAGAGCTTGAC
++
+FGIIIGIIAGII@@#4ADDDFHHFFIBIIIICH
+ at HWI-ST960:105:D10GVACXX:2:1101:13052:2176 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCTTTGTGACTGATCATTAG
++
+HHJJJIIJJJJJCCCFFFFFHHHHGJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13197:2180 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTTTGTCACATTGTAAATCCC
++
+IJJJJJJJJJJJCBCFFFFFHHHHHIIIIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13235:2181 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTAATAAGATTTTCTAGTTG
++
+IIJJJJJJJJJJCCCFFFFFHHHHHJJJJIGH
+ at HWI-ST960:105:D10GVACXX:2:1101:13099:2185 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATTCTCTGTATCTCTCGACTCTCT
++
+IJJJIIJJJGIJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13082:2187 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTAGTATTATTATACACACTTG
++
+HJJIGIGGHHJJ@@@DDEFFHHFHDIJJIIIEI
+ at HWI-ST960:105:D10GVACXX:2:1101:13132:2192 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTATAAATAAGCTTTGTTCA
++
+JJJGGIJJJJJJCCCFFFFFHHHHHJGGGHGI
+ at HWI-ST960:105:D10GVACXX:2:1101:13120:2196 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTAATTTGGACTGAGTCTGT
++
+JJJJJJJIIJJJB at BFFFFFHHHHHHIHIHJH
+ at HWI-ST960:105:D10GVACXX:2:1101:13177:2199 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCACTACGTCGTTTTGTTCTCTC
++
+IIJJJJJJJJHHCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13060:2203 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAATTAAAGAAGAACCCAAAAC
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13106:2213 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTCGTAAACTCATAAATAAAT
++
+IJJIIJJJJJJJCCCDFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13215:2231 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCACTGTGTTGGCGTTTTATCT
++
+JJJJJJJJHHHHBCBFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13012:2238 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAAATGCCCATTAATCGTGGT
++
+IJJJJGIIJJJJCCCFFFFFHHHHHJJJGHJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13172:2240 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTGCCTATTTATTTGCTGTC
++
+HGJJIIJJJJJJCBCFFFFFHHHHHJHIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13045:2241 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTCTGAGATTGTAGAACAAT
++
+IIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13155:2249 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCAAAAGGTCAAGGTTGGCAAG
++
+IJJJJJJJJJJJBCCFFFFDFHHHHFHJJIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13431:2158 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGATCGANGTTAGAACTCGAATCAG
++
+GGJJJCGCHIJJCC#4ADDDHHHHHJJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:13336:2159 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTCNATCACATCTCCCTCTTGA
++
+IJJJJJJJJIJJCC#4ADFFHHHHHJJJJJIJI
+ at HWI-ST960:105:D10GVACXX:2:1101:13413:2164 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTANCAGTTGATAAATGAATAA
++
+IGHGIIIIIIII@@#4ADADFHHHHGHIIIGII
+ at HWI-ST960:105:D10GVACXX:2:1101:13458:2176 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTATGTAATGTAGTCTTTTAT
++
+IIJJIJIJJJJJCCCFDFFFHHHHHIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13473:2178 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCGTTAGGACAGTTC
++
+GHHGBDHII=BF@@@FFDFFHHHHH
+ at HWI-ST960:105:D10GVACXX:2:1101:13435:2183 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTGAATAATGAACTTTGATTAA
++
+IJJJJJIJJGIJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13272:2183 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTAAATCTCCCTTTTTTTGT
++
+JGIJJHHHHHHFCBBFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13312:2186 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTGTGTAGAATCTGCTTATAA
++
+HIJIJJJJJIJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13253:2186 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATAGTTTGGACGTTGGTACACGA
++
+IIIGIEEHGHHG@@?DDDFFFHHGABFBHIII
+ at HWI-ST960:105:D10GVACXX:2:1101:13363:2187 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTGCTAAGGAAGTAAAAGCCAT
++
+JJJJJJJJJJJJCCCFFFFFHHHHHIJJIIIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13404:2208 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCACGACATTGCATTGTATGTTG
++
+IJJJJJJJJIIICCCFFFFFHHHHHJIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13366:2209 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTATATGTTGTCGGTTCTAGT
++
+FAFIIEHGGHAG@@@F=DFFBFFFHHIAHE<C
+ at HWI-ST960:105:D10GVACXX:2:1101:13340:2212 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAATATGTTTCGTAGAACTAT
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13430:2220 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTATGTTTTGGATACATAAAC
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13478:2222 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCATGGTGATGAAACGAATATTT
++
+IJJIJJIJJJHHBCCFDFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13253:2222 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTATGGGTCTCTAGATGCTTT
++
+IJJJJJJJJJJJCCCFFFDFHHHGHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13357:2234 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGTCTTTGGTGCCCATGCAA
++
+IIIIIIIIIIII@@@??DAB>F?DFACB?C?E
+ at HWI-ST960:105:D10GVACXX:2:1101:13444:2236 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTTTACGATTCATGGTTCTGT
++
+IHICBFHGIIII<@@FFBDDHDDHHGEHHBG?A
+ at HWI-ST960:105:D10GVACXX:2:1101:13383:2241 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATAATCTCTACTGTTTGTTCT
++
+FHIGIIGAGEHICC at FFFFFHHHGFHIGHCFEE
+ at HWI-ST960:105:D10GVACXX:2:1101:13323:2243 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATTCTCAATACTTTCTTCCTC
++
+HJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13571:2162 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTNTGTAGAATAAAGCTCTCT
++
+IJJIJIIJJJJJCB#4ADDDHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13621:2162 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTNATATACACTGAACTTTT
++
+JIJJJJJJJIJJCB#4ADFFHHHHHJIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13664:2164 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGATCTTNCGTCGACTATGATTAAT
++
+JJJJJJJGIJJJCC#4ADDFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13556:2177 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTTTGTATAAACGGAATTTCT
++
+HIJIJJJJJIJJCCCFFFFFHHHGHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13647:2177 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCTTGATCACGAACATAATATT
++
+HIJJJJJJJJJJCCCFFFFFHHHHHIJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13575:2184 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAGCTTGCAAGTTCTCTCTGAA
++
+JJJJJJJJJJIJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13528:2185 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATAGTATGTTTGCGGATTAT
++
+IIJJJJJJJJJHB at BFDFFFHHHHHJJGIIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13614:2188 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTTCTTTCGAGTTTTATGAT
++
+JJJIJJJJJJJJCCCFFFFFHHHHHJJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:13510:2190 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTGTCTTTCTCCTTCTCTTCT
++
+JGIJJJJIJJJJCCCDFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13692:2200 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTGCTTTGCTTAATTCATTG
++
+HIJJJJIJJJJJC at BFFFFFHHHHHJJJJJJH
+ at HWI-ST960:105:D10GVACXX:2:1101:13666:2203 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTCAAATTTCAATGAGATTGT
++
+IJJIJJJJJJJJCCCFFFFFHHHHHIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13720:2208 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATCAGAGTGACTCAACCAAA
++
+IJJIJIIJJJJJBCCFFFFDHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13526:2209 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAGCCCTTTGTCGCTAAGATTC
++
+JJJFJJJJIGFHCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13506:2209 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAATAATGTGTGTGGGACTTA
++
+FHIIIIIIIIII@@@DDDD;CCFF;GFHHAEH
+ at HWI-ST960:105:D10GVACXX:2:1101:13623:2212 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAATGGCAATCGTCTCTCTAT
++
+IIJJJJJJJJJJCCBFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13684:2220 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTATGGTCCCCACTGAGAACT
++
+IJJJIJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13646:2224 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTTTGTTATAGATTCCTCCT
++
+IJJJJJJJJJJJCBCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13506:2227 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAGGAACAAGGATTACAAGAA
++
+HIJJJJJJJJJJC at CFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13700:2234 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTATAAGCTGAGCGAATATTAG
++
+IJJIJIJJHHHHCCCFFFFFHHHHHIJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13525:2242 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTGTTATTGGCCCAAGTAGA
++
+HDHIIIJJIJGI at CCFFFFFHFFHHJIGCGGH
+ at HWI-ST960:105:D10GVACXX:2:1101:13744:2243 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTATGCTCTTTTAATGTGCAT
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJHJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13514:2246 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTTTTCAAACTGAGCAAAAAT
++
+F=FDGIHGHGHG@@@DFDBDFHHDD:ACFHGHI
+ at HWI-ST960:105:D10GVACXX:2:1101:13631:2249 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAGTTAATGTCTCTGAAACAA
++
+IJJIJJJJJJJJCCBDFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13611:2250 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAACGTAGAAACTCTTGGTAA
++
+JJJJJIJJJJJJCCCFFFFFHHHHHJJJJHIH
+ at HWI-ST960:105:D10GVACXX:2:1101:13895:2161 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTNATGTTGGCAAAGAAACAC
++
+IJJGIGHHJHHH@@#4ADDDHHHHFJGHIJIHH
+ at HWI-ST960:105:D10GVACXX:2:1101:13803:2166 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCACNGTGTTGGCGTTTTATC
++
+IGIJJIJJJJHHCC#4ADDFHHHHHIJJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13821:2166 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTNCGTTCTCTGTTGATGAC
++
+F=F;FADEEHGC@@#4=DDDFFHHFIF>C?EF
+ at HWI-ST960:105:D10GVACXX:2:1101:13873:2169 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGGGGGTCCCAGTTCCGAACCC
++
+HHHFFFFFFFEECCCFFDFFGHHHHJJJJJIIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13832:2175 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTTGTGCCTTTTTCTCTTCT
++
+HJJJJJIJJJJJC at CFFFFFHHHHHJJJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13756:2181 1:N:0: bcd:RPI1 seq:CACATCACGATC
+CACATCACGATCACAGTCGGCTTACCCGGGGAC
++
+DCFFEEEEDDDD at CCFFFFFHHHHHJJIIIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13888:2181 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTGAGAGATTTCGTAAAAAAC
++
+IJJJJJJJHHHHCCCFFFFFHHHHHIJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13863:2184 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTTGGTTGGTGTAAAAAAAA
++
+HHHFFFFFEEEEBCCFFDFFHDFFHIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13978:2187 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTTGACTCTGTAGCTTTACTT
++
+HHIHJJIJIIJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13770:2198 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCAACATATGTTTCATAATGT
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13874:2204 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCATAAAAGTTGTCGTAGCATAA
++
+IJJIJJJJJJJH at CCFFFFDHHHHHJJJJJJHH
+ at HWI-ST960:105:D10GVACXX:2:1101:13985:2213 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCTCTTGACTTGCCTCCTTACC
++
+HIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13941:2214 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGATCTATTTATATATTTGATGTTT
++
+JJJJJJJHIJJJCCCFFFFFHHHHHJJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:13963:2214 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTCTGTCTATTTCGTTAAATC
++
+JJJJJJJJJJJJCCBFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:13752:2222 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCTTTGTCAATTGTCATATTTGC
++
+JJJIIJJJJJJJCCCFFFFFHHHGHJJJJJJHI
+ at HWI-ST960:105:D10GVACXX:2:1101:13859:2223 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTCTGTTTCAATGTCCCTTGC
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJ<4
+ at HWI-ST960:105:D10GVACXX:2:1101:13939:2238 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAGAGTCAAGACTCAAGACTAT
++
+IJJJJJJJJJJJBCCFDFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14150:2157 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCACNGTTGTAGTCTCTGTGTAT
++
+HIJIJJJJJJJJCC#4ADDFHHHHHJJJHHHHJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14171:2160 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCGNATGAACTCTGGTTTAGTT
++
+HHJHJJJJIJJICC#4ADFFHHHHHJGHJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14041:2163 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCTANATATGTAGTCTTATGTCT
++
+IJJHJJJJJJJJCC#4ADFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14084:2164 1:N:0: bcd:RPI1 seq:CACATCACGATC
+CACATCACGATCTCNGATGATGATCAAATCAT
++
+HFHIFIJIIJIJCC#4ADDFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14180:2173 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCACAACAGCATATTTATAAA
++
+FBF at GGIIGGHI@@@FFFFDHHBDHIJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14103:2174 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAACAAAAGTGGCTGTAGTTT
++
+JJJJJJJJJJJJBCCFFFFFFHHHHJIJJGJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14196:2181 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTAGGTGTTACTGTGGATTTC
++
+G4BFFHEHIHGE:==DD2BDHHBHDIEE at DGHE
+ at HWI-ST960:105:D10GVACXX:2:1101:14128:2184 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTAATGTAGTAGCAACTCTT
++
+JIJJJJJJJJJJCBCFFFFFGHHHGJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14033:2191 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTGGTAACTGGACTCTGAT
++
+HGIJJJJIJJJJC at CFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14074:2199 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTAATACACTTTCCCTTACAT
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14019:2201 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCTCTCTGTGATTCTCTTTTTA
++
+HDGFHJIGJIGICCCFFFFFHHHHHIJJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:14232:2204 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAAGCTGGAAACTTTGAGCTT
++
+IIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14143:2204 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTTGTGGCACACTAAGCTG
++
+JGJJJJJJJJJJ at CCFFFFFHHHHHJJJJJI3
+ at HWI-ST960:105:D10GVACXX:2:1101:14121:2210 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTCTAGTAGCATGTGAATTTA
++
+IIIIIIIIIIII@??DDAD;?DHD?DDHGEGC
+ at HWI-ST960:105:D10GVACXX:2:1101:14168:2213 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTATTCTATCGGATTCTCAAC
++
+IGJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14102:2217 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTGTATTTGATCTACATTGTAT
++
+HGHGIJIJIIGIBCBFFFFFGHHGHJIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14036:2225 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTCCCGAACTCTACGTAGAAAT
++
+IJJJJJJGJJJHCCCFFFFFHHHHHJHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14209:2227 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTACTCAACACTCTCTTCTT
++
+IIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14087:2229 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTGAGTTCTTAGCCATTGCAT
++
+IGIJJJJJJJJJCCCFDFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14127:2230 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCACTCTGGATTCAATTTGGAT
++
+JJJGIJJJJJIJ at CCFFFFDHHHHHJJIIJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:14273:2157 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTNCTCGTCGCTTGTGGCTC
++
+H at EHIHHHHHHHCC#4ADFDHHHHHJFHIHIH
+ at HWI-ST960:105:D10GVACXX:2:1101:14385:2158 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCGNGACAAAAGAACTGGACTC
++
+IJJJJJJJJJJJCC#4ADDFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14449:2160 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTCNCTGTCACAATGGTTAAAC
++
+IJJJJJJJJIJJCC#4ADDDHFHHHJIGIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14408:2163 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTNTGTTTTTCCCAAAATAC
++
+HHJJJJJJJJJJCC#4ABDFHHHHHJJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:14427:2163 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTNACAGAAGATAGAGAGCAC
++
+HJJJJIJJJJJJCC#4ADFFGHHHHJJIIJJGI
+ at HWI-ST960:105:D10GVACXX:2:1101:14472:2172 1:N:0: bcd:RPI1 seq:CACATCACGATC
+CACATAACGATCCTCTGTGTCTCTCTCGATCGA
++
+HHJJJIJJJJJHCCCFFFFFHHHHHJJJJJJ33
+ at HWI-ST960:105:D10GVACXX:2:1101:14402:2183 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAATAAAGTGGTCTAGTGGTT
++
+IJJJJJJJJJJJCCCFFFFDHHHHHJIEGIHG
+ at HWI-ST960:105:D10GVACXX:2:1101:14443:2185 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCTTTTACTGTCCTCTGATCAG
++
+JJJIIJJJJJJJCCCFFFFFHHHHHJJJJJJ3
+ at HWI-ST960:105:D10GVACXX:2:1101:14420:2208 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTATGTATATATAAGAGTCAT
++
+IJJHJJJJJJJJCBCFFDFFGHHHHJJJJHHGJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14467:2209 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGAAACTGTACTTGAGATTA
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14311:2215 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTCTTTATGGCTCTAGTACAA
++
+JIJJJJJIJJJJCCCFFFFFHHHHHJJJIIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14442:2218 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAAAAATGTCGTTGTAGTATAG
++
+JJJJJJJJJJJJCCCFFFFEHHHHHHJJIIJGI
+ at HWI-ST960:105:D10GVACXX:2:1101:14388:2226 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAATTCCAGTTGATTGAGGTC
++
+ICHIHIFHIJJJCCCFFFFFHHHHHJGHJJII
+ at HWI-ST960:105:D10GVACXX:2:1101:14404:2228 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGTTGTTGGCTATGATGTTAT
++
+HIIJIJJJJJJJCCBFFFFFHHHHHIIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14361:2234 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAAATTATGATGGAAGATTTGT
++
+HHJJJIJJJJJJCCCFFFFFHHHHGJJHJJJ34
+ at HWI-ST960:105:D10GVACXX:2:1101:14303:2235 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCACATTTAGGCTCAGTGGGA
++
+JIJJJJJJJIJJCCCFFFFFHHHHHJGHIIG
+ at HWI-ST960:105:D10GVACXX:2:1101:14342:2235 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGCTCTTCAACCTTAGAAGA
++
+IGJJJJJJJJJICCCFFFFFHHHHHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14263:2238 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTACTTTCTCGTGCTAACTC
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14722:2164 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTNGTTGGCCTTAAAAAAAA
++
+EEHHEHFFFFFECC#4ADFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14632:2164 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGNTGATTCTCCTTAGATCTG
++
+FHIIJJJJIIJICC#4ADDFHHHGHJJJJJJGI
+ at HWI-ST960:105:D10GVACXX:2:1101:14512:2169 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGCAATCCCTCTGTTTCCTAA
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14677:2181 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTGACAGAAGATAGAGAGCAC
++
+IIJJJJJJJJJJCCCFFFFFHHHHHJJJJIIGJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14738:2194 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAATGTTCATGTCTAAATTCG
++
+HHJJJJJJJJJJCCCFFFFFHHHHHJJJJJJ3
+ at HWI-ST960:105:D10GVACXX:2:1101:14684:2203 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAAGCCGGAGACAGGAGAGGTG
++
+HHHHFFFFEEEECCCFFFFFHHHHHJJJJJJ*?
+ at HWI-ST960:105:D10GVACXX:2:1101:14526:2204 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCACATAGACTAATCTTATAAT
++
+JIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14580:2206 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAAATAAGGTATCAGGTTTTA
++
+IIJIJJJJJJJJCCCFFFFFFFHHHJJEHIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14592:2223 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTTATAGGGAGAAGAAGAGGC
++
+HDHIJIJJJJHHCCCFFFFFHHHGHJJJIJJ34
+ at HWI-ST960:105:D10GVACXX:2:1101:14659:2235 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAATTGGTGCCTGTAGGTCAG
++
+IHJJJJJIJJJJCCCFFFFFHHHHHJJJFHI3
+ at HWI-ST960:105:D10GVACXX:2:1101:14548:2237 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCAATTTTATGTCGTTTCTTTG
++
+JJJIIJJJJJJJCCCFFFFFHHHHHIJJJJJ<
+ at HWI-ST960:105:D10GVACXX:2:1101:14792:2167 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCTANGGTTTGGCTGTTAACAC
++
+FBGE>FHIJJHHB@#4ABDFHHHHHIJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14962:2168 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAATCCACACTAAGTCCAAGC
++
+HIJJJJJJJJJJCCCFFFFFHHHHHHIJIJJG
+ at HWI-ST960:105:D10GVACXX:2:1101:14851:2171 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTATTTGTAGCAATTCTGTTTT
++
+IJJJJJJJIIJICCCFFFFFHHHHHJJIIFHHJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14982:2172 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCGTAATCTGGGATGAACTCACT
++
+JJJIJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14927:2184 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATTCTTGTTTAGAAGCAAGAA
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14906:2195 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGCCAACTCTGTTTCTTCTTCT
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJIJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14858:2195 1:N:0: bcd:RPI3 seq:CACTTAGGCATC
+CACTTAGGCATCATTCGTTTCAATGTCAATCTC
++
+IIIHGIHGIJJJ at BCFFDEFHHHHHIJJIJJII
+ at HWI-ST960:105:D10GVACXX:2:1101:14936:2201 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAGCCAATGTTGTAGAACTAT
++
+HIIIIIIIIIII@@CFFDFFHDAFFBHIG at H@
+ at HWI-ST960:105:D10GVACXX:2:1101:14780:2204 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTTGTGAATCCTTTTCCATT
++
+IGJIJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14808:2217 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAATGAAGAGGCTGTTTCTAC
++
+IGIJJJJJJJJJCCCFFFFFGHHHHHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14828:2217 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATGTATGTTGTTATTTGATAA
++
+HGIGIGIJHIJI at CCDFFFFHHHHHJJJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14929:2217 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAACACTCTTATCAAAAAAAA
++
+IJHHHHFFFFEECCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:14844:2223 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCATACATCTTTGCAGAACTCAT
++
+HIIC=CGCFGIH at C@FFFDFHGFDFD<ABBDIF
+ at HWI-ST960:105:D10GVACXX:2:1101:14988:2233 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAGCTTAGACTTGGTAGTTGT
++
+HHJJJJJJJJJJCCCFFFFFHHHHHEHIHIIG
+ at HWI-ST960:105:D10GVACXX:2:1101:14821:2236 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAGTGTACTTGTGGACAAGGT
++
+FFHIHIJGHIJJ@@=DDEFFHHHHGJJJJJI>
+ at HWI-ST960:105:D10GVACXX:2:1101:14761:2243 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATTTGTAGTCGTAAATATCT
++
+IHJJIJJJJIJJCCCFFFFFHHHHHJIJIIII
+ at HWI-ST960:105:D10GVACXX:2:1101:15012:2166 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAANTTCTCCCATCAGTTACAA
++
+IIJJJJJJJJJJC@#4ADDFHHFHHJJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15055:2167 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAGNAACTGTATCTATGTCGT
++
+JJJJJJJJJJJJCC#4ADFFHHGHHJJJIIJG
+ at HWI-ST960:105:D10GVACXX:2:1101:15030:2168 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTCTGTTACACGCCGAGATC
++
+JJJHHHFFFFFECCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15079:2180 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTCAGGGCAAGCACAACATAT
++
+JJJJJJJJJJJJCCCFFFFFHHGHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15143:2186 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCATCTTTTTCATCCCAATCTGT
++
+HIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJ<3
+ at HWI-ST960:105:D10GVACXX:2:1101:15178:2193 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAGTGATGAACCTTTTGAACC
++
+IJJJJIJJJJJJCC at FFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15053:2195 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAATCCAGTCTCATCGCTGTTG
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJIJJJJEI
+ at HWI-ST960:105:D10GVACXX:2:1101:15025:2214 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGATCGTATGTAAAGGTTTACTCTTT
++
+JJJJJJJHIJJJCCCFFFFFHHHHHIJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15186:2216 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCAGAGCAAGTCGAAATCTGTT
++
+JJJJGJJJJJJJCCCFFFFFHHHHHJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15065:2224 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTGTGCTGGGAACTATTTGAC
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15143:2225 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATGAAAACTTCTTGAGTTAT
++
+IIJJJIJIJJJJCCCFFFFFHHHHHJJJIIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15008:2227 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCTTTCTTGGGACTTGATTTTT
++
+IGIHIJHGHHFF#CCFFFFFHFHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15207:2236 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTAGTGTGTAATGTTATTGG
++
+IIJIJJJJJJJJBCCFFEFDHHHHHJHJJJJ34
+ at HWI-ST960:105:D10GVACXX:2:1101:15000:2247 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTTGGTCATGTTTGCTATTTG
++
+FFF;FF at G3=DC at CCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15342:2165 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCCGNATCTGGATTTAAGATAA
++
+IGIIIJJJJJJJCC#4ADFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15274:2198 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCATCTGTCTAAAGTTTGTTCT
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15308:2216 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAGTAATTTAGCATGTTGCAAA
++
+IJJIIJJJIIJICCBDFFFFHHHHHJJJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:15475:2222 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTCTGTAGTTGTATTTCAAC
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15291:2232 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTATGTTGTTAGCTATCACT
++
+IHJJJJJJJJJJC at CFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15347:2233 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTGAACTCTGACCAATGAACTT
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15331:2245 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTGTTATATATTACTGACTAC
++
+HJJJJIGIJJJJCCCFFFFFGHHHHJJJJJJDI
+ at HWI-ST960:105:D10GVACXX:2:1101:15450:2248 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTGTTTTGTCCCTTTGTATTT
++
+JJJJJJJJJJJJCCBFFFFFHHHHHJJHIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15610:2159 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTGNTCTGATTTCAATTTTTGC
++
+JJJJJJJJJIJJCC#4ADFFHHHHHJJJJJI33
+ at HWI-ST960:105:D10GVACXX:2:1101:15730:2162 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAGNCTGCTACAACAAAAAAAA
++
+HHH>DFDDCEEDCC#4ADFFHHHHHJJJJJJIH
+ at HWI-ST960:105:D10GVACXX:2:1101:15650:2166 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTNTTGGCAGCGTATCTTTTC
++
+HIJJJJJJJJHHCC#4ADFFHHHHHIJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15745:2167 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTNATGTCATTAATGAAAACT
++
+HIJJJJJJJJJJ@@#4ADDFGHHHFJJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15691:2179 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTACTAGTCTCGTATTAACTA
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:15591:2179 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTTTGCTTATGTGCCCGTTTT
++
+IIJJJJJJHHHHCCCFFFFFHHHGHJJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15612:2183 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATATCCTATGTCTAAAAAAA
++
+IIJIJJJHHHHHCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15528:2190 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCATTTCGGATCTTGGCTACTAA
++
+IJJIJJJJHHHHCCCFFFFFHHHHHJIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15503:2198 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAATCTAAAGGGATTTGGTGT
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJHII
+ at HWI-ST960:105:D10GVACXX:2:1101:15541:2201 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CAAACTTGAATCGTCTGTAGCTCTAGACCATTC
++
+IIIIJJGIGIJJ at CCFFDEFHHFHHJIJGGIJH
+ at HWI-ST960:105:D10GVACXX:2:1101:15700:2204 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTAAATTCTCTTCCTTTGGT
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJG
+ at HWI-ST960:105:D10GVACXX:2:1101:15649:2217 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTAATGTGATGGTTTCTTCAA
++
+IIJJJJJJJJJJCCCFFDFFHHHFHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15573:2222 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAATAGCTAGTCATAACTCTTT
++
+IJIJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15731:2236 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAATATGTTTCGTAGAACTAT
++
+JIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15639:2244 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCTTTTACGGAGTACAAGAGAT
++
+JJJJJJJJJJJJCCCFFFFFHHHFHIJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15900:2158 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGCNAGATGATGGTCATTATAA
++
+IJJJJJJJJJJJCC#4ADFFHHHHHIJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15963:2161 1:N:0: bcd:RPI1 seq:CACATCACGATC
+CACATCACGATCATNTGTAAATATACCACGAAT
++
+C=GI@=CHC7=E@@#4==BDA?DFHG@<A<CCG
+ at HWI-ST960:105:D10GVACXX:2:1101:15856:2161 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCTCNGATGATGATCAAATCAT
++
+JJJIJJJJJJJJCC#4ADFFHHHHHJJJJJII
+ at HWI-ST960:105:D10GVACXX:2:1101:15824:2174 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTATATGTCTGTACACAATCT
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15924:2187 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTATGAAAATGTTGTGAACTG
++
+IIJJJJJJJJJJCBCFFFFFHHHHHJIJJJJGJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15857:2189 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCTTAGGTTTAGAGCTAAAAAA
++
+IJJGJJJJJHHHCCCFFFDFHHHHHJJJJJJII
+ at HWI-ST960:105:D10GVACXX:2:1101:15755:2216 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTATACTACTAATACATTTT
++
+JGIIIJJJJJJJCBCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15970:2220 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCCATGACTGAAGTTGTTTGTC
++
+IJJJJJJJJJIJCCCFFFFFHHHHHJIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15886:2223 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTTGTTTTATTTCTTATTCAA
++
+IJJGJJJJIJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:15866:2238 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCTGTGTTGGCGTTTTATCTG
++
+IIJJJJJJJJJHBCCDDFFFHHHHHJJJJJJ2
+ at HWI-ST960:105:D10GVACXX:2:1101:15925:2243 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTTTTGTTGGATTGTTTTGCT
++
+FFHBHJGIEA at C@@@FFEDDHGFBHBHIJGGGI
+ at HWI-ST960:105:D10GVACXX:2:1101:15938:2248 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTCTTGTCCGTTACATTTGCC
++
+IGIIJJJJJJJJ at CCFFFFFHFHFHJJJJJJG
+ at HWI-ST960:105:D10GVACXX:2:1101:16121:2167 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTNATATATTCATGCATATT
++
+IIJJJJJIJJJJCC#4ADFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16240:2167 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTNAGTAGTAGTAATGTCAAC
++
+IIIIIECCFHII?=#4=DDDCFFFFHGHEEI at H
+ at HWI-ST960:105:D10GVACXX:2:1101:16016:2182 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCACTGTGTTGGCGTTTTATCTG
++
+HIJJJJJJJJHHCCCFFFFFHHGHFIJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16084:2189 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAAATGTGAAATCTTAAAATC
++
+IIIC?==BFHII@@@DD:=DFDDB?ECDFGED
+ at HWI-ST960:105:D10GVACXX:2:1101:16060:2193 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCGAGAATGATGAACCAATTAC
++
+HJIIGJJJJJJJCCCFFFFFHHHHHJJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:16022:2204 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCATGAGATACTGAATTCAAGC
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJ33
+ at HWI-ST960:105:D10GVACXX:2:1101:16131:2207 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTATGTATGATCATATTTTT
++
+HIJJIJJJJJJJCB at FFEFFHHHHHJJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:16147:2216 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCATTCAAATCAGAGGCTTGTTA
++
+FHIGIJIJIIFHCCCFFFFFHHHGHJJJJIFEH
+ at HWI-ST960:105:D10GVACXX:2:1101:16171:2218 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTCTTCTTCGTTTGGCTATTTT
++
+IJJJJJJJJHHHCCCFFFFFHHHHHJJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16114:2220 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTGCAGCACTTGTCTGACCCAT
++
+JJJJJJJJJIJJCCCFFFFFHHHFHJJJJJJII
+ at HWI-ST960:105:D10GVACXX:2:1101:16083:2223 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAATGTAGAGAATCGATTTAT
++
+JJJJJJJJJIJJCCCFFFFFHHHHHJJJJIJI
+ at HWI-ST960:105:D10GVACXX:2:1101:16174:2241 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCACTTTGAGAACTAAAAAAAA
++
+=7=7=E=7@###@@@DDDDDFFFFFIIIIIID
+ at HWI-ST960:105:D10GVACXX:2:1101:16002:2242 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGGAGTTTTGGTTAGGTTGT
++
+GHJJJJJJJJJJBCCDFDDFHHHFHIJJEHI:
+ at HWI-ST960:105:D10GVACXX:2:1101:16214:2243 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTTGGTAGATGATAACAAATC
++
+HJJIJJJJIJIJCCCFFDFFHHHGHJJJJJJII
+ at HWI-ST960:105:D10GVACXX:2:1101:16126:2245 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATTGTTGTTGTTGTTGTTGT
++
+IJJJJJJJJJJJCCCFFFFFHHHHHIIJIIJ;
+ at HWI-ST960:105:D10GVACXX:2:1101:16191:2247 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCTGGAGAACTTGGCAACTCAC
++
+IIIB=FHIIIII@@CFFFFDA?FFAHIIGEE@
+ at HWI-ST960:105:D10GVACXX:2:1101:16292:2160 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGCNCTTGTTAGTAGTTTCTG
++
+IGIJJJJJJIJJC@#4ADDDDHHFHJIIIJJ3
+ at HWI-ST960:105:D10GVACXX:2:1101:16335:2161 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTANTCCACTTGCTTATCATC
++
+HIIGHIJJJJJJCC#4ADFFHHHHHJJJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16262:2167 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCCANTTGAGGAACTATTGTTT
++
+C=CFHEEGHICA7;#44ABDHDDHDGG at EA@>
+ at HWI-ST960:105:D10GVACXX:2:1101:16438:2169 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATGTTCGGTTGTGGGATTCT
++
+HIJJJJJJHHHH at BCDFFFFHHHHHJJGJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16355:2177 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTTGTTAGACTCTTCGATTT
++
+HGHJJIJJIJIJCCCFFEFFHHHHHJJJJJJGJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16306:2182 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTACCTACTCGTCGTACATTTT
++
+HJJJJJJJHHHHCCCFFFFFHHHHHIJJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16427:2183 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGTTGATTTTAATGGTTACTGT
++
+BFHIJGHIEHII at CCFFFFFHHHHHJFHGHIIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16368:2191 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATAAAAACTCTGAATTTAAT
++
+IJJJJIJJIJJJCCCFFFFFHHHHHJJJJIJC
+ at HWI-ST960:105:D10GVACXX:2:1101:16496:2191 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTTCTGTTGAACCTCTTG
++
+HHJIIIIJJJIJCCCFFFFFHHHHHJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16268:2194 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTCAAACCATTGAGACAGCTT
++
+HIJJJJJIJJJJCC at FFFFFHHHHHJJJJJJGI
+ at HWI-ST960:105:D10GVACXX:2:1101:16478:2197 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCCTGTGAAACTGCGAATGGCT
++
+F=FHIHJGIJJHCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16378:2215 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTACGTTATTTAAAATCCTC
++
+IJIJJJJIJJIJCBBFFDFFHHHHHIJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16273:2227 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGTTATGTGACTGGAGAGA
++
+IIJJJIJJJJJJCCCFFFFEHHHHHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16350:2227 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTGTGGCTCAGAACCACCAC
++
+IIJHIJJJJHHHCCCDFFFFHHHHGJJJIJII
+ at HWI-ST960:105:D10GVACXX:2:1101:16328:2230 1:N:0: bcd:RPI4 seq:CACTGACCAATC
+CACTGACCAATCACTGATCGCGTCGTGTTAC
++
+HIJJJHHHHHFF at BCFFFFFGHHHHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16408:2232 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTTCGAACAATGAACAATTGC
++
+HIJJJJJJIJJHCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16369:2234 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTACATTGTGAAATGATATTTC
++
+HGEGGIJGIJJJ at CCFFFFBHHHHFGIIJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:16305:2250 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCAAACCTGTATCTGTGTAACT
++
+IIJGIJJJIJJJCCCFFFFFHHHGHGJIGHIIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16684:2159 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTNTTCGGATTTGAACAGA
++
+JIIJJIJJJJIJCC#4ADFFGGHHHJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16513:2160 1:N:0: bcd:RPI5 seq:CACACAGTGATC
+CACACAGTGATCTGNTATGTTGGTTAAGACTTT
++
+JIIIIII at C=DH at C#4ADDDFHHFHIJJJJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16553:2167 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCACNGTTTTGCTAAAATATTC
++
+HAHGIJJIJJIJCC#4ADDFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16647:2170 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTAATTGAATATCTTCAATGT
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16734:2178 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTACGAATTCTAAATTTTAT
++
+HIJIJJJJJJJJBBBDFFDDHHHHHJJJJIIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16682:2192 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTATCAATAAGCGGAGGAAAAG
++
+HIIGHGGHHHFF@@@FFFFFHHAFFHDDHIIII
+ at HWI-ST960:105:D10GVACXX:2:1101:16516:2203 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGAGAGTTCGAATCTGTCAGGC
++
+GIJJJJJJJJJJCCCFFEFFHHHHHJJGIJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16583:2204 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATCGGCGCTTGTTCACCTCTC
++
+HIHHHHHFFFFFCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16633:2220 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCATTGTATTTTAACAGCACTC
++
+JJJIJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16696:2231 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTATGTAATGTAGTCTTTTAT
++
+GGHIIIJJIIJJ at C@DDDDFHFFHDBGIIIIH
+ at HWI-ST960:105:D10GVACXX:2:1101:16666:2233 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCTTAACACTTGGTTCCGTTTC
++
+IJJJJJJJJJIJCCCFFFFFHHHHHIJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16730:2240 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCCTATAAATCGTCTCATGAA
++
+JJJGIJJJJJJJCCCFFFFFHHHHHJJJIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16561:2240 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATAACCCTTTCCAGGCCATGT
++
+CDHIGHIIIGCD@@CFDEFFHHDHHGFBHEGGJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16708:2243 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCACCATTGTCTGAATAAAAAG
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:17000:2158 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTNATCCTCGTTATATTTGT
++
+FFFIIIIIIIFI==#4=2ADFAFFF at FIIE@C
+ at HWI-ST960:105:D10GVACXX:2:1101:16900:2161 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGANCAAACCGACACTCGGGAT
++
+HHHHFFFFFFEECC#4ADFFHHHHHJJJIJJHI
+ at HWI-ST960:105:D10GVACXX:2:1101:16800:2165 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATNTATTTGGGGTTATTTGCA
++
+HIJJJJJJJJJHCC#4ADDFGHHHFHIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16874:2165 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCTTNGTTGAACGACAAAATAA
++
+GHIHEDEHHGFF at C#4=BBDHFHHGGIGJEGG
+ at HWI-ST960:105:D10GVACXX:2:1101:16973:2166 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCACNGTGTTGGCGTTTTATCTG
++
+IJIIJJIGIHHHCC#4ADDDHHHHHJJJIJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:16783:2167 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGGNTGTGCAGACTAAGGAGC
++
+FFFIIIFIIIII@@#4=DDDFFFFFIIIIIII
+ at HWI-ST960:105:D10GVACXX:2:1101:16847:2173 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCGATGTCGGCTCTTCCTATCAT
++
+GIJJJJJJJJJJCCCFDFFFHHHHHJGIGIIIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16809:2177 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCACATCCTCATAATCACTTTC
++
+FDHJJEFIGIIJCCCFFFFFHHHHHIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16946:2180 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTCTTTTGTCGGCGTTAGGT
++
+HHHHFFFFEEEECBCFFFFFHHHHHJHJJJJH
+ at HWI-ST960:105:D10GVACXX:2:1101:16831:2183 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTATGTTATGGATTCAAAAAAA
++
+HIJJJJJHHHHH at CCFFFFFHHFHHJIJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16770:2187 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTCAGCCCTTTGTCGCTAAGA
++
+HIJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16858:2188 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAATTTTTAGTGACCCTTTTA
++
+HIJJJIJJJJJJ@@@FFFFFHFFHHJIJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:16876:2193 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTATGTTCTCTGTTATTCTC
++
+IIJJJJJJJJJJCBCFFFFFHHHHHJJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16983:2194 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCTTTGTGGGTTGAGTTGTCT
++
+HIJIJJJJIJHHBCCFFDFFHHHHHJHIJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16842:2205 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTATGAAATCGACCATGACA
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16962:2210 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTCATGCTGTTTTCCAACAGC
++
+IJJEIIJJJIGH at CCFFFFFHHHHHJJIJJJIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16751:2219 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTACTGTTTTCTGTTTTCTT
++
+JJJJJJJJJJJJC at BFFFFFHHHHHHIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16898:2223 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCAACCCCCGAACTATATCCTC
++
+HIJJJJHHHHHFCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16969:2228 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCATTATCTTGTAGAATGTTCA
++
+HGIJJJJJJJJJCCCFFFFFHHHHHJJJIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:16781:2240 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTTCTCCTCTCGTCCATAAAT
++
+IJJJJJJJJJJHCCCFFFFFHHHHHIJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:17176:2160 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGCNAGATGATGGTCATTATAA
++
+GIJIJJJJJIJJ@@#4ADDFGHHHFGIJJIJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:17068:2161 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTNCACAAGAAAATCAAATAA
++
+HIJJJJJJJJJJCC#4ADFFHGHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:17154:2164 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTNGTGGATGATGAAGAGTT
++
+HII;@HGGHIII@@#44ADDFHHBFGEGGICF
+ at HWI-ST960:105:D10GVACXX:2:1101:17222:2169 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTGGATCCTGTTTTGGATTGT
++
+IIJIJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:17028:2180 1:N:0: bcd:RPI6 seq:CACGCCAATATC
+CACGCCAATATCCTATTTACTATTTGAAAAAGC
++
+IJJIJJJJJJJJCCCFFFFFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:17127:2184 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCAATTGGACTGTTTAACGTTT
++
+JGIJJJJJJJJJCCCFFFFFHHHHHJJJJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:17143:2189 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCAAATTTCTATATATTGTTTT
++
+JJJGGJIIGJJJ@@;DDFFFHGHHGJJJFHIJ
+ at HWI-ST960:105:D10GVACXX:2:1101:17161:2201 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCTTCTGGACATTAGCCATTAGT
++
+HIJJJJJJJJJJCCCFFFFFHHHGHIJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:17133:2206 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCTGCCTTTTCCTTCTTGTCGG
++
+JJJJJJJJJJJJ@@CFFFFFHHHHHJIJIIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:17121:2224 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGGCACTTCTGTTCTGATCCT
++
+JJJJJJJJJJJJCCCFFFFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:17033:2228 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCACTAGACAAACTCTCAAGA
++
+IJJJJJJJJJJJCCCFFFFFHHHHHJJJJJI
+ at HWI-ST960:105:D10GVACXX:2:1101:17178:2238 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGTTTGTAGTCATAATTTAGT
++
+IJJJJJJJIJJJCBCFFFFFHHHHHJIJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:17141:2241 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCGTATGTTTCACTCTGTAACT
++
+JJJJJJIJJJJJCCCFFDFFHHHHHJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:17119:2246 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCGAGACCAGATGTGCGATGTTT
++
+IJJJJJJIJJJHCCCFFFFFHHHHHJJJJJIJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:17246:2247 1:N:0: bcd:RPI8 seq:CACACTTGAATC
+CACACTTGAATCATTTGGTTAGGTCCTTTGTTC
++
+JJJJJJJJJJJJCCCFFFFFHHHFHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:17011:2248 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTTTTGAGGTTTTAAGATGTT
++
+HIJJJJJJJJJJBCCFFFFFFHHHHJJIJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:17270:2162 1:N:0: bcd:RPI9 seq:CACGATCAGATC
+CACGATCAGATCCCNCTCTTTCAATGCAAATTT
++
+IJJGJJJJJJJJCC#4ADDFHHHHHJJJJJJJJ
+ at HWI-ST960:105:D10GVACXX:2:1101:17469:2169 1:N:0: bcd:RPI7 seq:CACCAGATCATC
+CACCAGATCATCTGTGTTGGTGAAGGAAGGAAC
++
+GHI at FFG;CHIH@@+ADDDDAFHDFEG@?A?FB
diff --git a/src/libqes/test/data/test.fastq.bz2 b/src/libqes/test/data/test.fastq.bz2
new file mode 100644
index 0000000..e79e99e
Binary files /dev/null and b/src/libqes/test/data/test.fastq.bz2 differ
diff --git a/src/libqes/test/data/test.fastq.gz b/src/libqes/test/data/test.fastq.gz
new file mode 100644
index 0000000..a234381
Binary files /dev/null and b/src/libqes/test/data/test.fastq.gz differ
diff --git a/src/libqes/test/data/test_large.fasta.gz b/src/libqes/test/data/test_large.fasta.gz
new file mode 100644
index 0000000..7921c84
Binary files /dev/null and b/src/libqes/test/data/test_large.fasta.gz differ
diff --git a/src/libqes/test/data/truth/log_test.txt b/src/libqes/test/data/truth/log_test.txt
new file mode 100644
index 0000000..8254f87
--- /dev/null
+++ b/src/libqes/test/data/truth/log_test.txt
@@ -0,0 +1,2 @@
+Hello World
+Hello World
diff --git a/src/libqes/test/data/truth/qes_seq_print.fa b/src/libqes/test/data/truth/qes_seq_print.fa
new file mode 100644
index 0000000..69029e8
--- /dev/null
+++ b/src/libqes/test/data/truth/qes_seq_print.fa
@@ -0,0 +1,2 @@
+>TEST Comment 1
+AGCT
diff --git a/src/libqes/test/data/truth/qes_seq_print.fq b/src/libqes/test/data/truth/qes_seq_print.fq
new file mode 100644
index 0000000..d93c867
--- /dev/null
+++ b/src/libqes/test/data/truth/qes_seq_print.fq
@@ -0,0 +1,4 @@
+ at TEST Comment 1
+AGCT
++
+IIII
diff --git a/src/libqes/test/helpers.c b/src/libqes/test/helpers.c
new file mode 100644
index 0000000..2cb8763
--- /dev/null
+++ b/src/libqes/test/helpers.c
@@ -0,0 +1,207 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: helpers.c
+ *
+ * Description: Helpers for tests
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include "helpers.h"
+
+
+/* This is how we name out output files, n_writables is the num of writable
+ files we've made. */
+static int n_writables = 0;
+/* This holds the prefix. It is set (via extern) in test.c's main func. */
+char *data_prefix = NULL;
+
+
+/*=== FUNCTION ============================================================*
+Name: find_data_file
+Parameters: filepath: the file, under ./data, to find
+Description: Finds the full path to ``filepath``
+Returns: A ``char *`` on the heap that contains a valid path to the
+ file ``filepath``, or NULL on error;
+ *===========================================================================*/
+
+char *
+find_data_file(const char * filepath)
+{
+ size_t buflen = 1<<12;
+ size_t len = 0;
+ char buf[buflen];
+
+ /* Bail out if we can't get the data_prefix. */
+ if (data_prefix == NULL) {
+ return NULL;
+ }
+ len = snprintf(buf, buflen, "%s/data/%s", data_prefix, filepath);
+ /* File name is too long, return NULL */
+ if (len >= buflen) {
+ return NULL;
+ }
+ /* Null terminate AFTER making sure len < buflen */
+ buf[len] = '\0';
+ /* Check we can access the file. If so, strdup & return */
+ if (access(buf, F_OK) == 0) {
+ char *ret = malloc(buflen + 1);
+ assert(ret);
+ return strncpy(ret, buf, buflen);
+ }
+ /* If we get to here, something's gone wrong. */
+ return NULL;
+}
+
+
+/*=== FUNCTION ============================================================*
+Name: get_writable_file
+Parameters: void
+Description: Gets a temporary file which can be written to, under the data
+ directory.
+Returns: A ``char *`` on the heap that contains a valid path to a file
+ writable file, or NULL on error;
+ *===========================================================================*/
+
+char *
+get_writable_file(void)
+{
+ size_t buflen = 1<<12;
+ size_t len = 0;
+ char buf[buflen];
+ char *ret = NULL;
+
+ /* Bail out if we can't get the data_prefix. */
+ if (data_prefix == NULL) {
+ return NULL;
+ }
+ len = snprintf(buf, buflen, "%s/data/%05d", data_prefix, n_writables++);
+ /* File name is too long, return NULL */
+ if (len >= buflen) {
+ return NULL;
+ }
+ /* Null terminate AFTER making sure len < buflen */
+ buf[len] = '\0';
+ /* Check we can access the file. If so, strdup & return */
+ ret = malloc(buflen + 1);
+ assert(ret);
+ return strncpy(ret, buf, buflen);
+}
+
+
+/*=== FUNCTION ============================================================*
+Name: clean_writable_file
+Parameters: char *: filename
+Description: Unlink ``file`` and free the memory holding the path.
+Returns: void
+ *===========================================================================*/
+
+void
+clean_writable_file(char *filepath)
+{
+ if (filepath != NULL) {
+ remove(filepath);
+ free(filepath);
+ }
+}
+
+
+/*=== FUNCTION ============================================================*
+Name: crc32_file
+Parameters: char *: filename
+Description: Calculate (using zlib) crc32 checksum.
+Returns: const char *: The crc32 sum, or NULL on error.
+ *===========================================================================*/
+
+char *
+crc32_file(const char *filepath)
+{
+ FILE *fp = NULL;
+ size_t buflen = 1<<10;
+ size_t len = 0;
+ char buffer[buflen];
+ uint32_t crc = 0;
+ char crcbuf[9];
+
+ /* Open file */
+ fp = fopen(filepath, "rb");
+ if (fp == NULL) {
+ return NULL;
+ }
+ while (!feof(fp)) {
+ len = fread(buffer, 1, buflen, fp);
+ crc = crc32_update(crc, buffer, len);
+ }
+ len = snprintf(crcbuf, 9, "%08x", crc);
+ crcbuf[len] = '\0';
+ fclose(fp);
+ return strdup(crcbuf);
+}
+
+int
+filecmp(const char *file1, const char *file2)
+{
+ /* returns: -1 on error, 0 if identical, 1 if not */
+ FILE *fp1 = NULL;
+ FILE *fp2 = NULL;
+ unsigned char *buff1 = NULL;
+ unsigned char *buff2 = NULL;
+ const size_t buff_size = 65535;
+ int retval = 1;
+
+ if (file1 == NULL || file2 == NULL) return -1;
+ fp1 = fopen(file1, "r");
+ fp2 = fopen(file2, "r");
+ buff1 = malloc(buff_size);
+ buff2 = malloc(buff_size);
+ if (fp1 == NULL || fp2 == NULL || buff1 == NULL || buff2 == NULL) {
+ retval = -1;
+ goto exit;
+ }
+
+ while (!feof(fp1) && !feof(fp2)) {
+ size_t bytes_read = 0;
+ size_t res1 = 0;
+ size_t res2 = 0;
+ res1 = fread(buff1, 1, buff_size, fp1);
+ res2 = fread(buff2, 1, buff_size, fp2);
+ if (ferror(fp1) != 0 || ferror(fp2) != 0) {
+ retval = -1;
+ goto exit;
+ }
+ if (res1 != res2) {
+ retval = 1;
+ goto exit;
+ }
+ if (res1 == 0 && res2 == 0) {
+ break;
+ }
+ bytes_read += res1;
+ if (memcmp(buff1, buff2, res1) == 0) retval = 0;
+ }
+exit:
+ if (buff1 != NULL) free(buff1);
+ if (fp1 != NULL) fclose(fp1);
+ if (buff2 != NULL) free(buff2);
+ if (fp2 != NULL) fclose(fp2);
+ return retval;
+}
diff --git a/src/libqes/test/helpers.h b/src/libqes/test/helpers.h
new file mode 100644
index 0000000..1e9d21d
--- /dev/null
+++ b/src/libqes/test/helpers.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: helpers.h
+ *
+ * Description: Helpers for tests
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#ifndef HELPERS_H
+#define HELPERS_H
+
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <errno.h>
+#include <stdint.h>
+#include <inttypes.h>
+#include <time.h>
+#ifndef _WIN32
+# include <unistd.h>
+#endif
+
+#include <qes_libgnu.h>
+
+
+extern char *data_prefix;
+char *find_data_file(const char * filepath);
+char *get_writable_file(void);
+void clean_writable_file(char *filepath);
+char *crc32_file(const char *filepath);
+int filecmp(const char *file1, const char *file2);
+
+#endif /* HELPERS_H */
diff --git a/src/libqes/test/kseq.h b/src/libqes/test/kseq.h
new file mode 100644
index 0000000..a5cec7c
--- /dev/null
+++ b/src/libqes/test/kseq.h
@@ -0,0 +1,235 @@
+/* The MIT License
+
+ Copyright (c) 2008, 2009, 2011 Attractive Chaos <attractor at live.co.uk>
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+
+/* Last Modified: 05MAR2012 */
+
+#ifndef AC_KSEQ_H
+#define AC_KSEQ_H
+
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
+
+#define KS_SEP_SPACE 0 // isspace(): \t, \n, \v, \f, \r
+#define KS_SEP_TAB 1 // isspace() && !' '
+#define KS_SEP_LINE 2 // line separator: "\n" (Unix) or "\r\n" (Windows)
+#define KS_SEP_MAX 2
+
+#define __KS_TYPE(type_t) \
+ typedef struct __kstream_t { \
+ unsigned char *buf; \
+ int begin, end, is_eof; \
+ type_t f; \
+ } kstream_t;
+
+#define ks_eof(ks) ((ks)->is_eof && (ks)->begin >= (ks)->end)
+#define ks_rewind(ks) ((ks)->is_eof = (ks)->begin = (ks)->end = 0)
+
+#define __KS_BASIC(type_t, __bufsize) \
+ static inline kstream_t *ks_init(type_t f) \
+ { \
+ kstream_t *ks = (kstream_t*)calloc(1, sizeof(kstream_t)); \
+ ks->f = f; \
+ ks->buf = (unsigned char*)malloc(__bufsize); \
+ return ks; \
+ } \
+ static inline void ks_destroy(kstream_t *ks) \
+ { \
+ if (ks) { \
+ free(ks->buf); \
+ free(ks); \
+ } \
+ }
+
+#define __KS_GETC(__read, __bufsize) \
+ static inline int ks_getc(kstream_t *ks) \
+ { \
+ if (ks->is_eof && ks->begin >= ks->end) return -1; \
+ if (ks->begin >= ks->end) { \
+ ks->begin = 0; \
+ ks->end = __read(ks->f, ks->buf, __bufsize); \
+ if (ks->end < __bufsize) ks->is_eof = 1; \
+ if (ks->end == 0) return -1; \
+ } \
+ return (int)ks->buf[ks->begin++]; \
+ }
+
+#ifndef KSTRING_T
+#define KSTRING_T kstring_t
+typedef struct __kstring_t {
+ size_t l, m;
+ char *s;
+} kstring_t;
+#endif
+
+#ifndef kroundup32
+#define kroundup32(x) (--(x), (x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16, ++(x))
+#endif
+
+#define __KS_GETUNTIL(__read, __bufsize) \
+ static int ks_getuntil2(kstream_t *ks, int delimiter, kstring_t *str, int *dret, int append) \
+ { \
+ if (dret) *dret = 0; \
+ str->l = append? str->l : 0; \
+ if (ks->begin >= ks->end && ks->is_eof) return -1; \
+ for (;;) { \
+ int i; \
+ if (ks->begin >= ks->end) { \
+ if (!ks->is_eof) { \
+ ks->begin = 0; \
+ ks->end = __read(ks->f, ks->buf, __bufsize); \
+ if (ks->end < __bufsize) ks->is_eof = 1; \
+ if (ks->end == 0) break; \
+ } else break; \
+ } \
+ if (delimiter == KS_SEP_LINE) { \
+ for (i = ks->begin; i < ks->end; ++i) \
+ if (ks->buf[i] == '\n') break; \
+ } else if (delimiter > KS_SEP_MAX) { \
+ for (i = ks->begin; i < ks->end; ++i) \
+ if (ks->buf[i] == delimiter) break; \
+ } else if (delimiter == KS_SEP_SPACE) { \
+ for (i = ks->begin; i < ks->end; ++i) \
+ if (isspace(ks->buf[i])) break; \
+ } else if (delimiter == KS_SEP_TAB) { \
+ for (i = ks->begin; i < ks->end; ++i) \
+ if (isspace(ks->buf[i]) && ks->buf[i] != ' ') break; \
+ } else i = 0; /* never come to here! */ \
+ if (str->m - str->l < (size_t)(i - ks->begin + 1)) { \
+ str->m = str->l + (i - ks->begin) + 1; \
+ kroundup32(str->m); \
+ str->s = (char*)realloc(str->s, str->m); \
+ } \
+ memcpy(str->s + str->l, ks->buf + ks->begin, i - ks->begin); \
+ str->l = str->l + (i - ks->begin); \
+ ks->begin = i + 1; \
+ if (i < ks->end) { \
+ if (dret) *dret = ks->buf[i]; \
+ break; \
+ } \
+ } \
+ if (str->s == 0) { \
+ str->m = 1; \
+ str->s = (char*)calloc(1, 1); \
+ } else if (delimiter == KS_SEP_LINE && str->l > 1 && str->s[str->l-1] == '\r') --str->l; \
+ str->s[str->l] = '\0'; \
+ return str->l; \
+ } \
+ static inline int ks_getuntil(kstream_t *ks, int delimiter, kstring_t *str, int *dret) \
+ { return ks_getuntil2(ks, delimiter, str, dret, 0); }
+
+#define KSTREAM_INIT(type_t, __read, __bufsize) \
+ __KS_TYPE(type_t) \
+ __KS_BASIC(type_t, __bufsize) \
+ __KS_GETC(__read, __bufsize) \
+ __KS_GETUNTIL(__read, __bufsize)
+
+#define kseq_rewind(ks) ((ks)->last_char = (ks)->f->is_eof = (ks)->f->begin = (ks)->f->end = 0)
+
+#define __KSEQ_BASIC(SCOPE, type_t) \
+ SCOPE kseq_t *kseq_init(type_t fd) \
+ { \
+ kseq_t *s = (kseq_t*)calloc(1, sizeof(kseq_t)); \
+ s->f = ks_init(fd); \
+ return s; \
+ } \
+ SCOPE void kseq_destroy(kseq_t *ks) \
+ { \
+ if (!ks) return; \
+ free(ks->name.s); free(ks->comment.s); free(ks->seq.s); free(ks->qual.s); \
+ ks_destroy(ks->f); \
+ free(ks); \
+ }
+
+/* Return value:
+ >=0 length of the sequence (normal)
+ -1 end-of-file
+ -2 truncated quality string
+ */
+#define __KSEQ_READ(SCOPE) \
+ SCOPE int kseq_read(kseq_t *seq) \
+ { \
+ int c; \
+ kstream_t *ks = seq->f; \
+ if (seq->last_char == 0) { /* then jump to the next header line */ \
+ while ((c = ks_getc(ks)) != -1 && c != '>' && c != '@'); \
+ if (c == -1) return -1; /* end of file */ \
+ seq->last_char = c; \
+ } /* else: the first header char has been read in the previous call */ \
+ seq->comment.l = seq->seq.l = seq->qual.l = 0; /* reset all members */ \
+ if (ks_getuntil(ks, 0, &seq->name, &c) < 0) return -1; /* normal exit: EOF */ \
+ if (c != '\n') ks_getuntil(ks, KS_SEP_LINE, &seq->comment, 0); /* read FASTA/Q comment */ \
+ if (seq->seq.s == 0) { /* we can do this in the loop below, but that is slower */ \
+ seq->seq.m = 256; \
+ seq->seq.s = (char*)malloc(seq->seq.m); \
+ } \
+ while ((c = ks_getc(ks)) != -1 && c != '>' && c != '+' && c != '@') { \
+ if (c == '\n') continue; /* skip empty lines */ \
+ seq->seq.s[seq->seq.l++] = c; /* this is safe: we always have enough space for 1 char */ \
+ ks_getuntil2(ks, KS_SEP_LINE, &seq->seq, 0, 1); /* read the rest of the line */ \
+ } \
+ if (c == '>' || c == '@') seq->last_char = c; /* the first header char has been read */ \
+ if (seq->seq.l + 1 >= seq->seq.m) { /* seq->seq.s[seq->seq.l] below may be out of boundary */ \
+ seq->seq.m = seq->seq.l + 2; \
+ kroundup32(seq->seq.m); /* rounded to the next closest 2^k */ \
+ seq->seq.s = (char*)realloc(seq->seq.s, seq->seq.m); \
+ } \
+ seq->seq.s[seq->seq.l] = 0; /* null terminated string */ \
+ if (c != '+') return seq->seq.l; /* FASTA */ \
+ if (seq->qual.m < seq->seq.m) { /* allocate memory for qual in case insufficient */ \
+ seq->qual.m = seq->seq.m; \
+ seq->qual.s = (char*)realloc(seq->qual.s, seq->qual.m); \
+ } \
+ while ((c = ks_getc(ks)) != -1 && c != '\n'); /* skip the rest of '+' line */ \
+ if (c == -1) return -2; /* error: no quality string */ \
+ while (ks_getuntil2(ks, KS_SEP_LINE, &seq->qual, 0, 1) >= 0 && seq->qual.l < seq->seq.l); \
+ seq->last_char = 0; /* we have not come to the next header line */ \
+ if (seq->seq.l != seq->qual.l) return -2; /* error: qual string is of a different length */ \
+ return seq->seq.l; \
+ }
+
+#define __KSEQ_TYPE(type_t) \
+ typedef struct { \
+ kstring_t name, comment, seq, qual; \
+ int last_char; \
+ kstream_t *f; \
+ } kseq_t;
+
+#define KSEQ_INIT2(SCOPE, type_t, __read) \
+ KSTREAM_INIT(type_t, __read, 16384) \
+ __KSEQ_TYPE(type_t) \
+ __KSEQ_BASIC(SCOPE, type_t) \
+ __KSEQ_READ(SCOPE)
+
+#define KSEQ_INIT(type_t, __read) KSEQ_INIT2(static, type_t, __read)
+
+#define KSEQ_DECLARE(type_t) \
+ __KS_TYPE(type_t) \
+ __KSEQ_TYPE(type_t) \
+ extern kseq_t *kseq_init(type_t fd); \
+ void kseq_destroy(kseq_t *ks); \
+ int kseq_read(kseq_t *seq);
+
+#endif
diff --git a/src/libqes/test/kseqcat.c b/src/libqes/test/kseqcat.c
new file mode 100644
index 0000000..f6d38ce
--- /dev/null
+++ b/src/libqes/test/kseqcat.c
@@ -0,0 +1,41 @@
+#include "qes_config.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <zlib.h>
+
+#include "kseq.h"
+
+#ifdef ZLIB_FOUND
+# include <zlib.h>
+ KSEQ_INIT(gzFile, gzread)
+#else
+# include <sys/stat.h>
+# include <fcntl.h>
+ KSEQ_INIT(int, read)
+#endif
+
+int main(int argc, char *argv[])
+{
+ if (argc < 2) return 1;
+ const char *fname = argv[1];
+ gzFile fp = gzopen(fname, "r");
+ kseq_t *kseq = kseq_init(fp);
+ ssize_t res = 0;
+ while((res = kseq_read(kseq)) > 0) {
+ if (kseq->qual.l < 1) {
+ // fasta
+ printf(">%s %s\n", kseq->name.s, kseq->comment.s);
+ puts(kseq->seq.s);
+ } else {
+ // fastq
+ printf("@%s %s\n", kseq->name.s, kseq->comment.s);
+ puts(kseq->seq.s);
+ puts("+");
+ puts(kseq->qual.s);
+ }
+ }
+ kseq_destroy(kseq);
+ gzclose(fp);
+ return 0;
+}
diff --git a/src/libqes/test/logdemo.c b/src/libqes/test/logdemo.c
new file mode 100644
index 0000000..b408ced
--- /dev/null
+++ b/src/libqes/test/logdemo.c
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: logdemo.c
+ * Description: Demontrate libqes logging
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include <qes_log.h>
+
+int
+main (int argc, char *argv[])
+{
+ struct qes_logger *logger = qes_logger_create();
+
+ (void) argc;
+ (void) argv;
+
+ qes_logger_init(logger, "Test Logger", QES_LOG_DEBUG);
+ qes_logger_add_destination_formatted(logger, stdout, QES_LOG_DEBUG,
+ &qes_log_formatter_pretty);
+
+ qes_log_message_debug(logger, "Debug message, nice and quiet\n");
+ qes_log_message_info(logger, "Informative message, clearer\n");
+ qes_log_message_warning(logger, "Warning message, pay attention!\n");
+ qes_log_message_error(logger, "Error message, something's gone wrong\n");
+ qes_log_message_fatal(logger, "Fatal message, I'm leaving now\n");
+
+ qes_logger_destroy(logger);
+ return EXIT_SUCCESS;
+}
diff --git a/src/libqes/test/qes_seqcat.c b/src/libqes/test/qes_seqcat.c
new file mode 100644
index 0000000..4b1aade
--- /dev/null
+++ b/src/libqes/test/qes_seqcat.c
@@ -0,0 +1,30 @@
+#include "qes_config.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <qes_seqfile.h>
+
+int main(int argc, char *argv[])
+{
+ if (argc < 2) return 1;
+ const char *fname = argv[1];
+ struct qes_seq *seq = qes_seq_create();
+ struct qes_seqfile *sf = qes_seqfile_create(fname, "r");
+ ssize_t res = 0;
+ while((res = qes_seqfile_read(sf, seq)) > 0) {
+ if (seq->qual.len < 1) {
+ // fasta
+ printf(">%s %s\n", seq->name.str, seq->comment.str);
+ puts(seq->seq.str);
+ } else {
+ // fastq
+ printf("@%s %s\n", seq->name.str, seq->comment.str);
+ puts(seq->seq.str);
+ puts("+");
+ puts(seq->qual.str);
+ }
+ }
+ qes_seqfile_destroy(sf);
+ qes_seq_destroy(seq);
+ return 0;
+}
diff --git a/src/libqes/test/qes_seqprint.c b/src/libqes/test/qes_seqprint.c
new file mode 100644
index 0000000..773550c
--- /dev/null
+++ b/src/libqes/test/qes_seqprint.c
@@ -0,0 +1,21 @@
+#include "qes_config.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <qes_seqfile.h>
+
+int main(int argc, char *argv[])
+{
+ if (argc < 2) return 1;
+ const char *fname = argv[1];
+ struct qes_seq *seq = qes_seq_create();
+ struct qes_seqfile *sf = qes_seqfile_create(fname, "r");
+ ssize_t res = 0;
+ while((res = qes_seqfile_read(sf, seq)) > 0) {
+ int fasta = seq->qual.len < 1;
+ qes_seq_print(seq, stdout, fasta, 0);
+ }
+ qes_seqfile_destroy(sf);
+ qes_seq_destroy(seq);
+ return 0;
+}
diff --git a/src/libqes/test/test.c b/src/libqes/test/test.c
new file mode 100644
index 0000000..c3e1a3c
--- /dev/null
+++ b/src/libqes/test/test.c
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: test.c
+ *
+ * Description: Tests for libqes
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include "tests.h"
+
+
+struct testgroup_t libqes_tests[] = {
+ {"qes/util/", qes_util_tests},
+ {"qes/match/", qes_match_tests},
+ {"qes/file/", qes_file_tests},
+ {"qes/seqfile/", qes_seqfile_tests},
+ {"qes/seq/", qes_seq_tests},
+ {"qes/log/", qes_log_tests},
+ {"qes/sequtil/", qes_sequtil_tests},
+ {"testdata/", data_tests},
+ {"testhelpers/", helper_tests},
+ END_OF_GROUPS
+};
+
+
+/*
+ * === FUNCTION =============================================================
+ * Name: main
+ * Description: Run all tests
+ * ============================================================================
+ */
+
+int
+main (int argc, const char *argv[])
+{
+ int res;
+ int our_argc = argc;
+ const char **our_argv = argv;
+
+ data_prefix = NULL;
+ if (argc>1) {
+ data_prefix = strdup(argv[1]);
+ our_argc -= 1;
+ our_argv += 1;
+ }
+ if (data_prefix == NULL) {
+ data_prefix = strdup(".");
+ assert(data_prefix != NULL);
+ }
+ if (access(data_prefix, W_OK | X_OK | R_OK) != 0) {
+ fprintf(stderr, "ERROR: Could not access data prefix dir '%s'\n",
+ data_prefix);
+ fprintf(stderr, "Usage: test_libqes <DATA_DIR> [<test>]\n");
+ free(data_prefix);
+ exit(EXIT_FAILURE);
+ }
+ res = tinytest_main(our_argc, our_argv, libqes_tests);
+ free(data_prefix);
+ return res;
+}
diff --git a/src/libqes/test/test_file.c b/src/libqes/test/test_file.c
new file mode 100644
index 0000000..97c604c
--- /dev/null
+++ b/src/libqes/test/test_file.c
@@ -0,0 +1,446 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: test_file.c
+ *
+ * Description: Test qes_file
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include "tests.h"
+#include <qes_file.h>
+
+
+static void
+test_qes_file_open (void *ptr)
+{
+ struct qes_file *file = NULL;
+ struct qes_file *badfile = NULL;
+ char *fname = NULL;
+
+ (void) ptr;
+ /* Test file opening for reading */
+ fname = find_data_file("loremipsum.txt");
+ tt_assert(fname != NULL);
+ file = qes_file_open(fname, "r");
+ tt_ptr_op(file, !=, NULL);
+ tt_int_op(file->mode, ==, QES_FILE_MODE_READ);
+ qes_file_close(file);
+ free(fname);
+ /* test zipped file opening for reading */
+ fname = find_data_file("loremipsum.txt.gz");
+ tt_assert(fname != NULL);
+ file = qes_file_open(fname, "r");
+ tt_ptr_op(file, !=, NULL);
+ tt_int_op(file->mode, ==, QES_FILE_MODE_READ);
+ qes_file_close(file);
+ free(fname);
+ /* read with non-existant file */
+ fname = get_writable_file();
+ tt_assert(fname != NULL);
+ file = qes_file_open(fname, "r");
+ tt_ptr_op(file, ==, NULL);
+ clean_writable_file(fname);
+ fname = NULL;
+ /* writing with gziped file */
+ fname = get_writable_file();
+ tt_assert(fname != NULL);
+ file = qes_file_open(fname, "w");
+ tt_ptr_op(file, !=, NULL);
+ tt_int_op(file->mode, ==, QES_FILE_MODE_WRITE);
+ clean_writable_file(fname);
+ fname = NULL;
+ /* With non-existant file path */
+ badfile = qes_file_open("non/existent.file", "w");
+ tt_ptr_op(badfile, ==, NULL);
+
+end:
+ qes_file_close(file);
+ qes_file_close(badfile);
+ if (fname != NULL) free(fname);
+}
+
+static void
+test_qes_file_close (void *ptr)
+{
+ struct qes_file *file = NULL;
+ struct qes_file *nullfile = NULL;
+ char *fname = NULL;
+
+ (void) ptr;
+ /* Open file */
+ fname = find_data_file("loremipsum.txt");
+ tt_assert(fname != NULL);
+ file = qes_file_open(fname, "r");
+ tt_assert(file);
+ qes_file_close(file);
+ tt_ptr_op(file, ==, NULL);
+ /* check with null poitner, ensure no problems are caused. */
+ qes_file_close(nullfile);
+ tt_ptr_op(nullfile, ==, NULL);
+end:
+ qes_file_close(file);
+ free(fname);
+}
+
+
+static void
+test_qes_file_rewind (void *ptr)
+{
+ struct qes_file *file = NULL;
+ size_t bufsize = 1<<10;
+ char buffer[bufsize];
+ ssize_t res = 0;
+ char *fname = NULL;
+
+ (void) ptr;
+ /* Open file */
+ fname = find_data_file("loremipsum.txt");
+ tt_assert(fname != NULL);
+ file = qes_file_open(fname, "r");
+ tt_assert(file);
+ while (res != EOF) {
+ res = qes_file_readline(file, buffer, bufsize);
+ }
+ tt_int_op(file->filepos, ==, loremipsum_fsize);
+ tt_int_op(QES_ZTELL(file->fp), ==, loremipsum_fsize);
+ tt_assert(file->eof);
+ tt_assert(file->feof);
+ qes_file_rewind(file);
+ tt_int_op(file->filepos, ==, 0);
+ tt_assert(!file->eof);
+ tt_assert(!file->feof);
+ tt_int_op(QES_ZTELL(file->fp), ==, 0);
+end:
+ qes_file_close(file);
+ free(fname);
+}
+
+static void
+test_qes_file_readline (void *ptr)
+{
+ struct qes_file *file = NULL;
+ size_t bufsize = 1<<10;
+ char buffer[bufsize];
+ ssize_t res_len = 0;
+ off_t orig_filepos = 0;
+ size_t iii;
+ char *fname = NULL;
+
+ (void) ptr;
+ /* Open file */
+ fname = find_data_file("loremipsum.txt");
+ tt_assert(fname != NULL);
+ file = qes_file_open(fname, "r");
+ /* Check each line is of the right length, that the length is returned,
+ * that the string is as expected, and that file->filepos is updated.
+ */
+ for (iii = 0; iii < n_loremipsum_lines; iii++) {
+ orig_filepos = file->filepos;
+ res_len = qes_file_readline(file, buffer, bufsize);
+ tt_int_op(res_len, ==, strlen(buffer));
+ tt_int_op(res_len, ==, loremipsum_line_lens[iii]);
+ tt_str_op(buffer, ==, loremipsum_lines[iii]);
+ tt_int_op(file->filepos - orig_filepos, ==, loremipsum_line_lens[iii]);
+ }
+ /* Check that a file at EOF returns EOF. */
+ tt_int_op(file->filepos, ==, loremipsum_fsize);
+ tt_int_op(qes_file_readline(file, buffer, bufsize), ==, EOF);
+ tt_assert(file->eof)
+ /* Test with bad parameters */
+ tt_int_op(qes_file_readline(NULL, buffer, bufsize), ==, -2);
+ tt_int_op(qes_file_readline(file, NULL, bufsize), ==, -2);
+ tt_int_op(qes_file_readline(file, buffer, 0), ==, -2);
+
+end:
+ qes_file_close(file);
+ free(fname);
+}
+
+static void
+test_qes_file_getuntil (void *ptr)
+{
+ struct qes_file *file = NULL;
+ const size_t bufsize = 1<<10;
+ char buffer[bufsize];
+ ssize_t res_len = 0;
+ size_t expt_len = 0;
+ off_t orig_filepos = 0;
+ off_t our_filepos = 0;
+ size_t iii;
+ const size_t n_delims = 5;
+ const int delims[] = {' ', ',', '.', '\n', '\n'};
+ const char *delim_words[] = {
+ "Lorem ",
+ "ipsum dolor sit amet,",
+ " consectetur adipiscing elit.",
+ " Donec ornare tortor et\n",
+ "rhoncus iaculis. Sed suscipit, arcu nec elementum vestibulum, tortor tortor\n",
+ };
+ char *fname = NULL;
+
+ (void) ptr;
+ /* Open file */
+ fname = find_data_file("loremipsum.txt");
+ tt_assert(fname != NULL);
+ file = qes_file_open(fname, "r");
+ /* Check each token is of the right length, that the length is returned,
+ * that the string is as expected, and that file->filepos is updated.
+ */
+ for (iii = 0; iii < n_delims; iii++) {
+ orig_filepos = file->filepos;
+ res_len = qes_file_getuntil(file, delims[iii], buffer, bufsize);
+ our_filepos += res_len;
+ expt_len = strnlen(delim_words[iii], bufsize);
+ tt_int_op(res_len, ==, strnlen(buffer, bufsize));
+ tt_int_op(res_len, ==, expt_len);
+ tt_str_op(buffer, ==, delim_words[iii]);
+ tt_int_op(file->filepos - orig_filepos, ==, expt_len);
+ tt_int_op(file->filepos, ==, our_filepos);
+ }
+ /* Check we can give EOF as the char and make it give us the remainder of
+ the file */
+ orig_filepos = file->filepos;
+ res_len = qes_file_getuntil(file, EOF, buffer, bufsize);
+ expt_len = loremipsum_fsize - our_filepos;
+ our_filepos += res_len;
+ tt_int_op(res_len, ==, strnlen(buffer, bufsize));
+ tt_int_op(res_len, ==, expt_len);
+ tt_int_op(file->filepos - orig_filepos, ==, expt_len);
+ tt_int_op(file->filepos, ==, our_filepos);
+ tt_assert(file->eof)
+ tt_int_op(file->filepos, ==, loremipsum_fsize);
+ /* Check that a file at EOF returns EOF. */
+ tt_int_op(file->filepos, ==, loremipsum_fsize);
+ tt_int_op(qes_file_getuntil(file, '\n', buffer, bufsize), ==, EOF);
+ tt_assert(file->eof)
+ /* Test with bad parameters */
+ QES_ZREWIND(file->fp);
+ file->eof = 0;
+ file->filepos = 0;
+ tt_int_op(qes_file_getuntil(NULL, '\n', buffer, bufsize), ==, -2);
+ tt_int_op(qes_file_getuntil(file, 256, buffer, bufsize), ==, -2);
+ tt_int_op(qes_file_getuntil(file, '\n', NULL, bufsize), ==, -2);
+ tt_int_op(qes_file_getuntil(file, '\n', buffer, 0), ==, -2);
+end:
+ qes_file_close(file);
+ if (fname != NULL) free(fname);
+}
+
+static void
+test_qes_file_peek (void *ptr)
+{
+ int res = 0;
+ struct qes_file *file = NULL;
+ off_t orig_filepos = 0;
+ char *fname = NULL;
+
+ (void) ptr;
+ /* Open file and save pos */
+ fname = find_data_file("loremipsum.txt");
+ tt_assert(fname != NULL);
+ file = qes_file_open(fname, "r");
+ orig_filepos = file->filepos;
+ /* Peek a char */
+ res = qes_file_peek(file);
+ /* Check it's the right char */
+ tt_int_op(res, ==, loremipsum_lines[0][0]);
+ /* And that the filepos hasn't changed */
+ tt_int_op(file->filepos , ==, orig_filepos);
+ /* And that the same char is returned again */
+ res = qes_file_peek(file);
+ tt_int_op(res, ==, loremipsum_lines[0][0]);
+ /* And that it returns an error on being given a null pointer */
+ tt_int_op(qes_file_peek(NULL), ==, -2);
+end:
+ qes_file_close(file);
+ if (fname != NULL) free(fname);
+}
+
+static void
+test_qes_file_guess_mode (void *ptr)
+{
+ const char *modes[] = {
+ "r", "rb", "rb8", "rT", "rbT",
+ "w", "wb", "wb8", "wT", "wbT",
+ "a", "ab", "ab8", "aT", "abT",
+ "+", "+b", "+b8", "+T", "+bT",
+ };
+ const int mode_results[] = {
+ QES_FILE_MODE_READ, QES_FILE_MODE_READ, QES_FILE_MODE_READ,
+ QES_FILE_MODE_READ, QES_FILE_MODE_READ, QES_FILE_MODE_WRITE,
+ QES_FILE_MODE_WRITE, QES_FILE_MODE_WRITE, QES_FILE_MODE_WRITE,
+ QES_FILE_MODE_WRITE, QES_FILE_MODE_WRITE, QES_FILE_MODE_WRITE,
+ QES_FILE_MODE_WRITE, QES_FILE_MODE_WRITE, QES_FILE_MODE_WRITE,
+ QES_FILE_MODE_UNKNOWN, QES_FILE_MODE_UNKNOWN, QES_FILE_MODE_UNKNOWN,
+ QES_FILE_MODE_UNKNOWN, QES_FILE_MODE_UNKNOWN,
+ };
+ const size_t num_modes = 20;
+ size_t iii;
+ (void) ptr;
+ for (iii = 0; iii < num_modes; iii++) {
+ tt_int_op(qes_file_guess_mode(modes[iii]), ==, mode_results[iii]);
+ }
+end:
+ ;
+}
+
+static void
+test_qes_file_readline_realloc (void *ptr)
+{
+ char *buf = NULL;
+ char *smallbuf = NULL;
+ const size_t smallbuf_len = 4;
+ const size_t buf_len = 1<<10; /* 1024b */
+ struct qes_file *file = NULL;
+ ssize_t ret = 0;
+ off_t fpos = 0;
+ size_t line_num;
+ char *nulcp = NULL;
+ size_t tmpsz = buf_len;
+ char *fname = NULL;
+
+ (void) ptr;
+ /* Open file and save pos */
+ fname = find_data_file("loremipsum.txt");
+ /* This should always work, so long as you run it from the right dir */
+ file = qes_file_open(fname, "r");
+ buf = calloc(buf_len, sizeof(*buf));
+ smallbuf = calloc(smallbuf_len, sizeof(*smallbuf));
+ tt_assert(file && buf && smallbuf);
+ /* Check each line is of the right length, that the length is returned,
+ * that the string is as expected, and that file->filepos is updated.
+ */
+ for (line_num = 0; line_num < n_loremipsum_lines; line_num++) {
+ ret = qes_file_readline_realloc(file, &buf, &tmpsz);
+ fpos += ret;
+ tt_int_op(fpos, ==, file->filepos);
+ tt_str_op(buf, ==, loremipsum_lines[line_num]);
+ tt_int_op(strlen(buf), ==, loremipsum_line_lens[line_num]);
+ tt_int_op(ret, ==, loremipsum_line_lens[line_num]);
+ tt_int_op(buf[ret], ==, '\0');
+ tt_int_op(tmpsz, ==, buf_len);
+ tt_int_op(tmpsz, >=, qes_roundupz(loremipsum_line_lens[line_num]));
+ }
+ tt_int_op(file->filepos, ==, loremipsum_fsize);
+ ret = qes_file_readline_realloc(file, &buf, &tmpsz);
+ tt_assert(file->eof);
+ tt_int_op(ret, ==, EOF);
+ qes_file_close(file);
+ /*
+ * Test w/ small buffer
+ */
+ /* Do the same checks, but with a buffer that needs resizing */
+ file = qes_file_open(fname, "r");
+ tmpsz = smallbuf_len;
+ fpos = 0;
+ for (line_num = 0; line_num < n_loremipsum_lines; line_num++) {
+ ret = qes_file_readline_realloc(file, &smallbuf, &tmpsz);
+ fpos += ret;
+ tt_int_op(fpos, ==, file->filepos);
+ tt_str_op(smallbuf, ==, loremipsum_lines[line_num]);
+ tt_int_op(strlen(smallbuf), ==, loremipsum_line_lens[line_num]);
+ tt_int_op(ret, ==, loremipsum_line_lens[line_num]);
+ tt_int_op(tmpsz, !=, smallbuf_len);
+ tt_int_op(tmpsz, >=, qes_roundupz(loremipsum_line_lens[line_num]));
+ tt_int_op(smallbuf[ret], ==, '\0');
+ }
+ tt_int_op(file->filepos, ==, loremipsum_fsize);
+ /* Test with EOF file */
+ tmpsz = buf_len;
+ ret = qes_file_readline_realloc(file, &buf, &tmpsz);
+ tt_int_op(ret, ==, EOF);
+ tt_str_op(buf, ==, "");
+ tt_int_op(strlen(buf), ==, 0);
+ tt_int_op(tmpsz, ==, buf_len);
+ tt_assert(file->eof)
+ qes_file_close(file);
+ /*
+ * Test bad things
+ */
+ /* Null buf. Should alloc a buffer and fill it */
+ file = qes_file_open(fname, "r");
+ line_num = 0;
+ ret = qes_file_readline_realloc(file, &nulcp, &tmpsz);
+ tt_int_op(ret, ==, loremipsum_line_lens[line_num]);
+ tt_str_op(nulcp, ==, loremipsum_lines[line_num]);
+ tt_int_op(strlen(nulcp), ==, loremipsum_line_lens[line_num]);
+ tt_int_op(tmpsz, ==, __INIT_LINE_LEN);
+ /* Null file */
+ ret = qes_file_readline_realloc(NULL, &buf, &tmpsz);
+ tt_int_op(ret, ==, -2);
+ /* This shouldn't change and is set in the prev. test */
+ tt_int_op(tmpsz, ==, __INIT_LINE_LEN);
+ /* Both buf & file null */
+ ret = qes_file_readline_realloc(NULL, &nulcp, &tmpsz);
+ tt_int_op(ret, ==, -2);
+ tt_int_op(tmpsz, ==, __INIT_LINE_LEN);
+end:
+ if (buf != NULL) free(buf);
+ if (smallbuf != NULL) free(smallbuf);
+ if (nulcp != NULL) free(nulcp);
+ if (file != NULL) qes_file_close(file);
+ free(fname);
+}
+
+static void
+test_qes_file_ok (void *ptr)
+{
+ struct qes_file *file;
+ char *writeable = NULL;
+ char *readable = NULL;
+
+ (void) ptr;
+ readable = find_data_file("loremipsum.txt");
+ writeable = get_writable_file();
+ /* Should result in an OK file */
+ file = qes_file_open(readable, "r");
+ tt_assert(qes_file_ok(file));
+ tt_assert(qes_file_readable(file));
+ qes_file_close(file);
+ file = qes_file_open("nosuchfile", "r");
+ tt_assert(!qes_file_ok(file));
+ tt_assert(!qes_file_readable(file));
+ qes_file_close(file);
+ file = qes_file_open(writeable, "w");
+ tt_assert(qes_file_ok(file));
+ tt_assert(!qes_file_readable(file));
+ qes_file_close(file);
+end:
+ if (file != NULL) qes_file_close(file);
+ clean_writable_file(writeable);
+ free(readable);
+
+}
+
+struct testcase_t qes_file_tests[] = {
+ { "qes_file_open", test_qes_file_open, 0, NULL, NULL},
+ { "qes_file_peek", test_qes_file_peek, 0, NULL, NULL},
+ { "qes_file_readline", test_qes_file_readline, 0, NULL, NULL},
+ { "qes_file_readline_realloc", test_qes_file_readline_realloc, 0, NULL, NULL},
+ { "qes_file_guess_mode", test_qes_file_guess_mode, 0, NULL, NULL},
+ { "qes_file_close", test_qes_file_close, 0, NULL, NULL},
+ { "qes_file_rewind", test_qes_file_rewind, 0, NULL, NULL},
+ { "qes_file_getuntil", test_qes_file_getuntil, 0, NULL, NULL},
+ { "qes_file_ok", test_qes_file_ok, 0, NULL, NULL},
+ END_OF_TESTCASES
+};
diff --git a/src/libqes/test/test_helpers.c b/src/libqes/test/test_helpers.c
new file mode 100644
index 0000000..f82b1a7
--- /dev/null
+++ b/src/libqes/test/test_helpers.c
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: test_helpers.c
+ *
+ * Description: Tests of test/helpers.c
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include "tests.h"
+
+
+static void
+test_crc32_file(void *data)
+{
+ char *crc = NULL;
+ char *fname = NULL;
+
+ (void) data;
+ fname = find_data_file("loremipsum.txt");
+ crc = crc32_file(fname);
+ tt_str_op(crc, ==, "9f20f7ec");
+end:
+ free(fname);
+ free(crc);
+}
+
+static void
+test_filecmp(void *data)
+{
+ char *fname1 = NULL;
+ char *fname2 = NULL;
+
+ (void) data;
+ fname1 = find_data_file("loremipsum.txt");
+ fname2 = find_data_file("loremipsum.txt.gz");
+ tt_int_op(filecmp(fname1, fname1), ==, 0);
+ tt_int_op(filecmp(fname1, fname2), ==, 1);
+ tt_int_op(filecmp(NULL, fname2), ==, -1);
+ tt_int_op(filecmp("/does/not/exist/", fname2), ==, -1);
+
+end:
+ free(fname1);
+ free(fname2);
+}
+
+struct testcase_t helper_tests[] = {
+ { "crc32_file", test_crc32_file, 0, NULL, NULL},
+ { "filecmp", test_filecmp, 0, NULL, NULL},
+ END_OF_TESTCASES
+};
diff --git a/src/libqes/test/test_log.c b/src/libqes/test/test_log.c
new file mode 100644
index 0000000..d4cfc96
--- /dev/null
+++ b/src/libqes/test/test_log.c
@@ -0,0 +1,189 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: test_log.c
+ *
+ * Description: Test logging
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include "tests.h"
+#include <qes_util.h>
+#include <qes_log.h>
+
+
+static void
+test_qes_logger_setup(void *ptr)
+{
+ int res = 0;
+ struct qes_logger *logger = NULL;
+
+ (void) ptr;
+ /* Test that when created, the logger has logical initial values */
+ logger = qes_logger_create();
+ tt_ptr_op(logger, !=, NULL);
+ tt_ptr_op(logger->destinations, ==, NULL);
+ tt_ptr_op(logger->name, ==, NULL);
+ tt_int_op(logger->n_destinations, ==, 0);
+ tt_int_op(logger->level, ==, QES_LOG_DEBUG);
+ tt_int_op(logger->lock, ==, 0);
+
+ /* Add a destination, check it is there */
+ res = qes_logger_add_destination(logger, stderr, QES_LOG_ERROR);
+ tt_int_op(res, ==, 0);
+ tt_ptr_op(logger->destinations, !=, NULL);
+ tt_ptr_op(logger->destinations[0].stream, ==, stderr);
+ tt_int_op(logger->destinations[0].level, ==, QES_LOG_ERROR);
+ tt_int_op(logger->n_destinations, ==, 1);
+ qes_logger_destroy(logger);
+ tt_ptr_op(logger, ==, NULL);
+
+end:
+ if (logger != NULL) {
+ if (logger->destinations != NULL) free(logger->destinations);
+ if (logger->name != NULL) free(logger->name);
+ free(logger);
+ }
+}
+
+
+static void
+test_qes_logger_init(void *ptr)
+{
+ int res = 0;
+ struct qes_logger *logger = NULL;
+
+ (void) ptr;
+ logger = qes_logger_create();
+ tt_ptr_op(logger, !=, NULL);
+
+ /* Test the init function sets values correctly */
+ res = qes_logger_init(logger, "test logger", QES_LOG_INFO);
+ tt_int_op(res, ==, 0);
+ tt_ptr_op(logger->name, !=, NULL);
+ tt_int_op(logger->level, ==, QES_LOG_INFO);
+ tt_int_op(logger->lock, ==, 0);
+
+ /* test that we error out if we give init NULL */
+ res = qes_logger_init(NULL, "test logger", QES_LOG_INFO);
+ tt_int_op(res, ==, 1);
+
+ /* Test that we silently set logger->name to NULL if we pass NULL */
+ res = qes_logger_init(logger, NULL, QES_LOG_INFO);
+ tt_int_op(res, ==, 0);
+ tt_ptr_op(logger->name, ==, NULL);
+
+end:
+ if (logger != NULL) {
+ if (logger->destinations != NULL) free(logger->destinations);
+ if (logger->name != NULL) free(logger->name);
+ free(logger);
+ }
+}
+
+static void
+test_qes_logger_logging(void *ptr)
+{
+ int res = 0;
+ struct qes_logger *logger = NULL;
+ char *log_fname = NULL;
+ char *truth_fname = NULL;
+ FILE *log_file = NULL;
+
+ (void) ptr;
+ /* Set up a logger, with an actual file as output */
+ logger = qes_logger_create();
+ tt_ptr_op(logger, !=, NULL);
+ truth_fname = find_data_file("truth/log_test.txt");
+ tt_ptr_op(truth_fname, !=, NULL);
+ log_fname = get_writable_file();
+ tt_ptr_op(log_fname, !=, NULL);
+ log_file = fopen(log_fname, "w");
+ tt_ptr_op(log_file, !=, NULL);
+ res = qes_logger_add_destination(logger, log_file, QES_LOG_INFO);
+ tt_int_op(res, ==, 0);
+
+ /* Test printing to the file using the message functions */
+ qes_log_message_debug(logger, "Hello World\n"); /* wont' print */
+ qes_log_message_info(logger, "Hello World\n"); /* should print */
+
+ /* Test printing to the file with the format functions */
+ qes_log_format_debug(logger, "%s\n", "Hello World");
+ qes_log_format_info(logger, "%s\n", "Hello World");
+
+ /* Test the output file was created correctly */
+ tt_int_op(filecmp(log_fname, truth_fname), ==, 0);
+
+end:
+ if (log_file != NULL) fclose(log_file);
+ if (truth_fname != NULL) free(truth_fname);
+ if (log_fname != NULL) free(log_fname);
+ qes_logger_destroy(logger);
+}
+
+static void
+test_qes_log_entry(void *ptr)
+{
+ int res = 0;
+ struct qes_log_entry *entry = NULL;
+
+ (void) ptr;
+ /* Test that create gives us a valid entry with sane defaults */
+ entry = qes_log_entry_create();
+ tt_ptr_op(entry, !=, NULL);
+ tt_ptr_op(entry->message, ==, NULL);
+ tt_int_op(entry->level, ==, QES_LOG_DEBUG);
+
+ /* Check that init fills the entry appropriately */
+ res = qes_log_entry_init(entry, QES_LOG_ERROR, "Test");
+ tt_int_op(res, ==, 0);
+ tt_ptr_op(entry, !=, NULL);
+ tt_str_op(entry->message, ==, "Test");
+ tt_int_op(entry->level, ==, QES_LOG_ERROR);
+
+ /* test that clear clears an entry, without freeing the entry itself */
+ qes_log_entry_clear(entry);
+ tt_ptr_op(entry, !=, NULL);
+ tt_ptr_op(entry->message, ==, NULL);
+ tt_int_op(entry->level, ==, QES_LOG_DEBUG);
+
+ /* test formatting an entry */
+ res = qes_log_entry_format(entry, QES_LOG_ERROR, "%s", "Test");
+ tt_int_op(res, ==, 0);
+ tt_ptr_op(entry, !=, NULL);
+ tt_str_op(entry->message, ==, "Test");
+ tt_int_op(entry->level, ==, QES_LOG_ERROR);
+
+ qes_log_entry_destroy(entry);
+ tt_ptr_op(entry, ==, NULL);
+
+end:
+ qes_log_entry_destroy(entry);
+}
+
+struct testcase_t qes_log_tests[] = {
+ { "qes_logger_setup", test_qes_logger_setup, 0, NULL, NULL},
+ { "qes_logger_init", test_qes_logger_init, 0, NULL, NULL},
+ { "qes_logger_logging", test_qes_logger_logging, 0, NULL, NULL},
+ { "qes_log_entry", test_qes_log_entry, 0, NULL, NULL},
+ END_OF_TESTCASES
+};
diff --git a/src/libqes/test/test_match.c b/src/libqes/test/test_match.c
new file mode 100644
index 0000000..3ee0966
--- /dev/null
+++ b/src/libqes/test/test_match.c
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: test_match.c
+ *
+ * Description: Test qes_match functions
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include "tests.h"
+#include <qes_match.h>
+#include <limits.h>
+
+
+static void
+test_qes_hamming (void *p)
+{
+ (void) (p);
+ /* Simple stuff */
+ tt_int_op(qes_match_hamming("ACTTG", "ACTTG", 5), ==, 0);
+ tt_int_op(qes_match_hamming("ACTTG", "ACTGG", 5), ==, 1);
+ /* Different lengths */
+ tt_int_op(qes_match_hamming("ACTTGA", "ACTTG", 5), ==, 0);
+ tt_int_op(qes_match_hamming("ACTTG", "ACTTGA", 5), ==, 0);
+ tt_int_op(qes_match_hamming("ACTTG", "ACTGGA", 5), ==, 1);
+ tt_int_op(qes_match_hamming("ACTTG", "ACTGGA", 6), ==, 2);
+ tt_int_op(qes_match_hamming("ACTTG", "ACTTGA", 6), ==, 1);
+ /* Make it guess lengths */
+ tt_int_op(qes_match_hamming("ACTTG", "ACTTG", 0), ==, 0);
+ tt_int_op(qes_match_hamming("ACATG", "ACTTG", 0), ==, 1);
+ tt_int_op(qes_match_hamming("ACTTG", "ACTTGT", 0), ==, 0);
+ tt_int_op(qes_match_hamming("ACATG", "ACTTGT", 0), ==, 1);
+ tt_int_op(qes_match_hamming("ACTTGT", "ACTTG", 0), ==, 0);
+ /* Give it hell */
+ tt_int_op(qes_match_hamming("ACTTG", NULL, 0), ==, -1);
+ tt_int_op(qes_match_hamming(NULL, "ACTTG", 0), ==, -1);
+ tt_int_op(qes_match_hamming(NULL, NULL, 0), ==, -1);
+end:
+ ;
+}
+
+
+static void
+test_qes_hamming_max (void *p)
+{
+
+ (void) (p);
+ /* Same tests as per hamming, max is INT_MAX */
+ /* Simple stuff */
+ tt_int_op(qes_match_hamming_max("ACTTG", "ACTTG", 5, INT_MAX), ==, 0);
+ tt_int_op(qes_match_hamming_max("ACTTG", "ACTGG", 5, INT_MAX), ==, 1);
+ /* Different lengths */
+ tt_int_op(qes_match_hamming_max("ACTTGA", "ACTTG", 5, INT_MAX), ==, 0);
+ tt_int_op(qes_match_hamming_max("ACTTG", "ACTTGA", 5, INT_MAX), ==, 0);
+ tt_int_op(qes_match_hamming_max("ACTTG", "ACTGGA", 5, INT_MAX), ==, 1);
+ tt_int_op(qes_match_hamming_max("ACTTG", "ACTGGA", 6, INT_MAX), ==, 2);
+ tt_int_op(qes_match_hamming_max("ACTTG", "ACTTGA", 6, INT_MAX), ==, 1);
+ /* Make it guess lengths */
+ tt_int_op(qes_match_hamming_max("ACTTG", "ACTTG", 0, INT_MAX), ==, 0);
+ tt_int_op(qes_match_hamming_max("ACATG", "ACTTG", 0, INT_MAX), ==, 1);
+ tt_int_op(qes_match_hamming_max("ACTTG", "ACTTGT", 0, INT_MAX), ==, 0);
+ tt_int_op(qes_match_hamming_max("ACATG", "ACTTGT", 0, INT_MAX), ==, 1);
+ tt_int_op(qes_match_hamming_max("ACTTGT", "ACTTG", 0, INT_MAX), ==, 0);
+ /* Test it bails out when over ``max`` */
+ tt_int_op(qes_match_hamming_max("ACTTG", "ACTGG", 5, 1), ==, 1);
+ tt_int_op(qes_match_hamming_max("ACTTG", "ACTGG", 5, 0), ==, 1);
+ tt_int_op(qes_match_hamming_max("ACTTG", "ACTGA", 5, 0), ==, 1);
+ tt_int_op(qes_match_hamming_max("ACTTG", "ACTGA", 5, 1), ==, 2);
+ tt_int_op(qes_match_hamming_max("ACTTG", "ACTGA", 5, 2), ==, 2);
+ /* Give it hell */
+ tt_int_op(qes_match_hamming_max("ACTTG", NULL, 0, INT_MAX), ==, -1);
+ tt_int_op(qes_match_hamming_max(NULL, "ACTTG", 0, INT_MAX), ==, -1);
+ tt_int_op(qes_match_hamming_max(NULL, NULL, 0, INT_MAX), ==, -1);
+ tt_int_op(qes_match_hamming_max("ACTTG", "ACTTG", 0, -1), ==, -1);
+ tt_int_op(qes_match_hamming_max("ACTTG", NULL, 0, -1), ==, -1);
+ tt_int_op(qes_match_hamming_max(NULL, "ACTTG", 0, -1), ==, -1);
+ tt_int_op(qes_match_hamming_max(NULL, NULL, 0, -1), ==, -1);
+end:
+ ;
+}
+
+struct testcase_t qes_match_tests[] = {
+ { "qes_match_hamming", test_qes_hamming, 0, NULL, NULL},
+ { "qes_match_hamming_max", test_qes_hamming_max, 0, NULL, NULL},
+ END_OF_TESTCASES
+};
diff --git a/src/libqes/test/test_seq.c b/src/libqes/test/test_seq.c
new file mode 100644
index 0000000..c9dca23
--- /dev/null
+++ b/src/libqes/test/test_seq.c
@@ -0,0 +1,500 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: test_seq.c
+ *
+ * Description: Test qes_seq.c
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include "tests.h"
+#include <qes_seq.h>
+
+
+static void
+test_qes_seq_create (void *ptr)
+{
+ struct qes_seq *seq = NULL;
+ (void) ptr;
+ tt_ptr_op(seq, ==, NULL);
+ seq = qes_seq_create();
+ tt_ptr_op(seq, !=, NULL);
+ tt_ptr_op(seq->name.str, !=, NULL);
+ tt_int_op(seq->name.capacity, >, 0);
+ tt_int_op(seq->name.len, ==, 0);
+ tt_ptr_op(seq->comment.str, !=, NULL);
+ tt_int_op(seq->comment.capacity, >, 0);
+ tt_int_op(seq->comment.len, ==, 0);
+ tt_ptr_op(seq->seq.str, !=, NULL);
+ tt_int_op(seq->seq.capacity, >, 0);
+ tt_int_op(seq->seq.len, ==, 0);
+ tt_ptr_op(seq->qual.str, !=, NULL);
+ tt_int_op(seq->qual.capacity, >, 0);
+ tt_int_op(seq->qual.len, ==, 0);
+ tt_assert(qes_str_ok(&seq->name));
+ tt_assert(qes_str_ok(&seq->comment));
+ tt_assert(qes_str_ok(&seq->seq));
+ tt_assert(qes_str_ok(&seq->qual));
+end:
+ qes_seq_destroy(seq);
+}
+
+static void
+test_qes_seq_create_no_qual (void *ptr)
+{
+ struct qes_seq *seq = NULL;
+ (void) ptr;
+ tt_ptr_op(seq, ==, NULL);
+ seq = qes_seq_create_no_qual();
+ tt_ptr_op(seq, !=, NULL);
+ tt_ptr_op(seq->name.str, !=, NULL);
+ tt_int_op(seq->name.capacity, >, 0);
+ tt_int_op(seq->name.len, ==, 0);
+ tt_ptr_op(seq->comment.str, !=, NULL);
+ tt_int_op(seq->comment.capacity, >, 0);
+ tt_int_op(seq->comment.len, ==, 0);
+ tt_ptr_op(seq->seq.str, !=, NULL);
+ tt_int_op(seq->seq.capacity, >, 0);
+ tt_int_op(seq->seq.len, ==, 0);
+ tt_ptr_op(seq->qual.str, ==, NULL);
+ tt_int_op(seq->qual.capacity, ==, 0);
+ tt_int_op(seq->qual.len, ==, 0);
+ tt_assert(qes_str_ok(&seq->name));
+ tt_assert(qes_str_ok(&seq->comment));
+ tt_assert(qes_str_ok(&seq->seq));
+ tt_assert(!qes_str_ok(&seq->qual));
+end:
+ qes_seq_destroy(seq);
+}
+
+static void
+test_qes_seq_create_no_qual_or_comment (void *ptr)
+{
+ struct qes_seq *seq = NULL;
+ (void) ptr;
+ tt_ptr_op(seq, ==, NULL);
+ seq = qes_seq_create_no_qual_or_comment();
+ tt_ptr_op(seq, !=, NULL);
+ tt_ptr_op(seq->name.str, !=, NULL);
+ tt_int_op(seq->name.capacity, >, 0);
+ tt_int_op(seq->name.len, ==, 0);
+ tt_ptr_op(seq->comment.str, ==, NULL);
+ tt_int_op(seq->comment.capacity, ==, 0);
+ tt_int_op(seq->comment.len, ==, 0);
+ tt_ptr_op(seq->seq.str, !=, NULL);
+ tt_int_op(seq->seq.capacity, >, 0);
+ tt_int_op(seq->seq.len, ==, 0);
+ tt_ptr_op(seq->qual.str, ==, NULL);
+ tt_int_op(seq->qual.capacity, ==, 0);
+ tt_int_op(seq->qual.len, ==, 0);
+ tt_assert(qes_str_ok(&seq->name));
+ tt_assert(!qes_str_ok(&seq->comment));
+ tt_assert(qes_str_ok(&seq->seq));
+ tt_assert(!qes_str_ok(&seq->qual));
+end:
+ qes_seq_destroy(seq);
+}
+
+static void
+test_qes_seq_ok (void *ptr)
+{
+ struct qes_seq *seq = NULL;
+ (void) ptr;
+ /* Test null seq */
+ tt_assert(!qes_seq_ok(seq));
+ /* Make valid seq */
+ seq = qes_seq_create();
+ tt_assert(qes_seq_ok(seq));
+ /* invalidate name, should fail */
+ qes_str_destroy_cp(&seq->name);
+ tt_assert(!qes_seq_ok(seq));
+ qes_seq_destroy(seq);
+ /* remake */
+ seq = qes_seq_create();
+ tt_assert(qes_seq_ok(seq));
+ /* invalidate comment, should fail */
+ qes_str_destroy_cp(&seq->comment);
+ tt_assert(!qes_seq_ok(seq));
+ qes_seq_destroy(seq);
+ /* remake */
+ seq = qes_seq_create();
+ tt_assert(qes_seq_ok(seq));
+ /* invalidate seq, should fail */
+ qes_str_destroy_cp(&seq->seq);
+ tt_assert(!qes_seq_ok(seq));
+ qes_seq_destroy(seq);
+ /* remake */
+ seq = qes_seq_create();
+ tt_assert(qes_seq_ok(seq));
+ /* invalidate qual, should fail */
+ qes_str_destroy_cp(&seq->qual);
+ tt_assert(!qes_seq_ok(seq));
+ qes_seq_destroy(seq);
+ /* Destroy seq, invalidating it */
+ qes_seq_destroy(seq);
+ tt_assert(!qes_seq_ok(seq));
+end:
+ qes_seq_destroy(seq);
+}
+
+static void
+test_qes_seq_ok_no_comment (void *ptr)
+{
+ struct qes_seq *seq = NULL;
+
+ (void) ptr;
+ /* Test null seq */
+ tt_assert(!qes_seq_ok_no_comment(seq));
+ /* Make valid seq */
+ seq = qes_seq_create();
+ tt_assert(qes_seq_ok_no_comment(seq));
+ /* invalidate name, should fail */
+ qes_str_destroy_cp(&seq->name);
+ tt_assert(!qes_seq_ok_no_comment(seq));
+ qes_seq_destroy(seq);
+ /* remake */
+ seq = qes_seq_create();
+ tt_assert(qes_seq_ok_no_comment(seq));
+ /* invalidate comment, should still pass */
+ qes_str_destroy_cp(&seq->comment);
+ tt_assert(qes_seq_ok_no_comment(seq));
+ qes_seq_destroy(seq);
+ /* remake */
+ seq = qes_seq_create();
+ tt_assert(qes_seq_ok_no_comment(seq));
+ /* invalidate seq, should fail */
+ qes_str_destroy_cp(&seq->seq);
+ tt_assert(!qes_seq_ok_no_comment(seq));
+ qes_seq_destroy(seq);
+ /* remake */
+ seq = qes_seq_create();
+ tt_assert(qes_seq_ok_no_comment(seq));
+ /* invalidate qual, should fail */
+ qes_str_destroy_cp(&seq->qual);
+ tt_assert(!qes_seq_ok_no_comment(seq));
+ qes_seq_destroy(seq);
+ /* Destroy seq, invalidating it */
+ qes_seq_destroy(seq);
+ tt_assert(!qes_seq_ok_no_comment(seq));
+end:
+ qes_seq_destroy(seq);
+}
+
+static void
+test_qes_seq_ok_no_qual (void *ptr)
+{
+ struct qes_seq *seq = NULL;
+ (void) ptr;
+ /* Test null seq */
+ tt_assert(!qes_seq_ok_no_qual(seq));
+ /* Make valid seq */
+ seq = qes_seq_create();
+ tt_assert(qes_seq_ok_no_qual(seq));
+ /* invalidate name, should fail */
+ qes_str_destroy_cp(&seq->name);
+ tt_assert(!qes_seq_ok_no_qual(seq));
+ qes_seq_destroy(seq);
+ /* remake */
+ seq = qes_seq_create();
+ tt_assert(qes_seq_ok_no_qual(seq));
+ /* invalidate comment, should fail */
+ qes_str_destroy_cp(&seq->comment);
+ tt_assert(!qes_seq_ok_no_qual(seq));
+ qes_seq_destroy(seq);
+ /* remake */
+ seq = qes_seq_create();
+ tt_assert(qes_seq_ok_no_qual(seq));
+ /* invalidate seq, should fail */
+ qes_str_destroy_cp(&seq->seq);
+ tt_assert(!qes_seq_ok_no_qual(seq));
+ qes_seq_destroy(seq);
+ /* remake */
+ seq = qes_seq_create();
+ tt_assert(qes_seq_ok_no_qual(seq));
+ /* invalidate qual, should PASS */
+ qes_str_destroy_cp(&seq->qual);
+ tt_assert(qes_seq_ok_no_qual(seq));
+ qes_seq_destroy(seq);
+ /* Destroy seq, invalidating it */
+ qes_seq_destroy(seq);
+ tt_assert(!qes_seq_ok_no_qual(seq));
+end:
+ qes_seq_destroy(seq);
+}
+
+static void
+test_qes_seq_print(void *ptr)
+{
+ struct qes_seq *seq = NULL;
+ FILE *fp = NULL;
+ char *outfile = NULL;
+ char *truthfile = NULL;
+ int res = 1;
+
+ (void) ptr;
+ /* Create output file */
+ outfile = get_writable_file();
+ fp = fopen(outfile, "w");
+ tt_ptr_op(fp, !=, NULL);
+ /* create sequence, fill it */
+ seq = qes_seq_create();
+ res = qes_seq_fill(seq, "TEST", "Comment 1", "AGCT", "IIII");
+ tt_int_op(res, ==, 0);
+ /* Print the seq to the output file */
+ res = qes_seq_print(seq, fp, false, 0);
+ tt_int_op(res, ==, 0);
+ /* Check printing */
+ truthfile = find_data_file("truth/qes_seq_print.fq");
+ tt_ptr_op(truthfile, !=, NULL);
+ tt_int_op(filecmp(outfile, truthfile), ==, 0);
+ /* Clean up */
+ free(truthfile);
+ truthfile = NULL;
+ fclose(fp);
+ fp = NULL;
+ qes_seq_destroy(seq);
+
+ /* recreate, just without quality */
+ seq = qes_seq_create();
+ fp = fopen(outfile, "w");
+ tt_ptr_op(fp, !=, NULL);
+ res = qes_seq_fill(seq, "TEST", "Comment 1", "AGCT", "");
+ tt_int_op(res, ==, 0);
+ /* Print the seq to the output file */
+ res = qes_seq_print(seq, fp, true, 0);
+ tt_int_op(res, ==, 0);
+ /* Check printing */
+ truthfile = find_data_file("truth/qes_seq_print.fa");
+ tt_ptr_op(truthfile, !=, NULL);
+ tt_int_op(filecmp(outfile, truthfile), ==, 0);
+ free(truthfile);
+ truthfile = NULL;
+ fclose(fp);
+ fp = NULL;
+
+ /* error cases */
+ tt_int_op(qes_seq_print(NULL, stdout, false, 0), ==, 1);
+ tt_int_op(qes_seq_print(seq, NULL, false, 0), ==, 1);
+
+end:
+ qes_seq_destroy(seq);
+ if (fp != NULL) fclose(fp);
+ if (outfile != NULL) free(outfile);
+ if (truthfile != NULL) free(truthfile);
+}
+
+static void
+test_qes_seq_ok_no_comment_or_qual (void *ptr)
+{
+ struct qes_seq *seq = NULL;
+
+ (void) ptr;
+ /* Test null seq */
+ tt_assert(!qes_seq_ok_no_comment_or_qual(seq));
+ /* Make valid seq */
+ seq = qes_seq_create();
+ tt_assert(qes_seq_ok_no_comment_or_qual(seq));
+ /* invalidate name, should fail */
+ qes_str_destroy_cp(&seq->name);
+ tt_assert(!qes_seq_ok_no_comment_or_qual(seq));
+ qes_seq_destroy(seq);
+ /* remake */
+ seq = qes_seq_create();
+ tt_assert(qes_seq_ok_no_comment_or_qual(seq));
+ /* invalidate comment, should still pass */
+ qes_str_destroy_cp(&seq->comment);
+ tt_assert(qes_seq_ok_no_comment_or_qual(seq));
+ qes_seq_destroy(seq);
+ /* remake */
+ seq = qes_seq_create();
+ tt_assert(qes_seq_ok_no_comment_or_qual(seq));
+ /* invalidate seq, should fail */
+ qes_str_destroy_cp(&seq->seq);
+ tt_assert(!qes_seq_ok_no_comment_or_qual(seq));
+ qes_seq_destroy(seq);
+ /* remake */
+ seq = qes_seq_create();
+ tt_assert(qes_seq_ok_no_comment_or_qual(seq));
+ /* invalidate qual, should fail */
+ qes_str_destroy_cp(&seq->qual);
+ tt_assert(qes_seq_ok_no_comment_or_qual(seq));
+ qes_seq_destroy(seq);
+ /* Destroy seq, invalidating it */
+ qes_seq_destroy(seq);
+ tt_assert(!qes_seq_ok_no_comment_or_qual(seq));
+end:
+ qes_seq_destroy(seq);
+}
+
+
+static void
+test_qes_seq_destroy (void *ptr)
+{
+ struct qes_seq *seq = NULL;
+
+ (void) ptr;
+ tt_ptr_op(seq, ==, NULL);
+ seq = qes_seq_create();
+ tt_ptr_op(seq, !=, NULL);
+ qes_seq_destroy(seq);
+ tt_ptr_op(seq, ==, NULL);
+ seq = NULL; /* Best be sure */
+ qes_seq_destroy(seq);
+end:
+ qes_seq_destroy(seq);
+}
+
+static void
+test_qes_seq_copy(void *ptr)
+{
+ struct qes_seq *seq = NULL;
+ struct qes_seq *copy = NULL;
+ int res = 1;
+
+ (void) ptr;
+ seq = qes_seq_create();
+ copy = qes_seq_create();
+ res = qes_seq_fill(seq, "TEST", "Comment 1", "AGCT", "IIII");
+ tt_int_op(res, ==, 0);
+ tt_str_op(seq->name.str, ==, "TEST");
+ tt_str_op(seq->comment.str, ==, "Comment 1");
+ tt_str_op(seq->seq.str, ==, "AGCT");
+ tt_str_op(seq->qual.str, ==, "IIII");
+ res = qes_seq_copy(copy, seq);
+ tt_int_op(res, ==, 0);
+ tt_str_op(copy->name.str, ==, "TEST");
+ tt_str_op(copy->comment.str, ==, "Comment 1");
+ tt_str_op(copy->seq.str, ==, "AGCT");
+ tt_str_op(copy->qual.str, ==, "IIII");
+ tt_int_op(qes_seq_copy(NULL, seq), ==, 1);
+ tt_int_op(qes_seq_copy(seq, NULL), ==, 1);
+ tt_int_op(qes_seq_copy(seq, seq), ==, 1);
+
+end:
+ qes_seq_destroy(seq);
+ qes_seq_destroy(copy);
+}
+
+static void
+test_qes_seq_fill_funcs(void *ptr)
+{
+#define CHECK_FILLING(submember, st, ln) \
+ seq = qes_seq_create(); \
+ tt_str_op(seq->submember.str, ==, ""); \
+ res = qes_seq_fill_ ##submember (seq, st, ln); \
+ tt_int_op(res, ==, 0); \
+ tt_str_op(seq->submember.str, ==, st); \
+ tt_int_op(seq->submember.len, ==, ln); \
+ tt_int_op(seq->submember.capacity, >=, ln); \
+ qes_seq_destroy(seq);
+#define CHECK_FILLING_FAIL(submember, st, ln) \
+ seq = qes_seq_create(); \
+ tt_str_op(seq->submember.str, ==, ""); \
+ res = qes_seq_fill_ ##submember (seq, st, ln); \
+ tt_int_op(res, ==, 1); \
+ tt_str_op(seq->submember.str, ==, ""); \
+ tt_int_op(seq->submember.len, ==, 0); \
+ qes_seq_destroy(seq);
+
+ struct qes_seq *seq = NULL;
+ int res = 0;
+ char *tmp = NULL;
+
+ (void) ptr;
+ /* These should all work pretty well */
+ CHECK_FILLING(name, "HWI_TEST", 8)
+ CHECK_FILLING(comment, "abc 123 comment", 15)
+ CHECK_FILLING(seq, "ACTG", 4)
+ CHECK_FILLING(qual, "IIII", 4)
+ /* These should all fail */
+ CHECK_FILLING_FAIL(name, NULL, 1)
+ CHECK_FILLING_FAIL(name, "BAD", 0)
+ CHECK_FILLING_FAIL(comment, NULL, 1)
+ CHECK_FILLING_FAIL(comment, "BAD", 0)
+ CHECK_FILLING_FAIL(seq, NULL, 1)
+ CHECK_FILLING_FAIL(seq, "BAD", 0)
+ CHECK_FILLING_FAIL(qual, NULL, 1)
+ CHECK_FILLING_FAIL(qual, "BAD", 0)
+ tt_int_op(qes_seq_fill_name(NULL, "BAD", 3), ==, 1);
+ tt_int_op(qes_seq_fill_comment(NULL, "BAD", 3), ==, 1);
+ tt_int_op(qes_seq_fill_seq(NULL, "BAD", 3), ==, 1);
+ tt_int_op(qes_seq_fill_qual(NULL, "BAD", 3), ==, 1);
+
+ /* Fill header */
+#define CHECK_FILL_HEADER(st, ln, nm, nmlen, com, comlen) \
+ tmp = strdup(st); \
+ seq = qes_seq_create(); \
+ tt_str_op(seq->name.str, ==, ""); \
+ tt_str_op(seq->comment.str, ==, ""); \
+ res = qes_seq_fill_header(seq, tmp, ln); \
+ tt_int_op(res, ==, 0); \
+ tt_str_op(seq->name.str, ==, nm); \
+ tt_int_op(seq->name.len, ==, nmlen); \
+ tt_int_op(seq->name.capacity, >=, nmlen); \
+ tt_str_op(seq->comment.str, ==, com); \
+ tt_int_op(seq->comment.len, ==, comlen); \
+ tt_int_op(seq->comment.capacity, >=, comlen); \
+ qes_seq_destroy(seq); \
+ free(tmp); \
+ tmp = NULL;
+ CHECK_FILL_HEADER("@HWI_TEST COMM\n", 15, "HWI_TEST", 8, "COMM", 4)
+ CHECK_FILL_HEADER("@HWI_TEST COMM\n", 0, "HWI_TEST", 8, "COMM", 4)
+ CHECK_FILL_HEADER("@HWI_TEST COMM \r\n", 17, "HWI_TEST", 8, "COMM", 4)
+ CHECK_FILL_HEADER("@HWI_TEST COMM", 14, "HWI_TEST", 8, "COMM", 4)
+ CHECK_FILL_HEADER(">HWI_TEST COMM", 14, "HWI_TEST", 8, "COMM", 4)
+ CHECK_FILL_HEADER("HWI_TEST COMM", 13, "HWI_TEST", 8, "COMM", 4)
+ CHECK_FILL_HEADER("@HWI_TEST", 9, "HWI_TEST", 8, "", 0)
+ CHECK_FILL_HEADER(">HWI_TEST", 9, "HWI_TEST", 8, "", 0)
+ CHECK_FILL_HEADER("HWI_TEST", 8, "HWI_TEST", 8, "", 0)
+ /* Check bad values */
+ seq = qes_seq_create();
+ tmp = strdup("BAD");
+ tt_int_op(qes_seq_fill_header(NULL, tmp, 3), ==, 1);
+ tt_int_op(qes_seq_fill_header(seq, NULL, 3), ==, 1);
+ qes_seq_destroy(seq);
+end:
+ if (tmp != NULL) {
+ free(tmp);
+ }
+ qes_seq_destroy(seq);
+#undef CHECK_FILLING
+#undef CHECK_FILLING_FAIL
+#undef CHECK_FILL_HEADER
+}
+
+
+struct testcase_t qes_seq_tests[] = {
+ { "qes_seq_create", test_qes_seq_create, 0, NULL, NULL},
+ { "qes_seq_create_no_qual", test_qes_seq_create_no_qual, 0, NULL, NULL},
+ { "qes_seq_create_no_qual_or_comment",
+ test_qes_seq_create_no_qual_or_comment, 0, NULL, NULL},
+ { "qes_seq_ok", test_qes_seq_ok, 0, NULL, NULL},
+ { "qes_seq_ok_no_comment", test_qes_seq_ok_no_comment, 0, NULL, NULL},
+ { "qes_seq_ok_no_qual", test_qes_seq_ok_no_qual, 0, NULL, NULL},
+ { "qes_seq_ok_no_comment_or_qual", test_qes_seq_ok_no_comment_or_qual, 0,
+ NULL, NULL},
+ { "qes_seq_destroy", test_qes_seq_destroy, 0, NULL, NULL},
+ { "qes_seq_fill", test_qes_seq_fill_funcs, 0, NULL, NULL},
+ { "qes_seq_copy", test_qes_seq_copy, 0, NULL, NULL},
+ { "qes_seq_print", test_qes_seq_print, 0, NULL, NULL},
+ END_OF_TESTCASES
+};
diff --git a/src/libqes/test/test_seqcats.sh b/src/libqes/test/test_seqcats.sh
new file mode 100644
index 0000000..120bc92
--- /dev/null
+++ b/src/libqes/test/test_seqcats.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+if [ $# -lt 1 ]
+then
+ files=("data/test.fasta")
+else
+ files=( "$@" )
+fi
+
+for file in "${files[@]}"
+do
+ kseq_m5=$(bin/kseqcat $file | md5sum | awk '{print $1}')
+ qseq_m5=$(bin/qes_seqcat $file | md5sum | awk '{print $1}')
+ kprint_m5=$(bin/kseqcat $file | seqtk seq -l 79 | md5sum | awk '{print $1}')
+ qprint_m5=$(bin/qes_seqprint $file | md5sum | awk '{print $1}')
+
+ if [ "$kseq_m5" != "$qseq_m5" ]
+ then
+ echo "TEST (seq) FAILED: $file"
+ echo " kseq: $kseq_m5"
+ echo " qes: $qseq_m5"
+ else
+ echo "TEST (seq) PASSED: $file"
+ fi
+
+ if [ "$kprint_m5" != "$qprint_m5" ]
+ then
+ echo "TEST (print) FAILED: $file"
+ echo " kseq: $kprint_m5"
+ echo " qes: $qprint_m5"
+ else
+ echo "TEST (print) PASSED: $file"
+ fi
+done
diff --git a/src/libqes/test/test_seqfile.c b/src/libqes/test/test_seqfile.c
new file mode 100644
index 0000000..710ea60
--- /dev/null
+++ b/src/libqes/test/test_seqfile.c
@@ -0,0 +1,418 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: test_seqfile.c
+ *
+ * Description: Tests for the qes_seqfile module
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include "tests.h"
+#include <qes_seqfile.h>
+#include "kseq.h"
+
+
+#ifdef ZLIB_FOUND
+# include <zlib.h>
+ KSEQ_INIT(gzFile, gzread)
+#else
+# include <sys/stat.h>
+# include <fcntl.h>
+ KSEQ_INIT(int, read)
+#endif
+
+
+
+static void
+test_qes_seqfile_create(void *ptr)
+{
+ struct qes_seqfile *sf = NULL;
+ char *fname = NULL;
+
+ (void) ptr;
+ /* Test file opening for reading */
+ /* test opening a valid, unziped FASTQ */
+ fname = find_data_file("test.fastq");
+ tt_assert(fname != NULL);
+ sf = qes_seqfile_create(fname, "r");
+ tt_ptr_op(sf, !=, NULL);
+ tt_ptr_op(sf->qf, !=, NULL);
+ tt_int_op(sf->qf->mode, ==, QES_FILE_MODE_READ);
+ tt_int_op(sf->n_records, ==, 0);
+ tt_int_op(sf->format, ==, FASTQ_FMT);
+ qes_seqfile_destroy(sf);
+ free(fname);
+ /* test opening a valid, unziped FASTA */
+ fname = find_data_file("test.fasta");
+ tt_assert(fname != NULL);
+ sf = qes_seqfile_create(fname, "r");
+ tt_ptr_op(sf, !=, NULL);
+ tt_ptr_op(sf->qf, !=, NULL);
+ tt_int_op(sf->qf->mode, ==, QES_FILE_MODE_READ);
+ tt_int_op(sf->n_records, ==, 0);
+ tt_int_op(sf->format, ==, FASTA_FMT);
+ qes_seqfile_destroy(sf);
+ free(fname);
+ /* Test opening a file in transparent write mode */
+ fname = get_writable_file();
+ tt_assert(fname != NULL);
+ sf = qes_seqfile_create(fname, "wT");
+ QES_ZWRITE(sf->qf->fp, "ABCD", 4);
+ tt_ptr_op(sf, !=, NULL);
+ tt_ptr_op(sf->qf, !=, NULL);
+ tt_int_op(sf->qf->mode, ==, QES_FILE_MODE_WRITE);
+ tt_int_op(sf->n_records, ==, 0);
+ tt_int_op(access(fname, F_OK), ==, 0);
+ qes_seqfile_destroy(sf);
+ clean_writable_file(fname);
+ fname = NULL;
+ /* Test opening a file in write mode , acually zipping output */
+ fname = get_writable_file();
+ tt_assert(fname != NULL);
+ sf = qes_seqfile_create(fname, "w9");
+ tt_ptr_op(sf, !=, NULL);
+ tt_ptr_op(sf->qf, !=, NULL);
+ tt_int_op(sf->qf->mode, ==, QES_FILE_MODE_WRITE);
+ tt_int_op(sf->n_records, ==, 0);
+ tt_int_op(access(fname, F_OK), ==, 0);
+ qes_seqfile_destroy(sf);
+ clean_writable_file(fname);
+ fname = NULL;
+end:
+ qes_seqfile_destroy(sf);
+ if (fname != NULL) {
+ free(fname);
+ }
+}
+
+
+static void
+test_qes_seqfile_guess_format (void *ptr)
+{
+ struct qes_seqfile *sf = NULL;
+ int res = -1;
+ char *fname = NULL;
+
+ (void) ptr;
+ /* Test file opening for reading */
+ fname = find_data_file("test.fastq");
+ tt_assert(fname != NULL);
+ sf = qes_seqfile_create(fname, "r");
+ /* test with a FASTQ file */
+ res = qes_seqfile_guess_format(sf);
+ tt_int_op(res, ==, FASTQ_FMT);
+ tt_int_op(sf->format, ==, FASTQ_FMT);
+ qes_seqfile_destroy(sf);
+ free(fname);
+ /* test with a FASTA file */
+ fname = find_data_file("test.fasta");
+ tt_assert(fname != NULL);
+ sf = qes_seqfile_create(fname, "r");
+ res = qes_seqfile_guess_format(sf);
+ tt_int_op(res, ==, FASTA_FMT);
+ tt_int_op(sf->format, ==, FASTA_FMT);
+ qes_seqfile_destroy(sf);
+ free(fname);
+ fname = NULL;
+#ifdef ZLIB_FOUND
+ /* test with a gziped FASTQ file */
+ fname = find_data_file("test.fastq.gz");
+ tt_assert(fname != NULL);
+ sf = qes_seqfile_create(fname, "r");
+ res = qes_seqfile_guess_format(sf);
+ tt_int_op(res, ==, FASTQ_FMT);
+ tt_int_op(sf->format, ==, FASTQ_FMT);
+ qes_seqfile_destroy(sf);
+#endif
+end:
+ qes_seqfile_destroy(sf);
+ if (fname != NULL) free(fname);
+}
+
+
+static void
+test_qes_seqfile_destroy (void *ptr)
+{
+ struct qes_seqfile *sf = NULL;
+ char *fname = NULL;
+
+ (void) ptr;
+ /* Test file opening for reading */
+ fname = find_data_file("test.fastq");
+ tt_assert(fname != NULL);
+ sf = qes_seqfile_create(fname, "r");
+ tt_ptr_op(sf, !=, NULL);
+ tt_assert(qes_seqfile_ok(sf));
+ qes_seqfile_destroy(sf);
+ tt_ptr_op(sf, ==, NULL);
+ tt_assert(!qes_seqfile_ok(sf));
+end:
+ qes_seqfile_destroy(sf);
+ if (fname != NULL) free(fname);
+}
+
+
+/*=== FUNCTION ============================================================*
+Name: test_qes_seqfile_read
+Description: Tests the qes_seqfile_read function from qes_seqfile.c
+ *===========================================================================*/
+static void
+test_qes_seqfile_read (void *ptr)
+{
+ struct qes_seq *seq = qes_seq_create();
+ ssize_t res = 0;
+ struct qes_seqfile *sf = NULL;
+ char *fname = NULL;
+ /* Check a seq is empty */
+#define CHECK_SEQ_EMPTY \
+ tt_str_op(seq->name.str, ==, ""); \
+ tt_str_op(seq->comment.str, ==, ""); \
+ tt_str_op(seq->seq.str, ==, ""); \
+ tt_str_op(seq->qual.str, ==, "")
+ /* Check seq against the first known read */
+#define CHECK_SEQ_FIRST \
+ tt_str_op(seq->name.str, ==, first_fastq_read[0]); \
+ tt_str_op(seq->comment.str, ==, first_fastq_read[1]); \
+ tt_str_op(seq->seq.str, ==, first_fastq_read[2]); \
+ tt_str_op(seq->qual.str, ==, first_fastq_read[3])
+ /* Open, read, check & close a seqfile */
+#define CHECK_SEQFILE_READ(fn, expt_res, check_seq) \
+ fname = find_data_file(fn); \
+ tt_assert(fname != NULL); \
+ sf = qes_seqfile_create(fname, "r"); \
+ res = qes_seqfile_read(sf, seq); \
+ tt_int_op(res, ==, expt_res); \
+ check_seq; \
+ qes_seqfile_destroy(sf); \
+ free(fname); \
+ fname = NULL
+ /* Open, read, check & close a seqfile, forcing its filetype to FASTQ */
+#define CHECK_SEQFILE_READ_FORCE(fn, expt_res, check_seq) \
+ fname = find_data_file(fn); \
+ tt_assert(fname != NULL); \
+ sf = qes_seqfile_create(fname, "r"); \
+ qes_seqfile_set_format(sf, FASTQ_FMT); \
+ res = qes_seqfile_read(sf, seq); \
+ tt_int_op(res, ==, expt_res); \
+ check_seq; \
+ qes_seqfile_destroy(sf); \
+ free(fname); \
+ fname = NULL
+
+ (void) ptr;
+ /* Test file opening for reading */
+ CHECK_SEQFILE_READ("test.fastq", first_fastq_len, CHECK_SEQ_FIRST);
+ CHECK_SEQFILE_READ("test.fasta", 33,
+ tt_str_op(seq->name.str, ==, "HWI-ST960:105:D10GVACXX:2:1101:1122:2186");
+ tt_str_op(seq->comment.str, ==, "1:N:0: bcd:RPI8 seq:CACACTTGAATC");
+ tt_str_op(seq->seq.str, ==, "CACACTTGAATCCAGTTTAAAGTTAACTCATTG");
+ tt_int_op(seq->qual.len, ==, 0);
+ tt_str_op(seq->qual.str, ==, "")
+ );
+ CHECK_SEQFILE_READ("nocomment.fasta", 33,
+ tt_str_op(seq->name.str, ==, "HWI-ST960:105:D10GVACXX:2:1101:1122:2186");
+ tt_int_op(seq->comment.len, ==, 0);
+ tt_str_op(seq->comment.str, ==, "");
+ tt_str_op(seq->seq.str, ==, "CACACTTGAATCCAGTTTAAAGTTAACTCATTG");
+ tt_int_op(seq->qual.len, ==, 0);
+ tt_str_op(seq->qual.str, ==, "")
+ );
+ /* Test with bad fastqs, ensure all code paths are taken */
+ CHECK_SEQFILE_READ("loremipsum.txt", -2, CHECK_SEQ_EMPTY);
+ CHECK_SEQFILE_READ("bad_nohdr.fastq", -2, CHECK_SEQ_EMPTY);
+ CHECK_SEQFILE_READ("loremipsum.txt", -2, CHECK_SEQ_EMPTY);
+ CHECK_SEQFILE_READ_FORCE("loremipsum.txt", -3, CHECK_SEQ_EMPTY);
+ CHECK_SEQFILE_READ("empty.fastq", -3, CHECK_SEQ_EMPTY);
+ CHECK_SEQFILE_READ("bad_noqual.fastq", -6, CHECK_SEQ_EMPTY);
+ CHECK_SEQFILE_READ("bad_noqualhdrchr.fastq", -5, CHECK_SEQ_EMPTY);
+ CHECK_SEQFILE_READ("bad_noqualhdreol.fastq", -5, CHECK_SEQ_EMPTY);
+ CHECK_SEQFILE_READ("bad_diff_lens.fastq", -7, CHECK_SEQ_EMPTY);
+ /* Check with bad params that it returns -2 */
+ res = qes_seqfile_read(NULL, seq);
+ tt_int_op(res, ==, -2);
+ res = qes_seqfile_read(sf, NULL);
+ tt_int_op(res, ==, -2);
+end:
+ qes_seqfile_destroy(sf);
+ qes_seq_destroy(seq);
+ if (fname != NULL) {
+ free(fname);
+ }
+#undef CHECK_SEQ_EMPTY
+#undef CHECK_SEQFILE_READ
+}
+
+
+static void
+test_qes_seqfile_read_vs_kseq (void *ptr)
+{
+ struct qes_seq *seq = qes_seq_create();
+#ifdef ZLIB_FOUND
+ char *fname = find_data_file("test.fastq.gz");
+ gzFile fp = gzopen(fname, "r");
+#else
+ char *fname = find_data_file("test.fastq");
+ int fp = open(fname, O_RDONLY);
+#endif
+ struct qes_seqfile *sf = qes_seqfile_create(fname, "r");
+ kseq_t *kseq = kseq_init(fp);
+ ssize_t kseq_res = 0;
+ ssize_t my_res = 0;
+
+ (void) ptr;
+ tt_assert(fname != NULL);
+ while (1) {
+ my_res = qes_seqfile_read(sf, seq);
+ kseq_res = kseq_read(kseq);
+ tt_int_op(my_res, ==, kseq_res);
+ if (my_res < 1 || kseq_res < 1) {
+ /* EOF or error */
+ break;
+ }
+ tt_str_op(seq->name.str, ==, kseq->name.s);
+ tt_str_op(seq->comment.str, ==, kseq->comment.s);
+ tt_str_op(seq->seq.str, ==, kseq->seq.s);
+ tt_str_op(seq->qual.str, ==, kseq->qual.s);
+ }
+ my_res = qes_seqfile_read(sf, seq);
+ kseq_res = kseq_read(kseq);
+ tt_int_op(my_res, ==, kseq_res);
+ tt_int_op(my_res, ==, EOF);
+ qes_seqfile_destroy(sf);
+ qes_seq_destroy(seq);
+ kseq_destroy(kseq);
+ kseq = NULL;
+#ifdef ZLIB_FOUND
+ gzclose(fp);
+#else
+ close(fp);
+#endif
+ free(fname);
+ /* Try again, with fasta */
+ seq = qes_seq_create();
+ fname = find_data_file("test_large.fasta.gz");
+ tt_assert(fname != NULL);
+ sf = qes_seqfile_create(fname, "r");
+#ifdef ZLIB_FOUND
+ fp = gzopen(fname, "r");
+#else
+ fp = open(fname, O_RDONLY);
+#endif
+ kseq = kseq_init(fp);
+ while (1) {
+ my_res = qes_seqfile_read(sf, seq);
+ kseq_res = kseq_read(kseq);
+ tt_int_op(my_res, ==, kseq_res);
+ if (my_res < 1 || kseq_res < 1) {
+ /* EOF or error */
+ break;
+ }
+ tt_str_op(seq->name.str, ==, kseq->name.s);
+ tt_str_op(seq->comment.str, ==, kseq->comment.s);
+ tt_str_op(seq->seq.str, ==, kseq->seq.s);
+ }
+end:
+ qes_seqfile_destroy(sf);
+ qes_seq_destroy(seq);
+ if (kseq != NULL) kseq_destroy(kseq);
+ if (fname != NULL) free(fname);
+#ifdef ZLIB_FOUND
+ gzclose(fp);
+#else
+ close(fp);
+#endif
+}
+
+
+/*=== FUNCTION ============================================================*
+Name: test_qes_seqfile_write
+Description: Tests the qes_seqfile_write function from qes_seqfile.c
+ *===========================================================================*/
+static void
+test_qes_seqfile_write (void *ptr)
+{
+ struct qes_seq *seq = qes_seq_create();
+ size_t expt_bytes = 0;
+ ssize_t res = 0;
+ struct qes_seqfile *sf = NULL;
+ char *fname = NULL;
+ char *crc = NULL;
+
+ (void) ptr;
+ /* Make a seq to write */
+ qes_seq_fill_name(seq, "HWI-TEST", 8);
+ qes_seq_fill_comment(seq, "testseq 1 2 3", 13);
+ qes_seq_fill_seq(seq, "ACTCAATT", 8);
+ qes_seq_fill_qual(seq, "IIIIIIII", 8);
+ expt_bytes = 1 + 8 + 1 + 13 + 1 + /* @ + name + ' ' + comment + '\n' */
+ 8 + 1 + 2 + 8 + 1; /* seq + '\n' + "+\n" + qual + '\n' */
+ /* Test with a FASTQ seqfile */
+ fname = get_writable_file();
+ tt_assert(fname != NULL);
+ sf = qes_seqfile_create(fname, "wT");
+ qes_seqfile_set_format(sf, FASTQ_FMT);
+ res = qes_seqfile_write(sf, seq);
+ tt_int_op(res, ==, expt_bytes);
+ qes_seqfile_destroy(sf); /* Has to happen here to flush it */
+ crc = crc32_file(fname);
+ tt_str_op(crc, ==, "d4665941");
+ clean_writable_file(fname);
+ free(crc);
+ fname = NULL;
+ crc = NULL;
+ /* Test with a FASTA seqfile */
+ expt_bytes = 1 + 8 + 1 + 13 + 1 + /* @ + name + ' ' + comment + '\n' */
+ 8 + 1; /* seq + '\n'*/
+ fname = get_writable_file();
+ tt_assert(fname != NULL);
+ sf = qes_seqfile_create(fname, "wT");
+ qes_seqfile_set_format(sf, FASTA_FMT);
+ /* do the write */
+ res = qes_seqfile_write(sf, seq);
+ tt_int_op(res, ==, expt_bytes);
+ qes_seqfile_destroy(sf); /* Flush it */
+ crc = crc32_file(fname);
+ tt_str_op(crc, ==, "0a295c77");
+ clean_writable_file(fname);
+ fname = NULL;
+ /* Check with bad params that it returns -2 */
+ res = qes_seqfile_write(NULL, seq);
+ tt_int_op(res, ==, -2);
+ res = qes_seqfile_write(sf, NULL);
+ tt_int_op(res, ==, -2);
+end:
+ qes_seqfile_destroy(sf);
+ qes_seq_destroy(seq);
+ if (fname != NULL) free(fname);
+ if (crc != NULL) free(crc);
+}
+
+
+struct testcase_t qes_seqfile_tests[] = {
+ { "qes_seqfile_create", test_qes_seqfile_create, 0, NULL, NULL},
+ { "qes_seqfile_guess_format", test_qes_seqfile_guess_format, 0, NULL, NULL},
+ { "qes_seqfile_destroy", test_qes_seqfile_destroy, 0, NULL, NULL},
+ { "qes_seqfile_read_vs_kseq", test_qes_seqfile_read_vs_kseq, 0, NULL, NULL},
+ { "qes_seqfile_read", test_qes_seqfile_read, 0, NULL, NULL},
+ { "qes_seqfile_write", test_qes_seqfile_write, 0, NULL, NULL},
+ END_OF_TESTCASES
+};
diff --git a/src/libqes/test/test_sequtil.c b/src/libqes/test/test_sequtil.c
new file mode 100644
index 0000000..5eabd1c
--- /dev/null
+++ b/src/libqes/test/test_sequtil.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: test_sequtil.c
+ *
+ * Description: Tests for the sequtil module
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include "tests.h"
+#include <qes_sequtil.h>
+
+
+static void
+test_qes_sequtil_translate_codon (void *ptr)
+{
+ size_t iii;
+ size_t jjj;
+ char *cdn = NULL;
+ char aa = 0;
+
+ (void) ptr;
+ for (iii = 0; iii < n_codons; iii++) {
+ aa = qes_sequtil_translate_codon(codon_list[iii]);
+ tt_assert_op_type(aa, ==, aa_list[iii], char, "%c");
+ }
+ tt_int_op(qes_sequtil_translate_codon("XACACA"), ==, -1);
+ tt_int_op(qes_sequtil_translate_codon("A"), ==, -1);
+ tt_int_op(qes_sequtil_translate_codon(NULL), ==, -1);
+ /* Try with mutations */
+ for (iii = 0; iii < n_codons; iii++) {
+ for (jjj = 0; jjj < 3; jjj++) {
+ cdn = strdup(codon_list[iii]);
+ cdn[jjj] = 'N';
+ aa = qes_sequtil_translate_codon(cdn);
+ tt_assert_op_type(aa, ==, 'X', char, "%c");
+ free(cdn);
+ cdn = NULL;
+ }
+ }
+end:
+ if (cdn != NULL) free(cdn);
+}
+
+struct testcase_t qes_sequtil_tests[] = {
+ { "qes_sequtil_translate_codon", test_qes_sequtil_translate_codon, 0, NULL, NULL},
+ END_OF_TESTCASES
+};
diff --git a/src/libqes/test/test_util.c b/src/libqes/test/test_util.c
new file mode 100644
index 0000000..da8a8c2
--- /dev/null
+++ b/src/libqes/test/test_util.c
@@ -0,0 +1,161 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: test_util.c
+ *
+ * Description: Test qes_util.c
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include "tests.h"
+#include <qes_util.h>
+
+
+/* Actual tests */
+static void
+test_qes_calloc(void *ptr)
+{
+ void *res = NULL;
+ const size_t bufsize = 1<<10;
+ unsigned char *zeros[1<<10];
+
+ (void) ptr;
+ memset(zeros, 0, bufsize);
+ /* This should work, and the buffer should be zero throughout */
+ res = qes_calloc(1, 1);
+ tt_ptr_op(res, !=, NULL);
+ tt_int_op(memcmp(res, zeros, 1), ==, 0);
+ free(res);
+ res = NULL;
+end:
+ if (res != NULL) free(res);
+}
+
+static void
+test_qes_malloc(void *ptr)
+{
+ void *res = NULL;
+
+ (void) ptr;
+ res = qes_malloc(1);
+ tt_ptr_op(res, !=, NULL);
+ free(res);
+ res = NULL;
+end:
+ if (res != NULL) free(res);
+}
+
+static void
+test_qes_realloc(void *ptr)
+{
+ char *res = NULL;
+ const char *str = "test";
+ char *dat = strdup(str);
+
+ (void) ptr;
+ /* Test resizing buffer */
+ res = qes_realloc(dat, 10);
+ dat = NULL;
+ tt_ptr_op(res, !=, NULL);
+ tt_int_op(memcmp(res, str, 5), ==, 0);
+ free(res);
+ res = NULL;
+end:
+ if (res != NULL) free(res);
+ if (dat != NULL) free(dat);
+}
+
+static void
+test_qes_free(void *ptr)
+{
+ char *dat = strdup("test");
+
+ (void) ptr;
+ /* Test freeing buffer */
+ tt_ptr_op(dat, !=, NULL);
+ qes_free(dat);
+ tt_ptr_op(dat, ==, NULL);
+ /* This free(NULL) should not fail */
+ qes_free(dat);
+ tt_ptr_op(dat, ==, NULL);
+end:
+ if (dat != NULL) free(dat);
+}
+
+static void
+test_qes_roundup32 (void *ptr)
+{
+ int32_t val = 3;
+ uint32_t uval = (1u<<31) - 1;
+
+ (void) ptr;
+ /* Signed */
+ tt_int_op(qes_roundup32(val), ==, 4);
+ val++;
+ tt_int_op(qes_roundup32(val), ==, 8);
+ val = 8;
+ tt_int_op(qes_roundup32(val), ==, 16);
+ val = 262143;
+ tt_int_op(qes_roundup32(val), ==, 262144);
+ /* Unsigned */
+ tt_int_op(qes_roundup32(uval), ==, 1u<<31);
+ uval++;
+ tt_int_op(qes_roundup32(uval), ==, 0);
+end:
+ ;
+}
+
+static void
+test_qes_roundup64 (void *ptr)
+{
+ int64_t val = 3;
+ uint64_t uval = (1llu<<63) - 1;
+
+ (void) ptr;
+ /* Signed */
+ tt_int_op(qes_roundup64(val), ==, 4);
+ val = 4;
+ tt_int_op(qes_roundup64(val), ==, 8);
+ val = 8;
+ tt_int_op(qes_roundup64(val), ==, 16);
+ val = 262143llu;
+ tt_int_op(qes_roundup64(val), ==, 262144);
+ /* Unsigned */
+ tt_assert(qes_roundup64(uval) == 1llu<<63);
+ uval = 1llu<<62;
+ tt_assert(qes_roundup64(uval) == 1llu<<63);
+ uval = 63llu;
+ tt_assert(qes_roundup64(uval) - 2 == 62llu);
+end:
+ ;
+}
+
+
+struct testcase_t qes_util_tests[] = {
+ { "qes_calloc", test_qes_calloc, 0, NULL, NULL},
+ { "qes_malloc", test_qes_malloc, 0, NULL, NULL},
+ { "qes_realloc", test_qes_realloc, 0, NULL, NULL},
+ { "qes_free", test_qes_free, 0, NULL, NULL},
+ { "qes_roundup32", test_qes_roundup32, 0, NULL, NULL},
+ { "qes_roundup64", test_qes_roundup64, 0, NULL, NULL},
+ END_OF_TESTCASES
+};
diff --git a/src/libqes/test/testdata.c b/src/libqes/test/testdata.c
new file mode 100644
index 0000000..298abdf
--- /dev/null
+++ b/src/libqes/test/testdata.c
@@ -0,0 +1,160 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: testdata.c
+ *
+ * Description: Data for tests
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#include "testdata.h"
+
+
+const size_t n_loremipsum_lines = 11;
+const size_t loremipsum_fsize = 80+76+80+75+80+79+77+75+69+1+20;
+const size_t loremipsum_line_lens[] = {
+ 80, 76, 80, 75, 80, 79, 77, 75, 69, 1, 20
+};
+const char *loremipsum_lines[] = {
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec ornare tortor et\n",
+ "rhoncus iaculis. Sed suscipit, arcu nec elementum vestibulum, tortor tortor\n",
+ "dictum dui, eu sodales magna orci eu libero. Cras commodo, ligula tempor auctor\n",
+ "vulputate, eros urna gravida eros, eget congue leo quam quis mi. Curabitur\n",
+ "luctus augue nibh, eget vehicula augue commodo eget. Donec condimentum molestie\n",
+ "adipiscing. In non purus lacus. Nam nec mollis mauris. Donec rhoncus, diam sit\n",
+ "amet rhoncus viverra, lectus risus tincidunt ipsum, in dignissim justo purus\n",
+ "eget enim. Fusce congue nulla egestas est auctor faucibus. Integer feugiat\n",
+ "molestie leo, a interdum neque pretium nec. Etiam sit amet nibh leo.\n",
+ "\n",
+ "End of lorem ipsum.\n",
+};
+const char *first_fastq_read[] = {
+ "HWI-ST960:105:D10GVACXX:2:1101:1151:2158",
+ "1:N:0: bcd:RPI9 seq:CACGATCAGATC",
+ "CACGATCAGATCAANGACATTGAATCTATATGT",
+ "JJJJJJJIJHIJCC#4ADFFHHHGHJJJJIJJJ",
+};
+const size_t first_fastq_len = 33;
+
+
+const size_t n_codons = 125;
+
+const char *codon_list[] = {
+ "AAA", "AAC", "AAG", "AAT", "AAU",
+ "ACA", "ACC", "ACG", "ACT", "ACU",
+ "AGA", "AGC", "AGG", "AGT", "AGU",
+ "ATA", "ATC", "ATG", "ATT", "ATU",
+ "AUA", "AUC", "AUG", "AUT", "AUU",
+ "CAA", "CAC", "CAG", "CAT", "CAU",
+ "CCA", "CCC", "CCG", "CCT", "CCU",
+ "CGA", "CGC", "CGG", "CGT", "CGU",
+ "CTA", "CTC", "CTG", "CTT", "CTU",
+ "CUA", "CUC", "CUG", "CUT", "CUU",
+ "GAA", "GAC", "GAG", "GAT", "GAU",
+ "GCA", "GCC", "GCG", "GCT", "GCU",
+ "GGA", "GGC", "GGG", "GGT", "GGU",
+ "GTA", "GTC", "GTG", "GTT", "GTU",
+ "GUA", "GUC", "GUG", "GUT", "GUU",
+ "TAA", "TAC", "TAG", "TAT", "TAU",
+ "TCA", "TCC", "TCG", "TCT", "TCU",
+ "TGA", "TGC", "TGG", "TGT", "TGU",
+ "TTA", "TTC", "TTG", "TTT", "TTU",
+ "TUA", "TUC", "TUG", "TUT", "TUU",
+ "UAA", "UAC", "UAG", "UAT", "UAU",
+ "UCA", "UCC", "UCG", "UCT", "UCU",
+ "UGA", "UGC", "UGG", "UGT", "UGU",
+ "UTA", "UTC", "UTG", "UTT", "UTU",
+ "UUA", "UUC", "UUG", "UUT", "UUU",
+};
+
+const char aa_list[] = {
+ 'K', 'N', 'K', 'N', 'N',
+ 'T', 'T', 'T', 'T', 'T',
+ 'R', 'S', 'R', 'S', 'S',
+ 'I', 'I', 'M', 'I', 'I',
+ 'I', 'I', 'M', 'I', 'I',
+ 'Q', 'H', 'Q', 'H', 'H',
+ 'P', 'P', 'P', 'P', 'P',
+ 'R', 'R', 'R', 'R', 'R',
+ 'L', 'L', 'L', 'L', 'L',
+ 'L', 'L', 'L', 'L', 'L',
+ 'E', 'D', 'E', 'D', 'D',
+ 'A', 'A', 'A', 'A', 'A',
+ 'G', 'G', 'G', 'G', 'G',
+ 'V', 'V', 'V', 'V', 'V',
+ 'V', 'V', 'V', 'V', 'V',
+ '*', 'Y', '*', 'Y', 'Y',
+ 'S', 'S', 'S', 'S', 'S',
+ '*', 'C', 'W', 'C', 'C',
+ 'L', 'F', 'L', 'F', 'F',
+ 'L', 'F', 'L', 'F', 'F',
+ '*', 'Y', '*', 'Y', 'Y',
+ 'S', 'S', 'S', 'S', 'S',
+ '*', 'C', 'W', 'C', 'C',
+ 'L', 'F', 'L', 'F', 'F',
+ 'L', 'F', 'L', 'F', 'F',
+};
+
+void
+test_data_files (void *ptr)
+{
+ char *fname = NULL;
+ char *crc_res = NULL;
+
+ (void) ptr;
+ fname = find_data_file("loremipsum.txt");
+ crc_res = crc32_file(fname);
+ tt_str_op(crc_res, ==, "9f20f7ec");
+ free(fname);
+ free(crc_res);
+ fname = find_data_file("loremipsum.txt.gz");
+ crc_res = crc32_file(fname);
+ tt_str_op(crc_res, ==, "4e42dcb2");
+ free(fname);
+ free(crc_res);
+ fname = find_data_file("test.fastq");
+ crc_res = crc32_file(fname);
+ tt_str_op(crc_res, ==, "c32cc3c0");
+ free(fname);
+ free(crc_res);
+ fname = find_data_file("test.fasta");
+ crc_res = crc32_file(fname);
+ tt_str_op(crc_res, ==, "3de06bb6");
+ free(fname);
+ free(crc_res);
+ fname = find_data_file("test.fastq.gz");
+ crc_res = crc32_file(fname);
+ tt_str_op(crc_res, ==, "ba1206ee");
+ free(fname);
+ free(crc_res);
+ fname = find_data_file("test.fastq.bz2");
+ crc_res = crc32_file(fname);
+ tt_str_op(crc_res, ==, "c8b66d33");
+end:
+ free(fname);
+ free(crc_res);
+}
+
+struct testcase_t data_tests[] = {
+ { "data_files", test_data_files, 0, NULL, NULL},
+ END_OF_TESTCASES
+};
diff --git a/src/libqes/test/testdata.h b/src/libqes/test/testdata.h
new file mode 100644
index 0000000..68ab280
--- /dev/null
+++ b/src/libqes/test/testdata.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2015 Kevin Murray <spam at kdmurray.id.au>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/*
+ * ============================================================================
+ *
+ * Filename: testdata.h
+ *
+ * Description: Data for tests
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#ifndef TESTDATA_H
+#define TESTDATA_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <errno.h>
+#include <stdint.h>
+#include <time.h>
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+#include <sys/stat.h>
+#include <sys/types.h>
+
+/* TinyTest */
+#include "tinytest.h"
+#include "tinytest_macros.h"
+#include "testdata.h"
+#include "helpers.h"
+
+
+extern const size_t n_loremipsum_lines;
+extern const size_t loremipsum_fsize;
+extern const size_t loremipsum_line_lens[];
+extern const char *loremipsum_lines[];
+extern const char *first_fastq_read[];
+extern const size_t first_fastq_len;
+extern struct testcase_t data_tests[];
+extern const size_t n_codons;
+extern const char *codon_list[];
+extern const char aa_list[];
+
+void test_data_files (void *ptr);
+
+#endif /* TESTDATA_H */
diff --git a/src/libqes/test/tests.h b/src/libqes/test/tests.h
new file mode 100644
index 0000000..3d3eafa
--- /dev/null
+++ b/src/libqes/test/tests.h
@@ -0,0 +1,57 @@
+/*
+ * ============================================================================
+ *
+ * Filename: tests.h
+ *
+ * Description: Tests for libqes
+ * License: GPLv3+
+ * Author: Kevin Murray, spam at kdmurray.id.au
+ *
+ * ============================================================================
+ */
+
+#ifndef TESTS_H
+#define TESTS_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <errno.h>
+#include <stdint.h>
+#include <time.h>
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+#include <sys/stat.h>
+#include <sys/types.h>
+
+/* TinyTest */
+#include "tinytest.h"
+#include "tinytest_macros.h"
+#include "testdata.h"
+#include "helpers.h"
+
+#define QES_DEFAULT_ERR_FN errnil
+#define QES_EXIT_FN (void)
+#include <qes_util.h>
+
+
+/* test_util tests */
+extern struct testcase_t qes_util_tests[];
+/* test_match tests */
+extern struct testcase_t qes_match_tests[];
+/* test_qes_file tests */
+extern struct testcase_t qes_file_tests[];
+/* test_seqfile tests */
+extern struct testcase_t qes_seqfile_tests[];
+/* test_seq tests */
+extern struct testcase_t qes_seq_tests[];
+/* test_sequtil tests */
+extern struct testcase_t qes_sequtil_tests[];
+/* test_log tests */
+extern struct testcase_t qes_log_tests[];
+/* test_helpers tests */
+extern struct testcase_t helper_tests[];
+
+#endif /* TESTS_H */
diff --git a/src/libqes/test/tinytest/tinytest.c b/src/libqes/test/tinytest/tinytest.c
new file mode 100644
index 0000000..3a8e331
--- /dev/null
+++ b/src/libqes/test/tinytest/tinytest.c
@@ -0,0 +1,493 @@
+/* tinytest.c -- Copyright 2009-2012 Nick Mathewson
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifdef TINYTEST_LOCAL
+#include "tinytest_local.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#ifndef NO_FORKING
+
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#endif
+
+#if defined(__APPLE__) && defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__)
+#if (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1060 && \
+ __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070)
+/* Workaround for a stupid bug in OSX 10.6 */
+#define FORK_BREAKS_GCOV
+#include <vproc.h>
+#endif
+#endif
+
+#endif /* !NO_FORKING */
+
+#ifndef __GNUC__
+#define __attribute__(x)
+#endif
+
+#include "tinytest.h"
+#include "tinytest_macros.h"
+
+#define LONGEST_TEST_NAME 16384
+
+static int in_tinytest_main = 0; /**< true if we're in tinytest_main().*/
+static int n_ok = 0; /**< Number of tests that have passed */
+static int n_bad = 0; /**< Number of tests that have failed. */
+static int n_skipped = 0; /**< Number of tests that have been skipped. */
+
+static int opt_forked = 0; /**< True iff we're called from inside a win32 fork*/
+static int opt_nofork = 0; /**< Suppress calls to fork() for debugging. */
+static int opt_verbosity = 1; /**< -==quiet,0==terse,1==normal,2==verbose */
+const char *verbosity_flag = "";
+
+const struct testlist_alias_t *cfg_aliases=NULL;
+
+enum outcome { SKIP=2, OK=1, FAIL=0 };
+static enum outcome cur_test_outcome = 0;
+const char *cur_test_prefix = NULL; /**< prefix of the current test group */
+/** Name of the current test, if we haven't logged is yet. Used for --quiet */
+const char *cur_test_name = NULL;
+
+#ifdef _WIN32
+/* Copy of argv[0] for win32. */
+static char commandname[MAX_PATH+1];
+#endif
+
+static void usage(struct testgroup_t *groups, int list_groups)
+ __attribute__((noreturn));
+static int process_test_option(struct testgroup_t *groups, const char *test);
+
+static enum outcome
+testcase_run_bare_(const struct testcase_t *testcase)
+{
+ void *env = NULL;
+ int outcome;
+ if (testcase->setup) {
+ env = testcase->setup->setup_fn(testcase);
+ if (!env)
+ return FAIL;
+ else if (env == (void*)TT_SKIP)
+ return SKIP;
+ }
+
+ cur_test_outcome = OK;
+ testcase->fn(env);
+ outcome = cur_test_outcome;
+
+ if (testcase->setup) {
+ if (testcase->setup->cleanup_fn(testcase, env) == 0)
+ outcome = FAIL;
+ }
+
+ return outcome;
+}
+
+#define MAGIC_EXITCODE 42
+
+#ifndef NO_FORKING
+
+static enum outcome
+testcase_run_forked_(const struct testgroup_t *group,
+ const struct testcase_t *testcase)
+{
+#ifdef _WIN32
+ /* Fork? On Win32? How primitive! We'll do what the smart kids do:
+ we'll invoke our own exe (whose name we recall from the command
+ line) with a command line that tells it to run just the test we
+ want, and this time without forking.
+
+ (No, threads aren't an option. The whole point of forking is to
+ share no state between tests.)
+ */
+ int ok;
+ char buffer[LONGEST_TEST_NAME+256];
+ STARTUPINFOA si;
+ PROCESS_INFORMATION info;
+ DWORD exitcode;
+
+ if (!in_tinytest_main) {
+ printf("\nERROR. On Windows, testcase_run_forked_ must be"
+ " called from within tinytest_main.\n");
+ abort();
+ }
+ if (opt_verbosity>0)
+ printf("[forking] ");
+
+ snprintf(buffer, sizeof(buffer), "%s --RUNNING-FORKED %s %s%s",
+ commandname, verbosity_flag, group->prefix, testcase->name);
+
+ memset(&si, 0, sizeof(si));
+ memset(&info, 0, sizeof(info));
+ si.cb = sizeof(si);
+
+ ok = CreateProcessA(commandname, buffer, NULL, NULL, 0,
+ 0, NULL, NULL, &si, &info);
+ if (!ok) {
+ printf("CreateProcess failed!\n");
+ return 0;
+ }
+ WaitForSingleObject(info.hProcess, INFINITE);
+ GetExitCodeProcess(info.hProcess, &exitcode);
+ CloseHandle(info.hProcess);
+ CloseHandle(info.hThread);
+ if (exitcode == 0)
+ return OK;
+ else if (exitcode == MAGIC_EXITCODE)
+ return SKIP;
+ else
+ return FAIL;
+#else
+ int outcome_pipe[2];
+ pid_t pid;
+ (void)group;
+
+ if (pipe(outcome_pipe))
+ perror("opening pipe");
+
+ if (opt_verbosity>0)
+ printf("[forking] ");
+ pid = fork();
+#ifdef FORK_BREAKS_GCOV
+ vproc_transaction_begin(0);
+#endif
+ if (!pid) {
+ /* child. */
+ int test_r, write_r;
+ char b[1];
+ close(outcome_pipe[0]);
+ test_r = testcase_run_bare_(testcase);
+ assert(0<=(int)test_r && (int)test_r<=2);
+ b[0] = "NYS"[test_r];
+ write_r = (int)write(outcome_pipe[1], b, 1);
+ if (write_r != 1) {
+ perror("write outcome to pipe");
+ exit(1);
+ }
+ exit(0);
+ return FAIL; /* unreachable */
+ } else {
+ /* parent */
+ int status, r;
+ char b[1];
+ /* Close this now, so that if the other side closes it,
+ * our read fails. */
+ close(outcome_pipe[1]);
+ r = (int)read(outcome_pipe[0], b, 1);
+ if (r == 0) {
+ printf("[Lost connection!] ");
+ return 0;
+ } else if (r != 1) {
+ perror("read outcome from pipe");
+ }
+ waitpid(pid, &status, 0);
+ close(outcome_pipe[0]);
+ return b[0]=='Y' ? OK : (b[0]=='S' ? SKIP : FAIL);
+ }
+#endif
+}
+
+#endif /* !NO_FORKING */
+
+int
+testcase_run_one(const struct testgroup_t *group,
+ const struct testcase_t *testcase)
+{
+ enum outcome outcome;
+
+ if (testcase->flags & (TT_SKIP|TT_OFF_BY_DEFAULT)) {
+ if (opt_verbosity>0)
+ printf("%s%s: %s\n",
+ group->prefix, testcase->name,
+ (testcase->flags & TT_SKIP) ? "SKIPPED" : "DISABLED");
+ ++n_skipped;
+ return SKIP;
+ }
+
+ if (opt_verbosity>0 && !opt_forked) {
+ printf("%s%s: ", group->prefix, testcase->name);
+ } else {
+ if (opt_verbosity==0) printf(".");
+ cur_test_prefix = group->prefix;
+ cur_test_name = testcase->name;
+ }
+
+#ifndef NO_FORKING
+ if ((testcase->flags & TT_FORK) && !(opt_forked||opt_nofork)) {
+ outcome = testcase_run_forked_(group, testcase);
+ } else {
+#else
+ {
+#endif
+ outcome = testcase_run_bare_(testcase);
+ }
+
+ if (outcome == OK) {
+ ++n_ok;
+ if (opt_verbosity>0 && !opt_forked)
+ puts(opt_verbosity==1?"OK":"");
+ } else if (outcome == SKIP) {
+ ++n_skipped;
+ if (opt_verbosity>0 && !opt_forked)
+ puts("SKIPPED");
+ } else {
+ ++n_bad;
+ if (!opt_forked)
+ printf("\n [%s FAILED]\n", testcase->name);
+ }
+
+ if (opt_forked) {
+ exit(outcome==OK ? 0 : (outcome==SKIP?MAGIC_EXITCODE : 1));
+ return 1; /* unreachable */
+ } else {
+ return (int)outcome;
+ }
+}
+
+int
+tinytest_set_flag_(struct testgroup_t *groups, const char *arg, int set, unsigned long flag)
+{
+ int i, j;
+ size_t length = LONGEST_TEST_NAME;
+ char fullname[LONGEST_TEST_NAME];
+ int found=0;
+ if (strstr(arg, ".."))
+ length = strstr(arg,"..")-arg;
+ for (i=0; groups[i].prefix; ++i) {
+ for (j=0; groups[i].cases[j].name; ++j) {
+ struct testcase_t *testcase = &groups[i].cases[j];
+ snprintf(fullname, sizeof(fullname), "%s%s",
+ groups[i].prefix, testcase->name);
+ if (!flag) { /* Hack! */
+ printf(" %s", fullname);
+ if (testcase->flags & TT_OFF_BY_DEFAULT)
+ puts(" (Off by default)");
+ else if (testcase->flags & TT_SKIP)
+ puts(" (DISABLED)");
+ else
+ puts("");
+ }
+ if (!strncmp(fullname, arg, length)) {
+ if (set)
+ testcase->flags |= flag;
+ else
+ testcase->flags &= ~flag;
+ ++found;
+ }
+ }
+ }
+ return found;
+}
+
+static void
+usage(struct testgroup_t *groups, int list_groups)
+{
+ puts("Options are: [--verbose|--quiet|--terse] [--no-fork]");
+ puts(" Specify tests by name, or using a prefix ending with '..'");
+ puts(" To skip a test, prefix its name with a colon.");
+ puts(" To enable a disabled test, prefix its name with a plus.");
+ puts(" Use --list-tests for a list of tests.");
+ if (list_groups) {
+ puts("Known tests are:");
+ tinytest_set_flag_(groups, "..", 1, 0);
+ }
+ exit(0);
+}
+
+static int
+process_test_alias(struct testgroup_t *groups, const char *test)
+{
+ int i, j, n, r;
+ for (i=0; cfg_aliases && cfg_aliases[i].name; ++i) {
+ if (!strcmp(cfg_aliases[i].name, test)) {
+ n = 0;
+ for (j = 0; cfg_aliases[i].tests[j]; ++j) {
+ r = process_test_option(groups, cfg_aliases[i].tests[j]);
+ if (r<0)
+ return -1;
+ n += r;
+ }
+ return n;
+ }
+ }
+ printf("No such test alias as @%s!",test);
+ return -1;
+}
+
+static int
+process_test_option(struct testgroup_t *groups, const char *test)
+{
+ int flag = TT_ENABLED_;
+ int n = 0;
+ if (test[0] == '@') {
+ return process_test_alias(groups, test + 1);
+ } else if (test[0] == ':') {
+ ++test;
+ flag = TT_SKIP;
+ } else if (test[0] == '+') {
+ ++test;
+ ++n;
+ if (!tinytest_set_flag_(groups, test, 0, TT_OFF_BY_DEFAULT)) {
+ printf("No such test as %s!\n", test);
+ return -1;
+ }
+ } else {
+ ++n;
+ }
+ if (!tinytest_set_flag_(groups, test, 1, flag)) {
+ printf("No such test as %s!\n", test);
+ return -1;
+ }
+ return n;
+}
+
+void
+tinytest_set_aliases(const struct testlist_alias_t *aliases)
+{
+ cfg_aliases = aliases;
+}
+
+int
+tinytest_main(int c, const char **v, struct testgroup_t *groups)
+{
+ int i, j, n=0;
+
+#ifdef _WIN32
+ const char *sp = strrchr(v[0], '.');
+ const char *extension = "";
+ if (!sp || stricmp(sp, ".exe"))
+ extension = ".exe"; /* Add an exe so CreateProcess will work */
+ snprintf(commandname, sizeof(commandname), "%s%s", v[0], extension);
+ commandname[MAX_PATH]='\0';
+#endif
+ for (i=1; i<c; ++i) {
+ if (v[i][0] == '-') {
+ if (!strcmp(v[i], "--RUNNING-FORKED")) {
+ opt_forked = 1;
+ } else if (!strcmp(v[i], "--no-fork")) {
+ opt_nofork = 1;
+ } else if (!strcmp(v[i], "--quiet")) {
+ opt_verbosity = -1;
+ verbosity_flag = "--quiet";
+ } else if (!strcmp(v[i], "--verbose")) {
+ opt_verbosity = 2;
+ verbosity_flag = "--verbose";
+ } else if (!strcmp(v[i], "--terse")) {
+ opt_verbosity = 0;
+ verbosity_flag = "--terse";
+ } else if (!strcmp(v[i], "--help")) {
+ usage(groups, 0);
+ } else if (!strcmp(v[i], "--list-tests")) {
+ usage(groups, 1);
+ } else {
+ printf("Unknown option %s. Try --help\n",v[i]);
+ return -1;
+ }
+ } else {
+ int r = process_test_option(groups, v[i]);
+ if (r<0)
+ return -1;
+ n += r;
+ }
+ }
+ if (!n)
+ tinytest_set_flag_(groups, "..", 1, TT_ENABLED_);
+
+#ifdef _IONBF
+ setvbuf(stdout, NULL, _IONBF, 0);
+#endif
+
+ ++in_tinytest_main;
+ for (i=0; groups[i].prefix; ++i)
+ for (j=0; groups[i].cases[j].name; ++j)
+ if (groups[i].cases[j].flags & TT_ENABLED_)
+ testcase_run_one(&groups[i],
+ &groups[i].cases[j]);
+
+ --in_tinytest_main;
+
+ if (opt_verbosity==0)
+ puts("");
+
+ if (n_bad)
+ printf("%d/%d TESTS FAILED. (%d skipped)\n", n_bad,
+ n_bad+n_ok,n_skipped);
+ else if (opt_verbosity >= 1)
+ printf("%d tests ok. (%d skipped)\n", n_ok, n_skipped);
+
+ return (n_bad == 0) ? 0 : 1;
+}
+
+int
+tinytest_get_verbosity_(void)
+{
+ return opt_verbosity;
+}
+
+void
+tinytest_set_test_failed_(void)
+{
+ if (opt_verbosity <= 0 && cur_test_name) {
+ if (opt_verbosity==0) puts("");
+ printf("%s%s: ", cur_test_prefix, cur_test_name);
+ cur_test_name = NULL;
+ }
+ cur_test_outcome = 0;
+}
+
+void
+tinytest_set_test_skipped_(void)
+{
+ if (cur_test_outcome==OK)
+ cur_test_outcome = SKIP;
+}
+
+char *
+tinytest_format_hex_(const void *val_, unsigned long len)
+{
+ const unsigned char *val = val_;
+ char *result, *cp;
+ size_t i;
+
+ if (!val)
+ return strdup("null");
+ if (!(result = malloc(len*2+1)))
+ return strdup("<allocation failure>");
+ cp = result;
+ for (i=0;i<len;++i) {
+ *cp++ = "0123456789ABCDEF"[val[i] >> 4];
+ *cp++ = "0123456789ABCDEF"[val[i] & 0x0f];
+ }
+ *cp = 0;
+ return result;
+}
diff --git a/src/libqes/test/tinytest/tinytest.h b/src/libqes/test/tinytest/tinytest.h
new file mode 100644
index 0000000..ed07b26
--- /dev/null
+++ b/src/libqes/test/tinytest/tinytest.h
@@ -0,0 +1,100 @@
+/* tinytest.h -- Copyright 2009-2012 Nick Mathewson
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef TINYTEST_H_INCLUDED_
+#define TINYTEST_H_INCLUDED_
+
+/** Flag for a test that needs to run in a subprocess. */
+#define TT_FORK (1<<0)
+/** Runtime flag for a test we've decided to skip. */
+#define TT_SKIP (1<<1)
+/** Internal runtime flag for a test we've decided to run. */
+#define TT_ENABLED_ (1<<2)
+/** Flag for a test that's off by default. */
+#define TT_OFF_BY_DEFAULT (1<<3)
+/** If you add your own flags, make them start at this point. */
+#define TT_FIRST_USER_FLAG (1<<4)
+
+typedef void (*testcase_fn)(void *);
+
+struct testcase_t;
+
+/** Functions to initialize/teardown a structure for a testcase. */
+struct testcase_setup_t {
+ /** Return a new structure for use by a given testcase. */
+ void *(*setup_fn)(const struct testcase_t *);
+ /** Clean/free a structure from setup_fn. Return 1 if ok, 0 on err. */
+ int (*cleanup_fn)(const struct testcase_t *, void *);
+};
+
+/** A single test-case that you can run. */
+struct testcase_t {
+ const char *name; /**< An identifier for this case. */
+ testcase_fn fn; /**< The function to run to implement this case. */
+ unsigned long flags; /**< Bitfield of TT_* flags. */
+ const struct testcase_setup_t *setup; /**< Optional setup/cleanup fns*/
+ void *setup_data; /**< Extra data usable by setup function */
+};
+#define END_OF_TESTCASES { NULL, NULL, 0, NULL, NULL }
+
+/** A group of tests that are selectable together. */
+struct testgroup_t {
+ const char *prefix; /**< Prefix to prepend to testnames. */
+ struct testcase_t *cases; /** Array, ending with END_OF_TESTCASES */
+};
+#define END_OF_GROUPS { NULL, NULL}
+
+struct testlist_alias_t {
+ const char *name;
+ const char **tests;
+};
+#define END_OF_ALIASES { NULL, NULL }
+
+/** Implementation: called from a test to indicate failure, before logging. */
+void tinytest_set_test_failed_(void);
+/** Implementation: called from a test to indicate that we're skipping. */
+void tinytest_set_test_skipped_(void);
+/** Implementation: return 0 for quiet, 1 for normal, 2 for loud. */
+int tinytest_get_verbosity_(void);
+/** Implementation: Set a flag on tests matching a name; returns number
+ * of tests that matched. */
+int tinytest_set_flag_(struct testgroup_t *, const char *, int set, unsigned long);
+/** Implementation: Put a chunk of memory into hex. */
+char *tinytest_format_hex_(const void *, unsigned long);
+
+/** Set all tests in 'groups' matching the name 'named' to be skipped. */
+#define tinytest_skip(groups, named) \
+ tinytest_set_flag_(groups, named, 1, TT_SKIP)
+
+/** Run a single testcase in a single group. */
+int testcase_run_one(const struct testgroup_t *,const struct testcase_t *);
+
+void tinytest_set_aliases(const struct testlist_alias_t *aliases);
+
+/** Run a set of testcases from an END_OF_GROUPS-terminated array of groups,
+ as selected from the command line. */
+int tinytest_main(int argc, const char **argv, struct testgroup_t *groups);
+
+#endif
diff --git a/src/libqes/test/tinytest/tinytest_macros.h b/src/libqes/test/tinytest/tinytest_macros.h
new file mode 100644
index 0000000..c3728d1
--- /dev/null
+++ b/src/libqes/test/tinytest/tinytest_macros.h
@@ -0,0 +1,199 @@
+/* tinytest_macros.h -- Copyright 2009-2012 Nick Mathewson
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef TINYTEST_MACROS_H_INCLUDED_
+#define TINYTEST_MACROS_H_INCLUDED_
+
+/* Helpers for defining statement-like macros */
+#define TT_STMT_BEGIN do {
+#define TT_STMT_END } while (0)
+
+/* Redefine this if your test functions want to abort with something besides
+ * "goto end;" */
+#ifndef TT_EXIT_TEST_FUNCTION
+#define TT_EXIT_TEST_FUNCTION TT_STMT_BEGIN goto end; TT_STMT_END
+#endif
+
+/* Redefine this if you want to note success/failure in some different way. */
+#ifndef TT_DECLARE
+#define TT_DECLARE(prefix, args) \
+ TT_STMT_BEGIN \
+ printf("\n %s %s:%d: ",prefix,__FILE__,__LINE__); \
+ printf args ; \
+ TT_STMT_END
+#endif
+
+/* Announce a failure. Args are parenthesized printf args. */
+#define TT_GRIPE(args) TT_DECLARE("FAIL", args)
+
+/* Announce a non-failure if we're verbose. */
+#define TT_BLATHER(args) \
+ TT_STMT_BEGIN \
+ if (tinytest_get_verbosity_()>1) TT_DECLARE(" OK", args); \
+ TT_STMT_END
+
+#define TT_DIE(args) \
+ TT_STMT_BEGIN \
+ tinytest_set_test_failed_(); \
+ TT_GRIPE(args); \
+ TT_EXIT_TEST_FUNCTION; \
+ TT_STMT_END
+
+#define TT_FAIL(args) \
+ TT_STMT_BEGIN \
+ tinytest_set_test_failed_(); \
+ TT_GRIPE(args); \
+ TT_STMT_END
+
+/* Fail and abort the current test for the reason in msg */
+#define tt_abort_printf(msg) TT_DIE(msg)
+#define tt_abort_perror(op) TT_DIE(("%s: %s [%d]",(op),strerror(errno), errno))
+#define tt_abort_msg(msg) TT_DIE(("%s", msg))
+#define tt_abort() TT_DIE(("%s", "(Failed.)"))
+
+/* Fail but do not abort the current test for the reason in msg. */
+#define tt_failprint_f(msg) TT_FAIL(msg)
+#define tt_fail_perror(op) TT_FAIL(("%s: %s [%d]",(op),strerror(errno), errno))
+#define tt_fail_msg(msg) TT_FAIL(("%s", msg))
+#define tt_fail() TT_FAIL(("%s", "(Failed.)"))
+
+/* End the current test, and indicate we are skipping it. */
+#define tt_skip() \
+ TT_STMT_BEGIN \
+ tinytest_set_test_skipped_(); \
+ TT_EXIT_TEST_FUNCTION; \
+ TT_STMT_END
+
+#define tt_want_(b, msg, fail) \
+ TT_STMT_BEGIN \
+ if (!(b)) { \
+ tinytest_set_test_failed_(); \
+ TT_GRIPE(("%s",msg)); \
+ fail; \
+ } else { \
+ TT_BLATHER(("%s",msg)); \
+ } \
+ TT_STMT_END
+
+/* Assert b, but do not stop the test if b fails. Log msg on failure. */
+#define tt_want_msg(b, msg) \
+ tt_want_(b, msg, );
+
+/* Assert b and stop the test if b fails. Log msg on failure. */
+#define tt_assert_msg(b, msg) \
+ tt_want_(b, msg, TT_EXIT_TEST_FUNCTION);
+
+/* Assert b, but do not stop the test if b fails. */
+#define tt_want(b) tt_want_msg( (b), "want("#b")")
+/* Assert b, and stop the test if b fails. */
+#define tt_assert(b) tt_assert_msg((b), "assert("#b")")
+
+#define tt_assert_test_fmt_type(a,b,str_test,type,test,printf_type,printf_fmt, \
+ setup_block,cleanup_block,die_on_fail) \
+ TT_STMT_BEGIN \
+ type val1_ = (a); \
+ type val2_ = (b); \
+ int tt_status_ = (test); \
+ if (!tt_status_ || tinytest_get_verbosity_()>1) { \
+ printf_type print_; \
+ printf_type print1_; \
+ printf_type print2_; \
+ type value_ = val1_; \
+ setup_block; \
+ print1_ = print_; \
+ value_ = val2_; \
+ setup_block; \
+ print2_ = print_; \
+ TT_DECLARE(tt_status_?" OK":"FAIL", \
+ ("assert(%s): "printf_fmt" vs "printf_fmt, \
+ str_test, print1_, print2_)); \
+ print_ = print1_; \
+ cleanup_block; \
+ print_ = print2_; \
+ cleanup_block; \
+ if (!tt_status_) { \
+ tinytest_set_test_failed_(); \
+ die_on_fail ; \
+ } \
+ } \
+ TT_STMT_END
+
+#define tt_assert_test_type(a,b,str_test,type,test,fmt,die_on_fail) \
+ tt_assert_test_fmt_type(a,b,str_test,type,test,type,fmt, \
+ {print_=value_;},{},die_on_fail)
+
+#define tt_assert_test_type_opt(a,b,str_test,type,test,fmt,die_on_fail) \
+ tt_assert_test_fmt_type(a,b,str_test,type,test,type,fmt, \
+ {print_=value_?value_:"<NULL>";},{},die_on_fail)
+
+/* Helper: assert that a op b, when cast to type. Format the values with
+ * printf format fmt on failure. */
+#define tt_assert_op_type(a,op,b,type,fmt) \
+ tt_assert_test_type(a,b,#a" "#op" "#b,type,(val1_ op val2_),fmt, \
+ TT_EXIT_TEST_FUNCTION)
+
+#define tt_int_op(a,op,b) \
+ tt_assert_test_type(a,b,#a" "#op" "#b,long,(val1_ op val2_), \
+ "%ld",TT_EXIT_TEST_FUNCTION)
+
+#define tt_uint_op(a,op,b) \
+ tt_assert_test_type(a,b,#a" "#op" "#b,unsigned long, \
+ (val1_ op val2_),"%lu",TT_EXIT_TEST_FUNCTION)
+
+#define tt_ptr_op(a,op,b) \
+ tt_assert_test_type(a,b,#a" "#op" "#b,const void*, \
+ (val1_ op val2_),"%p",TT_EXIT_TEST_FUNCTION)
+
+#define tt_str_op(a,op,b) \
+ tt_assert_test_type_opt(a,b,#a" "#op" "#b,const char *, \
+ (val1_ && val2_ && strcmp(val1_,val2_) op 0),"<%s>", \
+ TT_EXIT_TEST_FUNCTION)
+
+#define tt_mem_op(expr1, op, expr2, len) \
+ tt_assert_test_fmt_type(expr1,expr2,#expr1" "#op" "#expr2, \
+ const void *, \
+ (val1_ && val2_ && memcmp(val1_, val2_, len) op 0), \
+ char *, "%s", \
+ { print_ = tinytest_format_hex_(value_, (len)); }, \
+ { if (print_) free(print_); }, \
+ TT_EXIT_TEST_FUNCTION \
+ );
+
+#define tt_want_int_op(a,op,b) \
+ tt_assert_test_type(a,b,#a" "#op" "#b,long,(val1_ op val2_),"%ld",(void)0)
+
+#define tt_want_uint_op(a,op,b) \
+ tt_assert_test_type(a,b,#a" "#op" "#b,unsigned long, \
+ (val1_ op val2_),"%lu",(void)0)
+
+#define tt_want_ptr_op(a,op,b) \
+ tt_assert_test_type(a,b,#a" "#op" "#b,const void*, \
+ (val1_ op val2_),"%p",(void)0)
+
+#define tt_want_str_op(a,op,b) \
+ tt_assert_test_type(a,b,#a" "#op" "#b,const char *, \
+ (strcmp(val1_,val2_) op 0),"<%s>",(void)0)
+
+#endif
diff --git a/src/libqes/util/make_codon_list.py b/src/libqes/util/make_codon_list.py
new file mode 100644
index 0000000..0611413
--- /dev/null
+++ b/src/libqes/util/make_codon_list.py
@@ -0,0 +1,38 @@
+from Bio.Data import CodonTable
+
+nts = "ACGTU"
+codons = []
+aas = []
+codon_tab = CodonTable.generic_by_name["Standard"].forward_table
+for a in nts:
+ for b in nts:
+ for c in nts:
+ codon = "".join((a,b,c))
+ try:
+ aa = codon_tab[codon.replace("U", "T")]
+ except KeyError:
+ aa = "*"
+ codons.append(codon)
+ aas.append(aa)
+n = 0
+print "const size_t n_codons = %s;" % len(codons)
+print
+print "const char *codon_list[] = {" ,
+for cdn in codons:
+ if n % 5 == 0:
+ print "\n ",
+ print '"%s", ' % cdn,
+ n += 1
+print
+print "};"
+n = 0
+print
+print "const char aa_list[] = {",
+for aa in aas:
+ if n % 5 == 0:
+ print "\n ",
+ print "'%s', " % aa,
+ n += 1
+print
+print "};"
+print
diff --git a/src/libqes/util/make_codon_map.py b/src/libqes/util/make_codon_map.py
new file mode 100644
index 0000000..d300dd8
--- /dev/null
+++ b/src/libqes/util/make_codon_map.py
@@ -0,0 +1,21 @@
+from Bio.Data import CodonTable
+
+nts = "ACGTU"
+
+codon_tab = CodonTable.generic_by_name["Standard"].forward_table
+print "char\ntranslate_codon(char *codon)\n{"
+for a in nts:
+ print " else if (codon[0] == '%s') {" % a
+ for b in nts:
+ print " else if (codon[1] == '%s') {" % b
+ for c in nts:
+ print " else if (codon[2] == '%s')" % c ,
+ codon = "".join((a,b,c))
+ try:
+ aa = codon_tab[codon]
+ except KeyError:
+ aa = "*"
+ print "return '%s'" % aa
+ print " }"
+ print " }"
+print "}"
diff --git a/src/main.c b/src/main.c
index 8ac237c..c52f198 100644
--- a/src/main.c
+++ b/src/main.c
@@ -28,70 +28,70 @@
#include <getopt.h>
static void
-print_version(void)
+print_version(FILE *stream)
{
- fprintf(stderr, "AXE Version %s\n", AXE_VERSION);
+ fprintf(stream, "AXE Version %s\n", AXE_VERSION);
}
static void
-print_help(void)
+print_help(FILE *stream)
{
- fprintf(stderr, "All mandatory short options are mandatory in their\n");
- fprintf(stderr, "long option form. Likewise, all short options that take\n");
- fprintf(stderr, "an argument must be given an argument in their long form\n");
- fprintf(stderr, "\n");
- fprintf(stderr, "If a forward read input is given, a forward read output\n");
- fprintf(stderr, "must be. Likewise for a reverse/interleaved input. If either\n");
- fprintf(stderr, "forward and/or reverse reads are given, interleaved input\n");
- fprintf(stderr, "cannot be. However, one can input interleaved paired reads\n");
- fprintf(stderr, "and output separate forwards and reverse reads, and vice versa.\n");
- fprintf(stderr, "\n");
- fprintf(stderr, "The barcode file is a tab-separated tabular file with an\n");
- fprintf(stderr, "optional header, and has two alternative formats. The standard\n");
- fprintf(stderr, "form (see below) is expected unless --combinatorial is given.\n");
- fprintf(stderr, "\n");
- fprintf(stderr, "The standard format is:\n");
- fprintf(stderr, "Barcode\tID\n");
- fprintf(stderr, "ACTA\tA1\n");
- fprintf(stderr, "CCTC\tA2\n");
- fprintf(stderr, "...\n");
- fprintf(stderr, "\n");
- fprintf(stderr, "The combinatorial format is:\n");
- fprintf(stderr, "Barcode1\tBarcode2\tID\n");
- fprintf(stderr, "ACTA\tACGC\tA1\n");
- fprintf(stderr, "CCTC\tTCTA\tA2\n");
- fprintf(stderr, "...\n");
- fprintf(stderr, "\n");
+ fprintf(stream, "All mandatory short options are mandatory in their\n");
+ fprintf(stream, "long option form. Likewise, all short options that take\n");
+ fprintf(stream, "an argument must be given an argument in their long form\n");
+ fprintf(stream, "\n");
+ fprintf(stream, "If a forward read input is given, a forward read output\n");
+ fprintf(stream, "must be. Likewise for a reverse/interleaved input. If either\n");
+ fprintf(stream, "forward and/or reverse reads are given, interleaved input\n");
+ fprintf(stream, "cannot be. However, one can input interleaved paired reads\n");
+ fprintf(stream, "and output separate forwards and reverse reads, and vice versa.\n");
+ fprintf(stream, "\n");
+ fprintf(stream, "The barcode file is a tab-separated tabular file with an\n");
+ fprintf(stream, "optional header, and has two alternative formats. The standard\n");
+ fprintf(stream, "form (see below) is expected unless --combinatorial is given.\n");
+ fprintf(stream, "\n");
+ fprintf(stream, "The standard format is:\n");
+ fprintf(stream, "Barcode\tID\n");
+ fprintf(stream, "ACTA\tA1\n");
+ fprintf(stream, "CCTC\tA2\n");
+ fprintf(stream, "...\n");
+ fprintf(stream, "\n");
+ fprintf(stream, "The combinatorial format is:\n");
+ fprintf(stream, "Barcode1\tBarcode2\tID\n");
+ fprintf(stream, "ACTA\tACGC\tA1\n");
+ fprintf(stream, "CCTC\tTCTA\tA2\n");
+ fprintf(stream, "...\n");
+ fprintf(stream, "\n");
}
static void
-print_usage(void)
+print_usage(FILE *stream)
{
- print_version();
- fprintf(stderr, "\nUSAGE:\n");
- fprintf(stderr, "axe-demux [-mzc2pt] -b (-f [-r] | -i) (-F [-R] | -I)\n");
- fprintf(stderr, "axe-demux -h\n");
- fprintf(stderr, "axe-demux -v\n\n");
- fprintf(stderr, "OPTIONS:\n");
- fprintf(stderr, " -m, --mismatch\tMaximum hamming distance mismatch. [int, default 1]\n");
- fprintf(stderr, " -z, --ziplevel\tGzip compression level, or 0 for plain text [int, default 0]\n");
- fprintf(stderr, " -c, --combinatorial\tUse combinatorial barcode matching. [flag, default OFF]\n");
- fprintf(stderr, " -p, --permissive\tDon't error on barcode mismatch confict, matching only\n");
- fprintf(stderr, " \texactly for conficting barcodes. [flag, default OFF]\n");
- fprintf(stderr, " -2, --trim-r2\tTrim barcode from R2 read as well as R1. [flag, default OFF]\n");
- fprintf(stderr, " -b, --barcodes\tBarcode file. See --help for example. [file]\n");
- fprintf(stderr, " -f, --fwd-in\tInput forward read. [file]\n");
- fprintf(stderr, " -F, --fwd-out\tOutput forward read prefix. [file]\n");
- fprintf(stderr, " -r, --rev-in\tInput reverse read. [file]\n");
- fprintf(stderr, " -R, --rev-out\tOutput reverse read prefix. [file]\n");
- fprintf(stderr, " -i, --ilfq-in\tInput interleaved paired reads. [file]\n");
- fprintf(stderr, " -I, --ilfq-out\tOutput interleaved paired reads prefix. [file]\n");
- fprintf(stderr, " -t, --table-file\tOutput a summary table of demultiplexing statistics to file. [file]\n");
- fprintf(stderr, " -h, --help\t\tPrint this usage plus additional help.\n");
- fprintf(stderr, " -V, --version\tPrint version string.\n");
- fprintf(stderr, " -v, --verbose\tBe more verbose. Additive, -vv is more vebose than -v.\n");
- fprintf(stderr, " -q, --quiet\t\tBe very quiet.\n");
- fprintf(stderr, "\n");
+ print_version(stream);
+ fprintf(stream, "\nUSAGE:\n");
+ fprintf(stream, "axe-demux [-mzc2pt] -b (-f [-r] | -i) (-F [-R] | -I)\n");
+ fprintf(stream, "axe-demux -h\n");
+ fprintf(stream, "axe-demux -v\n\n");
+ fprintf(stream, "OPTIONS:\n");
+ fprintf(stream, " -m, --mismatch\tMaximum hamming distance mismatch. [int, default 1]\n");
+ fprintf(stream, " -z, --ziplevel\tGzip compression level, or 0 for plain text [int, default 0]\n");
+ fprintf(stream, " -c, --combinatorial\tUse combinatorial barcode matching. [flag, default OFF]\n");
+ fprintf(stream, " -p, --permissive\tDon't error on barcode mismatch confict, matching only\n");
+ fprintf(stream, " \texactly for conficting barcodes. [flag, default OFF]\n");
+ fprintf(stream, " -2, --trim-r2\tTrim barcode from R2 read as well as R1. [flag, default OFF]\n");
+ fprintf(stream, " -b, --barcodes\tBarcode file. See --help for example. [file]\n");
+ fprintf(stream, " -f, --fwd-in\tInput forward read. [file]\n");
+ fprintf(stream, " -F, --fwd-out\tOutput forward read prefix. [file]\n");
+ fprintf(stream, " -r, --rev-in\tInput reverse read. [file]\n");
+ fprintf(stream, " -R, --rev-out\tOutput reverse read prefix. [file]\n");
+ fprintf(stream, " -i, --ilfq-in\tInput interleaved paired reads. [file]\n");
+ fprintf(stream, " -I, --ilfq-out\tOutput interleaved paired reads prefix. [file]\n");
+ fprintf(stream, " -t, --table-file\tOutput a summary table of demultiplexing statistics to file. [file]\n");
+ fprintf(stream, " -h, --help\t\tPrint this usage plus additional help.\n");
+ fprintf(stream, " -V, --version\tPrint version string.\n");
+ fprintf(stream, " -v, --verbose\tBe more verbose. Additive, -vv is more vebose than -v.\n");
+ fprintf(stream, " -q, --quiet\t\tBe very quiet.\n");
+ fprintf(stream, "\n");
}
static const char *axe_opts = "m:z:c2pb:f:F:r:R:i:I:t:hVvqd";
@@ -121,11 +121,12 @@ parse_args(struct axe_config *config, int argc, char * const *argv)
{
int c = 0;
int optind = 0;
+ bool fullhelp = false;
if (argc < 2 ) {
- return 1;
+ goto printhelp;
}
- if (!axe_config_ok(config) || argc < 1 || argv == NULL) {
+ if (!axe_config_ok(config) || argv == NULL) {
goto error;
}
/* Set some sane defaults */
@@ -193,7 +194,8 @@ parse_args(struct axe_config *config, int argc, char * const *argv)
config->table_file = strdup(optarg);
break;
case 'h':
- goto help;
+ fullhelp = true;
+ goto printhelp;
case 'V':
goto version;
case 'v':
@@ -328,7 +330,7 @@ parse_args(struct axe_config *config, int argc, char * const *argv)
break;
}
}
- config->have_cli_opts = 1;
+ config->have_cli_opts = true;
format_call_number = 0;
qes_logger_init(config->logger, "[axe] ", QES_LOG_DEBUG);
qes_logger_add_destination_formatted(config->logger, stderr, QES_LOG_DEBUG,
@@ -337,13 +339,15 @@ parse_args(struct axe_config *config, int argc, char * const *argv)
error:
fprintf(stderr,
"Axe failed due to bad CLI flags. Consult the usage below please!\n\n");
- config->have_cli_opts = 0;
+ config->have_cli_opts = false;
return 1;
-help:
- config->have_cli_opts = 0;
- return 2;
+printhelp:
+ print_usage(stdout);
+ if (fullhelp) print_help(stdout);
+ axe_config_destroy(config);
+ exit(0);
version:
- print_version();
+ print_version(stdout);
axe_config_destroy(config);
exit(0);
}
@@ -360,10 +364,7 @@ main (int argc, char * const *argv)
}
ret = parse_args(config, argc, argv);
if (ret != 0) {
- print_usage();
- if (ret == 2) {
- print_help();
- }
+ print_usage(stderr);
goto end;
}
ret = axe_read_barcodes(config);
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index e50a5fa..8f31a54 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -1,7 +1,7 @@
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/tinytest)
ADD_EXECUTABLE(test_axe test.c ${CMAKE_CURRENT_SOURCE_DIR}/tinytest/tinytest.c test_libaxe.c)
-TARGET_LINK_LIBRARIES(test_axe ${AXE_DEPENDS_LIBRARIES} axelib)
+TARGET_LINK_LIBRARIES(test_axe ${AXE_DEPENDS_LIBRARIES} axelib qes_static)
# Copy test files over to bin dir & make output
ADD_CUSTOM_TARGET(setup_tests ALL
diff --git a/utils/hbb_script.sh b/utils/hbb_script.sh
new file mode 100644
index 0000000..5c353a8
--- /dev/null
+++ b/utils/hbb_script.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+set -e
+source /hbb_exe/activate
+set -x
+
+prefix=/io/axe_${AXE_VERSION}_amd64
+rm -rf $prefix
+mkdir -p $prefix
+trap "chown $HBBUID:$HBBUID -R $prefix" EXIT
+
+# Clone to builddir
+builddir=$(mktemp -d)
+cd $builddir
+tar xvf /io/axe_${AXE_VERSION}.tar --strip-components=1
+
+rm -rf build
+mkdir build
+cd build
+
+cmake .. \
+ -DAXE_VERSION=${AXE_VERSION} \
+ -DCMAKE_INSTALL_PREFIX=$prefix
+make -j4 VERBOSE=1
+make test
+make install
diff --git a/utils/make-tarball.sh b/utils/make-tarball.sh
deleted file mode 100644
index 4eef872..0000000
--- a/utils/make-tarball.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/bash
-
-
-version=$1
-
-git tag -v "$version"
-if [ $? -ne 0 ]
-then
- echo "Invalid tag: $version"
- exit 1
-fi
-
-set -xe
-
-rm -f ../axe_${version}.orig.tar*
-git archive -o ../axe_${version}.orig.tar $version
-tar -rf ../axe_${version}.orig.tar --owner=0 --group=0 src/libqes/
-tar --delete -vf ../axe_${version}.orig.tar .gitmodules src/libqes/.gitmodules src/libqes/.git
-xz ../axe_${version}.orig.tar
diff --git a/utils/static_build.sh b/utils/static_build.sh
new file mode 100644
index 0000000..75ec8b3
--- /dev/null
+++ b/utils/static_build.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+set -e
+
+version=$(git describe --always --match '[[:digit:]]*')
+
+srcdir=$PWD
+wkdir=$(mktemp -d)
+
+trap "rm -rf $wkdir" EXIT
+
+set -x
+
+git stash -u
+tar cvf $wkdir/axe_${version}.tar .
+git stash pop
+
+cd $wkdir
+
+docker run \
+ -v $wkdir:/io \
+ -v $srcdir/utils/hbb_script.sh:/hbb_script.sh:ro \
+ -e AXE_VERSION=${version} \
+ -e HBBUID=$(id -u) \
+ kdmurray91/kdm-hbb-64 \
+ bash /hbb_script.sh
+
+
+tar cvzf $srcdir/axe_${version}_amd64.tar.gz axe_${version}_amd64
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/axe-demultiplexer.git
More information about the debian-med-commit
mailing list